ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGQ2ZDU4YWMuLjA2YTYyZTUgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSw0NCArMSwxMCBAQAogTWFrZWZpbGUKICp+CisqLmEKICoubwotYnBmX2ZpbHRlci5jCi1jb25maWcuaAogY29uZmlnLmxvZwogY29uZmlnLmNhY2hlCiBjb25maWcuc3RhdHVzCiBzdGFtcC1oCiBzdGFtcC1oLmluCiBhdXRvbTR0ZS5jYWNoZS8KLS5kZXZlbAotZmlsdGVydGVzdAotZmluZGFsbGRldnN0ZXN0Ci1ncmFtbWFyLmMKLWxpYnBjYXAuYQotbGlicGNhcC4qLmR5bGliCi1saWJwY2FwLnNsCi1saWJwY2FwLnNvLioKLWxpYnBjYXAtKi50YXIuZ3oKLW5ldAotb3MtcHJvdG8uaAotcGNhcC1jb25maWcKLXBjYXAtZmlsdGVyLm1hbm1pc2MKLXBjYXAtbGlua3R5cGUubWFubWlzYwotcGNhcC1zYXZlZmlsZS5tYW5maWxlCi1wY2FwLXRzdGFtcC5tYW5taXNjCi1wY2FwLjNwY2FwCi1wY2FwX2NvbXBpbGUuM3BjYXAKLXBjYXBfZGF0YWxpbmsuM3BjYXAKLXBjYXBfZHVtcF9vcGVuLjNwY2FwCi1wY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwCi1wY2FwX2xpc3RfZGF0YWxpbmtzLjNwY2FwCi1wY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwCi1wY2FwX29wZW5fZGVhZC4zcGNhcAotcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAKLXBjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAKLXBjYXBfc2V0X3RzdGFtcF90eXBlLjNwY2FwCi1zY2FubmVyLmMKLXNjYW5uZXIuaAotc2VscG9sbHRlc3QKLXRva2RlZnMuaAotdmVyc2lvbi5jCi12ZXJzaW9uLmgKZGlmZiAtLWdpdCBhLy50cmF2aXMueW1sIGIvLnRyYXZpcy55bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhN2ZhYzEuLjAwMDAwMDAKLS0tIGEvLnRyYXZpcy55bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWxhbmd1YWdlOiBjCi0KLXNjcmlwdDoKLSAgLSAuL2NvbmZpZ3VyZQotICAtIG1ha2UKZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDhjNjkxYmYuLjk3MTkxNmQgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMSw2ICsxLDkgQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCiBsaWJwY2FwX2NmbGFncyA6PSBcCisgIC1Xbm8tbWFjcm8tcmVkZWZpbmVkIFwKKyAgLVduby1wb2ludGVyLWFyaXRoIFwKKyAgLVduby1zaWduLWNvbXBhcmUgXAogICAtV25vLXVudXNlZC1wYXJhbWV0ZXIgXAogICAtRF9CU0RfU09VUkNFIFwKICAgLURfVV89Il9fYXR0cmlidXRlX18oKHVudXNlZCkpIiBcCkBAIC04LDIyICsxMSwxNyBAQAogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAorIyAoTWF0Y2hlcyBvcmRlciBpbiBsaWJwY2FwJ3MgTWFrZWZpbGUuKQogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgcGNhcC1saW51eC5jIHBjYXAtdXNiLWxpbnV4LmMgcGNhcC1jYW4tbGludXguYyBwY2FwLW5ldGZpbHRlci1saW51eC1hbmRyb2lkLmMgXAotICBmYWQtZ2lmYy5jIFwKLSAgcGNhcC5jIGluZXQuYyBnZW5jb2RlLmMgb3B0aW1pemUuYyBuYW1ldG9hZGRyLmMgZXRoZXJlbnQuYyBcCi0gIHNhdmVmaWxlLmMgc2YtcGNhcC5jIHNmLXBjYXAtbmcuYyBwY2FwLWNvbW1vbi5jIFwKLSAgYnBmL25ldC9icGZfZmlsdGVyLmMgYnBmX2ltYWdlLmMgYnBmX2R1bXAuYyBcCi0gIHZlcnNpb24uYyBcCi0KLSMgR2VuZXJhdGVkIG9uIHRoZSBob3N0IHdpdGggYGNvbmZpZ3VyZSAmJiBtYWtlYCBhbmQgY29waWVkIGFjcm9zcy4KLUxPQ0FMX1NSQ19GSUxFUyArPSBncmFtbWFyLmMKLUxPQ0FMX1NSQ19GSUxFUyArPSBzY2FubmVyLmMKKyAgcGNhcC1saW51eC5jIHBjYXAtdXNiLWxpbnV4LmMgcGNhcC1uZXRmaWx0ZXItbGludXgtYW5kcm9pZC5jIFwKKyAgZmFkLWdldGFkLmMgXAorICBwY2FwLmMgaW5ldC5jIGZhZC1oZWxwZXJzLmMgZ2VuY29kZS5jIG9wdGltaXplLmMgbmFtZXRvYWRkci5jIFwKKyAgZXRoZXJlbnQuYyBzYXZlZmlsZS5jIHNmLXBjYXAuYyBzZi1wY2FwLW5nLmMgcGNhcC1jb21tb24uYyBcCisgIGJwZl9pbWFnZS5jIGJwZl9kdW1wLmMgXAorICBzY2FubmVyLmMgZ3JhbW1hci5jIGJwZl9maWx0ZXIuYyB2ZXJzaW9uLmMgXAogCiBMT0NBTF9DRkxBR1MgKz0gJChsaWJwY2FwX2NmbGFncykKLUxPQ0FMX0NGTEFHUyArPSAtV25vLXNpZ24tY29tcGFyZQogTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9DT05GSUdfSAotTE9DQUxfQ0ZMQUdTICs9IC1pbmNsdWRlIHN0cmluZ3MuaCAjIEZvciBmZnMoMykuCiAKIExPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCiAKQEAgLTM4LDE0ICszNiwxNiBAQAogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKKyMgKE1hdGNoZXMgb3JkZXIgaW4gbGlicGNhcCdzIE1ha2VmaWxlLikKIGxpYnBjYXBfdGVzdHMgOj0gIFwKKyAgdGVzdHMvdmFsZ3JpbmR0ZXN0LmMgXAogICB0ZXN0cy9jYXB0dXJldGVzdC5jIFwKKyAgdGVzdHMvY2FuX3NldF9yZm1vbl90ZXN0LmMgXAogICB0ZXN0cy9maWx0ZXJ0ZXN0LmMgXAogICB0ZXN0cy9maW5kYWxsZGV2c3Rlc3QuYyBcCiAgIHRlc3RzL29wZW50ZXN0LmMgXAogICB0ZXN0cy9yZWFjdGl2YXRldGVzdC5jIFwKICAgdGVzdHMvc2VscG9sbHRlc3QuYyBcCi0gIHRlc3RzL3ZhbGdyaW5kdGVzdC5jIFwKIAogJChmb3JlYWNoIHRlc3QsJChsaWJwY2FwX3Rlc3RzKSwgXAogICAkKGV2YWwgaW5jbHVkZSAkKENMRUFSX1ZBUlMpKSBcCmRpZmYgLS1naXQgYS9DSEFOR0VTIGIvQ0hBTkdFUwppbmRleCBlZjkwYmJjLi4xNzg0MDk2IDEwMDY0NAotLS0gYS9DSEFOR0VTCisrKyBiL0NIQU5HRVMKQEAgLTEsMyArMSw0OSBAQAorVHVlc2RheSwgT2N0LiAyNSwgMjAxNiBtY3JAc2FuZGVsbWFuLmNhCisgIFN1bW1hcnkgZm9yIDEuOC4xIGxpYnBjYXAgcmVsZWFzZQorICAgIEFkZCBhIHRhcmdldCBpbiBNYWtlZmlsZS5pbiBmb3IgRXh1YmVyYW50IEN0YWdzIHVzZTogJ2V4dGFncycuCisgICAgUmVuYW1lIGNvbmZpZ3VyZS5pbiB0byBjb25maWd1cmUuYWM6IGF1dG9jb25mIDIuNTkKKyAgICBDbGVhbiB1cCB0aGUgbmFtZS10by1ETFQgbWFwcGluZyB0YWJsZS4KKyAgICBBZGQgc29tZSBuZXdlciBETFRfIHZhbHVlczogSVBNSV9IUE1fMixaV0FWRV9SMV9SMixaV0FWRV9SMyxXQVRUU1RPUFBFUl9ETE0sSVNPXzE0NDQzLFJEUworICAgIENsYXJpZnkgd2hhdCB0aGUgcmV0dXJuIHZhbHVlcyBhcmUgZm9yIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZS4KKyAgICBNYW55IGNoYW5nZXMgdG8gYnVpbGQgb24gd2luZG93cworICAgIENoZWNrIGZvciB0aGUgImJyZWFrIHRoZSBsb29wIiBjb25kaXRpb24gaW4gdGhlIGlubmVyIGxvb3AgZm9yIFRQQUNLRVRfVjMuCisgICAgRml4IGhhbmRsaW5nIG9mIHBhY2tldCBjb3VudCBpbiB0aGUgVFBBQ0tFVF9WMyBpbm5lciBsb29wOiBHaXRIdWIgaXNzdWUgIzQ5My4KKyAgICBGaWx0ZXIgb3V0IGR1cGxpY2F0ZSBsb29wZWQgYmFjayBDQU4gZnJhbWVzLgorICAgIEZpeCB0aGUgaGFuZGxpbmcgb2YgbG9vcGJhY2sgZmlsdGVycyBmb3IgSVB2NiBwYWNrZXRzLgorICAgIEFkZCBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgZm9yIFJEUyAoSUVDIDYyMTA2KSBncm91cHMuCisgICAgVXNlIGRpZmZlcmVudCBpbnRlcm1lZGlhdGUgZm9sZGVycyBmb3IgeDg2IGFuZCB4NjQgYnVpbGRzIG9uIFdpbmRvd3MuCisgICAgT24gTGludXgsIGhhbmRsZSBhbGwgQ0FOIGNhcHR1cmVzIHdpdGggcGNhcC1saW51eC5jLCBpbiBjb29rZWQgbW9kZS4KKyAgICBSZW1vdmVzIHRoZSBuZWVkIGZvciB0aGUgImhvc3QtZW5kaWFuIiBsaW5rLWxheWVyIGhlYWRlciB0eXBlLgorICAgIENvbXBpbGUgd2l0aCAnLVd1c2VkLWJ1dC1tYXJrZWQtdW51c2VkJyBpbiBkZXZlbCBtb2RlIGlmIHN1cHBvcnRlZAorICAgIEhhdmUgc2VwYXJhdGUgRExUcyBmb3IgYmlnLWVuZGlhbiBhbmQgaG9zdC1lbmRpYW4gU29ja2V0Q0FOIGhlYWRlcnMuCisgICAgUmVmbGVjdCB2ZXJzaW9uLmggYmVpbmcgcmVuYW1lZCB0byBwY2FwX3ZlcnNpb24uaC4KKyAgICBSZXF1aXJlIHRoYXQgdmVyc2lvbi5oIGJlIGdlbmVyYXRlZDogYWxsIGJ1aWxkIHByb2NlZHVyZXMgd2Ugc3VwcG9ydCBnZW5lcmF0ZSB2ZXJzaW9uLmggKGF1dG9jb25mLCBDTWFrZSwgTVNWQykhCisgICAgUHJvcGVybHkgY2hlY2sgZm9yIHNvY2tfcmVjdigpIGVycm9ycy4KKyAgICBSZS1pbXBvc2Ugc29tZSBvZiBXaW5zb2NrJ3MgbGltaXRhdGlvbnMgb24gc29ja19yZWN2KCkuCisgICAgUmVwbGFjZSBzcHJpbnRmKCkgd2l0aCBwY2FwX3NucHJpbnRmKCkuCisgICAgRml4IHNpZ25hdHVyZSBvZiBwY2FwX3N0YXRzX2V4X3JlbW90ZSgpLgorICAgIEluaXRpYWwgY21ha2Ugc3VwcG9ydCBmb3IgcmVtb3RlIHBhY2tldCBjYXB0dXJlLgorICAgIEhhdmUgcnBjYXBfcmVtb3RlYWN0X2dldHNvY2soKSByZXR1cm4gYSBTT0NLRVQgYW5kIHN1cHBseSBhbiAiaXMgYWN0aXZlIiBmbGFnLgorICAgIENsZWFuIHVwIHtEQUcsIFNlcHRlbCwgTXlyaWNvbSBTTkZ9LW9ubHkgYnVpbGRzLgorICAgIERvIFVURi0xNi10by1BU0NJSSBjb252ZXJzaW9uIGludG8gdGhlIHJpZ2h0IHBsYWNlLgorICAgIHBjYXBfY3JlYXRlX2ludGVyZmFjZSgpIG5lZWRzIHRoZSBpbnRlcmZhY2UgbmFtZSBvbiBMaW51eC4KKyAgICBDbGVhbiB1cCBoYXJkd2FyZSB0aW1lIHN0YW1wIHN1cHBvcnQ6IHRoZSAiYW55IiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBhbnkgdGltZSBzdGFtcCB0eXBlcy4KKyAgICBBZGQgc3VwcG9ydCBmb3IgY2FwdHVyaW5nIG9uIEZyZWVCU0QgdXNidXNOIGludGVyZmFjZXMuCisgICAgQWRkIGEgTElOS1RZUEUvRExUXyB2YWx1ZSBmb3IgRnJlZUJTRCBVU0IuCisgICAgR28gYmFjayB0byB1c2luZyBQQ0FQX0FQSSBvbiBXaW5kb3dzLgorICAgIENNYWtlIHN1cHBvcnQKKyAgICBBZGQgVHVyYm9DYXAgc3VwcG9ydCBmcm9tIFdpblBjYXAuCisgICAgUmVjb2duaXplIDgwMi4xYWQgbmVzdGVkIFZMQU4gdGFnIGluIHZsYW4gZmlsdGVyLgorCitUaHVyc2RheSBTZXAuIDMsIDIwMTUgZ3V5QGFsdW0ubWl0LmVkdQorICBTdW1tYXJ5IGZvciAxLjcuNSBsaWJwY2FwIHJlbGVhc2UKKwlNYW4gcGFnZSBjbGVhbnVwcy4KKwlBZGQgc29tZSBhbGxvY2F0aW9uIGZhaWx1cmUgY2hlY2tzLgorCUZpeCBhIG51bWJlciBvZiBMaW51eC91Y0xpbnV4IGNvbmZpZ3VyZS9idWlsZCBpc3N1ZXMuCisJRml4IHNvbWUgbWVtb3J5IGxlYWtzLgorCVJlY29nbml6ZSA4MDIuMWFkIG5lc3RlZCBWTEFOIHRhZyBpbiB2bGFuIGZpbHRlci4KKwlGaXggYnVpbGRpbmcgQmx1ZXRvb3RoIExpbnV4IE1vbml0b3Igc3VwcG9ydCB3aXRoIEJsdWVaIDUuMSsKKwogU2F0dXJkYXkgSnVuLiAyNywgMjAxNSBtY3JAc2FuZGVsbWFuLmNhCiAgIFN1bW1hcnkgZm9yIDEuNy40IGxpYnBjYXAgcmVsZWFzZQogCUluY2x1ZGUgZml4IGZvciBHaXRIdWIgaXNzdWUgIzQyNCAtLSBvdXQgb2YgdHJlZSBidWlsZHMuCmRpZmYgLS1naXQgYS9DTWFrZUxpc3RzLnR4dCBiL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDhiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDUyMCBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZCggVkVSU0lPTiAyLjguOCApCisKK3Byb2plY3QoIHBjYXAgKQorIworIyBDYWxsIHRoZSBsaWJyYXJ5ICJ3cGNhcCIgb24gV2luZG93cywgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorIworaWYoIFdJTjMyICkKKyAgICBzZXQoIExJQlJBUllfTkFNRSB3cGNhcCApCitlbHNlKCkKKyAgICBzZXQoIExJQlJBUllfTkFNRSBwY2FwICkKK2VuZGlmKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgIFBhcmFtZXRlcnMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworb3B0aW9uIChJTkVUNiAiRW5hYmxlIElQdjYiIE9OKQoraWYoIE1TVkMgKQorICAgIG9wdGlvbiAoVVNFX1NUQVRJQ19SVCAiVXNlIHN0YXRpYyBSdW50aW1lIiBPTikKK2VuZGlmKCBNU1ZDICkKK29wdGlvbiAoQlVJTERfU0hBUkVEX0xJQlMgIkJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiIE9OKQoraWYoIFdJTjMyICkKKyAgICBzZXQoUEFDS0VUX0RMTF9ESVIgIiIgQ0FDSEUgUEFUSCAiUGF0aCB0byBkaXJlY3Rvcnkgd2l0aCBpbmNsdWRlIGFuZCBsaWIgc3ViZGlyZWN0b3JpZXMgZm9yIHBhY2tldC5kbGwiKQorZW5kaWYoIFdJTjMyICkKKworIworIyBYWFggLSB0aGlzIHNob3VsZCBiZSBhbiBvcHRpb24sIGRlZmF1bHRpbmcgdG8gInllcyIgZm9yIFdpbmRvd3MgYW5kIHRvCisjICJubyIsIGZvciBub3csIG9uIFVOKlguCisjCitpZiggV0lOMzIgKQorICAgIHNldCggSEFWRV9SRU1PVEUgMSApCitlbmRpZiggV0lOMzIgKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQcm9qZWN0IHNldHRpbmdzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCithZGRfZGVmaW5pdGlvbnMoIC1ESEFWRV9DT05GSUdfSCApCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgJHtwY2FwX1NPVVJDRV9ESVJ9CispCisKK2lmKCBXSU4zMiApCisgICAgaWYoIE5PVCAiJHtQQUNLRVRfRExMX0RJUn0iIFNUUkVRVUFMICIiICkKKyAgICAgICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtQQUNLRVRfRExMX0RJUn0vSW5jbHVkZSIpCisgICAgICAgIGlmKCBDTUFLRV9DTF82NCApCisgICAgICAgICAgICBsaW5rX2RpcmVjdG9yaWVzKCIke1BBQ0tFVF9ETExfRElSfS9MaWIveDY0IikKKyAgICAgICAgZWxzZSggQ01BS0VfQ0xfNjQgKQorICAgICAgICAgICAgbGlua19kaXJlY3RvcmllcygiJHtQQUNLRVRfRExMX0RJUn0vTGliIikKKyAgICAgICAgZW5kaWYoIENNQUtFX0NMXzY0ICkKKyAgICBlbmRpZigpCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcygKKyAgICAgICAgLi4vQ29tbW9uLworICAgICAgICBXaW4zMi9JbmNsdWRlCisgICAgKQorZW5kaWYoIFdJTjMyKQorCithZGRfZGVmaW5pdGlvbnMoIC1EQlVJTERJTkdfUENBUCApCisKK2lmKCBNU1ZDICkKKyAgICBhZGRfZGVmaW5pdGlvbnMoIC1EX19TVERDX18gKQorICAgIGFkZF9kZWZpbml0aW9ucyggLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyApCisgICAgYWRkX2RlZmluaXRpb25zKCAiLURfVV89IiApCitlbHNlaWYoIENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCApCisgICAgYWRkX2RlZmluaXRpb25zKCAiLURfVV89X19hdHRyaWJ1dGVfXygodW51c2VkKSkiICkKK2Vsc2UoTVNWQykKKyAgICBhZGRfZGVmaW5pdGlvbnMoICItRF9VXz0iICkKK2VuZGlmKCBNU1ZDICkKKworaWYoIE1TVkMgKQorICAgIGlmIChVU0VfU1RBVElDX1JUKQorICAgICAgICBNRVNTQUdFKCBTVEFUVVMgIlVzZSBTVEFUSUMgcnVudGltZSIgKQorICAgICAgICBzZXQoTkFNRV9SVCBNVCkKKyAgICAgICAgc2V0IChDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTCAgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTX01JTlNJWkVSRUx9IC9NVCIpCisgICAgICAgIHNldCAoQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPICIke0NNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GT30gL01UIikKKyAgICAgICAgc2V0IChDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRSAgICAgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9IC9NVCIpCisgICAgICAgIHNldCAoQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHICAgICAgICAgICIke0NNQUtFX0NYWF9GTEFHU19ERUJVR30gL01UZCIpCisKKyAgICAgICAgc2V0IChDTUFLRV9DX0ZMQUdTX01JTlNJWkVSRUwgICAgICAgIiR7Q01BS0VfQ19GTEFHU19NSU5TSVpFUkVMfSAvTVQiKQorICAgICAgICBzZXQgKENNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk8gICAiJHtDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSAvTVQiKQorICAgICAgICBzZXQgKENNQUtFX0NfRkxBR1NfUkVMRUFTRSAgICAgICAgICAiJHtDTUFLRV9DX0ZMQUdTX1JFTEVBU0V9IC9NVCIpCisgICAgICAgIHNldCAoQ01BS0VfQ19GTEFHU19ERUJVRyAgICAgICAgICAgICIke0NNQUtFX0NfRkxBR1NfREVCVUd9IC9NVGQiKQorICAgIGVsc2UgKFVTRV9TVEFUSUNfUlQpCisgICAgICAgIE1FU1NBR0UoIFNUQVRVUyAiVXNlIERZTkFNSUMgcnVudGltZSIgKQorICAgICAgICBzZXQoTkFNRV9SVCBNRCkKKyAgICAgICAgc2V0IChDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTCAgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTX01JTlNJWkVSRUx9IC9NRCIpCisgICAgICAgIHNldCAoQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPICIke0NNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GT30gL01EIikKKyAgICAgICAgc2V0IChDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRSAgICAgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9IC9NRCIpCisgICAgICAgIHNldCAoQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHICAgICAgICAgICIke0NNQUtFX0NYWF9GTEFHU19ERUJVR30gL01EZCIpCisKKyAgICAgICAgc2V0IChDTUFLRV9DX0ZMQUdTX01JTlNJWkVSRUwgICAgICAgIiR7Q01BS0VfQ19GTEFHU19NSU5TSVpFUkVMfSAvTUQiKQorICAgICAgICBzZXQgKENNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk8gICAiJHtDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSAvTUQiKQorICAgICAgICBzZXQgKENNQUtFX0NfRkxBR1NfUkVMRUFTRSAgICAgICAgICAiJHtDTUFLRV9DX0ZMQUdTX1JFTEVBU0V9IC9NRCIpCisgICAgICAgIHNldCAoQ01BS0VfQ19GTEFHU19ERUJVRyAgICAgICAgICAgICIke0NNQUtFX0NfRkxBR1NfREVCVUd9IC9NRGQiKQorICAgZW5kaWYgKFVTRV9TVEFUSUNfUlQpCitlbmRpZiggTVNWQyApCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICBEZXRlY3QgYXZhaWxhYmxlIHBsYXRmb3JtIGZlYXR1cmVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZSkKK2luY2x1ZGUoQ2hlY2tGdW5jdGlvbkV4aXN0cykKK2luY2x1ZGUoQ2hlY2tTdHJ1Y3RIYXNNZW1iZXIpCitpbmNsdWRlKENoZWNrVHlwZVNpemUpCisKKyMKKyMgSGVhZGVyIGZpbGVzLgorIworY2hlY2tfaW5jbHVkZV9maWxlKCBpbnR0eXBlcy5oIEhBVkVfSU5UVFlQRVNfSCApCitjaGVja19pbmNsdWRlX2ZpbGUoIHN0ZGludC5oIEhBVkVfU1RESU5UX0ggKQorY2hlY2tfaW5jbHVkZV9maWxlKCB1bmlzdGQuaCBIQVZFX1VOSVNURF9IICkKK2lmKCBOT1QgSEFWRV9VTklTVERfSCApCisgICAgYWRkX2RlZmluaXRpb25zKCAtRFlZX05PX1VOSVNURF9IICkKK2VuZGlmKCBOT1QgSEFWRV9VTklTVERfSCApCitjaGVja19pbmNsdWRlX2ZpbGUoIGJpdHlwZXMuaCBIQVZFX1NZU19CSVRZUEVTX0ggKQorY2hlY2tfaW5jbHVkZV9maWxlKCBsaW1pdHMuaCBIQVZFX0xJTUlUU19IICkKKworIworIyBGdW5jdGlvbnMuCisjCitjaGVja19mdW5jdGlvbl9leGlzdHMoIHN0cmVycm9yIEhBVkVfU1RSRVJST1IgKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKCBzdHJsY3B5IEhBVkVfU1RSTENQWSApCitjaGVja19mdW5jdGlvbl9leGlzdHMoIHNucHJpbnRmIEhBVkVfU05QUklOVEYgKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKCB2c25wcmludGYgSEFWRV9WU05QUklOVEYgKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKCBzdHJ0b2tfciBIQVZFX1NUUlRPS19SICkKKworaWYgKFdJTjMyKQorICAgICMKKyAgICAjIENoZWNrIGZvciBXaW5kb3dzLW9ubHkgZnVuY3Rpb25zLCBzdWNoIGFzIHBhY2tldC5kbGwgZnVuY3Rpb25zLgorICAgICMKKyAgICBjaGVja19mdW5jdGlvbl9leGlzdHMoIFBhY2tldElzTG9vcGJhY2tBZGFwdGVyIEhBVkVfUEFDS0VUX0lTX0xPT1BCQUNLX0FEQVBURVIgKQorZW5kaWYoKQorCisjCisjIERhdGEgdHlwZXMuCisjCisjIFhYWCAtIHRoZXJlJ3Mgbm8gY2hlY2tfc3RydWN0KCkgbWFjcm8gdGhhdCdzIGxpa2UgY2hlY2tfc3RydWN0X2hhc19tZW1iZXIoKQorIyBleGNlcHQgdGhhdCBpdCBvbmx5IGNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUsCisjIHNvIHdlIHVzZSBjaGVja19zdHJ1Y3RfaGFzX21lbWJlcigpIGFuZCBsb29rIGZvciBzc19mYW1pbHkuCisjCitjaGVja19zdHJ1Y3RfaGFzX21lbWJlcigic3RydWN0IHNvY2thZGRyX3N0b3JhZ2UiIHNzX2ZhbWlseSBzeXMvc29ja2V0LmggIEhBVkVfU09DS0FERFJfU1RPUkFHRSkKK3NldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTIHVuaXN0ZC5oIHN5cy9zb2NrZXQuaCkKK2NoZWNrX3R5cGVfc2l6ZSgic29ja2xlbl90IiBTT0NLTEVOX1QpCitzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyB1bmlzdGQuaCkKKworIworIyBTdHJ1Y3R1cmUgZmllbGRzLgorIworY2hlY2tfc3RydWN0X2hhc19tZW1iZXIoInN0cnVjdCBzb2NrYWRkciIgc2FfbGVuIHN5cy9zb2NrZXQuaCBIQVZFX1NPQ0tBRERSX1NBX0xFTiApCisKK2lmKCBJTkVUNiApCisgICAgTUVTU0FHRSggU1RBVFVTICJVc2UgSVB2NiIgKQorZW5kaWYoIElORVQ2ICkKKworaWYoIFdJTjMyICkKKyAgICBhZGRfZGVmaW5pdGlvbnMoIC1ESEFWRV9BRERSSU5GTyApCitlbmRpZiggV0lOMzIgKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBFeHRlcm5hbCBkZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIElucHV0IGZpbGVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzZXQoUFJPSkVDVF9TT1VSQ0VfTElTVF9DCisgICAgYnBmX2R1bXAuYworICAgIGJwZl9pbWFnZS5jCisgICAgZXRoZXJlbnQuYworICAgIGZhZC1oZWxwZXJzLmMKKyAgICBnZW5jb2RlLmMKKyAgICBpbmV0LmMKKyAgICBuYW1ldG9hZGRyLmMKKyAgICBvcHRpbWl6ZS5jCisgICAgcGNhcC1jb21tb24uYworICAgIHBjYXAuYworICAgIHNhdmVmaWxlLmMKKyAgICBzZi1wY2FwLW5nLmMKKyAgICBzZi1wY2FwLmMKKyAgICBicGYvbmV0L2JwZl9maWx0ZXIuYworKQorCitpZiggV0lOMzIgKQorICAgIHNldChQUk9KRUNUX1NPVVJDRV9MSVNUX0MgJHtQUk9KRUNUX1NPVVJDRV9MSVNUX0N9IG1pc3Npbmcvd2luX3NucHJpbnRmLmMgKQorZWxzZSgpCisgICAgaWYoIE5PVCBIQVZFX1NOUFJJTlRGICkKKyAgICAgICAgc2V0KFBST0pFQ1RfU09VUkNFX0xJU1RfQyAke1BST0pFQ1RfU09VUkNFX0xJU1RfQ30gbWlzc2luZy9zbnByaW50Zi5jICkKKyAgICBlbmRpZiggTk9UIEhBVkVfU05QUklOVEYgKQorICAgIGlmKCBOT1QgSEFWRV9TVFJUT0tfUiApCisgICAgICAgIHNldChQUk9KRUNUX1NPVVJDRV9MSVNUX0MgJHtQUk9KRUNUX1NPVVJDRV9MSVNUX0N9IG1pc3Npbmcvc3RydG9rX3IuYyApCisgICAgZW5kaWYoIE5PVCBIQVZFX1NUUlRPS19SICkKK2VuZGlmKCBXSU4zMiApCisKK2lmKCBIQVZFX1JFTU9URSApCisgICAgc2V0KFBST0pFQ1RfU09VUkNFX0xJU1RfQyAke1BST0pFQ1RfU09VUkNFX0xJU1RfQ30KKyAgICAgICAgcGNhcC1uZXcuYyBwY2FwLXJwY2FwLmMgc29ja3V0aWxzLmMpCitlbmRpZiggSEFWRV9SRU1PVEUgKQorCisjCisjIERldGVybWluZSB0aGUgbWFpbiBwY2FwLVhYWC5jIGZpbGUgdG8gdXNlLgorIworaWYoIFdJTjMyICkKKyAgICAjCisgICAgIyBXaW5QY2FwLgorICAgICMKKyAgICBzZXQoIFBDQVBfVFlQRSB3aW4zMiApCitlbHNlKCkKKyAgICAjCisgICAgIyBVTipYIC0gZmlndXJlIG91dCB3aGF0IHR5cGUgb2YgcGFja2V0IGNhcHR1cmUgbWVjaGFuaXNtIHdlCisgICAgIyBoYXZlLgorICAgICMKKyAgICBpZiggRVhJU1RTIC9kZXYvYnBmICkKKwkjCisJIyBDbG9uaW5nIEJQRiBkZXZpY2UuCisJIworCXNldCggUENBUF9UWVBFIGJwZiApCisJQUNfREVGSU5FKEhBVkVfQ0xPTklOR19CUEYsMSxbZGVmaW5lIGlmIHlvdSBoYXZlIGEgY2xvbmluZyBCUEYgZGV2aWNlXSkKKyAgICBlbHNlaWYoIEVYSVNUUyAvZGV2L2JwZjAgKQorCXNldCggUENBUF9UWVBFIGJwZiApCisKKyAgICAgICAgIworICAgICAgICAjIFhYWCAtIG1hbnkgbW9yZSBCUEYgY2hlY2tzLgorICAgICAgICAjCisgICAgZWxzZWlmKCBFWElTVFMgL3Vzci9pbmNsdWRlL25ldC9wZmlsdC5oICkKKyAgICAgICAgIworICAgICAgICAjIERFQyBPU0YvMSwgRGlnaXRhbCBVTklYLCBUcnU2NCBVTklYCisgICAgICAgICMKKwlzZXQoIFBDQVBfVFlQRSBwZiApCisgICAgZWxzZWlmKCBFWElTVFMgL2Rldi9lbmV0ICkKKyAgICAgICAgc2V0KCBQQ0FQX1RZUEUgZW5ldCApCisgICAgZWxzZWlmKCBFWElTVFMgL2Rldi9uaXQgKQorICAgICAgICBzZXQoIFBDQVBfVFlQRSBzbml0ICkKKyAgICBlbHNlaWYoIEVYSVNUUyAvdXNyL2luY2x1ZGUvc3lzL25ldC9uaXQuaCApCisgICAgICAgIHNldCggUENBUF9UWVBFIG5pdCApCisgICAgZWxzZWlmKCBFWElTVFMgL3Vzci9pbmNsdWRlL2xpbnV4L3NvY2tldC5oICkKKyAgICAgICAgc2V0KCBQQ0FQX1RZUEUgbGludXggKQorCisJIworCSMgRG8gd2UgaGF2ZSB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucz8KKwkjCisgICAgICAgIGNoZWNrX2luY2x1ZGVfZmlsZSggbGludXgvd2lyZWxlc3MuaCBIQVZFX0xJTlVYX1dJUkVMRVNTX0ggKQorCisgICAgICAgICMKKyAgICAgICAgIyBYWFggLSBtYW55IG1vcmUgTGludXggY2hlY2tzLgorCSMKKyAgICBlbHNlaWYoIEVYSVNUUyAvdXNyL2luY2x1ZGUvbmV0L3Jhdy5oICkKKyAgICAgICAgc2V0KCBQQ0FQX1RZUEUgc25vb3AgKQorICAgIGVsc2VpZiggRVhJU1RTIC91c3IvaW5jbHVkZS9vZG1pLmggKQorICAgICAgICAjCisgICAgICAgICMgT24gQUlYLCB0aGUgQlBGIGRldmljZXMgbWlnaHQgbm90IHlldCBiZSBwcmVzZW50IC0gdGhleSdyZQorICAgICAgICAjIGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgbGlicGNhcCBydW5zIGFmdGVyIGJvb3RpbmcuCisgICAgICAgICMgV2UgY2hlY2sgZm9yIG9kbWkuaCBpbnN0ZWFkLgorICAgICAgICAjCisgICAgICAgIHNldCggUENBUF9UWVBFIGJwZiApCisgICAgZWxzZWlmKCAvdXNyL2luY2x1ZGUvc3lzL2RscGkuaCApCisgICAgICAgIHNldCggUENBUF9UWVBFIGRscGkgKQorCisgICAgICAgICMKKyAgICAgICAgIyBYWFggLSBtYW55IG1vcmUgRExQSSBjaGVja3MuCisgICAgICAgICMKKyAgICBlbHNlKCkKKwlzZXQoIFBDQVBfVFlQRSBudWxsICkKKyAgICBlbmRpZigpCitlbmRpZiggV0lOMzIgKQorbWVzc2FnZShTVEFUVVMgIlBhY2tldCBjYXB0dXJlIG1lY2hhbmlzbSB0eXBlOiAke1BDQVBfVFlQRX0iKQorc2V0KFBST0pFQ1RfU09VUkNFX0xJU1RfQyAke1BST0pFQ1RfU09VUkNFX0xJU1RfQ30gcGNhcC0ke1BDQVBfVFlQRX0uYykKKworIworIyBOb3cgZmlndXJlIG91dCBob3cgd2UgZ2V0IGEgbGlzdCBvZiBpbnRlcmZhY2VzIGFuZCBhZGRyZXNzZXMsCisjIGlmIHdlIHN1cHBvcnQgY2FwdHVyaW5nLiAgRG9uJ3QgYm90aGVyIGlmIHdlIGRvbid0IHN1cHBvcnQKKyMgY2FwdHVyaW5nLgorIworaWYoIE5PVCBXSU4zMiApCisgICAgIworICAgICMgVU4qWCAtIGZpZ3VyZSBvdXQgd2hhdCB0eXBlIG9mIGludGVyZmFjZSBsaXN0IG1lY2hhbmlzbSB3ZQorICAgICMgaGF2ZS4KKyAgICAjCisgICAgaWYoICR7UENBUF9UWVBFfSBTVFJFUVVBTCAibnVsbCIgKQorICAgICAgICAjCisgICAgICAgICMgV2UgY2FuJ3QgY2FwdHVyZSwgc28gd2UgY2FuJ3Qgb3BlbiBhbnkgY2FwdHVyZQorICAgICAgICAjIGRldmljZXMsIHNvIHdlIHdvbid0IHJldHVybiBhbnkgaW50ZXJmYWNlcy4KKyAgICAgICAgIworICAgICAgICBzZXQoIEZJTkRBTExERVZTX1RZUEUgbnVsbCApCisgICAgZWxzZSgpCisgICAgICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyggZ2V0aWZhZGRycyBIQVZFX0dFVElGQUREUlMgKQorICAgICAgICBpZiggJHtIQVZFX0dFVElGQUREUlN9ICkKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgV2UgaGF2ZSAiZ2V0aWZhZGRycygpIjsgbWFrZSBzdXJlIHdlIGhhdmUgPGlmYWRkcnMuaD4KKyAgICAgICAgICAgICMgYXMgd2VsbCwganVzdCBpbiBjYXNlIHNvbWUgcGxhdGZvcm0gaXMgcmVhbGx5IHdlaXJkLgorICAgICAgICAgICAgIworICAgICAgICAgICAgY2hlY2tfaW5jbHVkZV9maWxlKCBpZmFkZHJzLmggSEFWRV9JRkFERFJTX0ggKQorICAgICAgICAgICAgaWYoICR7SEFWRV9JRkFERFJTX0h9ICkKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBXZSBoYXZlIHRoZSBoZWFkZXIsIHNvIHdlIHVzZSAiZ2V0aWZhZGRycygpIiB0bworICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBsaXN0IG9mIGludGVyZmFjZXMuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgIHNldCggRklOREFMTERFVlNfVFlQRSBnZXRhZCApCisgICAgICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBXZSBkb24ndCBoYXZlIHRoZSBoZWFkZXIgLSBnaXZlIHVwLgorICAgICAgICAgICAgICAgICMgWFhYIC0gd2UgY291bGQgYWxzbyBmYWxsIGJhY2sgb24gc29tZSBvdGhlcgorICAgICAgICAgICAgICAgICMgbWVjaGFuaXNtLCBidXQsIGZvciBub3csIHRoaXMnbGwgY2F0Y2ggdGhpcworICAgICAgICAgICAgICAgICMgcHJvYmxlbSBzbyB0aGF0IHdlIGNhbiBhdCBsZWFzdCB0cnkgdG8gZmlndXJlCisgICAgICAgICAgICAgICAgIyBvdXQgc29tZXRoaW5nIHRvIGRvIG9uIHN5c3RlbXMgd2l0aCAiZ2V0aWZhZGRycygpIgorICAgICAgICAgICAgICAgICMgYnV0IHdpdGhvdXQgImlmYWRkcnMuaCIsIGlmIHRoZXJlIGlzIHNvbWV0aGluZworICAgICAgICAgICAgICAgICMgd2UgY2FuIGRvIG9uIHRob3NlIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIllvdXIgc3lzdGVtIGhhcyBnZXRpZmFkZHJzKCkgYnV0IGRvZXNuJ3QgaGF2ZSBhIHVzYWJsZSA8aWZhZGRycy5oPi4iICkKKyAgICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFdlbGwsIHdlIGRvbid0IGhhdmUgImdldGlmYWRkcnMoKSIsIHNvIHdlIGhhdmUgdG8gdXNlCisgICAgICAgICAgICAjIHNvbWUgb3RoZXIgbWVjaGFuaXNtOyBkZXRlcm1pbmUgd2hhdCB0aGF0IG1lY2hhbmlzbSBpcy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhlIGZpcnN0IHRoaW5nIHdlIHVzZSBpcyB0aGUgdHlwZSBvZiBjYXB0dXJlIG1lY2hhbmlzbSwKKyAgICAgICAgICAgICMgd2hpY2ggaXMgc29tZXdoYXQgb2YgYSBwcm94eSBmb3IgdGhlIE9TIHdlJ3JlIHVzaW5nLgorICAgICAgICAgICAgIworICAgICAgICAgICAgaWYoICR7UENBUF9UWVBFfSBTVFJFUVVBTCAiZGxwaSIgT1IgJHtQQ0FQX1RZUEV9IFNUUkVRVUFMICJsaWJkbHBpIiApCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgVGhpcyBtaWdodCBiZSBTb2xhcmlzIDggb3IgbGF0ZXIsIHdpdGgKKyAgICAgICAgICAgICAgICAjIFNJT0NHTElGQ09ORiwgb3IgaXQgbWlnaHQgYmUgc29tZSBvdGhlciBPUworICAgICAgICAgICAgICAgICMgb3Igc29tZSBvbGRlciB2ZXJzaW9uIG9mIFNvbGFyaXMsIHdpdGgKKyAgICAgICAgICAgICAgICAjIGp1c3QgU0lPQ0dJRkNPTkYuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgIHRyeV9jb21waWxlKCBIQVZFX1NJT0NHTElGQ09ORiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gIiR7cGNhcF9TT1VSQ0VfRElSfS9jb25maWcvaGF2ZV9zaW9jZ2xpZmNvbmYuYyIgICkKKyAgICAgICAgICAgICAgICBtZXNzYWdlKCBTVEFUVVMgIkhBVkVfU0lPQ0dMSUZDT05GID0gJHtIQVZFX1NJT0NHTElGQ09ORn0iICkKKyAgICAgICAgICAgICAgICBpZiggSEFWRV9TSU9DR0xJRkNPTkYgKQorICAgICAgICAgICAgICAgICAgICBzZXQoIEZJTkRBTExERVZTX1RZUEUgZ2xpZmMgKQorICAgICAgICAgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgICAgICAgICBzZXQoIEZJTkRBTExERVZTX1RZUEUgZ2lmYyApCisgICAgICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICAgICAgZWxzZSgpCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgQXNzdW1lIHdlIGp1c3QgaGF2ZSBTSU9DR0lGQ09ORi4KKyAgICAgICAgICAgICAgICAjIChYWFggLSBvbiBhdCBsZWFzdCBsYXRlciBMaW51eCBrZXJuZWxzLCB0aGVyZSdzCisgICAgICAgICAgICAgICAgIyBhbm90aGVyIG1lY2hhbmlzbSwgYW5kIHdlIHNob3VsZCBiZSB1c2luZyB0aGF0CisgICAgICAgICAgICAgICAgIyBpbnN0ZWFkLikKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgc2V0KCBGSU5EQUxMREVWU19UWVBFIGdpZmMgKQorICAgICAgICAgICAgZW5kaWYoKQorICAgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGaW5kLWludGVyZmFjZXMgbWVjaGFuaXNtIHR5cGU6ICR7RklOREFMTERFVlNfVFlQRX0iKQorICAgIHNldCggUFJPSkVDVF9TT1VSQ0VfTElTVF9DICR7UFJPSkVDVF9TT1VSQ0VfTElTVF9DfSBmYWQtJHtGSU5EQUxMREVWU19UWVBFfS5jICkKK2VuZGlmKCkKKworZmlsZShHTE9CIFBST0pFQ1RfU09VUkNFX0xJU1RfQ09SRV9ICisgICAgKi5oCisgICAgcGNhcC8qLmgKKykKK3NldCggUFJPSkVDVF9TT1VSQ0VfTElTVF9IICR7UFJPSkVDVF9TT1VSQ0VfTElTVF9IfSAke1BST0pFQ1RfU09VUkNFX0xJU1RfQ09SRV9IfSApCisKK2lmKCBXSU4zMiApCisgICAgZmlsZShHTE9CIFBST0pFQ1RfU09VUkNFX0xJU1RfV0lOMzJfSAorICAgICAgICBXaW4zMi9JbmNsdWRlLyouaAorICAgICkKKyAgICBzZXQoIFBST0pFQ1RfU09VUkNFX0xJU1RfSCAke1BST0pFQ1RfU09VUkNFX0xJU1RfSH0gJHtQUk9KRUNUX1NPVVJDRV9MSVNUX1dJTjMyX0h9ICkKK2VuZGlmKCBXSU4zMiApCisKKyMKKyMge0ZsZXh9IGFuZCBZQUNDL0JlcmtlbGV5IFlBQ0MvQmlzb24uCisjIEZyb20gYSBtYWlsIG1lc3NhZ2UgdG8gdGhlIENNYWtlIG1haWxpbmcgbGlzdCBieSBBbmR5IENlZGlsbmlrIG9mCisjIEtpdHdhcmUuCisjCisKKyMKKyMgVHJ5IHRvIGZpbmQgRmxleCwgYSBXaW5kb3dzIHZlcnNpb24gb2YgRmxleCwgb3IgTGV4LgorIworZmluZF9wcm9ncmFtKExFWF9FWEVDVVRBQkxFIE5BTUVTIGZsZXggd2luX2ZsZXggbGV4KQoraWYoICR7TEVYX0VYRUNVVEFCTEV9IFNUUkVRVUFMICJMRVhfRVhFQ1VUQUJMRS1OT1RGT1VORCIgKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIk5laXRoZXIgZmxleCBub3Igd2luX2ZsZXggbm9yIGxleCB3YXMgZm91bmQuIiApCitlbmRpZigpCittZXNzYWdlKFNUQVRVUyAiTGV4aWNhbCBhbmFseXplciBnZW5lcmF0b3I6ICR7TEVYX0VYRUNVVEFCTEV9IikKKworYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2Nhbm5lci5jICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY2FubmVyLmgKKyAgICBTT1VSQ0UgJHtwY2FwX1NPVVJDRV9ESVJ9L3NjYW5uZXIubAorICAgIENPTU1BTkQgJHtMRVhfRVhFQ1VUQUJMRX0gLVAgcGNhcF8gLS1oZWFkZXItZmlsZT1zY2FubmVyLmggLS1ub3VucHV0IC1vJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjYW5uZXIuYyAke3BjYXBfU09VUkNFX0RJUn0vc2Nhbm5lci5sCisgICAgREVQRU5EUyAke3BjYXBfU09VUkNFX0RJUn0vc2Nhbm5lci5sCispCisKKyMKKyMgU2luY2Ugc2Nhbm5lci5jIGRvZXMgbm90IGV4aXN0IHlldCB3aGVuIGNtYWtlIGlzIHJ1biwgbWFyaworIyBpdCBhcyBnZW5lcmF0ZWQuCisjCisjIFNpbmNlIHNjYW5uZXIuYyBpbmNsdWRlcyBncmFtbWFyLmgsIG1hcmsgdGhhdCBhcyBhIGRlcGVuZGVuY3kuCisjCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjYW5uZXIuYyBQUk9QRVJUSUVTCisgICAgR0VORVJBVEVEIFRSVUUKKyAgICBPQkpFQ1RfREVQRU5EUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc2Nhbm5lci5oCispCisKKyMKKyMgQWRkIHNjYW5uZXIuYyB0byB0aGUgbGlzdCBvZiBzb3VyY2VzLgorIworI3NldChQUk9KRUNUX1NPVVJDRV9MSVNUX0MgJHtQUk9KRUNUX1NPVVJDRV9MSVNUX0N9ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zY2FubmVyLmMpCisKKyMKKyMgVHJ5IHRvIGZpbmQgWUFDQyBvciBCaXNvbi4KKyMKK2ZpbmRfcHJvZ3JhbShZQUNDX0VYRUNVVEFCTEUgTkFNRVMgYmlzb24gd2luX2Jpc29uIGJ5YWNjIHlhY2MpCitpZiggJHtZQUNDX0VYRUNVVEFCTEV9IFNUUkVRVUFMICJZQUNDX0VYRUNVVEFCTEUtTk9URk9VTkQiICkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJOZWl0aGVyIGJpc29uIG5vciB3aW5fYmlzb24gbm9yIGJ5YWNjIG5vciB5YWNjIHdhcyBmb3VuZC4iICkKK2VuZGlmKCkKK21lc3NhZ2UoU1RBVFVTICJQYXJzZXIgZ2VuZXJhdG9yOiAke1lBQ0NfRVhFQ1VUQUJMRX0iKQorCisjCisjIENyZWF0ZSBjdXN0b20gY29tbWFuZCBmb3IgdGhlIHNjYW5uZXIuCisjIEZpbmQgb3V0IHdoZXRoZXIgaXQncyBCaXNvbiBvciBub3RieSBsb29raW5nIGF0IHRoZSBsYXN0IGNvbXBvbmVudAorIyBvZiB0aGUgcGF0aCAod2l0aG91dCBhIC5leGUgZXh0ZW5zaW9uLCBpZiB0aGlzIGlzIFdpbmRvd3MpLgorIworZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChZQUNDX05BTUUgJHtZQUNDX0VYRUNVVEFCTEV9IE5BTUVfV0UpCitpZiggIiR7WUFDQ19OQU1FfSIgU1RSRVFVQUwgImJpc29uIiBPUiAiJHtZQUNDX05BTUV9IiBTVFJFUVVBTCAid2luX2Jpc29uIiApCisgICAgc2V0KCBZQUNDX0NPTVBBVElCSUxJVFlfRkxBRyAiLXkiICkKK2VuZGlmKCkKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgICBPVVRQVVQgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dyYW1tYXIuYyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ3JhbW1hci5oCisgICAgU09VUkNFICR7cGNhcF9TT1VSQ0VfRElSfS9ncmFtbWFyLnkKKyAgICBDT01NQU5EICR7WUFDQ19FWEVDVVRBQkxFfSAke1lBQ0NfQ09NUEFUSUJJTElUWV9GTEFHfSAtcCBwY2FwXyAtbyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ3JhbW1hci5jIC1kICR7cGNhcF9TT1VSQ0VfRElSfS9ncmFtbWFyLnkKKyAgICBERVBFTkRTICR7cGNhcF9TT1VSQ0VfRElSfS9ncmFtbWFyLnkKKykKKworIworIyBTaW5jZSBncmFtbWFyLmMgZG9lcyBub3QgZXhpc3RzIHlldCB3aGVuIGNtYWtlIGlzIHJ1biwgbWFyaworIyBpdCBhcyBnZW5lcmF0ZWQuCisjCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dyYW1tYXIuYyBQUk9QRVJUSUVTCisgICAgR0VORVJBVEVEIFRSVUUKKykKKworIworIyBBZGQgZ3JhbW1hci5jIHRvIHRoZSBsaXN0IG9mIHNvdXJjZXMuCisjCisjc2V0KFBST0pFQ1RfU09VUkNFX0xJU1RfQyAke1BST0pFQ1RfU09VUkNFX0xJU1RfQ30gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dyYW1tYXIuYykKKworaWYoIFdJTjMyICkKKyAgICAjCisgICAgIyBDTWFrZSBkb2VzIG5vdCBsb3ZlIFdpbmRvd3MuCisgICAgIworICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggIiR7cGNhcF9TT1VSQ0VfRElSfS9HZW5WZXJzaW9uLmJhdCIgR2VuVmVyc2lvbl9wYXRoKQorICAgIGZpbGUoVE9fTkFUSVZFX1BBVEggIiR7cGNhcF9TT1VSQ0VfRElSfS9WRVJTSU9OIiBWRVJTSU9OX3BhdGgpCisgICAgZmlsZShUT19OQVRJVkVfUEFUSCAiJHtwY2FwX1NPVVJDRV9ESVJ9L3BjYXBfdmVyc2lvbi5oLmluIiB2ZXJzaW9uX2hfaW5fcGF0aCkKKyAgICBmaWxlKFRPX05BVElWRV9QQVRIICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcGNhcF92ZXJzaW9uLmgiIHZlcnNpb25faF9wYXRoKQorICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgT1VUUFVUICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9wY2FwX3ZlcnNpb24uaAorICAgICAgICBTT1VSQ0UgJHtwY2FwX1NPVVJDRV9ESVJ9L1ZFUlNJT04gJHtwY2FwX1NPVVJDRV9ESVJ9L3BjYXBfdmVyc2lvbi5oLmluCisgICAgICAgIENPTU1BTkQgJHtHZW5WZXJzaW9uX3BhdGh9ICR7VkVSU0lPTl9wYXRofSAke3ZlcnNpb25faF9pbl9wYXRofSAke3ZlcnNpb25faF9wYXRofQorICAgICAgICBERVBFTkRTICR7cGNhcF9TT1VSQ0VfRElSfS9WRVJTSU9OICR7cGNhcF9TT1VSQ0VfRElSfS9wY2FwX3ZlcnNpb24uaC5pbgorICAgICkKK2Vsc2UoIFdJTjMyICkKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdmVyc2lvbi5jCisgICAgICAgIFNPVVJDRSAke3BjYXBfU09VUkNFX0RJUn0vVkVSU0lPTgorICAgICAgICBDT01NQU5EICR7cGNhcF9TT1VSQ0VfRElSfS9nZW5fdmVyc2lvbl9jLnNoICR7cGNhcF9TT1VSQ0VfRElSfS9WRVJTSU9OICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS92ZXJzaW9uLmMKKyAgICAgICAgREVQRU5EUyAke3BjYXBfU09VUkNFX0RJUn0vVkVSU0lPTgorICAgICkKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcGNhcF92ZXJzaW9uLmgKKyAgICAgICAgU09VUkNFICR7cGNhcF9TT1VSQ0VfRElSfS9WRVJTSU9OCisgICAgICAgIENPTU1BTkQgJHtwY2FwX1NPVVJDRV9ESVJ9L2dlbl92ZXJzaW9uX2hlYWRlci5zaCAke3BjYXBfU09VUkNFX0RJUn0vVkVSU0lPTiAke3BjYXBfU09VUkNFX0RJUn0vcGNhcF92ZXJzaW9uLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3BjYXBfdmVyc2lvbi5oCisgICAgICAgIERFUEVORFMgJHtwY2FwX1NPVVJDRV9ESVJ9L1ZFUlNJT04KKyAgICApCisKKyAgICAjCisgICAgIyBTaW5jZSB2ZXJzaW9uLmMgZG9lcyBub3QgZXhpc3RzIHlldCB3aGVuIGNtYWtlIGlzIHJ1biwgbWFyaworICAgICMgaXQgYXMgZ2VuZXJhdGVkLgorICAgICMKKyAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3ZlcnNpb24uYyBQUk9QRVJUSUVTCisgICAgICAgIEdFTkVSQVRFRCBUUlVFCisgICAgKQorCisgICAgIworICAgICMgQWRkIHZlcnNpb24uYyB0byB0aGUgbGlzdCBvZiBzb3VyY2VzLgorICAgICMKKyAgICBzZXQoUFJPSkVDVF9TT1VSQ0VfTElTVF9DICR7UFJPSkVDVF9TT1VSQ0VfTElTVF9DfSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdmVyc2lvbi5jKQorZW5kaWYoIFdJTjMyICkKKworIworIyBTaW5jZSBwY2FwX3ZlcnNpb24uaCBkb2VzIG5vdCBleGlzdHMgeWV0IHdoZW4gY21ha2UgaXMgcnVuLCBtYXJrCisjIGl0IGFzIGdlbmVyYXRlZC4KKyMKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcGNhcF92ZXJzaW9uLmggUFJPUEVSVElFUworICAgIEdFTkVSQVRFRCBUUlVFCispCisKKyMKKyMgQWRkIHBjYXBfdmVyc2lvbi5oIHRvIHRoZSBsaXN0IG9mIGhlYWRlcnMuCisjCitzZXQoUFJPSkVDVF9TT1VSQ0VfTElTVF9IICR7UFJPSkVDVF9TT1VSQ0VfTElTVF9IfSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vcGNhcF92ZXJzaW9uLmgpCisKK3NvdXJjZV9ncm91cCgiU291cmNlIEZpbGVzIiBGSUxFUyAke1BST0pFQ1RfU09VUkNFX0xJU1RfQ30pCitzb3VyY2VfZ3JvdXAoIkhlYWRlciBGaWxlcyIgRklMRVMgJHtQUk9KRUNUX1NPVVJDRV9MSVNUX0h9KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZWdpc3RlciB0YXJnZXRzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCithZGRfbGlicmFyeSgke0xJQlJBUllfTkFNRX0KKyAgICAke1BST0pFQ1RfU09VUkNFX0xJU1RfQ30KKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ3JhbW1hci5jCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NjYW5uZXIuYworICAgICR7UFJPSkVDVF9TT1VSQ0VfTElTVF9IfQorKQorCitpZiggV0lOMzIgKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyAoICR7TElCUkFSWV9OQU1FfQorICAgICAgICBwYWNrZXQKKyAgICAgICAgd3MyXzMyCisgICAgKQorZW5kaWYoIFdJTjMyICkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgV3JpdGUgb3V0IHRoZSBjb25maWcuaCBmaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2Vjb25maWcuaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vY29uZmlnLmgpCmRpZmYgLS1naXQgYS9HZW5WZXJzaW9uLmJhdCBiL0dlblZlcnNpb24uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmYzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9HZW5WZXJzaW9uLmJhdApAQCAtMCwwICsxLDIzIEBACitSRU0KK1JFTSBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHBjYXBfdmVyc2lvbi5oIGJhc2VkIG9uIHBjYXBfdmVyc2lvbi5oLmluCitSRU0gZm9yIFdpbmRvd3MKK1JFTSBUaGUgdmVyc2lvbiBzdHJpbmcgY29tZXMgZnJvbSBWRVJTSU9OCitSRU0gQGVjaG8gb2ZmCitSRU0KKworc2V0bG9jYWwgZW5hYmxlZXh0ZW5zaW9ucyBkaXNhYmxlZGVsYXllZGV4cGFuc2lvbgorCitzZXQgInNlYXJjaD0lJSUlTElCUENBUF9WRVJTSU9OJSUlJSIKK3NldCAvcCByZXBsYWNlPTwlMQorCitpZiBleGlzdCAlMyBkZWwgJTMgMj5udWwKKworZm9yIC9mICJkZWxpbXM9IiAlJWkgaW4gKCd0eXBlICUyJyApIGRvICgKKwlzZXQgImxpbmU9JSVpIgorCXNldGxvY2FsIGVuYWJsZWRlbGF5ZWRleHBhbnNpb24KKwlzZXQgImxpbmU9IWxpbmU6JXNlYXJjaCU9JXJlcGxhY2UlISIKKwk+PiUzIGVjaG8oIWxpbmUhCisJZW5kbG9jYWwKKykKKworZWNobyBwY2FwX3ZlcnNpb24uaCBnZW5lcmF0ZWQKZGlmZiAtLWdpdCBhL0lOU1RBTEwudHh0IGIvSU5TVEFMTC50eHQKaW5kZXggMThiNDg5YS4uZjMwNWFhMiAxMDA2NDQKLS0tIGEvSU5TVEFMTC50eHQKKysrIGIvSU5TVEFMTC50eHQKQEAgLTE2LDcgKzE2LDcgQEAKIHBhcnRpY3VsYXIgdHlwZS4gKElmIHlvdSBoYXZlIEhQLVVYLCBzZWUgYmVsb3cuKSBJZiB5b3VyIHN5c3RlbSB1c2VzIGEKIHBhY2tldCBjYXB0dXJlIG5vdCBzdXBwb3J0ZWQgYnkgbGlicGNhcCwgcGxlYXNlIHNlbmQgdXMgcGF0Y2hlczsgZG9uJ3QKIGZvcmdldCB0byBpbmNsdWRlIGFuIGF1dG9jb25mIGZyYWdtZW50IHN1aXRhYmxlIGZvciB1c2UgaW4KLWNvbmZpZ3VyZS5pbi4KK2NvbmZpZ3VyZS5hYy4KIAogSXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcGFja2V0IGNhcHR1cmUgdHlwZSwgYWx0aG91Z2gKIHRoZSBjaXJjdW1zdGFuY2Ugd2hlcmUgdGhpcyB3b3JrcyBhcmUgbGltaXRlZC4gRm9yIGV4YW1wbGUgaWYgeW91IGhhdmUKQEAgLTMxLDQwICszMSwyMiBAQAogd2lsbCBhYm9ydCBpZiB5b3VyIGNvbXBpbGVyIGlzIG5vdCBBTlNJIGNvbXBsaWFudC4gSWYgdGhpcyBoYXBwZW5zLCB1c2UKIHRoZSBnZW5lcmFsbHkgYXZhaWxhYmxlIEdOVSBDIGNvbXBpbGVyIChHQ0MpLgogCi1JZiB5b3UgdXNlIGZsZXgsIHlvdSBtdXN0IHVzZSB2ZXJzaW9uIDIuNC42IG9yIGhpZ2hlci4gVGhlIGNvbmZpZ3VyZQotc2NyaXB0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyB0aGUgdmVyc2lvbiBvZiBmbGV4IGFuZCB3aWxsIG5vdCB1c2UgaXQKLXVubGVzcyBpdCBpcyBuZXcgZW5vdWdoLiBZb3UgY2FuIHVzZSAiZmxleCAtViIgdG8gc2VlIHdoYXQgdmVyc2lvbiB5b3UKLWhhdmUgKHVubGVzcyBpdCdzIHJlYWxseSBvbGQpLiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGZsZXggaXMgYXZhaWxhYmxlCi1hdCBmbGV4LnNvdXJjZWZvcmdlLm5ldCBhbmQgb2Z0ZW4gY29tZXMgcGFja2FnZWQgYnkgbWVhbnMgb2YgdGhlIE9TLgotQXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgY3VycmVudCB2ZXJzaW9uIGlzIDIuNS4zNy4KK1lvdSB3aWxsIG5lZWQgZWl0aGVyIEZsZXggMi41LjMxIG9yIGxhdGVyLCBvciBhIHZlcnNpb24gb2YgTGV4Citjb21wYXRpYmxlIHdpdGggaXQgKGlmIGFueSBleGlzdCksIHRvIGJ1aWxkIGxpYnBjYXAuICBUaGUgY29uZmlndXJlCitzY3JpcHQgd2lsbCBhYm9ydCBpZiB0aGVyZSBpc24ndCBhbnkgc3VjaCBwcm9ncmFtLiAgSWYgeW91IGhhdmUgYW4gb2xkZXIKK3ZlcnNpb24gb2YgRmxleCwgb3IgZG9uJ3QgaGF2ZSBhIGNvbXBhdGlibGUgdmVyc2lvbiBvZiBMZXgsIHRoZSBjdXJyZW50Cit2ZXJzaW9uIG9mIGZsZXggaXMgYXZhaWxhYmxlIGF0IGZsZXguc291cmNlZm9yZ2UubmV0LgogCi1JZiB5b3UgdXNlIGJpc29uLCB5b3UgbXVzdCB1c2UgZmxleCAoYW5kIHZpc2EgdmVyc2EpLiBUaGUgY29uZmlndXJlCi1zY3JpcHQgYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIGxleCBhbmQgeWFjYyBpZiBib3RoIGZsZXggYW5kIGJpc29uCi1hcmUgbm90IGZvdW5kLgorWW91IHdpbGwgbmVlZCBlaXRoZXIgQmlzb24sIEJlcmtlbGV5IFlBQ0MsIG9yIGEgdmVyc2lvbiBvZiBZQUNDCitjb21wYXRpYmxlIHdpdGggdGhlbSAoaWYgYW55IGV4aXN0KSwgdG8gYnVpbGQgbGlicGNhcC4gIFRoZSBjb25maWd1cmUKK3NjcmlwdCB3aWxsIGFib3J0IGlmIHRoZXJlIGlzbid0IGFueSBzdWNoIHByb2dyYW0uICBJZiB5b3UgZG9uJ3QgaGF2ZQorYW55IHN1Y2ggcHJvZ3JhbSwgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBCaXNvbiBjYW4gYmUgZm91bmQgYXQKK2h0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYmlzb24vIGFuZCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIEJlcmtlbGV5IFlBQ0MKK2NhbiBiZSBmb3VuZCBhdCBodHRwOi8vaW52aXNpYmxlLWlzbGFuZC5uZXQvYnlhY2MvLgogCi1Tb21ldGltZXMgdGhlIHN0b2NrIEMgY29tcGlsZXIgZG9lcyBub3QgaW50ZXJhY3Qgd2VsbCB3aXRoIGZsZXggYW5kCi1iaXNvbi4gVGhlIGxpc3Qgb2YgcHJvYmxlbXMgaW5jbHVkZXMgdW5kZWZpbmVkIHJlZmVyZW5jZXMgZm9yIGFsbG9jYS4KLVlvdSBjYW4gZ2V0IGFyb3VuZCB0aGlzIGJ5IGluc3RhbGxpbmcgZ2NjIG9yIG1hbnVhbGx5IGRpc2FibGluZyBmbGV4Ci1hbmQgYmlzb24gd2l0aDoKLQotICAgIC4vY29uZmlndXJlIC0td2l0aG91dC1mbGV4IC0td2l0aG91dC1iaXNvbgotCi1JZiB5b3VyIHN5c3RlbSBvbmx5IGhhcyBBVCZUIGxleCwgdGhpcyBpcyBva2F5IHVubGVzcyB5b3VyIGxpYnBjYXAKLXByb2dyYW0gdXNlcyBvdGhlciBsZXgveWFjYyBnZW5lcmF0ZWQgY29kZS4gKEFsdGhvdWdoIGl0J3MgcG9zc2libGUgdG8KLW1hcCB0aGUgeXkqIGlkZW50aWZpZXJzIHdpdGggYSBzY3JpcHQsIHdlIHVzZSBmbGV4IGFuZCBiaXNvbiBzbyB3ZQotZG9uJ3QgZmVlbCB0aGlzIGlzIG5lY2Vzc2FyeS4pCi0KLVNvbWUgc3lzdGVtcyBzdXBwb3J0IHRoZSBCZXJrZWxleSBQYWNrZXQgRmlsdGVyIG5hdGl2ZWx5OyBmb3IgZXhhbXBsZQotb3V0IG9mIHRoZSBib3ggT1NGIGFuZCBCU0QvT1MgaGF2ZSBicGYuIElmIHlvdXIgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQKLWJwZiwgeW91IHdpbGwgbmVlZCB0byBwaWNrIHVwOgotCi0JZnRwOi8vZnRwLmVlLmxibC5nb3YvYnBmLSoudGFyLloKLQotTm90ZSB3ZWxsOiB5b3UgTVVTVCBoYXZlIGtlcm5lbCBzb3VyY2UgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBpbgotb3JkZXIgdG8gaW5zdGFsbCBicGYuIEFuIGV4Y2VwdGlvbiBpcyBTdW5PUyA0OyB0aGUgYnBmIGRpc3RyaWJ1dGlvbgotaW5jbHVkZXMgcmVwbGFjZW1lbnQga2VybmVsIG9iamVjdHMgZm9yIHNvbWUgb2YgdGhlIHN0YW5kYXJkIFN1bk9TIDQKLW5ldHdvcmsgZGV2aWNlIGRyaXZlcnMuIFNlZSB0aGUgYnBmIElOU1RBTEwgZG9jdW1lbnQgZm9yIG1vcmUKLWluZm9ybWF0aW9uLgorU29tZXRpbWVzIHRoZSBzdG9jayBDIGNvbXBpbGVyIGRvZXMgbm90IGludGVyYWN0IHdlbGwgd2l0aCBGbGV4IGFuZAorQmlzb24uIFRoZSBsaXN0IG9mIHByb2JsZW1zIGluY2x1ZGVzIHVuZGVmaW5lZCByZWZlcmVuY2VzIGZvciBhbGxvY2EuCitZb3UgY2FuIGdldCBhcm91bmQgdGhpcyBieSBpbnN0YWxsaW5nIEdDQy4KIAogSWYgeW91IHVzZSBTb2xhcmlzLCB0aGVyZSBpcyBhIGJ1ZyB3aXRoIGJ1Zm1vZCg3KSB0aGF0IGlzIGZpeGVkIGluCiBTb2xhcmlzIDIuMy4yIChha2EgU3VuT1MgNS4zLjIpLiBTZXR0aW5nIGEgc25hcHNob3QgbGVuZ3RoIHdpdGggdGhlCkBAIC0yMzksMTEgKzIyMSwxMSBAQAogYnVpbGQgd2l0aG91dCBjaGFuZ2VzIG9uIFVuaXhXYXJlIDcuCiAKIElmIGxpbmtpbmcgdGNwZHVtcCBmYWlscyB3aXRoICJVbmRlZmluZWQ6IF9hbGxvY2EiIHdoZW4gdXNpbmcgYmlzb24gb24KLWEgU3VuNCwgeW91ciB2ZXJzaW9uIG9mIGJpc29uIGlzIGJyb2tlbi4gSW4gYW55IGNhc2UgdmVyc2lvbiAxLjE2IG9yCithIFN1bjQsIHlvdXIgdmVyc2lvbiBvZiBCaXNvbiBpcyBicm9rZW4uIEluIGFueSBjYXNlIHZlcnNpb24gMS4xNiBvcgogaGlnaGVyIGlzIHJlY29tbWVuZGVkICgxLjE0IGlzIGtub3duIHRvIGNhdXNlIHByb2JsZW1zIDEuMTYgaXMga25vd24gdG8KIHdvcmspLiBFaXRoZXIgcGljayB1cCBhIGN1cnJlbnQgdmVyc2lvbiBmcm9tOgogCi0JZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9iaXNvbgorCWh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYmlzb24vCiAKIG9yIGhhY2sgYXJvdW5kIGl0IGJ5IGluc2VydGluZyB0aGUgbGluZXM6CiAKQEAgLTI4OSw2ICsyNzEsNyBAQAogQ0hBTkdFUwkJLSBkZXNjcmlwdGlvbiBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHJlbGVhc2VzCiBDaG1vZEJQRi8qCS0gTWFjIE9TIFggc3RhcnR1cCBpdGVtIHRvIHNldCBvd25lcnNoaXAgYW5kIHBlcm1pc3Npb25zCiAJCSAgb24gL2Rldi9icGYqCitDTWFrZUxpc3RzLnR4dAktIENNYWtlIGZpbGUKIENSRURJVFMJCS0gcGVvcGxlIHRoYXQgaGF2ZSBoZWxwZWQgbGlicGNhcCBhbG9uZwogSU5TVEFMTC50eHQJLSB0aGlzIGZpbGUKIExJQ0VOU0UJCS0gdGhlIGxpY2Vuc2UgdW5kZXIgd2hpY2ggdGNwZHVtcCBpcyBkaXN0cmlidXRlZApAQCAtMzE3LDcgKzMwMCw3IEBACiBjb25maWcuaC5pbgktIGF1dG9jb25mIGlucHV0CiBjb25maWcuc3ViCS0gYXV0b2NvbmYgc3VwcG9ydAogY29uZmlndXJlCS0gY29uZmlndXJlIHNjcmlwdCAocnVuIHRoaXMgZmlyc3QpCi1jb25maWd1cmUuaW4JLSBjb25maWd1cmUgc2NyaXB0IHNvdXJjZQorY29uZmlndXJlLmFjCS0gY29uZmlndXJlIHNjcmlwdCBzb3VyY2UKIGRscGlzdWJzLmMJLSBETFBJLXJlbGF0ZWQgZnVuY3Rpb25zIGZvciBwY2FwLWRscGkuYyBhbmQgcGNhcC1saWJkbHBpLmMKIGRscGlzdWJzLmgJLSBETFBJLXJlbGF0ZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zCiBldGhlcmVudC5jCS0gL2V0Yy9ldGhlcnMgc3VwcG9ydCByb3V0aW5lcwpAQCAtMzI1LDkgKzMwOCw2IEBACiBmYWQtZ2V0YWQuYwktIHBjYXBfZmluZGFsbGRldnMoKSBmb3Igc3lzdGVtcyB3aXRoIGdldGlmYWRkcnMoKQogZmFkLWdpZmMuYwktIHBjYXBfZmluZGFsbGRldnMoKSBmb3Igc3lzdGVtcyB3aXRoIG9ubHkgU0lPQ0dJRkxJU1QKIGZhZC1nbGlmYy5jCS0gcGNhcF9maW5kYWxsZGV2cygpIGZvciBzeXN0ZW1zIHdpdGggU0lPQ0dMSUZDT05GCi1mYWQtbnVsbC5jCS0gcGNhcF9maW5kYWxsZGV2cygpIGZvciBzeXN0ZW1zIHdpdGhvdXQgY2FwdHVyZSBzdXBwb3J0Ci1mYWQtc2l0YS5jCS0gcGNhcF9maW5kYWxsZGV2cygpIGZvciBzeXN0ZW1zIHdpdGggU0lUQSBzdXBwb3J0Ci1mYWQtd2luMzIuYwktIHBjYXBfZmluZGFsbGRldnMoKSBmb3IgV2luUGNhcAogZmlsdGVydGVzdC5jCS0gdGVzdCBwcm9ncmFtIGZvciBCUEYgY29tcGlsZXIKIGZpbmRhbGxkZXZzdGVzdC5jIC0gdGVzdCBwcm9ncmFtIGZvciBwY2FwX2ZpbmRhbGxkZXZzKCkKIGdlbmNvZGUuYwktIEJQRiBjb2RlIGdlbmVyYXRpb24gcm91dGluZXMKQEAgLTM4OCw3ICszNjgsNiBAQAogcGNhcC1maWx0ZXIuNAktIG1hbnVhbCBlbnRyeSBmb3IgZmlsdGVyIHN5bnRheAogcGNhcC1saW5rdHlwZS40CS0gbWFudWFsIGVudHJ5IGZvciBsaW5rLWxheWVyIGhlYWRlciB0eXBlcwogcHBwLmgJCS0gUG9pbnQgdG8gUG9pbnQgUHJvdG9jb2wgZGVmaW5pdGlvbnMKLXJ1bmxleC5zaAktIHdyYXBwZXIgZm9yIExleC9GbGV4CiBzYXZlZmlsZS5jCS0gb2ZmbGluZSBzdXBwb3J0CiBzY2FubmVyLmwJLSBmaWx0ZXIgc3RyaW5nIHNjYW5uZXIKIHN1bmF0bXBvcy5oCS0gZGVmaW5pdGlvbnMgZm9yIFN1bkFUTSBjYXB0dXJpbmcKZGlmZiAtLWdpdCBhL01ha2VmaWxlLWRldmVsLWFkZHMgYi9NYWtlZmlsZS1kZXZlbC1hZGRzCmluZGV4IDdiZjY0MjAuLmZlYTYzYmIgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLWRldmVsLWFkZHMKKysrIGIvTWFrZWZpbGUtZGV2ZWwtYWRkcwpAQCAtMiwxMiArMiwxMiBAQAogIyBBdXRvLXJlZ2VuZXJhdGUgY29uZmlndXJlIHNjcmlwdCBvciBNYWtlZmlsZSB3aGVuIHRoaW5ncyBjaGFuZ2UuCiAjIEZyb20gYXV0b2NvbmYuaW5mbyAuICBXb3JrcyBiZXN0IHdpdGggR05VIE1ha2UuCiAjCi0ke3NyY2Rpcn0vY29uZmlndXJlOiBjb25maWd1cmUuaW4gYWNsb2NhbC5tNAorJHtzcmNkaXJ9L2NvbmZpZ3VyZTogY29uZmlndXJlLmFjIGFjbG9jYWwubTQKIAljZCAke3NyY2Rpcn0gJiYgYXV0b2NvbmYKIAogIyBhdXRvaGVhZGVyIG1pZ2h0IG5vdCBjaGFuZ2UgY29uZmlnLmguaW4sIHNvIHRvdWNoIGEgc3RhbXAgZmlsZS4KICR7c3JjZGlyfS9jb25maWcuaC5pbjogJHtzcmNkaXJ9L3N0YW1wLWguaW4KLSR7c3JjZGlyfS9zdGFtcC1oLmluOiBjb25maWd1cmUuaW4gYWNsb2NhbC5tNAorJHtzcmNkaXJ9L3N0YW1wLWguaW46IGNvbmZpZ3VyZS5hYyBhY2xvY2FsLm00CiAJY2QgJHtzcmNkaXJ9ICYmIGF1dG9oZWFkZXIKIAllY2hvIHRpbWVzdGFtcCA+ICR7c3JjZGlyfS9zdGFtcC1oLmluCiAKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KaW5kZXggNGMzNWJkZS4uZTcxZDk3MyAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTQ5LDcgKzQ5LDcgQEAKIE1LREVQID0gQE1LREVQQAogQ0NPUFQgPSBAVl9DQ09QVEAKIElOQ0xTID0gLUkuIEBWX0lOQ0xTQAotREVGUyA9IEBERUZTQCBAVl9ERUZTQAorREVGUyA9IC1EQlVJTERJTkdfUENBUCBAREVGU0AgQFZfREVGU0AKIEFERExPQkpTID0gQEFERExPQkpTQAogQURETEFSQ0hJVkVPQkpTID0gQEFERExBUkNISVZFT0JKU0AKIExJQlMgPSBATElCU0AKQEAgLTY5LDEzICs2OSw4IEBACiBJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAogUkFOTElCID0gQFJBTkxJQkAKIAotIwotIyBGbGV4IGFuZCBiaXNvbiBhbGxvdyB5b3UgdG8gc3BlY2lmeSB0aGUgcHJlZml4ZXMgb2YgdGhlIGdsb2JhbCBzeW1ib2xzCi0jIHVzZWQgYnkgdGhlIGdlbmVyYXRlZCBwYXJzZXIuICBUaGlzIGFsbG93cyBwcm9ncmFtcyB0byB1c2UgbGV4L3lhY2MKLSMgYW5kIGxpbmsgYWdhaW5zdCBsaWJwY2FwLiAgSWYgeW91IGRvbid0IGhhdmUgZmxleCBvciBiaXNvbiwgZ2V0IHRoZW0uCi0jCi1MRVggPSBAVl9MRVhACi1ZQUNDID0gQFZfWUFDQ0AKK0xFWCA9IEBMRVhACitZQUNDID0gQFlBQ0NACiAKICMgRXhwbGljaXRseSBkZWZpbmUgY29tcGlsYXRpb24gcnVsZSBzaW5jZSBTdW5PUyA0J3MgbWFrZSBkb2Vzbid0IGxpa2UgZ2NjLgogIyBBbHNvLCBnY2MgZG9lcyBub3QgcmVtb3ZlIHRoZSAubyBiZWZvcmUgZm9ya2luZyAnYXMnLCB3aGljaCBjYW4gYmUgYQpAQCAtODQsMTEgKzc5LDExIEBACiAJQHJtIC1mICRACiAJJChDQykgJChGVUxMX0NGTEFHUykgLWMgJChzcmNkaXIpLyQqLmMKIAotUFNSQyA9CXBjYXAtQFZfUENBUEAuYyBAVVNCX1NSQ0AgQEJUX1NSQ0AgQEJUX01PTklUT1JfU1JDQCBAQ0FOX1NSQ0AgQE5FVEZJTFRFUl9TUkNAIEBDQU5VU0JfU1JDQCBAREJVU19TUkNACi1GU1JDID0gIGZhZC1AVl9GSU5EQUxMREVWU0AuYworUFNSQyA9CXBjYXAtQFZfUENBUEAuYyBAVVNCX1NSQ0AgQEJUX1NSQ0AgQEJUX01PTklUT1JfU1JDQCBATkVURklMVEVSX1NSQ0AgQERCVVNfU1JDQAorRlNSQyA9ICBAVl9GSU5EQUxMREVWU0AKIFNTUkMgPSAgQFNTUkNACi1DU1JDID0JcGNhcC5jIGluZXQuYyBnZW5jb2RlLmMgb3B0aW1pemUuYyBuYW1ldG9hZGRyLmMgZXRoZXJlbnQuYyBcCi0Jc2F2ZWZpbGUuYyBzZi1wY2FwLmMgc2YtcGNhcC1uZy5jIHBjYXAtY29tbW9uLmMgXAorQ1NSQyA9CXBjYXAuYyBpbmV0LmMgZmFkLWhlbHBlcnMuYyBnZW5jb2RlLmMgb3B0aW1pemUuYyBuYW1ldG9hZGRyLmMgXAorCWV0aGVyZW50LmMgc2F2ZWZpbGUuYyBzZi1wY2FwLmMgc2YtcGNhcC1uZy5jIHBjYXAtY29tbW9uLmMgXAogCWJwZl9pbWFnZS5jIGJwZl9kdW1wLmMKIEdFTlNSQyA9IHNjYW5uZXIuYyBncmFtbWFyLmMgYnBmX2ZpbHRlci5jIHZlcnNpb24uYwogTElCT0JKUyA9IEBMSUJPQkpTQApAQCAtMTA0LDYgKzk5LDkgQEAKIAlwY2FwLW5hbWVkYi5oIFwKIAlwY2FwL2JwZi5oIFwKIAlwY2FwL2JsdWV0b290aC5oIFwKKwlwY2FwL2Nhbl9zb2NrZXRjYW4uaCBcCisJcGNhcC9kbHQuaCBcCisJcGNhcC9leHBvcnQtZGVmcy5oIFwKIAlwY2FwL2lwbmV0LmggXAogCXBjYXAvbmFtZWRiLmggXAogCXBjYXAvbmZsb2cuaCBcCkBAIC0xMTYsMzcgKzExNCw0MyBAQAogCWFyY25ldC5oIFwKIAlhdG11bmkzMS5oIFwKIAlldGhlcnR5cGUuaCBcCisJZXh0cmFjdC5oIFwKIAlnZW5jb2RlLmggXAogCWllZWU4MDIxMS5oIFwKIAlsbGMuaCBcCisJbmFtZXRvYWRkci5oIFwKIAlubHBpZC5oIFwKIAlwY2FwLWNvbW1vbi5oIFwKIAlwY2FwLWludC5oIFwKIAlwY2FwLXN0ZGluYy5oIFwKKwlwb3J0YWJpbGl0eS5oIFwKIAlwcHAuaCBcCiAJc2YtcGNhcC5oIFwKIAlzZi1wY2FwLW5nLmggXAogCXN1bmF0bXBvcy5oCiAKIFRFU1RTID0gXAorCUBWQUxHUklORFRFU1RAIFwKIAljYXB0dXJldGVzdCBcCisJY2FuX3NldF9yZm1vbl90ZXN0IFwKIAlmaWx0ZXJ0ZXN0IFwKIAlmaW5kYWxsZGV2c3Rlc3QgXAogCW9wZW50ZXN0IFwKLQlzZWxwb2xsdGVzdCBcCi0JdmFsZ3JpbmR0ZXN0CisJcmVhY3RpdmF0ZXRlc3QgXAorCXNlbHBvbGx0ZXN0CiAKIFRFU1RTX1NSQyA9IFwKKwl0ZXN0cy92YWxncmluZHRlc3QuYyBcCiAJdGVzdHMvY2FwdHVyZXRlc3QuYyBcCisJdGVzdHMvY2FuX3NldF9yZm1vbl90ZXN0LmMgXAogCXRlc3RzL2ZpbHRlcnRlc3QuYyBcCiAJdGVzdHMvZmluZGFsbGRldnN0ZXN0LmMgXAogCXRlc3RzL29wZW50ZXN0LmMgXAogCXRlc3RzL3JlYWN0aXZhdGV0ZXN0LmMgXAotCXRlc3RzL3NlbHBvbGx0ZXN0LmMgXAotCXRlc3RzL3ZhbGdyaW5kdGVzdC5jCisJdGVzdHMvc2VscG9sbHRlc3QuYwogCiBHRU5IRFIgPSBcCi0Jc2Nhbm5lci5oIHRva2RlZnMuaCB2ZXJzaW9uLmgKKwlzY2FubmVyLmggZ3JhbW1hci5oIHBjYXBfdmVyc2lvbi5oCiAKIFRBR0ZJTEVTID0gXAogCSQoU1JDKSAkKEhEUikKQEAgLTIzMiw2ICsyMzYsOCBAQAogCUNobW9kQlBGL0NobW9kQlBGIFwKIAlDaG1vZEJQRi9TdGFydHVwUGFyYW1ldGVycy5wbGlzdCBcCiAJQ1JFRElUUyBcCisJQ01ha2VMaXN0cy50eHQgXAorCUdlblZlcnNpb24uYmF0IFwKIAlJTlNUQUxMLnR4dCBcCiAJTElDRU5TRSBcCiAJTWFrZWZpbGUuaW4gXApAQCAtMjU0LDI5ICsyNjAsMzcgQEAKIAlhY2xvY2FsLm00IFwKIAlicGYvbmV0L2JwZl9maWx0ZXIuYyBcCiAJY2htb2RfYnBmIFwKKwljbWFrZWNvbmZpZy5oLmluIFwKKwljbWFrZS9wcmVjb25maWd1cmUuY21ha2UgXAorCWNvbmZpZy9oYXZlX3Npb2NnbGlmY29uZi5jIFwKIAljb25maWcuZ3Vlc3MgXAogCWNvbmZpZy5oLmluIFwKIAljb25maWcuc3ViIFwKIAljb25maWd1cmUgXAotCWNvbmZpZ3VyZS5pbiBcCisJY29uZmlndXJlLmFjIFwKIAlkbHBpc3Vicy5jIFwKIAlkbHBpc3Vicy5oIFwKIAlmYWQtZ2V0YWQuYyBcCiAJZmFkLWdpZmMuYyBcCiAJZmFkLWdsaWZjLmMgXAotCWZhZC1udWxsLmMgXAotCWZhZC1zaXRhLmMgXAotCWZhZC13aW4zMi5jIFwKKwlmYWQtaGVscGVycy5jIFwKKwlnZW5fdmVyc2lvbl9jLnNoIFwKKwlnZW5fdmVyc2lvbl9oZWFkZXIuc2ggXAogCWdyYW1tYXIueSBcCiAJaW5zdGFsbC1zaCBcCiAJbGJsL29zLWFpeDQuaCBcCisJbGJsL29zLWFpeDcuaCBcCiAJbGJsL29zLWhwdXgxMS5oIFwKIAlsYmwvb3Mtb3NmNC5oIFwKIAlsYmwvb3Mtb3NmNS5oIFwKIAlsYmwvb3Mtc29sYXJpczIuaCBcCiAJbGJsL29zLXN1bm9zNC5oIFwKIAlsYmwvb3MtdWx0cml4NC5oIFwKKwltaXNzaW5nL2dldG9wdC5jIFwKKwltaXNzaW5nL2dldG9wdC5oIFwKIAltaXNzaW5nL3NucHJpbnRmLmMgXAorCW1pc3Npbmcvc3RydG9rX3IuYyBcCisJbWlzc2luZy93aW5fc25wcmludGYuYyBcCiAJbWtkZXAgXAogCW1zZG9zL2JpbjJjLmMgXAogCW1zZG9zL2NvbW1vbi5kaiBcCkBAIC0yOTcsMTAgKzMxMSw2IEBACiAJcGNhcC1idC1saW51eC5oIFwKIAlwY2FwLWJ0LW1vbml0b3ItbGludXguYyBcCiAJcGNhcC1idC1tb25pdG9yLWxpbnV4LmggXAotCXBjYXAtY2FuLWxpbnV4LmMgXAotCXBjYXAtY2FuLWxpbnV4LmggXAotCXBjYXAtY2FudXNiLWxpbnV4LmMgXAotCXBjYXAtY2FudXNiLWxpbnV4LmggXAogCXBjYXAtY29uZmlnLmluIFwKIAlwY2FwLWRhZy5jIFwKIAlwY2FwLWRhZy5oIFwKQEAgLTMxNCwxMSArMzI0LDE0IEBACiAJcGNhcC1saWJkbHBpLmMgXAogCXBjYXAtbGludXguYyBcCiAJcGNhcC1uYW1lZGIuaCBcCisJcGNhcC1uZXcuYyBcCiAJcGNhcC1uZXRmaWx0ZXItbGludXguYyBcCiAJcGNhcC1uZXRmaWx0ZXItbGludXguaCBcCiAJcGNhcC1uaXQuYyBcCiAJcGNhcC1udWxsLmMgXAogCXBjYXAtcGYuYyBcCisJcGNhcC1ycGNhcC5jIFwKKwlwY2FwLXJwY2FwLmggXAogCXBjYXAtc2VwdGVsLmMgXAogCXBjYXAtc2VwdGVsLmggXAogCXBjYXAtc2l0YS5oIFwKQEAgLTMyOCwzNSArMzQxLDIyIEBACiAJcGNhcC1zbmYuaCBcCiAJcGNhcC1zbml0LmMgXAogCXBjYXAtc25vb3AuYyBcCisJcGNhcC10Yy5jIFwKKwlwY2FwLXRjLmggXAogCXBjYXAtdXNiLWxpbnV4LmMgXAogCXBjYXAtdXNiLWxpbnV4LmggXAogCXBjYXAtd2luMzIuYyBcCi0JcnVubGV4LnNoIFwKLQlzY2FubmVyLmMudG9wIFwKKwlyZW1vdGUtZXh0LmggXAorCXNvY2t1dGlscy5jIFwKKwlzb2NrdXRpbHMuaCBcCiAJc2Nhbm5lci5sIFwKKwl0ZXN0cy9DTWFrZUxpc3RzLnR4dCBcCisJcGNhcF92ZXJzaW9uLmguaW4gXAogCVdpbjMyL0luY2x1ZGUvR251Yy5oIFwKLQlXaW4zMi9JbmNsdWRlL2FkZHJpbmZvLmggXAotCVdpbjMyL0luY2x1ZGUvYml0dHlwZXMuaCBcCi0JV2luMzIvSW5jbHVkZS9jZGVjbF9leHQuaCBcCi0JV2luMzIvSW5jbHVkZS9pbmV0cHJpdmF0ZS5oIFwKLQlXaW4zMi9JbmNsdWRlL2lwNl9taXNjLmggXAotCVdpbjMyL0luY2x1ZGUvc29ja3N0b3JhZ2UuaCBcCi0JV2luMzIvSW5jbHVkZS9hcnBhL25hbWVzZXIuaCBcCiAJV2luMzIvSW5jbHVkZS9uZXQvaWYuaCBcCi0JV2luMzIvSW5jbHVkZS9uZXQvbmV0ZGIuaCBcCi0JV2luMzIvSW5jbHVkZS9uZXQvcGF0aHMuaCBcCi0JV2luMzIvUHJqL2xpYnBjYXAuZHNwIFwKLQlXaW4zMi9QcmovbGlicGNhcC5kc3cgXAotCVdpbjMyL1NyYy9mZnMuYyBcCi0JV2luMzIvU3JjL2dhaV9zdHJlcnJvci5jIFwKLQlXaW4zMi9TcmMvZ2V0YWRkcmluZm8uYyBcCi0JV2luMzIvU3JjL2dldG5ldGJ5bm0uYyBcCi0JV2luMzIvU3JjL2dldG5ldGVudC5jIFwKLQlXaW4zMi9TcmMvZ2V0b3B0LmMgXAotCVdpbjMyL1NyYy9nZXRzZXJ2ZW50LmMgXAotCVdpbjMyL1NyYy9pbmV0X2F0b24uYyBcCi0JV2luMzIvU3JjL2luZXRfbmV0LmMgXAotCVdpbjMyL1NyYy9pbmV0X3B0b24uYworCVdpbjMyL1Byai93cGNhcC5zbG4gXAorCVdpbjMyL1Byai93cGNhcC52Y3hwcm9qIFwKKwlXaW4zMi9Qcmovd3BjYXAudmN4cHJvai5maWx0ZXJzCiAKIGFsbDogbGlicGNhcC5hIHNoYXJlZCBwY2FwLWNvbmZpZwogCkBAIC00NDQsMjcgKzQ0NCwzMyBAQAogbGlicGNhcC5ub25lOgogCiBzY2FubmVyLmM6ICQoc3JjZGlyKS9zY2FubmVyLmwKLQlAcm0gLWYgJEAgJEAuYm90dG9tCi0JJChzcmNkaXIpL3J1bmxleC5zaCAkKExFWCkgLW8kQCAkPAotCW12ICRAICRALmJvdHRvbQotCWNhdCAkKHNyY2RpcikvJEAudG9wICRALmJvdHRvbSA+ICRACi0JQHJtICRALmJvdHRvbQorCSQoTEVYKSAtUCBwY2FwXyAtLWhlYWRlci1maWxlPXNjYW5uZXIuaCAtLW5vdW5wdXQgLW8gc2Nhbm5lci5jICQ8CitzY2FubmVyLmg6IHNjYW5uZXIuYworIyMgUmVjb3ZlciBmcm9tIHRoZSByZW1vdmFsIG9mICRACisJQGlmIHRlc3QgLWYgJEA7IHRoZW4gOjsgZWxzZSBcCisJCXJtIC1mIHNjYW5uZXIuYzsgXAorCQkkKE1BS0UpICQoTUFLRUZMQUdTKSBzY2FubmVyLmM7IFwKKwlmaQogCi1zY2FubmVyLm86IHNjYW5uZXIuYyB0b2tkZWZzLmgKK3NjYW5uZXIubzogc2Nhbm5lci5jIGdyYW1tYXIuaAogCSQoQ0MpICQoRlVMTF9DRkxBR1MpIC1jIHNjYW5uZXIuYwogCi1wY2FwLm86IHZlcnNpb24uaAorcGNhcC5vOiBwY2FwX3ZlcnNpb24uaAogCi10b2tkZWZzLmg6IGdyYW1tYXIuYwogZ3JhbW1hci5jOiAkKHNyY2RpcikvZ3JhbW1hci55Ci0JQHJtIC1mIGdyYW1tYXIuYyB0b2tkZWZzLmgKLQkkKFlBQ0MpIC1kICQ8Ci0JbXYgeS50YWIuYyBncmFtbWFyLmMKLQltdiB5LnRhYi5oIHRva2RlZnMuaAorCSQoWUFDQykgLXAgcGNhcF8gLW8gZ3JhbW1hci5jIC1kICQ8CitncmFtbWFyLmg6IGdyYW1tYXIuYworIyMgUmVjb3ZlciBmcm9tIHRoZSByZW1vdmFsIG9mICRACisJQGlmIHRlc3QgLWYgJEA7IHRoZW4gOjsgZWxzZSBcCisJCXJtIC1mIGdyYW1tYXIuYzsgXAorCQkkKE1BS0UpICQoTUFLRUZMQUdTKSBncmFtbWFyLmM7IFwKKwlmaQogCiBncmFtbWFyLm86IGdyYW1tYXIuYwotCUBybSAtZiAkQAotCSQoQ0MpICQoRlVMTF9DRkxBR1MpIC1EeXlsdmFsPXBjYXBfbHZhbCAtYyBncmFtbWFyLmMKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtYyBncmFtbWFyLmMKKworZ2VuY29kZS5vOiAkKHNyY2RpcikvZ2VuY29kZS5jIGdyYW1tYXIuaCBzY2FubmVyLmgKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvZ2VuY29kZS5jCiAKIHZlcnNpb24ubzogdmVyc2lvbi5jCiAJJChDQykgJChGVUxMX0NGTEFHUykgLWMgdmVyc2lvbi5jCkBAIC00NzIsMzIgKzQ3OCwyMSBAQAogc25wcmludGYubzogJChzcmNkaXIpL21pc3Npbmcvc25wcmludGYuYwogCSQoQ0MpICQoRlVMTF9DRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9taXNzaW5nL3NucHJpbnRmLmMKIAotdmVyc2lvbi5jOiAkKHNyY2RpcikvVkVSU0lPTgotCUBybSAtZiAkQAotCWlmIGdyZXAgR0lUICR7c3JjZGlyfS9WRVJTSU9OID4vZGV2L251bGw7IHRoZW4gXAotCQlyZWFkIHZlciA8JHtzcmNkaXJ9L1ZFUlNJT047IFwKLQkJZWNobyAkJHZlciB8IHRyIC1kICdcMDEyJzsgXAotCQlkYXRlICtfJVlfJW1fJWQ7IFwKLQllbHNlIFwKLQkJY2F0ICR7c3JjZGlyfS9WRVJTSU9OOyBcCi0JZmkgfCBzZWQgLWUgJ3MvLiovY2hhciBwY2FwX3ZlcnNpb25bXSA9ICImIjsvJyA+ICRACitzdHJ0b2tfci5vOiAkKHNyY2RpcikvbWlzc2luZy9zdHJ0b2tfci5jCisJJChDQykgJChGVUxMX0NGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21pc3Npbmcvc3RydG9rX3IuYwogCi0jCi0jIE5PVEU6IHRoaXMgcmVhbGx5IGlzIHN1cHBvc2VkIHRvIGJlIHN0YXRpYzsgaW1wb3J0aW5nIGEgc3RyaW5nCi0jIGZyb20gYSBzaGFyZWQgbGlicmFyeSBkb2VzIG5vdCB3b3JrIHZlcnkgd2VsbCBvbiBtYW55Ci0jIHZlcnNpb25zIG9mIFVOSVggKFNvbGFyaXMsIExpbnV4LCBhbmQgdGhlIEJTRHMsIGZvciBleGFtcGxlKSwKLSMgc28gd2UgbWFrZSB0aGUgdmVyc2lvbiBzdHJpbmcgc3RhdGljIGFuZCByZXR1cm4gaXQgZnJvbQotIyBhIGZ1bmN0aW9uLCB3aGljaCBkb2VzIHdvcmsuCi0jCi12ZXJzaW9uLmg6ICQoc3JjZGlyKS9WRVJTSU9OCit2ZXJzaW9uLmM6ICQoc3JjZGlyKS9WRVJTSU9OICQoc3JjZGlyKS9nZW5fdmVyc2lvbl9jLnNoCisJIworCSMgT2xkZXIgcHJvZ3JhbXMgaW1wb3J0IHRoaXMgaWYgdGhleSB3YW50IHRvIHNob3cgdGhlCisJIyBsaWJwY2FwIHZlcnNpb24gbnVtYmVyLCByYXRoZXIgdGhhbiBjYWxsaW5nCisJIyBwY2FwX2xpYl92ZXJzaW9uKCksIHNvIHdlIG5lZWQgdG8gZXhwb3J0IGl0LgorCSMKIAlAcm0gLWYgJEAKLQlpZiBncmVwIEdJVCAke3NyY2Rpcn0vVkVSU0lPTiA+L2Rldi9udWxsOyB0aGVuIFwKLQkJcmVhZCB2ZXIgPCR7c3JjZGlyfS9WRVJTSU9OOyBcCi0JCWVjaG8gJCR2ZXIgfCB0ciAtZCAnXDAxMic7IFwKLQkJZGF0ZSArXyVZXyVtXyVkOyBcCi0JZWxzZSBcCi0JCWNhdCAke3NyY2Rpcn0vVkVSU0lPTjsgXAotCWZpIHwgc2VkIC1lICdzLy4qL3N0YXRpYyBjb25zdCBjaGFyIHBjYXBfdmVyc2lvbl9zdHJpbmdbXSA9ICJsaWJwY2FwIHZlcnNpb24gJiI7LycgPiAkQAorCSQoc3JjZGlyKS9nZW5fdmVyc2lvbl9jLnNoICQoc3JjZGlyKS9WRVJTSU9OICRACisKK3BjYXBfdmVyc2lvbi5oOiAkKHNyY2RpcikvVkVSU0lPTiAkKHNyY2RpcikvcGNhcF92ZXJzaW9uLmguaW4gJChzcmNkaXIpL2dlbl92ZXJzaW9uX2hlYWRlci5zaAorCUBybSAtZiAkQAorCSQoc3JjZGlyKS9nZW5fdmVyc2lvbl9oZWFkZXIuc2ggJChzcmNkaXIpL1ZFUlNJT04gJChzcmNkaXIpL3BjYXBfdmVyc2lvbi5oLmluICRACiAKIGJwZl9maWx0ZXIuYzogJChzcmNkaXIpL2JwZi9uZXQvYnBmX2ZpbHRlci5jCiAJcm0gLWYgYnBmX2ZpbHRlci5jCkBAIC01MzQsNiArNTI5LDkgQEAKIGNhcHR1cmV0ZXN0OiB0ZXN0cy9jYXB0dXJldGVzdC5jIGxpYnBjYXAuYQogCSQoQ0MpICQoRlVMTF9DRkxBR1MpIC1JLiAtTC4gLW8gY2FwdHVyZXRlc3QgJChzcmNkaXIpL3Rlc3RzL2NhcHR1cmV0ZXN0LmMgbGlicGNhcC5hICQoTElCUykKIAorY2FuX3NldF9yZm1vbl90ZXN0OiB0ZXN0cy9jYW5fc2V0X3JmbW9uX3Rlc3QuYyBsaWJwY2FwLmEKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtSS4gLUwuIC1vIGNhbl9zZXRfcmZtb25fdGVzdCAkKHNyY2RpcikvdGVzdHMvY2FuX3NldF9yZm1vbl90ZXN0LmMgbGlicGNhcC5hICQoTElCUykKKwogZmlsdGVydGVzdDogdGVzdHMvZmlsdGVydGVzdC5jIGxpYnBjYXAuYQogCSQoQ0MpICQoRlVMTF9DRkxBR1MpIC1JLiAtTC4gLW8gZmlsdGVydGVzdCAkKHNyY2RpcikvdGVzdHMvZmlsdGVydGVzdC5jIGxpYnBjYXAuYSAkKExJQlMpCiAKQEAgLTU0Myw2ICs1NDEsOSBAQAogb3BlbnRlc3Q6IHRlc3RzL29wZW50ZXN0LmMgbGlicGNhcC5hCiAJJChDQykgJChGVUxMX0NGTEFHUykgLUkuIC1MLiAtbyBvcGVudGVzdCAkKHNyY2RpcikvdGVzdHMvb3BlbnRlc3QuYyBsaWJwY2FwLmEgJChMSUJTKQogCityZWFjdGl2YXRldGVzdDogdGVzdHMvcmVhY3RpdmF0ZXRlc3QuYyBsaWJwY2FwLmEKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtSS4gLUwuIC1vIHJlYWN0aXZhdGV0ZXN0ICQoc3JjZGlyKS90ZXN0cy9yZWFjdGl2YXRldGVzdC5jIGxpYnBjYXAuYSAkKExJQlMpCisKIHNlbHBvbGx0ZXN0OiB0ZXN0cy9zZWxwb2xsdGVzdC5jIGxpYnBjYXAuYQogCSQoQ0MpICQoRlVMTF9DRkxBR1MpIC1JLiAtTC4gLW8gc2VscG9sbHRlc3QgJChzcmNkaXIpL3Rlc3RzL3NlbHBvbGx0ZXN0LmMgbGlicGNhcC5hICQoTElCUykKIApAQCAtNzMyLDYgKzczMyw5IEBACiAJcm0gLWYgJChNQU4zUENBUF9FWFBBTkQ6LmluPSkgJChNQU5GSUxFOi5pbj0pICQoTUFOTUlTQzouaW49KQogCXJtIC1yZiBhdXRvbTR0ZS5jYWNoZQogCitleHRhZ3M6ICQoVEFHRklMRVMpCisJY3RhZ3MgJChUQUdGSUxFUykKKwogdGFnczogJChUQUdGSUxFUykKIAljdGFncyAtd3RkICQoVEFHRklMRVMpCiAKZGlmZiAtLWdpdCBhL1JFQURNRS5zaXRhIGIvUkVBRE1FLnNpdGEKaW5kZXggZWU3YTQyNi4uMDE0ZDUxZCAxMDA2NDQKLS0tIGEvUkVBRE1FLnNpdGEKKysrIGIvUkVBRE1FLnNpdGEKQEAgLTEyLDcgKzEyLDcgQEAKIGNhcHR1cmUgcGFja2V0cyBmcm9tIGEgU0lUQSBBQ04gZGV2aWNlIChhbmQgcG90ZW50aWFsbHkgb3RoZXJzKS4KIAogVG8gZW5hYmxlIGl0cyBzdXBwb3J0IHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBkaXN0cmlidXRpb24gaGFzCi1hIGNvcnJlY3QgY29uZmlndXJlLmluIGZpbGU7IHRoYXQgY2FuIGJlIGNyZWF0ZWQgaWYgbmVjY2Vzc2F5IGJ5CithIGNvcnJlY3QgY29uZmlndXJlLmFjIGZpbGU7IHRoYXQgY2FuIGJlIGNyZWF0ZWQgaWYgbmVjY2Vzc2F5IGJ5CiB1c2luZyB0aGUgbm9ybWFsIGF1dG9jb25mIHByb2NlZHVyZSBvZjoKIAogYWNsb2NhbApkaWZmIC0tZ2l0IGEvUkVBRE1FLnZlcnNpb24gYi9SRUFETUUudmVyc2lvbgppbmRleCA4Zjk2MDhlLi4yNTYwNjNlIDEwMDY0NAotLS0gYS9SRUFETUUudmVyc2lvbgorKysgYi9SRUFETUUudmVyc2lvbgpAQCAtMSwyICsxLDIgQEAKLVVSTDogaHR0cDovL3d3dy50Y3BkdW1wLm9yZy9yZWxlYXNlL2xpYnBjYXAtMS43LjQudGFyLmd6Ci1WZXJzaW9uOiAxLjcuNAorVVJMOiBodHRwOi8vd3d3LnRjcGR1bXAub3JnL3JlbGVhc2UvbGlicGNhcC0xLjguMS50YXIuZ3oKK1ZlcnNpb246IDEuOC4xCmRpZmYgLS1naXQgYS9WRVJTSU9OIGIvVkVSU0lPTgppbmRleCAxMGMwODgwLi5hOGZkZmRhIDEwMDY0NAotLS0gYS9WRVJTSU9OCisrKyBiL1ZFUlNJT04KQEAgLTEgKzEgQEAKLTEuNy40CisxLjguMQpkaWZmIC0tZ2l0IGEvV2luMzIvSW5jbHVkZS9HbnVjLmggYi9XaW4zMi9JbmNsdWRlL0dudWMuaAppbmRleCBhYTQ5NTk4Li5lMWI1OTUxIDEwMDY0NAotLS0gYS9XaW4zMi9JbmNsdWRlL0dudWMuaAorKysgYi9XaW4zMi9JbmNsdWRlL0dudWMuaApAQCAtMSwxMyArMSwzIEBACi0vKiBEZWZpbmUgX19QKCkgbWFjcm8sIGlmIG5lY2Vzc2FyeSAqLwotCi0jaWZuZGVmIF9fUAotI2lmIF9fU1REQ19fCi0jZGVmaW5lIF9fUChwcm90b3MpIHByb3RvcwotI2Vsc2UKLSNkZWZpbmUgX19QKHByb3RvcykgKCkKLSNlbmRpZgotI2VuZGlmCi0KIC8qIGlubGluZSBmb28gKi8KICNpZm5kZWYgX19jcGx1c3BsdXMKICNpZmRlZiBfX0dOVUNfXwpAQCAtMTYsMjkgKzYsMyBAQAogI2RlZmluZSBpbmxpbmUKICNlbmRpZgogI2VuZGlmCi0KLS8qCi0gKiBIYW5kbGUgbmV3IGFuZCBvbGQgImRlYWQiIHJvdXRpbmUgcHJvdG90eXBlcwotICoKLSAqIEZvciBleGFtcGxlOgotICoKLSAqCV9fZGVhZCB2b2lkIGZvbyh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh2b2xhdGlsZSkpOwotICoKLSAqLwotI2lmZGVmIF9fR05VQ19fCi0jaWZuZGVmIF9fZGVhZAotI2RlZmluZSBfX2RlYWQgdm9sYXRpbGUKLSNlbmRpZgotI2lmIF9fR05VQ19fIDwgMiAgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA1KQotI2lmbmRlZiBfX2F0dHJpYnV0ZV9fCi0jZGVmaW5lIF9fYXR0cmlidXRlX18oYXJncykKLSNlbmRpZgotI2VuZGlmCi0jZWxzZQotI2lmbmRlZiBfX2RlYWQKLSNkZWZpbmUgX19kZWFkCi0jZW5kaWYKLSNpZm5kZWYgX19hdHRyaWJ1dGVfXwotI2RlZmluZSBfX2F0dHJpYnV0ZV9fKGFyZ3MpCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvV2luMzIvSW5jbHVkZS9hZGRyaW5mby5oIGIvV2luMzIvSW5jbHVkZS9hZGRyaW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzRmY2NlLi4wMDAwMDAwCi0tLSBhL1dpbjMyL0luY2x1ZGUvYWRkcmluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCBhbmQgMTk5OSBXSURFIFByb2plY3QuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIEhBVkVfQUREUklORk8KLQotLyoKLSAqIEVycm9yIHJldHVybiBjb2RlcyBmcm9tIGdldGFkZHJpbmZvKCkKLSAqLwotI2RlZmluZQlFQUlfQUREUkZBTUlMWQkgMQkvKiBhZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZQlFQUlfQUdBSU4JIDIJLyogdGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uICovCi0jZGVmaW5lCUVBSV9CQURGTEFHUwkgMwkvKiBpbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyAqLwotI2RlZmluZQlFQUlfRkFJTAkgNAkvKiBub24tcmVjb3ZlcmFibGUgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24gKi8KLSNkZWZpbmUJRUFJX0ZBTUlMWQkgNQkvKiBhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZQlFQUlfTUVNT1JZCSA2CS8qIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KLSNkZWZpbmUJRUFJX05PREFUQQkgNwkvKiBubyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBob3N0bmFtZSAqLwotI2RlZmluZQlFQUlfTk9OQU1FCSA4CS8qIGhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duICovCi0jZGVmaW5lCUVBSV9TRVJWSUNFCSA5CS8qIHNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlICovCi0jZGVmaW5lCUVBSV9TT0NLVFlQRQkxMAkvKiBhaV9zb2NrdHlwZSBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lCUVBSV9TWVNURU0JMTEJLyogc3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vICovCi0jZGVmaW5lIEVBSV9CQURISU5UUwkxMgotI2RlZmluZSBFQUlfUFJPVE9DT0wJMTMKLSNkZWZpbmUgRUFJX01BWAkJMTQKLQotLyogaW50ZXJuYWwgZXJyb3IgKi8KLSNkZWZpbmUJTkVUREJfSU5URVJOQUwJLTEJLyogc2VlIGVycm5vICovCi0KLS8qCi0gKiBGbGFnIHZhbHVlcyBmb3IgZ2V0YWRkcmluZm8oKQotICovCi0jZGVmaW5lCUFJX1BBU1NJVkUJMHgwMDAwMDAwMSAvKiBnZXQgYWRkcmVzcyB0byB1c2UgYmluZCgpICovCi0jZGVmaW5lCUFJX0NBTk9OTkFNRQkweDAwMDAwMDAyIC8qIGZpbGwgYWlfY2Fub25uYW1lICovCi0jZGVmaW5lCUFJX05VTUVSSUNIT1NUCTB4MDAwMDAwMDQgLyogcHJldmVudCBuYW1lIHJlc29sdXRpb24gKi8KLS8qIHZhbGlkIGZsYWdzIGZvciBhZGRyaW5mbyAqLwotI2RlZmluZQlBSV9NQVNLCQkoQUlfUEFTU0lWRSB8IEFJX0NBTk9OTkFNRSB8IEFJX05VTUVSSUNIT1NUKQotCi0jZGVmaW5lCUFJX0FMTAkJMHgwMDAwMDEwMCAvKiBJUHY2IGFuZCBJUHY0LW1hcHBlZCAod2l0aCBBSV9WNE1BUFBFRCkgKi8KLSNkZWZpbmUJQUlfVjRNQVBQRURfQ0ZHCTB4MDAwMDAyMDAgLyogYWNjZXB0IElQdjQtbWFwcGVkIGlmIGtlcm5lbCBzdXBwb3J0cyAqLwotI2RlZmluZQlBSV9BRERSQ09ORklHCTB4MDAwMDA0MDAgLyogb25seSBpZiBhbnkgYWRkcmVzcyBpcyBhc3NpZ25lZCAqLwotI2RlZmluZQlBSV9WNE1BUFBFRAkweDAwMDAwODAwIC8qIGFjY2VwdCBJUHY0LW1hcHBlZCBJUHY2IGFkZHJlc3MgKi8KLS8qIHNwZWNpYWwgcmVjb21tZW5kZWQgZmxhZ3MgZm9yIGdldGlwbm9kZWJ5bmFtZSAqLwotI2RlZmluZQlBSV9ERUZBVUxUCShBSV9WNE1BUFBFRF9DRkcgfCBBSV9BRERSQ09ORklHKQotCi1zdHJ1Y3QgYWRkcmluZm8gewotCWludAlhaV9mbGFnczsJLyogQUlfUEFTU0lWRSwgQUlfQ0FOT05OQU1FICovCi0JaW50CWFpX2ZhbWlseTsJLyogUEZfeHh4ICovCi0JaW50CWFpX3NvY2t0eXBlOwkvKiBTT0NLX3h4eCAqLwotCWludAlhaV9wcm90b2NvbDsJLyogMCBvciBJUFBST1RPX3h4eCBmb3IgSVB2NCBhbmQgSVB2NiAqLwotCXNpemVfdAlhaV9hZGRybGVuOwkvKiBsZW5ndGggb2YgYWlfYWRkciAqLwotCWNoYXIJKmFpX2Nhbm9ubmFtZTsJLyogY2Fub25pY2FsIG5hbWUgZm9yIGhvc3RuYW1lICovCi0Jc3RydWN0IHNvY2thZGRyICphaV9hZGRyOwkvKiBiaW5hcnkgYWRkcmVzcyAqLwotCXN0cnVjdCBhZGRyaW5mbyAqYWlfbmV4dDsJLyogbmV4dCBzdHJ1Y3R1cmUgaW4gbGlua2VkIGxpc3QgKi8KLX07Ci0KLWV4dGVybiB2b2lkIGZyZWVhZGRyaW5mbyAoc3RydWN0IGFkZHJpbmZvICopOwotZXh0ZXJuIHZvaWQgZnJlZWhvc3RlbnQgKHN0cnVjdCBob3N0ZW50ICopOwotZXh0ZXJuIGNoYXIgKmdhaV9zdHJlcnJvciAoaW50KTsKLWV4dGVybiBpbnQgZ2V0YWRkcmluZm8gKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkJICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBzdHJ1Y3QgYWRkcmluZm8gKiopOwotZXh0ZXJuIGludCBnZXRuYW1laW5mbyAoY29uc3Qgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwgY2hhciAqLAotCQkJICAgIHNpemVfdCwgY2hhciAqLCBzaXplX3QsIGludCk7Ci1leHRlcm4gc3RydWN0IGhvc3RlbnQgKmdldGlwbm9kZWJ5YWRkciAoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCwgaW50ICopOwotZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpnZXRpcG5vZGVieW5hbWUgKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCAqKTsKLWV4dGVybiBpbnQgaW5ldF9wdG9uIChpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKLWV4dGVybiBjb25zdCBjaGFyICppbmV0X250b3AgKGludCwgY29uc3Qgdm9pZCAqLCBjaGFyICosIHNpemVfdCk7Ci0jZWxzZQotCi0jaWZuZGVmIEVBSV9CQURISU5UUwotI2RlZmluZSBFQUlfQkFESElOVFMJMTIKLSNlbmRpZgotCi0jaWZuZGVmIEVBSV9QUk9UT0NPTAotI2RlZmluZSBFQUlfUFJPVE9DT0wJMTMKLSNlbmRpZgotCi0jaWZuZGVmIEVBSV9NQVgKLSNkZWZpbmUgRUFJX01BWAkJMTQKLSNlbmRpZgotCi0jaWZuZGVmIE5FVERCX0lOVEVSTkFMCi0jZGVmaW5lCU5FVERCX0lOVEVSTkFMCS0xCS8qIHNlZSBlcnJubyAqLwotI2VuZGlmCi0KLSNpZm5kZWYgQUlfTUFTSwotLyogdmFsaWQgZmxhZ3MgZm9yIGFkZHJpbmZvICovCi0jZGVmaW5lCUFJX01BU0sJCShBSV9QQVNTSVZFIHwgQUlfQ0FOT05OQU1FIHwgQUlfTlVNRVJJQ0hPU1QpCi0jZW5kaWYKLQotI2VuZGlmIC8qIEhBVkVfQUREUklORk8gKi8KLQotLyoKLSAqIENvbnN0YW50cyBmb3IgZ2V0bmFtZWluZm8oKQotICovCi0jaWZuZGVmIE5JX01BWEhPU1QKLSNkZWZpbmUJTklfTUFYSE9TVAkxMDI1Ci0jZW5kaWYKLSNpZm5kZWYgTklfTUFYU0VSVgotI2RlZmluZQlOSV9NQVhTRVJWCTMyCi0jZW5kaWYKLQotLyoKLSAqIEZsYWcgdmFsdWVzIGZvciBnZXRuYW1laW5mbygpCi0gKi8KLSNpZm5kZWYgTklfTk9GUUROCi0jZGVmaW5lCU5JX05PRlFETgkweDAwMDAwMDAxCi0jZW5kaWYKLSNpZm5kZWYgTklfTlVNRVJJQ0hPU1QKLSNkZWZpbmUJTklfTlVNRVJJQ0hPU1QJMHgwMDAwMDAwMgotI2VuZGlmCi0jaWZuZGVmIE5JX05BTUVSRVFECi0jZGVmaW5lCU5JX05BTUVSRVFECTB4MDAwMDAwMDQKLSNlbmRpZgotI2lmbmRlZiBOSV9OVU1FUklDU0VSVgotI2RlZmluZQlOSV9OVU1FUklDU0VSVgkweDAwMDAwMDA4Ci0jZW5kaWYKLSNpZm5kZWYgTklfREdSQU0KLSNkZWZpbmUJTklfREdSQU0JMHgwMDAwMDAxMAotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL1dpbjMyL0luY2x1ZGUvYXJwYS9uYW1lc2VyLmggYi9XaW4zMi9JbmNsdWRlL2FycGEvbmFtZXNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjBkYzFlLi4wMDAwMDAwCi0tLSBhL1dpbjMyL0luY2x1ZGUvYXJwYS9uYW1lc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoKLSAqICsrQ29weXJpZ2h0KysgMTk4MywgMTk4OSwgMTk5MwotICogLQotICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTg5LCAxOTkzCi0gKiAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqIAlDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiAtCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTMgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLCBhbmQgdGhhdAotICogdGhlIG5hbWUgb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZG9jdW1lbnQgb3Igc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgRElHSVRBTCBFUVVJUE1FTlQgQ09SUC4gRElTQ0xBSU1TIEFMTAotICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiAgIElOIE5PIEVWRU5UIFNIQUxMIERJR0lUQUwgRVFVSVBNRU5UCi0gKiBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKLSAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCi0gKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLgotICogLQotICogLS1Db3B5cmlnaHQtLQotICovCi0KLS8qCi0gKiAgICAgIEAoIyluYW1lc2VyLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCi0gKgluYW1lc2VyLmgsdiAxLjIgMTk5NS8wNS8wNiAxNDoyMzo1NCBoamwgRXhwCi0gKi8KLQotI2lmbmRlZiBfTkFNRVNFUl9IXwotI2RlZmluZQlfTkFNRVNFUl9IXwotCi0jaWZuZGVmIFdJTjMyCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaWYgKCFkZWZpbmVkKEJTRCkpIHx8IChCU0QgPCAxOTkzMDYpCi0jIGluY2x1ZGUgPHN5cy9iaXR5cGVzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgotI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4gMQotI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCi0jZW5kaWYKLQotLyoKLSAqIHJldmlzaW9uIGluZm9ybWF0aW9uLiAgdGhpcyBpcyB0aGUgcmVsZWFzZSBkYXRlIGluIFlZWVlNTUREIGZvcm1hdC4KLSAqIGl0IGNhbiBjaGFuZ2UgZXZlcnkgZGF5IHNvIHRoZSByaWdodCB0aGluZyB0byBkbyB3aXRoIGl0IGlzIHVzZSBpdAotICogaW4gcHJlcHJvY2Vzc29yIGNvbW1hbmRzIHN1Y2ggYXMgIiNpZiAoX19CSU5EID4gMTk5MzExMDQpIi4gIGRvIG5vdAotICogY29tcGFyZSBmb3IgZXF1YWxpdHk7IHJhdGhlciwgdXNlIGl0IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdXIgcmVzb2x2ZXIKLSAqIGlzIG5ldyBlbm91Z2ggdG8gY29udGFpbiBhIGNlcnRhaW4gZmVhdHVyZS4KLSAqLwotCi0jZGVmaW5lCV9fQklORAkJMTk5NDA0MTcJLyogaW50ZXJmYWNlIHZlcnNpb24gc3RhbXAgKi8KLQotLyoKLSAqIERlZmluZSBjb25zdGFudHMgYmFzZWQgb24gcmZjODgzCi0gKi8KLSNkZWZpbmUgUEFDS0VUU1oJNTEyCQkvKiBtYXhpbXVtIHBhY2tldCBzaXplICovCi0jZGVmaW5lIE1BWEROQU1FCTI1NgkJLyogbWF4aW11bSBkb21haW4gbmFtZSAqLwotI2RlZmluZSBNQVhDRE5BTUUJMjU1CQkvKiBtYXhpbXVtIGNvbXByZXNzZWQgZG9tYWluIG5hbWUgKi8KLSNkZWZpbmUgTUFYTEFCRUwJNjMJCS8qIG1heGltdW0gbGVuZ3RoIG9mIGRvbWFpbiBsYWJlbCAqLwotI2RlZmluZQlIRklYRURTWgkxMgkJLyogIy9ieXRlcyBvZiBmaXhlZCBkYXRhIGluIGhlYWRlciAqLwotI2RlZmluZSBRRklYRURTWgk0CQkvKiAjL2J5dGVzIG9mIGZpeGVkIGRhdGEgaW4gcXVlcnkgKi8KLSNkZWZpbmUgUlJGSVhFRFNaCTEwCQkvKiAjL2J5dGVzIG9mIGZpeGVkIGRhdGEgaW4gciByZWNvcmQgKi8KLSNkZWZpbmUJSU5UMzJTWgkJNAkJLyogZm9yIHN5c3RlbXMgd2l0aG91dCAzMi1iaXQgaW50cyAqLwotI2RlZmluZQlJTlQxNlNaCQkyCQkvKiBmb3Igc3lzdGVtcyB3aXRob3V0IDE2LWJpdCBpbnRzICovCi0jZGVmaW5lCUlOQUREUlNaCTQJCS8qIGZvciBzaXplb2Yoc3RydWN0IGluYWRkcikgIT0gNCAqLwotCi0vKgotICogSW50ZXJuZXQgbmFtZXNlcnZlciBwb3J0IG51bWJlcgotICovCi0jZGVmaW5lIE5BTUVTRVJWRVJfUE9SVAk1MwotCi0vKgotICogQ3VycmVudGx5IGRlZmluZWQgb3Bjb2RlcwotICovCi0jZGVmaW5lIFFVRVJZCQkweDAJCS8qIHN0YW5kYXJkIHF1ZXJ5ICovCi0jZGVmaW5lIElRVUVSWQkJMHgxCQkvKiBpbnZlcnNlIHF1ZXJ5ICovCi0jZGVmaW5lIFNUQVRVUwkJMHgyCQkvKiBuYW1lc2VydmVyIHN0YXR1cyBxdWVyeSAqLwotLyojZGVmaW5lIHh4eAkJMHgzCQkqLy8qIDB4MyByZXNlcnZlZCAqLwotI2RlZmluZQlOU19OT1RJRllfT1AJMHg0CQkvKiBub3RpZnkgc2Vjb25kYXJ5IG9mIFNPQSBjaGFuZ2UgKi8KLSNpZmRlZiBBTExPV19VUERBVEVTCi0JLyogbm9uIHN0YW5kYXJkIC0gc3VwcG9ydHMgQUxMT1dfVVBEQVRFUyBzdHVmZiBmcm9tIE1pa2UgU2Nod2FydHogKi8KLSMgZGVmaW5lIFVQREFURUEJMHg5CQkvKiBhZGQgcmVzb3VyY2UgcmVjb3JkICovCi0jIGRlZmluZSBVUERBVEVECTB4YQkJLyogZGVsZXRlIGEgc3BlY2lmaWMgcmVzb3VyY2UgcmVjb3JkICovCi0jIGRlZmluZSBVUERBVEVEQQkweGIJCS8qIGRlbGV0ZSBhbGwgbmFtZWQgcmVzb3VyY2UgcmVjb3JkICovCi0jIGRlZmluZSBVUERBVEVNCTB4YwkJLyogbW9kaWZ5IGEgc3BlY2lmaWMgcmVzb3VyY2UgcmVjb3JkICovCi0jIGRlZmluZSBVUERBVEVNQQkweGQJCS8qIG1vZGlmeSBhbGwgbmFtZWQgcmVzb3VyY2UgcmVjb3JkICovCi0jIGRlZmluZSBaT05FSU5JVAkweGUJCS8qIGluaXRpYWwgem9uZSB0cmFuc2ZlciAqLwotIyBkZWZpbmUgWk9ORVJFRgkweGYJCS8qIGluY3JlbWVudGFsIHpvbmUgcmVmZXJlc2ggKi8KLSNlbmRpZgotCi0vKgotICogQ3VycmVudGx5IGRlZmluZWQgcmVzcG9uc2UgY29kZXMKLSAqLwotI2lmZGVmIEhBVkVfQUREUklORk8KLSNkZWZpbmUgTk9FUlJPUgkJMAkJLyogbm8gZXJyb3IgKi8KLSNlbmRpZiAvKiBIQVZFX0FERFJJTkZPICovCi0jZGVmaW5lIEZPUk1FUlIJCTEJCS8qIGZvcm1hdCBlcnJvciAqLwotI2RlZmluZSBTRVJWRkFJTAkyCQkvKiBzZXJ2ZXIgZmFpbHVyZSAqLwotI2RlZmluZSBOWERPTUFJTgkzCQkvKiBub24gZXhpc3RlbnQgZG9tYWluICovCi0jZGVmaW5lIE5PVElNUAkJNAkJLyogbm90IGltcGxlbWVudGVkICovCi0jZGVmaW5lIFJFRlVTRUQJCTUJCS8qIHF1ZXJ5IHJlZnVzZWQgKi8KLSNpZmRlZiBBTExPV19VUERBVEVTCi0JLyogbm9uIHN0YW5kYXJkICovCi0jIGRlZmluZSBOT0NIQU5HRQkweGYJCS8qIHVwZGF0ZSBmYWlsZWQgdG8gY2hhbmdlIGRiICovCi0jZW5kaWYKLQotLyoKLSAqIFR5cGUgdmFsdWVzIGZvciByZXNvdXJjZXMgYW5kIHF1ZXJpZXMKLSAqLwotI2RlZmluZSBUX0EJCTEJCS8qIGhvc3QgYWRkcmVzcyAqLwotI2RlZmluZSBUX05TCQkyCQkvKiBhdXRob3JpdGF0aXZlIHNlcnZlciAqLwotI2RlZmluZSBUX01ECQkzCQkvKiBtYWlsIGRlc3RpbmF0aW9uICovCi0jZGVmaW5lIFRfTUYJCTQJCS8qIG1haWwgZm9yd2FyZGVyICovCi0jZGVmaW5lIFRfQ05BTUUJCTUJCS8qIGNhbm9uaWNhbCBuYW1lICovCi0jZGVmaW5lIFRfU09BCQk2CQkvKiBzdGFydCBvZiBhdXRob3JpdHkgem9uZSAqLwotI2RlZmluZSBUX01CCQk3CQkvKiBtYWlsYm94IGRvbWFpbiBuYW1lICovCi0jZGVmaW5lIFRfTUcJCTgJCS8qIG1haWwgZ3JvdXAgbWVtYmVyICovCi0jZGVmaW5lIFRfTVIJCTkJCS8qIG1haWwgcmVuYW1lIG5hbWUgKi8KLSNkZWZpbmUgVF9OVUxMCQkxMAkJLyogbnVsbCByZXNvdXJjZSByZWNvcmQgKi8KLSNkZWZpbmUgVF9XS1MJCTExCQkvKiB3ZWxsIGtub3duIHNlcnZpY2UgKi8KLSNkZWZpbmUgVF9QVFIJCTEyCQkvKiBkb21haW4gbmFtZSBwb2ludGVyICovCi0jZGVmaW5lIFRfSElORk8JCTEzCQkvKiBob3N0IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFRfTUlORk8JCTE0CQkvKiBtYWlsYm94IGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFRfTVgJCTE1CQkvKiBtYWlsIHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgVF9UWFQJCTE2CQkvKiB0ZXh0IHN0cmluZ3MgKi8KLSNkZWZpbmUJVF9SUAkJMTcJCS8qIHJlc3BvbnNpYmxlIHBlcnNvbiAqLwotI2RlZmluZSBUX0FGU0RCCQkxOAkJLyogQUZTIGNlbGwgZGF0YWJhc2UgKi8KLSNkZWZpbmUgVF9YMjUJCTE5CQkvKiBYXzI1IGNhbGxpbmcgYWRkcmVzcyAqLwotI2RlZmluZSBUX0lTRE4JCTIwCQkvKiBJU0ROIGNhbGxpbmcgYWRkcmVzcyAqLwotI2RlZmluZSBUX1JUCQkyMQkJLyogcm91dGVyICovCi0jZGVmaW5lIFRfTlNBUAkJMjIJCS8qIE5TQVAgYWRkcmVzcyAqLwotI2RlZmluZSBUX05TQVBfUFRSCTIzCQkvKiByZXZlcnNlIE5TQVAgbG9va3VwIChkZXByZWNhdGVkKSAqLwotI2RlZmluZQlUX1NJRwkJMjQJCS8qIHNlY3VyaXR5IHNpZ25hdHVyZSAqLwotI2RlZmluZQlUX0tFWQkJMjUJCS8qIHNlY3VyaXR5IGtleSAqLwotI2RlZmluZQlUX1BYCQkyNgkJLyogWC40MDAgbWFpbCBtYXBwaW5nICovCi0jZGVmaW5lCVRfR1BPUwkJMjcJCS8qIGdlb2dyYXBoaWNhbCBwb3NpdGlvbiAod2l0aGRyYXduKSAqLwotI2RlZmluZQlUX0FBQUEJCTI4CQkvKiBJUDYgQWRkcmVzcyAqLwotI2RlZmluZQlUX0xPQwkJMjkJCS8qIExvY2F0aW9uIEluZm9ybWF0aW9uICovCi0JLyogbm9uIHN0YW5kYXJkICovCi0jZGVmaW5lIFRfVUlORk8JCTEwMAkJLyogdXNlciAoZmluZ2VyKSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBUX1VJRAkJMTAxCQkvKiB1c2VyIElEICovCi0jZGVmaW5lIFRfR0lECQkxMDIJCS8qIGdyb3VwIElEICovCi0jZGVmaW5lIFRfVU5TUEVDCTEwMwkJLyogVW5zcGVjaWZpZWQgZm9ybWF0IChiaW5hcnkgZGF0YSkgKi8KLQkvKiBRdWVyeSB0eXBlIHZhbHVlcyB3aGljaCBkbyBub3QgYXBwZWFyIGluIHJlc291cmNlIHJlY29yZHMgKi8KLSNkZWZpbmUgVF9BWEZSCQkyNTIJCS8qIHRyYW5zZmVyIHpvbmUgb2YgYXV0aG9yaXR5ICovCi0jZGVmaW5lIFRfTUFJTEIJCTI1MwkJLyogdHJhbnNmZXIgbWFpbGJveCByZWNvcmRzICovCi0jZGVmaW5lIFRfTUFJTEEJCTI1NAkJLyogdHJhbnNmZXIgbWFpbCBhZ2VudCByZWNvcmRzICovCi0jZGVmaW5lIFRfQU5ZCQkyNTUJCS8qIHdpbGRjYXJkIG1hdGNoICovCi0KLS8qCi0gKiBWYWx1ZXMgZm9yIGNsYXNzIGZpZWxkCi0gKi8KLQotI2RlZmluZSBDX0lOCQkxCQkvKiB0aGUgYXJwYSBpbnRlcm5ldCAqLwotI2RlZmluZSBDX0NIQU9TCQkzCQkvKiBmb3IgY2hhb3MgbmV0IChNSVQpICovCi0jZGVmaW5lIENfSFMJCTQJCS8qIGZvciBIZXNpb2QgbmFtZSBzZXJ2ZXIgKE1JVCkgKFhYWCkgKi8KLQkvKiBRdWVyeSBjbGFzcyB2YWx1ZXMgd2hpY2ggZG8gbm90IGFwcGVhciBpbiByZXNvdXJjZSByZWNvcmRzICovCi0jZGVmaW5lIENfQU5ZCQkyNTUJCS8qIHdpbGRjYXJkIG1hdGNoICovCi0KLS8qCi0gKiBTdGF0dXMgcmV0dXJuIGNvZGVzIGZvciBUX1VOU1BFQyBjb252ZXJzaW9uIHJvdXRpbmVzCi0gKi8KLSNkZWZpbmUgQ09OVl9TVUNDRVNTCTAKLSNkZWZpbmUgQ09OVl9PVkVSRkxPVwkoLTEpCi0jZGVmaW5lIENPTlZfQkFERk1UCSgtMikKLSNkZWZpbmUgQ09OVl9CQURDS1NVTQkoLTMpCi0jZGVmaW5lIENPTlZfQkFEQlVGTEVOCSgtNCkKLQotI2lmbmRlZiBfX0JZVEVfT1JERVIKLSNpZiAoQlNEID49IDE5OTEwMykKLSMgaW5jbHVkZSA8bWFjaGluZS9lbmRpYW4uaD4KLSNlbHNlCi0jaWZkZWYgbGludXgKLSMgaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jZWxzZQotI2RlZmluZQlfX0xJVFRMRV9FTkRJQU4JMTIzNAkvKiBsZWFzdC1zaWduaWZpY2FudCBieXRlIGZpcnN0ICh2YXgsIHBjKSAqLwotI2RlZmluZQlfX0JJR19FTkRJQU4JNDMyMQkvKiBtb3N0LXNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKElCTSwgbmV0KSAqLwotI2RlZmluZQlfX1BEUF9FTkRJQU4JMzQxMgkvKiBMU0IgZmlyc3QgaW4gd29yZCwgTVNXIGZpcnN0IGluIGxvbmcgKHBkcCkqLwotCi0jaWYgZGVmaW5lZCh2YXgpIHx8IGRlZmluZWQobnMzMjAwMCkgfHwgZGVmaW5lZChzdW4zODYpIHx8IGRlZmluZWQoaTM4NikgfHwgXAotICAgIGRlZmluZWQoTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoQklUX1pFUk9fT05fUklHSFQpIHx8IFwKLSAgICBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX2FscGhhKQotI2RlZmluZSBfX0JZVEVfT1JERVIJX19MSVRUTEVfRU5ESUFOCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoc2VsKSB8fCBkZWZpbmVkKHB5cikgfHwgZGVmaW5lZChtYzY4MDAwKSB8fCBkZWZpbmVkKHNwYXJjKSB8fCBcCi0gICAgZGVmaW5lZChpczY4aykgfHwgZGVmaW5lZCh0YWhvZSkgfHwgZGVmaW5lZChpYm0wMzIpIHx8IGRlZmluZWQoaWJtMzcwKSB8fCBcCi0gICAgZGVmaW5lZChNSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChfSUJNUjIpIHx8IGRlZmluZWQoREdVWCkgfHxcCi0gICAgZGVmaW5lZChhcG9sbG8pIHx8IGRlZmluZWQoX19jb252ZXhfXykgfHwgZGVmaW5lZChfQ1JBWSkgfHwgXAotICAgIGRlZmluZWQoX19ocHBhKSB8fCBkZWZpbmVkKF9faHA5MDAwKSB8fCBcCi0gICAgZGVmaW5lZChfX2hwOTAwMHMzMDApIHx8IGRlZmluZWQoX19ocDkwMDBzNzAwKSB8fCBcCi0gICAgZGVmaW5lZCAoQklUX1pFUk9fT05fTEVGVCkgfHwgZGVmaW5lZChtNjhrKQotI2RlZmluZSBfX0JZVEVfT1JERVIJX19CSUdfRU5ESUFOCi0jZW5kaWYKLSNlbmRpZiAvKiBsaW51eCAqLwotI2VuZGlmIC8qIEJTRCAqLwotI2VuZGlmIC8qIF9fQllURV9PUkRFUiAqLwotCi0jaWYgIWRlZmluZWQoX19CWVRFX09SREVSKSB8fCBcCi0gICAgKF9fQllURV9PUkRFUiAhPSBfX0JJR19FTkRJQU4gJiYgX19CWVRFX09SREVSICE9IF9fTElUVExFX0VORElBTiAmJiBcCi0gICAgX19CWVRFX09SREVSICE9IF9fUERQX0VORElBTikKLQkvKiB5b3UgbXVzdCBkZXRlcm1pbmUgd2hhdCB0aGUgY29ycmVjdCBiaXQgb3JkZXIgaXMgZm9yCi0JICogeW91ciBjb21waWxlciAtIHRoZSBuZXh0IGxpbmUgaXMgYW4gaW50ZW50aW9uYWwgZXJyb3IKLQkgKiB3aGljaCB3aWxsIGZvcmNlIHlvdXIgY29tcGlsZXMgdG8gYm9tYiB1bnRpbCB5b3UgZml4Ci0JICogdGhlIGFib3ZlIG1hY3Jvcy4KLQkgKi8KLSAgZXJyb3IgIlVuZGVmaW5lZCBvciBpbnZhbGlkIF9fQllURV9PUkRFUiI7Ci0jZW5kaWYKLQotLyoKLSAqIFN0cnVjdHVyZSBmb3IgcXVlcnkgaGVhZGVyLiAgVGhlIG9yZGVyIG9mIHRoZSBmaWVsZHMgaXMgbWFjaGluZS0gYW5kCi0gKiBjb21waWxlci1kZXBlbmRlbnQsIGRlcGVuZGluZyBvbiB0aGUgYnl0ZS9iaXQgb3JkZXIgYW5kIHRoZSBsYXlvdXQKLSAqIG9mIGJpdCBmaWVsZHMuICBXZSB1c2UgYml0IGZpZWxkcyBvbmx5IGluIGludCB2YXJpYWJsZXMsIGFzIHRoaXMKLSAqIGlzIGFsbCBBTlNJIHJlcXVpcmVzLiAgVGhpcyByZXF1aXJlcyBhIHNvbWV3aGF0IGNvbmZ1c2luZyByZWFycmFuZ2VtZW50LgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZAlpZCA6MTY7CQkvKiBxdWVyeSBpZGVudGlmaWNhdGlvbiBudW1iZXIgKi8KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0JCQkvKiBmaWVsZHMgaW4gdGhpcmQgYnl0ZSAqLwotCXVuc2lnbmVkCXFyOiAxOwkJLyogcmVzcG9uc2UgZmxhZyAqLwotCXVuc2lnbmVkCW9wY29kZTogNDsJLyogcHVycG9zZSBvZiBtZXNzYWdlICovCi0JdW5zaWduZWQJYWE6IDE7CQkvKiBhdXRob3JpdGl2ZSBhbnN3ZXIgKi8KLQl1bnNpZ25lZAl0YzogMTsJCS8qIHRydW5jYXRlZCBtZXNzYWdlICovCi0JdW5zaWduZWQJcmQ6IDE7CQkvKiByZWN1cnNpb24gZGVzaXJlZCAqLwotCQkJLyogZmllbGRzIGluIGZvdXJ0aCBieXRlICovCi0JdW5zaWduZWQJcmE6IDE7CQkvKiByZWN1cnNpb24gYXZhaWxhYmxlICovCi0JdW5zaWduZWQJcHI6IDE7CQkvKiBwcmltYXJ5IHNlcnZlciByZXEnZCAoIXN0YW5kYXJkKSAqLwotCXVuc2lnbmVkCXVudXNlZCA6MjsJLyogdW51c2VkIGJpdHMgKE1CWiBhcyBvZiA0LjkuM2EzKSAqLwotCXVuc2lnbmVkCXJjb2RlIDo0OwkvKiByZXNwb25zZSBjb2RlICovCi0jZW5kaWYKLSNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOIHx8IF9fQllURV9PUkRFUiA9PSBfX1BEUF9FTkRJQU4KLQkJCS8qIGZpZWxkcyBpbiB0aGlyZCBieXRlICovCi0JdW5zaWduZWQJcmQgOjE7CQkvKiByZWN1cnNpb24gZGVzaXJlZCAqLwotCXVuc2lnbmVkCXRjIDoxOwkJLyogdHJ1bmNhdGVkIG1lc3NhZ2UgKi8KLQl1bnNpZ25lZAlhYSA6MTsJCS8qIGF1dGhvcml0aXZlIGFuc3dlciAqLwotCXVuc2lnbmVkCW9wY29kZSA6NDsJLyogcHVycG9zZSBvZiBtZXNzYWdlICovCi0JdW5zaWduZWQJcXIgOjE7CQkvKiByZXNwb25zZSBmbGFnICovCi0JCQkvKiBmaWVsZHMgaW4gZm91cnRoIGJ5dGUgKi8KLQl1bnNpZ25lZAlyY29kZSA6NDsJLyogcmVzcG9uc2UgY29kZSAqLwotCXVuc2lnbmVkCXVudXNlZCA6MjsJLyogdW51c2VkIGJpdHMgKE1CWiBhcyBvZiA0LjkuM2EzKSAqLwotCXVuc2lnbmVkCXByIDoxOwkJLyogcHJpbWFyeSBzZXJ2ZXIgcmVxJ2QgKCFzdGFuZGFyZCkgKi8KLQl1bnNpZ25lZAlyYSA6MTsJCS8qIHJlY3Vyc2lvbiBhdmFpbGFibGUgKi8KLSNlbmRpZgotCQkJLyogcmVtYWluaW5nIGJ5dGVzICovCi0JdW5zaWduZWQJcWRjb3VudCA6MTY7CS8qIG51bWJlciBvZiBxdWVzdGlvbiBlbnRyaWVzICovCi0JdW5zaWduZWQJYW5jb3VudCA6MTY7CS8qIG51bWJlciBvZiBhbnN3ZXIgZW50cmllcyAqLwotCXVuc2lnbmVkCW5zY291bnQgOjE2OwkvKiBudW1iZXIgb2YgYXV0aG9yaXR5IGVudHJpZXMgKi8KLQl1bnNpZ25lZAlhcmNvdW50IDoxNjsJLyogbnVtYmVyIG9mIHJlc291cmNlIGVudHJpZXMgKi8KLX0gSEVBREVSOwotCi0vKgotICogRGVmaW5lcyBmb3IgaGFuZGxpbmcgY29tcHJlc3NlZCBkb21haW4gbmFtZXMKLSAqLwotI2RlZmluZSBJTkRJUl9NQVNLCTB4YzAKLQotLyoKLSAqIFN0cnVjdHVyZSBmb3IgcGFzc2luZyByZXNvdXJjZSByZWNvcmRzIGFyb3VuZC4KLSAqLwotc3RydWN0IHJyZWMgewotCWludDE2X3QJCXJfem9uZTsJCQkvKiB6b25lIG51bWJlciAqLwotCWludDE2X3QJCXJfY2xhc3M7CQkvKiBjbGFzcyBudW1iZXIgKi8KLQlpbnQxNl90CQlyX3R5cGU7CQkJLyogdHlwZSBudW1iZXIgKi8KLQl1X2ludDMyX3QJcl90dGw7CQkJLyogdGltZSB0byBsaXZlICovCi0JaW50CQlyX3NpemU7CQkJLyogc2l6ZSBvZiBkYXRhIGFyZWEgKi8KLQljaGFyCQkqcl9kYXRhOwkJLyogcG9pbnRlciB0byBkYXRhICovCi19OwotCi0vL2V4dGVybgl1X2ludDE2X3QJX2dldHNob3J0IF9fUCgoY29uc3QgdV9jaGFyICopKTsKLS8vZXh0ZXJuCXVfaW50MzJfdAlfZ2V0bG9uZyBfX1AoKGNvbnN0IHVfY2hhciAqKSk7Ci0KLS8qCi0gKiBJbmxpbmUgdmVyc2lvbnMgb2YgZ2V0L3B1dCBzaG9ydC9sb25nLiAgUG9pbnRlciBpcyBhZHZhbmNlZC4KLSAqCi0gKiBUaGVzZSBtYWNyb3MgZGVtb25zdHJhdGUgdGhlIHByb3BlcnR5IG9mIEMgd2hlcmVieSBpdCBjYW4gYmUKLSAqIHBvcnRhYmxlIG9yIGl0IGNhbiBiZSBlbGVnYW50IGJ1dCByYXJlbHkgYm90aC4KLSAqLwotI2RlZmluZSBHRVRTSE9SVChzLCBjcCkgeyBcCi0JcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKLQkocykgPSAoKHVfaW50MTZfdCl0X2NwWzBdIDw8IDgpIFwKLQkgICAgfCAoKHVfaW50MTZfdCl0X2NwWzFdKSBcCi0JICAgIDsgXAotCShjcCkgKz0gSU5UMTZTWjsgXAotfQotCi0jZGVmaW5lIEdFVExPTkcobCwgY3ApIHsgXAotCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCi0JKGwpID0gKCh1X2ludDMyX3QpdF9jcFswXSA8PCAyNCkgXAotCSAgICB8ICgodV9pbnQzMl90KXRfY3BbMV0gPDwgMTYpIFwKLQkgICAgfCAoKHVfaW50MzJfdCl0X2NwWzJdIDw8IDgpIFwKLQkgICAgfCAoKHVfaW50MzJfdCl0X2NwWzNdKSBcCi0JICAgIDsgXAotCShjcCkgKz0gSU5UMzJTWjsgXAotfQotCi0jZGVmaW5lIFBVVFNIT1JUKHMsIGNwKSB7IFwKLQlyZWdpc3RlciB1X2ludDE2X3QgdF9zID0gKHVfaW50MTZfdCkocyk7IFwKLQlyZWdpc3RlciB1X2NoYXIgKnRfY3AgPSAodV9jaGFyICopKGNwKTsgXAotCSp0X2NwKysgPSB0X3MgPj4gODsgXAotCSp0X2NwICAgPSB0X3M7IFwKLQkoY3ApICs9IElOVDE2U1o7IFwKLX0KLQotI2RlZmluZSBQVVRMT05HKGwsIGNwKSB7IFwKLQlyZWdpc3RlciB1X2ludDMyX3QgdF9sID0gKHVfaW50MzJfdCkobCk7IFwKLQlyZWdpc3RlciB1X2NoYXIgKnRfY3AgPSAodV9jaGFyICopKGNwKTsgXAotCSp0X2NwKysgPSB0X2wgPj4gMjQ7IFwKLQkqdF9jcCsrID0gdF9sID4+IDE2OyBcCi0JKnRfY3ArKyA9IHRfbCA+PiA4OyBcCi0JKnRfY3AgICA9IHRfbDsgXAotCShjcCkgKz0gSU5UMzJTWjsgXAotfQotCi0jZW5kaWYgLyogIV9OQU1FU0VSX0hfICovCmRpZmYgLS1naXQgYS9XaW4zMi9JbmNsdWRlL2JpdHR5cGVzLmggYi9XaW4zMi9JbmNsdWRlL2JpdHR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YWE5ZmEuLjAwMDAwMDAKLS0tIGEvV2luMzIvSW5jbHVkZS9iaXR0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5OSBXSURFIFByb2plY3QuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotI2lmbmRlZiBfQklUVFlQRVNfSAotI2RlZmluZSBfQklUVFlQRVNfSAotCi0jaWZuZGVmIEhBVkVfVV9JTlQ4X1QKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1X2ludDhfdDsKLXR5cGVkZWYgc2lnbmVkIGNoYXIgaW50OF90OwotI2VuZGlmIC8qIEhBVkVfVV9JTlQ4X1QgKi8KLQotI2lmbmRlZiBIQVZFX1VfSU5UMTZfVAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X2ludDE2X3Q7Ci10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQxNl90OwotI2VuZGlmIC8qIEhBVkVfVV9JTlQxNl9UICovCi0KLSNpZm5kZWYgSEFWRV9VX0lOVDMyX1QKLXR5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50MzJfdDsKLXR5cGVkZWYgc2lnbmVkIGludCBpbnQzMl90OwotI2VuZGlmIC8qIEhBVkVfVV9JTlQzMl9UICovCi0KLSNpZm5kZWYgSEFWRV9VX0lOVDY0X1QKLSNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKLXR5cGVkZWYgdW5zaWduZWQgX2ludDY0IHVfaW50NjRfdDsKLXR5cGVkZWYgX2ludDY0IGludDY0X3Q7Ci0jZWxzZSAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVfaW50NjRfdDsKLXR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Ci0jZW5kaWYgLyogX01TQ19FWFRFTlNJT05TICovCi0jZW5kaWYgLyogSEFWRV9VX0lOVDY0X1QgKi8KLQotI2lmbmRlZiBQUklkNjQKLSNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKLSNkZWZpbmUgUFJJZDY0CSJJNjRkIgotI2Vsc2UgLyogX01TQ19FWFRFTlNJT05TICovCi0jZGVmaW5lIFBSSWQ2NAkibGxkIgotI2VuZGlmIC8qIF9NU0NfRVhURU5TSU9OUyAqLwotI2VuZGlmIC8qIFBSSWQ2NCAqLwotCi0jaWZuZGVmIFBSSW82NAotI2lmZGVmIF9NU0NfRVhURU5TSU9OUwotI2RlZmluZSBQUklvNjQJIkk2NG8iCi0jZWxzZSAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KLSNkZWZpbmUgUFJJbzY0CSJsbG8iCi0jZW5kaWYgLyogX01TQ19FWFRFTlNJT05TICovCi0jZW5kaWYgLyogUFJJbzY0ICovCi0KLSNpZm5kZWYgUFJJeDY0Ci0jaWZkZWYgX01TQ19FWFRFTlNJT05TCi0jZGVmaW5lIFBSSXg2NAkiSTY0eCIKLSNlbHNlIC8qIF9NU0NfRVhURU5TSU9OUyAqLwotI2RlZmluZSBQUkl4NjQJImxseCIKLSNlbmRpZiAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KLSNlbmRpZiAvKiBQUkl4NjQgKi8KLQotI2lmbmRlZiBQUkl1NjQKLSNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKLSNkZWZpbmUgUFJJdTY0CSJJNjR1IgotI2Vsc2UgLyogX01TQ19FWFRFTlNJT05TICovCi0jZGVmaW5lIFBSSXU2NAkibGx1IgotI2VuZGlmIC8qIF9NU0NfRVhURU5TSU9OUyAqLwotI2VuZGlmIC8qIFBSSXU2NCAqLwotCi0jZW5kaWYgLyogX0JJVFRZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL1dpbjMyL0luY2x1ZGUvY2RlY2xfZXh0LmggYi9XaW4zMi9JbmNsdWRlL2NkZWNsX2V4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQwYjg0Li4wMDAwMDAwCi0tLSBhL1dpbjMyL0luY2x1ZGUvY2RlY2xfZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0jaWZuZGVmIEhBVkVfUE9SVEFCTEVfUFJPVE9UWVBFCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotI2RlZmluZQlfX1AocHJvdG9zKQlwcm90b3MJCS8qIGZ1bGwtYmxvd24gQU5TSSBDICovCi0jZWxzZQotI2RlZmluZQlfX1AocHJvdG9zKQkoKQkJLyogdHJhZGl0aW9uYWwgQyBwcmVwcm9jZXNzb3IgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogIUhBVkVfUE9SVEFCTEVfUFJPVE9UWVBFICovCmRpZmYgLS1naXQgYS9XaW4zMi9JbmNsdWRlL2luZXRwcml2YXRlLmggYi9XaW4zMi9JbmNsdWRlL2luZXRwcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWVkM2QuLjAwMDAwMDAKLS0tIGEvV2luMzIvSW5jbHVkZS9pbmV0cHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OSAtIDIwMDMKLSAqIE5ldEdyb3VwLCBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gKEl0YWx5KQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPG5ldC9uZXRkYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KLQotZXh0ZXJuIHZvaWQgX3NldGh0ZW50KGludCBmKTsKLWV4dGVybiB2b2lkIF9lbmRodGVudCh2b2lkKTsKLWV4dGVybiBzdHJ1Y3QgaG9zdGVudCAqX2dldGh0ZW50KHZvaWQpOwotZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpfZ2V0aHRieW5hbWUoY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gc3RydWN0IGhvc3RlbnQgKl9nZXRodGJ5YWRkcihjb25zdCBjaGFyICphZGRyLCBpbnQgbGVuLAotCQkgaW50IHR5cGUpOwotZXh0ZXJuIGludCBfdmFsaWR1c2VyKEZJTEUgKmhvc3RmLCBjb25zdCBjaGFyICpyaG9zdCwKLQkJIGNvbnN0IGNoYXIgKmx1c2VyLCBjb25zdCBjaGFyICpydXNlciwgaW50IGJhc2VsZW4pOwotZXh0ZXJuIGludCBfY2hlY2tob3N0KGNvbnN0IGNoYXIgKnJob3N0LCBjb25zdCBjaGFyICpsaG9zdCwgaW50IGxlbik7Ci0jaWYgMAotZXh0ZXJuIHZvaWQgcHV0bG9uZyh1X2xvbmcgbCwgdV9jaGFyICptc2dwKTsKLWV4dGVybiB2b2lkIHB1dHNob3J0KHVfc2hvcnQgbCwgdV9jaGFyICptc2dwKTsKLWV4dGVybiB1X2ludDMyX3QgX2dldGxvbmcocmVnaXN0ZXIgY29uc3QgdV9jaGFyICptc2dwKTsKLWV4dGVybiB1X2ludDE2X3QgX2dldHNob3J0KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqbXNncCk7Ci1leHRlcm4gdm9pZCBwX3F1ZXJ5KGNoYXIgKm1zZyk7Ci1leHRlcm4gdm9pZCBmcF9xdWVyeShjaGFyICptc2csIEZJTEUgKmZpbGUpOwotZXh0ZXJuIGNoYXIgKnBfY2RuYW1lKGNoYXIgKmNwLCBjaGFyICptc2csIEZJTEUgKmZpbGUpOwotZXh0ZXJuIGNoYXIgKnBfcnIoY2hhciAqY3AsIGNoYXIgKm1zZywgRklMRSAqZmlsZSk7Ci1leHRlcm4gY2hhciAqcF90eXBlKGludCB0eXBlKTsKLWV4dGVybiBjaGFyICogcF9jbGFzcyhpbnQgY2xhc3MpOwotZXh0ZXJuIGNoYXIgKnBfdGltZSh1X2xvbmcgdmFsdWUpOwotI2VuZGlmCi1leHRlcm4gY2hhciAqIGhvc3RhbGlhcyhjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiB2b2lkIHNldGhvc3RmaWxlKGNoYXIgKm5hbWUpOwotZXh0ZXJuIHZvaWQgX3Jlc19jbG9zZSAodm9pZCk7Ci1leHRlcm4gdm9pZCBydXNlcnBhc3MoY29uc3QgY2hhciAqaG9zdCwgY2hhciAqKmFuYW1lLCBjaGFyICoqYXBhc3MpOwpkaWZmIC0tZ2l0IGEvV2luMzIvSW5jbHVkZS9pcDZfbWlzYy5oIGIvV2luMzIvSW5jbHVkZS9pcDZfbWlzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjU3OGMzLi4wMDAwMDAwCi0tLSBhL1dpbjMyL0luY2x1ZGUvaXA2X21pc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIGNvbGxhZ2Ugb2YgZGVjbGFyYXRpb25zIGZvciBJUHY2IGZyb20gRnJlZUJTRCBub3QgcHJlc2VudCBpbiBXaW5kb3dzCi0gKi8KLQotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0KLSNpbmNsdWRlIDx3czJ0Y3BpcC5oPgotCi0jaWZuZGVmIF9fTUlOR1czMl9fCi0jZGVmaW5lCUlOX01VTFRJQ0FTVChhKQkJSU5fQ0xBU1NEKGEpCi0jZW5kaWYKLQotI2RlZmluZQlJTl9FWFBFUklNRU5UQUwoYSkJKCgoKHVfaW50MzJfdCkgKGEpKSAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCi0KLSNkZWZpbmUJSU5fTE9PUEJBQ0tORVQJCTEyNwotCi0jaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChERUZJTkVfQURESVRJT05BTF9JUFY2X1NUVUZGKQotLyogSVB2NiBhZGRyZXNzICovCi1zdHJ1Y3QgaW42X2FkZHIKLSAgewotICAgIHVuaW9uCi0gICAgICB7Ci0JdV9pbnQ4X3QJCXU2X2FkZHI4WzE2XTsKLQl1X2ludDE2X3QJdTZfYWRkcjE2WzhdOwotCXVfaW50MzJfdAl1Nl9hZGRyMzJbNF07Ci0gICAgICB9IGluNl91OwotI2RlZmluZSBzNl9hZGRyCQkJaW42X3UudTZfYWRkcjgKLSNkZWZpbmUgczZfYWRkcjE2CQlpbjZfdS51Nl9hZGRyMTYKLSNkZWZpbmUgczZfYWRkcjMyCQlpbjZfdS51Nl9hZGRyMzIKLSNkZWZpbmUgczZfYWRkcjY0CQlpbjZfdS51Nl9hZGRyNjQKLSAgfTsKLQotI2RlZmluZSBJTjZBRERSX0FOWV9JTklUIHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9Ci0jZGVmaW5lIElONkFERFJfTE9PUEJBQ0tfSU5JVCB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEgfQotI2VuZGlmIC8qIF9fTUlOR1czMl9fICovCi0KLQotI2lmIChkZWZpbmVkIF9NU0NfVkVSKSB8fCAoZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChERUZJTkVfQURESVRJT05BTF9JUFY2X1NUVUZGKSkKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJc2FfZmFtaWx5X3Q7Ci0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChERUZJTkVfQURESVRJT05BTF9JUFY2X1NUVUZGKQotCi0jZGVmaW5lCV9fU09DS0FERFJfQ09NTU9OKHNhX3ByZWZpeCkgXAotICBzYV9mYW1pbHlfdCBzYV9wcmVmaXgjI2ZhbWlseQotCi0vKiBEaXR0bywgZm9yIElQdjYuICAqLwotc3RydWN0IHNvY2thZGRyX2luNgotICB7Ci0gICAgX19TT0NLQUREUl9DT01NT04gKHNpbjZfKTsKLSAgICB1X2ludDE2X3Qgc2luNl9wb3J0OwkJLyogVHJhbnNwb3J0IGxheWVyIHBvcnQgIyAqLwotICAgIHVfaW50MzJfdCBzaW42X2Zsb3dpbmZvOwkvKiBJUHY2IGZsb3cgaW5mb3JtYXRpb24gKi8KLSAgICBzdHJ1Y3QgaW42X2FkZHIgc2luNl9hZGRyOwkvKiBJUHY2IGFkZHJlc3MgKi8KLSAgfTsKLQotI2RlZmluZSBJTjZfSVNfQUREUl9WNE1BUFBFRChhKSBcCi0JKCgoKHVfaW50MzJfdCAqKSAoYSkpWzBdID09IDApICYmICgoKHVfaW50MzJfdCAqKSAoYSkpWzFdID09IDApICYmIFwKLQkgKCgodV9pbnQzMl90ICopIChhKSlbMl0gPT0gaHRvbmwgKDB4ZmZmZikpKQotCi0jZGVmaW5lIElONl9JU19BRERSX01VTFRJQ0FTVChhKSAoKCh1X2ludDhfdCAqKSAoYSkpWzBdID09IDB4ZmYpCi0KLSNkZWZpbmUgSU42X0lTX0FERFJfTElOS0xPQ0FMKGEpIFwKLQkoKCgodV9pbnQzMl90ICopIChhKSlbMF0gJiBodG9ubCAoMHhmZmMwMDAwMCkpID09IGh0b25sICgweGZlODAwMDAwKSkKLQotI2RlZmluZSBJTjZfSVNfQUREUl9MT09QQkFDSyhhKSBcCi0JKCgodV9pbnQzMl90ICopIChhKSlbMF0gPT0gMCAmJiAoKHVfaW50MzJfdCAqKSAoYSkpWzFdID09IDAgJiYgXAotCSAoKHVfaW50MzJfdCAqKSAoYSkpWzJdID09IDAgJiYgKCh1X2ludDMyX3QgKikgKGEpKVszXSA9PSBodG9ubCAoMSkpCi0jZW5kaWYgLyogX19NSU5HVzMyX18gKi8KLQotI2RlZmluZSBpcDZfdmZjICAgaXA2X2N0bHVuLmlwNl91bjJfdmZjCi0jZGVmaW5lIGlwNl9mbG93ICBpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX2Zsb3cKLSNkZWZpbmUgaXA2X3BsZW4gIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfcGxlbgotI2RlZmluZSBpcDZfbnh0ICAgaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9ueHQKLSNkZWZpbmUgaXA2X2hsaW0gIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfaGxpbQotI2RlZmluZSBpcDZfaG9wcyAgaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9obGltCi0KLSNkZWZpbmUgbmRfcmRfdHlwZSAgICAgICAgICAgICAgIG5kX3JkX2hkci5pY21wNl90eXBlCi0jZGVmaW5lIG5kX3JkX2NvZGUgICAgICAgICAgICAgICBuZF9yZF9oZHIuaWNtcDZfY29kZQotI2RlZmluZSBuZF9yZF9ja3N1bSAgICAgICAgICAgICAgbmRfcmRfaGRyLmljbXA2X2Nrc3VtCi0jZGVmaW5lIG5kX3JkX3Jlc2VydmVkICAgICAgICAgICBuZF9yZF9oZHIuaWNtcDZfZGF0YTMyWzBdCi0KLS8qCi0gKglJUFY2IGV4dGVuc2lvbiBoZWFkZXJzCi0gKi8KLSNkZWZpbmUgSVBQUk9UT19IT1BPUFRTCQkwCS8qIElQdjYgaG9wLWJ5LWhvcCBvcHRpb25zCSovCi0jZGVmaW5lIElQUFJPVE9fSVBWNgkJNDEgIC8qIElQdjYgaGVhZGVyLiAgKi8KLSNkZWZpbmUgSVBQUk9UT19ST1VUSU5HCQk0MwkvKiBJUHY2IHJvdXRpbmcgaGVhZGVyCQkqLwotI2RlZmluZSBJUFBST1RPX0ZSQUdNRU5UCTQ0CS8qIElQdjYgZnJhZ21lbnRhdGlvbiBoZWFkZXIJKi8KLSNkZWZpbmUgSVBQUk9UT19FU1AJCTUwCS8qIGVuY2Fwc3VsYXRpbmcgc2VjdXJpdHkgcGF5bG9hZCAqLwotI2RlZmluZSBJUFBST1RPX0FICQk1MQkvKiBhdXRoZW50aWNhdGlvbiBoZWFkZXIJKi8KLSNkZWZpbmUgSVBQUk9UT19JQ01QVjYJCTU4CS8qIElDTVB2NgkJCSovCi0jZGVmaW5lIElQUFJPVE9fTk9ORQkJNTkJLyogSVB2NiBubyBuZXh0IGhlYWRlcgkJKi8KLSNkZWZpbmUgSVBQUk9UT19EU1RPUFRTCQk2MAkvKiBJUHY2IGRlc3RpbmF0aW9uIG9wdGlvbnMJKi8KLSNkZWZpbmUgSVBQUk9UT19QSU0JCQkxMDMgLyogUHJvdG9jb2wgSW5kZXBlbmRlbnQgTXVsdGljYXN0LiAgKi8KLQotI2RlZmluZQkgSVBWNl9SVEhEUl9UWVBFXzAgMAotCi0vKiBPcHRpb24gdHlwZXMgYW5kIHJlbGF0ZWQgbWFjcm9zICovCi0jZGVmaW5lIElQNk9QVF9QQUQxCQkweDAwCS8qIDAwIDAgMDAwMDAgKi8KLSNkZWZpbmUgSVA2T1BUX1BBRE4JCTB4MDEJLyogMDAgMCAwMDAwMSAqLwotI2RlZmluZSBJUDZPUFRfSlVNQk8JCTB4QzIJLyogMTEgMCAwMDAxMCA9IDE5NCAqLwotI2RlZmluZSBJUDZPUFRfSlVNQk9fTEVOCTYKLSNkZWZpbmUgSVA2T1BUX1JPVVRFUl9BTEVSVAkweDA1CS8qIDAwIDAgMDAxMDEgKi8KLQotI2RlZmluZSBJUDZPUFRfUlRBTEVSVF9MRU4JNAotI2RlZmluZSBJUDZPUFRfUlRBTEVSVF9NTEQJMAkvKiBEYXRhZ3JhbSBjb250YWlucyBhbiBNTEQgbWVzc2FnZSAqLwotI2RlZmluZSBJUDZPUFRfUlRBTEVSVF9SU1ZQCTEJLyogRGF0YWdyYW0gY29udGFpbnMgYW4gUlNWUCBtZXNzYWdlICovCi0jZGVmaW5lIElQNk9QVF9SVEFMRVJUX0FDVE5FVAkyIAkvKiBjb250YWlucyBhbiBBY3RpdmUgTmV0d29ya3MgbXNnICovCi0jZGVmaW5lIElQNk9QVF9NSU5MRU4JCTIKLQotI2RlZmluZSBJUDZPUFRfQklORElOR19VUERBVEUJMHhjNgkvKiAxMSAwIDAwMTEwICovCi0jZGVmaW5lIElQNk9QVF9CSU5ESU5HX0FDSwkweDA3CS8qIDAwIDAgMDAxMTEgKi8KLSNkZWZpbmUgSVA2T1BUX0JJTkRJTkdfUkVRCTB4MDgJLyogMDAgMCAwMTAwMCAqLwotI2RlZmluZSBJUDZPUFRfSE9NRV9BRERSRVNTCTB4YzkJLyogMTEgMCAwMTAwMSAqLwotI2RlZmluZSBJUDZPUFRfRUlECQkweDhhCS8qIDEwIDAgMDEwMTAgKi8KLQotI2RlZmluZSBJUDZPUFRfVFlQRShvKQkJKChvKSAmIDB4QzApCi0jZGVmaW5lIElQNk9QVF9UWVBFX1NLSVAJMHgwMAotI2RlZmluZSBJUDZPUFRfVFlQRV9ESVNDQVJECTB4NDAKLSNkZWZpbmUgSVA2T1BUX1RZUEVfRk9SQ0VJQ01QCTB4ODAKLSNkZWZpbmUgSVA2T1BUX1RZUEVfSUNNUAkweEMwCi0KLSNkZWZpbmUgSVA2T1BUX01VVEFCTEUJCTB4MjAKLQotCi0jaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChERUZJTkVfQURESVRJT05BTF9JUFY2X1NUVUZGKQotI2lmbmRlZiBFQUlfQUREUkZBTUlMWQotc3RydWN0IGFkZHJpbmZvIHsKLQlpbnQJYWlfZmxhZ3M7CS8qIEFJX1BBU1NJVkUsIEFJX0NBTk9OTkFNRSAqLwotCWludAlhaV9mYW1pbHk7CS8qIFBGX3h4eCAqLwotCWludAlhaV9zb2NrdHlwZTsJLyogU09DS194eHggKi8KLQlpbnQJYWlfcHJvdG9jb2w7CS8qIDAgb3IgSVBQUk9UT194eHggZm9yIElQdjQgYW5kIElQdjYgKi8KLQlzaXplX3QJYWlfYWRkcmxlbjsJLyogbGVuZ3RoIG9mIGFpX2FkZHIgKi8KLQljaGFyCSphaV9jYW5vbm5hbWU7CS8qIGNhbm9uaWNhbCBuYW1lIGZvciBob3N0bmFtZSAqLwotCXN0cnVjdCBzb2NrYWRkciAqYWlfYWRkcjsJLyogYmluYXJ5IGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWRkcmluZm8gKmFpX25leHQ7CS8qIG5leHQgc3RydWN0dXJlIGluIGxpbmtlZCBsaXN0ICovCi19OwotI2VuZGlmCi0jZW5kaWYgLyogX19NSU5HVzMyX18gKi8KZGlmZiAtLWdpdCBhL1dpbjMyL0luY2x1ZGUvbmV0L25ldGRiLmggYi9XaW4zMi9JbmNsdWRlL25ldC9uZXRkYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzY4NWQyLi4wMDAwMDAwCi0tLSBhL1dpbjMyL0luY2x1ZGUvbmV0L25ldGRiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODAsIDE5ODMsIDE5ODgsIDE5OTMKLSAqICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCUAoIyluZXRkYi5oCTguMSAoQmVya2VsZXkpIDYvMi85MwotICogICAgICBuZXRkYi5oLHYgMS40IDE5OTUvMDgvMTQgMDQ6MDU6MDQgaGpsIEV4cAotICogLQotICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTkzIGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLCBhbmQgdGhhdAotICogdGhlIG5hbWUgb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZG9jdW1lbnQgb3Igc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgRElHSVRBTCBFUVVJUE1FTlQgQ09SUC4gRElTQ0xBSU1TIEFMTAotICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiAgIElOIE5PIEVWRU5UIFNIQUxMIERJR0lUQUwgRVFVSVBNRU5UCi0gKiBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKLSAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCi0gKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLgotICogLQotICogLS1Db3B5cmlnaHQtLQotICovCi0KLSNpZm5kZWYgX05FVERCX0hfCi0jZGVmaW5lIF9ORVREQl9IXwotCi0vKiBNaW5nVzY0IGRlZmluZXMgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUy4KLSAqLwotI2lmIGRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykgfHwgZGVmaW5lZChfUkVFTlRSQU5UKSAmJiAhZGVmaW5lZChfX01JTkdXNjRfVkVSU0lPTl9NQUpPUikKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8d2luc29jazIuaD4KLSNpbmNsdWRlIDxuZXQvcGF0aHMuaD4KLQotI2RlZmluZSBfUEFUSF9IRVFVSVYJX19QQVRIX0VUQ19JTkVUIi9ob3N0cy5lcXVpdiIKLSNkZWZpbmUgX1BBVEhfSE9TVFMJX19QQVRIX0VUQ19JTkVUIi9ob3N0cyIKLSNkZWZpbmUgX1BBVEhfTkVUV09SS1MJX19QQVRIX0VUQ19JTkVUIi9uZXR3b3JrcyIKLSNkZWZpbmUgX1BBVEhfUFJPVE9DT0xTCV9fUEFUSF9FVENfSU5FVCIvcHJvdG9jb2xzIgotI2RlZmluZSBfUEFUSF9TRVJWSUNFUwlfX1BBVEhfRVRDX0lORVQiL3NlcnZpY2VzIgotI2RlZmluZSBfUEFUSF9SRVNDT05GCV9fUEFUSF9FVENfSU5FVCIvcmVzb2x2LmNvbmYiCi0jZGVmaW5lIF9QQVRIX1JQQwlfX1BBVEhfRVRDX0lORVQiL3JwYyIKLQotc3RydWN0IHJwY2VudCB7Ci0JY2hhcgkqcl9uYW1lOwkvKiBuYW1lIG9mIHNlcnZlciBmb3IgdGhpcyBycGMgcHJvZ3JhbSAqLwotCWNoYXIJKipyX2FsaWFzZXM7CS8qIGFsaWFzIGxpc3QgKi8KLQlpbnQJcl9udW1iZXI7CS8qIHJwYyBwcm9ncmFtIG51bWJlciAqLwotfTsKLQotI2lmbmRlZiBXSU4zMgotI2lmIGRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykgfHwgZGVmaW5lZChfUkVFTlRSQU5UKQotCi0jZGVmaW5lIF9fTkVUREJfTUFYQUxJQVNFUwkzNQotI2RlZmluZSBfX05FVERCX01BWEFERFJTCTM1Ci0KLS8qCi0gKiBFcnJvciByZXR1cm4gY29kZXMgZnJvbSBnZXRob3N0YnluYW1lKCkgYW5kIGdldGhvc3RieWFkZHIoKQotICogKGxlZnQgaW4gZXh0ZXJuIGludCBoX2Vycm5vKS4KLSAqLwotI2RlZmluZSBoX2Vycm5vCQkoKl9faF9lcnJub19sb2NhdGlvbiAoKSkKLSNlbHNlCi1leHRlcm4gaW50IGhfZXJybm87Ci0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lCU5FVERCX0lOVEVSTkFMIC0xIC8qIHNlZSBlcnJubyAqLwotI2RlZmluZQlORVREQl9TVUNDRVNTICAgMCAvKiBubyBwcm9ibGVtICovCi0KLS8vI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0KLXZvaWQJCWVuZGhvc3RlbnQgKHZvaWQpOwotdm9pZAkJZW5kbmV0ZW50ICh2b2lkKTsKLXZvaWQJCWVuZHByb3RvZW50ICh2b2lkKTsKLXZvaWQJCWVuZHNlcnZlbnQgKHZvaWQpOwotdm9pZAkJZW5kcnBjZW50ICh2b2lkKTsKLXN0cnVjdCBob3N0ZW50CSpnZXRob3N0ZW50ICh2b2lkKTsKLXN0cnVjdCBuZXRlbnQJKmdldG5ldGJ5YWRkciAobG9uZywgaW50KTsgLyogdV9sb25nPyAqLwotc3RydWN0IG5ldGVudAkqZ2V0bmV0YnluYW1lIChjb25zdCBjaGFyICopOwotc3RydWN0IG5ldGVudAkqZ2V0bmV0ZW50ICh2b2lkKTsKLXN0cnVjdCBwcm90b2VudAkqZ2V0cHJvdG9lbnQgKHZvaWQpOwotc3RydWN0IHNlcnZlbnQJKmdldHNlcnZlbnQgKHZvaWQpOwotc3RydWN0IHJwY2VudAkqZ2V0cnBjZW50ICh2b2lkKTsKLXN0cnVjdCBycGNlbnQJKmdldHJwY2J5bmFtZSAoY29uc3QgY2hhciAqKTsKLXN0cnVjdCBycGNlbnQJKmdldHJwY2J5bnVtYmVyIChpbnQpOwotdm9pZAkJaGVycm9yIChjb25zdCBjaGFyICopOwotdm9pZAkJc2V0aG9zdGVudCAoaW50KTsKLS8qIHZvaWQJCXNldGhvc3RmaWxlIChjb25zdCBjaGFyICopOyAqLwotdm9pZAkJc2V0bmV0ZW50IChpbnQpOwotdm9pZAkJc2V0cHJvdG9lbnQgKGludCk7Ci12b2lkCQlzZXRzZXJ2ZW50IChpbnQpOwotdm9pZAkJc2V0cnBjZW50IChpbnQpOwotCi0jaWYgZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSB8fCBkZWZpbmVkKF9SRUVOVFJBTlQpCi1zdHJ1Y3QgaG9zdGVudAkqZ2V0aG9zdGJ5YWRkcl9yIChjb25zdCBjaGFyICpfX2FkZHIsCi0JCQlpbnQgX19sZW5ndGgsIGludCBfX3R5cGUsCi0JCQlzdHJ1Y3QgaG9zdGVudCAqX19yZXN1bHQsCi0JCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuLCBpbnQgKl9faF9lcnJub3ApOwotc3RydWN0IGhvc3RlbnQJKmdldGhvc3RieW5hbWVfciAoY29uc3QgY2hhciAqIF9fbmFtZSwKLQkJCXN0cnVjdCBob3N0ZW50ICpfX3Jlc3VsdCwgY2hhciAqX19idWZmZXIsCi0JCQlpbnQgX19idWZsZW4sIGludCAqX19oX2Vycm5vcCk7Ci1zdHJ1Y3QgaG9zdGVudAkqZ2V0aG9zdGVudF9yIChzdHJ1Y3QgaG9zdGVudCAqX19yZXN1bHQsCi0JCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuLCBpbnQgKl9faF9lcnJub3ApOwotc3RydWN0IG5ldGVudAkqZ2V0bmV0YnlhZGRyX3IgKGxvbmcgX19uZXQsIGludCBfX3R5cGUsCi0JCQlzdHJ1Y3QgbmV0ZW50ICpfX3Jlc3VsdCwgY2hhciAqX19idWZmZXIsCi0JCQlpbnQgX19idWZsZW4pOwotc3RydWN0IG5ldGVudAkqZ2V0bmV0YnluYW1lX3IgKGNvbnN0IGNoYXIgKiBfX25hbWUsCi0JCQlzdHJ1Y3QgbmV0ZW50ICpfX3Jlc3VsdCwgY2hhciAqX19idWZmZXIsCi0JCQlpbnQgX19idWZsZW4pOwotc3RydWN0IG5ldGVudAkqZ2V0bmV0ZW50X3IgKHN0cnVjdCBuZXRlbnQgKl9fcmVzdWx0LAotCQkJY2hhciAqX19idWZmZXIsIGludCBfX2J1Zmxlbik7Ci1zdHJ1Y3QgcHJvdG9lbnQJKmdldHByb3RvYnluYW1lX3IgKGNvbnN0IGNoYXIgKiBfX25hbWUsCi0JCQlzdHJ1Y3QgcHJvdG9lbnQgKl9fcmVzdWx0LCBjaGFyICpfX2J1ZmZlciwKLQkJCWludCBfX2J1Zmxlbik7Ci1zdHJ1Y3QgcHJvdG9lbnQJKmdldHByb3RvYnludW1iZXJfciAoaW50IF9fcHJvdG8sCi0JCQlzdHJ1Y3QgcHJvdG9lbnQgKl9fcmVzdWx0LCBjaGFyICpfX2J1ZmZlciwKLQkJCWludCBfX2J1Zmxlbik7Ci1zdHJ1Y3QgcHJvdG9lbnQJKmdldHByb3RvZW50X3IgKHN0cnVjdCBwcm90b2VudCAqX19yZXN1bHQsCi0JCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuKTsKLXN0cnVjdCBzZXJ2ZW50CSpnZXRzZXJ2YnluYW1lX3IgKGNvbnN0IGNoYXIgKiBfX25hbWUsCi0JCQljb25zdCBjaGFyICpfX3Byb3RvLCBzdHJ1Y3Qgc2VydmVudCAqX19yZXN1bHQsCi0JCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuKTsKLXN0cnVjdCBzZXJ2ZW50CSpnZXRzZXJ2Ynlwb3J0X3IgKGludCBfX3BvcnQsCi0JCQljb25zdCBjaGFyICpfX3Byb3RvLCBzdHJ1Y3Qgc2VydmVudCAqX19yZXN1bHQsCi0JCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuKTsKLXN0cnVjdCBzZXJ2ZW50CSpnZXRzZXJ2ZW50X3IgKHN0cnVjdCBzZXJ2ZW50ICpfX3Jlc3VsdCwKLQkJCWNoYXIgKl9fYnVmZmVyLCBpbnQgX19idWZsZW4pOwotCi1pbnQgKl9faF9lcnJub19sb2NhdGlvbiAodm9pZCk7Ci0KLSNlbmRpZgotCi0jZW5kaWYgLyogIV9ORVREQl9IXyAqLwpkaWZmIC0tZ2l0IGEvV2luMzIvSW5jbHVkZS9uZXQvcGF0aHMuaCBiL1dpbjMyL0luY2x1ZGUvbmV0L3BhdGhzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4N2RlNGYuLjAwMDAwMDAKLS0tIGEvV2luMzIvSW5jbHVkZS9uZXQvcGF0aHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg5IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICoJQCgjKXBhdGhzLmgJNS4xNSAoQmVya2VsZXkpIDUvMjkvOTEKLSAqLwotCi0jaWZuZGVmIF9QQVRIU19IXwotI2RlZmluZQlfUEFUSFNfSF8KLQotI2lmIDAKLSNkZWZpbmUJX19QQVRIX0VUQ19JTkVUCSIvdXNyL2V0Yy9pbmV0IgotI2Vsc2UKLSNkZWZpbmUJX19QQVRIX0VUQ19JTkVUCSIvZXRjIgotI2VuZGlmCi0KLS8qIERlZmF1bHQgc2VhcmNoIHBhdGguICovCi0jZGVmaW5lCV9QQVRIX0RFRlBBVEgJCSIvdXNyL2xvY2FsL2JpbjovdXNyL2JpbjovYmluOi4iCi0jZGVmaW5lIF9QQVRIX0RFRlBBVEhfUk9PVAkiL3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4iCi0KLSNkZWZpbmUJX1BBVEhfQlNIRUxMCSIvYmluL3NoIgotI2RlZmluZQlfUEFUSF9DT05TT0xFCSIvZGV2L2NvbnNvbGUiCi0jZGVmaW5lCV9QQVRIX0NTSEVMTAkiL2Jpbi9jc2giCi0jZGVmaW5lCV9QQVRIX0RFVkRCCSIvdmFyL3J1bi9kZXYuZGIiCi0jZGVmaW5lCV9QQVRIX0RFVk5VTEwJIi9kZXYvbnVsbCIKLSNkZWZpbmUJX1BBVEhfRFJVTQkiL2Rldi9kcnVtIgotI2RlZmluZQlfUEFUSF9IRVFVSVYJX19QQVRIX0VUQ19JTkVUIi9ob3N0cy5lcXVpdiIKLSNkZWZpbmUJX1BBVEhfS01FTQkiL2Rldi9rbWVtIgotI2RlZmluZQlfUEFUSF9NQUlMRElSCSIvdmFyL3Nwb29sL21haWwiCi0jZGVmaW5lCV9QQVRIX01BTgkiL3Vzci9tYW4iCi0jZGVmaW5lCV9QQVRIX01FTQkiL2Rldi9tZW0iCi0jZGVmaW5lCV9QQVRIX0xPR0lOCSIvYmluL2xvZ2luIgotI2RlZmluZQlfUEFUSF9OT0xPR0lOCSIvZXRjL25vbG9naW4iCi0jZGVmaW5lCV9QQVRIX1NFTkRNQUlMCSIvdXNyL3NiaW4vc2VuZG1haWwiCi0jZGVmaW5lCV9QQVRIX1NIRUxMUwkiL2V0Yy9zaGVsbHMiCi0jZGVmaW5lCV9QQVRIX1RUWQkiL2Rldi90dHkiCi0jZGVmaW5lCV9QQVRIX1VOSVgJIi92bWxpbnV4IgotI2RlZmluZQlfUEFUSF9WSQkiL3Vzci9iaW4vdmkiCi0KLS8qIFByb3ZpZGUgdHJhaWxpbmcgc2xhc2gsIHNpbmNlIG1vc3RseSB1c2VkIGZvciBidWlsZGluZyBwYXRobmFtZXMuICovCi0jZGVmaW5lCV9QQVRIX0RFVgkiL2Rldi8iCi0jZGVmaW5lCV9QQVRIX1RNUAkiL3RtcC8iCi0jZGVmaW5lCV9QQVRIX1ZBUlJVTgkiL3Zhci9ydW4vIgotI2RlZmluZQlfUEFUSF9WQVJUTVAJIi92YXIvdG1wLyIKLQotI2RlZmluZSBfUEFUSF9LTE9HCSIvcHJvYy9rbXNnIgotI2RlZmluZSBfUEFUSF9MT0dDT05GCV9fUEFUSF9FVENfSU5FVCIvc3lzbG9nLmNvbmYiCi0jaWYgMAotI2RlZmluZSBfUEFUSF9MT0dQSUQJX19QQVRIX0VUQ19JTkVUIi9zeXNsb2cucGlkIgotI2Vsc2UKLSNkZWZpbmUgX1BBVEhfTE9HUElECSIvdmFyL3J1bi9zeXNsb2cucGlkIgotI2VuZGlmCi0jZGVmaW5lIF9QQVRIX0xPRwkiL2Rldi9sb2ciCi0jZGVmaW5lIF9QQVRIX0NPTlNPTEUJIi9kZXYvY29uc29sZSIKLQotI2lmIDAKLSNkZWZpbmUgX1BBVEhfVVRNUAkiL3Zhci9hZG0vdXRtcCIKLSNkZWZpbmUgX1BBVEhfV1RNUAkiL3Zhci9hZG0vd3RtcCIKLSNkZWZpbmUgX1BBVEhfTEFTVExPRwkiL3Zhci9hZG0vbGFzdGxvZyIKLSNlbHNlCi0jZGVmaW5lIF9QQVRIX1VUTVAJIi92YXIvcnVuL3V0bXAiCi0jZGVmaW5lIF9QQVRIX1dUTVAJIi92YXIvbG9nL3d0bXAiCi0jZGVmaW5lIF9QQVRIX0xBU1RMT0cJIi92YXIvbG9nL2xhc3Rsb2ciCi0jZW5kaWYKLQotI2RlZmluZSBfUEFUSF9MT0NBTEUJIi91c3IvbGliL2xvY2FsZSIKLQotI2RlZmluZSBfUEFUSF9SV0hPRElSCSIvdmFyL3Nwb29sL3J3aG8iCi0KLSNpZiBfTUlUX1BPU0lYX1RIUkVBRFMKLS8qIEZvciB0aGUgTUlUIHB0aHJlYWRzICovCi0jZGVmaW5lIF9QQVRIX1BUWQkiL2Rldi8iCi0jZGVmaW5lIF9QQVRIX1RaRElSCSIvdXNyL2xpYi96b25laW5mbyIKLSNkZWZpbmUgX1BBVEhfVFpGSUxFCSIvdXNyL2xpYi96b25laW5mby9sb2NhbHRpbWUiCi0jZW5kaWYKLQotI2VuZGlmIC8qICFfUEFUSFNfSF8gKi8KZGlmZiAtLWdpdCBhL1dpbjMyL0luY2x1ZGUvc29ja3N0b3JhZ2UuaCBiL1dpbjMyL0luY2x1ZGUvc29ja3N0b3JhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhZDE5MC4uMDAwMDAwMAotLS0gYS9XaW4zMi9JbmNsdWRlL3NvY2tzdG9yYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi1zdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSB7Ci0jaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQl1X2ludDhfdCBfX3NzX2xlbjsKLQl1X2ludDhfdCBfX3NzX2ZhbWlseTsKLQl1X2ludDhfdCBmaWxsWzEyNl07Ci0jZWxzZQotCXVfaW50OF90IF9fc3NfZmFtaWx5OwotCXVfaW50OF90IGZpbGxbMTI3XTsKLSNlbmRpZiAvKiBIQVZFX1NPQ0tBRERSX1NBX0xFTiAqLwotfTsKZGlmZiAtLWdpdCBhL1dpbjMyL1Byai9saWJwY2FwLmRzcCBiL1dpbjMyL1Byai9saWJwY2FwLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4MjEyMi4uMDAwMDAwMAotLS0gYS9XaW4zMi9QcmovbGlicGNhcC5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJsaWJwY2FwIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQKLQotQ0ZHPWxpYnBjYXAgLSBXaW4zMiBEZWJ1ZwotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRQotIU1FU1NBR0UgTk1BS0UgL2YgImxpYnBjYXAubWFrIi4KLSFNRVNTQUdFCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFCi0hTUVTU0FHRSBOTUFLRSAvZiAibGlicGNhcC5tYWsiIENGRz0ibGlicGNhcCAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UKLSFNRVNTQUdFICJsaWJwY2FwIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCi0hTUVTU0FHRSAibGlicGNhcCAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikKLSFNRVNTQUdFCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDAKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImxpYnBjYXAgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0kgIi4uLy4uLyIgL0kgIi4uLy4uL2xibC8iIC9JICIuLi8uLi9icGYvIiAvSSAiLi4vaW5jbHVkZS8iIC9JICIuLi8uLi8uLi8uLi9jb21tb24iIC9JICIuLi8uLi8uLi8uLi9kYWcvaW5jbHVkZSIgL0kgIi4uLy4uLy4uLy4uL2RhZy9kcnYvd2luZG93cyIgL0QgIk5ERUJVRyIgL0QgIllZX05FVkVSX0lOVEVSQUNUSVZFIiAvRCB5eWx2YWw9cGNhcF9sdmFsIC9EICJfVVNSRExMIiAvRCAiTElCUENBUF9FWFBPUlRTIiAvRCAiSEFWRV9TVFJFUlJPUiIgL0QgIl9fU1REQ19fIiAvRCAiSU5FVDYiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiSEFWRV9BRERSSU5GTyIgL0QgIldJTjMyIiAvRCBfVV89IC9EICJIQVZFX1NOUFJJTlRGIiAvRCAiSEFWRV9WU05QUklOVEYiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJQjMyPWxpbmsuZXhlIC1saWIKLSMgQUREIEJBU0UgTElCMzIgL25vbG9nbwotIyBBREQgTElCMzIgL25vbG9nbwotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAibGlicGNhcCAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWkkgL09kIC9JICIuLi8uLi8iIC9JICIuLi8uLi9sYmwvIiAvSSAiLi4vLi4vYnBmLyIgL0kgIi4uL2luY2x1ZGUvIiAvSSAiLi4vLi4vLi4vLi4vY29tbW9uIiAvSSAiLi4vLi4vLi4vLi4vZGFnL2luY2x1ZGUiIC9JICIuLi8uLi8uLi8uLi9kYWcvZHJ2L3dpbmRvd3MiIC9EICJfREVCVUciIC9EICJZWV9ORVZFUl9JTlRFUkFDVElWRSIgL0QgeXlsdmFsPXBjYXBfbHZhbCAvRCAiX1VTUkRMTCIgL0QgIkxJQlBDQVBfRVhQT1JUUyIgL0QgIkhBVkVfU1RSRVJST1IiIC9EICJfX1NURENfXyIgL0QgIklORVQ2IiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIkhBVkVfQUREUklORk8iIC9EICJXSU4zMiIgL0QgX1VfPSAvRCAiSEFWRV9TTlBSSU5URiIgL0QgIkhBVkVfVlNOUFJJTlRGIiAvWVggL0ZEIC9HWiAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElCMzI9bGluay5leGUgLWxpYgotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvCi0jIEFERCBMSUIzMiAvbm9sb2dvCi0KLSFFTkRJRgotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImxpYnBjYXAgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJsaWJwY2FwIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxicGZfZHVtcC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cYnBmXG5ldFxicGZfZmlsdGVyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxicGZfaW1hZ2UuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXGV0aGVyZW50LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iLi5cLi5cZmFkLXdpbjMyLmMiCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cU3JjXGZmcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cZ2VuY29kZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cU3JjXGdldG5ldGJ5bm0uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXFNyY1xnZXRuZXRlbnQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXFNyY1xnZXRzZXJ2ZW50LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxncmFtbWFyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxpbmV0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxTcmNcaW5ldF9hdG9uLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxTcmNcaW5ldF9uZXQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXFNyY1xpbmV0X3B0b24uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXG5hbWV0b2FkZHIuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXG9wdGltaXplLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0iLi5cLi5cUGNhcC13aW4zMi5jIgotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHBjYXAuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXHNhdmVmaWxlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxzY2FubmVyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL1dpbjMyL1Byai9saWJwY2FwLmRzdyBiL1dpbjMyL1Byai9saWJwY2FwLmRzdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkZmYyZC4uMDAwMDAwMAotLS0gYS9XaW4zMi9QcmovbGlicGNhcC5kc3cKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1NaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAotIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSEKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm9qZWN0OiAibGlicGNhcCI9Ii5cbGlicGNhcC5kc3AiIC0gUGFja2FnZSBPd25lcj08ND4KLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDQ+Ci17e3sKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUdsb2JhbDoKLQotUGFja2FnZT08NT4KLXt7ewotfX19Ci0KLVBhY2thZ2U9PDM+Ci17e3sKLX19fQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KZGlmZiAtLWdpdCBhL1dpbjMyL1Byai93cGNhcC5zbG4gYi9XaW4zMi9Qcmovd3BjYXAuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWZjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9XaW4zMi9Qcmovd3BjYXAuc2xuCkBAIC0wLDAgKzEsMjggQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTIuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEzCitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTIuMC40MDYyOS4wCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ3cGNhcCIsICJ3cGNhcC52Y3hwcm9qIiwgIns4RTkyRDg0MC02QTM2LTQ1MkEtQTEzQy02RTFCQTVBMkM1QTl9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7OEU5MkQ4NDAtNkEzNi00NTJBLUExM0MtNkUxQkE1QTJDNUE5fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7OEU5MkQ4NDAtNkEzNi00NTJBLUExM0MtNkUxQkE1QTJDNUE5fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezhFOTJEODQwLTZBMzYtNDUyQS1BMTNDLTZFMUJBNUEyQzVBOX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NAorCQl7OEU5MkQ4NDAtNkEzNi00NTJBLUExM0MtNkUxQkE1QTJDNUE5fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NAorCQl7OEU5MkQ4NDAtNkEzNi00NTJBLUExM0MtNkUxQkE1QTJDNUE5fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezhFOTJEODQwLTZBMzYtNDUyQS1BMTNDLTZFMUJBNUEyQzVBOX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7OEU5MkQ4NDAtNkEzNi00NTJBLUExM0MtNkUxQkE1QTJDNUE5fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NAorCQl7OEU5MkQ4NDAtNkEzNi00NTJBLUExM0MtNkUxQkE1QTJDNUE5fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9XaW4zMi9Qcmovd3BjYXAudmN4cHJvaiBiL1dpbjMyL1Byai93cGNhcC52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjMzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9XaW4zMi9Qcmovd3BjYXAudmN4cHJvagpAQCAtMCwwICsxLDIzNCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSIxMi4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFNjY1Byb2plY3ROYW1lIC8+CisgICAgPFNjY0xvY2FsUGF0aCAvPgorICAgIDxQcm9qZWN0R3VpZD57OEU5MkQ4NDAtNkEzNi00NTJBLUExM0MtNkUxQkE1QTJDNUE5fTwvUHJvamVjdEd1aWQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEyMDwvUGxhdGZvcm1Ub29sc2V0PgorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEyMDwvUGxhdGZvcm1Ub29sc2V0PgorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMjA8L1BsYXRmb3JtVG9vbHNldD4KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djEyMDwvUGxhdGZvcm1Ub29sc2V0PgorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpTWljcm9zb2Z0LkNwcC5VcGdyYWRlRnJvbVZDNjAucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKU1pY3Jvc29mdC5DcHAuVXBncmFkZUZyb21WQzYwLnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpTWljcm9zb2Z0LkNwcC5VcGdyYWRlRnJvbVZDNjAucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpTWljcm9zb2Z0LkNwcC5VcGdyYWRlRnJvbVZDNjAucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8T3V0RGlyPi5cUmVsZWFzZVw8L091dERpcj4KKyAgICA8SW50RGlyPi5cUmVsZWFzZVw8L0ludERpcj4KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+CisgICAgPEluY2x1ZGVQYXRoPi4uLy4uLy4uLzskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8SW5jbHVkZVBhdGg+Li4vLi4vLi4vOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPE91dERpcj4uXERlYnVnXDwvT3V0RGlyPgorICAgIDxJbnREaXI+LlxEZWJ1Z1w8L0ludERpcj4KKyAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8SW5jbHVkZVBhdGg+Li4vLi4vLi4vOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxJbmNsdWRlUGF0aD4uLi8uLi8uLi87JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+RGVmYXVsdDwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+CisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li4vLi4vOy4uLy4uL2xibC87Li4vLi4vYnBmLzsuLi9pbmNsdWRlLzsuLi8uLi8uLi8uLi9jb21tb247Li4vLi4vLi4vLi4vZGFnL2luY2x1ZGU7Li4vLi4vLi4vLi4vZGFnL2Rydi93aW5kb3dzOy4uLy4uLy4uL1dpbjMyLUV4dGVuc2lvbnM7Li87V2luMzItRXh0ZW5zaW9uczslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfVkVSU0lPTl9IO19fU1REQ19WRVJTSU9OX189MTk5OTAxTDtIQVZFX1BBQ0tFVF9JU19MT09QQkFDS19BREFQVEVSO05ERUJVRztZWV9ORVZFUl9JTlRFUkFDVElWRTtfVVNSRExMO0JVSUxESU5HX1BDQVA7SEFWRV9TVFJFUlJPUjtfX1NURENfXztJTkVUNjtfV0lORE9XUztIQVZFX0FERFJJTkZPO0hBVkVfUkVNT1RFO1dJTjMyO19VXz07WVlfTk9fVU5JU1REX0g7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxSZXNvdXJjZUNvbXBpbGU+CisgICAgICA8Q3VsdHVyZT4weDA0MDk8L0N1bHR1cmU+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPndzMl8zMi5saWI7Li5cLi5cLi5cLi5ccGFja2V0V2luN1xEbGxcUHJvamVjdFxSZWxlYXNlIE5vIE5ldE1vbiBhbmQgQWlyUGNhcFxQYWNrZXQubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgPC9MaW5rPgorICAgIDxQcmVCdWlsZEV2ZW50PgorICAgICAgPENvbW1hbmQ+Y2FsbCAuLlwuLlxHZW5WZXJzaW9uLmJhdCAuLlwuLlxWRVJTSU9OIC4uXC4uXHBjYXBfdmVyc2lvbi5oLmluIC4uXC4uXHBjYXBfdmVyc2lvbi5oCit3aW5fZmxleCAtUHBjYXBfIC03IC0tb3V0ZmlsZT0uLlwuLlxzY2FubmVyLmMgLS1oZWFkZXItZmlsZT0uLlwuLlxzY2FubmVyLmggLi5cLi5cc2Nhbm5lci5sCit3aW5fYmlzb24gLXBwY2FwXyAtLXlhY2MgLS1vdXRwdXQ9Li5cLi5cZ3JhbW1hci5jIC0tZGVmaW5lcyAuLlwuLlxncmFtbWFyLnk8L0NvbW1hbmQ+CisgICAgPC9QcmVCdWlsZEV2ZW50PgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkRlZmF1bHQ8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPgorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLy4uLzsuLi8uLi9sYmwvOy4uLy4uL2JwZi87Li4vaW5jbHVkZS87Li4vLi4vLi4vLi4vY29tbW9uOy4uLy4uLy4uLy4uL2RhZy9pbmNsdWRlOy4uLy4uLy4uLy4uL2RhZy9kcnYvd2luZG93czsuLi8uLi8uLi9XaW4zMi1FeHRlbnNpb25zOy4vO1dpbjMyLUV4dGVuc2lvbnM7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX1ZFUlNJT05fSDtfX1NURENfVkVSU0lPTl9fPTE5OTkwMUw7SEFWRV9QQUNLRVRfSVNfTE9PUEJBQ0tfQURBUFRFUjtOREVCVUc7WVlfTkVWRVJfSU5URVJBQ1RJVkU7X1VTUkRMTDtCVUlMRElOR19QQ0FQO0hBVkVfU1RSRVJST1I7X19TVERDX187SU5FVDY7X1dJTkRPV1M7SEFWRV9BRERSSU5GTztIQVZFX1JFTU9URTtXSU4zMjtfVV89O1lZX05PX1VOSVNURF9IOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8UmVzb3VyY2VDb21waWxlPgorICAgICAgPEN1bHR1cmU+MHgwNDA5PC9DdWx0dXJlPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgPC9SZXNvdXJjZUNvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz53czJfMzIubGliOy4uXC4uXC4uXC4uXHBhY2tldFdpbjdcRGxsXFByb2plY3RceDY0XFJlbGVhc2UgTm8gTmV0TW9uIGFuZCBBaXJQY2FwXFBhY2tldC5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICA8L0xpbms+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgICA8Q29tbWFuZD5jYWxsIC4uXC4uXEdlblZlcnNpb24uYmF0IC4uXC4uXFZFUlNJT04gLi5cLi5ccGNhcF92ZXJzaW9uLmguaW4gLi5cLi5ccGNhcF92ZXJzaW9uLmgKK3dpbl9mbGV4IC1QcGNhcF8gLTcgLS1vdXRmaWxlPS4uXC4uXHNjYW5uZXIuYyAtLWhlYWRlci1maWxlPS4uXC4uXHNjYW5uZXIuaCAuLlwuLlxzY2FubmVyLmwKK3dpbl9iaXNvbiAtcHBjYXBfIC0teWFjYyAtLW91dHB1dD0uLlwuLlxncmFtbWFyLmMgLS1kZWZpbmVzIC4uXC4uXGdyYW1tYXIueTwvQ29tbWFuZD4KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5EZWZhdWx0PC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+CisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5FZGl0QW5kQ29udGludWU8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLi8uLi87Li4vLi4vbGJsLzsuLi8uLi9icGYvOy4uL2luY2x1ZGUvOy4uLy4uLy4uLy4uL2NvbW1vbjsuLi8uLi8uLi8uLi9kYWcvaW5jbHVkZTsuLi8uLi8uLi8uLi9kYWcvZHJ2L3dpbmRvd3M7Li4vLi4vLi4vV2luMzItRXh0ZW5zaW9uczsuLztXaW4zMi1FeHRlbnNpb25zOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9WRVJTSU9OX0g7X19TVERDX1ZFUlNJT05fXz0xOTk5MDFMO0hBVkVfUEFDS0VUX0lTX0xPT1BCQUNLX0FEQVBURVI7X0RFQlVHO1lZX05FVkVSX0lOVEVSQUNUSVZFO19VU1JETEw7QlVJTERJTkdfUENBUDtIQVZFX1NUUkVSUk9SO19fU1REQ19fO0lORVQ2O19XSU5ET1dTO0hBVkVfQUREUklORk87SEFWRV9SRU1PVEU7V0lOMzI7X1VfPTtZWV9OT19VTklTVERfSDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8UmVzb3VyY2VDb21waWxlPgorICAgICAgPEN1bHR1cmU+MHgwNDA5PC9DdWx0dXJlPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgPC9SZXNvdXJjZUNvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz53czJfMzIubGliOy4uXC4uXC4uXC4uXHBhY2tldFdpbjdcRGxsXFByb2plY3RcUmVsZWFzZSBObyBOZXRNb24gYW5kIEFpclBjYXBcUGFja2V0LmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgorICAgIDwvTGluaz4KKyAgICA8UHJlQnVpbGRFdmVudD4KKyAgICAgIDxDb21tYW5kPmNhbGwgLi5cLi5cR2VuVmVyc2lvbi5iYXQgLi5cLi5cVkVSU0lPTiAuLlwuLlxwY2FwX3ZlcnNpb24uaC5pbiAuLlwuLlxwY2FwX3ZlcnNpb24uaAord2luX2ZsZXggLVBwY2FwXyAtNyAtLW91dGZpbGU9Li5cLi5cc2Nhbm5lci5jIC0taGVhZGVyLWZpbGU9Li5cLi5cc2Nhbm5lci5oIC4uXC4uXHNjYW5uZXIubAord2luX2Jpc29uIC1wcGNhcF8gLS15YWNjIC0tb3V0cHV0PS4uXC4uXGdyYW1tYXIuYyAtLWRlZmluZXMgLi5cLi5cZ3JhbW1hci55PC9Db21tYW5kPgorICAgIDwvUHJlQnVpbGRFdmVudD4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5EZWZhdWx0PC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz5mYWxzZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLi8uLi87Li4vLi4vbGJsLzsuLi8uLi9icGYvOy4uL2luY2x1ZGUvOy4uLy4uLy4uLy4uL2NvbW1vbjsuLi8uLi8uLi8uLi9kYWcvaW5jbHVkZTsuLi8uLi8uLi8uLi9kYWcvZHJ2L3dpbmRvd3M7Li4vLi4vLi4vV2luMzItRXh0ZW5zaW9uczsuLztXaW4zMi1FeHRlbnNpb25zOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9WRVJTSU9OX0g7X19TVERDX1ZFUlNJT05fXz0xOTk5MDFMO0hBVkVfUEFDS0VUX0lTX0xPT1BCQUNLX0FEQVBURVI7X0RFQlVHO1lZX05FVkVSX0lOVEVSQUNUSVZFO19VU1JETEw7QlVJTERJTkdfUENBUDtIQVZFX1NUUkVSUk9SO19fU1REQ19fO0lORVQ2O19XSU5ET1dTO0hBVkVfQUREUklORk87SEFWRV9SRU1PVEU7V0lOMzI7X1VfPTtZWV9OT19VTklTVERfSDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkVuYWJsZUZhc3RDaGVja3M8L0Jhc2ljUnVudGltZUNoZWNrcz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8UmVzb3VyY2VDb21waWxlPgorICAgICAgPEN1bHR1cmU+MHgwNDA5PC9DdWx0dXJlPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgPC9SZXNvdXJjZUNvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz53czJfMzIubGliOy4uXC4uXC4uXC4uXHBhY2tldFdpbjdcRGxsXFByb2plY3RceDY0XFJlbGVhc2UgTm8gTmV0TW9uIGFuZCBBaXJQY2FwXFBhY2tldC5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICA8L0xpbms+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgICA8Q29tbWFuZD5jYWxsIC4uXC4uXEdlblZlcnNpb24uYmF0IC4uXC4uXFZFUlNJT04gLi5cLi5ccGNhcF92ZXJzaW9uLmguaW4gLi5cLi5ccGNhcF92ZXJzaW9uLmgKK3dpbl9mbGV4IC1QcGNhcF8gLTcgLS1vdXRmaWxlPS4uXC4uXHNjYW5uZXIuYyAtLWhlYWRlci1maWxlPS4uXC4uXHNjYW5uZXIuaCAuLlwuLlxzY2FubmVyLmwKK3dpbl9iaXNvbiAtcHBjYXBfIC0teWFjYyAtLW91dHB1dD0uLlwuLlxncmFtbWFyLmMgLS1kZWZpbmVzIC4uXC4uXGdyYW1tYXIueTwvQ29tbWFuZD4KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGJwZlxuZXRcYnBmX2ZpbHRlci5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cYnBmX2R1bXAuYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGJwZl9pbWFnZS5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZXRoZXJlbnQuYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGZhZC1oZWxwZXJzLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW5jb2RlLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxncmFtbWFyLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxpbmV0LmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaXNzaW5nXHdpbl9zbnByaW50Zi5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbmFtZXRvYWRkci5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cb3B0aW1pemUuYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHBjYXAtY29tbW9uLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxwY2FwLW5ldy5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5ccGNhcC1ycGNhcC5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5ccGNhcC13aW4zMi5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5ccGNhcC5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cc2F2ZWZpbGUuYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHNjYW5uZXIuYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHNmLXBjYXAtbmcuYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHNmLXBjYXAuYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHNvY2t1dGlscy5jIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHBjYXAtY29tbW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxwY2FwLWludC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5ccGNhcC1ycGNhcC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5ccGNhcC1zdGRpbmMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHBjYXAuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHJlbW90ZS1leHQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHNvY2t1dGlscy5oIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXFdpbjMyLUV4dGVuc2lvbnNcdmVyc2lvbi5yYyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvV2luMzIvUHJqL3dwY2FwLnZjeHByb2ouZmlsdGVycyBiL1dpbjMyL1Byai93cGNhcC52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmMTQ5MgotLS0gL2Rldi9udWxsCisrKyBiL1dpbjMyL1Byai93cGNhcC52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSwxMDcgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxicGZfZHVtcC5jIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxicGZcbmV0XGJwZl9maWx0ZXIuYyI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cYnBmX2ltYWdlLmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGV0aGVyZW50LmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGdlbmNvZGUuYyI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ3JhbW1hci5jIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxpbmV0LmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG5hbWV0b2FkZHIuYyI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cb3B0aW1pemUuYyI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5ccGNhcC5jIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxwY2FwLXdpbjMyLmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHNhdmVmaWxlLmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHNjYW5uZXIuYyI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cc2YtcGNhcC5jIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxzZi1wY2FwLW5nLmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHBjYXAtY29tbW9uLmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXGZhZC1oZWxwZXJzLmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pc3Npbmdcd2luX3NucHJpbnRmLmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHBjYXAtbmV3LmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHBjYXAtcnBjYXAuYyI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cc29ja3V0aWxzLmMiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2M1MWRjZTVlLTBkYTktNGUzMy1hMjM1LWQ1Yzc2Yzc2NDg1Y308L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezVlYzlmZDRiLTEwYjUtNDUyNy1iMjQ5LTU2YjUzZDg0NGZiMX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJSZXNvdXJjZSBGaWxlcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzkwODg2ZjAtODk3My00MzZiLWE3YTEtYjllODgxNTQ0ZjlhfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxwY2FwLXN0ZGluYy5oIj4KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxwY2FwLWNvbW1vbi5oIj4KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxwY2FwLmgiPgorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHBjYXAtaW50LmgiPgorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXHBjYXAtcnBjYXAuaCI+CisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5ccmVtb3RlLWV4dC5oIj4KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlxzb2NrdXRpbHMuaCI+CisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXFdpbjMyLUV4dGVuc2lvbnNcdmVyc2lvbi5yYyI+CisgICAgICA8RmlsdGVyPlJlc291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9SZXNvdXJjZUNvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvV2luMzIvU3JjL2dhaV9zdHJlcnJvci5jIGIvV2luMzIvU3JjL2dhaV9zdHJlcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZjMzVkLi4wMDAwMDAwCi0tLSBhL1dpbjMyL1NyYy9nYWlfc3RyZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0jaW5jbHVkZSA8c3lzL2NkZWZzLmg+Ci0KLV9fRkJTRElEKCIkRnJlZUJTRDogL3JlcG9tYW4vci9uY3ZzL3NyYy9saWIvbGliYy9uZXQvZ2FpX3N0cmVycm9yLmMsdiAxLjEgMjAwNS8wNC8wNiAxMjo0NTo1MSB1bWUgRXhwICQiKTsKLQotKi8KLQotI2lmZGVmIFdJTjMyCi0KLSNpbmNsdWRlIDx3czJ0Y3BpcC5oPgotCi0jZWxzZQotCi0jaW5jbHVkZSA8bmV0ZGIuaD4KLQotI2VuZGlmCi0KLS8qIEVudHJpZXMgRUFJX0FERFJGQU1JTFkgKDEpIGFuZCBFQUlfTk9EQVRBICg3KSBhcmUgb2Jzb2xldGVkLCBidXQgbGVmdCAqLwotLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB1c2VybGFuZCBjb2RlIHByaW9yIHRvIDI1NTNiaXMtMDIgKi8KLXN0YXRpYyBjaGFyICphaV9lcnJsaXN0W10gPSB7Ci0JIlN1Y2Nlc3MiLAkJCQkJLyogMCAqLwotCSJBZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCIsCS8qIDEgKi8KLQkiVGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uIiwJCS8qIEVBSV9BR0FJTiAqLwotCSJJbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyIsCQkJLyogRUFJX0JBREZMQUdTICovCi0JIk5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiIsCS8qIEVBSV9GQUlMICovCi0JImFpX2ZhbWlseSBub3Qgc3VwcG9ydGVkIiwJCQkvKiBFQUlfRkFNSUxZICovCi0JIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiLCAJCQkvKiBFQUlfTUVNT1JZICovCi0JIk5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lIiwJCS8qIDcgKi8KLQkiaG9zdG5hbWUgbm9yIHNlcnZuYW1lIHByb3ZpZGVkLCBvciBub3Qga25vd24iLAkvKiBFQUlfTk9OQU1FICovCi0JInNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlIiwJLyogRUFJX1NFUlZJQ0UgKi8KLQkiYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZCIsIAkJCS8qIEVBSV9TT0NLVFlQRSAqLwotCSJTeXN0ZW0gZXJyb3IgcmV0dXJuZWQgaW4gZXJybm8iLCAJCS8qIEVBSV9TWVNURU0gKi8KLQkiSW52YWxpZCB2YWx1ZSBmb3IgaGludHMiLAkJCS8qIEVBSV9CQURISU5UUyAqLwotCSJSZXNvbHZlZCBwcm90b2NvbCBpcyB1bmtub3duIgkJCS8qIEVBSV9QUk9UT0NPTCAqLwotfTsKLQotI2lmbmRlZiBFQUlfTUFYCi0jZGVmaW5lIEVBSV9NQVggKHNpemVvZihhaV9lcnJsaXN0KS9zaXplb2YoYWlfZXJybGlzdFswXSkpCi0jZW5kaWYKLQotLyogb24gTWluZ1csIGdhaV9zdHJlcnJvciBpcyBhdmFpbGFibGUuCi0gICBXZSBuZWVkIHRvIGNvbXBpbGUgZ2FpX3N0cmVycm9yQSBvbmx5IGZvciBDeWd3aW4KLSAqLwotI2lmbmRlZiBnYWlfc3RyZXJyb3IKLQotY2hhciAqCi1XU0FBUEkgZ2FpX3N0cmVycm9yQShpbnQgZWNvZGUpCi17Ci0JaWYgKGVjb2RlID49IDAgJiYgZWNvZGUgPCBFQUlfTUFYKQotCQlyZXR1cm4gYWlfZXJybGlzdFtlY29kZV07Ci0JcmV0dXJuICJVbmtub3duIGVycm9yIjsKLX0KLQotI2VuZGlmIC8qIGdhaV9zdHJlcnJvciAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1dpbjMyL1NyYy9nZXRhZGRyaW5mby5jIGIvV2luMzIvU3JjL2dldGFkZHJpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZWJkYTAuLjAwMDAwMDAKLS0tIGEvV2luMzIvU3JjL2dldGFkZHJpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiAiI2lmZGVmIEZBSVRIIiBwYXJ0IGlzIGxvY2FsIGhhY2sgZm9yIHN1cHBvcnRpbmcgSVB2NC12NiB0cmFuc2xhdG9yLgotICoKLSAqIElzc3VlcyB0byBiZSBkaXNjdXNzZWQ6Ci0gKiAtIFRocmVhZCBzYWZlLW5lc3MgbXVzdCBiZSBjaGVja2VkLgotICogLSBSZXR1cm4gdmFsdWVzLiAgVGhlcmUgYXJlIG5vbnN0YW5kYXJkIHJldHVybiB2YWx1ZXMgZGVmaW5lZCBhbmQgdXNlZAotICogICBpbiB0aGUgc291cmNlIGNvZGUuICBUaGlzIGlzIGJlY2F1c2UgUkZDMjU1MyBpcyBzaWxlbnQgYWJvdXQgd2hpY2ggZXJyb3IKLSAqICAgY29kZSBtdXN0IGJlIHJldHVybmVkIGZvciB3aGljaCBzaXR1YXRpb24uCi0gKiBOb3RlOgotICogLSBXZSB1c2UgZ2V0aXBub2RlYnluYW1lKCkganVzdCBmb3IgdGhyZWFkLXNhZmVuZXNzLiAgVGhlcmUncyBubyBpbnRlbnQKLSAqICAgdG8gbGV0IGl0IGRvIFBGX1VOU1BFQyAoYWN0dWFsbHkgd2UgbmV2ZXIgcGFzcyBQRl9VTlNQRUMgdG8KLSAqICAgZ2V0aXBub2RlYnluYW1lKCkuCi0gKiAtIFRoZSBjb2RlIGZpbHRlcnMgb3V0IEFGcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwsCi0gKiAgIHdoZW4gZ2xvYmJpbmcgTlVMTCBob3N0bmFtZSAodG8gbG9vcGJhY2ssIG9yIHdpbGRjYXJkKS4gIElzIGl0IHRoZSByaWdodAotICogICB0aGluZyB0byBkbz8gIFdoYXQgaXMgdGhlIHJlbGF0aW9uc2hpcCB3aXRoIHBvc3QtUkZDMjU1MyBBSV9BRERSQ09ORklHCi0gKiAgIGluIGFpX2ZsYWdzPwotICovCi0KLS8qCi0gKiBNaW5ndzY0IGhhcyBpdHMgb3duIGltcGxlbWVudGF0aW9uIG9mIGdldGFkZHJpbmZvLCBtaW5ndzMyIG5vCi0gKi8KLSNpZm5kZWYgX19NSU5HVzY0X18KLQotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgotI2lmIDAKLSNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+Ci0jZW5kaWYKLSNpZm5kZWYgX19NSU5HVzMyX18KLSNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZuZGVmIEhBVkVfUE9SVEFCTEVfUFJPVE9UWVBFCi0jaW5jbHVkZSAiY2RlY2xfZXh0LmgiCi0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1VfSU5UMzJfVAotI2luY2x1ZGUgImJpdHR5cGVzLmgiCi0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NPQ0tBRERSX1NUT1JBR0UKLSNpZm5kZWYgX19NSU5HVzMyX18KLSNpbmNsdWRlICJzb2Nrc3RvcmFnZS5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfQUREUklORk9fSAotI2luY2x1ZGUgImFkZHJpbmZvLmgiCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlICJpcDZfbWlzYy5oIgotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZChfX0tBTUVfXykgJiYgZGVmaW5lZChJTkVUNikKLSMgZGVmaW5lIEZBSVRICi0jZW5kaWYKLQotI2RlZmluZSBTVUNDRVNTIDAKLSNkZWZpbmUgQU5ZIDAKLSNkZWZpbmUgWUVTIDEKLSNkZWZpbmUgTk8gIDAKLQotI2lmZGVmIEZBSVRICi1zdGF0aWMgaW50IHRyYW5zbGF0ZSA9IE5POwotc3RhdGljIHN0cnVjdCBpbjZfYWRkciBmYWl0aF9wcmVmaXggPSBJTjZBRERSX0FOWV9JTklUOwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBjaGFyIGluX2FkZHJhbnlbXSA9IHsgMCwgMCwgMCwgMCB9Owotc3RhdGljIGNvbnN0IGNoYXIgaW42X2FkZHJhbnlbXSA9IHsKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19Owotc3RhdGljIGNvbnN0IGNoYXIgaW5fbG9vcGJhY2tbXSA9IHsgMTI3LCAwLCAwLCAxIH07Ci1zdGF0aWMgY29uc3QgY2hhciBpbjZfbG9vcGJhY2tbXSA9IHsKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxCi19OwotCi1zdHJ1Y3Qgc29ja2luZXQgewotCXVfY2hhcglzaV9sZW47Ci0JdV9jaGFyCXNpX2ZhbWlseTsKLQl1X3Nob3J0CXNpX3BvcnQ7Ci0JdV9pbnQzMl90IHNpX3Njb3BlX2lkOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhZmQgewotCWludCBhX2FmOwotCWludCBhX2FkZHJsZW47Ci0JaW50IGFfc29ja2xlbjsKLQlpbnQgYV9vZmY7Ci0JY29uc3QgY2hhciAqYV9hZGRyYW55OwotCWNvbnN0IGNoYXIgKmFfbG9vcGJhY2s7Ci0JaW50IGFfc2NvcGVkOwotfSBhZmRsIFtdID0gewotI2lmZGVmIElORVQ2Ci0Je1BGX0lORVQ2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKLQkgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLAotCSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW42LCBzaW42X2FkZHIpLAotCSBpbjZfYWRkcmFueSwgaW42X2xvb3BiYWNrLCAxfSwKLSNlbmRpZgotCXtQRl9JTkVULCBzaXplb2Yoc3RydWN0IGluX2FkZHIpLAotCSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSwKLQkgb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luLCBzaW5fYWRkciksCi0JIGluX2FkZHJhbnksIGluX2xvb3BiYWNrLCAwfSwKLQl7MCwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgMH0sCi19OwotCi1zdHJ1Y3QgZXhwbG9yZSB7Ci0JaW50IGVfYWY7Ci0JaW50IGVfc29ja3R5cGU7Ci0JaW50IGVfcHJvdG9jb2w7Ci0JY29uc3QgY2hhciAqZV9wcm90b3N0cjsKLQlpbnQgZV93aWxkOwotI2RlZmluZSBXSUxEX0FGKGV4KQkJKChleCktPmVfd2lsZCAmIDB4MDEpCi0jZGVmaW5lIFdJTERfU09DS1RZUEUoZXgpCSgoZXgpLT5lX3dpbGQgJiAweDAyKQotI2RlZmluZSBXSUxEX1BST1RPQ09MKGV4KQkoKGV4KS0+ZV93aWxkICYgMHgwNCkKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwbG9yZSBleHBsb3JlW10gPSB7Ci0jaWYgMAotCXsgUEZfTE9DQUwsIDAsIEFOWSwgQU5ZLCBOVUxMLCAweDAxIH0sCi0jZW5kaWYKLSNpZmRlZiBJTkVUNgotCXsgUEZfSU5FVDYsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAidWRwIiwgMHgwNyB9LAotCXsgUEZfSU5FVDYsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgInRjcCIsIDB4MDcgfSwKLQl7IFBGX0lORVQ2LCBTT0NLX1JBVywgQU5ZLCBOVUxMLCAweDA1IH0sCi0jZW5kaWYKLQl7IFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAidWRwIiwgMHgwNyB9LAotCXsgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAidGNwIiwgMHgwNyB9LAotCXsgUEZfSU5FVCwgU09DS19SQVcsIEFOWSwgTlVMTCwgMHgwNSB9LAotCXsgLTEsIDAsIDAsIE5VTEwsIDAgfSwKLX07Ci0KLSNpZmRlZiBJTkVUNgotI2RlZmluZSBQVE9OX01BWAkxNgotI2Vsc2UKLSNkZWZpbmUgUFRPTl9NQVgJNAotI2VuZGlmCi0KLQotc3RhdGljIGludCBzdHJfaXNudW1iZXIgX19QKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgZXhwbG9yZV9mcWRuIF9fUCgoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwKLQljb25zdCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqKikpOwotc3RhdGljIGludCBleHBsb3JlX251bGwgX19QKChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqLAotCWNvbnN0IGNoYXIgKiwgc3RydWN0IGFkZHJpbmZvICoqKSk7Ci1zdGF0aWMgaW50IGV4cGxvcmVfbnVtZXJpYyBfX1AoKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICosCi0JY29uc3QgY2hhciAqLCBzdHJ1Y3QgYWRkcmluZm8gKiopKTsKLXN0YXRpYyBpbnQgZXhwbG9yZV9udW1lcmljX3Njb3BlIF9fUCgoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwKLQljb25zdCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqKikpOwotc3RhdGljIGludCBnZXRfbmFtZSBfX1AoKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IGFmZCAqLCBzdHJ1Y3QgYWRkcmluZm8gKiosCi0JY2hhciAqLCBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGdldF9jYW5vbm5hbWUgX19QKChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwKLQlzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGFkZHJpbmZvICpnZXRfYWkgX19QKChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwKLQljb25zdCBzdHJ1Y3QgYWZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBnZXRfcG9ydG1hdGNoIF9fUCgoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBnZXRfcG9ydCBfX1AoKHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBhZmQgKmZpbmRfYWZkIF9fUCgoaW50KSk7Ci0KLXN0YXRpYyBjaGFyICphaV9lcnJsaXN0W10gPSB7Ci0JIlN1Y2Nlc3MiLAotCSJBZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCIsCS8qIEVBSV9BRERSRkFNSUxZICovCi0JIlRlbXBvcmFyeSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiIsCQkvKiBFQUlfQUdBSU4gICAgICAqLwotCSJJbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyIsCQkgICAgICAgCS8qIEVBSV9CQURGTEFHUyAgICovCi0JIk5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiIsIAkvKiBFQUlfRkFJTCAgICAgICAqLwotCSJhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCIsCQkJLyogRUFJX0ZBTUlMWSAgICAgKi8KLQkiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIsIAkJCS8qIEVBSV9NRU1PUlkgICAgICovCi0JIk5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lIiwgCQkvKiBFQUlfTk9EQVRBICAgICAqLwotCSJob3N0bmFtZSBub3Igc2Vydm5hbWUgcHJvdmlkZWQsIG9yIG5vdCBrbm93biIsCS8qIEVBSV9OT05BTUUgICAgICovCi0JInNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlIiwJLyogRUFJX1NFUlZJQ0UgICAgKi8KLQkiYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZCIsIAkJCS8qIEVBSV9TT0NLVFlQRSAgICovCi0JIlN5c3RlbSBlcnJvciByZXR1cm5lZCBpbiBlcnJubyIsIAkJLyogRUFJX1NZU1RFTSAgICAgKi8KLQkiSW52YWxpZCB2YWx1ZSBmb3IgaGludHMiLAkJCS8qIEVBSV9CQURISU5UUwkgICovCi0JIlJlc29sdmVkIHByb3RvY29sIGlzIHVua25vd24iLAkJCS8qIEVBSV9QUk9UT0NPTCAgICovCi0JIlVua25vd24gZXJyb3IiLCAJCQkJLyogRUFJX01BWCAgICAgICAgKi8KLX07Ci0KLS8qIFhYWCBtYWNyb3MgdGhhdCBtYWtlIGV4dGVybmFsIHJlZmVyZW5jZSBpcyBCQUQuICovCi0KLSNkZWZpbmUgR0VUX0FJKGFpLCBhZmQsIGFkZHIpIFwKLWRvIHsgXAotCS8qIGV4dGVybmFsIHJlZmVyZW5jZTogcGFpLCBlcnJvciwgYW5kIGxhYmVsIGZyZWUgKi8gXAotCShhaSkgPSBnZXRfYWkocGFpLCAoYWZkKSwgKGFkZHIpKTsgXAotCWlmICgoYWkpID09IE5VTEwpIHsgXAotCQllcnJvciA9IEVBSV9NRU1PUlk7IFwKLQkJZ290byBmcmVlOyBcCi0JfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEdFVF9QT1JUKGFpLCBzZXJ2KSBcCi1kbyB7IFwKLQkvKiBleHRlcm5hbCByZWZlcmVuY2U6IGVycm9yIGFuZCBsYWJlbCBmcmVlICovIFwKLQllcnJvciA9IGdldF9wb3J0KChhaSksIChzZXJ2KSwgMCk7IFwKLQlpZiAoZXJyb3IgIT0gMCkgXAotCQlnb3RvIGZyZWU7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgR0VUX0NBTk9OTkFNRShhaSwgc3RyKSBcCi1kbyB7IFwKLQkvKiBleHRlcm5hbCByZWZlcmVuY2U6IHBhaSwgZXJyb3IgYW5kIGxhYmVsIGZyZWUgKi8gXAotCWVycm9yID0gZ2V0X2Nhbm9ubmFtZShwYWksIChhaSksIChzdHIpKTsgXAotCWlmIChlcnJvciAhPSAwKSBcCi0JCWdvdG8gZnJlZTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBFUlIoZXJyKSBcCi1kbyB7IFwKLQkvKiBleHRlcm5hbCByZWZlcmVuY2U6IGVycm9yLCBhbmQgbGFiZWwgYmFkICovIFwKLQllcnJvciA9IChlcnIpOyBcCi0JZ290byBiYWQ7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgTUFUQ0hfRkFNSUxZKHgsIHksIHcpIFwKLQkoKHgpID09ICh5KSB8fCAoKHcpICYmICgoeCkgPT0gUEZfVU5TUEVDIHx8ICh5KSA9PSBQRl9VTlNQRUMpKSkKLSNkZWZpbmUgTUFUQ0goeCwgeSwgdykgXAotCSgoeCkgPT0gKHkpIHx8ICgodykgJiYgKCh4KSA9PSBBTlkgfHwgKHkpID09IEFOWSkpKQotCi0jaWYgIGRlZmluZWQoREVGSU5FX0FERElUSU9OQUxfSVBWNl9TVFVGRikKLWNoYXIgKgotZ2FpX3N0cmVycm9yKGVjb2RlKQotCWludCBlY29kZTsKLXsKLQlpZiAoZWNvZGUgPCAwIHx8IGVjb2RlID4gRUFJX01BWCkKLQkJZWNvZGUgPSBFQUlfTUFYOwotCXJldHVybiBhaV9lcnJsaXN0W2Vjb2RlXTsKLX0KLSNlbmRpZgotCi12b2lkCi1mcmVlYWRkcmluZm8oYWkpCi0Jc3RydWN0IGFkZHJpbmZvICphaTsKLXsKLQlzdHJ1Y3QgYWRkcmluZm8gKm5leHQ7Ci0KLQlkbyB7Ci0JCW5leHQgPSBhaS0+YWlfbmV4dDsKLQkJaWYgKGFpLT5haV9jYW5vbm5hbWUpCi0JCQlmcmVlKGFpLT5haV9jYW5vbm5hbWUpOwotCQkvKiBubyBuZWVkIHRvIGZyZWUoYWktPmFpX2FkZHIpICovCi0JCWZyZWUoYWkpOwotCX0gd2hpbGUgKChhaSA9IG5leHQpICE9IE5VTEwpOwotfQotCi1zdGF0aWMgaW50Ci1zdHJfaXNudW1iZXIocCkKLQljb25zdCBjaGFyICpwOwotewotCWNoYXIgKnEgPSAoY2hhciAqKXA7Ci0Jd2hpbGUgKCpxKSB7Ci0JCWlmICghIGlzZGlnaXQoKnEpKQotCQkJcmV0dXJuIE5POwotCQlxKys7Ci0JfQotCXJldHVybiBZRVM7Ci19Ci0KLWludAotZ2V0YWRkcmluZm8oaG9zdG5hbWUsIHNlcnZuYW1lLCBoaW50cywgcmVzKQotCWNvbnN0IGNoYXIgKmhvc3RuYW1lLCAqc2Vydm5hbWU7Ci0JY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50czsKLQlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Ci17Ci0Jc3RydWN0IGFkZHJpbmZvIHNlbnRpbmVsOwotCXN0cnVjdCBhZGRyaW5mbyAqY3VyOwotCWludCBlcnJvciA9IDA7Ci0Jc3RydWN0IGFkZHJpbmZvIGFpOwotCXN0cnVjdCBhZGRyaW5mbyBhaTA7Ci0Jc3RydWN0IGFkZHJpbmZvICpwYWk7Ci0JY29uc3Qgc3RydWN0IGFmZCAqYWZkOwotCWNvbnN0IHN0cnVjdCBleHBsb3JlICpleDsKLQotI2lmZGVmIEZBSVRICi0Jc3RhdGljIGludCBmaXJzdHRpbWUgPSAxOwotCi0JaWYgKGZpcnN0dGltZSkgewotCQkvKiB0cmFuc2xhdG9yIGhhY2sgKi8KLQkJY2hhciAqcSA9IGdldGVudigiR0FJIik7Ci0JCWlmIChxICYmIGluZXRfcHRvbihBRl9JTkVUNiwgcSwgJmZhaXRoX3ByZWZpeCkgPT0gMSkKLQkJCXRyYW5zbGF0ZSA9IFlFUzsKLQkJZmlyc3R0aW1lID0gMDsKLQl9Ci0jZW5kaWYKLQotCXNlbnRpbmVsLmFpX25leHQgPSBOVUxMOwotCWN1ciA9ICZzZW50aW5lbDsKLQlwYWkgPSAmYWk7Ci0JcGFpLT5haV9mbGFncyA9IDA7Ci0JcGFpLT5haV9mYW1pbHkgPSBQRl9VTlNQRUM7Ci0JcGFpLT5haV9zb2NrdHlwZSA9IEFOWTsKLQlwYWktPmFpX3Byb3RvY29sID0gQU5ZOwotCXBhaS0+YWlfYWRkcmxlbiA9IDA7Ci0JcGFpLT5haV9jYW5vbm5hbWUgPSBOVUxMOwotCXBhaS0+YWlfYWRkciA9IE5VTEw7Ci0JcGFpLT5haV9uZXh0ID0gTlVMTDsKLQotCWlmIChob3N0bmFtZSA9PSBOVUxMICYmIHNlcnZuYW1lID09IE5VTEwpCi0JCXJldHVybiBFQUlfTk9OQU1FOwotCWlmIChoaW50cykgewotCQkvKiBlcnJvciBjaGVjayBmb3IgaGludHMgKi8KLQkJaWYgKGhpbnRzLT5haV9hZGRybGVuIHx8IGhpbnRzLT5haV9jYW5vbm5hbWUgfHwKLQkJICAgIGhpbnRzLT5haV9hZGRyIHx8IGhpbnRzLT5haV9uZXh0KQotCQkJRVJSKEVBSV9CQURISU5UUyk7IC8qIHh4eCAqLwotCQlpZiAoaGludHMtPmFpX2ZsYWdzICYgfkFJX01BU0spCi0JCQlFUlIoRUFJX0JBREZMQUdTKTsKLQkJc3dpdGNoIChoaW50cy0+YWlfZmFtaWx5KSB7Ci0JCWNhc2UgUEZfVU5TUEVDOgotCQljYXNlIFBGX0lORVQ6Ci0jaWZkZWYgSU5FVDYKLQkJY2FzZSBQRl9JTkVUNjoKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlFUlIoRUFJX0ZBTUlMWSk7Ci0JCX0KLQkJbWVtY3B5KHBhaSwgaGludHMsIHNpemVvZigqcGFpKSk7Ci0KLQkJLyoKLQkJICogaWYgYm90aCBzb2NrdHlwZS9wcm90b2NvbCBhcmUgc3BlY2lmaWVkLCBjaGVjayBpZiB0aGV5Ci0JCSAqIGFyZSBtZWFuaW5nZnVsIGNvbWJpbmF0aW9uLgotCQkgKi8KLQkJaWYgKHBhaS0+YWlfc29ja3R5cGUgIT0gQU5ZICYmIHBhaS0+YWlfcHJvdG9jb2wgIT0gQU5ZKSB7Ci0JCQlmb3IgKGV4ID0gZXhwbG9yZTsgZXgtPmVfYWYgPj0gMDsgZXgrKykgewotCQkJCWlmIChwYWktPmFpX2ZhbWlseSAhPSBleC0+ZV9hZikKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGV4LT5lX3NvY2t0eXBlID09IEFOWSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGV4LT5lX3Byb3RvY29sID09IEFOWSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHBhaS0+YWlfc29ja3R5cGUgPT0gZXgtPmVfc29ja3R5cGUKLQkJCQkgJiYgcGFpLT5haV9wcm90b2NvbCAhPSBleC0+ZV9wcm90b2NvbCkgewotCQkJCQlFUlIoRUFJX0JBREhJTlRTKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIGNoZWNrIGZvciBzcGVjaWFsIGNhc2VzLiAgKDEpIG51bWVyaWMgc2Vydm5hbWUgaXMgZGlzYWxsb3dlZCBpZgotCSAqIHNvY2t0eXBlL3Byb3RvY29sIGFyZSBsZWZ0IHVuc3BlY2lmaWVkLiAoMikgc2Vydm5hbWUgaXMgZGlzYWxsb3dlZAotCSAqIGZvciByYXcgYW5kIG90aGVyIGluZXR7LDZ9IHNvY2tldHMuCi0JICovCi0JaWYgKE1BVENIX0ZBTUlMWShwYWktPmFpX2ZhbWlseSwgUEZfSU5FVCwgMSkKLSNpZmRlZiBQRl9JTkVUNgotCSB8fCBNQVRDSF9GQU1JTFkocGFpLT5haV9mYW1pbHksIFBGX0lORVQ2LCAxKQotI2VuZGlmCi0JICAgICkgewotCQlhaTAgPSAqcGFpOwotCi0JCWlmIChwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMpIHsKLSNpZmRlZiBQRl9JTkVUNgotCQkJcGFpLT5haV9mYW1pbHkgPSBQRl9JTkVUNjsKLSNlbHNlCi0JCQlwYWktPmFpX2ZhbWlseSA9IFBGX0lORVQ7Ci0jZW5kaWYKLQkJfQotCQllcnJvciA9IGdldF9wb3J0bWF0Y2gocGFpLCBzZXJ2bmFtZSk7Ci0JCWlmIChlcnJvcikKLQkJCUVSUihlcnJvcik7Ci0KLQkJKnBhaSA9IGFpMDsKLQl9Ci0KLQlhaTAgPSAqcGFpOwotCi0JLyogTlVMTCBob3N0bmFtZSwgb3IgbnVtZXJpYyBob3N0bmFtZSAqLwotCWZvciAoZXggPSBleHBsb3JlOyBleC0+ZV9hZiA+PSAwOyBleCsrKSB7Ci0JCSpwYWkgPSBhaTA7Ci0KLQkJaWYgKCFNQVRDSF9GQU1JTFkocGFpLT5haV9mYW1pbHksIGV4LT5lX2FmLCBXSUxEX0FGKGV4KSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCFNQVRDSChwYWktPmFpX3NvY2t0eXBlLCBleC0+ZV9zb2NrdHlwZSwgV0lMRF9TT0NLVFlQRShleCkpKQotCQkJY29udGludWU7Ci0JCWlmICghTUFUQ0gocGFpLT5haV9wcm90b2NvbCwgZXgtPmVfcHJvdG9jb2wsIFdJTERfUFJPVE9DT0woZXgpKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMpCi0JCQlwYWktPmFpX2ZhbWlseSA9IGV4LT5lX2FmOwotCQlpZiAocGFpLT5haV9zb2NrdHlwZSA9PSBBTlkgJiYgZXgtPmVfc29ja3R5cGUgIT0gQU5ZKQotCQkJcGFpLT5haV9zb2NrdHlwZSA9IGV4LT5lX3NvY2t0eXBlOwotCQlpZiAocGFpLT5haV9wcm90b2NvbCA9PSBBTlkgJiYgZXgtPmVfcHJvdG9jb2wgIT0gQU5ZKQotCQkJcGFpLT5haV9wcm90b2NvbCA9IGV4LT5lX3Byb3RvY29sOwotCi0JCWlmIChob3N0bmFtZSA9PSBOVUxMKQotCQkJZXJyb3IgPSBleHBsb3JlX251bGwocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsICZjdXItPmFpX25leHQpOwotCQllbHNlCi0JCQllcnJvciA9IGV4cGxvcmVfbnVtZXJpY19zY29wZShwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgJmN1ci0+YWlfbmV4dCk7Ci0KLQkJaWYgKGVycm9yKQotCQkJZ290byBmcmVlOwotCi0JCXdoaWxlIChjdXIgJiYgY3VyLT5haV9uZXh0KQotCQkJY3VyID0gY3VyLT5haV9uZXh0OwotCX0KLQotCS8qCi0JICogWFhYCi0JICogSWYgbnVtcmVpYyByZXByZXNlbnRhdGlvbiBvZiBBRjEgY2FuIGJlIGludGVycHJldGVkIGFzIEZRRE4KLQkgKiByZXByZXNlbnRhdGlvbiBvZiBBRjIsIHdlIG5lZWQgdG8gdGhpbmsgYWdhaW4gYWJvdXQgdGhlIGNvZGUgYmVsb3cuCi0JICovCi0JaWYgKHNlbnRpbmVsLmFpX25leHQpCi0JCWdvdG8gZ29vZDsKLQotCWlmIChwYWktPmFpX2ZsYWdzICYgQUlfTlVNRVJJQ0hPU1QpCi0JCUVSUihFQUlfTk9OQU1FKTsKLQlpZiAoaG9zdG5hbWUgPT0gTlVMTCkKLQkJRVJSKEVBSV9OT05BTUUpOwotCi0JLyoKLQkgKiBob3N0bmFtZSBhcyBhbHBoYWJldGljYWwgbmFtZS4KLQkgKiB3ZSB3b3VsZCBsaWtlIHRvIHByZWZlciBBRl9JTkVUNiB0aGFuIEFGX0lORVQsIHNvIHdlJ2xsIG1ha2UgYQotCSAqIG91dGVyIGxvb3AgYnkgQUZzLgotCSAqLwotCWZvciAoYWZkID0gYWZkbDsgYWZkLT5hX2FmOyBhZmQrKykgewotCQkqcGFpID0gYWkwOwotCi0JCWlmICghTUFUQ0hfRkFNSUxZKHBhaS0+YWlfZmFtaWx5LCBhZmQtPmFfYWYsIDEpKQotCQkJY29udGludWU7Ci0KLQkJZm9yIChleCA9IGV4cGxvcmU7IGV4LT5lX2FmID49IDA7IGV4KyspIHsKLQkJCSpwYWkgPSBhaTA7Ci0KLQkJCWlmIChwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMpCi0JCQkJcGFpLT5haV9mYW1pbHkgPSBhZmQtPmFfYWY7Ci0KLQkJCWlmICghTUFUQ0hfRkFNSUxZKHBhaS0+YWlfZmFtaWx5LCBleC0+ZV9hZiwgV0lMRF9BRihleCkpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFNQVRDSChwYWktPmFpX3NvY2t0eXBlLCBleC0+ZV9zb2NrdHlwZSwKLQkJCQkJV0lMRF9TT0NLVFlQRShleCkpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIU1BVENIKHBhaS0+YWlfcHJvdG9jb2wsIGV4LT5lX3Byb3RvY29sLAotCQkJCQlXSUxEX1BST1RPQ09MKGV4KSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQykKLQkJCQlwYWktPmFpX2ZhbWlseSA9IGV4LT5lX2FmOwotCQkJaWYgKHBhaS0+YWlfc29ja3R5cGUgPT0gQU5ZICYmIGV4LT5lX3NvY2t0eXBlICE9IEFOWSkKLQkJCQlwYWktPmFpX3NvY2t0eXBlID0gZXgtPmVfc29ja3R5cGU7Ci0JCQlpZiAocGFpLT5haV9wcm90b2NvbCA9PSBBTlkgJiYgZXgtPmVfcHJvdG9jb2wgIT0gQU5ZKQotCQkJCXBhaS0+YWlfcHJvdG9jb2wgPSBleC0+ZV9wcm90b2NvbDsKLQotCQkJZXJyb3IgPSBleHBsb3JlX2ZxZG4ocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsCi0JCQkJJmN1ci0+YWlfbmV4dCk7Ci0KLQkJCXdoaWxlIChjdXIgJiYgY3VyLT5haV9uZXh0KQotCQkJCWN1ciA9IGN1ci0+YWlfbmV4dDsKLQkJfQotCX0KLQotCS8qIFhYWCAqLwotCWlmIChzZW50aW5lbC5haV9uZXh0KQotCQllcnJvciA9IDA7Ci0KLQlpZiAoZXJyb3IpCi0JCWdvdG8gZnJlZTsKLQlpZiAoZXJyb3IgPT0gMCkgewotCQlpZiAoc2VudGluZWwuYWlfbmV4dCkgewotIGdvb2Q6Ci0JCQkqcmVzID0gc2VudGluZWwuYWlfbmV4dDsKLQkJCXJldHVybiBTVUNDRVNTOwotCQl9IGVsc2UKLQkJCWVycm9yID0gRUFJX0ZBSUw7Ci0JfQotIGZyZWU6Ci0gYmFkOgotCWlmIChzZW50aW5lbC5haV9uZXh0KQotCQlmcmVlYWRkcmluZm8oc2VudGluZWwuYWlfbmV4dCk7Ci0JKnJlcyA9IE5VTEw7Ci0JcmV0dXJuIGVycm9yOwotfQotCi0vKgotICogRlFETiBob3N0bmFtZSwgRE5TIGxvb2t1cAotICovCi1zdGF0aWMgaW50Ci1leHBsb3JlX2ZxZG4ocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsIHJlcykKLQljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKLQljb25zdCBjaGFyICpob3N0bmFtZTsKLQljb25zdCBjaGFyICpzZXJ2bmFtZTsKLQlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Ci17Ci0Jc3RydWN0IGhvc3RlbnQgKmhwOwotCWludCBoX2Vycm9yOwotCWludCBhZjsKLQljaGFyICoqYXBsaXN0ID0gTlVMTCwgKmFwYnVmID0gTlVMTDsKLQljaGFyICphcDsKLQlzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWwsICpjdXI7Ci0JaW50IGk7Ci0jaWZuZGVmIFVTRV9HRVRJUE5PREVCWQotCWludCBuYWRkcnM7Ci0jZW5kaWYKLQljb25zdCBzdHJ1Y3QgYWZkICphZmQ7Ci0JaW50IGVycm9yOwotCi0JKnJlcyA9IE5VTEw7Ci0Jc2VudGluZWwuYWlfbmV4dCA9IE5VTEw7Ci0JY3VyID0gJnNlbnRpbmVsOwotCi0JLyoKLQkgKiBEbyBub3QgZmlsdGVyIHVuc3VwcG9ydGVkIEFGcyBoZXJlLiAgV2UgbmVlZCB0byBob25vciBjb250ZW50IG9mCi0JICogZGF0YWJhc2VzICgvZXRjL2hvc3RzLCBETlMgYW5kIG90aGVycykuICBPdGhlcndpc2Ugd2UgY2Fubm90Ci0JICogcmVwbGFjZSBnZXRob3N0YnluYW1lKCkgYnkgZ2V0YWRkcmluZm8oKS4KLQkgKi8KLQotCS8qCi0JICogaWYgdGhlIHNlcnZuYW1lIGRvZXMgbm90IG1hdGNoIHNvY2t0eXBlL3Byb3RvY29sLCBpZ25vcmUgaXQuCi0JICovCi0JaWYgKGdldF9wb3J0bWF0Y2gocGFpLCBzZXJ2bmFtZSkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlhZmQgPSBmaW5kX2FmZChwYWktPmFpX2ZhbWlseSk7Ci0KLQkvKgotCSAqIHBvc3QtUkZDMjU1Mzogc2hvdWxkIGxvb2sgYXQgKHBhaS0+YWlfZmxhZ3MgJiBBSV9BRERSQ09ORklHKQotCSAqIHJhdGhlciB0aGFuIGhhcmRjb2RpbmcgaXQuICB3ZSBtYXkgbmVlZCB0byBhZGQgQUlfQUREUkNPTkZJRwotCSAqIGhhbmRsaW5nIGNvZGUgYnkgb3Vyc2VsdmVzIGluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBnZXRpcG5vZGVieW5hbWUoKS4KLQkgKi8KLSNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKLQlocCA9IGdldGlwbm9kZWJ5bmFtZShob3N0bmFtZSwgcGFpLT5haV9mYW1pbHksIEFJX0FERFJDT05GSUcsICZoX2Vycm9yKTsKLSNlbHNlCi0jaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FMgotCWhwID0gZ2V0aG9zdGJ5bmFtZTIoaG9zdG5hbWUsIHBhaS0+YWlfZmFtaWx5KTsKLSNlbHNlCi0JaWYgKHBhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQpCi0JCXJldHVybiAwOwotCWhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7Ci0jaWZkZWYgSEFWRV9IX0VSUk5PCi0JaF9lcnJvciA9IGhfZXJybm87Ci0jZWxzZQotCWhfZXJyb3IgPSBFSU5WQUw7Ci0jZW5kaWYKLSNlbmRpZiAvKkhBVkVfR0VUSE9TVEJZTkFNRTIqLwotI2VuZGlmIC8qVVNFX0dFVElQTk9ERUJZKi8KLQotCWlmIChocCA9PSBOVUxMKSB7Ci0JCXN3aXRjaCAoaF9lcnJvcikgewotCQljYXNlIEhPU1RfTk9UX0ZPVU5EOgotCQljYXNlIE5PX0RBVEE6Ci0JCQllcnJvciA9IEVBSV9OT0RBVEE7Ci0JCQlicmVhazsKLQkJY2FzZSBUUllfQUdBSU46Ci0JCQllcnJvciA9IEVBSV9BR0FJTjsKLQkJCWJyZWFrOwotCQljYXNlIE5PX1JFQ09WRVJZOgotCQljYXNlIE5FVERCX0lOVEVSTkFMOgotCQlkZWZhdWx0OgotCQkJZXJyb3IgPSBFQUlfRkFJTDsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIGlmICgoaHAtPmhfbmFtZSA9PSBOVUxMKSB8fCAoaHAtPmhfbmFtZVswXSA9PSAwKQotCQkJfHwgKGhwLT5oX2FkZHJfbGlzdFswXSA9PSBOVUxMKSkgewotI2lmZGVmIFVTRV9HRVRJUE5PREVCWQotCQlmcmVlaG9zdGVudChocCk7Ci0jZW5kaWYKLQkJaHAgPSBOVUxMOwotCQllcnJvciA9IEVBSV9GQUlMOwotCX0KLQotCWlmIChocCA9PSBOVUxMKQotCQlnb3RvIGZyZWU7Ci0KLSNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKLQlhcGxpc3QgPSBocC0+aF9hZGRyX2xpc3Q7Ci0jZWxzZQotCS8qCi0JICogaHAgd2lsbCBiZSBvdmVyd3JpdHRlbiBpZiB3ZSB1c2UgZ2V0aG9zdGJ5bmFtZTIoKS4KLQkgKiBhbHdheXMgZGVlcCBjb3B5IGZvciBzaW1wbGlmaWNhdGlvbi4KLQkgKi8KLQlmb3IgKG5hZGRycyA9IDA7IGhwLT5oX2FkZHJfbGlzdFtuYWRkcnNdICE9IE5VTEw7IG5hZGRycysrKQotCQk7Ci0JbmFkZHJzKys7Ci0JYXBsaXN0ID0gKGNoYXIgKiopbWFsbG9jKHNpemVvZihhcGxpc3RbMF0pICogbmFkZHJzKTsKLQlhcGJ1ZiA9IChjaGFyICopbWFsbG9jKGhwLT5oX2xlbmd0aCAqIG5hZGRycyk7Ci0JaWYgKGFwbGlzdCA9PSBOVUxMIHx8IGFwYnVmID09IE5VTEwpIHsKLQkJZXJyb3IgPSBFQUlfTUVNT1JZOwotCQlnb3RvIGZyZWU7Ci0JfQotCW1lbXNldChhcGxpc3QsIDAsIHNpemVvZihhcGxpc3RbMF0pICogbmFkZHJzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFkZHJzOyBpKyspIHsKLQkJaWYgKGhwLT5oX2FkZHJfbGlzdFtpXSA9PSBOVUxMKSB7Ci0JCQlhcGxpc3RbaV0gPSBOVUxMOwotCQkJY29udGludWU7Ci0JCX0KLQkJbWVtY3B5KCZhcGJ1ZltpICogaHAtPmhfbGVuZ3RoXSwgaHAtPmhfYWRkcl9saXN0W2ldLAotCQkJaHAtPmhfbGVuZ3RoKTsKLQkJYXBsaXN0W2ldID0gJmFwYnVmW2kgKiBocC0+aF9sZW5ndGhdOwotCX0KLSNlbmRpZgotCi0JZm9yIChpID0gMDsgYXBsaXN0W2ldICE9IE5VTEw7IGkrKykgewotCQlhZiA9IGhwLT5oX2FkZHJ0eXBlOwotCQlhcCA9IGFwbGlzdFtpXTsKLSNpZmRlZiBBRl9JTkVUNgotCQlpZiAoYWYgPT0gQUZfSU5FVDYKLQkJICYmIElONl9JU19BRERSX1Y0TUFQUEVEKChzdHJ1Y3QgaW42X2FkZHIgKilhcCkpIHsKLQkJCWFmID0gQUZfSU5FVDsKLQkJCWFwID0gYXAgKyBzaXplb2Yoc3RydWN0IGluNl9hZGRyKQotCQkJCS0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQkJfQotI2VuZGlmCi0KLQkJaWYgKGFmICE9IHBhaS0+YWlfZmFtaWx5KQotCQkJY29udGludWU7Ci0KLQkJaWYgKChwYWktPmFpX2ZsYWdzICYgQUlfQ0FOT05OQU1FKSA9PSAwKSB7Ci0JCQlHRVRfQUkoY3VyLT5haV9uZXh0LCBhZmQsIGFwKTsKLQkJCUdFVF9QT1JUKGN1ci0+YWlfbmV4dCwgc2Vydm5hbWUpOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIGlmIEFJX0NBTk9OTkFNRSBhbmQgaWYgcmV2ZXJzZSBsb29rdXAKLQkJCSAqIGZhaWwsIHJldHVybiBhaSBhbnl3YXkgdG8gcGFjaWZ5Ci0JCQkgKiBjYWxsaW5nIGFwcGxpY2F0aW9uLgotCQkJICoKLQkJCSAqIFhYWCBnZXRhZGRyaW5mbygpIGlzIGEgbmFtZS0+YWRkcmVzcwotCQkJICogdHJhbnNsYXRpb24gZnVuY3Rpb24sIGFuZCBpdCBsb29rcwotCQkJICogc3RyYW5nZSB0aGF0IHdlIGRvIGFkZHItPm5hbWUKLQkJCSAqIHRyYW5zbGF0aW9uIGhlcmUuCi0JCQkgKi8KLQkJCWdldF9uYW1lKGFwLCBhZmQsICZjdXItPmFpX25leHQsCi0JCQkJYXAsIHBhaSwgc2Vydm5hbWUpOwotCQl9Ci0KLQkJd2hpbGUgKGN1ciAmJiBjdXItPmFpX25leHQpCi0JCQljdXIgPSBjdXItPmFpX25leHQ7Ci0JfQotCi0JKnJlcyA9IHNlbnRpbmVsLmFpX25leHQ7Ci0JcmV0dXJuIDA7Ci0KLWZyZWU6Ci0jaWZkZWYgVVNFX0dFVElQTk9ERUJZCi0JaWYgKGhwKQotCQlmcmVlaG9zdGVudChocCk7Ci0jZW5kaWYKLQlpZiAoYXBsaXN0KQotCQlmcmVlKGFwbGlzdCk7Ci0JaWYgKGFwYnVmKQotCQlmcmVlKGFwYnVmKTsKLQlpZiAoc2VudGluZWwuYWlfbmV4dCkKLQkJZnJlZWFkZHJpbmZvKHNlbnRpbmVsLmFpX25leHQpOwotCXJldHVybiBlcnJvcjsKLX0KLQotLyoKLSAqIGhvc3RuYW1lID09IE5VTEwuCi0gKiBwYXNzaXZlIHNvY2tldCAtPiBhbnlhZGRyICgwLjAuMC4wIG9yIDo6KQotICogbm9uLXBhc3NpdmUgc29ja2V0IC0+IGxvY2FsaG9zdCAoMTI3LjAuMC4xIG9yIDo6MSkKLSAqLwotc3RhdGljIGludAotZXhwbG9yZV9udWxsKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpCi0JY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7Ci0JY29uc3QgY2hhciAqaG9zdG5hbWU7Ci0JY29uc3QgY2hhciAqc2Vydm5hbWU7Ci0Jc3RydWN0IGFkZHJpbmZvICoqcmVzOwotewotCWludCBzOwotCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKLQlzdHJ1Y3QgYWRkcmluZm8gKmN1cjsKLQlzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7Ci0JaW50IGVycm9yOwotCi0JKnJlcyA9IE5VTEw7Ci0Jc2VudGluZWwuYWlfbmV4dCA9IE5VTEw7Ci0JY3VyID0gJnNlbnRpbmVsOwotCi0JLyoKLQkgKiBmaWx0ZXIgb3V0IEFGcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwKLQkgKiBYWFggZXJybm8/Ci0JICovCi0JcyA9IHNvY2tldChwYWktPmFpX2ZhbWlseSwgU09DS19ER1JBTSwgMCk7Ci0JaWYgKHMgPCAwKSB7Ci0JCWlmIChlcnJubyAhPSBFTUZJTEUpCi0JCQlyZXR1cm4gMDsKLQl9IGVsc2UKLQkJY2xvc2Uocyk7Ci0KLQkvKgotCSAqIGlmIHRoZSBzZXJ2bmFtZSBkb2VzIG5vdCBtYXRjaCBzb2NrdHlwZS9wcm90b2NvbCwgaWdub3JlIGl0LgotCSAqLwotCWlmIChnZXRfcG9ydG1hdGNoKHBhaSwgc2Vydm5hbWUpICE9IDApCi0JCXJldHVybiAwOwotCi0JYWZkID0gZmluZF9hZmQocGFpLT5haV9mYW1pbHkpOwotCi0JaWYgKHBhaS0+YWlfZmxhZ3MgJiBBSV9QQVNTSVZFKSB7Ci0JCUdFVF9BSShjdXItPmFpX25leHQsIGFmZCwgYWZkLT5hX2FkZHJhbnkpOwotCQkvKiB4eHggbWVhbmluZ2xlc3M/Ci0JCSAqIEdFVF9DQU5PTk5BTUUoY3VyLT5haV9uZXh0LCAiYW55YWRkciIpOwotCQkgKi8KLQkJR0VUX1BPUlQoY3VyLT5haV9uZXh0LCBzZXJ2bmFtZSk7Ci0JfSBlbHNlIHsKLQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgYWZkLCBhZmQtPmFfbG9vcGJhY2spOwotCQkvKiB4eHggbWVhbmluZ2xlc3M/Ci0JCSAqIEdFVF9DQU5PTk5BTUUoY3VyLT5haV9uZXh0LCAibG9jYWxob3N0Iik7Ci0JCSAqLwotCQlHRVRfUE9SVChjdXItPmFpX25leHQsIHNlcnZuYW1lKTsKLQl9Ci0JY3VyID0gY3VyLT5haV9uZXh0OwotCi0JKnJlcyA9IHNlbnRpbmVsLmFpX25leHQ7Ci0JcmV0dXJuIDA7Ci0KLWZyZWU6Ci0JaWYgKHNlbnRpbmVsLmFpX25leHQpCi0JCWZyZWVhZGRyaW5mbyhzZW50aW5lbC5haV9uZXh0KTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBudW1lcmljIGhvc3RuYW1lCi0gKi8KLXN0YXRpYyBpbnQKLWV4cGxvcmVfbnVtZXJpYyhwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKQotCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOwotCWNvbnN0IGNoYXIgKmhvc3RuYW1lOwotCWNvbnN0IGNoYXIgKnNlcnZuYW1lOwotCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKLXsKLQljb25zdCBzdHJ1Y3QgYWZkICphZmQ7Ci0Jc3RydWN0IGFkZHJpbmZvICpjdXI7Ci0Jc3RydWN0IGFkZHJpbmZvIHNlbnRpbmVsOwotCWludCBlcnJvcjsKLQljaGFyIHB0b25bUFRPTl9NQVhdOwotCWludCBmbGFnczsKLQotCSpyZXMgPSBOVUxMOwotCXNlbnRpbmVsLmFpX25leHQgPSBOVUxMOwotCWN1ciA9ICZzZW50aW5lbDsKLQotCS8qCi0JICogaWYgdGhlIHNlcnZuYW1lIGRvZXMgbm90IG1hdGNoIHNvY2t0eXBlL3Byb3RvY29sLCBpZ25vcmUgaXQuCi0JICovCi0JaWYgKGdldF9wb3J0bWF0Y2gocGFpLCBzZXJ2bmFtZSkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlhZmQgPSBmaW5kX2FmZChwYWktPmFpX2ZhbWlseSk7Ci0JZmxhZ3MgPSBwYWktPmFpX2ZsYWdzOwotCi0JaWYgKGluZXRfcHRvbihhZmQtPmFfYWYsIGhvc3RuYW1lLCBwdG9uKSA9PSAxKSB7Ci0JCXVfaW50MzJfdCB2NGE7Ci0jaWZkZWYgSU5FVDYKLQkJdV9jaGFyIHBmeDsKLSNlbmRpZgotCi0JCXN3aXRjaCAoYWZkLT5hX2FmKSB7Ci0JCWNhc2UgQUZfSU5FVDoKLQkJCXY0YSA9ICh1X2ludDMyX3QpbnRvaGwoKChzdHJ1Y3QgaW5fYWRkciAqKXB0b24pLT5zX2FkZHIpOwotCQkJaWYgKElOX01VTFRJQ0FTVCh2NGEpIHx8IElOX0VYUEVSSU1FTlRBTCh2NGEpKQotCQkJCWZsYWdzICY9IH5BSV9DQU5PTk5BTUU7Ci0JCQl2NGEgPj49IElOX0NMQVNTQV9OU0hJRlQ7Ci0JCQlpZiAodjRhID09IDAgfHwgdjRhID09IElOX0xPT1BCQUNLTkVUKQotCQkJCWZsYWdzICY9IH5BSV9DQU5PTk5BTUU7Ci0JCQlicmVhazsKLSNpZmRlZiBJTkVUNgotCQljYXNlIEFGX0lORVQ2OgotCQkJcGZ4ID0gKChzdHJ1Y3QgaW42X2FkZHIgKilwdG9uKS0+czZfYWRkclswXTsKLQkJCWlmIChwZnggPT0gMCB8fCBwZnggPT0gMHhmZSB8fCBwZnggPT0gMHhmZikKLQkJCQlmbGFncyAmPSB+QUlfQ0FOT05OQU1FOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJfQotCi0JCWlmIChwYWktPmFpX2ZhbWlseSA9PSBhZmQtPmFfYWYgfHwKLQkJICAgIHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQyAvKj8qLykgewotCQkJaWYgKChmbGFncyAmIEFJX0NBTk9OTkFNRSkgPT0gMCkgewotCQkJCUdFVF9BSShjdXItPmFpX25leHQsIGFmZCwgcHRvbik7Ci0JCQkJR0VUX1BPUlQoY3VyLT5haV9uZXh0LCBzZXJ2bmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogaWYgQUlfQ0FOT05OQU1FIGFuZCBpZiByZXZlcnNlIGxvb2t1cAotCQkJCSAqIGZhaWwsIHJldHVybiBhaSBhbnl3YXkgdG8gcGFjaWZ5Ci0JCQkJICogY2FsbGluZyBhcHBsaWNhdGlvbi4KLQkJCQkgKgotCQkJCSAqIFhYWCBnZXRhZGRyaW5mbygpIGlzIGEgbmFtZS0+YWRkcmVzcwotCQkJCSAqIHRyYW5zbGF0aW9uIGZ1bmN0aW9uLCBhbmQgaXQgbG9va3MKLQkJCQkgKiBzdHJhbmdlIHRoYXQgd2UgZG8gYWRkci0+bmFtZQotCQkJCSAqIHRyYW5zbGF0aW9uIGhlcmUuCi0JCQkJICovCi0JCQkJZ2V0X25hbWUocHRvbiwgYWZkLCAmY3VyLT5haV9uZXh0LAotCQkJCQlwdG9uLCBwYWksIHNlcnZuYW1lKTsKLQkJCX0KLQkJCXdoaWxlIChjdXIgJiYgY3VyLT5haV9uZXh0KQotCQkJCWN1ciA9IGN1ci0+YWlfbmV4dDsKLQkJfSBlbHNlCi0JCQlFUlIoRUFJX0ZBTUlMWSk7CS8qeHh4Ki8KLQl9Ci0KLQkqcmVzID0gc2VudGluZWwuYWlfbmV4dDsKLQlyZXR1cm4gMDsKLQotZnJlZToKLWJhZDoKLQlpZiAoc2VudGluZWwuYWlfbmV4dCkKLQkJZnJlZWFkZHJpbmZvKHNlbnRpbmVsLmFpX25leHQpOwotCXJldHVybiBlcnJvcjsKLX0KLQotLyoKLSAqIG51bWVyaWMgaG9zdG5hbWUgd2l0aCBzY29wZQotICovCi1zdGF0aWMgaW50Ci1leHBsb3JlX251bWVyaWNfc2NvcGUocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsIHJlcykKLQljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKLQljb25zdCBjaGFyICpob3N0bmFtZTsKLQljb25zdCBjaGFyICpzZXJ2bmFtZTsKLQlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Ci17Ci0jaWZuZGVmIFNDT1BFX0RFTElNSVRFUgotCXJldHVybiBleHBsb3JlX251bWVyaWMocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsIHJlcyk7Ci0jZWxzZQotCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKLQlzdHJ1Y3QgYWRkcmluZm8gKmN1cjsKLQlpbnQgZXJyb3I7Ci0JY2hhciAqY3AsICpob3N0bmFtZTIgPSBOVUxMOwotCWludCBzY29wZTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OwotCi0JLyoKLQkgKiBpZiB0aGUgc2Vydm5hbWUgZG9lcyBub3QgbWF0Y2ggc29ja3R5cGUvcHJvdG9jb2wsIGlnbm9yZSBpdC4KLQkgKi8KLQlpZiAoZ2V0X3BvcnRtYXRjaChwYWksIHNlcnZuYW1lKSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCWFmZCA9IGZpbmRfYWZkKHBhaS0+YWlfZmFtaWx5KTsKLQlpZiAoIWFmZC0+YV9zY29wZWQpCi0JCXJldHVybiBleHBsb3JlX251bWVyaWMocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsIHJlcyk7Ci0KLQljcCA9IHN0cmNocihob3N0bmFtZSwgU0NPUEVfREVMSU1JVEVSKTsKLQlpZiAoY3AgPT0gTlVMTCkKLQkJcmV0dXJuIGV4cGxvcmVfbnVtZXJpYyhwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKTsKLQotCS8qCi0JICogSGFuZGxlIHNwZWNpYWwgY2FzZSBvZiA8c2NvcGVkX2FkZHJlc3M+PGRlbGltaXRlcj48c2NvcGUgaWQ+Ci0JICovCi0JaG9zdG5hbWUyID0gc3RyZHVwKGhvc3RuYW1lKTsKLQlpZiAoaG9zdG5hbWUyID09IE5VTEwpCi0JCXJldHVybiBFQUlfTUVNT1JZOwotCS8qIHRlcm1pbmF0ZSBhdCB0aGUgZGVsaW1pdGVyICovCi0JaG9zdG5hbWUyW2NwIC0gaG9zdG5hbWVdID0gJ1wwJzsKLQotCWNwKys7Ci0Jc3dpdGNoIChwYWktPmFpX2ZhbWlseSkgewotI2lmZGVmIElORVQ2Ci0JY2FzZSBBRl9JTkVUNjoKLQkJc2NvcGUgPSBpZl9uYW1ldG9pbmRleChjcCk7Ci0JCWlmIChzY29wZSA9PSAwKSB7Ci0JCQlmcmVlKGhvc3RuYW1lMik7Ci0JCQlyZXR1cm4gKEVBSV9OT05BTUUpOwotCQl9Ci0JCWJyZWFrOwotI2VuZGlmCi0JfQotCi0JZXJyb3IgPSBleHBsb3JlX251bWVyaWMocGFpLCBob3N0bmFtZTIsIHNlcnZuYW1lLCByZXMpOwotCWlmIChlcnJvciA9PSAwKSB7Ci0JCWZvciAoY3VyID0gKnJlczsgY3VyOyBjdXIgPSBjdXItPmFpX25leHQpIHsKLQkJCWlmIChjdXItPmFpX2ZhbWlseSAhPSBBRl9JTkVUNikKLQkJCQljb250aW51ZTsKLQkJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWN1ci0+YWlfYWRkcjsKLQkJCWlmIChJTjZfSVNfQUREUl9MSU5LTE9DQUwoJnNpbjYtPnNpbjZfYWRkcikgfHwKLQkJCSAgICBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoJnNpbjYtPnNpbjZfYWRkcikpCi0JCQkJc2luNi0+c2luNl9zY29wZV9pZCA9IHNjb3BlOwotCQl9Ci0JfQotCi0JZnJlZShob3N0bmFtZTIpOwotCi0JcmV0dXJuIGVycm9yOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQKLWdldF9uYW1lKGFkZHIsIGFmZCwgcmVzLCBudW1hZGRyLCBwYWksIHNlcnZuYW1lKQotCWNvbnN0IGNoYXIgKmFkZHI7Ci0JY29uc3Qgc3RydWN0IGFmZCAqYWZkOwotCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKLQljaGFyICpudW1hZGRyOwotCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOwotCWNvbnN0IGNoYXIgKnNlcnZuYW1lOwotewotCXN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7Ci0Jc3RydWN0IGFkZHJpbmZvICpjdXIgPSBOVUxMOwotCWludCBlcnJvciA9IDA7Ci0JY2hhciAqYXAgPSBOVUxMLCAqY24gPSBOVUxMOwotI2lmZGVmIFVTRV9HRVRJUE5PREVCWQotCWludCBoX2Vycm9yOwotCi0JaHAgPSBnZXRpcG5vZGVieWFkZHIoYWRkciwgYWZkLT5hX2FkZHJsZW4sIGFmZC0+YV9hZiwgJmhfZXJyb3IpOwotI2Vsc2UKLQlocCA9IGdldGhvc3RieWFkZHIoYWRkciwgYWZkLT5hX2FkZHJsZW4sIGFmZC0+YV9hZik7Ci0jZW5kaWYKLQlpZiAoaHAgJiYgaHAtPmhfbmFtZSAmJiBocC0+aF9uYW1lWzBdICYmIGhwLT5oX2FkZHJfbGlzdFswXSkgewotI2lmZGVmIFVTRV9HRVRJUE5PREVCWQotCQlHRVRfQUkoY3VyLCBhZmQsIGhwLT5oX2FkZHJfbGlzdFswXSk7Ci0JCUdFVF9QT1JUKGN1ciwgc2Vydm5hbWUpOwotCQlHRVRfQ0FOT05OQU1FKGN1ciwgaHAtPmhfbmFtZSk7Ci0jZWxzZQotCQkvKiBocCB3aWxsIGJlIGRhbWFnZWQgaWYgd2UgdXNlIGdldGhvc3RieWFkZHIoKSAqLwotCQlpZiAoKGFwID0gKGNoYXIgKiltYWxsb2MoaHAtPmhfbGVuZ3RoKSkgPT0gTlVMTCkgewotCQkJZXJyb3IgPSBFQUlfTUVNT1JZOwotCQkJZ290byBmcmVlOwotCQl9Ci0JCW1lbWNweShhcCwgaHAtPmhfYWRkcl9saXN0WzBdLCBocC0+aF9sZW5ndGgpOwotCQlpZiAoKGNuID0gc3RyZHVwKGhwLT5oX25hbWUpKSA9PSBOVUxMKSB7Ci0JCQllcnJvciA9IEVBSV9NRU1PUlk7Ci0JCQlnb3RvIGZyZWU7Ci0JCX0KLQotCQlHRVRfQUkoY3VyLCBhZmQsIGFwKTsKLQkJR0VUX1BPUlQoY3VyLCBzZXJ2bmFtZSk7Ci0JCUdFVF9DQU5PTk5BTUUoY3VyLCBjbik7Ci0JCWZyZWUoYXApOyBhcCA9IE5VTEw7Ci0JCWZyZWUoY24pOyBjbiA9IE5VTEw7Ci0jZW5kaWYKLQl9IGVsc2UgewotCQlHRVRfQUkoY3VyLCBhZmQsIG51bWFkZHIpOwotCQlHRVRfUE9SVChjdXIsIHNlcnZuYW1lKTsKLQl9Ci0KLSNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKLQlpZiAoaHApCi0JCWZyZWVob3N0ZW50KGhwKTsKLSNlbmRpZgotCSpyZXMgPSBjdXI7Ci0JcmV0dXJuIFNVQ0NFU1M7Ci0gZnJlZToKLQlpZiAoY3VyKQotCQlmcmVlYWRkcmluZm8oY3VyKTsKLQlpZiAoYXApCi0JCWZyZWUoYXApOwotCWlmIChjbikKLQkJZnJlZShjbik7Ci0jaWZkZWYgVVNFX0dFVElQTk9ERUJZCi0JaWYgKGhwKQotCQlmcmVlaG9zdGVudChocCk7Ci0jZW5kaWYKLQkqcmVzID0gTlVMTDsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9jYW5vbm5hbWUocGFpLCBhaSwgc3RyKQotCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOwotCXN0cnVjdCBhZGRyaW5mbyAqYWk7Ci0JY29uc3QgY2hhciAqc3RyOwotewotCWlmICgocGFpLT5haV9mbGFncyAmIEFJX0NBTk9OTkFNRSkgIT0gMCkgewotCQlhaS0+YWlfY2Fub25uYW1lID0gc3RyZHVwKHN0cik7Ci0JCWlmIChhaS0+YWlfY2Fub25uYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gRUFJX01FTU9SWTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRkcmluZm8gKgotZ2V0X2FpKHBhaSwgYWZkLCBhZGRyKQotCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOwotCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKLQljb25zdCBjaGFyICphZGRyOwotewotCWNoYXIgKnA7Ci0Jc3RydWN0IGFkZHJpbmZvICphaTsKLQotCWFpID0gKHN0cnVjdCBhZGRyaW5mbyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGFkZHJpbmZvKQotCQkrIChhZmQtPmFfc29ja2xlbikpOwotCWlmIChhaSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCW1lbWNweShhaSwgcGFpLCBzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSk7Ci0JYWktPmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopKGFpICsgMSk7Ci0JbWVtc2V0KGFpLT5haV9hZGRyLCAwLCBhZmQtPmFfc29ja2xlbik7Ci0jaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQlhaS0+YWlfYWRkci0+c2FfbGVuID0gYWZkLT5hX3NvY2tsZW47Ci0jZW5kaWYKLQlhaS0+YWlfYWRkcmxlbiA9IGFmZC0+YV9zb2NrbGVuOwotCWFpLT5haV9hZGRyLT5zYV9mYW1pbHkgPSBhaS0+YWlfZmFtaWx5ID0gYWZkLT5hX2FmOwotCXAgPSAoY2hhciAqKShhaS0+YWlfYWRkcik7Ci0JbWVtY3B5KHAgKyBhZmQtPmFfb2ZmLCBhZGRyLCBhZmQtPmFfYWRkcmxlbik7Ci0JcmV0dXJuIGFpOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfcG9ydG1hdGNoKGFpLCBzZXJ2bmFtZSkKLQljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmFpOwotCWNvbnN0IGNoYXIgKnNlcnZuYW1lOwotewotCi0JLyogZ2V0X3BvcnQgZG9lcyBub3QgdG91Y2ggZmlyc3QgYXJndW1lbnQuIHdoZW4gbWF0Y2hvbmx5ID09IDEuICovCi0JcmV0dXJuIGdldF9wb3J0KChzdHJ1Y3QgYWRkcmluZm8gKilhaSwgc2Vydm5hbWUsIDEpOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfcG9ydChhaSwgc2Vydm5hbWUsIG1hdGNob25seSkKLQlzdHJ1Y3QgYWRkcmluZm8gKmFpOwotCWNvbnN0IGNoYXIgKnNlcnZuYW1lOwotCWludCBtYXRjaG9ubHk7Ci17Ci0JY29uc3QgY2hhciAqcHJvdG87Ci0Jc3RydWN0IHNlcnZlbnQgKnNwOwotCWludCBwb3J0OwotCWludCBhbGxvd251bWVyaWM7Ci0KLQlpZiAoc2Vydm5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0Jc3dpdGNoIChhaS0+YWlfZmFtaWx5KSB7Ci0JY2FzZSBBRl9JTkVUOgotI2lmZGVmIEFGX0lORVQ2Ci0JY2FzZSBBRl9JTkVUNjoKLSNlbmRpZgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGFpLT5haV9zb2NrdHlwZSkgewotCWNhc2UgU09DS19SQVc6Ci0JCXJldHVybiBFQUlfU0VSVklDRTsKLQljYXNlIFNPQ0tfREdSQU06Ci0JY2FzZSBTT0NLX1NUUkVBTToKLQkJYWxsb3dudW1lcmljID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBBTlk6Ci0JCWFsbG93bnVtZXJpYyA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBFQUlfU09DS1RZUEU7Ci0JfQotCi0JaWYgKHN0cl9pc251bWJlcihzZXJ2bmFtZSkpIHsKLQkJaWYgKCFhbGxvd251bWVyaWMpCi0JCQlyZXR1cm4gRUFJX1NFUlZJQ0U7Ci0JCXBvcnQgPSBodG9ucyhhdG9pKHNlcnZuYW1lKSk7Ci0JCWlmIChwb3J0IDwgMCB8fCBwb3J0ID4gNjU1MzUpCi0JCQlyZXR1cm4gRUFJX1NFUlZJQ0U7Ci0JfSBlbHNlIHsKLQkJc3dpdGNoIChhaS0+YWlfc29ja3R5cGUpIHsKLQkJY2FzZSBTT0NLX0RHUkFNOgotCQkJcHJvdG8gPSAidWRwIjsKLQkJCWJyZWFrOwotCQljYXNlIFNPQ0tfU1RSRUFNOgotCQkJcHJvdG8gPSAidGNwIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJvdG8gPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoKHNwID0gZ2V0c2VydmJ5bmFtZShzZXJ2bmFtZSwgcHJvdG8pKSA9PSBOVUxMKQotCQkJcmV0dXJuIEVBSV9TRVJWSUNFOwotCQlwb3J0ID0gc3AtPnNfcG9ydDsKLQl9Ci0KLQlpZiAoIW1hdGNob25seSkgewotCQlzd2l0Y2ggKGFpLT5haV9mYW1pbHkpIHsKLQkJY2FzZSBBRl9JTkVUOgotCQkJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhaS0+YWlfYWRkciktPnNpbl9wb3J0ID0gcG9ydDsKLQkJCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JCWNhc2UgQUZfSU5FVDY6Ci0JCQkoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhaS0+YWlfYWRkciktPnNpbjZfcG9ydCA9IHBvcnQ7Ci0JCQlicmVhazsKLSNlbmRpZgotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWZkICoKLWZpbmRfYWZkKGFmKQotCWludCBhZjsKLXsKLQljb25zdCBzdHJ1Y3QgYWZkICphZmQ7Ci0KLQlpZiAoYWYgPT0gUEZfVU5TUEVDKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGFmZCA9IGFmZGw7IGFmZC0+YV9hZjsgYWZkKyspIHsKLQkJaWYgKGFmZC0+YV9hZiA9PSBhZikKLQkJCXJldHVybiBhZmQ7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0KLSNlbmRpZiAvKl9fTUlORzY0X18qLwpkaWZmIC0tZ2l0IGEvV2luMzIvU3JjL2dldG5ldGJ5bm0uYyBiL1dpbjMyL1NyYy9nZXRuZXRieW5tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNGQzOTguLjAwMDAwMDAKLS0tIGEvV2luMzIvU3JjL2dldG5ldGJ5bm0uYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQotICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKLSAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKLSAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKLSAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCi0gKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQotc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKWdldG5ldGJ5bmFtZS5jCTUuNSAoQmVya2VsZXkpIDYvMjcvODgiOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgImluZXRwcml2YXRlLmgiCi0KLWV4dGVybiBpbnQgX25ldF9zdGF5b3BlbjsKLQotc3RydWN0IG5ldGVudCAqCi1nZXRuZXRieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlyZWdpc3RlciBzdHJ1Y3QgbmV0ZW50ICpwOwotCXJlZ2lzdGVyIGNoYXIgKipjcDsKLQotCXNldG5ldGVudChfbmV0X3N0YXlvcGVuKTsKLQl3aGlsZSAocCA9IGdldG5ldGVudCgpKSB7Ci0JCWlmIChzdHJjbXAocC0+bl9uYW1lLCBuYW1lKSA9PSAwKQotCQkJYnJlYWs7Ci0JCWZvciAoY3AgPSBwLT5uX2FsaWFzZXM7ICpjcCAhPSAwOyBjcCsrKQotCQkJaWYgKHN0cmNtcCgqY3AsIG5hbWUpID09IDApCi0JCQkJZ290byBmb3VuZDsKLQl9Ci1mb3VuZDoKLQlpZiAoIV9uZXRfc3RheW9wZW4pCi0JCWVuZG5ldGVudCgpOwotCXJldHVybiAocCk7Ci19CmRpZmYgLS1naXQgYS9XaW4zMi9TcmMvZ2V0bmV0ZW50LmMgYi9XaW4zMi9TcmMvZ2V0bmV0ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MjgxYTUuLjAwMDAwMDAKLS0tIGEvV2luMzIvU3JjL2dldG5ldGVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQotICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKLSAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKLSAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKLSAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCi0gKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQotc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKWdldG5ldGVudC5jCTUuNSAoQmVya2VsZXkpIDYvMjcvODgiOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgImluZXRwcml2YXRlLmgiCi0KLSNkZWZpbmUJTUFYQUxJQVNFUwkzNQotCi1zdGF0aWMgY2hhciBORVREQltdID0gX1BBVEhfTkVUV09SS1M7Ci1zdGF0aWMgRklMRSAqbmV0ZiA9IE5VTEw7Ci1zdGF0aWMgY2hhciBsaW5lW0JVRlNJWisxXTsKLXN0YXRpYyBzdHJ1Y3QgbmV0ZW50IG5ldDsKLXN0YXRpYyBjaGFyICpuZXRfYWxpYXNlc1tNQVhBTElBU0VTXTsKLXN0YXRpYyBjaGFyICphbnkoY2hhciAqLCBjaGFyICopOwotCi1pbnQgX25ldF9zdGF5b3BlbjsKLWV4dGVybiB1X2ludDMyX3QgaW5ldF9uZXR3b3JrKGNvbnN0IGNoYXIgKmNwKTsKLQotdm9pZAotc2V0bmV0ZW50KGYpCi0JaW50IGY7Ci17Ci0JaWYgKG5ldGYgPT0gTlVMTCkKLQkJbmV0ZiA9IGZvcGVuKE5FVERCLCAiciIgKTsKLQllbHNlCi0JCXJld2luZChuZXRmKTsKLQlfbmV0X3N0YXlvcGVuIHw9IGY7Ci19Ci0KLXZvaWQKLWVuZG5ldGVudCgpCi17Ci0JaWYgKG5ldGYpIHsKLQkJZmNsb3NlKG5ldGYpOwotCQluZXRmID0gTlVMTDsKLQl9Ci0JX25ldF9zdGF5b3BlbiA9IDA7Ci19Ci0KLXN0cnVjdCBuZXRlbnQgKgotZ2V0bmV0ZW50KCkKLXsKLQljaGFyICpwOwotCXJlZ2lzdGVyIGNoYXIgKmNwLCAqKnE7Ci0KLQlpZiAobmV0ZiA9PSBOVUxMICYmIChuZXRmID0gZm9wZW4oTkVUREIsICJyIiApKSA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOwotYWdhaW46Ci0JcCA9IGZnZXRzKGxpbmUsIEJVRlNJWiwgbmV0Zik7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQlpZiAoKnAgPT0gJyMnKQotCQlnb3RvIGFnYWluOwotCWNwID0gYW55KHAsICIjXG4iKTsKLQlpZiAoY3AgPT0gTlVMTCkKLQkJZ290byBhZ2FpbjsKLQkqY3AgPSAnXDAnOwotCW5ldC5uX25hbWUgPSBwOwotCWNwID0gYW55KHAsICIgXHQiKTsKLQlpZiAoY3AgPT0gTlVMTCkKLQkJZ290byBhZ2FpbjsKLQkqY3ArKyA9ICdcMCc7Ci0Jd2hpbGUgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpCi0JCWNwKys7Ci0JcCA9IGFueShjcCwgIiBcdCIpOwotCWlmIChwICE9IE5VTEwpCi0JCSpwKysgPSAnXDAnOwotCW5ldC5uX25ldCA9IGluZXRfbmV0d29yayhjcCk7Ci0JbmV0Lm5fYWRkcnR5cGUgPSBBRl9JTkVUOwotCXEgPSBuZXQubl9hbGlhc2VzID0gbmV0X2FsaWFzZXM7Ci0JaWYgKHAgIT0gTlVMTCkKLQkJY3AgPSBwOwotCXdoaWxlIChjcCAmJiAqY3ApIHsKLQkJaWYgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpIHsKLQkJCWNwKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAocSA8ICZuZXRfYWxpYXNlc1tNQVhBTElBU0VTIC0gMV0pCi0JCQkqcSsrID0gY3A7Ci0JCWNwID0gYW55KGNwLCAiIFx0Iik7Ci0JCWlmIChjcCAhPSBOVUxMKQotCQkJKmNwKysgPSAnXDAnOwotCX0KLQkqcSA9IE5VTEw7Ci0JcmV0dXJuICgmbmV0KTsKLX0KLQotc3RhdGljIGNoYXIgKgotYW55KGNwLCBtYXRjaCkKLQlyZWdpc3RlciBjaGFyICpjcDsKLQljaGFyICptYXRjaDsKLXsKLQlyZWdpc3RlciBjaGFyICptcCwgYzsKLQotCXdoaWxlIChjID0gKmNwKSB7Ci0JCWZvciAobXAgPSBtYXRjaDsgKm1wOyBtcCsrKQotCQkJaWYgKCptcCA9PSBjKQotCQkJCXJldHVybiAoY3ApOwotCQljcCsrOwotCX0KLQlyZXR1cm4gKChjaGFyICopMCk7Ci19CmRpZmYgLS1naXQgYS9XaW4zMi9TcmMvZ2V0c2VydmVudC5jIGIvV2luMzIvU3JjL2dldHNlcnZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiOGNiMC4uMDAwMDAwMAotLS0gYS9XaW4zMi9TcmMvZ2V0c2VydmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQotc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKWdldHNlcnZlbnQuYwk4LjEgKEJlcmtlbGV5KSA2LzQvOTMiOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZGIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+Ci0KLSNkZWZpbmUJTUFYQUxJQVNFUwkzNQotCi1zdGF0aWMgY2hhciBTRVJWREJbXSA9IF9QQVRIX1NFUlZJQ0VTOwotc3RhdGljIEZJTEUgKnNlcnZmID0gTlVMTDsKLXN0YXRpYyBjaGFyIGxpbmVbQlVGU0laKzFdOwotc3RhdGljIHN0cnVjdCBzZXJ2ZW50IHNlcnY7Ci1zdGF0aWMgY2hhciAqc2Vydl9hbGlhc2VzW01BWEFMSUFTRVNdOwotaW50IF9zZXJ2X3N0YXlvcGVuOwotCi12b2lkCi1zZXRzZXJ2ZW50KGYpCi0JaW50IGY7Ci17Ci0JaWYgKHNlcnZmID09IE5VTEwpCi0JCXNlcnZmID0gZm9wZW4oU0VSVkRCLCAiciIgKTsKLQllbHNlCi0JCXJld2luZChzZXJ2Zik7Ci0JX3NlcnZfc3RheW9wZW4gfD0gZjsKLX0KLQotdm9pZAotZW5kc2VydmVudCgpCi17Ci0JaWYgKHNlcnZmKSB7Ci0JCWZjbG9zZShzZXJ2Zik7Ci0JCXNlcnZmID0gTlVMTDsKLQl9Ci0JX3NlcnZfc3RheW9wZW4gPSAwOwotfQotCi1zdHJ1Y3Qgc2VydmVudCAqCi1nZXRzZXJ2ZW50KCkKLXsKLQljaGFyICpwOwotCXJlZ2lzdGVyIGNoYXIgKmNwLCAqKnE7Ci0KLQlpZiAoc2VydmYgPT0gTlVMTCAmJiAoc2VydmYgPSBmb3BlbihTRVJWREIsICJyIiApKSA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOwotYWdhaW46Ci0JaWYgKChwID0gZmdldHMobGluZSwgQlVGU0laLCBzZXJ2ZikpID09IE5VTEwpCi0JCXJldHVybiAoTlVMTCk7Ci0JaWYgKCpwID09ICcjJykKLQkJZ290byBhZ2FpbjsKLQljcCA9IHN0cnBicmsocCwgIiNcbiIpOwotCWlmIChjcCA9PSBOVUxMKQotCQlnb3RvIGFnYWluOwotCSpjcCA9ICdcMCc7Ci0Jc2Vydi5zX25hbWUgPSBwOwotCXAgPSBzdHJwYnJrKHAsICIgXHQiKTsKLQlpZiAocCA9PSBOVUxMKQotCQlnb3RvIGFnYWluOwotCSpwKysgPSAnXDAnOwotCXdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKLQkJcCsrOwotCWNwID0gc3RycGJyayhwLCAiLC8iKTsKLQlpZiAoY3AgPT0gTlVMTCkKLQkJZ290byBhZ2FpbjsKLQkqY3ArKyA9ICdcMCc7Ci0Jc2Vydi5zX3BvcnQgPSBodG9ucygodV9zaG9ydClhdG9pKHApKTsKLQlzZXJ2LnNfcHJvdG8gPSBjcDsKLQlxID0gc2Vydi5zX2FsaWFzZXMgPSBzZXJ2X2FsaWFzZXM7Ci0JY3AgPSBzdHJwYnJrKGNwLCAiIFx0Iik7Ci0JaWYgKGNwICE9IE5VTEwpCi0JCSpjcCsrID0gJ1wwJzsKLQl3aGlsZSAoY3AgJiYgKmNwKSB7Ci0JCWlmICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKSB7Ci0JCQljcCsrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHEgPCAmc2Vydl9hbGlhc2VzW01BWEFMSUFTRVMgLSAxXSkKLQkJCSpxKysgPSBjcDsKLQkJY3AgPSBzdHJwYnJrKGNwLCAiIFx0Iik7Ci0JCWlmIChjcCAhPSBOVUxMKQotCQkJKmNwKysgPSAnXDAnOwotCX0KLQkqcSA9IE5VTEw7Ci0JcmV0dXJuICgmc2Vydik7Ci19CmRpZmYgLS1naXQgYS9XaW4zMi9TcmMvaW5ldF9hdG9uLmMgYi9XaW4zMi9TcmMvaW5ldF9hdG9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOTdiY2UuLjAwMDAwMDAKLS0tIGEvV2luMzIvU3JjL2luZXRfYXRvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NyBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KLSAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBLdW5nbGlnYSBUZWtuaXNrYQotICogICAgICBI9mdza29sYW4gYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KLQotLyogTWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBpbmV0X2F0b24uCi0gKiBDYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBmYWlsdXJlIGFuZCBhIGxvY2FsIGJyb2FkY2FzdCBhZGRyZXNzLiAqLwotCi0jaWZuZGVmIElOQUREUl9OT05FCi0jZGVmaW5lIElOQUREUl9OT05FIDB4ZmZmZmZmZmYKLSNlbmRpZgotCi1pbnQKLWluZXRfYXRvbihjb25zdCBjaGFyICpjcCwgc3RydWN0IGluX2FkZHIgKmFkZHIpCi17Ci0gIGFkZHItPnNfYWRkciA9IGluZXRfYWRkcihjcCk7Ci0gIHJldHVybiAoYWRkci0+c19hZGRyID09IElOQUREUl9OT05FKSA/IDAgOiAxOwotfQpkaWZmIC0tZ2l0IGEvV2luMzIvU3JjL2luZXRfbmV0LmMgYi9XaW4zMi9TcmMvaW5ldF9uZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiZTM5MS4uMDAwMDAwMAotLS0gYS9XaW4zMi9TcmMvaW5ldF9uZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCi1zdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpaW5ldF9uZXR3b3JrLmMJOC4xIChCZXJrZWxleSkgNi80LzkzIjsKLSNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCi0KLSNpbmNsdWRlICJpbmV0cHJpdmF0ZS5oIgotCi0vKgotICogSW50ZXJuZXQgbmV0d29yayBhZGRyZXNzIGludGVycHJldGF0aW9uIHJvdXRpbmUuCi0gKiBUaGUgbGlicmFyeSByb3V0aW5lcyBjYWxsIHRoaXMgcm91dGluZSB0byBpbnRlcnByZXQKLSAqIG5ldHdvcmsgbnVtYmVycy4KLSAqLwotdV9pbnQzMl90Ci1pbmV0X25ldHdvcmsoY29uc3QgY2hhciAqY3ApCi17Ci0JcmVnaXN0ZXIgdV9sb25nIHZhbCwgYmFzZSwgbjsKLQlyZWdpc3RlciBjaGFyIGM7Ci0JdV9sb25nIHBhcnRzWzRdLCAqcHAgPSBwYXJ0czsKLQlyZWdpc3RlciBpbnQgaTsKLQotYWdhaW46Ci0JLyoKLQkgKiBDb2xsZWN0IG51bWJlciB1cCB0byBgYC4nJy4KLQkgKiBWYWx1ZXMgYXJlIHNwZWNpZmllZCBhcyBmb3IgQzoKLQkgKiAweD1oZXgsIDA9b2N0YWwsIG90aGVyPWRlY2ltYWwuCi0JICovCi0JdmFsID0gMDsgYmFzZSA9IDEwOwotCS8qCi0JICogVGhlIDQuNEJTRCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBhbHNvIGFjY2VwdHMgJ3hfXycgYXMgYSBoZXhhCi0JICogbnVtYmVyLiAgSSBkb24ndCB0aGluayB0aGlzIGlzIGNvcnJlY3QuICAtLSBVbGkKLQkgKi8KLQlpZiAoKmNwID09ICcwJykgewotCQlpZiAoKisrY3AgPT0gJ3gnIHx8ICpjcCA9PSAnWCcpCi0JCQliYXNlID0gMTYsIGNwKys7Ci0JCWVsc2UKLQkJCWJhc2UgPSA4OwotCX0KLQl3aGlsZSAoKGMgPSAqY3ApKSB7Ci0JCWlmIChpc2RpZ2l0KGMpKSB7Ci0JCQl2YWwgPSAodmFsICogYmFzZSkgKyAoYyAtICcwJyk7Ci0JCQljcCsrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGJhc2UgPT0gMTYgJiYgaXN4ZGlnaXQoYykpIHsKLQkJCXZhbCA9ICh2YWwgPDwgNCkgKyAoYyArIDEwIC0gKGlzbG93ZXIoYykgPyAnYScgOiAnQScpKTsKLQkJCWNwKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlicmVhazsKLQl9Ci0JaWYgKCpjcCA9PSAnLicpIHsKLQkJaWYgKHBwID49IHBhcnRzICsgNCkKLQkJCXJldHVybiAoSU5BRERSX05PTkUpOwotCQkqcHArKyA9IHZhbCwgY3ArKzsKLQkJZ290byBhZ2FpbjsKLQl9Ci0JaWYgKCpjcCAmJiAhaXNzcGFjZSgqY3ApKQotCQlyZXR1cm4gKElOQUREUl9OT05FKTsKLQkqcHArKyA9IHZhbDsKLQluID0gcHAgLSBwYXJ0czsKLQlpZiAobiA+IDQpCi0JCXJldHVybiAoSU5BRERSX05PTkUpOwotCWZvciAodmFsID0gMCwgaSA9IDA7IGkgPCAoaW50KW47IGkrKykgewotCQl2YWwgPDw9IDg7Ci0JCXZhbCB8PSBwYXJ0c1tpXSAmIDB4ZmY7Ci0JfQotCXJldHVybiAodmFsKTsKLX0KZGlmZiAtLWdpdCBhL1dpbjMyL1NyYy9pbmV0X3B0b24uYyBiL1dpbjMyL1NyYy9pbmV0X3B0b24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlMzgxMy4uMDAwMDAwMAotLS0gYS9XaW4zMi9TcmMvaW5ldF9wdG9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk5IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgotICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEt1bmdsaWdhIFRla25pc2thCi0gKiAgICAgIEj2Z3Nrb2xhbiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgV0lOMzIKLSNpZm5kZWYgRUFGTk9TVVBQT1JUCi0jZGVmaW5lCUVBRk5PU1VQUE9SVAk5NwkvKiBub3QgcHJlc2VudCBpbiBlcnJuby5oIHByb3ZpZGVkIHdpdGggVkMgKi8KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX01JTkdXMzJfXwotaW50KiBfZXJybm8oKTsKLSNkZWZpbmUgZXJybm8gKCpfZXJybm8oKSkKLSNlbmRpZiAvKiBfX01JTkdXMzJfXyAqLwotCi0jaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KLQotaW50IGluZXRfYXRvbihjb25zdCBjaGFyICpjcCwgc3RydWN0IGluX2FkZHIgKmFkZHIpOwotCi1pbnQKLWluZXRfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIgKnNyYywgdm9pZCAqZHN0KQotewotICAgIGlmIChhZiAhPSBBRl9JTkVUKSB7Ci0JZXJybm8gPSBFQUZOT1NVUFBPUlQ7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gaW5ldF9hdG9uIChzcmMsIGRzdCk7Ci19CmRpZmYgLS1naXQgYS9hY2xvY2FsLm00IGIvYWNsb2NhbC5tNAppbmRleCAwMjUwMmIyLi44M2Y1NzYxIDEwMDY0NAotLS0gYS9hY2xvY2FsLm00CisrKyBiL2FjbG9jYWwubTQKQEAgLTEwMiw2ICsxMDIsMTMgQEAKIAkgICAgIyAtV2Vycm9yIGZvcmNlcyB3YXJuaW5ncyB0byBiZSBlcnJvcnMuCiAJICAgICMKIAkgICAgYWNfbGJsX2NjX2ZvcmNlX3dhcm5pbmdfZXJyb3JzPS1XZXJyb3IKKworCSAgICAjCisJICAgICMgVHJ5IHRvIGhhdmUgdGhlIGNvbXBpbGVyIGRlZmF1bHQgdG8gaGlkaW5nIHN5bWJvbHMsCisJICAgICMgc28gdGhhdCBvbmx5IHN5bWJvbHMgZXhwbGljaXRseSBleHBvcnRlZCB3aXRoCisJICAgICMgUENBUF9BUEkgd2lsbCBiZSB2aXNpYmxlIG91dHNpZGUgKHNoYXJlZCkgbGlicmFyaWVzLgorCSAgICAjCisJICAgIEFDX0xCTF9DSEVDS19DT01QSUxFUl9PUFQoJDEsIC1mdmlzaWJpbGl0eT1oaWRkZW4pCiAgICAgZWxzZQogCSAgICAkMj0iJCQyIC1JL3Vzci9sb2NhbC9pbmNsdWRlIgogCSAgICBMREZMQUdTPSIkTERGTEFHUyAtTC91c3IvbG9jYWwvbGliIgpAQCAtMTE0LDYgKzEyMSwxMyBAQAogCQkgICAgIyBvZiB3aGljaCB1c2UgLVdlcnJvciB0byBmb3JjZSB3YXJuaW5ncyB0byBiZSBlcnJvcnMuCiAJCSAgICAjCiAJCSAgICBhY19sYmxfY2NfZm9yY2Vfd2FybmluZ19lcnJvcnM9LVdlcnJvcgorCisJCSAgICAjCisJCSAgICAjIFRyeSB0byBoYXZlIHRoZSBjb21waWxlciBkZWZhdWx0IHRvIGhpZGluZyBzeW1ib2xzLAorCQkgICAgIyBzbyB0aGF0IG9ubHkgc3ltYm9scyBleHBsaWNpdGx5IGV4cG9ydGVkIHdpdGgKKwkJICAgICMgUENBUF9BUEkgd2lsbCBiZSB2aXNpYmxlIG91dHNpZGUgKHNoYXJlZCkgbGlicmFyaWVzLgorCQkgICAgIworCQkgICAgQUNfTEJMX0NIRUNLX0NPTVBJTEVSX09QVCgkMSwgLWZ2aXNpYmlsaXR5PWhpZGRlbikKIAkJICAgIDs7CiAKIAkgICAgaHB1eCopCkBAIC0xODgsNiArMjAyLDEzIEBACiAJCSAgICAjIHdhcm5pbmdzIHRvIGJlIHRyZWF0ZWQgYXMgZXJyb3JzLgogCQkgICAgIwogCQkgICAgYWNfbGJsX2NjX2ZvcmNlX3dhcm5pbmdfZXJyb3JzPS1lcnJ3YXJuCisKKwkJICAgICMKKwkJICAgICMgVHJ5IHRvIGhhdmUgdGhlIGNvbXBpbGVyIGRlZmF1bHQgdG8gaGlkaW5nIHN5bWJvbHMsCisJCSAgICAjIHNvIHRoYXQgb25seSBzeW1ib2xzIGV4cGxpY2l0bHkgZXhwb3J0ZWQgd2l0aAorCQkgICAgIyBQQ0FQX0FQSSB3aWxsIGJlIHZpc2libGUgb3V0c2lkZSAoc2hhcmVkKSBsaWJyYXJpZXMuCisJCSAgICAjCisJCSAgICBBQ19MQkxfQ0hFQ0tfQ09NUElMRVJfT1BUKCQxLCAteGxkc2NvcGU9aGlkZGVuKQogCQkgICAgOzsKIAogCSAgICB1bHRyaXgqKQpAQCAtMjQ5LDcgKzI3MCwxOCBAQAogICAgIFsKIAlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAkMiBvcHRpb25dKQogCXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCUNGTEFHUz0iJENGTEFHUyAkYWNfbGJsX3Vua25vd25fd2FybmluZ19vcHRpb25fZXJyb3IgJDIiCisJaWYgZXhwciAieCQyIiA6ICJ4LVcuKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfdW5rbm93bl93YXJuaW5nX29wdGlvbl9lcnJvciAkMiIKKwllbGlmIGV4cHIgIngkMiIgOiAieC1mLioiID4vZGV2L251bGwKKwl0aGVuCisJICAgIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yICQyIgorCWVsaWYgZXhwciAieCQyIiA6ICJ4LW0uKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgJDIiCisJZWxzZQorCSAgICBDRkxBR1M9IiRDRkxBR1MgJDIiCisJZmkKIAlBQ19UUllfQ09NUElMRSgKIAkgICAgW10sCiAJICAgIFtyZXR1cm4gMF0sCkBAIC02MzAsODIgKzY2Miw2IEBACiAgICAgZmldKQogCiBkbmwKLWRubCBDaGVjayBmb3IgZmxleCwgZGVmYXVsdCB0byBsZXgKLWRubCBSZXF1aXJlIGZsZXggMi40IG9yIGhpZ2hlcgotZG5sIENoZWNrIGZvciBiaXNvbiwgZGVmYXVsdCB0byB5YWNjCi1kbmwgRGVmYXVsdCB0byBsZXgveWFjYyBpZiBib3RoIGZsZXggYW5kIGJpc29uIGFyZSBub3QgYXZhaWxhYmxlCi1kbmwKLWRubCBJZiB3ZSdyZSB1c2luZyBmbGV4IGFuZCBiaXNvbiwgcGFzcyAtUCB0byBmbGV4IGFuZCAtcCB0byBiaXNvbgotZG5sIHRvIGRlZmluZSBhIHByZWZpeCBzdHJpbmcgZm9yIHRoZSBsZXhlciBhbmQgcGFyc2VyCi1kbmwKLWRubCBJZiB3ZSdyZSBub3QgdXNpbmcgZmxleCBhbmQgYmlzb24sIGRvbid0IHBhc3MgdGhvc2Ugb3B0aW9ucwotZG5sIChhcyB0aGV5IG1pZ2h0IG5vdCB3b3JrIC0gYWx0aG91Z2ggaWYgImxleCIgaXMgYSB3cmFwcGVyIGZvcgotZG5sIEZsZXggYW5kICJ5YWNjIiBpcyBhIHdyYXBwZXIgZm9yIEJpc29uLCB0aGV5IHdpbGwgd29yayksIGFuZAotZG5sIGRlZmluZSBORUVEX1lZUEFSU0VfV1JBUFBFUiAod2UgKkNBTk5PVCogdXNlIFlZQklTT04gdG8gY2hlY2sKLWRubCB3aGV0aGVyIHRoZSB3cmFwcGVyIGlzIG5lZWRlZCwgYXMgc29tZSBwZW9wbGUgYXBwYXJlbnRseSwgZm9yCi1kbmwgc29tZSB1bmtub3duIHJlYXNvbiwgY2hvb3NlIHRvIHVzZSAtLXdpdGhvdXQtZmxleCBhbmQKLWRubCAtLXdpdGhvdXQtYmlzb24gb24gc3lzdGVtcyB0aGF0IGhhdmUgRmxleCBhbmQgQmlzb24sIHdoaWNoCi1kbmwgbWVhbnMgdGhhdCB0aGUgInlhY2MiIHRoZXkgZW5kIHVwIHVzaW5nIGlzIGEgd3JhcHBlciB0aGF0Ci1kbmwgcnVucyAiYmlzb24gLXkiLCBhbmQgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyBvZiBCaXNvbiBkZWZpbmUKLWRubCBZWUJJU09OIGV2ZW4gaWYgcnVuIHdpdGggIi15Iiwgc28gd2UgZW5kIHVwIG5vdCBjb21waWxpbmcKLWRubCB0aGUgeXlwYXJzZSB3cmFwcGVyIGFuZCBlbmQgdXAgd2l0aCBhIGxpYnBjYXAgdGhhdCBkb2Vzbid0Ci1kbmwgZGVmaW5lIHBjYXBfcGFyc2UoKSkKLWRubAotZG5sIHVzYWdlOgotZG5sCi1kbmwJQUNfTEJMX0xFWF9BTkRfWUFDQyhsZXgsIHlhY2MsIHl5cHJlZml4KQotZG5sCi1kbmwgcmVzdWx0czoKLWRubAotZG5sCSQxIChsZXggc2V0KQotZG5sCSQyICh5YWNjIGFwcGVuZGVkKQotZG5sCSQzIChvcHRpb25hbCBmbGV4IGFuZCBiaXNvbiAtUCBwcmVmaXgpCi1kbmwKLUFDX0RFRlVOKEFDX0xCTF9MRVhfQU5EX1lBQ0MsCi0gICAgW0FDX0FSR19XSVRIKGZsZXgsIFsgIC0td2l0aG91dC1mbGV4ICAgICAgICAgIGRvbid0IHVzZSBmbGV4XSkKLSAgICBBQ19BUkdfV0lUSChiaXNvbiwgWyAgLS13aXRob3V0LWJpc29uICAgICAgICAgZG9uJ3QgdXNlIGJpc29uXSkKLSAgICBpZiB0ZXN0ICIkd2l0aF9mbGV4IiA9IG5vIDsgdGhlbgotCSAgICAkMT1sZXgKLSAgICBlbHNlCi0JICAgIEFDX0NIRUNLX1BST0dTKCQxLCBmbGV4LCBsZXgpCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkJDEiID0gZmxleCA7IHRoZW4KLQkgICAgIyBUaGUgLVYgZmxhZyB3YXMgYWRkZWQgaW4gMi40Ci0JICAgIEFDX01TR19DSEVDS0lORyhmb3IgZmxleCAyLjQgb3IgaGlnaGVyKQotCSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2ZsZXhfdjI0LAotCQlpZiBmbGV4IC1WID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQkJYWNfY3ZfbGJsX2ZsZXhfdjI0PXllcwotCQllbHNlCi0JCQlhY19jdl9sYmxfZmxleF92MjQ9bm8KLQkJZmkpCi0JICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9mbGV4X3YyNCkKLQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2ZsZXhfdjI0ID0gbm8gOyB0aGVuCi0JCSAgICBzPSIyLjQgb3IgaGlnaGVyIHJlcXVpcmVkIgotCQkgICAgQUNfTVNHX1dBUk4oaWdub3Jpbmcgb2Jzb2xldGUgZmxleCBleGVjdXRhYmxlICgkcykpCi0JCSAgICAkMT1sZXgKLQkgICAgZmkKLSAgICBmaQotICAgIGlmIHRlc3QgIiR3aXRoX2Jpc29uIiA9IG5vIDsgdGhlbgotCSAgICAkMj15YWNjCi0gICAgZWxzZQotCSAgICBBQ19DSEVDS19QUk9HUygkMiwgYmlzb24sIHlhY2MpCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkJDIiID0gYmlzb24gOyB0aGVuCi0JICAgICQyPSIkJDIgLXkiCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkJDEiICE9IGxleCAtYSAiJCQyIiA9IHlhY2MgLW8gIiQkMSIgPSBsZXggLWEgIiQkMiIgIT0geWFjYyA7IHRoZW4KLQkgICAgQUNfTVNHX1dBUk4oZG9uJ3QgaGF2ZSBib3RoIGZsZXggYW5kIGJpc29uOyByZXZlcnRpbmcgdG8gbGV4L3lhY2MpCi0JICAgICQxPWxleAotCSAgICAkMj15YWNjCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkJDEiID0gZmxleCAtYSAtbiAiJDMiIDsgdGhlbgotCSAgICAkMT0iJCQxIC1QJDMiCi0JICAgICQyPSIkJDIgLXAgJDMiCi0gICAgZWxzZQotCSAgICBBQ19ERUZJTkUoTkVFRF9ZWVBBUlNFX1dSQVBQRVIsMSxbaWYgd2UgbmVlZCBhIHBjYXBfcGFyc2Ugd3JhcHBlciBhcm91bmQgeXlwYXJzZV0pCi0gICAgZmldKQotCi1kbmwKIGRubCBDaGVja3MgdG8gc2VlIGlmIHVuaW9uIHdhaXQgaXMgdXNlZCB3aXRoIFdFWElUU1RBVFVTKCkKIGRubAogZG5sIHVzYWdlOgpAQCAtOTcwLDggKzkyNiwxMiBAQAogCSAgICBpZiB0ZXN0ICIkYWNfbGJsX2NjX2RvbnRfdHJ5X2djY19kYXNoVyIgIT0geWVzOyB0aGVuCiAJCSAgICBBQ19MQkxfQ0hFQ0tfVU5LTk9XTl9XQVJOSU5HX09QVElPTl9FUlJPUigpCiAJCSAgICBBQ19MQkxfQ0hFQ0tfQ09NUElMRVJfT1BUKCQxLCAtV2FsbCkKKwkJICAgIEFDX0xCTF9DSEVDS19DT01QSUxFUl9PUFQoJDEsIC1Xc2lnbi1jb21wYXJlKQogCQkgICAgQUNfTEJMX0NIRUNLX0NPTVBJTEVSX09QVCgkMSwgLVdtaXNzaW5nLXByb3RvdHlwZXMpCiAJCSAgICBBQ19MQkxfQ0hFQ0tfQ09NUElMRVJfT1BUKCQxLCAtV3N0cmljdC1wcm90b3R5cGVzKQorCQkgICAgQUNfTEJMX0NIRUNLX0NPTVBJTEVSX09QVCgkMSwgLVdzaGFkb3cpCisJCSAgICBBQ19MQkxfQ0hFQ0tfQ09NUElMRVJfT1BUKCQxLCAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCkKKwkJICAgIEFDX0xCTF9DSEVDS19DT01QSUxFUl9PUFQoJDEsIC1XdXNlZC1idXQtbWFya2VkLXVudXNlZCkKIAkgICAgZmkKIAkgICAgQUNfTEJMX0NIRUNLX0RFUEVOREVOQ1lfR0VORVJBVElPTl9PUFQoKQogCSAgICAjCmRpZmYgLS1naXQgYS9icGYvbmV0L2JwZl9maWx0ZXIuYyBiL2JwZi9uZXQvYnBmX2ZpbHRlci5jCmluZGV4IGZmZTA0Y2UuLjAxYTFiNjQgMTAwNjQ0Ci0tLSBhL2JwZi9uZXQvYnBmX2ZpbHRlci5jCisrKyBiL2JwZi9uZXQvYnBmX2ZpbHRlci5jCkBAIC00MiwxMSArNDIsMTEgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCi0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKIAogI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CiAKLSNlbHNlIC8qIFdJTjMyICovCisjZWxzZSAvKiBfV0lOMzIgKi8KIAogI2lmIEhBVkVfSU5UVFlQRVNfSAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC03Myw3ICs3Myw3IEBACiAjIGRlZmluZQlNTEVOKG0pCSgobSktPm1fbGVuKQogI2VuZGlmIC8qIGRlZmluZWQoX19ocHV4KSB8fCBTT0xBUklTICovCiAKLSNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIF9XSU4zMiAqLwogCiAjaW5jbHVkZSA8cGNhcC9icGYuaD4KIApAQCAtOTksNyArOTksNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgTEJMX0FMSUdOCi0jaWZuZGVmIFdJTjMyCisjaWZuZGVmIF9XSU4zMgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KICNlbmRpZgogCkBAIC0yMTYsNiArMjE2LDggQEAKICAqIHJlamVjdHMgdGhlIGZpbHRlcjsgaXQgY29udGFpbnMgVkxBTiB0YWcgaW5mb3JtYXRpb24KICAqIEZvciB0aGUga2VybmVsLCBwIGlzIGFzc3VtZWQgdG8gYmUgYSBwb2ludGVyIHRvIGFuIG1idWYgaWYgYnVmbGVuIGlzIDAsCiAgKiBpbiBhbGwgb3RoZXIgY2FzZXMsIHAgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIGFuZCBidWZsZW4gaXMgaXRzIHNpemUuCisgKgorICogVGhhbmtzIHRvIEFuaSBTaW5oYSA8YW5pQGFyaXN0YS5jb20+IGZvciBwcm92aWRpbmcgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgogICovCiB1X2ludAogYnBmX2ZpbHRlcl93aXRoX2F1eF9kYXRhKHBjLCBwLCB3aXJlbGVuLCBidWZsZW4sIGF1eF9kYXRhKQpAQCAtNTc3LDcgKzU3OSwxMiBAQAogCQkJY29udGludWU7CiAKIAkJY2FzZSBCUEZfQUxVfEJQRl9ORUc6Ci0JCQlBID0gLUE7CisJCQkvKgorCQkJICogTW9zdCBCUEYgYXJpdGhtZXRpYyBpcyB1bnNpZ25lZCwgYnV0IG5lZ2F0aW9uCisJCQkgKiBjYW4ndCBiZSB1bnNpZ25lZDsgdGhyb3cgc29tZSBjYXN0cyB0bworCQkJICogc3BlY2lmeSB3aGF0IHdlJ3JlIHRyeWluZyB0byBkby4KKwkJCSAqLworCQkJQSA9ICh1X2ludDMyKSgtKGludDMyKUEpOwogCQkJY29udGludWU7CiAKIAkJY2FzZSBCUEZfTUlTQ3xCUEZfVEFYOgpAQCAtNjMxLDcgKzYzOCw3IEBACiAJCXJldHVybiAwOwogI2VuZGlmCiAKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgKHVfaW50KWxlbjsgKytpKSB7CiAJCXAgPSAmZltpXTsKIAkJc3dpdGNoIChCUEZfQ0xBU1MocC0+Y29kZSkpIHsKIAkJLyoKQEAgLTczMiw3ICs3MzksNyBAQAogI2lmIGRlZmluZWQoS0VSTkVMKSB8fCBkZWZpbmVkKF9LRVJORUwpCiAJCQkJaWYgKGZyb20gKyBwLT5rIDwgZnJvbSB8fCBmcm9tICsgcC0+ayA+PSBsZW4pCiAjZWxzZQotCQkJCWlmIChmcm9tICsgcC0+ayA+PSBsZW4pCisJCQkJaWYgKGZyb20gKyBwLT5rID49ICh1X2ludClsZW4pCiAjZW5kaWYKIAkJCQkJcmV0dXJuIDA7CiAJCQkJYnJlYWs7CkBAIC03NDAsNyArNzQ3LDcgQEAKIAkJCWNhc2UgQlBGX0pHVDoKIAkJCWNhc2UgQlBGX0pHRToKIAkJCWNhc2UgQlBGX0pTRVQ6Ci0JCQkJaWYgKGZyb20gKyBwLT5qdCA+PSBsZW4gfHwgZnJvbSArIHAtPmpmID49IGxlbikKKwkJCQlpZiAoZnJvbSArIHAtPmp0ID49ICh1X2ludClsZW4gfHwgZnJvbSArIHAtPmpmID49ICh1X2ludClsZW4pCiAJCQkJCXJldHVybiAwOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2JwZl9kdW1wLmMgYi9icGZfZHVtcC5jCmluZGV4IDVlYWFkYzAuLmQ1YWI2MWUgMTAwNjQ0Ci0tLSBhL2JwZl9kdW1wLmMKKysrIGIvYnBmX2R1bXAuYwpAQCAtNTEsNyArNTEsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbjsgKytpbnNuLCArK2kpIHsKICNpZmRlZiBCREVCVUcKIAkJZXh0ZXJuIGludCBiaWRzW107Ci0JCXByaW50ZihiaWRzW2ldID4gMCA/ICJbJTAyZF0iIDogIiAtLSAiLCBiaWRzW2ldIC0gMSk7CisJCWlmIChiaWRzW2ldID4gMCkKKwkJCXByaW50ZigiWyUwMmRdIiwgYmlkc1tpXSAtIDEpOworCQllbHNlCisJCQlwcmludGYoIiAtLSAiKTsKICNlbmRpZgogCQlwdXRzKGJwZl9pbWFnZShpbnNuLCBpKSk7CiAJfQpkaWZmIC0tZ2l0IGEvYnBmX2ZpbHRlci5jIGIvYnBmX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjA2MDU0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9icGZfZmlsdGVyLmMKQEAgLTAsMCArMSBAQAorLi9icGYvbmV0L2JwZl9maWx0ZXIuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JwZl9pbWFnZS5jIGIvYnBmX2ltYWdlLmMKaW5kZXggM2U5YTIzZi4uMDFlYzUzNiAxMDA2NDQKLS0tIGEvYnBmX2ltYWdlLmMKKysrIGIvYnBmX2ltYWdlLmMKQEAgLTIzLDkgKzIzLDkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCi0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgotI2Vsc2UgLyogV0lOMzIgKi8KKyNlbHNlIC8qIF9XSU4zMiAqLwogI2lmIEhBVkVfSU5UVFlQRVNfSAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjZWxpZiBIQVZFX1NURElOVF9ICkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KICNlbmRpZgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmIC8qIFdJTjMyICovCisjZW5kaWYgLyogX1dJTjMyICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMzA2LDEzICszMDYsMTMgQEAKIAkJZm10ID0gIiI7CiAJCWJyZWFrOwogCX0KLQkodm9pZClzbnByaW50ZihvcGVyYW5kLCBzaXplb2Ygb3BlcmFuZCwgZm10LCB2KTsKKwkodm9pZClwY2FwX3NucHJpbnRmKG9wZXJhbmQsIHNpemVvZiBvcGVyYW5kLCBmbXQsIHYpOwogCWlmIChCUEZfQ0xBU1MocC0+Y29kZSkgPT0gQlBGX0pNUCAmJiBCUEZfT1AocC0+Y29kZSkgIT0gQlBGX0pBKSB7Ci0JCSh2b2lkKXNucHJpbnRmKGltYWdlLCBzaXplb2YgaW1hZ2UsCisJCSh2b2lkKXBjYXBfc25wcmludGYoaW1hZ2UsIHNpemVvZiBpbWFnZSwKIAkJCSAgICAgICIoJTAzZCkgJS04cyAlLTE2cyBqdCAlZFx0amYgJWQiLAogCQkJICAgICAgbiwgb3AsIG9wZXJhbmQsIG4gKyAxICsgcC0+anQsIG4gKyAxICsgcC0+amYpOwogCX0gZWxzZSB7Ci0JCSh2b2lkKXNucHJpbnRmKGltYWdlLCBzaXplb2YgaW1hZ2UsCisJCSh2b2lkKXBjYXBfc25wcmludGYoaW1hZ2UsIHNpemVvZiBpbWFnZSwKIAkJCSAgICAgICIoJTAzZCkgJS04cyAlcyIsCiAJCQkgICAgICBuLCBvcCwgb3BlcmFuZCk7CiAJfQpkaWZmIC0tZ2l0IGEvY21ha2UvcHJlY29uZmlndXJlLmNtYWtlIGIvY21ha2UvcHJlY29uZmlndXJlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzkyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9wcmVjb25maWd1cmUuY21ha2UKQEAgLTAsMCArMSw1NSBAQAoraWYoIE5PVCBMSUJQQ0FQX1BSRUNPTkZJR1VSRUQgKQorICAgIHNldCggTElCUENBUF9QUkVDT05GSUdVUkVEIFRSVUUgKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgICBQYXJhbWV0ZXJzCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgb3B0aW9uIChVU0VfU1RBVElDX1JUICJVc2Ugc3RhdGljIFJ1bnRpbWUiIE9OKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIFByb2plY3Qgc2V0aW5ncworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICBhZGRfZGVmaW5pdGlvbnMoIC1EQlVJTERJTkdfUENBUCApCisKKyAgICBpZiggTVNWQyApCisgICAgICAgIGFkZF9kZWZpbml0aW9ucyggLURfX1NURENfXyApCisgICAgICAgIGFkZF9kZWZpbml0aW9ucyggLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyApCisgICAgICAgIGFkZF9kZWZpbml0aW9ucyggIi1EX1VfPSIgKQorICAgIGVsc2VpZiggQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYICkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKCAiLURfVV89X19hdHRyaWJ1dGVfXygodW51c2VkKSkiICkKKyAgICBlbHNlKE1TVkMpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucyggIi1EX1VfPSIgKQorICAgIGVuZGlmKCBNU1ZDICkKKworICAgIGlmIChVU0VfU1RBVElDX1JUKQorICAgICAgICBNRVNTQUdFKCBTVEFUVVMgIlVzZSBTVEFUSUMgcnVudGltZSIgKQorCisgICAgICAgIGlmKCBNU1ZDICkKKyAgICAgICAgICAgIHNldCAoQ01BS0VfQ1hYX0ZMQUdTX01JTlNJWkVSRUwgICAgICIke0NNQUtFX0NYWF9GTEFHU19NSU5TSVpFUkVMfSAvTVQiKQorICAgICAgICAgICAgc2V0IChDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8gIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSAvTVQiKQorICAgICAgICAgICAgc2V0IChDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRSAgICAgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9IC9NVCIpCisgICAgICAgICAgICBzZXQgKENNQUtFX0NYWF9GTEFHU19ERUJVRyAgICAgICAgICAiJHtDTUFLRV9DWFhfRkxBR1NfREVCVUd9IC9NVGQiKQorCisgICAgICAgICAgICBzZXQgKENNQUtFX0NfRkxBR1NfTUlOU0laRVJFTCAgICAgICAiJHtDTUFLRV9DX0ZMQUdTX01JTlNJWkVSRUx9IC9NVCIpCisgICAgICAgICAgICBzZXQgKENNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk8gICAiJHtDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSAvTVQiKQorICAgICAgICAgICAgc2V0IChDTUFLRV9DX0ZMQUdTX1JFTEVBU0UgICAgICAgICAgIiR7Q01BS0VfQ19GTEFHU19SRUxFQVNFfSAvTVQiKQorICAgICAgICAgICAgc2V0IChDTUFLRV9DX0ZMQUdTX0RFQlVHICAgICAgICAgICAgIiR7Q01BS0VfQ19GTEFHU19ERUJVR30gL01UZCIpCisgICAgICAgIGVuZGlmKCBNU1ZDICkKKyAgICBlbHNlIChVU0VfU1RBVElDX1JUKQorICAgICAgICBNRVNTQUdFKCBTVEFUVVMgIlVzZSBEWU5BTUlDIHJ1bnRpbWUiICkKKworICAgICAgICBpZiggTVNWQyApCisgICAgICAgICAgICBzZXQgKENNQUtFX0NYWF9GTEFHU19NSU5TSVpFUkVMICAgICAiJHtDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTH0gL01EIikKKyAgICAgICAgICAgIHNldCAoQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPICIke0NNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GT30gL01EIikKKyAgICAgICAgICAgIHNldCAoQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UgICAgICAgICIke0NNQUtFX0NYWF9GTEFHU19SRUxFQVNFfSAvTUQiKQorICAgICAgICAgICAgc2V0IChDTUFLRV9DWFhfRkxBR1NfREVCVUcgICAgICAgICAgIiR7Q01BS0VfQ1hYX0ZMQUdTX0RFQlVHfSAvTURkIikKKworICAgICAgICAgICAgc2V0IChDTUFLRV9DX0ZMQUdTX01JTlNJWkVSRUwgICAgICAgIiR7Q01BS0VfQ19GTEFHU19NSU5TSVpFUkVMfSAvTUQiKQorICAgICAgICAgICAgc2V0IChDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPICAgIiR7Q01BS0VfQ19GTEFHU19SRUxXSVRIREVCSU5GT30gL01EIikKKyAgICAgICAgICAgIHNldCAoQ01BS0VfQ19GTEFHU19SRUxFQVNFICAgICAgICAgICIke0NNQUtFX0NfRkxBR1NfUkVMRUFTRX0gL01EIikKKyAgICAgICAgICAgIHNldCAoQ01BS0VfQ19GTEFHU19ERUJVRyAgICAgICAgICAgICIke0NNQUtFX0NfRkxBR1NfREVCVUd9IC9NRGQiKQorICAgICAgICBlbmRpZiggTVNWQyApCisgICAgZW5kaWYgKFVTRV9TVEFUSUNfUlQpCitlbmRpZiggTk9UIExJQlBDQVBfUFJFQ09ORklHVVJFRCApCmRpZmYgLS1naXQgYS9jbWFrZWNvbmZpZy5oLmluIGIvY21ha2Vjb25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGVkYjVmCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2Vjb25maWcuaC5pbgpAQCAtMCwwICsxLDM0NSBAQAorLyogY21ha2Vjb25maWcuaC5pbiAqLworCisvKiBFbmFibGUgb3B0aW1pemVyIGRlYnVnZ2luZyAqLworI2NtYWtlZGVmaW5lIEJERUJVRyAxCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBhIGNsb25pbmcgQlBGIGRldmljZSAqLworI2NtYWtlZGVmaW5lIEhBVkVfQ0xPTklOR19CUEYgMQorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgdGhlIERBRyBBUEkgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RBR19BUEkgMQorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgZGFnX2dldF9lcmZfdHlwZXMoKSAqLworI2NtYWtlZGVmaW5lIEhBVkVfREFHX0dFVF9FUkZfVFlQRVMgMQorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzKCkgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RBR19HRVRfU1RSRUFNX0VSRl9UWVBFUyAxCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJlYW1zIGNhcGFibGUgREFHIEFQSSAqLworI2NtYWtlZGVmaW5lIEhBVkVfREFHX1NUUkVBTVNfQVBJIDEKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHZkYWdfc2V0X2RldmljZV9pbmZvKCkgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RBR19WREFHIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBldGhlcl9ob3N0dG9uJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RFQ0xfRVRIRVJfSE9TVFRPTiAxCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBhIC9kZXYvZGxwaSAqLworI2NtYWtlZGVmaW5lIEhBVkVfREVWX0RMUEkgMQorCisvKiBpZiBwYXNzaXZlX3JlcV90IHByaW1pdGl2ZSBleGlzdHMgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RMUElfUEFTU0lWRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZXRoZXJfaG9zdHRvbicgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9FVEhFUl9IT1NUVE9OIDEKKworLyogRGVmaW5lIHRvIDEgaWYgZnNlZWtvIChhbmQgcHJlc3VtYWJseSBmdGVsbG8pIGV4aXN0cyBhbmQgaXMgZGVjbGFyZWQuICovCisjY21ha2VkZWZpbmUgSEFWRV9GU0VFS08gMQorCisvKiBvbiBIUC1VWCAxMC4yMCBvciBsYXRlciAqLworI2NtYWtlZGVmaW5lIEhBVkVfSFBVWDEwXzIwX09SX0xBVEVSIDEKKworLyogb24gSFAtVVggOS54ICovCisjY21ha2VkZWZpbmUgSEFWRV9IUFVYOSAxCisKKy8qIGlmIHBwYV9pbmZvX3RfZGxfbW9kdWxlX2lkIGV4aXN0cyAqLworI2NtYWtlZGVmaW5lIEhBVkVfSFBfUFBBX0lORk9fVF9ETF9NT0RVTEVfSURfMSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKworLyogaWYgbGliZGxwaSBleGlzdHMgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0xJQkRMUEkgMQorCisvKiBpZiBsaWJubCBleGlzdHMgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0xJQk5MIDEKKworLyogaWYgbGlibmwgZXhpc3RzIGFuZCBpcyB2ZXJzaW9uIDIueCAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElCTkxfMl94IDEKKworLyogaWYgbGlibmwgZXhpc3RzIGFuZCBpcyB2ZXJzaW9uIDMueCAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElCTkxfM194IDEKKworLyogbGlibmwgaGFzIE5MRV9GQUlMVVJFICovCisjY21ha2VkZWZpbmUgSEFWRV9MSUJOTF9OTEUgMQorCisvKiBsaWJubCBoYXMgbmV3LXN0eWxlIHNvY2tldCBhcGkgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0xJQk5MX1NPQ0tFVFMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0xJTUlUU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9jb21waWxlci5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0xJTlVYX0NPTVBJTEVSX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2V0aHRvb2wuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9MSU5VWF9FVEhUT09MX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2lmX2JvbmRpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9MSU5VWF9JRl9CT05ESU5HX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2lmX3BhY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0xJTlVYX0lGX1BBQ0tFVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9uZXRfdHN0YW1wLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElOVVhfTkVUX1RTVEFNUF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9zb2NraW9zLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElOVVhfU09DS0lPU19IIDEKKworLyogaWYgdHBfdmxhbl90Y2kgZXhpc3RzICovCisjY21ha2VkZWZpbmUgSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0kgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElOVVhfVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvdXNiZGV2aWNlX2ZzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElOVVhfVVNCREVWSUNFX0ZTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L3dpcmVsZXNzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTElOVVhfV0lSRUxFU1NfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvZXRoZXIuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVRJTkVUX0VUSEVSX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaWZfZXRoZXIuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldHBhY2tldC9pZl9wYWNrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVRQQUNLRVRfSUZfUEFDS0VUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldHBhY2tldC9wYWNrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVRQQUNLRVRfUEFDS0VUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldC9pZl9tZWRpYS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX05FVF9JRl9NRURJQV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXQvcGZ2YXIuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVRfUEZWQVJfSCAxCisKKy8qIGlmIHRoZXJlJ3MgYW4gb3NfcHJvdG8uaCBmb3IgdGhpcyBwbGF0Zm9ybSwgdG8gdXNlIGFkZGl0aW9uYWwgcHJvdG90eXBlcyAqLworI2NtYWtlZGVmaW5lIEhBVkVfT1NfUFJPVE9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHJlbW90ZSBwYWNrZXQgY2FwdHVyZSBpcyB0byBiZSBzdXBwb3J0ZWQgKi8KKyNjbWFrZWRlZmluZSBIQVZFX1JFTU9URSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cGF0aHMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9QQVRIU19IIDEKKworLyogZGVmaW5lIGlmIG5ldC9wZnZhci5oIGRlZmluZXMgUEZfTkFUIHRocm91Z2ggUEZfTk9SRFIgKi8KKyNjbWFrZWRlZmluZSBIQVZFX1BGX05BVF9USFJPVUdIX1BGX05PUkRSIDEKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBTZXB0ZWwgQVBJICovCisjY21ha2VkZWZpbmUgSEFWRV9TRVBURUxfQVBJIDEKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBNeXJpY29tIFNORiBBUEkgKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NORl9BUEkgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NOUFJJTlRGIDEKKworLyogaWYgc3RydWN0IHNvY2thZGRyIGhhcyB0aGUgc2FfbGVuIG1lbWJlciAqLworI2NtYWtlZGVmaW5lIEhBVkVfU09DS0FERFJfU0FfTEVOIDEKKworLyogaWYgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZXhpc3RzICovCisjY21ha2VkZWZpbmUgSEFWRV9TT0NLQUREUl9TVE9SQUdFIDEKKworLyogZGVmaW5lIGlmIHNvY2tsZW5fdCBpcyBkZWZpbmVkICovCisjY21ha2VkZWZpbmUgSEFWRV9TT0NLTEVOX1QgMQorCisvKiBPbiBzb2xhcmlzICovCisjY21ha2VkZWZpbmUgSEFWRV9TT0xBUklTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUUkVSUk9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJsY3B5JyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUUkxDUFkgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc3RydWN0IEJQRl9USU1FVkFMJy4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUUlVDVF9CUEZfVElNRVZBTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3QgZXRoZXJfYWRkcicuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVFJVQ1RfRVRIRVJfQUREUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2JpdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfQklUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvYnVmbW9kLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX0JVRk1PRF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGxwaV9leHQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfRExQSV9FWFRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvY2NvbS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19JT0NDT01fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tpby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19TT0NLSU9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSB0aGUgVHVyYm9DYXAgQVBJICovCisjY21ha2VkZWZpbmUgSEFWRV9UQ19BUEkgMQorCisvKiBpZiBpZl9wYWNrZXQuaCBoYXMgdHBhY2tldF9zdGF0cyBkZWZpbmVkICovCisjY21ha2VkZWZpbmUgSEFWRV9UUEFDS0VUX1NUQVRTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIGlmIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgaGFzIGJSZXF1ZXN0VHlwZSAqLworI2NtYWtlZGVmaW5lIEhBVkVfVVNCREVWRlNfQ1RSTFRSQU5TRkVSX0JSRVFVRVNUVFlQRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1ZTTlBSSU5URiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgUGFja2V0SXNMb29wYmFja0FkYXB0ZXInIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUEFDS0VUX0lTX0xPT1BCQUNLX0FEQVBURVIgMQorCisvKiBkZWZpbmUgaWYgdGhlIHN5c3RlbSBzdXBwb3J0cyB6ZXJvY29weSBCUEYgKi8KKyNjbWFrZWRlZmluZSBIQVZFX1pFUk9DT1BZX0JQRiAxCisKKy8qIGRlZmluZSBpZiB5b3VyIGNvbXBpbGVyIGhhcyBfX2F0dHJpYnV0ZV9fICovCisjY21ha2VkZWZpbmUgSEFWRV9fX0FUVFJJQlVURV9fIDEKKworLyogSVB2NiAqLworI2NtYWtlZGVmaW5lIElORVQ2IDEKKworLyogaWYgdW5hbGlnbmVkIGFjY2VzcyBmYWlscyAqLworI2NtYWtlZGVmaW5lIExCTF9BTElHTiAxCisKKy8qIHBhdGggZm9yIGRldmljZSBmb3IgVVNCIHNuaWZmaW5nICovCisjY21ha2VkZWZpbmUgTElOVVhfVVNCX01PTl9ERVYgMQorCisvKiBpZiB3ZSBuZWVkIGEgcGNhcF9wYXJzZSB3cmFwcGVyIGFyb3VuZCB5eXBhcnNlICovCisjY21ha2VkZWZpbmUgTkVFRF9ZWVBBUlNFX1dSQVBQRVIgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBuZXRpbmV0L2V0aGVyLmggZGVjbGFyZXMgYGV0aGVyX2hvc3R0b24nICovCisjY21ha2VkZWZpbmUgTkVUSU5FVF9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX0hPU1RUT04gMQorCisvKiBEZWZpbmUgdG8gMSBpZiBuZXRpbmV0L2lmX2V0aGVyLmggZGVjbGFyZXMgYGV0aGVyX2hvc3R0b24nICovCisjY21ha2VkZWZpbmUgTkVUSU5FVF9JRl9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX0hPU1RUT04gMQorCisvKiBkbyBub3QgdXNlIHByb3RvY2hhaW4gKi8KKyNjbWFrZWRlZmluZSBOT19QUk9UT0NIQUlOIDEKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgMQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9OQU1FIDEKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfU1RSSU5HIDEKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAxCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9VUkwgMQorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAxCisKKy8qIC9kZXYvZGxwaSBkaXJlY3RvcnkgKi8KKyNjbWFrZWRlZmluZSBQQ0FQX0RFVl9QUkVGSVggMQorCisvKiB0YXJnZXQgaG9zdCBzdXBwb3J0cyBCbHVldG9vdGggc25pZmZpbmcgKi8KKyNjbWFrZWRlZmluZSBQQ0FQX1NVUFBPUlRfQlQgMQorCisvKiB0YXJnZXQgaG9zdCBzdXBwb3J0cyBCbHVldG9vdGggTW9uaXRvciAqLworI2NtYWtlZGVmaW5lIFBDQVBfU1VQUE9SVF9CVF9NT05JVE9SIDEKKworLyogc3VwcG9ydCBELUJ1cyBzbmlmZmluZyAqLworI2NtYWtlZGVmaW5lIFBDQVBfU1VQUE9SVF9EQlVTIDEKKworLyogdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgbmV0ZmlsdGVyIHNuaWZmaW5nICovCisjY21ha2VkZWZpbmUgUENBUF9TVVBQT1JUX05FVEZJTFRFUiAxCisKKy8qIHVzZSBMaW51eCBwYWNrZXQgcmluZyBjYXB0dXJlIGlmIGF2YWlsYWJsZSAqLworI2NtYWtlZGVmaW5lIFBDQVBfU1VQUE9SVF9QQUNLRVRfUklORyAxCisKKy8qIHRhcmdldCBob3N0IHN1cHBvcnRzIFVTQiBzbmlmZmluZyAqLworI2NtYWtlZGVmaW5lIFBDQVBfU1VQUE9SVF9VU0IgMQorCisvKiBpbmNsdWRlIEFDTiBzdXBwb3J0ICovCisjY21ha2VkZWZpbmUgU0lUQSAxCisKKy8qIGlmIHN0cnVjdCBzb2NrYWRkcl9oY2kgaGFzIGhjaV9jaGFubmVsIG1lbWJlciAqLworI2NtYWtlZGVmaW5lIFNPQ0tBRERSX0hDSV9IQVNfSENJX0NIQU5ORUwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNjbWFrZWRlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBFbmFibGUgcGFyc2VyIGRlYnVnZ2luZyAqLworI2NtYWtlZGVmaW5lIFlZREVCVUcgMQorCisvKiBFbmFibGUgbGFyZ2UgaW5vZGUgbnVtYmVycyBvbiBNYWMgT1MgWCAxMC41LiAgKi8KKyNpZm5kZWYgX0RBUldJTl9VU0VfNjRfQklUX0lOT0RFCisjIGRlZmluZSBfREFSV0lOX1VTRV82NF9CSVRfSU5PREUgMQorI2VuZGlmCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgZmlsZSBvZmZzZXQsIG9uIGhvc3RzIHdoZXJlIHRoaXMgaXMgc2V0dGFibGUuICovCisjY21ha2VkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgMQorCisvKiBEZWZpbmUgdG8gMSB0byBtYWtlIGZzZWVrbyB2aXNpYmxlIG9uIHNvbWUgaG9zdHMgKGUuZy4gZ2xpYmMgMi4yKS4gKi8KKyNjbWFrZWRlZmluZSBfTEFSR0VGSUxFX1NPVVJDRSAxCisKKy8qIERlZmluZSBmb3IgbGFyZ2UgZmlsZXMsIG9uIEFJWC1zdHlsZSBob3N0cy4gKi8KKyNjbWFrZWRlZmluZSBfTEFSR0VfRklMRVMgMQorCisvKiBkZWZpbmUgb24gQUlYIHRvIGdldCBjZXJ0YWluIGZ1bmN0aW9ucyAqLworI2NtYWtlZGVmaW5lIF9TVU4gMQorCisvKiBkZWZpbmUgaWYgeW91ciBjb21waWxlciBhbGxvd3MgX19hdHRyaWJ1dGVfXygoZm9ybWF0KSkgd2l0aG91dCBhIHdhcm5pbmcgKi8KKyNjbWFrZWRlZmluZSBfX0FUVFJJQlVURV9fX0ZPUk1BVF9PSyAxCisKKyNpZiAwCisvKiB0byBoYW5kbGUgVWx0cml4IGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgY29uc3QgaW4gcHJvdG90eXBlcyAqLworI2NtYWtlZGVmaW5lIGNvbnN0IDEKKworLyogRGVmaW5lIGFzIHRva2VuIGZvciBpbmxpbmUgaWYgaW5saW5pbmcgc3VwcG9ydGVkICovCisjY21ha2VkZWZpbmUgaW5saW5lIDEKKworLyogRGVmaW5lIHRvIGBzaG9ydCcgaWYgaW50MTZfdCBub3QgZGVmaW5lZC4gKi8KKyNjbWFrZWRlZmluZSBpbnQxNl90IDEKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIGludDMyX3Qgbm90IGRlZmluZWQuICovCisjY21ha2VkZWZpbmUgaW50MzJfdCAxCisKKy8qIERlZmluZSB0byBgbG9uZyBsb25nJyBpZiBpbnQ2NF90IG5vdCBkZWZpbmVkLiAqLworI2NtYWtlZGVmaW5lIGludDY0X3QgMQorCisvKiBEZWZpbmUgdG8gYHNpZ25lZCBjaGFyJyBpZiBpbnQ4X3Qgbm90IGRlZmluZWQuICovCisjY21ha2VkZWZpbmUgaW50OF90IDEKKworLyogb24gc2luaXggKi8KKyNjbWFrZWRlZmluZSBzaW5peCAxCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgc2hvcnQnIGlmIHVfaW50MTZfdCBub3QgZGVmaW5lZC4gKi8KKyNjbWFrZWRlZmluZSB1X2ludDE2X3QgMQorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgdV9pbnQzMl90IG5vdCBkZWZpbmVkLiAqLworI2NtYWtlZGVmaW5lIHVfaW50MzJfdCAxCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgbG9uZyBsb25nJyBpZiB1X2ludDY0X3Qgbm90IGRlZmluZWQuICovCisjY21ha2VkZWZpbmUgdV9pbnQ2NF90IDEKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBjaGFyJyBpZiB1X2ludDhfdCBub3QgZGVmaW5lZC4gKi8KKyNjbWFrZWRlZmluZSB1X2ludDhfdCAxCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbmZpZy5oIGIvY29uZmlnLmgKaW5kZXggNjgwYmZkOC4uYTYwNTA2OCAxMDA2NDQKLS0tIGEvY29uZmlnLmgKKysrIGIvY29uZmlnLmgKQEAgLTEsNSArMSw1IEBACiAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCi0vKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLwogCiAvKiBFbmFibGUgb3B0aW1pemVyIGRlYnVnZ2luZyAqLwogLyogI3VuZGVmIEJERUJVRyAqLwpAQCAtMjQsNyArMjQsNyBAQAogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGV0aGVyX2hvc3R0b24nLCBhbmQgdG8gMCBpZiB5b3UKICAgIGRvbid0LiAqLwotLyogI3VuZGVmIEhBVkVfREVDTF9FVEhFUl9IT1NUVE9OICovCisjZGVmaW5lIEhBVkVfREVDTF9FVEhFUl9IT1NUVE9OIDEKIAogLyogZGVmaW5lIGlmIHlvdSBoYXZlIGEgL2Rldi9kbHBpICovCiAvKiAjdW5kZWYgSEFWRV9ERVZfRExQSSAqLwpAQCAtODYsNiArODYsOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9uZXRfdHN0YW1wLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX0xJTlVYX05FVF9UU1RBTVBfSCAxCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvc29ja2lvcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9MSU5VWF9TT0NLSU9TX0ggMQorCiAvKiBpZiB0cF92bGFuX3RjaSBleGlzdHMgKi8KICNkZWZpbmUgSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0kgMQogCkBAIC0xMjIsMTYgKzEyNSwxMyBAQAogLyogaWYgdGhlcmUncyBhbiBvc19wcm90by5oIGZvciB0aGlzIHBsYXRmb3JtLCB0byB1c2UgYWRkaXRpb25hbCBwcm90b3R5cGVzICovCiAvKiAjdW5kZWYgSEFWRV9PU19QUk9UT19IICovCiAKLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cGF0aHMuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfUEFUSFNfSCAxCi0KIC8qIGRlZmluZSBpZiBuZXQvcGZ2YXIuaCBkZWZpbmVzIFBGX05BVCB0aHJvdWdoIFBGX05PUkRSICovCiAvKiAjdW5kZWYgSEFWRV9QRl9OQVRfVEhST1VHSF9QRl9OT1JEUiAqLwogCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgYSBTZXB0ZWwgQVBJICovCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgdGhlIFNlcHRlbCBBUEkgKi8KIC8qICN1bmRlZiBIQVZFX1NFUFRFTF9BUEkgKi8KIAotLyogZGVmaW5lIGlmIHlvdSBoYXZlIE15cmljb20gU05GIEFQSSAqLworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBNeXJpY29tIFNORiBBUEkgKi8KIC8qICN1bmRlZiBIQVZFX1NORl9BUEkgKi8KIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzbnByaW50ZicgZnVuY3Rpb24uICovCkBAIC0xNjUsNyArMTY1LDEwIEBACiAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmxjcHknIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NUUkxDUFkgMQorLyogI3VuZGVmIEhBVkVfU1RSTENQWSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRva19yJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJUT0tfUiAxCiAKIC8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3QgQlBGX1RJTUVWQUwnLiAqLwogLyogI3VuZGVmIEhBVkVfU1RSVUNUX0JQRl9USU1FVkFMICovCkBAIC0xODUsNiArMTg4LDkgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvY2NvbS5oPiBoZWFkZXIgZmlsZS4gKi8KIC8qICN1bmRlZiBIQVZFX1NZU19JT0NDT01fSCAqLwogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zZWxlY3QuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9IIDEKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2lvLmg+IGhlYWRlciBmaWxlLiAqLwogLyogI3VuZGVmIEhBVkVfU1lTX1NPQ0tJT19IICovCiAKQEAgLTE5NCw2ICsyMDAsOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCiAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQogCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgdGhlIFR1cmJvQ2FwIEFQSSAqLworLyogI3VuZGVmIEhBVkVfVENfQVBJICovCisKIC8qIGlmIGlmX3BhY2tldC5oIGhhcyB0cGFja2V0X3N0YXRzIGRlZmluZWQgKi8KICNkZWZpbmUgSEFWRV9UUEFDS0VUX1NUQVRTIDEKIApAQCAtMjAzLDkgKzIxMiw2IEBACiAvKiBpZiBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyIGhhcyBiUmVxdWVzdFR5cGUgKi8KICNkZWZpbmUgSEFWRV9VU0JERVZGU19DVFJMVFJBTlNGRVJfQlJFUVVFU1RUWVBFIDEKIAotLyogZGVmaW5lIGlmIHZlcnNpb24uaCBpcyBnZW5lcmF0ZWQgaW4gdGhlIGJ1aWxkIHByb2NlZHVyZSAqLwotI2RlZmluZSBIQVZFX1ZFUlNJT05fSCAxCi0KIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KICNkZWZpbmUgSEFWRV9WU05QUklOVEYgMQogCkBAIC0yMjQsMTEgKzIzMCw4IEBACiAvKiBwYXRoIGZvciBkZXZpY2UgZm9yIFVTQiBzbmlmZmluZyAqLwogI2RlZmluZSBMSU5VWF9VU0JfTU9OX0RFViAiL2Rldi91c2Jtb24iCiAKLS8qIGlmIHdlIG5lZWQgYSBwY2FwX3BhcnNlIHdyYXBwZXIgYXJvdW5kIHl5cGFyc2UgKi8KLS8qICN1bmRlZiBORUVEX1lZUEFSU0VfV1JBUFBFUiAqLwotCiAvKiBEZWZpbmUgdG8gMSBpZiBuZXRpbmV0L2V0aGVyLmggZGVjbGFyZXMgYGV0aGVyX2hvc3R0b24nICovCi0vKiAjdW5kZWYgTkVUSU5FVF9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX0hPU1RUT04gKi8KKyNkZWZpbmUgTkVUSU5FVF9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX0hPU1RUT04gLyoqLwogCiAvKiBEZWZpbmUgdG8gMSBpZiBuZXRpbmV0L2lmX2V0aGVyLmggZGVjbGFyZXMgYGV0aGVyX2hvc3R0b24nICovCiAvKiAjdW5kZWYgTkVUSU5FVF9JRl9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX0hPU1RUT04gKi8KQEAgLTI2MCwxMSArMjYzLDggQEAKIC8qIHRhcmdldCBob3N0IHN1cHBvcnRzIEJsdWV0b290aCBzbmlmZmluZyAqLwogLyogI3VuZGVmIFBDQVBfU1VQUE9SVF9CVCAqLwogCi0vKiB0YXJnZXQgaG9zdCBzdXBwb3J0cyBDQU4gc25pZmZpbmcgKi8KLSNkZWZpbmUgUENBUF9TVVBQT1JUX0NBTiAxCi0KLS8qIHRhcmdldCBob3N0IHN1cHBvcnRzIGNhbnVzYiAqLwotLyogI3VuZGVmIFBDQVBfU1VQUE9SVF9DQU5VU0IgKi8KKy8qIHRhcmdldCBob3N0IHN1cHBvcnRzIEJsdWV0b290aCBNb25pdG9yICovCisvKiAjdW5kZWYgUENBUF9TVVBQT1JUX0JUX01PTklUT1IgKi8KIAogLyogc3VwcG9ydCBELUJ1cyBzbmlmZmluZyAqLwogLyogI3VuZGVmIFBDQVBfU1VQUE9SVF9EQlVTICovCkBAIC0yNzIsNiArMjcyLDkgQEAKIC8qIHRhcmdldCBob3N0IHN1cHBvcnRzIG5ldGZpbHRlciBzbmlmZmluZyAqLwogI2RlZmluZSBQQ0FQX1NVUFBPUlRfTkVURklMVEVSIDEKIAorLyogdXNlIExpbnV4IHBhY2tldCByaW5nIGNhcHR1cmUgaWYgYXZhaWxhYmxlICovCisjZGVmaW5lIFBDQVBfU1VQUE9SVF9QQUNLRVRfUklORyAxCisKIC8qIHRhcmdldCBob3N0IHN1cHBvcnRzIFVTQiBzbmlmZmluZyAqLwogI2RlZmluZSBQQ0FQX1NVUFBPUlRfVVNCIDEKIApAQCAtMjg3LDYgKzI5MCwxMCBAQAogLyogRW5hYmxlIHBhcnNlciBkZWJ1Z2dpbmcgKi8KIC8qICN1bmRlZiBZWURFQlVHICovCiAKKy8qIERlZmluZSB0byAxIGlmIGBsZXgnIGRlY2xhcmVzIGB5eXRleHQnIGFzIGEgYGNoYXIgKicgYnkgZGVmYXVsdCwgbm90IGEKKyAgIGBjaGFyW10nLiAqLworI2RlZmluZSBZWVRFWFRfUE9JTlRFUiAxCisKIC8qIEVuYWJsZSBsYXJnZSBpbm9kZSBudW1iZXJzIG9uIE1hYyBPUyBYIDEwLjUuICAqLwogI2lmbmRlZiBfREFSV0lOX1VTRV82NF9CSVRfSU5PREUKICMgZGVmaW5lIF9EQVJXSU5fVVNFXzY0X0JJVF9JTk9ERSAxCmRpZmYgLS1naXQgYS9jb25maWcuaC5pbiBiL2NvbmZpZy5oLmluCmluZGV4IDNiOWY5MGEuLmU4NWIyYTMgMTAwNjQ0Ci0tLSBhL2NvbmZpZy5oLmluCisrKyBiL2NvbmZpZy5oLmluCkBAIC0xLDQgKzEsNCBAQAotLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KIAogLyogRW5hYmxlIG9wdGltaXplciBkZWJ1Z2dpbmcgKi8KICN1bmRlZiBCREVCVUcKQEAgLTEyNCwxNiArMTI0LDEzIEBACiAvKiBpZiB0aGVyZSdzIGFuIG9zX3Byb3RvLmggZm9yIHRoaXMgcGxhdGZvcm0sIHRvIHVzZSBhZGRpdGlvbmFsIHByb3RvdHlwZXMgKi8KICN1bmRlZiBIQVZFX09TX1BST1RPX0gKIAotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwYXRocy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1BBVEhTX0gKLQogLyogZGVmaW5lIGlmIG5ldC9wZnZhci5oIGRlZmluZXMgUEZfTkFUIHRocm91Z2ggUEZfTk9SRFIgKi8KICN1bmRlZiBIQVZFX1BGX05BVF9USFJPVUdIX1BGX05PUkRSCiAKLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBhIFNlcHRlbCBBUEkgKi8KKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSB0aGUgU2VwdGVsIEFQSSAqLwogI3VuZGVmIEhBVkVfU0VQVEVMX0FQSQogCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgTXlyaWNvbSBTTkYgQVBJICovCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgdGhlIE15cmljb20gU05GIEFQSSAqLwogI3VuZGVmIEhBVkVfU05GX0FQSQogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNucHJpbnRmJyBmdW5jdGlvbi4gKi8KQEAgLTE2OSw2ICsxNjYsOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJsY3B5JyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX1NUUkxDUFkKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2tfcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJUT0tfUgorCiAvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc3RydWN0IEJQRl9USU1FVkFMJy4gKi8KICN1bmRlZiBIQVZFX1NUUlVDVF9CUEZfVElNRVZBTAogCkBAIC0xODcsNiArMTg3LDkgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvY2NvbS5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX1NZU19JT0NDT01fSAogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zZWxlY3QuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU0VMRUNUX0gKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2lvLmg+IGhlYWRlciBmaWxlLiAqLwogI3VuZGVmIEhBVkVfU1lTX1NPQ0tJT19ICiAKQEAgLTE5Niw2ICsxOTksOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAogCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgdGhlIFR1cmJvQ2FwIEFQSSAqLworI3VuZGVmIEhBVkVfVENfQVBJCisKIC8qIGlmIGlmX3BhY2tldC5oIGhhcyB0cGFja2V0X3N0YXRzIGRlZmluZWQgKi8KICN1bmRlZiBIQVZFX1RQQUNLRVRfU1RBVFMKIApAQCAtMjA1LDkgKzIxMSw2IEBACiAvKiBpZiBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyIGhhcyBiUmVxdWVzdFR5cGUgKi8KICN1bmRlZiBIQVZFX1VTQkRFVkZTX0NUUkxUUkFOU0ZFUl9CUkVRVUVTVFRZUEUKIAotLyogZGVmaW5lIGlmIHZlcnNpb24uaCBpcyBnZW5lcmF0ZWQgaW4gdGhlIGJ1aWxkIHByb2NlZHVyZSAqLwotI3VuZGVmIEhBVkVfVkVSU0lPTl9ICi0KIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX1ZTTlBSSU5URgogCkBAIC0yMjYsOSArMjI5LDYgQEAKIC8qIHBhdGggZm9yIGRldmljZSBmb3IgVVNCIHNuaWZmaW5nICovCiAjdW5kZWYgTElOVVhfVVNCX01PTl9ERVYKIAotLyogaWYgd2UgbmVlZCBhIHBjYXBfcGFyc2Ugd3JhcHBlciBhcm91bmQgeXlwYXJzZSAqLwotI3VuZGVmIE5FRURfWVlQQVJTRV9XUkFQUEVSCi0KIC8qIERlZmluZSB0byAxIGlmIG5ldGluZXQvZXRoZXIuaCBkZWNsYXJlcyBgZXRoZXJfaG9zdHRvbicgKi8KICN1bmRlZiBORVRJTkVUX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfSE9TVFRPTgogCkBAIC0yNjUsMTIgKzI2NSw2IEBACiAvKiB0YXJnZXQgaG9zdCBzdXBwb3J0cyBCbHVldG9vdGggTW9uaXRvciAqLwogI3VuZGVmIFBDQVBfU1VQUE9SVF9CVF9NT05JVE9SCiAKLS8qIHRhcmdldCBob3N0IHN1cHBvcnRzIENBTiBzbmlmZmluZyAqLwotI3VuZGVmIFBDQVBfU1VQUE9SVF9DQU4KLQotLyogdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgY2FudXNiICovCi0jdW5kZWYgUENBUF9TVVBQT1JUX0NBTlVTQgotCiAvKiBzdXBwb3J0IEQtQnVzIHNuaWZmaW5nICovCiAjdW5kZWYgUENBUF9TVVBQT1JUX0RCVVMKIApAQCAtMjk1LDYgKzI4OSwxMCBAQAogLyogRW5hYmxlIHBhcnNlciBkZWJ1Z2dpbmcgKi8KICN1bmRlZiBZWURFQlVHCiAKKy8qIERlZmluZSB0byAxIGlmIGBsZXgnIGRlY2xhcmVzIGB5eXRleHQnIGFzIGEgYGNoYXIgKicgYnkgZGVmYXVsdCwgbm90IGEKKyAgIGBjaGFyW10nLiAqLworI3VuZGVmIFlZVEVYVF9QT0lOVEVSCisKIC8qIEVuYWJsZSBsYXJnZSBpbm9kZSBudW1iZXJzIG9uIE1hYyBPUyBYIDEwLjUuICAqLwogI2lmbmRlZiBfREFSV0lOX1VTRV82NF9CSVRfSU5PREUKICMgZGVmaW5lIF9EQVJXSU5fVVNFXzY0X0JJVF9JTk9ERSAxCmRpZmYgLS1naXQgYS9jb25maWcvaGF2ZV9zaW9jZ2xpZmNvbmYuYyBiL2NvbmZpZy9oYXZlX3Npb2NnbGlmY29uZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjdhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvaGF2ZV9zaW9jZ2xpZmNvbmYuYwpAQCAtMCwwICsxLDYgQEAKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tpby5oPgoraW50IG1haW4oKSB7CisgICAgaW9jdGwoMCwgU0lPQ0dMSUZDT05GLCAoY2hhciAqKTApOworfQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDJiNjliNmQuLjRjNjQ4NzUgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTYyNywxMCArNjI3LDYgQEAKIERCVVNfU1JDCiBQQ0FQX1NVUFBPUlRfREJVUwogUEtHQ09ORklHCi1DQU5fU1JDCi1QQ0FQX1NVUFBPUlRfQ0FOCi1DQU5VU0JfU1JDCi1QQ0FQX1NVUFBPUlRfQ0FOVVNCCiBCVF9NT05JVE9SX1NSQwogQlRfU1JDCiBQQ0FQX1NVUFBPUlRfQlQKQEAgLTY0NCwxMSArNjQwLDEzIEBACiBTU1JDCiBBRERMQVJDSElWRU9CSlMKIEFERExPQkpTCitWX1lBQ0MKIFZfUlBBVEhfT1BUCiBWX1NPTkFNRV9PUFQKIFZfU0hMSUJfT1BUCiBWX1NITElCX0NNRAogVl9QQ0FQCitWX0xFWAogVl9JTkNMUwogVl9GSU5EQUxMREVWUwogVl9ERUZTCkBAIC02NTgsOSArNjU2LDEzIEBACiBMTl9TCiBBUgogUkFOTElCCi1WX1lBQ0MKLVZfTEVYCitZRkxBR1MKK1lBQ0MKK0xFWExJQgorTEVYX09VVFBVVF9ST09UCitMRVgKIEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBCitWQUxHUklORFRFU1QKIExJQk9CSlMKIEVHUkVQCiBHUkVQCkBAIC03NDIsMTQgKzc0NCwxMSBAQAogd2l0aF9zbmYKIHdpdGhfc25mX2luY2x1ZGVzCiB3aXRoX3NuZl9saWJyYXJpZXMKLXdpdGhfZmxleAotd2l0aF9iaXNvbgord2l0aF90dXJib2NhcAogZW5hYmxlX3VuaXZlcnNhbAogZW5hYmxlX3NoYXJlZAogZW5hYmxlX3VzYgogZW5hYmxlX2JsdWV0b290aAotZW5hYmxlX2NhbnVzYgotZW5hYmxlX2NhbgogZW5hYmxlX2RidXMKIGVuYWJsZV9wYWNrZXRfcmluZwogJwpAQCAtNzYxLDcgKzc2MCw5IEBACiBMREZMQUdTCiBMSUJTCiBDUFBGTEFHUwotQ1BQJworQ1BQCitZQUNDCitZRkxBR1MnCiAKIAogIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgpAQCAtMTM4NywxMCArMTM4OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV0KICAgLS1lbmFibGUtYmx1ZXRvb3RoICAgICAgZW5hYmxlIEJsdWV0b290aCBzdXBwb3J0IFtkZWZhdWx0PXllcywgaWYgc3VwcG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVdCi0gIC0tZW5hYmxlLWNhbnVzYiAgICAgICAgIGVuYWJsZSBjYW51c2Igc3VwcG9ydCBbZGVmYXVsdD15ZXMsIGlmIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlXQotICAtLWVuYWJsZS1jYW4gICAgICAgICAgICBlbmFibGUgQ0FOIHN1cHBvcnQgW2RlZmF1bHQ9eWVzLCBpZiBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV0KICAgLS1lbmFibGUtZGJ1cyAgICAgICAgICAgZW5hYmxlIEQtQnVzIGNhcHR1cmUgc3VwcG9ydCBbZGVmYXVsdD15ZXMsIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgYXZhaWxhYmxlXQogICAtLWVuYWJsZS1wYWNrZXQtcmluZyAgICBlbmFibGUgTGludXggcGFja2V0IHJpbmcgc3VwcG9ydCBbZGVmYXVsdD15ZXNdCkBAIC0xNDAzLDIwICsxNDAwLDIzIEBACiAgIC0td2l0aC1wY2FwPVRZUEUgICAgICAgIHVzZSBwYWNrZXQgY2FwdHVyZSBUWVBFCiAgIC0td2l0aG91dC1saWJubCAgICAgICAgIGRpc2FibGUgbGlibmwgc3VwcG9ydCBbZGVmYXVsdD15ZXMsIG9uIExpbnV4LCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50XQotICAtLXdpdGgtZGFnWz1ESVJdICAgICAgICBpbmNsdWRlIEVuZGFjZSBEQUcgc3VwcG9ydCBbInllcyIsICJubyIgb3IgRElSOwotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ5ZXMiIG9uIEJTRCBhbmQgTGludXggaWYgcHJlc2VudF0KLSAgLS13aXRoLWRhZy1pbmNsdWRlcz1ESVIgRW5kYWNlIERBRyBpbmNsdWRlIGRpcmVjdG9yeQotICAtLXdpdGgtZGFnLWxpYnJhcmllcz1ESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kYWNlIERBRyBsaWJyYXJ5IGRpcmVjdG9yeQorICAtLXdpdGgtZGFnWz1ESVJdICAgICAgICBpbmNsdWRlIEVuZGFjZSBEQUcgc3VwcG9ydCAobG9jYXRlZCBpbiBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRElSLCBpZiBzdXBwbGllZCkuIFtkZWZhdWx0PXllcywgaWYgcHJlc2VudF0KKyAgLS13aXRoLWRhZy1pbmNsdWRlcz1JRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZGFjZSBEQUcgaW5jbHVkZSBkaXJlY3RvcnksIGlmIG5vdCBESVIvaW5jbHVkZQorICAtLXdpdGgtZGFnLWxpYnJhcmllcz1MRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZGFjZSBEQUcgbGlicmFyeSBkaXJlY3RvcnksIGlmIG5vdCBESVIvbGliCiAgIC0td2l0aC1zZXB0ZWxbPURJUl0gICAgIGluY2x1ZGUgU2VwdGVsIHN1cHBvcnQgKGxvY2F0ZWQgaW4gZGlyZWN0b3J5IERJUiwgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQpLiBbZGVmYXVsdD15ZXMsIG9uIExpbnV4LCBpZiBwcmVzZW50XQotICAtLXdpdGgtc25mWz1ESVJdICAgICAgICBpbmNsdWRlIE15cmljb20gU05GIHN1cHBvcnQgWyJ5ZXMiLCAibm8iIG9yIERJUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0ieWVzIiBvbiBCU0QgYW5kIExpbnV4IGlmIHByZXNlbnRdCi0gIC0td2l0aC1zbmYtaW5jbHVkZXM9RElSIE15cmljb20gU05GIGluY2x1ZGUgZGlyZWN0b3J5Ci0gIC0td2l0aC1zbmYtbGlicmFyaWVzPURJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBNeXJpY29tIFNORiBsaWJyYXJ5IGRpcmVjdG9yeQotICAtLXdpdGhvdXQtZmxleCAgICAgICAgICBkb24ndCB1c2UgZmxleAotICAtLXdpdGhvdXQtYmlzb24gICAgICAgICBkb24ndCB1c2UgYmlzb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQpLiBbZGVmYXVsdD15ZXMsIGlmIHByZXNlbnRdCisgIC0td2l0aC1zbmZbPURJUl0gICAgICAgIGluY2x1ZGUgTXlyaWNvbSBTTkYgc3VwcG9ydCAobG9jYXRlZCBpbiBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRElSLCBpZiBzdXBwbGllZCkuIFtkZWZhdWx0PXllcywgaWYgcHJlc2VudF0KKyAgLS13aXRoLXNuZi1pbmNsdWRlcz1JRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIE15cmljb20gU05GIGluY2x1ZGUgZGlyZWN0b3J5LCBpZiBub3QgRElSL2luY2x1ZGUKKyAgLS13aXRoLXNuZi1saWJyYXJpZXM9TERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBNeXJpY29tIFNORiBsaWJyYXJ5IGRpcmVjdG9yeSwgaWYgbm90IERJUi9saWIKKyAgLS13aXRoLXR1cmJvY2FwWz1ESVJdICAgaW5jbHVkZSBSaXZlcmJlZCBUdXJib0NhcCBzdXBwb3J0IChsb2NhdGVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBESVIsIGlmIHN1cHBsaWVkKS4gW2RlZmF1bHQ9eWVzLCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50XQogCiBTb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKICAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCkBAIC0xNDI3LDYgKzE0MjcsMTIgQEAKICAgQ1BQRkxBR1MgICAgKE9iamVjdGl2ZSkgQy9DKysgcHJlcHJvY2Vzc29yIGZsYWdzLCBlLmcuIC1JPGluY2x1ZGUgZGlyPiBpZgogICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KICAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKKyAgWUFDQyAgICAgICAgVGhlIGBZZXQgQW5vdGhlciBDb21waWxlciBDb21waWxlcicgaW1wbGVtZW50YXRpb24gdG8gdXNlLgorICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcHJvZ3JhbSBmb3VuZCBvdXQgb2Y6IGBiaXNvbiAteScsIGBieWFjYycsCisgICAgICAgICAgICAgIGB5YWNjJy4KKyAgWUZMQUdTICAgICAgVGhlIGxpc3Qgb2YgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgYnkgZGVmYXVsdCB0byAkWUFDQy4KKyAgICAgICAgICAgICAgVGhpcyBzY3JpcHQgd2lsbCBkZWZhdWx0IFlGTEFHUyB0byB0aGUgZW1wdHkgc3RyaW5nIHRvIGF2b2lkIGEKKyAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBvZiBgLWQnIGdpdmVuIGJ5IHNvbWUgbWFrZSBhcHBsaWNhdGlvbnMuCiAKIFVzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCiBpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCkBAIC0zMzE0LDExICszMzIwLDYxIEBACiAKIAogCisKICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KIAkgICAgIwogCSAgICAjIC1XZXJyb3IgZm9yY2VzIHdhcm5pbmdzIHRvIGJlIGVycm9ycy4KIAkgICAgIwogCSAgICBhY19sYmxfY2NfZm9yY2Vfd2FybmluZ19lcnJvcnM9LVdlcnJvcgorCisJICAgICMKKwkgICAgIyBUcnkgdG8gaGF2ZSB0aGUgY29tcGlsZXIgZGVmYXVsdCB0byBoaWRpbmcgc3ltYm9scywKKwkgICAgIyBzbyB0aGF0IG9ubHkgc3ltYm9scyBleHBsaWNpdGx5IGV4cG9ydGVkIHdpdGgKKwkgICAgIyBQQ0FQX0FQSSB3aWxsIGJlIHZpc2libGUgb3V0c2lkZSAoc2hhcmVkKSBsaWJyYXJpZXMuCisJICAgICMKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlIC1mdmlzaWJpbGl0eT1oaWRkZW4gb3B0aW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAtZnZpc2liaWxpdHk9aGlkZGVuIG9wdGlvbi4uLiAiID4mNjsgfQorCXNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCWlmIGV4cHIgIngtZnZpc2liaWxpdHk9aGlkZGVuIiA6ICJ4LVcuKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfdW5rbm93bl93YXJuaW5nX29wdGlvbl9lcnJvciAtZnZpc2liaWxpdHk9aGlkZGVuIgorCWVsaWYgZXhwciAieC1mdmlzaWJpbGl0eT1oaWRkZW4iIDogIngtZi4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtZnZpc2liaWxpdHk9aGlkZGVuIgorCWVsaWYgZXhwciAieC1mdmlzaWJpbGl0eT1oaWRkZW4iIDogIngtbS4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtZnZpc2liaWxpdHk9aGlkZGVuIgorCWVsc2UKKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mdmlzaWJpbGl0eT1oaWRkZW4iCisJZmkKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIDAKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCQlWX0NDT1BUPSIkVl9DQ09QVCAtZnZpc2liaWxpdHk9aGlkZGVuIgorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKICAgICBlbHNlCiAJICAgIFZfSU5DTFM9IiRWX0lOQ0xTIC1JL3Vzci9sb2NhbC9pbmNsdWRlIgogCSAgICBMREZMQUdTPSIkTERGTEFHUyAtTC91c3IvbG9jYWwvbGliIgpAQCAtMzMzMSw2ICszMzg3LDU1IEBACiAJCSAgICAjIG9mIHdoaWNoIHVzZSAtV2Vycm9yIHRvIGZvcmNlIHdhcm5pbmdzIHRvIGJlIGVycm9ycy4KIAkJICAgICMKIAkJICAgIGFjX2xibF9jY19mb3JjZV93YXJuaW5nX2Vycm9ycz0tV2Vycm9yCisKKwkJICAgICMKKwkJICAgICMgVHJ5IHRvIGhhdmUgdGhlIGNvbXBpbGVyIGRlZmF1bHQgdG8gaGlkaW5nIHN5bWJvbHMsCisJCSAgICAjIHNvIHRoYXQgb25seSBzeW1ib2xzIGV4cGxpY2l0bHkgZXhwb3J0ZWQgd2l0aAorCQkgICAgIyBQQ0FQX0FQSSB3aWxsIGJlIHZpc2libGUgb3V0c2lkZSAoc2hhcmVkKSBsaWJyYXJpZXMuCisJCSAgICAjCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAtZnZpc2liaWxpdHk9aGlkZGVuIG9wdGlvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLWZ2aXNpYmlsaXR5PWhpZGRlbiBvcHRpb24uLi4gIiA+JjY7IH0KKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlpZiBleHByICJ4LWZ2aXNpYmlsaXR5PWhpZGRlbiIgOiAieC1XLioiID4vZGV2L251bGwKKwl0aGVuCisJICAgIENGTEFHUz0iJENGTEFHUyAkYWNfbGJsX3Vua25vd25fd2FybmluZ19vcHRpb25fZXJyb3IgLWZ2aXNpYmlsaXR5PWhpZGRlbiIKKwllbGlmIGV4cHIgIngtZnZpc2liaWxpdHk9aGlkZGVuIiA6ICJ4LWYuKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgLWZ2aXNpYmlsaXR5PWhpZGRlbiIKKwllbGlmIGV4cHIgIngtZnZpc2liaWxpdHk9aGlkZGVuIiA6ICJ4LW0uKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgLWZ2aXNpYmlsaXR5PWhpZGRlbiIKKwllbHNlCisJICAgIENGTEFHUz0iJENGTEFHUyAtZnZpc2liaWxpdHk9aGlkZGVuIgorCWZpCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAwCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwkJVl9DQ09QVD0iJFZfQ0NPUFQgLWZ2aXNpYmlsaXR5PWhpZGRlbiIKKworZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCiAJCSAgICA7OwogCiAJICAgIGhwdXgqKQpAQCAtMzQwNSw2ICszNTEwLDU1IEBACiAJCSAgICAjIHdhcm5pbmdzIHRvIGJlIHRyZWF0ZWQgYXMgZXJyb3JzLgogCQkgICAgIwogCQkgICAgYWNfbGJsX2NjX2ZvcmNlX3dhcm5pbmdfZXJyb3JzPS1lcnJ3YXJuCisKKwkJICAgICMKKwkJICAgICMgVHJ5IHRvIGhhdmUgdGhlIGNvbXBpbGVyIGRlZmF1bHQgdG8gaGlkaW5nIHN5bWJvbHMsCisJCSAgICAjIHNvIHRoYXQgb25seSBzeW1ib2xzIGV4cGxpY2l0bHkgZXhwb3J0ZWQgd2l0aAorCQkgICAgIyBQQ0FQX0FQSSB3aWxsIGJlIHZpc2libGUgb3V0c2lkZSAoc2hhcmVkKSBsaWJyYXJpZXMuCisJCSAgICAjCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAteGxkc2NvcGU9aGlkZGVuIG9wdGlvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLXhsZHNjb3BlPWhpZGRlbiBvcHRpb24uLi4gIiA+JjY7IH0KKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlpZiBleHByICJ4LXhsZHNjb3BlPWhpZGRlbiIgOiAieC1XLioiID4vZGV2L251bGwKKwl0aGVuCisJICAgIENGTEFHUz0iJENGTEFHUyAkYWNfbGJsX3Vua25vd25fd2FybmluZ19vcHRpb25fZXJyb3IgLXhsZHNjb3BlPWhpZGRlbiIKKwllbGlmIGV4cHIgIngteGxkc2NvcGU9aGlkZGVuIiA6ICJ4LWYuKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgLXhsZHNjb3BlPWhpZGRlbiIKKwllbGlmIGV4cHIgIngteGxkc2NvcGU9aGlkZGVuIiA6ICJ4LW0uKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgLXhsZHNjb3BlPWhpZGRlbiIKKwllbHNlCisJICAgIENGTEFHUz0iJENGTEFHUyAteGxkc2NvcGU9aGlkZGVuIgorCWZpCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAwCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwkJVl9DQ09QVD0iJFZfQ0NPUFQgLXhsZHNjb3BlPWhpZGRlbiIKKworZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCiAJCSAgICA7OwogCiAJICAgIHVsdHJpeCopCkBAIC0zNDEzLDggKzM1NjcsNyBAQAogCQkgICAgaWYgJHthY19jdl9sYmxfY2NfY29uc3RfcHJvdG8rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIGludApAQCAtNDU3OCw3ICs0NzMxLDcgQEAKIGZpCiAKIAotZm9yIGFjX2hlYWRlciBpbiBzeXMvaW9jY29tLmggc3lzL3NvY2tpby5oIGxpbWl0cy5oIHBhdGhzLmgKK2ZvciBhY19oZWFkZXIgaW4gc3lzL2lvY2NvbS5oIHN5cy9zZWxlY3QuaCBzeXMvc29ja2lvLmggbGltaXRzLmgKIGRvIDoKICAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAogYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCkBAIC00NzExLDcgKzQ4NjQsNyBAQAogZmkKIAogY2FzZSAiJGhvc3Rfb3MiIGluCi1saW51eCopCitsaW51eCp8dWNsaW51eCopCiAJZm9yIGFjX2hlYWRlciBpbiBsaW51eC9zb2NraW9zLmggbGludXgvaWZfYm9uZGluZy5oCiBkbyA6CiAgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKQEAgLTQ4MTUsNiArNDk2OCwyOSBAQAogCiBmaQogCituZWVkc3RydG9rX3I9bm8KK2ZvciBhY19mdW5jIGluIHN0cnRva19yCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInN0cnRva19yIiAiYWNfY3ZfZnVuY19zdHJ0b2tfciIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zdHJ0b2tfciIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NUUlRPS19SIDEKK19BQ0VPRgorCitlbHNlCisgIG5lZWRzdHJ0b2tfcj15ZXMKK2ZpCitkb25lCisKK2lmIHRlc3QgJG5lZWRzdHJ0b2tfciA9IHllczsgdGhlbgorCWNhc2UgIiAkTElCT0JKUyAiIGluCisgICoiIHN0cnRva19yLiRhY19vYmpleHQgIiogKSA7OworICAqKSBMSUJPQkpTPSIkTElCT0JKUyBzdHJ0b2tfci4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKK2ZpCisKICMKICMgRG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgZm9yIGV0aGVyX2hvc3R0b24oKSwgYXMgaXQncyBhCiAjICJnZXRob3N0YnluYW1lKCkgLWlzaCBmdW5jdGlvbiIuCkBAIC01MjMyLDYgKzU0MDgsMTMgQEAKICRhc19lY2hvICIke2VuYWJsZV9wcm90b2NoYWlufSIgPiY2OyB9CiAKICMKKyMgdmFsZ3JpbmR0ZXN0IGRpcmVjdGx5IHVzZXMgdGhlIG5hdGl2ZSBjYXB0dXJlIG1lY2hhbmlzbSwgYnV0CisjIG9ubHkgdGVzdHMgd2l0aCBCUEYgYW5kIFBGX1BBQ0tFVCBzb2NrZXRzOyBvbmx5IGVuYWJsZSBpdCBpZgorIyB3ZSBoYXZlIEJQRiBvciBQRl9QQUNLRVQgc29ja2V0cy4KKyMKK1ZBTEdSSU5EVEVTVD0KKworIwogIyBTSVRBIHN1cHBvcnQgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggbmF0aXZlIGNhcHR1cmUgc3VwcG9ydDsKICMgIi0td2l0aC1zaXRhIiBzZWxlY3RzIFNJVEEgc3VwcG9ydC4KICMKQEAgLTUyNDYsNyArNTQyOSw2IEBACiAJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRW5hYmxpbmcgU0lUQSBBQ04gc3VwcG9ydCIgPiY1CiAkYXNfZWNobyAiJGFzX21lOiBFbmFibGluZyBTSVRBIEFDTiBzdXBwb3J0IiA+JjY7fQogCQlWX1BDQVA9c2l0YQotCQlWX0ZJTkRBTExERVZTPXNpdGEKIAlmaQogCiBlbHNlCkBAIC01MjcyLDggKzU0NTQsMTggQEAKIAogJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9DTE9OSU5HX0JQRiAxIiA+PmNvbmZkZWZzLmgKIAorCisJIworCSMgV2UgaGF2ZSBCUEYsIHNvIGJ1aWxkIHZhbGdyaW5kdGVzdCB3aXRoICJtYWtlIHRlc3QiLgorCSMKKwlWQUxHUklORFRFU1Q9dmFsZ3JpbmR0ZXN0CiBlbGlmIHRlc3QgLXIgL2Rldi9icGYwIDsgdGhlbgogCVZfUENBUD1icGYKKworCSMKKwkjIFdlIGhhdmUgQlBGLCBzbyBidWlsZCB2YWxncmluZHRlc3Qgd2l0aCAibWFrZSB0ZXN0Ii4KKwkjCisJVkFMR1JJTkRURVNUPXZhbGdyaW5kdGVzdAogZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9uZXQvcGZpbHQuaCA7IHRoZW4KIAlWX1BDQVA9cGYKIGVsaWYgdGVzdCAtciAvZGV2L2VuZXQgOyB0aGVuCkBAIC01Mjg0LDYgKzU0NzYsMTIgQEAKIAlWX1BDQVA9bml0CiBlbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIDsgdGhlbgogCVZfUENBUD1saW51eAorCisJIworCSMgWFhYIC0gdGhpcyB3b24ndCB3b3JrIHdpdGggb2xkZXIga2VybmVscyB0aGF0IGhhdmUgU09DS19QQUNLRVQKKwkjIHNvY2tldHMgYnV0IG5vdCBQRl9QQUNLRVQgc29ja2V0cy4KKwkjCisJVkFMR1JJTkRURVNUPXZhbGdyaW5kdGVzdAogZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9uZXQvcmF3LmggOyB0aGVuCiAJVl9QQ0FQPXNub29wCiBlbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL29kbWkuaCA7IHRoZW4KQEAgLTUyOTUsNiArNTQ5MywxMSBAQAogCVZfUENBUD1icGYKIGVsaWYgdGVzdCAtYyAvZGV2L2JwZjAgOyB0aGVuCQkjIGNoZWNrIGFnYWluIGluIGNhc2Ugbm90IHJlYWRhYmxlCiAJVl9QQ0FQPWJwZgorCisJIworCSMgV2UgaGF2ZSBCUEYsIHNvIGJ1aWxkIHZhbGdyaW5kdGVzdCB3aXRoICJtYWtlIHRlc3QiLgorCSMKKwlWQUxHUklORFRFU1Q9dmFsZ3JpbmR0ZXN0CiBlbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL3N5cy9kbHBpLmggOyB0aGVuCiAJVl9QQ0FQPWRscGkKIGVsaWYgdGVzdCAtYyAvZGV2L2VuZXQgOyB0aGVuCQkjIGNoZWNrIGFnYWluIGluIGNhc2Ugbm90IHJlYWRhYmxlCkBAIC01MzA3LDYgKzU1MTAsNyBAQAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRWX1BDQVAiID4mNQogJGFzX2VjaG8gIiRWX1BDQVAiID4mNjsgfQogCisKICMKICMgRG8gY2FwdHVyZS1tZWNoYW5pc20tZGVwZW5kZW50IHRlc3RzLgogIwpAQCAtNTg5NSwxNSArNjA5OSwzMCBAQAogCTs7CiAKIGRhZykKKwkjCisJIyAtLXdpdGgtcGNhcD1kYWcgaXMgdGhlIG9ubHkgd2F5IHRvIGdldCBoZXJlLCBhbmQgaXQgbWVhbnMKKwkjICJEQUcgc3VwcG9ydCBidXQgbm90aGluZyBlbHNlIgorCSMKIAlWX0RFRlM9IiRWX0RFRlMgLUREQUdfT05MWSIKKwl4eHhfb25seT15ZXMKIAk7OwogCiBzZXB0ZWwpCisJIworCSMgLS13aXRoLXBjYXA9c2VwdGVsIGlzIHRoZSBvbmx5IHdheSB0byBnZXQgaGVyZSwgYW5kIGl0IG1lYW5zCisJIyAiU2VwdGVsIHN1cHBvcnQgYnV0IG5vdGhpbmcgZWxzZSIKKwkjCiAJVl9ERUZTPSIkVl9ERUZTIC1EU0VQVEVMX09OTFkiCisJeHh4X29ubHk9eWVzCiAJOzsKIAogc25mKQorCSMKKwkjIC0td2l0aC1wY2FwPXNuZiBpcyB0aGUgb25seSB3YXkgdG8gZ2V0IGhlcmUsIGFuZCBpdCBtZWFucworCSMgIlNORiBzdXBwb3J0IGJ1dCBub3RoaW5nIGVsc2UiCisJIwogCVZfREVGUz0iJFZfREVGUyAtRFNORl9PTkxZIgorCXh4eF9vbmx5PXllcwogCTs7CiAKIG51bGwpCkBAIC01OTE0LDE0ICs2MTMzLDggQEAKIAk7OwogZXNhYwogCi1pZiB0ZXN0ICIkVl9QQ0FQIiA9IG51bGwKK2lmIHRlc3QgIiRWX1BDQVAiICE9IG51bGwKIHRoZW4KLQkjCi0JIyBXZSBjYW4ndCBjYXB0dXJlLCBzbyB3ZSBjYW4ndCBvcGVuIGFueSBjYXB0dXJlCi0JIyBkZXZpY2VzLCBzbyB3ZSB3b24ndCByZXR1cm4gYW55IGludGVyZmFjZXMuCi0JIwotCVZfRklOREFMTERFVlM9bnVsbAotZWxzZQogCWFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldGlmYWRkcnMiICJhY19jdl9mdW5jX2dldGlmYWRkcnMiCiBpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0aWZhZGRycyIgPSB4eWVzOyB0aGVuIDoKIApAQCAtNTkzNiw3ICs2MTQ5LDcgQEAKIAkJICAgICMgV2UgaGF2ZSB0aGUgaGVhZGVyLCBzbyB3ZSB1c2UgImdldGlmYWRkcnMoKSIgdG8KIAkJICAgICMgZ2V0IHRoZSBsaXN0IG9mIGludGVyZmFjZXMuCiAJCSAgICAjCi0JCSAgICBWX0ZJTkRBTExERVZTPWdldGFkCisJCSAgICBWX0ZJTkRBTExERVZTPWZhZC1nZXRhZC5jCiAKIGVsc2UKIApAQCAtNjAwNCw5ICs2MjE3LDkgQEAKIAkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2hhdmVfc2lvY2dsaWZjb25mIiA+JjUKICRhc19lY2hvICIkYWNfY3ZfbGJsX2hhdmVfc2lvY2dsaWZjb25mIiA+JjY7IH0KIAkJCWlmIHRlc3QgJGFjX2N2X2xibF9oYXZlX3Npb2NnbGlmY29uZiA9IHllcyA7IHRoZW4KLQkJCQlWX0ZJTkRBTExERVZTPWdsaWZjCisJCQkJVl9GSU5EQUxMREVWUz1mYWQtZ2xpZmMuYwogCQkJZWxzZQotCQkJCVZfRklOREFMTERFVlM9Z2lmYworCQkJCVZfRklOREFMTERFVlM9ZmFkLWdpZmMuYwogCQkJZmkKIAkJCTs7CiAKQEAgLTYwMTcsNyArNjIzMCw3IEBACiAJCQkjIGFub3RoZXIgbWVjaGFuaXNtLCBhbmQgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoYXQKIAkJCSMgaW5zdGVhZC4pCiAJCQkjCi0JCQlWX0ZJTkRBTExERVZTPWdpZmMKKwkJCVZfRklOREFMTERFVlM9ZmFkLWdpZmMuYwogCQkJOzsKIAkJZXNhYwogZmkKQEAgLTYxMzYsMTAgKzYzNDksMjAgQEAKIAogZWxzZQogCi0JIwotCSMgVXNlIERBRyBBUEkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRvbid0Ci0JIwotCXdhbnRfZGFnPWlmcHJlc2VudAorCWlmIHRlc3QgIiRWX1BDQVAiID0gZGFnOyB0aGVuCisJCSMgVXNlciByZXF1ZXN0ZWQgREFHLW9ubHkgbGlicGNhcCwgc28gd2UnZCBiZXR0ZXIgaGF2ZQorCQkjIHRoZSBEQUcgQVBJLgorCQl3YW50X2RhZz15ZXMKKwllbGlmIHRlc3QgInh4eF9vbmx5IiA9IHllczsgdGhlbgorCQkjIFVzZXIgcmVxdWVzdGVkIHNvbWV0aGluZy1lbHNlLW9ubHkgcGNhcCwgc28gdGhleSBkb24ndAorCQkjIHdhbnQgREFHIHN1cHBvcnQuCisJCXdhbnRfZGFnPW5vCisJZWxzZQorCQkjCisJCSMgVXNlIERBRyBBUEkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRvbid0CisJCSMKKwkJd2FudF9kYWc9aWZwcmVzZW50CisJZmkKIAogZmkKIApAQCAtNjE2NiwyOCArNjM4OSw2IEBACiBmaQogCiAKLWNhc2UgIiRWX1BDQVAiIGluCi1saW51eHxicGZ8ZGFnKQotCSMKLQkjIFdlIHN1cHBvcnQgdGhlIERBRyBBUEkgaWYgd2UncmUgb24gTGludXggb3IgQlNELCBvciBpZiB3ZSdyZQotCSMgYnVpbGRpbmcgYSBEQUctb25seSBsaWJwY2FwLgotCSMKLQk7OwotKikKLQkjCi0JIyBJZiB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBEQUcsIHRlbGwgdGhlbSBpdCdzIG5vdAotCSMgc3VwcG9ydGVkLgotCSMKLQkjIElmIHRoZXkgZXhwcmVzc2VkIG5vIHByZWZlcmVuY2UsIGRvbid0IGluY2x1ZGUgaXQuCi0JIwotCWlmIHRlc3QgJHdhbnRfZGFnID0geWVzOyB0aGVuCi0JCWFzX2ZuX2Vycm9yICQ/ICJEQUcgc3VwcG9ydCBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoICdsaW51eCcgJ2JwZicgYW5kICdkYWcnIHBhY2tldCBjYXB0dXJlIHR5cGVzIiAiJExJTkVOTyIgNQotCWVsaWYgdGVzdCAkd2FudF9kYWcgPSB5ZXM7IHRoZW4KLQkJd2FudF9kYWc9bm8KLQlmaQotCTs7Ci1lc2FjCi0KIGFjX2N2X2xibF9kYWdfYXBpPW5vCiBpZiB0ZXN0ICIkd2FudF9kYWciICE9IG5vOyB0aGVuCiAKQEAgLTYxOTYsNyArNjM5Nyw3IEBACiAKIAkjIElmIG5lY2Vzc2FyeSwgc2V0IGRlZmF1bHQgcGF0aHMgZm9yIERBRyBBUEkgaGVhZGVycyBhbmQgbGlicmFyaWVzLgogCWlmIHRlc3QgLXogIiRkYWdfcm9vdCI7IHRoZW4KLQkgICAgZGFnX3Jvb3Q9L3Vzci9sb2NhbAorCQlkYWdfcm9vdD0vdXNyL2xvY2FsCiAJZmkKIAogCWlmIHRlc3QgLXogIiRkYWdfaW5jbHVkZV9kaXIiOyB0aGVuCkBAIC02MjA0LDMzICs2NDA1LDMzIEBACiAJZmkKIAogCWlmIHRlc3QgLXogIiRkYWdfbGliX2RpciI7IHRoZW4KLQkgICAgZGFnX2xpYl9kaXI9IiRkYWdfcm9vdC9saWIiCisJCWRhZ19saWJfZGlyPSIkZGFnX3Jvb3QvbGliIgogCWZpCiAKIAlpZiB0ZXN0IC16ICIkZGFnX3Rvb2xzX2RpciI7IHRoZW4KLQkgICAgZGFnX3Rvb2xzX2Rpcj0iJGRhZ19yb290L3Rvb2xzIgorCQlkYWdfdG9vbHNfZGlyPSIkZGFnX3Jvb3QvdG9vbHMiCiAJZmkKIAogCWlmIHRlc3QgLXIgJGRhZ19pbmNsdWRlX2Rpci9kYWdhcGkuaDsgdGhlbgogCQlhY19jdl9sYmxfZGFnX2FwaT15ZXMKIAlmaQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2RhZ19hcGkgKCRkYWdfaW5jbHVkZV9kaXIpIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGJsX2RhZ19hcGkgKCRkYWdfaW5jbHVkZV9kaXIpIiA+JjY7IH0KLWZpCiAKLWlmIHRlc3QgJGFjX2N2X2xibF9kYWdfYXBpID0geWVzOyB0aGVuCi0JVl9JTkNMUz0iJFZfSU5DTFMgLUkkZGFnX2luY2x1ZGVfZGlyIgorCWlmIHRlc3QgIiRhY19jdl9sYmxfZGFnX2FwaSIgPSB5ZXM7IHRoZW4KKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyAoJGRhZ19pbmNsdWRlX2RpcikiID4mNQorJGFzX2VjaG8gInllcyAoJGRhZ19pbmNsdWRlX2RpcikiID4mNjsgfQogCi0JaWYgdGVzdCAkVl9QQ0FQICE9IGRhZyA7IHRoZW4KLQkJIFNTUkM9InBjYXAtZGFnLmMiCi0JZmkKKwkJVl9JTkNMUz0iJFZfSU5DTFMgLUkkZGFnX2luY2x1ZGVfZGlyIgogCi0JIyBTZWUgaWYgd2UgY2FuIGZpbmQgYSBnZW5lcmFsIHZlcnNpb24gc3RyaW5nLgotCSMgRG9uJ3QgbmVlZCB0byBzYXZlIGFuZCByZXN0b3JlIExJQlMgdG8gcHJldmVudCAtbGRhZyBiZWluZwotCSMgaW5jbHVkZWQgaWYgdGhlcmUncyBhIGZvdW5kLWFjdGlvbiAoYXJnIDMpLgotCXNhdmVkX2xkZmxhZ3M9JExERkxBR1MKLQlMREZMQUdTPSItTCRkYWdfbGliX2RpciIKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkYWdfYXR0YWNoX3N0cmVhbSBpbiAtbGRhZyIgPiY1CisJCWlmIHRlc3QgJFZfUENBUCAhPSBkYWcgOyB0aGVuCisJCQkgU1NSQz0iJFNTUkMgcGNhcC1kYWcuYyIKKwkJZmkKKworCQkjIFNlZSBpZiB3ZSBjYW4gZmluZCBhIGdlbmVyYWwgdmVyc2lvbiBzdHJpbmcuCisJCSMgRG9uJ3QgbmVlZCB0byBzYXZlIGFuZCByZXN0b3JlIExJQlMgdG8gcHJldmVudCAtbGRhZyBiZWluZworCQkjIGluY2x1ZGVkIGlmIHRoZXJlJ3MgYSBmb3VuZC1hY3Rpb24gKGFyZyAzKS4KKwkJc2F2ZWRfbGRmbGFncz0kTERGTEFHUworCQlMREZMQUdTPSItTCRkYWdfbGliX2RpciIKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGFnX2F0dGFjaF9zdHJlYW0gaW4gLWxkYWciID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGRhZ19hdHRhY2hfc3RyZWFtIGluIC1sZGFnLi4uICIgPiY2OyB9CiBpZiAke2FjX2N2X2xpYl9kYWdfZGFnX2F0dGFjaF9zdHJlYW0rOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgpAQCAtNjI3Miw3ICs2NDczLDcgQEAKICAgZGFnX3N0cmVhbXM9IjAiCiBmaQogCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGFnX2dldF9lcmZfdHlwZXMgaW4gLWxkYWciID4mNQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkYWdfZ2V0X2VyZl90eXBlcyBpbiAtbGRhZyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgZGFnX2dldF9lcmZfdHlwZXMgaW4gLWxkYWcuLi4gIiA+JjY7IH0KIGlmICR7YWNfY3ZfbGliX2RhZ19kYWdfZ2V0X2VyZl90eXBlcys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CkBAIC02MzE1LDcgKzY1MTYsNyBAQAogCiBmaQogCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzIGluIC1sZGFnIiA+JjUKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzIGluIC1sZGFnIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBkYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXMgaW4gLWxkYWcuLi4gIiA+JjY7IH0KIGlmICR7YWNfY3ZfbGliX2RhZ19kYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXMrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgpAQCAtNjM1OSwxNiArNjU2MCwxNiBAQAogZmkKIAogCi0JTERGTEFHUz0kc2F2ZWRfbGRmbGFncworCQlMREZMQUdTPSRzYXZlZF9sZGZsYWdzCiAKLQlpZiB0ZXN0ICIkZGFnX3N0cmVhbXMiID0gMTsgdGhlbgorCQlpZiB0ZXN0ICIkZGFnX3N0cmVhbXMiID0gMTsgdGhlbgogCiAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0RBR19TVFJFQU1TX0FQSSAxIiA+PmNvbmZkZWZzLmgKIAotCQlMSUJTPSIkTElCUyAtbGRhZyIKLQkJTERGTEFHUz0iJExERkxBR1MgLUwkZGFnX2xpYl9kaXIiCisJCQlMSUJTPSIkTElCUyAtbGRhZyIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1MJGRhZ19saWJfZGlyIgogCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHZkYWdfc2V0X2RldmljZV9pbmZvIGluIC1sdmRhZyIgPiY1CisJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB2ZGFnX3NldF9kZXZpY2VfaW5mbyBpbiAtbHZkYWciID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHZkYWdfc2V0X2RldmljZV9pbmZvIGluIC1sdmRhZy4uLiAiID4mNjsgfQogaWYgJHthY19jdl9saWJfdmRhZ192ZGFnX3NldF9kZXZpY2VfaW5mbys6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CkBAIC02NDEwLDM4ICs2NjExLDMyIEBACiAgIGFjX2RhZ19oYXZlX3ZkYWc9IjAiCiBmaQogCi0JCWlmIHRlc3QgIiRhY19kYWdfaGF2ZV92ZGFnIiA9IDE7IHRoZW4KKwkJCWlmIHRlc3QgIiRhY19kYWdfaGF2ZV92ZGFnIiA9IDE7IHRoZW4KIAogJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EQUdfVkRBRyAxIiA+PmNvbmZkZWZzLmgKIAotCQkJTElCUz0iJExJQlMgLWxwdGhyZWFkIgorCQkJCUxJQlM9IiRMSUJTIC1scHRocmVhZCIKKwkJCWZpCiAJCWZpCi0JZmkKIAogCiAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0RBR19BUEkgMSIgPj5jb25mZGVmcy5oCiAKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIHRoZSBEQUcgQVBJIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSB0aGUgREFHIEFQSS4uLiAiID4mNjsgfQotCi1pZiB0ZXN0ICRhY19jdl9sYmxfZGFnX2FwaSA9IG5vOyB0aGVuCi0JeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKwllbHNlCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQotCWlmIHRlc3QgIiR3YW50X2RhZyIgPSB5ZXM7IHRoZW4KLSAgICAgICAgCSMgVXNlciB3YW50ZWQgREFHIHN1cHBvcnQgYnV0IHdlIGNvdWxkbid0IGZpbmQgaXQuCi0JCWFzX2ZuX2Vycm9yICQ/ICJEQUcgQVBJIHJlcXVlc3RlZCwgYnV0IG5vdCBmb3VuZCBhdCAkZGFnX3Jvb3Q6IHVzZSAtLXdpdGhvdXQtZGFnIiAiJExJTkVOTyIgNQotCWZpCiAKLQlpZiB0ZXN0ICIkVl9QQ0FQIiA9IGRhZzsgdGhlbgotCQkjIFVzZXIgcmVxdWVzdGVkICJkYWciIGNhcHR1cmUgdHlwZSBidXQgdGhlIERBRyBBUEkgd2Fzbid0Ci0JCSMgZm91bmQuCi0JCWFzX2ZuX2Vycm9yICQ/ICJTcGVjaWZ5aW5nIHRoZSBjYXB0dXJlIHR5cGUgYXMgXCJkYWdcIiByZXF1aXJlcyB0aGUgREFHIEFQSSB0byBiZSBwcmVzZW50OyB1c2UgdGhlIC0td2l0aC1kYWcgb3B0aW9ucyB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbi4gKFRyeSBcIi4vY29uZmlndXJlIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLikiICIkTElORU5PIiA1CisJCWlmIHRlc3QgIiRWX1BDQVAiID0gZGFnOyB0aGVuCisJCQkjIFVzZXIgcmVxdWVzdGVkICJkYWciIGNhcHR1cmUgdHlwZSBidXQgd2UgY291bGRuJ3QKKwkJCSMgZmluZCB0aGUgREFHIEFQSSBzdXBwb3J0LgorCQkJYXNfZm5fZXJyb3IgJD8gIkRBRyBzdXBwb3J0IHJlcXVlc3RlZCB3aXRoIC0td2l0aC1wY2FwPWRhZywgYnV0IHRoZSBEQUcgaGVhZGVycyB3ZXJlbid0IGZvdW5kIGF0ICRkYWdfaW5jbHVkZV9kaXI6IG1ha2Ugc3VyZSB0aGUgREFHIHN1cHBvcnQgaXMgaW5zdGFsbGVkLCBzcGVjaWZ5IGEgZGlmZmVyZW50IHBhdGggb3IgcGF0aHMgaWYgbmVjZXNzYXJ5LCBvciBkb24ndCByZXF1ZXN0IERBRyBzdXBwb3J0IiAiJExJTkVOTyIgNQorCQlmaQorCisJCWlmIHRlc3QgIiR3YW50X2RhZyIgPSB5ZXM7IHRoZW4KKwkgICAgICAgIAkjIFVzZXIgd2FudGVkIERBRyBzdXBwb3J0IGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIGl0LgorCQkJYXNfZm5fZXJyb3IgJD8gIkRBRyBzdXBwb3J0IHJlcXVlc3RlZCB3aXRoIC0td2l0aC1kYWcsIGJ1dCB0aGUgREFHIGhlYWRlcnMgd2VyZW4ndCBmb3VuZCBhdCAkZGFnX2luY2x1ZGVfZGlyOiBtYWtlIHN1cmUgdGhlIERBRyBzdXBwb3J0IGlzIGluc3RhbGxlZCwgc3BlY2lmeSBhIGRpZmZlcmVudCBwYXRoIG9yIHBhdGhzIGlmIG5lY2Vzc2FyeSwgb3IgZG9uJ3QgcmVxdWVzdCBEQUcgc3VwcG9ydCIgIiRMSU5FTk8iIDUKKwkJZmkKIAlmaQotZWxzZQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9CiBmaQogCiAKQEAgLTY0NjIsNDEgKzY2NTcsMzEgQEAKIAogZWxzZQogCi0JIwotCSMgVXNlIFNlcHRlbCBBUEkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRvbid0Ci0JIwotCXdhbnRfc2VwdGVsPWlmcHJlc2VudAotCXNlcHRlbF9yb290PS4vLi4vc2VwdGVsCisJaWYgdGVzdCAiJFZfUENBUCIgPSBzZXB0ZWw7IHRoZW4KKwkJIyBVc2VyIHJlcXVlc3RlZCBTZXB0ZWwtb25seSBsaWJwY2FwLCBzbyB3ZSdkIGJldHRlciBoYXZlCisJCSMgdGhlIFNlcHRlbCBBUEkuCisJCXdhbnRfc2VwdGVsPXllcworCWVsaWYgdGVzdCAieHh4X29ubHkiID0geWVzOyB0aGVuCisJCSMgVXNlciByZXF1ZXN0ZWQgc29tZXRoaW5nLWVsc2Utb25seSBwY2FwLCBzbyB0aGV5IGRvbid0CisJCSMgd2FudCBTZXB0ZWwgc3VwcG9ydC4KKwkJd2FudF9zZXB0ZWw9bm8KKwllbHNlCisJCSMKKwkJIyBVc2UgU2VwdGVsIEFQSSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZG9uJ3QKKwkJIworCQl3YW50X3NlcHRlbD1pZnByZXNlbnQKKwlmaQogCiBmaQogCisKIGFjX2N2X2xibF9zZXB0ZWxfYXBpPW5vCi1jYXNlICIkVl9QQ0FQIiBpbgotbGludXh8c2VwdGVsKQotCSMKLQkjIFdlIHN1cHBvcnQgdGhlIFNlcHRlbCBBUEkgaWYgd2UncmUgb24gTGludXgsIG9yIGlmIHdlJ3JlIGJ1aWxkaW5nCi0JIyBhIFNlcHRlbC1vbmx5IGxpYnBjYXAuCi0JIwotCTs7Ci0qKQotCSMKLQkjIElmIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIFNlcHRlbCwgdGVsbCB0aGVtIGl0J3Mgbm90Ci0JIyBzdXBwb3J0ZWQuCi0JIwotCSMgSWYgdGhleSBleHByZXNzZWQgbm8gcHJlZmVyZW5jZSwgZG9uJ3QgaW5jbHVkZSBpdC4KLQkjCi0JaWYgdGVzdCAkd2FudF9zZXB0ZWwgPSB5ZXM7IHRoZW4KLQkJYXNfZm5fZXJyb3IgJD8gIlNlcHRlbCBzdXBwb3J0IG9ubHkgYXZhaWxhYmxlIHdpdGggJ2xpbnV4JyBhbmQgJ3NlcHRlbCcgcGFja2V0IGNhcHR1cmUgdHlwZXMiICIkTElORU5PIiA1Ci0JZWxpZiB0ZXN0ICR3YW50X3NlcHRlbCA9IHllczsgdGhlbgotCQl3YW50X3NlcHRlbD1ubwotCWZpCi0JOzsKLWVzYWMKLQogaWYgdGVzdCAiJHdpdGhfc2VwdGVsIiAhPSBubzsgdGhlbgotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIFNlcHRlbCBBUEkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIFNlcHRlbCBBUEkuLi4gIiA+JjY7IH0KIAorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIFNlcHRlbCBBUEkgaGVhZGVycyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGhhdmUgU2VwdGVsIEFQSSBoZWFkZXJzLi4uICIgPiY2OyB9CisKKwkjIElmIG5lY2Vzc2FyeSwgc2V0IGRlZmF1bHQgcGF0aHMgZm9yIFNlcHRlbCBBUEkgaGVhZGVycyBhbmQgbGlicmFyaWVzLgogCWlmIHRlc3QgLXogIiRzZXB0ZWxfcm9vdCI7IHRoZW4KIAkJc2VwdGVsX3Jvb3Q9JHNyY2Rpci8uLi9zZXB0ZWwKIAlmaQpAQCAtNjUwNCwzMyArNjY4OSw0MCBAQAogCXNlcHRlbF90b29sc19kaXI9IiRzZXB0ZWxfcm9vdCIKIAlzZXB0ZWxfaW5jbHVkZV9kaXI9IiRzZXB0ZWxfcm9vdC9JTkMiCiAKLQlhY19jdl9sYmxfc2VwdGVsX2FwaT1ubwogCWlmIHRlc3QgLXIgIiRzZXB0ZWxfaW5jbHVkZV9kaXIvbXNnLmgiOyB0aGVuCisJCWFjX2N2X2xibF9zZXB0ZWxfYXBpPXllcworCWZpCisKKwlpZiB0ZXN0ICIkYWNfY3ZfbGJsX3NlcHRlbF9hcGkiID0geWVzOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMgKCRzZXB0ZWxfaW5jbHVkZV9kaXIpIiA+JjUKKyRhc19lY2hvICJ5ZXMgKCRzZXB0ZWxfaW5jbHVkZV9kaXIpIiA+JjY7IH0KKwogCQlWX0lOQ0xTPSIkVl9JTkNMUyAtSSRzZXB0ZWxfaW5jbHVkZV9kaXIiCiAJCUFERExPQkpTPSIkQURETE9CSlMgJHNlcHRlbF90b29sc19kaXIvYXNjaWliaW4ubyAkc2VwdGVsX3Rvb2xzX2Rpci9iaXQyYnl0ZS5vICRzZXB0ZWxfdG9vbHNfZGlyL2NvbmZpcm0ubyAkc2VwdGVsX3Rvb2xzX2Rpci9mbXRtc2cubyAkc2VwdGVsX3Rvb2xzX2Rpci9nY3RfdW5peC5vICRzZXB0ZWxfdG9vbHNfZGlyL2hxdWV1ZS5vICRzZXB0ZWxfdG9vbHNfZGlyL2lkZW50Lm8gJHNlcHRlbF90b29sc19kaXIvbWVtLm8gJHNlcHRlbF90b29sc19kaXIvcGFjay5vICRzZXB0ZWxfdG9vbHNfZGlyL3BhcnNlLm8gJHNlcHRlbF90b29sc19kaXIvcG9vbC5vICRzZXB0ZWxfdG9vbHNfZGlyL3NkbHNpZy5vICRzZXB0ZWxfdG9vbHNfZGlyL3N0cnRvbnVtLm8gJHNlcHRlbF90b29sc19kaXIvdGltZXIubyAkc2VwdGVsX3Rvb2xzX2Rpci90cmFjZS5vIgogCQlBRERMQVJDSElWRU9CSlM9IiRBRERMQVJDSElWRU9CSlMgJHNlcHRlbF90b29sc19kaXIvYXNjaWliaW4ubyAkc2VwdGVsX3Rvb2xzX2Rpci9iaXQyYnl0ZS5vICRzZXB0ZWxfdG9vbHNfZGlyL2NvbmZpcm0ubyAkc2VwdGVsX3Rvb2xzX2Rpci9mbXRtc2cubyAkc2VwdGVsX3Rvb2xzX2Rpci9nY3RfdW5peC5vICRzZXB0ZWxfdG9vbHNfZGlyL2hxdWV1ZS5vICRzZXB0ZWxfdG9vbHNfZGlyL2lkZW50Lm8gJHNlcHRlbF90b29sc19kaXIvbWVtLm8gJHNlcHRlbF90b29sc19kaXIvcGFjay5vICRzZXB0ZWxfdG9vbHNfZGlyL3BhcnNlLm8gJHNlcHRlbF90b29sc19kaXIvcG9vbC5vICRzZXB0ZWxfdG9vbHNfZGlyL3NkbHNpZy5vICRzZXB0ZWxfdG9vbHNfZGlyL3N0cnRvbnVtLm8gJHNlcHRlbF90b29sc19kaXIvdGltZXIubyAkc2VwdGVsX3Rvb2xzX2Rpci90cmFjZS5vIgogCiAJCWlmIHRlc3QgIiRWX1BDQVAiICE9IHNlcHRlbCA7IHRoZW4KLQkJCSBTU1JDPSJwY2FwLXNlcHRlbC5jIgorCQkJIFNTUkM9IiRTU1JDIHBjYXAtc2VwdGVsLmMiCiAJCWZpCi0JCWFjX2N2X2xibF9zZXB0ZWxfYXBpPXllcwotCWZpCiAKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9zZXB0ZWxfYXBpIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGJsX3NlcHRlbF9hcGkiID4mNjsgfQotCWlmIHRlc3QgJGFjX2N2X2xibF9zZXB0ZWxfYXBpID0gbm87IHRoZW4KLQkJaWYgdGVzdCAiJHdhbnRfc2VwdGVsIiA9IHllczsgdGhlbgotCQkJYXNfZm5fZXJyb3IgJD8gIlNlcHRlbCBBUEkgbm90IGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAkc2VwdGVsX3Jvb3Q7IHVzZSAtLXdpdGhvdXQtc2VwdGVsIiAiJExJTkVOTyIgNQotCQlmaQotCWVsc2UKIAogJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TRVBURUxfQVBJIDEiID4+Y29uZmRlZnMuaAogCi0JZmkKLWZpCisJZWxzZQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KIAotaWYgdGVzdCAiJFZfUENBUCIgPSBzZXB0ZWwgLWEgIiRhY19jdl9sYmxfc2VwdGVsX2FwaSIgPSBubzsgdGhlbgotCWFzX2ZuX2Vycm9yICQ/ICJTcGVjaWZ5aW5nIHRoZSBjYXB0dXJlIHR5cGUgYXMgJ3NlcHRlbCcgcmVxdWlyZXMgdGhlIFNlcHRlbCBBUEkgdG8gYmUgcHJlc2VudDsgdXNlIC0td2l0aC1zZXB0ZWw9RElSIiAiJExJTkVOTyIgNQorCQlpZiB0ZXN0ICIkVl9QQ0FQIiA9IHNlcHRlbDsgdGhlbgorCQkJIyBVc2VyIHJlcXVlc3RlZCAic2VwdGVsIiBjYXB0dXJlIHR5cGUgYnV0CisJCQkjIHdlIGNvdWxkbid0IGZpbmQgdGhlIFNlcHRlbCBBUEkgc3VwcG9ydC4KKwkJCWFzX2ZuX2Vycm9yICQ/ICJTZXB0ZWwgc3VwcG9ydCByZXF1ZXN0ZWQgd2l0aCAtLXdpdGgtcGNhcD1zZXB0ZWwsIGJ1dCB0aGUgU2VwdGVsIGhlYWRlcnMgd2VyZW4ndCBmb3VuZCBhdCAkc2VwdGVsX2luY2x1ZGVfZGlyOiBtYWtlIHN1cmUgdGhlIFNlcHRlbCBzdXBwb3J0IGlzIGluc3RhbGxlZCwgc3BlY2lmeSBhIGRpZmZlcmVudCBwYXRoIG9yIHBhdGhzIGlmIG5lY2Vzc2FyeSwgb3IgZG9uJ3QgcmVxdWVzdCBTZXB0ZWwgc3VwcG9ydCIgIiRMSU5FTk8iIDUKKwkJZmkKKworCQlpZiB0ZXN0ICIkd2FudF9zZXB0ZWwiID0geWVzOyB0aGVuCisJICAgICAgICAJIyBVc2VyIHdhbnRlZCBTZXB0ZWwgc3VwcG9ydCBidXQgd2UgY291bGRuJ3QgZmluZCBpdC4KKwkJCWFzX2ZuX2Vycm9yICQ/ICJTZXB0ZWwgc3VwcG9ydCByZXF1ZXN0ZWQgd2l0aCAtLXdpdGgtc2VwdGVsLCBidXQgdGhlIFNlcHRlbCBoZWFkZXJzIHdlcmVuJ3QgZm91bmQgYXQgJHNlcHRlbF9pbmNsdWRlX2RpcjogbWFrZSBzdXJlIHRoZSBTZXB0ZWwgc3VwcG9ydCBpcyBpbnN0YWxsZWQsIHNwZWNpZnkgYSBkaWZmZXJlbnQgcGF0aCBvciBwYXRocyBpZiBuZWNlc3NhcnksIG9yIGRvbid0IHJlcXVlc3QgU2VwdGVsIHN1cHBvcnQiICIkTElORU5PIiA1CisJCWZpCisJZmkKIGZpCiAKICMgQ2hlY2sgZm9yIE15cmljb20gU05GIHN1cHBvcnQuCkBAIC02NTQ0LDcgKzY3MzYsNyBAQAogCQl3YW50X3NuZj1ubwogCWVsaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzCiAJdGhlbgotCQkjIFVzZXIgd2FudHMgU05GIHN1cHBvcnQgYnV0IGhhc24ndCBzcGVjaWZpYyBhIGRpcmVjdG9yeS4KKwkJIyBVc2VyIHdhbnRzIFNORiBzdXBwb3J0IGJ1dCBoYXNuJ3Qgc3BlY2lmaWVkIGEgZGlyZWN0b3J5LgogCQl3YW50X3NuZj15ZXMKIAllbHNlCiAJCSMgVXNlciB3YW50cyBTTkYgc3VwcG9ydCB3aXRoIGEgc3BlY2lmaWVkIGRpcmVjdG9yeS4KQEAgLTY1NTQsMTAgKzY3NDYsMjAgQEAKIAogZWxzZQogCi0JIwotCSMgVXNlIFNuaWZmZXIgQVBJIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkb24ndAotCSMKLQl3YW50X3NuZj1pZnByZXNlbnQKKwlpZiB0ZXN0ICIkVl9QQ0FQIiA9IHNuZjsgdGhlbgorCQkjIFVzZXIgcmVxdWVzdGVkIFNuaWZmZXItb25seSBsaWJwY2FwLCBzbyB3ZSdkIGJldHRlciBoYXZlCisJCSMgdGhlIFNuaWZmZXIgQVBJLgorCQl3YW50X3NuZj15ZXMKKwllbGlmIHRlc3QgInh4eF9vbmx5IiA9IHllczsgdGhlbgorCQkjIFVzZXIgcmVxdWVzdGVkIHNvbWV0aGluZy1lbHNlLW9ubHkgcGNhcCwgc28gdGhleSBkb24ndAorCQkjIHdhbnQgU05GIHN1cHBvcnQuCisJCXdhbnRfc25mPW5vCisJZWxzZQorCQkjCisJCSMgVXNlIFNuaWZmZXIgQVBJIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkb24ndAorCQkjCisJCXdhbnRfc25mPWlmcHJlc2VudAorCWZpCiAKIGZpCiAKQEAgLTY1ODQsMzQgKzY3ODYsMTMgQEAKIGZpCiAKIAotY2FzZSAiJFZfUENBUCIgaW4KLWJwZnxsaW51eHxzbmYpCi0JIwotCSMgV2Ugc3VwcG9ydCB0aGUgU25pZmZlciBBUEkgaWYgd2UncmUgb24gQlNELCBMaW51eCwgb3IgaWYgd2UncmUKLQkjIGJ1aWxkaW5nIGEgU25pZmZlci1vbmx5IGxpYnBjYXAuCi0JIwotCTs7Ci0qKQotCSMKLQkjIElmIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIFNuaWZmZXIsIHRlbGwgdGhlbSBpdCdzIG5vdAotCSMgc3VwcG9ydGVkLgotCSMKLQkjIElmIHRoZXkgZXhwcmVzc2VkIG5vIHByZWZlcmVuY2UsIGRvbid0IGluY2x1ZGUgaXQuCi0JIwotCWlmIHRlc3QgJHdhbnRfc25mID0geWVzOyB0aGVuCi0JCWFzX2ZuX2Vycm9yICQ/ICJNeXJpY29tIFNORiBzdXBwb3J0IG9ubHkgYXZhaWxhYmxlIHdpdGggJ2JwZicgJ2xpbnV4JyBhbmQgJ3NuZicgcGFja2V0IGNhcHR1cmUgdHlwZXMiICIkTElORU5PIiA1Ci0JZWxpZiB0ZXN0ICR3YW50X3NuZiA9IHllczsgdGhlbgotCQl3YW50X3NuZj1ubwotCWZpCi0JOzsKLWVzYWMKLQogYWNfY3ZfbGJsX3NuZl9hcGk9bm8KIGlmIHRlc3QgIiR3aXRoX3NuZiIgIT0gbm87IHRoZW4KIAogCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIE15cmljb20gU25pZmZlciBBUEkiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIE15cmljb20gU25pZmZlciBBUEkuLi4gIiA+JjY7IH0KIAorCSMgSWYgbmVjZXNzYXJ5LCBzZXQgZGVmYXVsdCBwYXRocyBmb3IgU25pZmZlciBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuCiAJaWYgdGVzdCAteiAiJHNuZl9yb290IjsgdGhlbgogCQlzbmZfcm9vdD0vb3B0L3NuZgogCWZpCkBAIC02NjI1LDE2ICs2ODA2LDcgQEAKIAlmaQogCiAJaWYgdGVzdCAtZiAiJHNuZl9pbmNsdWRlX2Rpci9zbmYuaCI7IHRoZW4KLQkJYWNfY3ZfbGJsX3NuZl9hcGk9eWVzCi0JZmkKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9zbmZfYXBpICgkc25mX3Jvb3QpIiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGJsX3NuZl9hcGkgKCRzbmZfcm9vdCkiID4mNjsgfQotCi0JaWYgdGVzdCAkYWNfY3ZfbGJsX3NuZl9hcGkgPSBubzsgdGhlbgotCQlpZiB0ZXN0ICIkd2FudF9zbmYiID0geWVzOyB0aGVuCi0JCQlhc19mbl9lcnJvciAkPyAiU05GIEFQSSBoZWFkZXJzIG5vdCBmb3VuZCB1bmRlciAkc25mX2luY2x1ZGVfZGlyOyB1c2UgLS13aXRob3V0LXNuZiIgIiRMSU5FTk8iIDUKLQkJZmkKLQllbHNlCisJCSMgV2UgZm91bmQgYSBoZWFkZXI7IG1ha2Ugc3VyZSB3ZSBjYW4gbGluayB3aXRoIHRoZSBsaWJyYXJ5CiAJCXNhdmVkX2xkZmxhZ3M9JExERkxBR1MKIAkJTERGTEFHUz0iJExERkxBR1MgLUwkc25mX2xpYl9kaXIiCiAJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNuZl9pbml0IGluIC1sc25mIiA+JjUKQEAgLTY2NzUsMTMwICs2ODQ3LDE1MyBAQAogJGFzX2VjaG8gIiRhY19jdl9saWJfc25mX3NuZl9pbml0IiA+JjY7IH0KIGlmIHRlc3QgIngkYWNfY3ZfbGliX3NuZl9zbmZfaW5pdCIgPSB4eWVzOyB0aGVuIDoKICAgYWNfY3ZfbGJsX3NuZl9hcGk9InllcyIKLWVsc2UKLSAgYWNfY3ZfbGJsX3NuZl9hcGk9Im5vIgogZmkKIAogCQlMREZMQUdTPSIkc2F2ZWRfbGRmbGFncyIKKwkJaWYgdGVzdCAiJGFjX2N2X2xibF9zbmZfYXBpIiA9IG5vOyB0aGVuCisJCQlhc19mbl9lcnJvciAkPyAiU05GIEFQSSBjYW5ub3QgY29ycmVjdGx5IGJlIGxpbmtlZDsgY2hlY2sgY29uZmlnLmxvZyIgIiRMSU5FTk8iIDUKKwkJZmkKKwlmaQogCi0JCWlmIHRlc3QgJGFjX2N2X2xibF9zbmZfYXBpID0gbm87IHRoZW4KLQkJCWlmIHRlc3QgIiR3YW50X3NuZiIgPSB5ZXM7IHRoZW4KLQkJCQlhc19mbl9lcnJvciAkPyAiU05GIEFQSSBjYW5ub3QgY29ycmVjdGx5IGJlIGxpbmtlZCBjaGVjayBjb25maWcubG9nOyB1c2UgLS13aXRob3V0LXNuZiIgIiRMSU5FTk8iIDUKLQkJCWZpCi0JCWVsc2UKLQkJCVZfSU5DTFM9IiRWX0lOQ0xTIC1JJHNuZl9pbmNsdWRlX2RpciIKLQkJCUxJQlM9IiRMSUJTIC1sc25mIgotCQkJTERGTEFHUz0iJExERkxBR1MgLUwkc25mX2xpYl9kaXIiCi0JCQlpZiB0ZXN0ICIkVl9QQ0FQIiAhPSBzbmYgOyB0aGVuCi0JCQkJU1NSQz0icGNhcC1zbmYuYyIKLQkJCWZpCisJaWYgdGVzdCAiJGFjX2N2X2xibF9zbmZfYXBpIiA9IHllczsgdGhlbgorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzICgkc25mX3Jvb3QpIiA+JjUKKyRhc19lY2hvICJ5ZXMgKCRzbmZfcm9vdCkiID4mNjsgfQorCisJCVZfSU5DTFM9IiRWX0lOQ0xTIC1JJHNuZl9pbmNsdWRlX2RpciIKKwkJTElCUz0iJExJQlMgLWxzbmYiCisJCUxERkxBR1M9IiRMREZMQUdTIC1MJHNuZl9saWJfZGlyIgorCisJCWlmIHRlc3QgIiRWX1BDQVAiICE9IHNuZiA7IHRoZW4KKwkJCVNTUkM9IiRTU1JDIHBjYXAtc25mLmMiCisJCWZpCisKIAogJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TTkZfQVBJIDEiID4+Y29uZmRlZnMuaAogCisJZWxzZQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworCQlpZiB0ZXN0ICIkd2FudF9zbmYiID0geWVzOyB0aGVuCisJCQkjIFVzZXIgcmVxdWVzdGVkICJzbmYiIGNhcHR1cmUgdHlwZSBidXQKKwkJCSMgd2UgY291bGRuJ3QgZmluZCB0aGUgU25pZmZlciBBUEkgc3VwcG9ydC4KKwkJCWFzX2ZuX2Vycm9yICQ/ICJNeXJpY29tIFNuaWZmZXIgc3VwcG9ydCByZXF1ZXN0ZWQgd2l0aCAtLXdpdGgtcGNhcD1zbmYsIGJ1dCB0aGUgU25pZmZlciBoZWFkZXJzIHdlcmVuJ3QgZm91bmQgYXQgJHNuZl9pbmNsdWRlX2RpcjogbWFrZSBzdXJlIHRoZSBTbmlmZmVyIHN1cHBvcnQgaXMgaW5zdGFsbGVkLCBzcGVjaWZ5IGEgZGlmZmVyZW50IHBhdGggb3IgcGF0aHMgaWYgbmVjZXNzYXJ5LCBvciBkb24ndCByZXF1ZXN0IFNuaWZmZXIgc3VwcG9ydCIgIiRMSU5FTk8iIDUKKwkJZmkKKworCQlpZiB0ZXN0ICIkd2FudF9zbmYiID0geWVzOyB0aGVuCisJCQlhc19mbl9lcnJvciAkPyAiTXlyaWNvbSBTbmlmZmVyIHN1cHBvcnQgcmVxdWVzdGVkIHdpdGggLS13aXRoLXNuZiwgYnV0IHRoZSBTbmlmZmVyIGhlYWRlcnMgd2VyZW4ndCBmb3VuZCBhdCAkc25mX2luY2x1ZGVfZGlyOiBtYWtlIHN1cmUgdGhlIFNuaWZmZXIgc3VwcG9ydCBpcyBpbnN0YWxsZWQsIHNwZWNpZnkgYSBkaWZmZXJlbnQgcGF0aCBvciBwYXRocyBpZiBuZWNlc3NhcnksIG9yIGRvbid0IHJlcXVlc3QgU25pZmZlciBzdXBwb3J0IiAiJExJTkVOTyIgNQogCQlmaQogCWZpCiBmaQogCi1pZiB0ZXN0ICIkVl9QQ0FQIiA9IHNuZiAtYSAiJGFjX2N2X2xibF9zbmZfYXBpIiA9IG5vOyB0aGVuCi0JYXNfZm5fZXJyb3IgJD8gIlNwZWNpZnlpbmcgdGhlIGNhcHR1cmUgdHlwZSBhcyAnc25mJyByZXF1aXJlcyB0aGUgTXlyaWNvbSBTbmlmZmVyIEFQSSB0byBiZSBwcmVzZW50OyB1c2UgLS13aXRoLXNuZj1ESVIiICIkTElORU5PIiA1Ci1maQorIyBDaGVjayBmb3IgUml2ZXJiZWQgVHVyYm9DYXAgc3VwcG9ydC4KIAorIyBDaGVjayB3aGV0aGVyIC0td2l0aC10dXJib2NhcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdHVyYm9jYXArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3R1cmJvY2FwOworCWlmIHRlc3QgIiR3aXRodmFsIiA9IG5vCisJdGhlbgorCQkjIFVzZXIgZXhwbGljaXRseSBkb2Vzbid0IHdhbnQgVHVyYm9DYXAKKwkJd2FudF90dXJib2NhcD1ubworCWVsaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzCisJdGhlbgorCQkjIFVzZXIgd2FudHMgVHVyYm9DYXAgc3VwcG9ydCBidXQgaGFzbid0IHNwZWNpZmllZCBhIGRpcmVjdG9yeS4KKwkJd2FudF90dXJib2NhcD15ZXMKKwllbHNlCisJCSMgVXNlciB3YW50cyBUdXJib0NhcCBzdXBwb3J0IHdpdGggYSBzcGVjaWZpZWQgZGlyZWN0b3J5LgorCQl3YW50X3R1cmJvY2FwPXllcworCQl0dXJib2NhcF9yb290PSR3aXRodmFsCisJZmkKIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1mbGV4IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9mbGV4K3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9mbGV4OwotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWJpc29uIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9iaXNvbitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfYmlzb247Ci1maQotCi0gICAgaWYgdGVzdCAiJHdpdGhfZmxleCIgPSBubyA7IHRoZW4KLQkgICAgVl9MRVg9bGV4Ci0gICAgZWxzZQotCSAgICBmb3IgYWNfcHJvZyBpbiBmbGV4Ci1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3Byb2dfVl9MRVgrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBpZiB0ZXN0IC1uICIkVl9MRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfVl9MRVg9IiRWX0xFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KLSAgICBhY19jdl9wcm9nX1ZfTEVYPSIkYWNfcHJvZyIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKKworCWlmIHRlc3QgInh4eF9vbmx5IiA9IHllczsgdGhlbgorCQkjIFVzZXIgcmVxdWVzdGVkIHNvbWV0aGluZy1lbHNlLW9ubHkgcGNhcCwgc28gdGhleSBkb24ndAorCQkjIHdhbnQgVHVyYm9DYXAgc3VwcG9ydC4KKwkJd2FudF90dXJib2NhcD1ubworCWVsc2UKKwkJIworCQkjIFVzZSBUdXJib0NhcCBBUEkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRvbid0CisJCSMKKwkJd2FudF90dXJib2NhcD1pZnByZXNlbnQKKwlmaQogCiBmaQorCisKK2FjX2N2X2xibF90dXJib2NhcF9hcGk9bm8KK2lmIHRlc3QgIiR3YW50X3R1cmJvY2FwIiAhPSBubzsgdGhlbgorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIFR1cmJvQ2FwIGlzIHN1cHBvcnRlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIFR1cmJvQ2FwIGlzIHN1cHBvcnRlZC4uLiAiID4mNjsgfQorCisJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJc2F2ZV9MSUJTPSIkTElCUyIKKwlpZiB0ZXN0ICEgLXogIiR0dXJib2NhcF9yb290IjsgdGhlbgorCQlUVVJCT0NBUF9DRkxBR1M9Ii1JJHR1cmJvY2FwX3Jvb3QvaW5jbHVkZSIKKwkJVFVSQk9DQVBfTElCUz0iLUwkdHVyYm9jYXBfcm9vdC9saWIiCisJCUNGTEFHUz0iJENGTEFHUyAkVFVSQk9DQVBfQ0ZMQUdTIgorCWZpCisKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKwkgICAgI2luY2x1ZGUgPFRjQXBpLmg+CisKK2ludAorbWFpbiAoKQoreworCisJICAgIFRDX0lOU1RBTkNFIGE7IFRDX1BPUlQgYjsgVENfQk9BUkQgYzsKKwkgICAgVENfSU5TVEFOQ0UgaTsKKwkgICAgKHZvaWQpVGNJbnN0YW5jZUNyZWF0ZUJ5TmFtZSgiZm9vIiwgJmkpOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX3R1cmJvY2FwX2FwaT15ZXMKIGZpCi1WX0xFWD0kYWNfY3ZfcHJvZ19WX0xFWAotaWYgdGVzdCAtbiAiJFZfTEVYIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFZfTEVYIiA+JjUKLSRhc19lY2hvICIkVl9MRVgiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKKwlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwlpZiB0ZXN0ICRhY19jdl9sYmxfdHVyYm9jYXBfYXBpID0geWVzOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKKwkJU1NSQz0iJFNTUkMgcGNhcC10Yy5jIgorCQlWX0lOQ0xTPSIkVl9JTkNMUyAkVFVSQk9DQVBfQ0ZMQUdTIgorCQlMSUJTPSIkTElCUyAkVFVSQk9DQVBfTElCUyAtbFRjQXBpIC1scHRocmVhZCAtbHN0ZGMrKyIKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1RDX0FQSSAxIiA+PmNvbmZkZWZzLmgKKworCWVsc2UKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9Ci1maQogCi0KLSAgdGVzdCAtbiAiJFZfTEVYIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJFZfTEVYIiB8fCBWX0xFWD0ibGV4IgotCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkVl9MRVgiID0gZmxleCA7IHRoZW4KLQkgICAgIyBUaGUgLVYgZmxhZyB3YXMgYWRkZWQgaW4gMi40Ci0JICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZsZXggMi40IG9yIGhpZ2hlciIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgZmxleCAyLjQgb3IgaGlnaGVyLi4uICIgPiY2OyB9Ci0JICAgIGlmICR7YWNfY3ZfbGJsX2ZsZXhfdjI0Kzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgZmxleCAtViA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJCWFjX2N2X2xibF9mbGV4X3YyND15ZXMKLQkJZWxzZQotCQkJYWNfY3ZfbGJsX2ZsZXhfdjI0PW5vCisJCWlmIHRlc3QgIiR3YW50X3R1cmJvY2FwIiA9IHllczsgdGhlbgorCSAgICAgICAgCSMgVXNlciB3YW50ZWQgVHVyYm8gc3VwcG9ydCBidXQgd2UgY291bGRuJ3QgZmluZCBpdC4KKwkJCWFzX2ZuX2Vycm9yICQ/ICJUdXJib0NhcCBzdXBwb3J0IHJlcXVlc3RlZCB3aXRoIC0td2l0aC10dXJib2NhcCwgYnV0IHRoZSBUdXJib0NhcCBoZWFkZXJzIHdlcmVuJ3QgZm91bmQ6IG1ha2Ugc3VyZSB0aGUgVHVyYm9DYXAgc3VwcG9ydCBpcyBpbnN0YWxsZWQgb3IgZG9uJ3QgcmVxdWVzdCBUdXJib0NhcCBzdXBwb3J0IiAiJExJTkVOTyIgNQogCQlmaQorCWZpCiBmaQogCi0JICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2ZsZXhfdjI0IiA+JjUKLSRhc19lY2hvICIkYWNfY3ZfbGJsX2ZsZXhfdjI0IiA+JjY7IH0KLQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2ZsZXhfdjI0ID0gbm8gOyB0aGVuCi0JCSAgICBzPSIyLjQgb3IgaGlnaGVyIHJlcXVpcmVkIgotCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBpZ25vcmluZyBvYnNvbGV0ZSBmbGV4IGV4ZWN1dGFibGUgKCRzKSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpZ25vcmluZyBvYnNvbGV0ZSBmbGV4IGV4ZWN1dGFibGUgKCRzKSIgPiYyO30KLQkJICAgIFZfTEVYPWxleAotCSAgICBmaQotICAgIGZpCi0gICAgaWYgdGVzdCAiJHdpdGhfYmlzb24iID0gbm8gOyB0aGVuCi0JICAgIFZfWUFDQz15YWNjCi0gICAgZWxzZQotCSAgICBmb3IgYWNfcHJvZyBpbiBiaXNvbgorIworIyBMb29rIGZvciB7Zn1sZXguCisjCitmb3IgYWNfcHJvZyBpbiBmbGV4IGxleAogZG8KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgJHthY19jdl9wcm9nX1ZfWUFDQys6fSBmYWxzZTsgdGhlbiA6CitpZiAke2FjX2N2X3Byb2dfTEVYKzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgdGVzdCAtbiAiJFZfWUFDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19WX1lBQ0M9IiRWX1lBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBpZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgorICBhY19jdl9wcm9nX0xFWD0iJExFWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCiBlbHNlCiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICkBAIC02ODA3LDcgKzcwMDIsNyBAQAogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19WX1lBQ0M9IiRhY19wcm9nIgorICAgIGFjX2N2X3Byb2dfTEVYPSIkYWNfcHJvZyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCkBAIC02ODE3LDYxICs3MDEyLDIzMCBAQAogCiBmaQogZmkKLVZfWUFDQz0kYWNfY3ZfcHJvZ19WX1lBQ0MKLWlmIHRlc3QgLW4gIiRWX1lBQ0MiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVl9ZQUNDIiA+JjUKLSRhc19lY2hvICIkVl9ZQUNDIiA+JjY7IH0KK0xFWD0kYWNfY3ZfcHJvZ19MRVgKK2lmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEVYIiA+JjUKKyRhc19lY2hvICIkTEVYIiA+JjY7IH0KIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCiAKLSAgdGVzdCAtbiAiJFZfWUFDQyIgJiYgYnJlYWsKKyAgdGVzdCAtbiAiJExFWCIgJiYgYnJlYWsKIGRvbmUKLXRlc3QgLW4gIiRWX1lBQ0MiIHx8IFZfWUFDQz0ieWFjYyIKK3Rlc3QgLW4gIiRMRVgiIHx8IExFWD0iOiIKIAotICAgIGZpCi0gICAgaWYgdGVzdCAiJFZfWUFDQyIgPSBiaXNvbiA7IHRoZW4KLQkgICAgVl9ZQUNDPSIkVl9ZQUNDIC15IgotICAgIGZpCi0gICAgaWYgdGVzdCAiJFZfTEVYIiAhPSBsZXggLWEgIiRWX1lBQ0MiID0geWFjYyAtbyAiJFZfTEVYIiA9IGxleCAtYSAiJFZfWUFDQyIgIT0geWFjYyA7IHRoZW4KLQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBkb24ndCBoYXZlIGJvdGggZmxleCBhbmQgYmlzb247IHJldmVydGluZyB0byBsZXgveWFjYyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBkb24ndCBoYXZlIGJvdGggZmxleCBhbmQgYmlzb247IHJldmVydGluZyB0byBsZXgveWFjYyIgPiYyO30KLQkgICAgVl9MRVg9bGV4Ci0JICAgIFZfWUFDQz15YWNjCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkVl9MRVgiID0gZmxleCAtYSAtbiAicGNhcF8iIDsgdGhlbgotCSAgICBWX0xFWD0iJFZfTEVYIC1QcGNhcF8iCi0JICAgIFZfWUFDQz0iJFZfWUFDQyAtcCBwY2FwXyIKLSAgICBlbHNlCitpZiB0ZXN0ICJ4JExFWCIgIT0gIng6IjsgdGhlbgorICBjYXQgPmNvbmZ0ZXN0LmwgPDxfQUNFT0YKKyUlCithIHsgRUNITzsgfQorYiB7IFJFSkVDVDsgfQorYyB7IHl5bW9yZSAoKTsgfQorZCB7IHl5bGVzcyAoMSk7IH0KK2UgeyAvKiBJUklYIDYuNSBmbGV4IDIuNS40IHVuZGVycXVvdGVzIGl0cyB5eWxlc3MgYXJndW1lbnQuICAqLworICAgIHl5bGVzcyAoKGlucHV0ICgpICE9IDApKTsgfQorZiB7IHVucHV0ICh5eXRleHRbMF0pOyB9CisuIHsgQkVHSU4gSU5JVElBTDsgfQorJSUKKyNpZmRlZiBZWVRFWFRfUE9JTlRFUgorZXh0ZXJuIGNoYXIgKnl5dGV4dDsKKyNlbmRpZgoraW50CittYWluICh2b2lkKQoreworICByZXR1cm4gISB5eWxleCAoKSArICEgeXl3cmFwICgpOworfQorX0FDRU9GCit7IHsgYWNfdHJ5PSIkTEVYIGNvbmZ0ZXN0LmwiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRMRVggY29uZnRlc3QubCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfbGV4X3Jvb3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQogCi0kYXNfZWNobyAiI2RlZmluZSBORUVEX1lZUEFSU0VfV1JBUFBFUiAxIiA+PmNvbmZkZWZzLmgKK2lmIHRlc3QgLWYgbGV4Lnl5LmM7IHRoZW4KKyAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXgueXkKK2VsaWYgdGVzdCAtZiBsZXh5eS5jOyB0aGVuCisgIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4eXkKK2Vsc2UKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIG91dHB1dCBmcm9tICRMRVg7IGdpdmluZyB1cCIgIiRMSU5FTk8iIDUKK2ZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2xleF9yb290IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19sZXhfcm9vdCIgPiY2OyB9CitMRVhfT1VUUFVUX1JPT1Q9JGFjX2N2X3Byb2dfbGV4X3Jvb3QKIAotICAgIGZpCi1pZiB0ZXN0ICIkVl9MRVgiID0gbGV4IDsgdGhlbgotIyBTb21lIHZlcnNpb25zIG9mIGxleCBjYW4ndCBoYW5kbGUgdGhlIGRlZmluaXRpb25zIHNlY3Rpb24gb2Ygc2Nhbm5lci5sIC4KLSMgVHJ5IGxleGluZyBpdCBhbmQgY29tcGxhaW4gaWYgaXQgY2FuJ3QgZGVhbC4KLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjYXBhYmxlIGxleCIgPiY1CitpZiB0ZXN0IC16ICIke0xFWExJQitzZXR9IjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGxleCBsaWJyYXJ5IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGxleCBsaWJyYXJ5Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9sZXgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgICAgYWNfc2F2ZV9MSUJTPSRMSUJTCisgICAgYWNfY3ZfbGliX2xleD0nbm9uZSBuZWVkZWQnCisgICAgZm9yIGFjX2xpYiBpbiAnJyAtbGZsIC1sbDsgZG8KKyAgICAgIExJQlM9IiRhY19saWIgJGFjX3NhdmVfTElCUyIKKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK2BjYXQgJExFWF9PVVRQVVRfUk9PVC5jYAorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9sZXg9JGFjX2xpYgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICB0ZXN0ICIkYWNfY3ZfbGliX2xleCIgIT0gJ25vbmUgbmVlZGVkJyAmJiBicmVhaworICAgIGRvbmUKKyAgICBMSUJTPSRhY19zYXZlX0xJQlMKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2xleCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9sZXgiID4mNjsgfQorICB0ZXN0ICIkYWNfY3ZfbGliX2xleCIgIT0gJ25vbmUgbmVlZGVkJyAmJiBMRVhMSUI9JGFjX2N2X2xpYl9sZXgKK2ZpCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgIyBQT1NJWCBzYXlzIGxleCBjYW4gZGVjbGFyZSB5eXRleHQgZWl0aGVyIGFzIGEgcG9pbnRlciBvciBhbiBhcnJheTsgdGhlCisjIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiAgRmlndXJlIG91dCB3aGljaCBpdCBpcywgc2luY2UKKyMgbm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgcHJvdmlkZSB0aGUgJXBvaW50ZXIgYW5kICVhcnJheSBkZWNsYXJhdGlvbnMuCithY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj1ubworYWNfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSIkTEVYTElCICRhY19zYXZlX0xJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyAgI2RlZmluZSBZWVRFWFRfUE9JTlRFUiAxCitgY2F0ICRMRVhfT1VUUFVUX1JPT1QuY2AKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfc2F2ZV9MSUJTCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgWVlURVhUX1BPSU5URVIgMSIgPj5jb25mZGVmcy5oCisKK2ZpCitybSAtZiBjb25mdGVzdC5sICRMRVhfT1VUUFVUX1JPT1QuYworCitmaQoraWYgdGVzdCAiJExFWCIgPSAiOiI7IHRoZW4KKwlhc19mbl9lcnJvciAkPyAiTmVpdGhlciBmbGV4IG5vciBsZXggd2FzIGZvdW5kLiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMKKyMgTWFrZSBzdXJlIHtmfWxleCBzdXBwb3J0cyB0aGUgLVAsIC0taGVhZGVyLWZpbGUsIGFuZCAtLW5vdW5wdXQgZmxhZ3MKKyMgYW5kIHN1cHBvcnRzIHByb2Nlc3Npbmcgb3VyIHNjYW5uZXIubC4KKyMKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGNhcGFibGUgbGV4IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBjYXBhYmxlIGxleC4uLiAiID4mNjsgfQogaWYgJHt0Y3BkdW1wX2N2X2NhcGFibGVfbGV4Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgbGV4IC10IHNjYW5uZXIubCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCQl0Y3BkdW1wX2N2X2NhcGFibGVfbGV4PXllcwotCQllbHNlCi0JCQl0Y3BkdW1wX2N2X2NhcGFibGVfbGV4PWluc3VmZmljaWVudAotCQlmaQorICBpZiAkTEVYIC1QIHBjYXBfIC0taGVhZGVyLWZpbGU9L2Rldi9udWxsIC0tbm91bnB1dCAtdCAkc3JjZGlyL3NjYW5uZXIubCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgIHRjcGR1bXBfY3ZfY2FwYWJsZV9sZXg9eWVzCisJZWxzZQorCSAgICB0Y3BkdW1wX2N2X2NhcGFibGVfbGV4PWluc3VmZmljaWVudAorCWZpCiBmaQogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR0Y3BkdW1wX2N2X2NhcGFibGVfbGV4IiA+JjUKICRhc19lY2hvICIkdGNwZHVtcF9jdl9jYXBhYmxlX2xleCIgPiY2OyB9Ci0JaWYgdGVzdCAkdGNwZHVtcF9jdl9jYXBhYmxlX2xleCA9IGluc3VmZmljaWVudCA7IHRoZW4KLQkJYXNfZm5fZXJyb3IgJD8gIllvdXIgb3BlcmF0aW5nIHN5c3RlbSdzIGxleCBpcyBpbnN1ZmZpY2llbnQgdG8gY29tcGlsZQotIGxpYnBjYXAuICBmbGV4IGlzIGEgbGV4IHJlcGxhY2VtZW50IHRoYXQgaGFzIG1hbnkgYWR2YW50YWdlcywgaW5jbHVkaW5nCi0gYmVpbmcgYWJsZSB0byBjb21waWxlIGxpYnBjYXAuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCi0gaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2ZsZXgvZmxleC5odG1sIC4iICIkTElORU5PIiA1CitpZiB0ZXN0ICR0Y3BkdW1wX2N2X2NhcGFibGVfbGV4ID0gaW5zdWZmaWNpZW50IDsgdGhlbgorCWFzX2ZuX2Vycm9yICQ/ICIkTEVYIGlzIGluc3VmZmljaWVudCB0byBjb21waWxlIGxpYnBjYXAuCisgbGlicGNhcCByZXF1aXJlcyBGbGV4IDIuNS4zMSBvciBsYXRlciwgb3IgYSBjb21wYXRpYmxlIHZlcnNpb24gb2YgbGV4LiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMKKyMgTG9vayBmb3IgeWFjYy9iaXNvbi9ieWFjYy4KKyMKK2ZvciBhY19wcm9nIGluICdiaXNvbiAteScgYnlhY2MKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19ZQUNDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfWUFDQz0iJFlBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19ZQUNDPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitZQUNDPSRhY19jdl9wcm9nX1lBQ0MKK2lmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFlBQ0MiID4mNQorJGFzX2VjaG8gIiRZQUNDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJFlBQ0MiICYmIGJyZWFrCitkb25lCit0ZXN0IC1uICIkWUFDQyIgfHwgWUFDQz0ieWFjYyIKKworCisjCisjIE1ha2Ugc3VyZSBpdCBzdXBwb3J0cyB0aGUgLXAgZmxhZyBhbmQgc3VwcG9ydHMgcHJvY2Vzc2luZyBvdXIKKyMgZ3JhbW1hci55LgorIworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY2FwYWJsZSB5YWNjL2Jpc29uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBjYXBhYmxlIHlhY2MvYmlzb24uLi4gIiA+JjY7IH0KK2lmICR7dGNwZHVtcF9jdl9jYXBhYmxlX3lhY2MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiAkWUFDQyAtcCBwY2FwXyAtbyAvZGV2L251bGwgJHNyY2Rpci9ncmFtbWFyLnkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgIHRjcGR1bXBfY3ZfY2FwYWJsZV95YWNjPXllcworCWVsc2UKKwkgICAgdGNwZHVtcF9jdl9jYXBhYmxlX3lhY2M9aW5zdWZmaWNpZW50CiAJZmkKIGZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHRjcGR1bXBfY3ZfY2FwYWJsZV95YWNjIiA+JjUKKyRhc19lY2hvICIkdGNwZHVtcF9jdl9jYXBhYmxlX3lhY2MiID4mNjsgfQoraWYgdGVzdCAkdGNwZHVtcF9jdl9jYXBhYmxlX3lhY2MgPSBpbnN1ZmZpY2llbnQgOyB0aGVuCisJYXNfZm5fZXJyb3IgJD8gIiRZQUNDIGlzIGluc3VmZmljaWVudCB0byBjb21waWxlIGxpYnBjYXAuCisgbGlicGNhcCByZXF1aXJlcyBCaXNvbiwgQmVya2VsZXkgWUFDQywgb3IgYW5vdGhlciBZQUNDIGNvbXBhdGlibGUgd2l0aCB0aGVtLiIgIiRMSU5FTk8iIDUKK2ZpCiAKICMKICMgQXNzdW1lLCBieSBkZWZhdWx0LCBubyBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBWNy9CU0QgY29udmVudGlvbgpAQCAtNzQwMiw3ICs3NzY2LDE4IEBACiAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLVdhbGwgb3B0aW9uIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAtV2FsbCBvcHRpb24uLi4gIiA+JjY7IH0KIAlzYXZlX0NGTEFHUz0iJENGTEFHUyIKLQlDRkxBR1M9IiRDRkxBR1MgJGFjX2xibF91bmtub3duX3dhcm5pbmdfb3B0aW9uX2Vycm9yIC1XYWxsIgorCWlmIGV4cHIgIngtV2FsbCIgOiAieC1XLioiID4vZGV2L251bGwKKwl0aGVuCisJICAgIENGTEFHUz0iJENGTEFHUyAkYWNfbGJsX3Vua25vd25fd2FybmluZ19vcHRpb25fZXJyb3IgLVdhbGwiCisJZWxpZiBleHByICJ4LVdhbGwiIDogIngtZi4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV2FsbCIKKwllbGlmIGV4cHIgIngtV2FsbCIgOiAieC1tLioiID4vZGV2L251bGwKKwl0aGVuCisJICAgIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIC1XYWxsIgorCWVsc2UKKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIgorCWZpCiAJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCkBAIC03NDMxLDEwICs3ODA2LDY0IEBACiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLVdzaWduLWNvbXBhcmUgb3B0aW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAtV3NpZ24tY29tcGFyZSBvcHRpb24uLi4gIiA+JjY7IH0KKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlpZiBleHByICJ4LVdzaWduLWNvbXBhcmUiIDogIngtVy4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgJGFjX2xibF91bmtub3duX3dhcm5pbmdfb3B0aW9uX2Vycm9yIC1Xc2lnbi1jb21wYXJlIgorCWVsaWYgZXhwciAieC1Xc2lnbi1jb21wYXJlIiA6ICJ4LWYuKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgLVdzaWduLWNvbXBhcmUiCisJZWxpZiBleHByICJ4LVdzaWduLWNvbXBhcmUiIDogIngtbS4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV3NpZ24tY29tcGFyZSIKKwllbHNlCisJICAgIENGTEFHUz0iJENGTEFHUyAtV3NpZ24tY29tcGFyZSIKKwlmaQorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CityZXR1cm4gMAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisJCVZfQ0NPUFQ9IiRWX0NDT1BUIC1Xc2lnbi1jb21wYXJlIgorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKKwogCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlIC1XbWlzc2luZy1wcm90b3R5cGVzIG9wdGlvbiIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLVdtaXNzaW5nLXByb3RvdHlwZXMgb3B0aW9uLi4uICIgPiY2OyB9CiAJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfdW5rbm93bl93YXJuaW5nX29wdGlvbl9lcnJvciAtV21pc3NpbmctcHJvdG90eXBlcyIKKwlpZiBleHByICJ4LVdtaXNzaW5nLXByb3RvdHlwZXMiIDogIngtVy4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgJGFjX2xibF91bmtub3duX3dhcm5pbmdfb3B0aW9uX2Vycm9yIC1XbWlzc2luZy1wcm90b3R5cGVzIgorCWVsaWYgZXhwciAieC1XbWlzc2luZy1wcm90b3R5cGVzIiA6ICJ4LWYuKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgLVdtaXNzaW5nLXByb3RvdHlwZXMiCisJZWxpZiBleHByICJ4LVdtaXNzaW5nLXByb3RvdHlwZXMiIDogIngtbS4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV21pc3NpbmctcHJvdG90eXBlcyIKKwllbHNlCisJICAgIENGTEFHUz0iJENGTEFHUyAtV21pc3NpbmctcHJvdG90eXBlcyIKKwlmaQogCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIApAQCAtNzQ2Niw3ICs3ODk1LDE4IEBACiAJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLVdzdHJpY3QtcHJvdG90eXBlcyBvcHRpb24iID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlIC1Xc3RyaWN0LXByb3RvdHlwZXMgb3B0aW9uLi4uICIgPiY2OyB9CiAJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfdW5rbm93bl93YXJuaW5nX29wdGlvbl9lcnJvciAtV3N0cmljdC1wcm90b3R5cGVzIgorCWlmIGV4cHIgIngtV3N0cmljdC1wcm90b3R5cGVzIiA6ICJ4LVcuKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfdW5rbm93bl93YXJuaW5nX29wdGlvbl9lcnJvciAtV3N0cmljdC1wcm90b3R5cGVzIgorCWVsaWYgZXhwciAieC1Xc3RyaWN0LXByb3RvdHlwZXMiIDogIngtZi4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV3N0cmljdC1wcm90b3R5cGVzIgorCWVsaWYgZXhwciAieC1Xc3RyaWN0LXByb3RvdHlwZXMiIDogIngtbS4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV3N0cmljdC1wcm90b3R5cGVzIgorCWVsc2UKKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1Xc3RyaWN0LXByb3RvdHlwZXMiCisJZmkKIAljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKQEAgLTc0OTQsNiArNzkzNCwxMzUgQEAKIGZpCiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLVdzaGFkb3cgb3B0aW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAtV3NoYWRvdyBvcHRpb24uLi4gIiA+JjY7IH0KKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlpZiBleHByICJ4LVdzaGFkb3ciIDogIngtVy4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgJGFjX2xibF91bmtub3duX3dhcm5pbmdfb3B0aW9uX2Vycm9yIC1Xc2hhZG93IgorCWVsaWYgZXhwciAieC1Xc2hhZG93IiA6ICJ4LWYuKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgLVdzaGFkb3ciCisJZWxpZiBleHByICJ4LVdzaGFkb3ciIDogIngtbS4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV3NoYWRvdyIKKwllbHNlCisJICAgIENGTEFHUz0iJENGTEFHUyAtV3NoYWRvdyIKKwlmaQorCWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CityZXR1cm4gMAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisJCVZfQ0NPUFQ9IiRWX0NDT1BUIC1Xc2hhZG93IgorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IG9wdGlvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgb3B0aW9uLi4uICIgPiY2OyB9CisJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJaWYgZXhwciAieC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IiA6ICJ4LVcuKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRhY19sYmxfdW5rbm93bl93YXJuaW5nX29wdGlvbl9lcnJvciAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCIKKwllbGlmIGV4cHIgIngtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCIgOiAieC1mLioiID4vZGV2L251bGwKKwl0aGVuCisJICAgIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IgorCWVsaWYgZXhwciAieC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IiA6ICJ4LW0uKiIgPi9kZXYvbnVsbAorCXRoZW4KKwkgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQiCisJZWxzZQorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQiCisJZmkKKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIDAKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCQlWX0NDT1BUPSIkVl9DQ09QVCAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCIKKworZWxzZQorCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAtV3VzZWQtYnV0LW1hcmtlZC11bnVzZWQgb3B0aW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAtV3VzZWQtYnV0LW1hcmtlZC11bnVzZWQgb3B0aW9uLi4uICIgPiY2OyB9CisJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJaWYgZXhwciAieC1XdXNlZC1idXQtbWFya2VkLXVudXNlZCIgOiAieC1XLioiID4vZGV2L251bGwKKwl0aGVuCisJICAgIENGTEFHUz0iJENGTEFHUyAkYWNfbGJsX3Vua25vd25fd2FybmluZ19vcHRpb25fZXJyb3IgLVd1c2VkLWJ1dC1tYXJrZWQtdW51c2VkIgorCWVsaWYgZXhwciAieC1XdXNlZC1idXQtbWFya2VkLXVudXNlZCIgOiAieC1mLioiID4vZGV2L251bGwKKwl0aGVuCisJICAgIENGTEFHUz0iJENGTEFHUyAtV2Vycm9yIC1XdXNlZC1idXQtbWFya2VkLXVudXNlZCIKKwllbGlmIGV4cHIgIngtV3VzZWQtYnV0LW1hcmtlZC11bnVzZWQiIDogIngtbS4qIiA+L2Rldi9udWxsCisJdGhlbgorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV3VzZWQtYnV0LW1hcmtlZC11bnVzZWQiCisJZWxzZQorCSAgICBDRkxBR1M9IiRDRkxBR1MgLVd1c2VkLWJ1dC1tYXJrZWQtdW51c2VkIgorCWZpCisJY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAwCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorCQlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwkJVl9DQ09QVD0iJFZfQ0NPUFQgLVd1c2VkLWJ1dC1tYXJrZWQtdW51c2VkIgorCitlbHNlCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCUNGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKIAkgICAgZmkKIAogCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMiID4mNQpAQCAtNzgxMywxNCArODM4Miw2IEBACiAKICAgICBmaQogCi0jCi0jIE1ha2VmaWxlLmluIGluY2x1ZGVzIHJ1bGVzIHRvIGdlbmVyYXRlIHZlcnNpb24uaCwgc28gd2UgYXNzdW1lCi0jIHRoYXQgaXQgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgYXV0b2NvbmYgaXMgdXNlZC4KLSMKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9WRVJTSU9OX0ggMSIgPj5jb25mZGVmcy5oCi0KLQogcm0gLWYgbmV0CiBsbiAtcyAke3NyY2Rpcn0vYnBmL25ldCBuZXQKIApAQCAtNzg1MCw2ICs4NDExLDEyIEBACiBmaQogCiAKK2lmIHRlc3QgInh4eF9vbmx5IiA9IHllczsgdGhlbgorCSMgVXNlciByZXF1ZXN0ZWQgc29tZXRoaW5nLWVsc2Utb25seSBwY2FwLCBzbyB0aGV5IGRvbid0CisJIyB3YW50IFVTQiBzdXBwb3J0LgorCWVuYWJsZV91c2I9bm8KK2ZpCisKIGlmIHRlc3QgIngkZW5hYmxlX3VzYiIgIT0gInhubyIgOyB0aGVuCiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBVU0Igc25pZmZpbmcgc3VwcG9ydCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgVVNCIHNuaWZmaW5nIHN1cHBvcnQuLi4gIiA+JjY7IH0KQEAgLTc5NjcsNiArODUzNCwxNSBAQAogCSAgICBmaQogCWZpCiAJOzsKKyAgICBmcmVlYnNkKikKKwkjCisJIyBUaGlzIGp1c3QgdXNlcyBCUEYgaW4gRnJlZUJTRCA4LjQgYW5kIGxhdGVyOyB3ZSBkb24ndCBuZWVkCisJIyB0byBjaGVjayBmb3IgYW55dGhpbmcgc3BlY2lhbCBmb3IgY2FwdHVyaW5nLgorCSMKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzLCBpbiBGcmVlQlNEIDguNCBhbmQgbGF0ZXIiID4mNQorJGFzX2VjaG8gInllcywgaW4gRnJlZUJTRCA4LjQgYW5kIGxhdGVyIiA+JjY7IH0KKwk7OworCiAgICAgKikKIAl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQogJGFzX2VjaG8gIm5vIiA+JjY7IH0KQEAgLTc5NzYsMjMgKzg1NTIsMjQgQEAKIAogCiAKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgcGxhdGZvcm0gY291bGQgc3VwcG9ydCBuZXRmaWx0ZXIgc25pZmZpbmciID4mNQoraWYgdGVzdCAieHh4X29ubHkiICE9IHllczsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0aGUgcGxhdGZvcm0gY291bGQgc3VwcG9ydCBuZXRmaWx0ZXIgc25pZmZpbmciID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgcGxhdGZvcm0gY291bGQgc3VwcG9ydCBuZXRmaWx0ZXIgc25pZmZpbmcuLi4gIiA+JjY7IH0KLWNhc2UgIiRob3N0X29zIiBpbgotbGludXgqKQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorCWNhc2UgIiRob3N0X29zIiBpbgorCWxpbnV4KikKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiAkYXNfZWNobyAieWVzIiA+JjY7IH0KLQkjCi0JIyBMaWZlJ3MgdG9vIHNob3J0IHRvIGRlYWwgd2l0aCB0cnlpbmcgdG8gZ2V0IHRoaXMgdG8gY29tcGlsZQotCSMgaWYgeW91IGRvbid0IGdldCB0aGUgcmlnaHQgdHlwZXMgZGVmaW5lZCB3aXRoCi0JIyBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMgZ2V0dGluZyBkZWZpbmVkIGJ5IHNvbWUgb3RoZXIgaW5jbHVkZS4KLQkjCi0JIyBDaGVjayB3aGV0aGVyIHRoZSBpbmNsdWRlcyBKdXN0IFdvcmsuICBJZiBub3QsIGRvbid0IHR1cm4gb24KLQkjIG5ldGZpbHRlciBzdXBwb3J0LgotCSMKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgY2FuIGNvbXBpbGUgdGhlIG5ldGZpbHRlciBzdXBwb3J0IiA+JjUKKwkJIworCQkjIExpZmUncyB0b28gc2hvcnQgdG8gZGVhbCB3aXRoIHRyeWluZyB0byBnZXQgdGhpcyB0byBjb21waWxlCisJCSMgaWYgeW91IGRvbid0IGdldCB0aGUgcmlnaHQgdHlwZXMgZGVmaW5lZCB3aXRoCisJCSMgX19LRVJORUxfU1RSSUNUX05BTUVTIGdldHRpbmcgZGVmaW5lZCBieSBzb21lIG90aGVyIGluY2x1ZGUuCisJCSMKKwkJIyBDaGVjayB3aGV0aGVyIHRoZSBpbmNsdWRlcyBKdXN0IFdvcmsuICBJZiBub3QsIGRvbid0IHR1cm4gb24KKwkJIyBuZXRmaWx0ZXIgc3VwcG9ydC4KKwkJIworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgY2FuIGNvbXBpbGUgdGhlIG5ldGZpbHRlciBzdXBwb3J0IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgY2FuIGNvbXBpbGUgdGhlIG5ldGZpbHRlciBzdXBwb3J0Li4uICIgPiY2OyB9Ci0JaWYgJHthY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUrOn0gZmFsc2U7IHRoZW4gOgorCQlpZiAke2FjX2N2X25ldGZpbHRlcl9jYW5fY29tcGlsZSs6fSBmYWxzZTsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKQEAgLTgwMjQsMjAgKzg2MDEsMjEgQEAKIHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlIiA+JjUKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUiID4mNQogJGFzX2VjaG8gIiRhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUiID4mNjsgfQotCWlmIHRlc3QgJGFjX2N2X25ldGZpbHRlcl9jYW5fY29tcGlsZSA9IHllcyA7IHRoZW4KKwkJaWYgdGVzdCAkYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlID0geWVzIDsgdGhlbgogCiAkYXNfZWNobyAiI2RlZmluZSBQQ0FQX1NVUFBPUlRfTkVURklMVEVSIDEiID4+Y29uZmRlZnMuaAogCi0JICBORVRGSUxURVJfU1JDPXBjYXAtbmV0ZmlsdGVyLWxpbnV4LmMKLQlmaQotCTs7Ci0qKQotCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CisJCSAgTkVURklMVEVSX1NSQz1wY2FwLW5ldGZpbHRlci1saW51eC5jCisJCWZpCisJCTs7CisJKikKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9Ci0JOzsKLWVzYWMKKwkJOzsKKwllc2FjCitmaQogCiAKIApAQCAtODA0OSw2ICs4NjI3LDEyIEBACiBmaQogCiAKK2lmIHRlc3QgInh4eF9vbmx5IiA9IHllczsgdGhlbgorCSMgVXNlciByZXF1ZXN0ZWQgc29tZXRoaW5nLWVsc2Utb25seSBwY2FwLCBzbyB0aGV5IGRvbid0CisJIyB3YW50IEJsdWV0b290aCBzdXBwb3J0LgorCWVuYWJsZV9ibHVldG9vdGg9bm8KK2ZpCisKIGlmIHRlc3QgIngkZW5hYmxlX2JsdWV0b290aCIgIT0gInhubyIgOyB0aGVuCiAJCWNhc2UgIiRob3N0X29zIiBpbgogCWxpbnV4KikKQEAgLTgxNzAsMTUxICs4NzU0LDYgQEAKIAogZmkKIAotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNhbnVzYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9jYW51c2Irc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9jYW51c2I7Ci1lbHNlCi0gIGVuYWJsZV9jYW51c2I9aWZzdXBwb3J0YXZhaWxhYmxlCi1maQotCi0KLWlmIHRlc3QgIngkZW5hYmxlX2NhbnVzYiIgIT0gInhubyIgOyB0aGVuCi0JCWNhc2UgIiRob3N0X29zIiBpbgotCWxpbnV4Knx1Y2xpbnV4KikKLQkJYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpYnVzYi0xLjAvbGlidXNiLmgiICJhY19jdl9oZWFkZXJfbGlidXNiXzFfMF9saWJ1c2JfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGlidXNiXzFfMF9saWJ1c2JfaCIgPSB4eWVzOyB0aGVuIDoKLQotCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlidXNiX2luaXQgaW4gLWx1c2ItMS4wIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJ1c2JfaW5pdCBpbiAtbHVzYi0xLjAuLi4gIiA+JjY7IH0KLWlmICR7YWNfY3ZfbGliX3VzYl8xXzBfbGlidXNiX2luaXQrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHVzYi0xLjAgLWxwdGhyZWFkCi0JCSAgICAgJExJQlMiCi1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgbGlidXNiX2luaXQgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBsaWJ1c2JfaW5pdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgotICBhY19jdl9saWJfdXNiXzFfMF9saWJ1c2JfaW5pdD15ZXMKLWVsc2UKLSAgYWNfY3ZfbGliX3VzYl8xXzBfbGlidXNiX2luaXQ9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3VzYl8xXzBfbGlidXNiX2luaXQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9saWJfdXNiXzFfMF9saWJ1c2JfaW5pdCIgPiY2OyB9Ci1pZiB0ZXN0ICJ4JGFjX2N2X2xpYl91c2JfMV8wX2xpYnVzYl9pbml0IiA9IHh5ZXM7IHRoZW4gOgotCi0KLSRhc19lY2hvICIjZGVmaW5lIFBDQVBfU1VQUE9SVF9DQU5VU0IgMSIgPj5jb25mZGVmcy5oCi0KLQkJCUNBTlVTQl9TUkM9cGNhcC1jYW51c2ItbGludXguYwotCQkJTElCUz0iLWx1c2ItMS4wIC1scHRocmVhZCAkTElCUyIKLQkJCWFjX2xibF9oYXNfbGlidXNiPXllcwotCi1lbHNlCi0gIGFjX2xibF9oYXNfbGlidXNiPW5vCi1maQotCi0KLWVsc2UKLSAgYWNfbGJsX2hhc19saWJ1c2I9bm8KLQotZmkKLQotCi0JCWlmIHRlc3QgIngkYWNfbGJsX2hhc19saWJ1c2IiID0gInh5ZXMiIDsgdGhlbgotCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjYW51c2Igc25pZmZpbmcgaXMgc3VwcG9ydGVkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNhbnVzYiBzbmlmZmluZyBpcyBzdXBwb3J0ZWQiID4mNjt9Ci0JCWVsc2UKLQkJICAgIGlmIHRlc3QgIngkZW5hYmxlX2NhbnVzYiIgPSAieHllcyIgOyB0aGVuCi0JCQlhc19mbl9lcnJvciAkPyAiY2FudXNiIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQ7IGluc3RhbGwgbGlidXNiMS4wIGxpYiBkZXZlbCB0byBlbmFibGUgaXQiICIkTElORU5PIiA1Ci0JCSAgICBlbHNlCi0JCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNhbnVzYiBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkOyBpbnN0YWxsIGxpYnVzYjEuMCBsaWIgZGV2ZWwgdG8gZW5hYmxlIGl0IiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IGNhbnVzYiBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkOyBpbnN0YWxsIGxpYnVzYjEuMCBsaWIgZGV2ZWwgdG8gZW5hYmxlIGl0IiA+JjY7fQotCQkgICAgZmkKLQkJZmkKLQkJOzsKLQkqKQotCQlpZiB0ZXN0ICJ4JGVuYWJsZV9jYW51c2IiID0gInh5ZXMiIDsgdGhlbgotCQkgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGNhbnVzYiBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcyIgIiRMSU5FTk8iIDUKLQkJZWxzZQotCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBubyBjYW51c2Igc3VwcG9ydCBpbXBsZW1lbnRlZCBmb3IgJGhvc3Rfb3MiID4mNQotJGFzX2VjaG8gIiRhc19tZTogbm8gY2FudXNiIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zIiA+JjY7fQotCQlmaQotCQk7OwotCWVzYWMKLQotCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY2FuIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2NhbitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2NhbjsKLWVsc2UKLSAgZW5hYmxlX2Nhbj1pZnN1cHBvcnRhdmFpbGFibGUKLWZpCi0KLQotaWYgdGVzdCAieCRlbmFibGVfY2FuIiAhPSAieG5vIiA7IHRoZW4KLQkJY2FzZSAiJGhvc3Rfb3MiIGluCi0JbGludXgqKQotCQlhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAibGludXgvY2FuLmgiICJhY19jdl9oZWFkZXJfbGludXhfY2FuX2giICIjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0iCi1pZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9jYW5faCIgPSB4eWVzOyB0aGVuIDoKLQotCi0kYXNfZWNobyAiI2RlZmluZSBQQ0FQX1NVUFBPUlRfQ0FOIDEiID4+Y29uZmRlZnMuaAotCi0JCQkgICAgQ0FOX1NSQz1wY2FwLWNhbi1saW51eC5jCi0JCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBDQU4gc25pZmZpbmcgaXMgc3VwcG9ydGVkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IENBTiBzbmlmZmluZyBpcyBzdXBwb3J0ZWQiID4mNjt9Ci0KLWVsc2UKLQotCQkJICAgIGlmIHRlc3QgIngkZW5hYmxlX2NhbiIgPSAieHllcyIgOyB0aGVuCi0JCQkJYXNfZm5fZXJyb3IgJD8gIkNBTiBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkIiAiJExJTkVOTyIgNQotCQkJICAgIGVsc2UKLQkJCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IENBTiBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IENBTiBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkIiA+JjY7fQotCQkJICAgIGZpCi0KLWZpCi0KLQotCQk7OwotCSopCi0JCWlmIHRlc3QgIngkZW5hYmxlX2NhbiIgPSAieHllcyIgOyB0aGVuCi0JCSAgICBhc19mbl9lcnJvciAkPyAibm8gQ0FOIHNuaWZmaW5nIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zIiAiJExJTkVOTyIgNQotCQllbHNlCi0JCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vIENBTiBzbmlmZmluZyBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBubyBDQU4gc25pZmZpbmcgc3VwcG9ydCBpbXBsZW1lbnRlZCBmb3IgJGhvc3Rfb3MiID4mNjt9Ci0JCWZpCi0JCTs7Ci0JZXNhYwotCi0KLWZpCi0KICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kYnVzIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7ZW5hYmxlX2RidXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICBlbmFibGV2YWw9JGVuYWJsZV9kYnVzOwpAQCAtODMyMyw2ICs4NzYyLDEyIEBACiBmaQogCiAKK2lmIHRlc3QgInh4eF9vbmx5IiA9IHllczsgdGhlbgorCSMgVXNlciByZXF1ZXN0ZWQgc29tZXRoaW5nLWVsc2Utb25seSBwY2FwLCBzbyB0aGV5IGRvbid0CisJIyB3YW50IEQtQnVzIHN1cHBvcnQuCisJZW5hYmxlX2RidXM9bm8KK2ZpCisKIGlmIHRlc3QgIngkZW5hYmxlX2RidXMiICE9ICJ4bm8iOyB0aGVuCiAJaWYgdGVzdCAieCRlbmFibGVfZGJ1cyIgPSAieHllcyI7IHRoZW4KIAkJY2FzZSAiJGhvc3Rfb3MiIGluCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuYWMKc2ltaWxhcml0eSBpbmRleCA3NiUKcmVuYW1lIGZyb20gY29uZmlndXJlLmluCnJlbmFtZSB0byBjb25maWd1cmUuYWMKaW5kZXggYmU0YjI5ZS4uZGEyZjk0MCAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmluCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMTA0LDcgKzEwNCw3IEBACiBkbmwgYW5kIHNldCAiSEFWRV9TWVNfSU9DQ09NX0giIGlmIHdlIGhhdmUgaXQsIG90aGVyd2lzZQogZG5sICJBQ19MQkxfRklYSU5DTFVERVMiIHdvdWxkbid0IHdvcmsgb24gc29tZSBwbGF0Zm9ybXMgc3VjaCBhcyBTb2xhcmlzLgogZG5sCi1BQ19DSEVDS19IRUFERVJTKHN5cy9pb2Njb20uaCBzeXMvc29ja2lvLmggbGltaXRzLmggcGF0aHMuaCkKK0FDX0NIRUNLX0hFQURFUlMoc3lzL2lvY2NvbS5oIHN5cy9zZWxlY3QuaCBzeXMvc29ja2lvLmggbGltaXRzLmgpCiBBQ19DSEVDS19IRUFERVJTKGxpbnV4L3R5cGVzLmgpCiBBQ19DSEVDS19IRUFERVJTKGxpbnV4L2lmX3BhY2tldC5oIG5ldHBhY2tldC9wYWNrZXQuaCBuZXRwYWNrZXQvaWZfcGFja2V0LmgpCiBBQ19DSEVDS19IRUFERVJTKG5ldC9wZnZhci5oLCAsICwgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTE0OSw3ICsxNDksNyBAQAogZmkKIAogY2FzZSAiJGhvc3Rfb3MiIGluCi1saW51eCopCitsaW51eCp8dWNsaW51eCopCiAJQUNfQ0hFQ0tfSEVBREVSUyhsaW51eC9zb2NraW9zLmggbGludXgvaWZfYm9uZGluZy5oLCwsCiAJWwogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KQEAgLTE2OSw2ICsxNjksMTMgQEAKIAlBQ19MSUJPQkooW3NucHJpbnRmXSkKIGZpCiAKK25lZWRzdHJ0b2tfcj1ubworQUNfQ0hFQ0tfRlVOQ1Moc3RydG9rX3IsLAorCVtuZWVkc3RydG9rX3I9eWVzXSkKK2lmIHRlc3QgJG5lZWRzdHJ0b2tfciA9IHllczsgdGhlbgorCUFDX0xJQk9CSihbc3RydG9rX3JdKQorZmkKKwogIwogIyBEbyB0aGlzIGJlZm9yZSBjaGVja2luZyBmb3IgZXRoZXJfaG9zdHRvbigpLCBhcyBpdCdzIGEKICMgImdldGhvc3RieW5hbWUoKSAtaXNoIGZ1bmN0aW9uIi4KQEAgLTI4Miw2ICsyODksMTMgQEAKIEFDX01TR19SRVNVTFQoJHtlbmFibGVfcHJvdG9jaGFpbn0pCiAKICMKKyMgdmFsZ3JpbmR0ZXN0IGRpcmVjdGx5IHVzZXMgdGhlIG5hdGl2ZSBjYXB0dXJlIG1lY2hhbmlzbSwgYnV0CisjIG9ubHkgdGVzdHMgd2l0aCBCUEYgYW5kIFBGX1BBQ0tFVCBzb2NrZXRzOyBvbmx5IGVuYWJsZSBpdCBpZgorIyB3ZSBoYXZlIEJQRiBvciBQRl9QQUNLRVQgc29ja2V0cy4KKyMKK1ZBTEdSSU5EVEVTVD0KKworIwogIyBTSVRBIHN1cHBvcnQgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggbmF0aXZlIGNhcHR1cmUgc3VwcG9ydDsKICMgIi0td2l0aC1zaXRhIiBzZWxlY3RzIFNJVEEgc3VwcG9ydC4KICMKQEAgLTI5Miw3ICszMDYsNiBAQAogCQlBQ19ERUZJTkUoU0lUQSwxLFtpbmNsdWRlIEFDTiBzdXBwb3J0XSkKIAkJQUNfTVNHX05PVElDRShFbmFibGluZyBTSVRBIEFDTiBzdXBwb3J0KQogCQlWX1BDQVA9c2l0YQotCQlWX0ZJTkRBTExERVZTPXNpdGEKIAlmaQogXSwKIFsKQEAgLTMxOCw4ICszMzEsMTggQEAKIAkjCiAJVl9QQ0FQPWJwZgogCUFDX0RFRklORShIQVZFX0NMT05JTkdfQlBGLDEsW2RlZmluZSBpZiB5b3UgaGF2ZSBhIGNsb25pbmcgQlBGIGRldmljZV0pCisKKwkjCisJIyBXZSBoYXZlIEJQRiwgc28gYnVpbGQgdmFsZ3JpbmR0ZXN0IHdpdGggIm1ha2UgdGVzdCIuCisJIworCVZBTEdSSU5EVEVTVD12YWxncmluZHRlc3QKIGVsaWYgdGVzdCAtciAvZGV2L2JwZjAgOyB0aGVuCiAJVl9QQ0FQPWJwZgorCisJIworCSMgV2UgaGF2ZSBCUEYsIHNvIGJ1aWxkIHZhbGdyaW5kdGVzdCB3aXRoICJtYWtlIHRlc3QiLgorCSMKKwlWQUxHUklORFRFU1Q9dmFsZ3JpbmR0ZXN0CiBlbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL25ldC9wZmlsdC5oIDsgdGhlbgogCVZfUENBUD1wZgogZWxpZiB0ZXN0IC1yIC9kZXYvZW5ldCA7IHRoZW4KQEAgLTMzMCw2ICszNTMsMTIgQEAKIAlWX1BDQVA9bml0CiBlbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIDsgdGhlbgogCVZfUENBUD1saW51eAorCisJIworCSMgWFhYIC0gdGhpcyB3b24ndCB3b3JrIHdpdGggb2xkZXIga2VybmVscyB0aGF0IGhhdmUgU09DS19QQUNLRVQKKwkjIHNvY2tldHMgYnV0IG5vdCBQRl9QQUNLRVQgc29ja2V0cy4KKwkjCisJVkFMR1JJTkRURVNUPXZhbGdyaW5kdGVzdAogZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9uZXQvcmF3LmggOyB0aGVuCiAJVl9QQ0FQPXNub29wCiBlbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL29kbWkuaCA7IHRoZW4KQEAgLTM0MSw2ICszNzAsMTEgQEAKIAlWX1BDQVA9YnBmCiBlbGlmIHRlc3QgLWMgL2Rldi9icGYwIDsgdGhlbgkJIyBjaGVjayBhZ2FpbiBpbiBjYXNlIG5vdCByZWFkYWJsZQogCVZfUENBUD1icGYKKworCSMKKwkjIFdlIGhhdmUgQlBGLCBzbyBidWlsZCB2YWxncmluZHRlc3Qgd2l0aCAibWFrZSB0ZXN0Ii4KKwkjCisJVkFMR1JJTkRURVNUPXZhbGdyaW5kdGVzdAogZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9zeXMvZGxwaS5oIDsgdGhlbgogCVZfUENBUD1kbHBpCiBlbGlmIHRlc3QgLWMgL2Rldi9lbmV0IDsgdGhlbgkJIyBjaGVjayBhZ2FpbiBpbiBjYXNlIG5vdCByZWFkYWJsZQpAQCAtMzUxLDYgKzM4NSw3IEBACiAJVl9QQ0FQPW51bGwKIGZpCiBBQ19NU0dfUkVTVUxUKCRWX1BDQVApCitBQ19TVUJTVChWQUxHUklORFRFU1QpCiAKICMKICMgRG8gY2FwdHVyZS1tZWNoYW5pc20tZGVwZW5kZW50IHRlc3RzLgpAQCAtNTY3LDE1ICs2MDIsMzAgQEAKIAk7OwogCiBkYWcpCisJIworCSMgLS13aXRoLXBjYXA9ZGFnIGlzIHRoZSBvbmx5IHdheSB0byBnZXQgaGVyZSwgYW5kIGl0IG1lYW5zCisJIyAiREFHIHN1cHBvcnQgYnV0IG5vdGhpbmcgZWxzZSIKKwkjCiAJVl9ERUZTPSIkVl9ERUZTIC1EREFHX09OTFkiCisJeHh4X29ubHk9eWVzCiAJOzsKIAogc2VwdGVsKQorCSMKKwkjIC0td2l0aC1wY2FwPXNlcHRlbCBpcyB0aGUgb25seSB3YXkgdG8gZ2V0IGhlcmUsIGFuZCBpdCBtZWFucworCSMgIlNlcHRlbCBzdXBwb3J0IGJ1dCBub3RoaW5nIGVsc2UiCisJIwogCVZfREVGUz0iJFZfREVGUyAtRFNFUFRFTF9PTkxZIgorCXh4eF9vbmx5PXllcwogCTs7CiAKIHNuZikKKwkjCisJIyAtLXdpdGgtcGNhcD1zbmYgaXMgdGhlIG9ubHkgd2F5IHRvIGdldCBoZXJlLCBhbmQgaXQgbWVhbnMKKwkjICJTTkYgc3VwcG9ydCBidXQgbm90aGluZyBlbHNlIgorCSMKIAlWX0RFRlM9IiRWX0RFRlMgLURTTkZfT05MWSIKKwl4eHhfb25seT15ZXMKIAk7OwogCiBudWxsKQpAQCAtNTg5LDE0ICs2MzksOCBAQAogZG5sIGlmIHdlIHN1cHBvcnQgY2FwdHVyaW5nLiAgRG9uJ3QgYm90aGVyIGlmIHdlIGRvbid0IHN1cHBvcnQKIGRubCBjYXB0dXJpbmcuCiBkbmwKLWlmIHRlc3QgIiRWX1BDQVAiID0gbnVsbAoraWYgdGVzdCAiJFZfUENBUCIgIT0gbnVsbAogdGhlbgotCSMKLQkjIFdlIGNhbid0IGNhcHR1cmUsIHNvIHdlIGNhbid0IG9wZW4gYW55IGNhcHR1cmUKLQkjIGRldmljZXMsIHNvIHdlIHdvbid0IHJldHVybiBhbnkgaW50ZXJmYWNlcy4KLQkjCi0JVl9GSU5EQUxMREVWUz1udWxsCi1lbHNlCiAJQUNfQ0hFQ0tfRlVOQyhnZXRpZmFkZHJzLFsKIAkJIwogCQkjIFdlIGhhdmUgImdldGlmYWRkcnMoKSI7IG1ha2Ugc3VyZSB3ZSBoYXZlIDxpZmFkZHJzLmg+CkBAIC02MDcsNyArNjUxLDcgQEAKIAkJICAgICMgV2UgaGF2ZSB0aGUgaGVhZGVyLCBzbyB3ZSB1c2UgImdldGlmYWRkcnMoKSIgdG8KIAkJICAgICMgZ2V0IHRoZSBsaXN0IG9mIGludGVyZmFjZXMuCiAJCSAgICAjCi0JCSAgICBWX0ZJTkRBTExERVZTPWdldGFkCisJCSAgICBWX0ZJTkRBTExERVZTPWZhZC1nZXRhZC5jCiAJCV0sWwogCQkgICAgIwogCQkgICAgIyBXZSBkb24ndCBoYXZlIHRoZSBoZWFkZXIgLSBnaXZlIHVwLgpAQCAtNjUwLDkgKzY5NCw5IEBACiAJCQkJYWNfY3ZfbGJsX2hhdmVfc2lvY2dsaWZjb25mPW5vKSkKIAkJCUFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9oYXZlX3Npb2NnbGlmY29uZikKIAkJCWlmIHRlc3QgJGFjX2N2X2xibF9oYXZlX3Npb2NnbGlmY29uZiA9IHllcyA7IHRoZW4KLQkJCQlWX0ZJTkRBTExERVZTPWdsaWZjCisJCQkJVl9GSU5EQUxMREVWUz1mYWQtZ2xpZmMuYwogCQkJZWxzZQotCQkJCVZfRklOREFMTERFVlM9Z2lmYworCQkJCVZfRklOREFMTERFVlM9ZmFkLWdpZmMuYwogCQkJZmkKIAkJCTs7CiAKQEAgLTY2Myw3ICs3MDcsNyBAQAogCQkJIyBhbm90aGVyIG1lY2hhbmlzbSwgYW5kIHdlIHNob3VsZCBiZSB1c2luZyB0aGF0CiAJCQkjIGluc3RlYWQuKQogCQkJIwotCQkJVl9GSU5EQUxMREVWUz1naWZjCisJCQlWX0ZJTkRBTExERVZTPWZhZC1naWZjLmMKIAkJCTs7CiAJCWVzYWNdKQogZmkKQEAgLTcxNiw3ICs3NjAsNyBAQAogCiAjIENoZWNrIGZvciBFbmRhY2UgREFHIGNhcmQgc3VwcG9ydC4KIEFDX0FSR19XSVRIKFtkYWddLAotQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYWdAPDpAPURJUkA6PkBdLFtpbmNsdWRlIEVuZGFjZSBEQUcgc3VwcG9ydCBAPDpAInllcyIsICJubyIgb3IgRElSOyBkZWZhdWx0PSJ5ZXMiIG9uIEJTRCBhbmQgTGludXggaWYgcHJlc2VudEA6PkBdKSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGFnQDw6QD1ESVJAOj5AXSxbaW5jbHVkZSBFbmRhY2UgREFHIHN1cHBvcnQgKGxvY2F0ZWQgaW4gZGlyZWN0b3J5IERJUiwgaWYgc3VwcGxpZWQpLiAgQDw6QGRlZmF1bHQ9eWVzLCBpZiBwcmVzZW50QDo+QF0pLAogWwogCWlmIHRlc3QgIiR3aXRodmFsIiA9IG5vCiAJdGhlbgpAQCAtNzMyLDE0ICs3NzYsMjQgQEAKIAkJZGFnX3Jvb3Q9JHdpdGh2YWwKIAlmaQogXSxbCi0JIwotCSMgVXNlIERBRyBBUEkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRvbid0Ci0JIwotCXdhbnRfZGFnPWlmcHJlc2VudAorCWlmIHRlc3QgIiRWX1BDQVAiID0gZGFnOyB0aGVuCisJCSMgVXNlciByZXF1ZXN0ZWQgREFHLW9ubHkgbGlicGNhcCwgc28gd2UnZCBiZXR0ZXIgaGF2ZQorCQkjIHRoZSBEQUcgQVBJLgorCQl3YW50X2RhZz15ZXMKKwllbGlmIHRlc3QgInh4eF9vbmx5IiA9IHllczsgdGhlbgorCQkjIFVzZXIgcmVxdWVzdGVkIHNvbWV0aGluZy1lbHNlLW9ubHkgcGNhcCwgc28gdGhleSBkb24ndAorCQkjIHdhbnQgREFHIHN1cHBvcnQuCisJCXdhbnRfZGFnPW5vCisJZWxzZQorCQkjCisJCSMgVXNlIERBRyBBUEkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRvbid0CisJCSMKKwkJd2FudF9kYWc9aWZwcmVzZW50CisJZmkKIF0pCiAKIEFDX0FSR19XSVRIKFtkYWctaW5jbHVkZXNdLAotQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYWctaW5jbHVkZXM9RElSXSxbRW5kYWNlIERBRyBpbmNsdWRlIGRpcmVjdG9yeV0pLAorQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYWctaW5jbHVkZXM9SURJUl0sW0VuZGFjZSBEQUcgaW5jbHVkZSBkaXJlY3RvcnksIGlmIG5vdCBESVIvaW5jbHVkZV0pLAogWwogCSMgVXNlciB3YW50cyBEQUcgc3VwcG9ydCBhbmQgaGFzIHNwZWNpZmllZCBhIGhlYWRlciBkaXJlY3RvcnksIHNvIHVzZSB0aGUgcHJvdmlkZWQgdmFsdWUuCiAJd2FudF9kYWc9eWVzCkBAIC03NDcsMzUgKzgwMSwxMyBAQAogXSxbXSkKIAogQUNfQVJHX1dJVEgoW2RhZy1saWJyYXJpZXNdLAotQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYWctbGlicmFyaWVzPURJUl0sW0VuZGFjZSBEQUcgbGlicmFyeSBkaXJlY3RvcnldKSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGFnLWxpYnJhcmllcz1MRElSXSxbRW5kYWNlIERBRyBsaWJyYXJ5IGRpcmVjdG9yeSwgaWYgbm90IERJUi9saWJdKSwKIFsKIAkjIFVzZXIgd2FudHMgREFHIHN1cHBvcnQgYW5kIGhhcyBzcGVjaWZpZWQgYSBsaWJyYXJ5IGRpcmVjdG9yeSwgc28gdXNlIHRoZSBwcm92aWRlZCB2YWx1ZS4KIAl3YW50X2RhZz15ZXMKIAlkYWdfbGliX2Rpcj0kd2l0aHZhbAogXSxbXSkKIAotY2FzZSAiJFZfUENBUCIgaW4KLWxpbnV4fGJwZnxkYWcpCi0JIwotCSMgV2Ugc3VwcG9ydCB0aGUgREFHIEFQSSBpZiB3ZSdyZSBvbiBMaW51eCBvciBCU0QsIG9yIGlmIHdlJ3JlCi0JIyBidWlsZGluZyBhIERBRy1vbmx5IGxpYnBjYXAuCi0JIwotCTs7Ci0qKQotCSMKLQkjIElmIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIERBRywgdGVsbCB0aGVtIGl0J3Mgbm90Ci0JIyBzdXBwb3J0ZWQuCi0JIwotCSMgSWYgdGhleSBleHByZXNzZWQgbm8gcHJlZmVyZW5jZSwgZG9uJ3QgaW5jbHVkZSBpdC4KLQkjCi0JaWYgdGVzdCAkd2FudF9kYWcgPSB5ZXM7IHRoZW4KLQkJQUNfTVNHX0VSUk9SKFtEQUcgc3VwcG9ydCBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoICdsaW51eCcgJ2JwZicgYW5kICdkYWcnIHBhY2tldCBjYXB0dXJlIHR5cGVzXSkKLQllbGlmIHRlc3QgJHdhbnRfZGFnID0geWVzOyB0aGVuCi0JCXdhbnRfZGFnPW5vCi0JZmkKLQk7OwotZXNhYwotCiBhY19jdl9sYmxfZGFnX2FwaT1ubwogaWYgdGVzdCAiJHdhbnRfZGFnIiAhPSBubzsgdGhlbgogCkBAIC03ODMsNyArODE1LDcgQEAKIAogCSMgSWYgbmVjZXNzYXJ5LCBzZXQgZGVmYXVsdCBwYXRocyBmb3IgREFHIEFQSSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuCiAJaWYgdGVzdCAteiAiJGRhZ19yb290IjsgdGhlbgotCSAgICBkYWdfcm9vdD0vdXNyL2xvY2FsCisJCWRhZ19yb290PS91c3IvbG9jYWwKIAlmaQogCiAJaWYgdGVzdCAteiAiJGRhZ19pbmNsdWRlX2RpciI7IHRoZW4KQEAgLTc5MSw3NCArODIzLDcwIEBACiAJZmkKIAogCWlmIHRlc3QgLXogIiRkYWdfbGliX2RpciI7IHRoZW4KLQkgICAgZGFnX2xpYl9kaXI9IiRkYWdfcm9vdC9saWIiCisJCWRhZ19saWJfZGlyPSIkZGFnX3Jvb3QvbGliIgogCWZpCiAKIAlpZiB0ZXN0IC16ICIkZGFnX3Rvb2xzX2RpciI7IHRoZW4KLQkgICAgZGFnX3Rvb2xzX2Rpcj0iJGRhZ19yb290L3Rvb2xzIgorCQlkYWdfdG9vbHNfZGlyPSIkZGFnX3Jvb3QvdG9vbHMiCiAJZmkKIAogCWlmIHRlc3QgLXIgJGRhZ19pbmNsdWRlX2Rpci9kYWdhcGkuaDsgdGhlbgogCQlhY19jdl9sYmxfZGFnX2FwaT15ZXMKIAlmaQotCUFDX01TR19SRVNVTFQoWyRhY19jdl9sYmxfZGFnX2FwaSAoJGRhZ19pbmNsdWRlX2RpcildKQotZmkKIAotaWYgdGVzdCAkYWNfY3ZfbGJsX2RhZ19hcGkgPSB5ZXM7IHRoZW4KLQlWX0lOQ0xTPSIkVl9JTkNMUyAtSSRkYWdfaW5jbHVkZV9kaXIiCisJaWYgdGVzdCAiJGFjX2N2X2xibF9kYWdfYXBpIiA9IHllczsgdGhlbgorCQlBQ19NU0dfUkVTVUxUKFt5ZXMgKCRkYWdfaW5jbHVkZV9kaXIpXSkKIAotCWlmIHRlc3QgJFZfUENBUCAhPSBkYWcgOyB0aGVuCi0JCSBTU1JDPSJwY2FwLWRhZy5jIgotCWZpCisJCVZfSU5DTFM9IiRWX0lOQ0xTIC1JJGRhZ19pbmNsdWRlX2RpciIKIAotCSMgU2VlIGlmIHdlIGNhbiBmaW5kIGEgZ2VuZXJhbCB2ZXJzaW9uIHN0cmluZy4KLQkjIERvbid0IG5lZWQgdG8gc2F2ZSBhbmQgcmVzdG9yZSBMSUJTIHRvIHByZXZlbnQgLWxkYWcgYmVpbmcKLQkjIGluY2x1ZGVkIGlmIHRoZXJlJ3MgYSBmb3VuZC1hY3Rpb24gKGFyZyAzKS4KLQlzYXZlZF9sZGZsYWdzPSRMREZMQUdTCi0JTERGTEFHUz0iLUwkZGFnX2xpYl9kaXIiCi0JQUNfQ0hFQ0tfTElCKFtkYWddLCBbZGFnX2F0dGFjaF9zdHJlYW1dLCBbZGFnX3N0cmVhbXM9IjEiXSwgW2RhZ19zdHJlYW1zPSIwIl0pCi0JQUNfQ0hFQ0tfTElCKFtkYWddLFtkYWdfZ2V0X2VyZl90eXBlc10sIFsKLQkJQUNfREVGSU5FKEhBVkVfREFHX0dFVF9FUkZfVFlQRVMsIDEsIFtkZWZpbmUgaWYgeW91IGhhdmUgZGFnX2dldF9lcmZfdHlwZXMoKV0pXSkKLQlBQ19DSEVDS19MSUIoW2RhZ10sW2RhZ19nZXRfc3RyZWFtX2VyZl90eXBlc10sIFsKLQkJQUNfREVGSU5FKEhBVkVfREFHX0dFVF9TVFJFQU1fRVJGX1RZUEVTLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcygpXSldKQorCQlpZiB0ZXN0ICRWX1BDQVAgIT0gZGFnIDsgdGhlbgorCQkJIFNTUkM9IiRTU1JDIHBjYXAtZGFnLmMiCisJCWZpCiAKLQlMREZMQUdTPSRzYXZlZF9sZGZsYWdzCisJCSMgU2VlIGlmIHdlIGNhbiBmaW5kIGEgZ2VuZXJhbCB2ZXJzaW9uIHN0cmluZy4KKwkJIyBEb24ndCBuZWVkIHRvIHNhdmUgYW5kIHJlc3RvcmUgTElCUyB0byBwcmV2ZW50IC1sZGFnIGJlaW5nCisJCSMgaW5jbHVkZWQgaWYgdGhlcmUncyBhIGZvdW5kLWFjdGlvbiAoYXJnIDMpLgorCQlzYXZlZF9sZGZsYWdzPSRMREZMQUdTCisJCUxERkxBR1M9Ii1MJGRhZ19saWJfZGlyIgorCQlBQ19DSEVDS19MSUIoW2RhZ10sIFtkYWdfYXR0YWNoX3N0cmVhbV0sIFtkYWdfc3RyZWFtcz0iMSJdLCBbZGFnX3N0cmVhbXM9IjAiXSkKKwkJQUNfQ0hFQ0tfTElCKFtkYWddLFtkYWdfZ2V0X2VyZl90eXBlc10sIFsKKwkJCUFDX0RFRklORShIQVZFX0RBR19HRVRfRVJGX1RZUEVTLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIGRhZ19nZXRfZXJmX3R5cGVzKCldKV0pCisJCUFDX0NIRUNLX0xJQihbZGFnXSxbZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzXSwgWworCQkJQUNfREVGSU5FKEhBVkVfREFHX0dFVF9TVFJFQU1fRVJGX1RZUEVTLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcygpXSldKQogCi0JaWYgdGVzdCAiJGRhZ19zdHJlYW1zIiA9IDE7IHRoZW4KLQkJQUNfREVGSU5FKEhBVkVfREFHX1NUUkVBTVNfQVBJLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIHN0cmVhbXMgY2FwYWJsZSBEQUcgQVBJXSkKLQkJTElCUz0iJExJQlMgLWxkYWciCi0JCUxERkxBR1M9IiRMREZMQUdTIC1MJGRhZ19saWJfZGlyIgorCQlMREZMQUdTPSRzYXZlZF9sZGZsYWdzCiAKLQkJQUNfQ0hFQ0tfTElCKFt2ZGFnXSxbdmRhZ19zZXRfZGV2aWNlX2luZm9dLCBbYWNfZGFnX2hhdmVfdmRhZz0iMSJdLCBbYWNfZGFnX2hhdmVfdmRhZz0iMCJdKQotCQlpZiB0ZXN0ICIkYWNfZGFnX2hhdmVfdmRhZyIgPSAxOyB0aGVuCi0JCQlBQ19ERUZJTkUoSEFWRV9EQUdfVkRBRywgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSB2ZGFnX3NldF9kZXZpY2VfaW5mbygpXSkKLQkJCUxJQlM9IiRMSUJTIC1scHRocmVhZCIKKwkJaWYgdGVzdCAiJGRhZ19zdHJlYW1zIiA9IDE7IHRoZW4KKwkJCUFDX0RFRklORShIQVZFX0RBR19TVFJFQU1TX0FQSSwgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBzdHJlYW1zIGNhcGFibGUgREFHIEFQSV0pCisJCQlMSUJTPSIkTElCUyAtbGRhZyIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1MJGRhZ19saWJfZGlyIgorCisJCQlBQ19DSEVDS19MSUIoW3ZkYWddLFt2ZGFnX3NldF9kZXZpY2VfaW5mb10sIFthY19kYWdfaGF2ZV92ZGFnPSIxIl0sIFthY19kYWdfaGF2ZV92ZGFnPSIwIl0pCisJCQlpZiB0ZXN0ICIkYWNfZGFnX2hhdmVfdmRhZyIgPSAxOyB0aGVuCisJCQkJQUNfREVGSU5FKEhBVkVfREFHX1ZEQUcsIDEsIFtkZWZpbmUgaWYgeW91IGhhdmUgdmRhZ19zZXRfZGV2aWNlX2luZm8oKV0pCisJCQkJTElCUz0iJExJQlMgLWxwdGhyZWFkIgorCQkJZmkKKwkJZmkKKworCQlBQ19ERUZJTkUoSEFWRV9EQUdfQVBJLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBEQUcgQVBJXSkKKwllbHNlCisJCUFDX01TR19SRVNVTFQobm8pCisKKwkJaWYgdGVzdCAiJFZfUENBUCIgPSBkYWc7IHRoZW4KKwkJCSMgVXNlciByZXF1ZXN0ZWQgImRhZyIgY2FwdHVyZSB0eXBlIGJ1dCB3ZSBjb3VsZG4ndAorCQkJIyBmaW5kIHRoZSBEQUcgQVBJIHN1cHBvcnQuCisJCQlBQ19NU0dfRVJST1IoW0RBRyBzdXBwb3J0IHJlcXVlc3RlZCB3aXRoIC0td2l0aC1wY2FwPWRhZywgYnV0IHRoZSBEQUcgaGVhZGVycyB3ZXJlbid0IGZvdW5kIGF0ICRkYWdfaW5jbHVkZV9kaXI6IG1ha2Ugc3VyZSB0aGUgREFHIHN1cHBvcnQgaXMgaW5zdGFsbGVkLCBzcGVjaWZ5IGEgZGlmZmVyZW50IHBhdGggb3IgcGF0aHMgaWYgbmVjZXNzYXJ5LCBvciBkb24ndCByZXF1ZXN0IERBRyBzdXBwb3J0XSkKKwkJZmkKKworCQlpZiB0ZXN0ICIkd2FudF9kYWciID0geWVzOyB0aGVuCisJICAgICAgICAJIyBVc2VyIHdhbnRlZCBEQUcgc3VwcG9ydCBidXQgd2UgY291bGRuJ3QgZmluZCBpdC4KKwkJCUFDX01TR19FUlJPUihbREFHIHN1cHBvcnQgcmVxdWVzdGVkIHdpdGggLS13aXRoLWRhZywgYnV0IHRoZSBEQUcgaGVhZGVycyB3ZXJlbid0IGZvdW5kIGF0ICRkYWdfaW5jbHVkZV9kaXI6IG1ha2Ugc3VyZSB0aGUgREFHIHN1cHBvcnQgaXMgaW5zdGFsbGVkLCBzcGVjaWZ5IGEgZGlmZmVyZW50IHBhdGggb3IgcGF0aHMgaWYgbmVjZXNzYXJ5LCBvciBkb24ndCByZXF1ZXN0IERBRyBzdXBwb3J0XSkKIAkJZmkKIAlmaQotCi0JQUNfREVGSU5FKEhBVkVfREFHX0FQSSwgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgREFHIEFQSV0pCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB3ZSBoYXZlIHRoZSBEQUcgQVBJKQotCi1pZiB0ZXN0ICRhY19jdl9sYmxfZGFnX2FwaSA9IG5vOyB0aGVuCi0JQUNfTVNHX1JFU1VMVChubykKLQlpZiB0ZXN0ICIkd2FudF9kYWciID0geWVzOyB0aGVuCi0gICAgICAgIAkjIFVzZXIgd2FudGVkIERBRyBzdXBwb3J0IGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIGl0LgotCQlBQ19NU0dfRVJST1IoW0RBRyBBUEkgcmVxdWVzdGVkLCBidXQgbm90IGZvdW5kIGF0ICRkYWdfcm9vdDogdXNlIC0td2l0aG91dC1kYWddKQotCWZpCi0KLQlpZiB0ZXN0ICIkVl9QQ0FQIiA9IGRhZzsgdGhlbgotCQkjIFVzZXIgcmVxdWVzdGVkICJkYWciIGNhcHR1cmUgdHlwZSBidXQgdGhlIERBRyBBUEkgd2Fzbid0Ci0JCSMgZm91bmQuCi0JCUFDX01TR19FUlJPUihbU3BlY2lmeWluZyB0aGUgY2FwdHVyZSB0eXBlIGFzICJkYWciIHJlcXVpcmVzIHRoZSBEQUcgQVBJIHRvIGJlIHByZXNlbnQ7IHVzZSB0aGUgLS13aXRoLWRhZyBvcHRpb25zIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uLiAoVHJ5ICIuL2NvbmZpZ3VyZSAtLWhlbHAiIGZvciBtb3JlIGluZm9ybWF0aW9uLildKQotCWZpCi1lbHNlCi0JQUNfTVNHX1JFU1VMVCh5ZXMpCiBmaQogCiBBQ19BUkdfV0lUSChzZXB0ZWwsCi1BQ19IRUxQX1NUUklORyhbLS13aXRoLXNlcHRlbEA8OkA9RElSQDo+QF0sW2luY2x1ZGUgU2VwdGVsIHN1cHBvcnQgKGxvY2F0ZWQgaW4gZGlyZWN0b3J5IERJUiwgaWYgc3VwcGxpZWQpLiAgQDw6QGRlZmF1bHQ9eWVzLCBvbiBMaW51eCwgaWYgcHJlc2VudEA6PkBdKSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtc2VwdGVsQDw6QD1ESVJAOj5AXSxbaW5jbHVkZSBTZXB0ZWwgc3VwcG9ydCAobG9jYXRlZCBpbiBkaXJlY3RvcnkgRElSLCBpZiBzdXBwbGllZCkuICBAPDpAZGVmYXVsdD15ZXMsIGlmIHByZXNlbnRAOj5AXSksCiBbCiAJaWYgdGVzdCAiJHdpdGh2YWwiID0gbm8KIAl0aGVuCkBAIC04NzIsMzggKzkwMCwyOCBAQAogCQlzZXB0ZWxfcm9vdD0kd2l0aHZhbAogCWZpCiBdLFsKLQkjCi0JIyBVc2UgU2VwdGVsIEFQSSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZG9uJ3QKLQkjCi0Jd2FudF9zZXB0ZWw9aWZwcmVzZW50Ci0Jc2VwdGVsX3Jvb3Q9Li8uLi9zZXB0ZWwKLV0pCi1hY19jdl9sYmxfc2VwdGVsX2FwaT1ubwotY2FzZSAiJFZfUENBUCIgaW4KLWxpbnV4fHNlcHRlbCkKLQkjCi0JIyBXZSBzdXBwb3J0IHRoZSBTZXB0ZWwgQVBJIGlmIHdlJ3JlIG9uIExpbnV4LCBvciBpZiB3ZSdyZSBidWlsZGluZwotCSMgYSBTZXB0ZWwtb25seSBsaWJwY2FwLgotCSMKLQk7OwotKikKLQkjCi0JIyBJZiB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBTZXB0ZWwsIHRlbGwgdGhlbSBpdCdzIG5vdAotCSMgc3VwcG9ydGVkLgotCSMKLQkjIElmIHRoZXkgZXhwcmVzc2VkIG5vIHByZWZlcmVuY2UsIGRvbid0IGluY2x1ZGUgaXQuCi0JIwotCWlmIHRlc3QgJHdhbnRfc2VwdGVsID0geWVzOyB0aGVuCi0JCUFDX01TR19FUlJPUihTZXB0ZWwgc3VwcG9ydCBvbmx5IGF2YWlsYWJsZSB3aXRoICdsaW51eCcgYW5kICdzZXB0ZWwnIHBhY2tldCBjYXB0dXJlIHR5cGVzKQotCWVsaWYgdGVzdCAkd2FudF9zZXB0ZWwgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0ICIkVl9QQ0FQIiA9IHNlcHRlbDsgdGhlbgorCQkjIFVzZXIgcmVxdWVzdGVkIFNlcHRlbC1vbmx5IGxpYnBjYXAsIHNvIHdlJ2QgYmV0dGVyIGhhdmUKKwkJIyB0aGUgU2VwdGVsIEFQSS4KKwkJd2FudF9zZXB0ZWw9eWVzCisJZWxpZiB0ZXN0ICJ4eHhfb25seSIgPSB5ZXM7IHRoZW4KKwkJIyBVc2VyIHJlcXVlc3RlZCBzb21ldGhpbmctZWxzZS1vbmx5IHBjYXAsIHNvIHRoZXkgZG9uJ3QKKwkJIyB3YW50IFNlcHRlbCBzdXBwb3J0LgogCQl3YW50X3NlcHRlbD1ubworCWVsc2UKKwkJIworCQkjIFVzZSBTZXB0ZWwgQVBJIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkb24ndAorCQkjCisJCXdhbnRfc2VwdGVsPWlmcHJlc2VudAogCWZpCi0JOzsKLWVzYWMKK10pCiAKK2FjX2N2X2xibF9zZXB0ZWxfYXBpPW5vCiBpZiB0ZXN0ICIkd2l0aF9zZXB0ZWwiICE9IG5vOyB0aGVuCi0JQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgd2UgaGF2ZSBTZXB0ZWwgQVBJKQogCisJQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHdlIGhhdmUgU2VwdGVsIEFQSSBoZWFkZXJzXSkKKworCSMgSWYgbmVjZXNzYXJ5LCBzZXQgZGVmYXVsdCBwYXRocyBmb3IgU2VwdGVsIEFQSSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuCiAJaWYgdGVzdCAteiAiJHNlcHRlbF9yb290IjsgdGhlbgogCQlzZXB0ZWxfcm9vdD0kc3JjZGlyLy4uL3NlcHRlbAogCWZpCkBAIC05MTEsMzUgKzkyOSw0MSBAQAogCXNlcHRlbF90b29sc19kaXI9IiRzZXB0ZWxfcm9vdCIKIAlzZXB0ZWxfaW5jbHVkZV9kaXI9IiRzZXB0ZWxfcm9vdC9JTkMiCiAKLQlhY19jdl9sYmxfc2VwdGVsX2FwaT1ubwogCWlmIHRlc3QgLXIgIiRzZXB0ZWxfaW5jbHVkZV9kaXIvbXNnLmgiOyB0aGVuCisJCWFjX2N2X2xibF9zZXB0ZWxfYXBpPXllcworCWZpCisKKwlpZiB0ZXN0ICIkYWNfY3ZfbGJsX3NlcHRlbF9hcGkiID0geWVzOyB0aGVuCisJCUFDX01TR19SRVNVTFQoW3llcyAoJHNlcHRlbF9pbmNsdWRlX2RpcildKQorCiAJCVZfSU5DTFM9IiRWX0lOQ0xTIC1JJHNlcHRlbF9pbmNsdWRlX2RpciIKIAkJQURETE9CSlM9IiRBRERMT0JKUyAkc2VwdGVsX3Rvb2xzX2Rpci9hc2NpaWJpbi5vICRzZXB0ZWxfdG9vbHNfZGlyL2JpdDJieXRlLm8gJHNlcHRlbF90b29sc19kaXIvY29uZmlybS5vICRzZXB0ZWxfdG9vbHNfZGlyL2ZtdG1zZy5vICRzZXB0ZWxfdG9vbHNfZGlyL2djdF91bml4Lm8gJHNlcHRlbF90b29sc19kaXIvaHF1ZXVlLm8gJHNlcHRlbF90b29sc19kaXIvaWRlbnQubyAkc2VwdGVsX3Rvb2xzX2Rpci9tZW0ubyAkc2VwdGVsX3Rvb2xzX2Rpci9wYWNrLm8gJHNlcHRlbF90b29sc19kaXIvcGFyc2UubyAkc2VwdGVsX3Rvb2xzX2Rpci9wb29sLm8gJHNlcHRlbF90b29sc19kaXIvc2Rsc2lnLm8gJHNlcHRlbF90b29sc19kaXIvc3RydG9udW0ubyAkc2VwdGVsX3Rvb2xzX2Rpci90aW1lci5vICRzZXB0ZWxfdG9vbHNfZGlyL3RyYWNlLm8iCiAJCUFERExBUkNISVZFT0JKUz0iJEFERExBUkNISVZFT0JKUyAkc2VwdGVsX3Rvb2xzX2Rpci9hc2NpaWJpbi5vICRzZXB0ZWxfdG9vbHNfZGlyL2JpdDJieXRlLm8gJHNlcHRlbF90b29sc19kaXIvY29uZmlybS5vICRzZXB0ZWxfdG9vbHNfZGlyL2ZtdG1zZy5vICRzZXB0ZWxfdG9vbHNfZGlyL2djdF91bml4Lm8gJHNlcHRlbF90b29sc19kaXIvaHF1ZXVlLm8gJHNlcHRlbF90b29sc19kaXIvaWRlbnQubyAkc2VwdGVsX3Rvb2xzX2Rpci9tZW0ubyAkc2VwdGVsX3Rvb2xzX2Rpci9wYWNrLm8gJHNlcHRlbF90b29sc19kaXIvcGFyc2UubyAkc2VwdGVsX3Rvb2xzX2Rpci9wb29sLm8gJHNlcHRlbF90b29sc19kaXIvc2Rsc2lnLm8gJHNlcHRlbF90b29sc19kaXIvc3RydG9udW0ubyAkc2VwdGVsX3Rvb2xzX2Rpci90aW1lci5vICRzZXB0ZWxfdG9vbHNfZGlyL3RyYWNlLm8iCiAKIAkJaWYgdGVzdCAiJFZfUENBUCIgIT0gc2VwdGVsIDsgdGhlbgotCQkJIFNTUkM9InBjYXAtc2VwdGVsLmMiCisJCQkgU1NSQz0iJFNTUkMgcGNhcC1zZXB0ZWwuYyIKIAkJZmkKLQkJYWNfY3ZfbGJsX3NlcHRlbF9hcGk9eWVzCi0JZmkKIAotCUFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9zZXB0ZWxfYXBpKQotCWlmIHRlc3QgJGFjX2N2X2xibF9zZXB0ZWxfYXBpID0gbm87IHRoZW4KLQkJaWYgdGVzdCAiJHdhbnRfc2VwdGVsIiA9IHllczsgdGhlbgotCQkJQUNfTVNHX0VSUk9SKFNlcHRlbCBBUEkgbm90IGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAkc2VwdGVsX3Jvb3Q7IHVzZSAtLXdpdGhvdXQtc2VwdGVsKQotCQlmaQorCQlBQ19ERUZJTkUoSEFWRV9TRVBURUxfQVBJLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBTZXB0ZWwgQVBJXSkKIAllbHNlCi0JCUFDX0RFRklORShIQVZFX1NFUFRFTF9BUEksIDEsIFtkZWZpbmUgaWYgeW91IGhhdmUgYSBTZXB0ZWwgQVBJXSkKLQlmaQotZmkKKwkJQUNfTVNHX1JFU1VMVChubykKIAotaWYgdGVzdCAiJFZfUENBUCIgPSBzZXB0ZWwgLWEgIiRhY19jdl9sYmxfc2VwdGVsX2FwaSIgPSBubzsgdGhlbgotCUFDX01TR19FUlJPUihTcGVjaWZ5aW5nIHRoZSBjYXB0dXJlIHR5cGUgYXMgJ3NlcHRlbCcgcmVxdWlyZXMgdGhlIFNlcHRlbCBBUEkgdG8gYmUgcHJlc2VudDsgdXNlIC0td2l0aC1zZXB0ZWw9RElSKQorCQlpZiB0ZXN0ICIkVl9QQ0FQIiA9IHNlcHRlbDsgdGhlbgorCQkJIyBVc2VyIHJlcXVlc3RlZCAic2VwdGVsIiBjYXB0dXJlIHR5cGUgYnV0CisJCQkjIHdlIGNvdWxkbid0IGZpbmQgdGhlIFNlcHRlbCBBUEkgc3VwcG9ydC4KKwkJCUFDX01TR19FUlJPUihbU2VwdGVsIHN1cHBvcnQgcmVxdWVzdGVkIHdpdGggLS13aXRoLXBjYXA9c2VwdGVsLCBidXQgdGhlIFNlcHRlbCBoZWFkZXJzIHdlcmVuJ3QgZm91bmQgYXQgJHNlcHRlbF9pbmNsdWRlX2RpcjogbWFrZSBzdXJlIHRoZSBTZXB0ZWwgc3VwcG9ydCBpcyBpbnN0YWxsZWQsIHNwZWNpZnkgYSBkaWZmZXJlbnQgcGF0aCBvciBwYXRocyBpZiBuZWNlc3NhcnksIG9yIGRvbid0IHJlcXVlc3QgU2VwdGVsIHN1cHBvcnRdKQorCQlmaQorCisJCWlmIHRlc3QgIiR3YW50X3NlcHRlbCIgPSB5ZXM7IHRoZW4KKwkgICAgICAgIAkjIFVzZXIgd2FudGVkIFNlcHRlbCBzdXBwb3J0IGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIGl0LgorCQkJQUNfTVNHX0VSUk9SKFtTZXB0ZWwgc3VwcG9ydCByZXF1ZXN0ZWQgd2l0aCAtLXdpdGgtc2VwdGVsLCBidXQgdGhlIFNlcHRlbCBoZWFkZXJzIHdlcmVuJ3QgZm91bmQgYXQgJHNlcHRlbF9pbmNsdWRlX2RpcjogbWFrZSBzdXJlIHRoZSBTZXB0ZWwgc3VwcG9ydCBpcyBpbnN0YWxsZWQsIHNwZWNpZnkgYSBkaWZmZXJlbnQgcGF0aCBvciBwYXRocyBpZiBuZWNlc3NhcnksIG9yIGRvbid0IHJlcXVlc3QgU2VwdGVsIHN1cHBvcnRdKQorCQlmaQorCWZpCiBmaQogCiAjIENoZWNrIGZvciBNeXJpY29tIFNORiBzdXBwb3J0LgogQUNfQVJHX1dJVEgoW3NuZl0sCi1BQ19IRUxQX1NUUklORyhbLS13aXRoLXNuZkA8OkA9RElSQDo+QF0sW2luY2x1ZGUgTXlyaWNvbSBTTkYgc3VwcG9ydCBAPDpAInllcyIsICJubyIgb3IgRElSOyBkZWZhdWx0PSJ5ZXMiIG9uIEJTRCBhbmQgTGludXggaWYgcHJlc2VudEA6PkBdKSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtc25mQDw6QD1ESVJAOj5AXSxbaW5jbHVkZSBNeXJpY29tIFNORiBzdXBwb3J0IChsb2NhdGVkIGluIGRpcmVjdG9yeSBESVIsIGlmIHN1cHBsaWVkKS4gIEA8OkBkZWZhdWx0PXllcywgaWYgcHJlc2VudEA6PkBdKSwKIFsKIAlpZiB0ZXN0ICIkd2l0aHZhbCIgPSBubwogCXRoZW4KQEAgLTk0Nyw3ICs5NzEsNyBAQAogCQl3YW50X3NuZj1ubwogCWVsaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzCiAJdGhlbgotCQkjIFVzZXIgd2FudHMgU05GIHN1cHBvcnQgYnV0IGhhc24ndCBzcGVjaWZpYyBhIGRpcmVjdG9yeS4KKwkJIyBVc2VyIHdhbnRzIFNORiBzdXBwb3J0IGJ1dCBoYXNuJ3Qgc3BlY2lmaWVkIGEgZGlyZWN0b3J5LgogCQl3YW50X3NuZj15ZXMKIAllbHNlCiAJCSMgVXNlciB3YW50cyBTTkYgc3VwcG9ydCB3aXRoIGEgc3BlY2lmaWVkIGRpcmVjdG9yeS4KQEAgLTk1NSwxNCArOTc5LDI0IEBACiAJCXNuZl9yb290PSR3aXRodmFsCiAJZmkKIF0sWwotCSMKLQkjIFVzZSBTbmlmZmVyIEFQSSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZG9uJ3QKLQkjCi0Jd2FudF9zbmY9aWZwcmVzZW50CisJaWYgdGVzdCAiJFZfUENBUCIgPSBzbmY7IHRoZW4KKwkJIyBVc2VyIHJlcXVlc3RlZCBTbmlmZmVyLW9ubHkgbGlicGNhcCwgc28gd2UnZCBiZXR0ZXIgaGF2ZQorCQkjIHRoZSBTbmlmZmVyIEFQSS4KKwkJd2FudF9zbmY9eWVzCisJZWxpZiB0ZXN0ICJ4eHhfb25seSIgPSB5ZXM7IHRoZW4KKwkJIyBVc2VyIHJlcXVlc3RlZCBzb21ldGhpbmctZWxzZS1vbmx5IHBjYXAsIHNvIHRoZXkgZG9uJ3QKKwkJIyB3YW50IFNORiBzdXBwb3J0LgorCQl3YW50X3NuZj1ubworCWVsc2UKKwkJIworCQkjIFVzZSBTbmlmZmVyIEFQSSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZG9uJ3QKKwkJIworCQl3YW50X3NuZj1pZnByZXNlbnQKKwlmaQogXSkKIAogQUNfQVJHX1dJVEgoW3NuZi1pbmNsdWRlc10sCi1BQ19IRUxQX1NUUklORyhbLS13aXRoLXNuZi1pbmNsdWRlcz1ESVJdLFtNeXJpY29tIFNORiBpbmNsdWRlIGRpcmVjdG9yeV0pLAorQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1zbmYtaW5jbHVkZXM9SURJUl0sW015cmljb20gU05GIGluY2x1ZGUgZGlyZWN0b3J5LCBpZiBub3QgRElSL2luY2x1ZGVdKSwKIFsKIAkjIFVzZXIgd2FudHMgU05GIHdpdGggc3BlY2lmaWMgaGVhZGVyIGRpcmVjdG9yeQogCXdhbnRfc25mPXllcwpAQCAtOTcwLDQwICsxMDA0LDE5IEBACiBdLFtdKQogCiBBQ19BUkdfV0lUSChbc25mLWxpYnJhcmllc10sCi1BQ19IRUxQX1NUUklORyhbLS13aXRoLXNuZi1saWJyYXJpZXM9RElSXSxbTXlyaWNvbSBTTkYgbGlicmFyeSBkaXJlY3RvcnldKSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtc25mLWxpYnJhcmllcz1MRElSXSxbTXlyaWNvbSBTTkYgbGlicmFyeSBkaXJlY3RvcnksIGlmIG5vdCBESVIvbGliXSksCiBbCiAJIyBVc2VyIHdhbnRzIFNORiB3aXRoIHNwZWNpZmljIGxpYiBkaXJlY3RvcnkKIAl3YW50X3NuZj15ZXMKIAlzbmZfbGliX2Rpcj0kd2l0aHZhbAogXSxbXSkKIAotY2FzZSAiJFZfUENBUCIgaW4KLWJwZnxsaW51eHxzbmYpCi0JIwotCSMgV2Ugc3VwcG9ydCB0aGUgU25pZmZlciBBUEkgaWYgd2UncmUgb24gQlNELCBMaW51eCwgb3IgaWYgd2UncmUKLQkjIGJ1aWxkaW5nIGEgU25pZmZlci1vbmx5IGxpYnBjYXAuCi0JIwotCTs7Ci0qKQotCSMKLQkjIElmIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIFNuaWZmZXIsIHRlbGwgdGhlbSBpdCdzIG5vdAotCSMgc3VwcG9ydGVkLgotCSMKLQkjIElmIHRoZXkgZXhwcmVzc2VkIG5vIHByZWZlcmVuY2UsIGRvbid0IGluY2x1ZGUgaXQuCi0JIwotCWlmIHRlc3QgJHdhbnRfc25mID0geWVzOyB0aGVuCi0JCUFDX01TR19FUlJPUihNeXJpY29tIFNORiBzdXBwb3J0IG9ubHkgYXZhaWxhYmxlIHdpdGggJ2JwZicgJ2xpbnV4JyBhbmQgJ3NuZicgcGFja2V0IGNhcHR1cmUgdHlwZXMpCi0JZWxpZiB0ZXN0ICR3YW50X3NuZiA9IHllczsgdGhlbgotCQl3YW50X3NuZj1ubwotCWZpCi0JOzsKLWVzYWMKLQogYWNfY3ZfbGJsX3NuZl9hcGk9bm8KIGlmIHRlc3QgIiR3aXRoX3NuZiIgIT0gbm87IHRoZW4KIAogCUFDX01TR19DSEVDS0lORyh3aGV0aGVyIHdlIGhhdmUgTXlyaWNvbSBTbmlmZmVyIEFQSSkKIAorCSMgSWYgbmVjZXNzYXJ5LCBzZXQgZGVmYXVsdCBwYXRocyBmb3IgU25pZmZlciBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuCiAJaWYgdGVzdCAteiAiJHNuZl9yb290IjsgdGhlbgogCQlzbmZfcm9vdD0vb3B0L3NuZgogCWZpCkBAIC0xMDE3LDU2ICsxMDMwLDE1NyBAQAogCWZpCiAKIAlpZiB0ZXN0IC1mICIkc25mX2luY2x1ZGVfZGlyL3NuZi5oIjsgdGhlbgotCQlhY19jdl9sYmxfc25mX2FwaT15ZXMKLQlmaQotCUFDX01TR19SRVNVTFQoWyRhY19jdl9sYmxfc25mX2FwaSAoJHNuZl9yb290KV0pCi0KLQlpZiB0ZXN0ICRhY19jdl9sYmxfc25mX2FwaSA9IG5vOyB0aGVuCi0JCWlmIHRlc3QgIiR3YW50X3NuZiIgPSB5ZXM7IHRoZW4KLQkJCUFDX01TR19FUlJPUihTTkYgQVBJIGhlYWRlcnMgbm90IGZvdW5kIHVuZGVyICRzbmZfaW5jbHVkZV9kaXI7IHVzZSAtLXdpdGhvdXQtc25mKQotCQlmaQotCWVsc2UKKwkJIyBXZSBmb3VuZCBhIGhlYWRlcjsgbWFrZSBzdXJlIHdlIGNhbiBsaW5rIHdpdGggdGhlIGxpYnJhcnkKIAkJc2F2ZWRfbGRmbGFncz0kTERGTEFHUwogCQlMREZMQUdTPSIkTERGTEFHUyAtTCRzbmZfbGliX2RpciIKLQkJQUNfQ0hFQ0tfTElCKFtzbmZdLCBbc25mX2luaXRdLCBbYWNfY3ZfbGJsX3NuZl9hcGk9InllcyJdLCBbYWNfY3ZfbGJsX3NuZl9hcGk9Im5vIl0pCisJCUFDX0NIRUNLX0xJQihbc25mXSwgW3NuZl9pbml0XSwgW2FjX2N2X2xibF9zbmZfYXBpPSJ5ZXMiXSkKIAkJTERGTEFHUz0iJHNhdmVkX2xkZmxhZ3MiCisJCWlmIHRlc3QgIiRhY19jdl9sYmxfc25mX2FwaSIgPSBubzsgdGhlbgorCQkJQUNfTVNHX0VSUk9SKFNORiBBUEkgY2Fubm90IGNvcnJlY3RseSBiZSBsaW5rZWQ7IGNoZWNrIGNvbmZpZy5sb2cpCisJCWZpCisJZmkKIAotCQlpZiB0ZXN0ICRhY19jdl9sYmxfc25mX2FwaSA9IG5vOyB0aGVuCi0JCQlpZiB0ZXN0ICIkd2FudF9zbmYiID0geWVzOyB0aGVuCi0JCQkJQUNfTVNHX0VSUk9SKFNORiBBUEkgY2Fubm90IGNvcnJlY3RseSBiZSBsaW5rZWQgY2hlY2sgY29uZmlnLmxvZzsgdXNlIC0td2l0aG91dC1zbmYpCi0JCQlmaQotCQllbHNlCi0JCQlWX0lOQ0xTPSIkVl9JTkNMUyAtSSRzbmZfaW5jbHVkZV9kaXIiCi0JCQlMSUJTPSIkTElCUyAtbHNuZiIKLQkJCUxERkxBR1M9IiRMREZMQUdTIC1MJHNuZl9saWJfZGlyIgotCQkJaWYgdGVzdCAiJFZfUENBUCIgIT0gc25mIDsgdGhlbgotCQkJCVNTUkM9InBjYXAtc25mLmMiCi0JCQlmaQotCQkJQUNfREVGSU5FKEhBVkVfU05GX0FQSSwgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBNeXJpY29tIFNORiBBUEldKQorCWlmIHRlc3QgIiRhY19jdl9sYmxfc25mX2FwaSIgPSB5ZXM7IHRoZW4KKwkJQUNfTVNHX1JFU1VMVChbeWVzICgkc25mX3Jvb3QpXSkKKworCQlWX0lOQ0xTPSIkVl9JTkNMUyAtSSRzbmZfaW5jbHVkZV9kaXIiCisJCUxJQlM9IiRMSUJTIC1sc25mIgorCQlMREZMQUdTPSIkTERGTEFHUyAtTCRzbmZfbGliX2RpciIKKworCQlpZiB0ZXN0ICIkVl9QQ0FQIiAhPSBzbmYgOyB0aGVuCisJCQlTU1JDPSIkU1NSQyBwY2FwLXNuZi5jIgorCQlmaQorCisJCUFDX0RFRklORShIQVZFX1NORl9BUEksIDEsIFtkZWZpbmUgaWYgeW91IGhhdmUgdGhlIE15cmljb20gU05GIEFQSV0pCisJZWxzZQorCQlBQ19NU0dfUkVTVUxUKG5vKQorCisJCWlmIHRlc3QgIiR3YW50X3NuZiIgPSB5ZXM7IHRoZW4KKwkJCSMgVXNlciByZXF1ZXN0ZWQgInNuZiIgY2FwdHVyZSB0eXBlIGJ1dAorCQkJIyB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBTbmlmZmVyIEFQSSBzdXBwb3J0LgorCQkJQUNfTVNHX0VSUk9SKFtNeXJpY29tIFNuaWZmZXIgc3VwcG9ydCByZXF1ZXN0ZWQgd2l0aCAtLXdpdGgtcGNhcD1zbmYsIGJ1dCB0aGUgU25pZmZlciBoZWFkZXJzIHdlcmVuJ3QgZm91bmQgYXQgJHNuZl9pbmNsdWRlX2RpcjogbWFrZSBzdXJlIHRoZSBTbmlmZmVyIHN1cHBvcnQgaXMgaW5zdGFsbGVkLCBzcGVjaWZ5IGEgZGlmZmVyZW50IHBhdGggb3IgcGF0aHMgaWYgbmVjZXNzYXJ5LCBvciBkb24ndCByZXF1ZXN0IFNuaWZmZXIgc3VwcG9ydF0pCisJCWZpCisKKwkJaWYgdGVzdCAiJHdhbnRfc25mIiA9IHllczsgdGhlbgorCQkJQUNfTVNHX0VSUk9SKFtNeXJpY29tIFNuaWZmZXIgc3VwcG9ydCByZXF1ZXN0ZWQgd2l0aCAtLXdpdGgtc25mLCBidXQgdGhlIFNuaWZmZXIgaGVhZGVycyB3ZXJlbid0IGZvdW5kIGF0ICRzbmZfaW5jbHVkZV9kaXI6IG1ha2Ugc3VyZSB0aGUgU25pZmZlciBzdXBwb3J0IGlzIGluc3RhbGxlZCwgc3BlY2lmeSBhIGRpZmZlcmVudCBwYXRoIG9yIHBhdGhzIGlmIG5lY2Vzc2FyeSwgb3IgZG9uJ3QgcmVxdWVzdCBTbmlmZmVyIHN1cHBvcnRdKQogCQlmaQogCWZpCiBmaQogCi1pZiB0ZXN0ICIkVl9QQ0FQIiA9IHNuZiAtYSAiJGFjX2N2X2xibF9zbmZfYXBpIiA9IG5vOyB0aGVuCi0JQUNfTVNHX0VSUk9SKFNwZWNpZnlpbmcgdGhlIGNhcHR1cmUgdHlwZSBhcyAnc25mJyByZXF1aXJlcyB0aGUgTXlyaWNvbSBTbmlmZmVyIEFQSSB0byBiZSBwcmVzZW50OyB1c2UgLS13aXRoLXNuZj1ESVIpCisjIENoZWNrIGZvciBSaXZlcmJlZCBUdXJib0NhcCBzdXBwb3J0LgorQUNfQVJHX1dJVEgoW3R1cmJvY2FwXSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtdHVyYm9jYXBAPDpAPURJUkA6PkBdLFtpbmNsdWRlIFJpdmVyYmVkIFR1cmJvQ2FwIHN1cHBvcnQgKGxvY2F0ZWQgaW4gZGlyZWN0b3J5IERJUiwgaWYgc3VwcGxpZWQpLiAgQDw6QGRlZmF1bHQ9eWVzLCBpZiBwcmVzZW50QDo+QF0pLAorWworCWlmIHRlc3QgIiR3aXRodmFsIiA9IG5vCisJdGhlbgorCQkjIFVzZXIgZXhwbGljaXRseSBkb2Vzbid0IHdhbnQgVHVyYm9DYXAKKwkJd2FudF90dXJib2NhcD1ubworCWVsaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzCisJdGhlbgorCQkjIFVzZXIgd2FudHMgVHVyYm9DYXAgc3VwcG9ydCBidXQgaGFzbid0IHNwZWNpZmllZCBhIGRpcmVjdG9yeS4KKwkJd2FudF90dXJib2NhcD15ZXMKKwllbHNlCisJCSMgVXNlciB3YW50cyBUdXJib0NhcCBzdXBwb3J0IHdpdGggYSBzcGVjaWZpZWQgZGlyZWN0b3J5LgorCQl3YW50X3R1cmJvY2FwPXllcworCQl0dXJib2NhcF9yb290PSR3aXRodmFsCisJZmkKK10sWworCWlmIHRlc3QgInh4eF9vbmx5IiA9IHllczsgdGhlbgorCQkjIFVzZXIgcmVxdWVzdGVkIHNvbWV0aGluZy1lbHNlLW9ubHkgcGNhcCwgc28gdGhleSBkb24ndAorCQkjIHdhbnQgVHVyYm9DYXAgc3VwcG9ydC4KKwkJd2FudF90dXJib2NhcD1ubworCWVsc2UKKwkJIworCQkjIFVzZSBUdXJib0NhcCBBUEkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRvbid0CisJCSMKKwkJd2FudF90dXJib2NhcD1pZnByZXNlbnQKKwlmaQorXSkKKworYWNfY3ZfbGJsX3R1cmJvY2FwX2FwaT1ubworaWYgdGVzdCAiJHdhbnRfdHVyYm9jYXAiICE9IG5vOyB0aGVuCisKKwlBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBUdXJib0NhcCBpcyBzdXBwb3J0ZWQpCisKKwlzYXZlX0NGTEFHUz0iJENGTEFHUyIKKwlzYXZlX0xJQlM9IiRMSUJTIgorCWlmIHRlc3QgISAteiAiJHR1cmJvY2FwX3Jvb3QiOyB0aGVuCisJCVRVUkJPQ0FQX0NGTEFHUz0iLUkkdHVyYm9jYXBfcm9vdC9pbmNsdWRlIgorCQlUVVJCT0NBUF9MSUJTPSItTCR0dXJib2NhcF9yb290L2xpYiIKKwkJQ0ZMQUdTPSIkQ0ZMQUdTICRUVVJCT0NBUF9DRkxBR1MiCisJZmkKKworCUFDX1RSWV9DT01QSUxFKAorCVsKKwkgICAgI2luY2x1ZGUgPFRjQXBpLmg+CisJXSwKKwlbCisJICAgIFRDX0lOU1RBTkNFIGE7IFRDX1BPUlQgYjsgVENfQk9BUkQgYzsKKwkgICAgVENfSU5TVEFOQ0UgaTsKKwkgICAgKHZvaWQpVGNJbnN0YW5jZUNyZWF0ZUJ5TmFtZSgiZm9vIiwgJmkpOworCV0sCisJYWNfY3ZfbGJsX3R1cmJvY2FwX2FwaT15ZXMpCisKKwlDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKwlpZiB0ZXN0ICRhY19jdl9sYmxfdHVyYm9jYXBfYXBpID0geWVzOyB0aGVuCisJCUFDX01TR19SRVNVTFQoeWVzKQorCisJCVNTUkM9IiRTU1JDIHBjYXAtdGMuYyIKKwkJVl9JTkNMUz0iJFZfSU5DTFMgJFRVUkJPQ0FQX0NGTEFHUyIKKwkJTElCUz0iJExJQlMgJFRVUkJPQ0FQX0xJQlMgLWxUY0FwaSAtbHB0aHJlYWQgLWxzdGRjKysiCisKKwkJQUNfREVGSU5FKEhBVkVfVENfQVBJLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBUdXJib0NhcCBBUEldKQorCWVsc2UKKwkJQUNfTVNHX1JFU1VMVChubykKKworCQlpZiB0ZXN0ICIkd2FudF90dXJib2NhcCIgPSB5ZXM7IHRoZW4KKwkgICAgICAgIAkjIFVzZXIgd2FudGVkIFR1cmJvIHN1cHBvcnQgYnV0IHdlIGNvdWxkbid0IGZpbmQgaXQuCisJCQlBQ19NU0dfRVJST1IoW1R1cmJvQ2FwIHN1cHBvcnQgcmVxdWVzdGVkIHdpdGggLS13aXRoLXR1cmJvY2FwLCBidXQgdGhlIFR1cmJvQ2FwIGhlYWRlcnMgd2VyZW4ndCBmb3VuZDogbWFrZSBzdXJlIHRoZSBUdXJib0NhcCBzdXBwb3J0IGlzIGluc3RhbGxlZCBvciBkb24ndCByZXF1ZXN0IFR1cmJvQ2FwIHN1cHBvcnRdKQorCQlmaQorCWZpCiBmaQogCi1BQ19MQkxfTEVYX0FORF9ZQUNDKFZfTEVYLCBWX1lBQ0MsIHBjYXBfKQotaWYgdGVzdCAiJFZfTEVYIiA9IGxleCA7IHRoZW4KLSMgU29tZSB2ZXJzaW9ucyBvZiBsZXggY2FuJ3QgaGFuZGxlIHRoZSBkZWZpbml0aW9ucyBzZWN0aW9uIG9mIHNjYW5uZXIubCAuCi0jIFRyeSBsZXhpbmcgaXQgYW5kIGNvbXBsYWluIGlmIGl0IGNhbid0IGRlYWwuCi0JQUNfQ0FDSEVfQ0hFQ0soW2ZvciBjYXBhYmxlIGxleF0sIHRjcGR1bXBfY3ZfY2FwYWJsZV9sZXgsCi0JCWlmIGxleCAtdCBzY2FubmVyLmwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotCQkJdGNwZHVtcF9jdl9jYXBhYmxlX2xleD15ZXMKLQkJZWxzZQotCQkJdGNwZHVtcF9jdl9jYXBhYmxlX2xleD1pbnN1ZmZpY2llbnQKLQkJZmkpCi0JaWYgdGVzdCAkdGNwZHVtcF9jdl9jYXBhYmxlX2xleCA9IGluc3VmZmljaWVudCA7IHRoZW4KLQkJQUNfTVNHX0VSUk9SKFtZb3VyIG9wZXJhdGluZyBzeXN0ZW0ncyBsZXggaXMgaW5zdWZmaWNpZW50IHRvIGNvbXBpbGUKLSBsaWJwY2FwLiAgZmxleCBpcyBhIGxleCByZXBsYWNlbWVudCB0aGF0IGhhcyBtYW55IGFkdmFudGFnZXMsIGluY2x1ZGluZwotIGJlaW5nIGFibGUgdG8gY29tcGlsZSBsaWJwY2FwLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQotIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9mbGV4L2ZsZXguaHRtbCAuXSkKLQlmaQorIworIyBMb29rIGZvciB7Zn1sZXguCisjCitBQ19QUk9HX0xFWAoraWYgdGVzdCAiJExFWCIgPSAiOiI7IHRoZW4KKwlBQ19NU0dfRVJST1IoW05laXRoZXIgZmxleCBub3IgbGV4IHdhcyBmb3VuZC5dKQorZmkKKworIworIyBNYWtlIHN1cmUge2Z9bGV4IHN1cHBvcnRzIHRoZSAtUCwgLS1oZWFkZXItZmlsZSwgYW5kIC0tbm91bnB1dCBmbGFncworIyBhbmQgc3VwcG9ydHMgcHJvY2Vzc2luZyBvdXIgc2Nhbm5lci5sLgorIworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBjYXBhYmxlIGxleF0sIHRjcGR1bXBfY3ZfY2FwYWJsZV9sZXgsCisJaWYgJExFWCAtUCBwY2FwXyAtLWhlYWRlci1maWxlPS9kZXYvbnVsbCAtLW5vdW5wdXQgLXQgJHNyY2Rpci9zY2FubmVyLmwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICB0Y3BkdW1wX2N2X2NhcGFibGVfbGV4PXllcworCWVsc2UKKwkgICAgdGNwZHVtcF9jdl9jYXBhYmxlX2xleD1pbnN1ZmZpY2llbnQKKwlmaSkKK2lmIHRlc3QgJHRjcGR1bXBfY3ZfY2FwYWJsZV9sZXggPSBpbnN1ZmZpY2llbnQgOyB0aGVuCisJQUNfTVNHX0VSUk9SKFskTEVYIGlzIGluc3VmZmljaWVudCB0byBjb21waWxlIGxpYnBjYXAuCisgbGlicGNhcCByZXF1aXJlcyBGbGV4IDIuNS4zMSBvciBsYXRlciwgb3IgYSBjb21wYXRpYmxlIHZlcnNpb24gb2YgbGV4Ll0pCitmaQorCisjCisjIExvb2sgZm9yIHlhY2MvYmlzb24vYnlhY2MuCisjCitBQ19QUk9HX1lBQ0MKKworIworIyBNYWtlIHN1cmUgaXQgc3VwcG9ydHMgdGhlIC1wIGZsYWcgYW5kIHN1cHBvcnRzIHByb2Nlc3Npbmcgb3VyCisjIGdyYW1tYXIueS4KKyMKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgY2FwYWJsZSB5YWNjL2Jpc29uXSwgdGNwZHVtcF9jdl9jYXBhYmxlX3lhY2MsCisJaWYgJFlBQ0MgLXAgcGNhcF8gLW8gL2Rldi9udWxsICRzcmNkaXIvZ3JhbW1hci55ID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICB0Y3BkdW1wX2N2X2NhcGFibGVfeWFjYz15ZXMKKwllbHNlCisJICAgIHRjcGR1bXBfY3ZfY2FwYWJsZV95YWNjPWluc3VmZmljaWVudAorCWZpKQoraWYgdGVzdCAkdGNwZHVtcF9jdl9jYXBhYmxlX3lhY2MgPSBpbnN1ZmZpY2llbnQgOyB0aGVuCisJQUNfTVNHX0VSUk9SKFskWUFDQyBpcyBpbnN1ZmZpY2llbnQgdG8gY29tcGlsZSBsaWJwY2FwLgorIGxpYnBjYXAgcmVxdWlyZXMgQmlzb24sIEJlcmtlbGV5IFlBQ0MsIG9yIGFub3RoZXIgWUFDQyBjb21wYXRpYmxlIHdpdGggdGhlbS5dKQogZmkKIAogIwpAQCAtMTMzOCwxMiArMTQ1Miw2IEBACiAKIEFDX0xCTF9VTkFMSUdORURfQUNDRVNTCiAKLSMKLSMgTWFrZWZpbGUuaW4gaW5jbHVkZXMgcnVsZXMgdG8gZ2VuZXJhdGUgdmVyc2lvbi5oLCBzbyB3ZSBhc3N1bWUKLSMgdGhhdCBpdCB3aWxsIGJlIGdlbmVyYXRlZCBpZiBhdXRvY29uZiBpcyB1c2VkLgotIwotQUNfREVGSU5FKEhBVkVfVkVSU0lPTl9ILCAxLCBbZGVmaW5lIGlmIHZlcnNpb24uaCBpcyBnZW5lcmF0ZWQgaW4gdGhlIGJ1aWxkIHByb2NlZHVyZV0pCi0KIHJtIC1mIG5ldAogbG4gLXMgJHtzcmNkaXJ9L2JwZi9uZXQgbmV0CiAKQEAgLTEzNzAsNiArMTQ3OCwxMiBAQAogICAgIFtdLAogICAgIFtlbmFibGVfdXNiPXllc10pCiAKK2lmIHRlc3QgInh4eF9vbmx5IiA9IHllczsgdGhlbgorCSMgVXNlciByZXF1ZXN0ZWQgc29tZXRoaW5nLWVsc2Utb25seSBwY2FwLCBzbyB0aGV5IGRvbid0CisJIyB3YW50IFVTQiBzdXBwb3J0LgorCWVuYWJsZV91c2I9bm8KK2ZpCisKIGlmIHRlc3QgIngkZW5hYmxlX3VzYiIgIT0gInhubyIgOyB0aGVuCiAgICBkbmwgY2hlY2sgZm9yIFVTQiBzbmlmZmluZyBzdXBwb3J0CiAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIFVTQiBzbmlmZmluZyBzdXBwb3J0KQpAQCAtMTQyNSw2ICsxNTM5LDE0IEBACiAJICAgIGZpCiAJZmkKIAk7OworICAgIGZyZWVic2QqKQorCSMKKwkjIFRoaXMganVzdCB1c2VzIEJQRiBpbiBGcmVlQlNEIDguNCBhbmQgbGF0ZXI7IHdlIGRvbid0IG5lZWQKKwkjIHRvIGNoZWNrIGZvciBhbnl0aGluZyBzcGVjaWFsIGZvciBjYXB0dXJpbmcuCisJIworCUFDX01TR19SRVNVTFQoW3llcywgaW4gRnJlZUJTRCA4LjQgYW5kIGxhdGVyXSkKKwk7OworCiAgICAgKikKIAlBQ19NU0dfUkVTVUxUKG5vKQogCTs7CkBAIC0xNDM0LDIxICsxNTU2LDIyIEBACiBBQ19TVUJTVChVU0JfU1JDKQogCiBkbmwgY2hlY2sgZm9yIG5ldGZpbHRlciBzbmlmZmluZyBzdXBwb3J0Ci1BQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0aGUgcGxhdGZvcm0gY291bGQgc3VwcG9ydCBuZXRmaWx0ZXIgc25pZmZpbmcpCi1jYXNlICIkaG9zdF9vcyIgaW4KLWxpbnV4KikKLQlBQ19NU0dfUkVTVUxUKHllcykKLQkjCi0JIyBMaWZlJ3MgdG9vIHNob3J0IHRvIGRlYWwgd2l0aCB0cnlpbmcgdG8gZ2V0IHRoaXMgdG8gY29tcGlsZQotCSMgaWYgeW91IGRvbid0IGdldCB0aGUgcmlnaHQgdHlwZXMgZGVmaW5lZCB3aXRoCi0JIyBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMgZ2V0dGluZyBkZWZpbmVkIGJ5IHNvbWUgb3RoZXIgaW5jbHVkZS4KLQkjCi0JIyBDaGVjayB3aGV0aGVyIHRoZSBpbmNsdWRlcyBKdXN0IFdvcmsuICBJZiBub3QsIGRvbid0IHR1cm4gb24KLQkjIG5ldGZpbHRlciBzdXBwb3J0LgotCSMKLQlBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB3ZSBjYW4gY29tcGlsZSB0aGUgbmV0ZmlsdGVyIHN1cHBvcnQpCi0JQUNfQ0FDSEVfVkFMKGFjX2N2X25ldGZpbHRlcl9jYW5fY29tcGlsZSwKLQkgIEFDX1RSWV9DT01QSUxFKFsKK2lmIHRlc3QgInh4eF9vbmx5IiAhPSB5ZXM7IHRoZW4KKwlBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0aGUgcGxhdGZvcm0gY291bGQgc3VwcG9ydCBuZXRmaWx0ZXIgc25pZmZpbmcpCisJY2FzZSAiJGhvc3Rfb3MiIGluCisJbGludXgqKQorCQlBQ19NU0dfUkVTVUxUKHllcykKKwkJIworCQkjIExpZmUncyB0b28gc2hvcnQgdG8gZGVhbCB3aXRoIHRyeWluZyB0byBnZXQgdGhpcyB0byBjb21waWxlCisJCSMgaWYgeW91IGRvbid0IGdldCB0aGUgcmlnaHQgdHlwZXMgZGVmaW5lZCB3aXRoCisJCSMgX19LRVJORUxfU1RSSUNUX05BTUVTIGdldHRpbmcgZGVmaW5lZCBieSBzb21lIG90aGVyIGluY2x1ZGUuCisJCSMKKwkJIyBDaGVjayB3aGV0aGVyIHRoZSBpbmNsdWRlcyBKdXN0IFdvcmsuICBJZiBub3QsIGRvbid0IHR1cm4gb24KKwkJIyBuZXRmaWx0ZXIgc3VwcG9ydC4KKwkJIworCQlBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB3ZSBjYW4gY29tcGlsZSB0aGUgbmV0ZmlsdGVyIHN1cHBvcnQpCisJCUFDX0NBQ0hFX1ZBTChhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUsCisJCSAgQUNfVFJZX0NPTVBJTEUoWwogQUNfSU5DTFVERVNfREVGQVVMVAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CkBAIC0xNDYyLDE3ICsxNTg1LDE4IEBACiAJICAgIFtdLAogCSAgICBhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGU9eWVzLAogCSAgICBhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGU9bm8pKQotCUFDX01TR19SRVNVTFQoJGFjX2N2X25ldGZpbHRlcl9jYW5fY29tcGlsZSkKLQlpZiB0ZXN0ICRhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUgPSB5ZXMgOyB0aGVuCi0JICBBQ19ERUZJTkUoUENBUF9TVVBQT1JUX05FVEZJTFRFUiwgMSwKLQkgICAgW3RhcmdldCBob3N0IHN1cHBvcnRzIG5ldGZpbHRlciBzbmlmZmluZ10pCi0JICBORVRGSUxURVJfU1JDPXBjYXAtbmV0ZmlsdGVyLWxpbnV4LmMKLQlmaQotCTs7Ci0qKQotCUFDX01TR19SRVNVTFQobm8pCi0JOzsKLWVzYWMKKwkJQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlKQorCQlpZiB0ZXN0ICRhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUgPSB5ZXMgOyB0aGVuCisJCSAgQUNfREVGSU5FKFBDQVBfU1VQUE9SVF9ORVRGSUxURVIsIDEsCisJCSAgICBbdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgbmV0ZmlsdGVyIHNuaWZmaW5nXSkKKwkJICBORVRGSUxURVJfU1JDPXBjYXAtbmV0ZmlsdGVyLWxpbnV4LmMKKwkJZmkKKwkJOzsKKwkqKQorCQlBQ19NU0dfUkVTVUxUKG5vKQorCQk7OworCWVzYWMKK2ZpCiBBQ19TVUJTVChQQ0FQX1NVUFBPUlRfTkVURklMVEVSKQogQUNfU1VCU1QoTkVURklMVEVSX1NSQykKIApAQCAtMTQ4MSw2ICsxNjA1LDEyIEBACiAgICAgW10sCiAgICAgW2VuYWJsZV9ibHVldG9vdGg9aWZzdXBwb3J0YXZhaWxhYmxlXSkKIAoraWYgdGVzdCAieHh4X29ubHkiID0geWVzOyB0aGVuCisJIyBVc2VyIHJlcXVlc3RlZCBzb21ldGhpbmctZWxzZS1vbmx5IHBjYXAsIHNvIHRoZXkgZG9uJ3QKKwkjIHdhbnQgQmx1ZXRvb3RoIHN1cHBvcnQuCisJZW5hYmxlX2JsdWV0b290aD1ubworZmkKKwogaWYgdGVzdCAieCRlbmFibGVfYmx1ZXRvb3RoIiAhPSAieG5vIiA7IHRoZW4KIAlkbmwgY2hlY2sgZm9yIEJsdWV0b290aCBzbmlmZmluZyBzdXBwb3J0CiAJY2FzZSAiJGhvc3Rfb3MiIGluCkBAIC0xNTU1LDk0ICsxNjg1LDE3IEBACiAJQUNfU1VCU1QoQlRfTU9OSVRPUl9TUkMpCiBmaQogCi1BQ19BUkdfRU5BQkxFKFtjYW51c2JdLAotW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1jYW51c2JdLFtlbmFibGUgY2FudXNiIHN1cHBvcnQgQDw6QGRlZmF1bHQ9eWVzLCBpZiBzdXBwb3J0IGF2YWlsYWJsZUA6PkBdKV0sCi0gICAgW10sCi0gICAgW2VuYWJsZV9jYW51c2I9aWZzdXBwb3J0YXZhaWxhYmxlXSkKLQotaWYgdGVzdCAieCRlbmFibGVfY2FudXNiIiAhPSAieG5vIiA7IHRoZW4KLQlkbmwgY2hlY2sgZm9yIGNhbnVzYiBzdXBwb3J0Ci0JY2FzZSAiJGhvc3Rfb3MiIGluCi0JbGludXgqfHVjbGludXgqKQotCQlBQ19DSEVDS19IRUFERVIobGlidXNiLTEuMC9saWJ1c2IuaCwKLQkJWwotCQkgICAgQUNfQ0hFQ0tfTElCKHVzYi0xLjAsIGxpYnVzYl9pbml0LAotCQkgICAgWwotCQkJQUNfREVGSU5FKFBDQVBfU1VQUE9SVF9DQU5VU0IsIDEsIFt0YXJnZXQgaG9zdCBzdXBwb3J0cyBjYW51c2JdKQotCQkJQ0FOVVNCX1NSQz1wY2FwLWNhbnVzYi1saW51eC5jCi0JCQlMSUJTPSItbHVzYi0xLjAgLWxwdGhyZWFkICRMSUJTIgotCQkJYWNfbGJsX2hhc19saWJ1c2I9eWVzCi0JCSAgICBdLAotCQkgICAgYWNfbGJsX2hhc19saWJ1c2I9bm8sCi0JCSAgICAtbHB0aHJlYWQKLQkJICAgICkKLQkJXSwKLQkJYWNfbGJsX2hhc19saWJ1c2I9bm8KLQkJKQotCQlpZiB0ZXN0ICJ4JGFjX2xibF9oYXNfbGlidXNiIiA9ICJ4eWVzIiA7IHRoZW4KLQkJICAgIEFDX01TR19OT1RJQ0UoY2FudXNiIHNuaWZmaW5nIGlzIHN1cHBvcnRlZCkKLQkJZWxzZQotCQkgICAgaWYgdGVzdCAieCRlbmFibGVfY2FudXNiIiA9ICJ4eWVzIiA7IHRoZW4KLQkJCUFDX01TR19FUlJPUihjYW51c2Igc25pZmZpbmcgaXMgbm90IHN1cHBvcnRlZDsgaW5zdGFsbCBsaWJ1c2IxLjAgbGliIGRldmVsIHRvIGVuYWJsZSBpdCkKLQkJICAgIGVsc2UKLQkJCUFDX01TR19OT1RJQ0UoY2FudXNiIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQ7IGluc3RhbGwgbGlidXNiMS4wIGxpYiBkZXZlbCB0byBlbmFibGUgaXQpCi0JCSAgICBmaQotCQlmaQotCQk7OwotCSopCi0JCWlmIHRlc3QgIngkZW5hYmxlX2NhbnVzYiIgPSAieHllcyIgOyB0aGVuCi0JCSAgICBBQ19NU0dfRVJST1Iobm8gY2FudXNiIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zKQotCQllbHNlCi0JCSAgICBBQ19NU0dfTk9USUNFKG5vIGNhbnVzYiBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcykKLQkJZmkKLQkJOzsKLQllc2FjCi0JQUNfU1VCU1QoUENBUF9TVVBQT1JUX0NBTlVTQikKLQlBQ19TVUJTVChDQU5VU0JfU1JDKQotZmkKLQotQUNfQVJHX0VOQUJMRShbY2FuXSwKLVtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtY2FuXSxbZW5hYmxlIENBTiBzdXBwb3J0IEA8OkBkZWZhdWx0PXllcywgaWYgc3VwcG9ydCBhdmFpbGFibGVAOj5AXSldLAotICAgIFtdLAotICAgIFtlbmFibGVfY2FuPWlmc3VwcG9ydGF2YWlsYWJsZV0pCi0KLWlmIHRlc3QgIngkZW5hYmxlX2NhbiIgIT0gInhubyIgOyB0aGVuCi0JZG5sIGNoZWNrIGZvciBDQU4gc25pZmZpbmcgc3VwcG9ydAotCWNhc2UgIiRob3N0X29zIiBpbgotCWxpbnV4KikKLQkJQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L2Nhbi5oLAotCQkJWwotCQkJICAgIEFDX0RFRklORShQQ0FQX1NVUFBPUlRfQ0FOLCAxLCBbdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgQ0FOIHNuaWZmaW5nXSkKLQkJCSAgICBDQU5fU1JDPXBjYXAtY2FuLWxpbnV4LmMKLQkJCSAgICBBQ19NU0dfTk9USUNFKENBTiBzbmlmZmluZyBpcyBzdXBwb3J0ZWQpCi0JCQldLAotCQkJWwotCQkJICAgIGlmIHRlc3QgIngkZW5hYmxlX2NhbiIgPSAieHllcyIgOyB0aGVuCi0JCQkJQUNfTVNHX0VSUk9SKENBTiBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkKQotCQkJICAgIGVsc2UKLQkJCQlBQ19NU0dfTk9USUNFKENBTiBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkKQotCQkJICAgIGZpCi0JCQldLAotCQkJWyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XQotCQkgICApCi0JCTs7Ci0JKikKLQkJaWYgdGVzdCAieCRlbmFibGVfY2FuIiA9ICJ4eWVzIiA7IHRoZW4KLQkJICAgIEFDX01TR19FUlJPUihubyBDQU4gc25pZmZpbmcgc3VwcG9ydCBpbXBsZW1lbnRlZCBmb3IgJGhvc3Rfb3MpCi0JCWVsc2UKLQkJICAgIEFDX01TR19OT1RJQ0Uobm8gQ0FOIHNuaWZmaW5nIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zKQotCQlmaQotCQk7OwotCWVzYWMKLQlBQ19TVUJTVChQQ0FQX1NVUFBPUlRfQ0FOKQotCUFDX1NVQlNUKENBTl9TUkMpCi1maQotCiBBQ19BUkdfRU5BQkxFKFtkYnVzXSwKIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZGJ1c10sW2VuYWJsZSBELUJ1cyBjYXB0dXJlIHN1cHBvcnQgQDw6QGRlZmF1bHQ9eWVzLCBpZiBzdXBwb3J0IGF2YWlsYWJsZUA6PkBdKV0sCiAgICAgW10sCiAgICAgW2VuYWJsZV9kYnVzPWlmYXZhaWxhYmxlXSkKIAoraWYgdGVzdCAieHh4X29ubHkiID0geWVzOyB0aGVuCisJIyBVc2VyIHJlcXVlc3RlZCBzb21ldGhpbmctZWxzZS1vbmx5IHBjYXAsIHNvIHRoZXkgZG9uJ3QKKwkjIHdhbnQgRC1CdXMgc3VwcG9ydC4KKwllbmFibGVfZGJ1cz1ubworZmkKKwogaWYgdGVzdCAieCRlbmFibGVfZGJ1cyIgIT0gInhubyI7IHRoZW4KIAlpZiB0ZXN0ICJ4JGVuYWJsZV9kYnVzIiA9ICJ4eWVzIjsgdGhlbgogCQljYXNlICIkaG9zdF9vcyIgaW4KZGlmZiAtLWdpdCBhL2RscGlzdWJzLmMgYi9kbHBpc3Vicy5jCmluZGV4IDEzMWZhMjcuLmZiOTRhNjAgMTAwNjQ0Ci0tLSBhL2RscGlzdWJzLmMKKysrIGIvZGxwaXN1YnMuYwpAQCAtMTg2LDggKzE4Niw4IEBACiAJCQlwa3RoZHIubGVuID0gb3JpZ2xlbjsKIAkJCXBrdGhkci5jYXBsZW4gPSBjYXBsZW47CiAJCQkvKiBJbnN1cmUgY2FwbGVuIGRvZXMgbm90IGV4Y2VlZCBzbmFwc2hvdCAqLwotCQkJaWYgKHBrdGhkci5jYXBsZW4gPiBwLT5zbmFwc2hvdCkKLQkJCQlwa3RoZHIuY2FwbGVuID0gcC0+c25hcHNob3Q7CisJCQlpZiAocGt0aGRyLmNhcGxlbiA+IChicGZfdV9pbnQzMilwLT5zbmFwc2hvdCkKKwkJCQlwa3RoZHIuY2FwbGVuID0gKGJwZl91X2ludDMyKXAtPnNuYXBzaG90OwogCQkJKCpjYWxsYmFjaykodXNlciwgJnBrdGhkciwgcGspOwogCQkJaWYgKCsrbiA+PSBjb3VudCAmJiAhUEFDS0VUX0NPVU5UX0lTX1VOTElNSVRFRChjb3VudCkpIHsKIAkJCQlwLT5jYyA9IGVwIC0gYnVmcDsKQEAgLTI1NSw4ICsyNTUsMjkgQEAKIAkJYnJlYWs7CiAjZW5kaWYKIAorI2lmZGVmIERMX0lQVjQKKwljYXNlIERMX0lQVjQ6CisJCXAtPmxpbmt0eXBlID0gRExUX0lQVjQ7CisJCXAtPm9mZnNldCA9IDA7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBETF9JUFY2CisJY2FzZSBETF9JUFY2OgorCQlwLT5saW5rdHlwZSA9IERMVF9JUFY2OworCQlwLT5vZmZzZXQgPSAwOworCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgRExfSVBORVQKKwljYXNlIERMX0lQTkVUOgorCQlwLT5saW5rdHlwZSA9IERMVF9JUE5FVDsKKwkJcC0+b2Zmc2V0ID0gMDsKKwkJYnJlYWs7CisjZW5kaWYKKwogCWRlZmF1bHQ6Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInVua25vd24gbWFjdHlwZSAldSIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAidW5rbm93biBtYWN0eXBlIDB4JXgiLAogCQkgICAgbWFjdHlwZSk7CiAJCXJldHYgPSAtMTsKIAl9CkBAIC0zMjYsNyArMzQ3LDcgQEAKIHBjYXBfYWxsb2NfZGF0YWJ1ZihwY2FwX3QgKnApCiB7CiAJcC0+YnVmc2l6ZSA9IFBLVEJVRlNJWkU7Ci0JcC0+YnVmZmVyID0gKHVfY2hhciAqKW1hbGxvYyhwLT5idWZzaXplICsgcC0+b2Zmc2V0KTsKKwlwLT5idWZmZXIgPSBtYWxsb2MocC0+YnVmc2l6ZSArIHAtPm9mZnNldCk7CiAJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7CiAJCXN0cmxjcHkocC0+ZXJyYnVmLCBwY2FwX3N0cmVycm9yKGVycm5vKSwgUENBUF9FUlJCVUZfU0laRSk7CiAJCXJldHVybiAoLTEpOwpAQCAtMzYyLDYgKzM4Myw2IEBACiBzdGF0aWMgdm9pZAogcGNhcF9zdHJlYW1fZXJyKGNvbnN0IGNoYXIgKmZ1bmMsIGludCBlcnIsIGNoYXIgKmVycmJ1ZikKIHsKLQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLCBmdW5jLCBwY2FwX3N0cmVycm9yKGVycikpOworCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwgZnVuYywgcGNhcF9zdHJlcnJvcihlcnIpKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZXRoZXJlbnQuYyBiL2V0aGVyZW50LmMKaW5kZXggNzA3ZmQ5ZC4uNWNmZDFiNCAxMDA2NDQKLS0tIGEvZXRoZXJlbnQuYworKysgYi9ldGhlcmVudC5jCkBAIC0yMyw5ICsyMyw5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKIAotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCiAjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KLSNlbHNlIC8qIFdJTjMyICovCisjZWxzZSAvKiBfV0lOMzIgKi8KICNpZiBIQVZFX0lOVFRZUEVTX0gKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2VsaWYgSEFWRV9TVERJTlRfSApAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIF9XSU4zMiAqLwogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxtZW1vcnkuaD4KZGlmZiAtLWdpdCBhL2V0aGVydHlwZS5oIGIvZXRoZXJ0eXBlLmgKaW5kZXggOGJhYjg4MS4uNTFmNjMwOCAxMDA2NDQKLS0tIGEvZXRoZXJ0eXBlLmgKKysrIGIvZXRoZXJ0eXBlLmgKQEAgLTExMiw2ICsxMTIsOSBAQAogI2lmbmRlZiBFVEhFUlRZUEVfUFBQT0VTCiAjZGVmaW5lIEVUSEVSVFlQRV9QUFBPRVMJMHg4ODY0CiAjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFXzgwMjFBRAorI2RlZmluZSBFVEhFUlRZUEVfODAyMUFECTB4ODhhOAorI2VuZGlmCiAjaWZuZGVmCUVUSEVSVFlQRV9MT09QQkFDSwogI2RlZmluZQlFVEhFUlRZUEVfTE9PUEJBQ0sJMHg5MDAwCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2V4dHJhY3QuaCBiL2V4dHJhY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWNlNWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0cmFjdC5oCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbmRpZgorCisvKgorICogTWFjcm9zIHRvIGV4dHJhY3QgcG9zc2libHktdW5hbGlnbmVkIGJpZy1lbmRpYW4gaW50ZWdyYWwgdmFsdWVzLgorICovCisjaWZkZWYgTEJMX0FMSUdOCisvKgorICogVGhlIHByb2Nlc3NvciBkb2Vzbid0IG5hdGl2ZWx5IGhhbmRsZSB1bmFsaWduZWQgbG9hZHMuCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKEhBVkVfX19BVFRSSUJVVEVfXykgJiYgXAorICAgIChkZWZpbmVkKF9fYWxwaGEpIHx8IGRlZmluZWQoX19hbHBoYV9fKSB8fCBcCisgICAgIGRlZmluZWQoX19taXBzKSB8fCBkZWZpbmVkKF9fbWlwc19fKSkKKworLyoKKyAqIFRoaXMgaXMgYSBHQ0MtY29tcGF0aWJsZSBjb21waWxlciBhbmQgd2UgaGF2ZSBfX2F0dHJpYnV0ZV9fLCB3aGljaAorICogd2UgYXNzdW1lIHRoYXQgbWVhbiB3ZSBoYXZlIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpLCBhbmQgdGhpcyBpcworICogTUlQUyBvciBBbHBoYSwgd2hpY2ggaGFzIGluc3RydWN0aW9ucyB0aGF0IGNhbiBoZWxwIHdoZW4gZG9pbmcKKyAqIHVuYWxpZ25lZCBsb2Fkcy4KKyAqCisgKiBEZWNsYXJlIHBhY2tlZCBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYSB1aW50MTZfdCBhbmQgYSB1aW50MzJfdCwKKyAqIGNhc3QgdGhlIHBvaW50ZXIgdG8gcG9pbnQgdG8gb25lIG9mIHRob3NlLCBhbmQgZmV0Y2ggdGhyb3VnaCBpdDsKKyAqIHRoZSBHQ0MgbWFudWFsIGRvZXNuJ3QgYXBwZWFyIHRvIGV4cGxpY2l0bHkgc2F5IHRoYXQKKyAqIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGNhdXNlcyB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgdW5hbGlnbmVkLXNhZmUKKyAqIGNvZGUsIGJ1dCBpdCBhcHBwZWFycyB0byBkbyBzby4KKyAqCisgKiBXZSBkbyB0aGlzIGluIGNhc2UgdGhlIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZSBjb2RlIHVzaW5nIHRob3NlCisgKiBpbnN0cnVjdGlvbnMgdG8gZG8gYW4gdW5hbGlnbmVkIGxvYWQgYW5kIHBhc3Mgc3R1ZmYgdG8gIm50b2hzKCkiIG9yCisgKiAibnRvaGwoKSIsIHdoaWNoIG1pZ2h0IGJlIGJldHRlciB0aGFuIHRoYW4gdGhlIGNvZGUgdG8gZmV0Y2ggdGhlCisgKiBieXRlcyBvbmUgYXQgYSB0aW1lIGFuZCBhc3NlbWJsZSB0aGVtLiAgKFRoYXQgbWlnaHQgbm90IGJlIHRoZQorICogY2FzZSBvbiBhIGxpdHRsZS1lbmRpYW4gcGxhdGZvcm0sIHN1Y2ggYXMgREVDJ3MgTUlQUyBtYWNoaW5lcyBhbmQKKyAqIEFscGhhIG1hY2hpbmVzLCB3aGVyZSAibnRvaHMoKSIgYW5kICJudG9obCgpIiBtaWdodCBub3QgYmUgZG9uZQorICogaW5saW5lLikKKyAqCisgKiBXZSBkbyB0aGlzIG9ubHkgZm9yIHNwZWNpZmljIGFyY2hpdGVjdHVyZXMgYmVjYXVzZSwgZm9yIGV4YW1wbGUsCisgKiBhdCBsZWFzdCBzb21lIHZlcnNpb25zIG9mIEdDQywgd2hlbiBjb21waWxpbmcgZm9yIDY0LWJpdCBTUEFSQywKKyAqIGdlbmVyYXRlIGNvZGUgdGhhdCBhc3N1bWVzIGFsaWdubWVudCBpZiB3ZSBkbyB0aGlzLgorICoKKyAqIFhYWCAtIGFkZCBvdGhlciBhcmNoaXRlY3R1cmVzIGFuZCBjb21waWxlcnMgYXMgcG9zc2libGUgYW5kCisgKiBhcHByb3ByaWF0ZS4KKyAqCisgKiBIUCdzIEMgY29tcGlsZXIsIGluZGljYXRlZCBieSBfX0hQX2NjIGJlaW5nIGRlZmluZWQsIHN1cHBvcnRzCisgKiAiI3ByYWdtYSB1bmFsaWduZWQgTiIgaW4gdmVyc2lvbiBBLjA1LjUwIGFuZCBsYXRlciwgd2hlcmUgIk4iCisgKiBzcGVjaWZpZXMgYSBudW1iZXIgb2YgYnl0ZXMgYXQgd2hpY2ggdGhlIHR5cGVkZWYgb24gdGhlIG5leHQKKyAqIGxpbmUgaXMgYWxpZ25lZCwgZS5nLgorICoKKyAqCSNwcmFnbWEgdW5hbGlnbiAxCisgKgl0eXBlZGVmIHVpbnQxNl90IHVuYWxpZ25lZF91aW50MTZfdDsKKyAqCisgKiB0byBkZWZpbmUgdW5hbGlnbmVkX3VpbnQxNl90IGFzIGEgMTYtYml0IHVuYWxpZ25lZCBkYXRhIHR5cGUuCisgKiBUaGlzIGNvdWxkIGJlIHByZXN1bWFibHkgdXNlZCwgaW4gc3VmZmljaWVudGx5IHJlY2VudCB2ZXJzaW9ucyBvZgorICogdGhlIGNvbXBpbGVyLCB3aXRoIG1hY3JvcyBzaW1pbGFyIHRvIHRob3NlIGJlbG93LiAgVGhpcyB3b3VsZCBiZQorICogdXNlZnVsIG9ubHkgaWYgdGhhdCBjb21waWxlciBjb3VsZCBnZW5lcmF0ZSBiZXR0ZXIgY29kZSBmb3IgUEEtUklTQworICogb3IgSXRhbml1bSB0aGFuIHdvdWxkIGJlIGdlbmVyYXRlZCBieSBhIGJ1bmNoIG9mIHNoaWZ0cy1hbmQtT1JzLgorICoKKyAqIERFQyBDLCBpbmRpY2F0ZWQgYnkgX19ERUNDIGJlaW5nIGRlZmluZWQsIGhhcywgYXQgbGVhc3Qgb24gQWxwaGEsCisgKiBhbiBfX3VuYWxpZ25lZCBxdWFsaWZpZXIgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBwb2ludGVycyB0byBnZXQgdGhlCisgKiBjb21waWxlciB0byBnZW5lcmF0ZSBjb2RlIHRoYXQgZG9lcyB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcyB3aGVuCisgKiBkZXJlZmVyZW5jaW5nIHRoZSBwb2ludGVyIGluIHF1ZXN0aW9uLgorICoKKyAqIFhYWCAtIHdoYXQgaWYgdGhlIG5hdGl2ZSBDIGNvbXBpbGVyIGRvZXNuJ3Qgc3VwcG9ydAorICogX19hdHRyaWJ1dGVfXygocGFja2VkKSk/ICBIb3cgY2FuIHdlIGdldCBpdCB0byBnZW5lcmF0ZSB1bmFsaWduZWQKKyAqIGFjY2Vzc2VzIGZvciAqc3BlY2lmaWMqIGl0ZW1zPworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QJdmFsOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB1bmFsaWduZWRfdWludDE2X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdAl2YWw7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHVuYWxpZ25lZF91aW50MzJfdDsKKworc3RhdGljIGlubGluZSB1aW50MTZfdAorRVhUUkFDVF8xNkJJVFMoY29uc3Qgdm9pZCAqcCkKK3sKKwlyZXR1cm4gKCh1aW50MTZfdCludG9ocygoKGNvbnN0IHVuYWxpZ25lZF91aW50MTZfdCAqKShwKSktPnZhbCkpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90CitFWFRSQUNUXzMyQklUUyhjb25zdCB2b2lkICpwKQoreworCXJldHVybiAoKHVpbnQzMl90KW50b2hsKCgoY29uc3QgdW5hbGlnbmVkX3VpbnQzMl90ICopKHApKS0+dmFsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QKK0VYVFJBQ1RfNjRCSVRTKGNvbnN0IHZvaWQgKnApCit7CisJcmV0dXJuICgodWludDY0X3QpKCgodWludDY0X3QpbnRvaGwoKChjb25zdCB1bmFsaWduZWRfdWludDMyX3QgKikocCkgKyAwKS0+dmFsKSkgPDwgMzIgfCBcCisJCSgodWludDY0X3QpbnRvaGwoKChjb25zdCB1bmFsaWduZWRfdWludDMyX3QgKikocCkgKyAxKS0+dmFsKSkgPDwgMCkpOworfQorCisjZWxzZSAvKiBoYXZlIHRvIGRvIGl0IGEgYnl0ZSBhdCBhIHRpbWUgKi8KKy8qCisgKiBUaGlzIGlzbid0IGEgR0NDLWNvbXBhdGlibGUgY29tcGlsZXIsIHdlIGRvbid0IGhhdmUgX19hdHRyaWJ1dGVfXywKKyAqIG9yIHdlIGRvIGJ1dCB3ZSBkb24ndCBrbm93IG9mIGFueSBiZXR0ZXIgd2F5IHdpdGggdGhpcyBpbnN0cnVjdGlvbgorICogc2V0IHRvIGRvIHVuYWxpZ25lZCBsb2Fkcywgc28gZG8gdW5hbGlnbmVkIGxvYWRzIG9mIGJpZy1lbmRpYW4KKyAqIHF1YW50aXRpZXMgdGhlIGhhcmQgd2F5IC0gZmV0Y2ggdGhlIGJ5dGVzIG9uZSBhdCBhIHRpbWUgYW5kCisgKiBhc3NlbWJsZSB0aGVtLgorICovCisjZGVmaW5lIEVYVFJBQ1RfMTZCSVRTKHApIFwKKwkoKHVpbnQxNl90KSgoKHVpbnQxNl90KSgqKChjb25zdCB1aW50OF90ICopKHApICsgMCkpIDw8IDgpIHwgXAorCSAgICAgICAgICAgICgodWludDE2X3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyAxKSkgPDwgMCkpKQorI2RlZmluZSBFWFRSQUNUXzMyQklUUyhwKSBcCisJKCh1aW50MzJfdCkoKCh1aW50MzJfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDApKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgKCh1aW50MzJfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDEpKSA8PCAxNikgfCBcCisJICAgICAgICAgICAgKCh1aW50MzJfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDIpKSA8PCA4KSB8IFwKKwkgICAgICAgICAgICAoKHVpbnQzMl90KSgqKChjb25zdCB1aW50OF90ICopKHApICsgMykpIDw8IDApKSkKKyNkZWZpbmUgRVhUUkFDVF82NEJJVFMocCkgXAorCSgodWludDY0X3QpKCgodWludDY0X3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyAwKSkgPDwgNTYpIHwgXAorCSAgICAgICAgICAgICgodWludDY0X3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyAxKSkgPDwgNDgpIHwgXAorCSAgICAgICAgICAgICgodWludDY0X3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyAyKSkgPDwgNDApIHwgXAorCSAgICAgICAgICAgICgodWludDY0X3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyAzKSkgPDwgMzIpIHwgXAorCSAgICAgICAgICAgICgodWludDY0X3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyA0KSkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICgodWludDY0X3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyA1KSkgPDwgMTYpIHwgXAorCSAgICAgICAgICAgICgodWludDY0X3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyA2KSkgPDwgOCkgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDcpKSA8PCAwKSkpCisjZW5kaWYgLyogbXVzdCBzcGVjaWFsLWNhc2UgdW5hbGlnbmVkIGFjY2Vzc2VzICovCisjZWxzZSAvKiBMQkxfQUxJR04gKi8KKy8qCisgKiBUaGUgcHJvY2Vzc29yIG5hdGl2ZWx5IGhhbmRsZXMgdW5hbGlnbmVkIGxvYWRzLCBzbyB3ZSBjYW4ganVzdAorICogY2FzdCB0aGUgcG9pbnRlciBhbmQgZmV0Y2ggdGhyb3VnaCBpdC4KKyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdAorRVhUUkFDVF8xNkJJVFMoY29uc3Qgdm9pZCAqcCkKK3sKKwlyZXR1cm4gKCh1aW50MTZfdCludG9ocygqKGNvbnN0IHVpbnQxNl90ICopKHApKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK0VYVFJBQ1RfMzJCSVRTKGNvbnN0IHZvaWQgKnApCit7CisJcmV0dXJuICgodWludDMyX3QpbnRvaGwoKihjb25zdCB1aW50MzJfdCAqKShwKSkpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90CitFWFRSQUNUXzY0QklUUyhjb25zdCB2b2lkICpwKQoreworCXJldHVybiAoKHVpbnQ2NF90KSgoKHVpbnQ2NF90KW50b2hsKCooKGNvbnN0IHVpbnQzMl90ICopKHApICsgMCkpKSA8PCAzMiB8IFwKKwkJKCh1aW50NjRfdCludG9obCgqKChjb25zdCB1aW50MzJfdCAqKShwKSArIDEpKSkgPDwgMCkpOworCit9CisKKyNlbmRpZiAvKiBMQkxfQUxJR04gKi8KKworI2RlZmluZSBFWFRSQUNUXzI0QklUUyhwKSBcCisJKCh1aW50MzJfdCkoKCh1aW50MzJfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDApKSA8PCAxNikgfCBcCisJICAgICAgICAgICAgKCh1aW50MzJfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDEpKSA8PCA4KSB8IFwKKwkgICAgICAgICAgICAoKHVpbnQzMl90KSgqKChjb25zdCB1aW50OF90ICopKHApICsgMikpIDw8IDApKSkKKworI2RlZmluZSBFWFRSQUNUXzQwQklUUyhwKSBcCisJKCh1aW50NjRfdCkoKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDApKSA8PCAzMikgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDEpKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDIpKSA8PCAxNikgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDMpKSA8PCA4KSB8IFwKKwkgICAgICAgICAgICAoKHVpbnQ2NF90KSgqKChjb25zdCB1aW50OF90ICopKHApICsgNCkpIDw8IDApKSkKKworI2RlZmluZSBFWFRSQUNUXzQ4QklUUyhwKSBcCisJKCh1aW50NjRfdCkoKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDApKSA8PCA0MCkgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDEpKSA8PCAzMikgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDIpKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDMpKSA8PCAxNikgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDQpKSA8PCA4KSB8IFwKKwkgICAgICAgICAgICAoKHVpbnQ2NF90KSgqKChjb25zdCB1aW50OF90ICopKHApICsgNSkpIDw8IDApKSkKKworI2RlZmluZSBFWFRSQUNUXzU2QklUUyhwKSBcCisJKCh1aW50NjRfdCkoKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDApKSA8PCA0OCkgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDEpKSA8PCA0MCkgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDIpKSA8PCAzMikgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDMpKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDQpKSA8PCAxNikgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDUpKSA8PCA4KSB8IFwKKwkgICAgICAgICAgICAoKHVpbnQ2NF90KSgqKChjb25zdCB1aW50OF90ICopKHApICsgNikpIDw8IDApKSkKKworLyoKKyAqIE1hY3JvcyB0byBleHRyYWN0IHBvc3NpYmx5LXVuYWxpZ25lZCBsaXR0bGUtZW5kaWFuIGludGVncmFsIHZhbHVlcy4KKyAqIFhYWCAtIGRvIGxvYWRzIG9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMgdGhhdCBzdXBwb3J0IHVuYWxpZ25lZCBsb2Fkcz8KKyAqLworI2RlZmluZSBFWFRSQUNUX0xFXzhCSVRTKHApICgqKHApKQorI2RlZmluZSBFWFRSQUNUX0xFXzE2QklUUyhwKSBcCisJKCh1aW50MTZfdCkoKCh1aW50MTZfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDEpKSA8PCA4KSB8IFwKKwkgICAgICAgICAgICAoKHVpbnQxNl90KSgqKChjb25zdCB1aW50OF90ICopKHApICsgMCkpIDw8IDApKSkKKyNkZWZpbmUgRVhUUkFDVF9MRV8zMkJJVFMocCkgXAorCSgodWludDMyX3QpKCgodWludDMyX3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyAzKSkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICgodWludDMyX3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyAyKSkgPDwgMTYpIHwgXAorCSAgICAgICAgICAgICgodWludDMyX3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyAxKSkgPDwgOCkgfCBcCisJICAgICAgICAgICAgKCh1aW50MzJfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDApKSA8PCAwKSkpCisjZGVmaW5lIEVYVFJBQ1RfTEVfMjRCSVRTKHApIFwKKwkoKHVpbnQzMl90KSgoKHVpbnQzMl90KSgqKChjb25zdCB1aW50OF90ICopKHApICsgMikpIDw8IDE2KSB8IFwKKwkgICAgICAgICAgICAoKHVpbnQzMl90KSgqKChjb25zdCB1aW50OF90ICopKHApICsgMSkpIDw8IDgpIHwgXAorCSAgICAgICAgICAgICgodWludDMyX3QpKCooKGNvbnN0IHVpbnQ4X3QgKikocCkgKyAwKSkgPDwgMCkpKQorI2RlZmluZSBFWFRSQUNUX0xFXzY0QklUUyhwKSBcCisJKCh1aW50NjRfdCkoKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDcpKSA8PCA1NikgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDYpKSA8PCA0OCkgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDUpKSA8PCA0MCkgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDQpKSA8PCAzMikgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDMpKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDIpKSA8PCAxNikgfCBcCisJICAgICAgICAgICAgKCh1aW50NjRfdCkoKigoY29uc3QgdWludDhfdCAqKShwKSArIDEpKSA8PCA4KSB8IFwKKwkgICAgICAgICAgICAoKHVpbnQ2NF90KSgqKChjb25zdCB1aW50OF90ICopKHApICsgMCkpIDw8IDApKSkKZGlmZiAtLWdpdCBhL2ZhZC1nZXRhZC5jIGIvZmFkLWdldGFkLmMKaW5kZXggNmZkMzM2MC4uYjY3YjVjZCAxMDA2NDQKLS0tIGEvZmFkLWdldGFkLmMKKysrIGIvZmFkLWdldGFkLmMKQEAgLTE0NCw3ICsxNDQsOCBAQAogICogY291bGQgYmUgb3BlbmVkLgogICovCiBpbnQKLXBjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQorcGNhcF9maW5kYWxsZGV2c19pbnRlcmZhY2VzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYsCisgICAgaW50ICgqY2hlY2tfdXNhYmxlKShjb25zdCBjaGFyICopKQogewogCXBjYXBfaWZfdCAqZGV2bGlzdCA9IE5VTEw7CiAJc3RydWN0IGlmYWRkcnMgKmlmYXAsICppZmE7CkBAIC0xNjgsMTIgKzE2OSw1MSBAQAogCSAqIHRob3NlLgogCSAqLwogCWlmIChnZXRpZmFkZHJzKCZpZmFwKSAhPSAwKSB7Ci0JCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiZ2V0aWZhZGRyczogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KIAlmb3IgKGlmYSA9IGlmYXA7IGlmYSAhPSBOVUxMOyBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7CiAJCS8qCisJCSAqIElmIHRoaXMgZW50cnkgaGFzIGEgY29sb24gZm9sbG93ZWQgYnkgYSBudW1iZXIgYXQKKwkJICogdGhlIGVuZCwgd2UgYXNzdW1lIGl0J3MgYSBsb2dpY2FsIGludGVyZmFjZS4gIFRob3NlCisJCSAqIGFyZSBqdXN0IHRoZSB3YXkgeW91IGFzc2lnbiBtdWx0aXBsZSBJUCBhZGRyZXNzZXMgdG8KKwkJICogYSByZWFsIGludGVyZmFjZSBvbiBMaW51eCwgc28gYW4gZW50cnkgZm9yIGEgbG9naWNhbAorCQkgKiBpbnRlcmZhY2Ugc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSB0aGUgZW50cnkgZm9yIHRoZQorCQkgKiByZWFsIGludGVyZmFjZTsgd2UgZG8gdGhhdCBieSBzdHJpcHBpbmcgb2ZmIHRoZSAiOiIKKwkJICogYW5kIHRoZSBudW1iZXIuCisJCSAqCisJCSAqIFhYWCAtIHNob3VsZCB3ZSBkbyB0aGlzIG9ubHkgb24gTGludXg/CisJCSAqLworCQlwID0gc3RyY2hyKGlmYS0+aWZhX25hbWUsICc6Jyk7CisJCWlmIChwICE9IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGEgIjoiOyBpcyBpdCBmb2xsb3dlZCBieSBhIG51bWJlcj8KKwkJCSAqLworCQkJcSA9IHAgKyAxOworCQkJd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKnEpKQorCQkJCXErKzsKKwkJCWlmICgqcSA9PSAnXDAnKSB7CisJCQkJLyoKKwkJCQkgKiBBbGwgZGlnaXRzIGFmdGVyIHRoZSAiOiIgdW50aWwgdGhlIGVuZC4KKwkJCQkgKiBTdHJpcCBvZmYgdGhlICI6IiBhbmQgZXZlcnl0aGluZyBhZnRlcgorCQkJCSAqIGl0LgorCQkJCSAqLworCQkJICAgICAgICpwID0gJ1wwJzsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIENhbiB3ZSBjYXB0dXJlIG9uIHRoaXMgZGV2aWNlPworCQkgKi8KKwkJaWYgKCEoKmNoZWNrX3VzYWJsZSkoaWZhLT5pZmFfbmFtZSkpIHsKKwkJCS8qCisJCQkgKiBOby4KKwkJCSAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKgogCQkgKiAiaWZhX2FkZHIiIHdhcyBhcHBhcmVudGx5IG51bGwgb24gYXQgbGVhc3Qgb25lCiAJCSAqIGludGVyZmFjZSBvbiBzb21lIHN5c3RlbS4gIFRoZXJlZm9yZSwgd2Ugc3VwcGx5CiAJCSAqIHRoZSBhZGRyZXNzIGFuZCBuZXRtYXNrIG9ubHkgaWYgImlmYV9hZGRyIiBpcwpAQCAtMjIzLDM5ICsyNjMsMTEgQEAKIAkJfQogCiAJCS8qCi0JCSAqIElmIHRoaXMgZW50cnkgaGFzIGEgY29sb24gZm9sbG93ZWQgYnkgYSBudW1iZXIgYXQKLQkJICogdGhlIGVuZCwgd2UgYXNzdW1lIGl0J3MgYSBsb2dpY2FsIGludGVyZmFjZS4gIFRob3NlCi0JCSAqIGFyZSBqdXN0IHRoZSB3YXkgeW91IGFzc2lnbiBtdWx0aXBsZSBJUCBhZGRyZXNzZXMgdG8KLQkJICogYSByZWFsIGludGVyZmFjZSBvbiBMaW51eCwgc28gYW4gZW50cnkgZm9yIGEgbG9naWNhbAotCQkgKiBpbnRlcmZhY2Ugc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSB0aGUgZW50cnkgZm9yIHRoZQotCQkgKiByZWFsIGludGVyZmFjZTsgd2UgZG8gdGhhdCBieSBzdHJpcHBpbmcgb2ZmIHRoZSAiOiIKLQkJICogYW5kIHRoZSBudW1iZXIuCi0JCSAqCi0JCSAqIFhYWCAtIHNob3VsZCB3ZSBkbyB0aGlzIG9ubHkgb24gTGludXg/Ci0JCSAqLwotCQlwID0gc3RyY2hyKGlmYS0+aWZhX25hbWUsICc6Jyk7Ci0JCWlmIChwICE9IE5VTEwpIHsKLQkJCS8qCi0JCQkgKiBXZSBoYXZlIGEgIjoiOyBpcyBpdCBmb2xsb3dlZCBieSBhIG51bWJlcj8KLQkJCSAqLwotCQkJcSA9IHAgKyAxOwotCQkJd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKnEpKQotCQkJCXErKzsKLQkJCWlmICgqcSA9PSAnXDAnKSB7Ci0JCQkJLyoKLQkJCQkgKiBBbGwgZGlnaXRzIGFmdGVyIHRoZSAiOiIgdW50aWwgdGhlIGVuZC4KLQkJCQkgKiBTdHJpcCBvZmYgdGhlICI6IiBhbmQgZXZlcnl0aGluZyBhZnRlcgotCQkJCSAqIGl0LgotCQkJCSAqLwotCQkJICAgICAgICpwID0gJ1wwJzsKLQkJCX0KLQkJfQotCi0JCS8qCiAJCSAqIEFkZCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBhZGRyZXNzIHRvIHRoZSBsaXN0LgogCQkgKi8KIAkJaWYgKGFkZF9hZGRyX3RvX2lmbGlzdCgmZGV2bGlzdCwgaWZhLT5pZmFfbmFtZSwKLQkJICAgIGlmYS0+aWZhX2ZsYWdzLCBhZGRyLCBhZGRyX3NpemUsIG5ldG1hc2ssIGFkZHJfc2l6ZSwKKwkJICAgIGlmX2ZsYWdzX3RvX3BjYXBfZmxhZ3MoaWZhLT5pZmFfbmFtZSwgaWZhLT5pZmFfZmxhZ3MpLAorCQkgICAgYWRkciwgYWRkcl9zaXplLCBuZXRtYXNrLCBhZGRyX3NpemUsCiAJCSAgICBicm9hZGFkZHIsIGJyb2FkYWRkcl9zaXplLCBkc3RhZGRyLCBkc3RhZGRyX3NpemUsCiAJCSAgICBlcnJidWYpIDwgMCkgewogCQkJcmV0ID0gLTE7CmRpZmYgLS1naXQgYS9mYWQtZ2lmYy5jIGIvZmFkLWdpZmMuYwppbmRleCBiMGE0MTA1Li4xYjI0YWYyIDEwMDY0NAotLS0gYS9mYWQtZ2lmYy5jCisrKyBiL2ZhZC1naWZjLmMKQEAgLTEzMiwxMiArMTMyLDEzIEBACiAgKiB3ZSBhbHJlYWR5IGhhdmUgdGhhdC4KICAqLwogaW50Ci1wY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKK3BjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmLAorICAgIGludCAoKmNoZWNrX3VzYWJsZSkoY29uc3QgY2hhciAqKSkKIHsKIAlwY2FwX2lmX3QgKmRldmxpc3QgPSBOVUxMOwogCXJlZ2lzdGVyIGludCBmZDsKIAlyZWdpc3RlciBzdHJ1Y3QgaWZyZXEgKmlmcnAsICppZmVuZCwgKmlmbmV4dDsKLQlpbnQgbjsKKwlzaXplX3QgbjsKIAlzdHJ1Y3QgaWZjb25mIGlmYzsKIAljaGFyICpidWYgPSBOVUxMOwogCXVuc2lnbmVkIGJ1Zl9zaXplOwpAQCAtMTU0LDcgKzE1NSw3IEBACiAJICovCiAJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CiAJaWYgKGZkIDwgMCkgewotCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgInNvY2tldDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTE3MCw3ICsxNzEsNyBAQAogCWZvciAoOzspIHsKIAkJYnVmID0gbWFsbG9jKGJ1Zl9zaXplKTsKIAkJaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCSh2b2lkKWNsb3NlKGZkKTsKIAkJCXJldHVybiAoLTEpOwpAQCAtMTgxLDcgKzE4Miw3IEBACiAJCW1lbXNldChidWYsIDAsIGJ1Zl9zaXplKTsKIAkJaWYgKGlvY3RsKGZkLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDAKIAkJICAgICYmIGVycm5vICE9IEVJTlZBTCkgewotCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIlNJT0NHSUZDT05GOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCSh2b2lkKWNsb3NlKGZkKTsKIAkJCWZyZWUoYnVmKTsKQEAgLTIzNyw2ICsyMzgsMTYgQEAKIAkJCWNvbnRpbnVlOwogCiAJCS8qCisJCSAqIENhbiB3ZSBjYXB0dXJlIG9uIHRoaXMgZGV2aWNlPworCQkgKi8KKwkJaWYgKCEoKmNoZWNrX3VzYWJsZSkoaWZycC0+aWZyX25hbWUpKSB7CisJCQkvKgorCQkJICogTm8uCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKIAkJICogR2V0IHRoZSBmbGFncyBmb3IgdGhpcyBpbnRlcmZhY2UuCiAJCSAqLwogCQlzdHJuY3B5KGlmcmZsYWdzLmlmcl9uYW1lLCBpZnJwLT5pZnJfbmFtZSwKQEAgLTI0NCw3ICsyNTUsNyBAQAogCQlpZiAoaW9jdGwoZmQsIFNJT0NHSUZGTEFHUywgKGNoYXIgKikmaWZyZmxhZ3MpIDwgMCkgewogCQkJaWYgKGVycm5vID09IEVOWElPKQogCQkJCWNvbnRpbnVlOwotCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIlNJT0NHSUZGTEFHUzogJS4qczogJXMiLAogCQkJICAgIChpbnQpc2l6ZW9mKGlmcmZsYWdzLmlmcl9uYW1lKSwKIAkJCSAgICBpZnJmbGFncy5pZnJfbmFtZSwKQEAgLTI2OCw3ICsyNzksNyBAQAogCQkJCW5ldG1hc2sgPSBOVUxMOwogCQkJCW5ldG1hc2tfc2l6ZSA9IDA7CiAJCQl9IGVsc2UgewotCQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgIlNJT0NHSUZORVRNQVNLOiAlLipzOiAlcyIsCiAJCQkJICAgIChpbnQpc2l6ZW9mKGlmcm5ldG1hc2suaWZyX25hbWUpLAogCQkJCSAgICBpZnJuZXRtYXNrLmlmcl9uYW1lLApAQCAtMjk5LDcgKzMxMCw3IEBACiAJCQkJCWJyb2FkYWRkciA9IE5VTEw7CiAJCQkJCWJyb2FkYWRkcl9zaXplID0gMDsKIAkJCQl9IGVsc2UgewotCQkJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCQkgICAgIlNJT0NHSUZCUkRBRERSOiAlLipzOiAlcyIsCiAJCQkJCSAgICAoaW50KXNpemVvZihpZnJicm9hZGFkZHIuaWZyX25hbWUpLAogCQkJCQkgICAgaWZyYnJvYWRhZGRyLmlmcl9uYW1lLApAQCAtMzM4LDcgKzM0OSw3IEBACiAJCQkJCWRzdGFkZHIgPSBOVUxMOwogCQkJCQlkc3RhZGRyX3NpemUgPSAwOwogCQkJCX0gZWxzZSB7Ci0JCQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJCSAgICAiU0lPQ0dJRkRTVEFERFI6ICUuKnM6ICVzIiwKIAkJCQkJICAgIChpbnQpc2l6ZW9mKGlmcmRzdGFkZHIuaWZyX25hbWUpLAogCQkJCQkgICAgaWZyZHN0YWRkci5pZnJfbmFtZSwKQEAgLTM5MSwxMCArNDAyLDEwIEBACiAJCSAqIEFkZCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBhZGRyZXNzIHRvIHRoZSBsaXN0LgogCQkgKi8KIAkJaWYgKGFkZF9hZGRyX3RvX2lmbGlzdCgmZGV2bGlzdCwgaWZycC0+aWZyX25hbWUsCi0JCSAgICBpZnJmbGFncy5pZnJfZmxhZ3MsICZpZnJwLT5pZnJfYWRkciwKLQkJICAgIFNBX0xFTigmaWZycC0+aWZyX2FkZHIpLCBuZXRtYXNrLCBuZXRtYXNrX3NpemUsCi0JCSAgICBicm9hZGFkZHIsIGJyb2FkYWRkcl9zaXplLCBkc3RhZGRyLCBkc3RhZGRyX3NpemUsCi0JCSAgICBlcnJidWYpIDwgMCkgeworCQkgICAgaWZfZmxhZ3NfdG9fcGNhcF9mbGFncyhpZnJwLT5pZnJfbmFtZSwgaWZyZmxhZ3MuaWZyX2ZsYWdzKSwKKwkJICAgICZpZnJwLT5pZnJfYWRkciwgU0FfTEVOKCZpZnJwLT5pZnJfYWRkciksCisJCSAgICBuZXRtYXNrLCBuZXRtYXNrX3NpemUsIGJyb2FkYWRkciwgYnJvYWRhZGRyX3NpemUsCisJCSAgICBkc3RhZGRyLCBkc3RhZGRyX3NpemUsIGVycmJ1ZikgPCAwKSB7CiAJCQlyZXQgPSAtMTsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9mYWQtZ2xpZmMuYyBiL2ZhZC1nbGlmYy5jCmluZGV4IDFhODIwYWQuLjUxMTQ4MWMgMTAwNjQ0Ci0tLSBhL2ZhZC1nbGlmYy5jCisrKyBiL2ZhZC1nbGlmYy5jCkBAIC03NSw3ICs3NSw4IEBACiAgKiBTSU9DR0xJRkNPTkYgcmF0aGVyIHRoYW4gU0lPQ0dJRkNPTkYgaW4gb3JkZXIgdG8gZ2V0IElQdjYgYWRkcmVzc2VzLikKICAqLwogaW50Ci1wY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKK3BjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmLAorICAgIGludCAoKmNoZWNrX3VzYWJsZSkoY29uc3QgY2hhciAqKSkKIHsKIAlwY2FwX2lmX3QgKmRldmxpc3QgPSBOVUxMOwogCXJlZ2lzdGVyIGludCBmZDQsIGZkNiwgZmQ7CkBAIC05Nyw3ICs5OCw3IEBACiAJICovCiAJZmQ0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwogCWlmIChmZDQgPCAwKSB7Ci0JCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAic29ja2V0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQpAQCAtMTA3LDcgKzEwOCw3IEBACiAJICovCiAJZmQ2ID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKIAlpZiAoZmQ2IDwgMCkgewotCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgInNvY2tldDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCSh2b2lkKWNsb3NlKGZkNCk7CiAJCXJldHVybiAoLTEpOwpAQCAtMTIwLDcgKzEyMSw3IEBACiAJaWZuLmxpZm5fZmxhZ3MgPSAwOwogCWlmbi5saWZuX2NvdW50ID0gMDsKIAlpZiAoaW9jdGwoZmQ0LCBTSU9DR0xJRk5VTSwgKGNoYXIgKikmaWZuKSA8IDApIHsKLQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJTSU9DR0xJRk5VTTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCSh2b2lkKWNsb3NlKGZkNik7CiAJCSh2b2lkKWNsb3NlKGZkNCk7CkBAIC0xMzMsNyArMTM0LDcgQEAKIAlidWZfc2l6ZSA9IGlmbi5saWZuX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbGlmcmVxKTsKIAlidWYgPSBtYWxsb2MoYnVmX3NpemUpOwogCWlmIChidWYgPT0gTlVMTCkgewotCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCSh2b2lkKWNsb3NlKGZkNik7CiAJCSh2b2lkKWNsb3NlKGZkNCk7CkBAIC0xNDksNyArMTUwLDcgQEAKIAlpZmMubGlmY19mbGFncyA9IDA7CiAJbWVtc2V0KGJ1ZiwgMCwgYnVmX3NpemUpOwogCWlmIChpb2N0bChmZDQsIFNJT0NHTElGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDApIHsKLQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJTSU9DR0xJRkNPTkY6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkodm9pZCljbG9zZShmZDYpOwogCQkodm9pZCljbG9zZShmZDQpOwpAQCAtMTY1LDE0ICsxNjYsNiBAQAogCiAJZm9yICg7IGlmcnAgPCBpZmVuZDsgaWZycCsrKSB7CiAJCS8qCi0JCSAqIElQdjYgb3Igbm90PwotCQkgKi8KLQkJaWYgKCgoc3RydWN0IHNvY2thZGRyICopJmlmcnAtPmxpZnJfYWRkciktPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJCWZkID0gZmQ2OwotCQllbHNlCi0JCQlmZCA9IGZkNDsKLQotCQkvKgogCQkgKiBTa2lwIGVudHJpZXMgdGhhdCBiZWdpbiB3aXRoICJkdW1teSIuCiAJCSAqIFhYWCAtIHdoYXQgYXJlIHRoZXNlPyAgSXMgdGhpcyBMaW51eC1zcGVjaWZpYz8KIAkJICogQXJlIHRoZXJlIHBsYXRmb3JtcyBvbiB3aGljaCB3ZSBzaG91bGRuJ3QgZG8gdGhpcz8KQEAgLTE4MCwyNyArMTczLDIzIEBACiAJCWlmIChzdHJuY21wKGlmcnAtPmxpZnJfbmFtZSwgImR1bW15IiwgNSkgPT0gMCkKIAkJCWNvbnRpbnVlOwogCi0jaWZkZWYgSEFWRV9TT0xBUklTCiAJCS8qCi0JCSAqIFNraXAgZW50cmllcyB0aGF0IGhhdmUgYSAiOiIgZm9sbG93ZWQgYnkgYSBudW1iZXIKLQkJICogYXQgdGhlIGVuZCAtIHRob3NlIGFyZSBTb2xhcmlzIHZpcnR1YWwgaW50ZXJmYWNlcwotCQkgKiBvbiB3aGljaCB5b3UgY2FuJ3QgY2FwdHVyZS4KKwkJICogQ2FuIHdlIGNhcHR1cmUgb24gdGhpcyBkZXZpY2U/CiAJCSAqLwotCQlwID0gc3RyY2hyKGlmcnAtPmxpZnJfbmFtZSwgJzonKTsKLQkJaWYgKHAgIT0gTlVMTCkgeworCQlpZiAoISgqY2hlY2tfdXNhYmxlKShpZnJwLT5saWZyX25hbWUpKSB7CiAJCQkvKgotCQkJICogV2UgaGF2ZSBhICI6IjsgaXMgaXQgZm9sbG93ZWQgYnkgYSBudW1iZXI/CisJCQkgKiBOby4KIAkJCSAqLwotCQkJd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKnApKQotCQkJCXArKzsKLQkJCWlmICgqcCA9PSAnXDAnKSB7Ci0JCQkJLyoKLQkJCQkgKiBBbGwgZGlnaXRzIGFmdGVyIHRoZSAiOiIgdW50aWwgdGhlIGVuZC4KLQkJCQkgKi8KLQkJCQljb250aW51ZTsKLQkJCX0KKwkJCWNvbnRpbnVlOwogCQl9Ci0jZW5kaWYKKworCQkvKgorCQkgKiBJUHY2IG9yIG5vdD8KKwkJICovCisJCWlmICgoKHN0cnVjdCBzb2NrYWRkciAqKSZpZnJwLT5saWZyX2FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCQlmZCA9IGZkNjsKKwkJZWxzZQorCQkJZmQgPSBmZDQ7CiAKIAkJLyoKIAkJICogR2V0IHRoZSBmbGFncyBmb3IgdGhpcyBpbnRlcmZhY2UuCkBAIC0yMTAsNyArMTk5LDcgQEAKIAkJaWYgKGlvY3RsKGZkLCBTSU9DR0xJRkZMQUdTLCAoY2hhciAqKSZpZnJmbGFncykgPCAwKSB7CiAJCQlpZiAoZXJybm8gPT0gRU5YSU8pCiAJCQkJY29udGludWU7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiU0lPQ0dMSUZGTEFHUzogJS4qczogJXMiLAogCQkJICAgIChpbnQpc2l6ZW9mKGlmcmZsYWdzLmxpZnJfbmFtZSksCiAJCQkgICAgaWZyZmxhZ3MubGlmcl9uYW1lLApAQCAtMjMzLDcgKzIyMiw3IEBACiAJCQkJICovCiAJCQkJbmV0bWFzayA9IE5VTEw7CiAJCQl9IGVsc2UgewotCQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgIlNJT0NHTElGTkVUTUFTSzogJS4qczogJXMiLAogCQkJCSAgICAoaW50KXNpemVvZihpZnJuZXRtYXNrLmxpZnJfbmFtZSksCiAJCQkJICAgIGlmcm5ldG1hc2subGlmcl9uYW1lLApAQCAtMjYxLDcgKzI1MCw3IEBACiAJCQkJCSAqLwogCQkJCQlicm9hZGFkZHIgPSBOVUxMOwogCQkJCX0gZWxzZSB7Ci0JCQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJCSAgICAiU0lPQ0dMSUZCUkRBRERSOiAlLipzOiAlcyIsCiAJCQkJCSAgICAoaW50KXNpemVvZihpZnJicm9hZGFkZHIubGlmcl9uYW1lKSwKIAkJCQkJICAgIGlmcmJyb2FkYWRkci5saWZyX25hbWUsCkBAIC0yOTYsNyArMjg1LDcgQEAKIAkJCQkJICovCiAJCQkJCWRzdGFkZHIgPSBOVUxMOwogCQkJCX0gZWxzZSB7Ci0JCQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJCSAgICAiU0lPQ0dMSUZEU1RBRERSOiAlLipzOiAlcyIsCiAJCQkJCSAgICAoaW50KXNpemVvZihpZnJkc3RhZGRyLmxpZnJfbmFtZSksCiAJCQkJCSAgICBpZnJkc3RhZGRyLmxpZnJfbmFtZSwKQEAgLTM0MSw3ICszMzAsOCBAQAogCQkgKiBBZGQgaW5mb3JtYXRpb24gZm9yIHRoaXMgYWRkcmVzcyB0byB0aGUgbGlzdC4KIAkJICovCiAJCWlmIChhZGRfYWRkcl90b19pZmxpc3QoJmRldmxpc3QsIGlmcnAtPmxpZnJfbmFtZSwKLQkJICAgIGlmcmZsYWdzLmxpZnJfZmxhZ3MsIChzdHJ1Y3Qgc29ja2FkZHIgKikmaWZycC0+bGlmcl9hZGRyLAorCQkgICAgaWZfZmxhZ3NfdG9fcGNhcF9mbGFncyhpZnJwLT5saWZyX25hbWUsIGlmcmZsYWdzLmxpZnJfZmxhZ3MpLAorCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZpZnJwLT5saWZyX2FkZHIsCiAJCSAgICBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSwKIAkJICAgIG5ldG1hc2ssIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpLAogCQkgICAgYnJvYWRhZGRyLCBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSwKZGlmZiAtLWdpdCBhL2ZhZC1oZWxwZXJzLmMgYi9mYWQtaGVscGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjBiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9mYWQtaGVscGVycy5jCkBAIC0wLDAgKzEsODg0IEBACisvKiAtKi0gTW9kZTogYzsgdGFiLXdpZHRoOiA4OyBpbmRlbnQtdGFicy1tb2RlOiAxOyBjLWJhc2ljLW9mZnNldDogODsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcworICoJRW5naW5lZXJpbmcgR3JvdXAgYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIG9mIHRoZSBMYWJvcmF0b3J5IG1heSBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KKyNlbHNlIC8qIF9XSU4zMiAqLworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaWZuZGVmIE1TRE9TCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLSU9fSAorI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KKyNlbmRpZgorCitzdHJ1Y3QgbWJ1ZjsJCS8qIFNxdWVsY2ggY29tcGlsZXIgd2FybmluZ3Mgb24gc29tZSBwbGF0Zm9ybXMgZm9yICovCitzdHJ1Y3QgcnRlbnRyeTsJCS8qIGRlY2xhcmF0aW9ucyBpbiA8bmV0L2lmLmg+ICovCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmIC8qIF9XSU4zMiAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYgLyogIV9XSU4zMiAmJiAhX19CT1JMQU5EQ19fICovCisjaWZkZWYgSEFWRV9MSU1JVFNfSAorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyNkZWZpbmUgSU5UX01BWAkJMjE0NzQ4MzY0NworI2VuZGlmCisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaWZkZWYgSEFWRV9PU19QUk9UT19ICisjaW5jbHVkZSAib3MtcHJvdG8uaCIKKyNlbmRpZgorCisjaWZuZGVmIF9XSU4zMgorLyogTm90IGFsbCBzeXN0ZW1zIGhhdmUgSUZGX0xPT1BCQUNLICovCisjaWZkZWYgSUZGX0xPT1BCQUNLCisjZGVmaW5lIElTTE9PUEJBQ0sobmFtZSwgZmxhZ3MpICgoZmxhZ3MpICYgSUZGX0xPT1BCQUNLKQorI2Vsc2UKKyNkZWZpbmUgSVNMT09QQkFDSyhuYW1lLCBmbGFncykgKChuYW1lKVswXSA9PSAnbCcgJiYgKG5hbWUpWzFdID09ICdvJyAmJiBcCisgICAgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKChuYW1lKVsyXSkpIHx8IChuYW1lKVsyXSA9PSAnXDAnKSkKKyNlbmRpZgorCisjaWZkZWYgSUZGX1VQCisjZGVmaW5lIElTVVAoZmxhZ3MpICgoZmxhZ3MpICYgSUZGX1VQKQorI2Vsc2UKKyNkZWZpbmUgSVNVUChmbGFncykgMAorI2VuZGlmCisKKyNpZmRlZiBJRkZfUlVOTklORworI2RlZmluZSBJU1JVTk5JTkcoZmxhZ3MpICgoZmxhZ3MpICYgSUZGX1JVTk5JTkcpCisjZWxzZQorI2RlZmluZSBJU1JVTk5JTkcoZmxhZ3MpIDAKKyNlbmRpZgorCisvKgorICogTWFwIFVOKlgtc3R5bGUgaW50ZXJmYWNlIGZsYWdzIHRvIGxpYnBjYXAgZmxhZ3MuCisgKi8KK2JwZl91X2ludDMyCitpZl9mbGFnc190b19wY2FwX2ZsYWdzKGNvbnN0IGNoYXIgKm5hbWUgX1VfLCB1X2ludCBpZl9mbGFncykKK3sKKwlicGZfdV9pbnQzMiBwY2FwX2ZsYWdzOworCisJcGNhcF9mbGFncyA9IDA7CisJaWYgKElTTE9PUEJBQ0sobmFtZSwgaWZfZmxhZ3MpKQorCQlwY2FwX2ZsYWdzIHw9IFBDQVBfSUZfTE9PUEJBQ0s7CisJaWYgKElTVVAoaWZfZmxhZ3MpKQorCQlwY2FwX2ZsYWdzIHw9IFBDQVBfSUZfVVA7CisJaWYgKElTUlVOTklORyhpZl9mbGFncykpCisJCXBjYXBfZmxhZ3MgfD0gUENBUF9JRl9SVU5OSU5HOworCXJldHVybiAocGNhcF9mbGFncyk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzb2NrYWRkciAqCitkdXBfc29ja2FkZHIoc3RydWN0IHNvY2thZGRyICpzYSwgc2l6ZV90IHNhX2xlbmd0aCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKm5ld3NhOworCisJaWYgKChuZXdzYSA9IG1hbGxvYyhzYV9sZW5ndGgpKSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCXJldHVybiAobWVtY3B5KG5ld3NhLCBzYSwgc2FfbGVuZ3RoKSk7Cit9CisKKy8qCisgKiBDb25zdHJ1Y3QgYSAiZmlndXJlIG9mIG1lcml0IiBmb3IgYW4gaW50ZXJmYWNlLCBmb3IgdXNlIHdoZW4gc29ydGluZworICogdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcywgaW4gd2hpY2ggaW50ZXJmYWNlcyB0aGF0IGFyZSB1cCBhcmUgc3VwZXJpb3IKKyAqIHRvIGludGVyZmFjZXMgdGhhdCBhcmVuJ3QgdXAsIGludGVyZmFjZXMgdGhhdCBhcmUgdXAgYW5kIHJ1bm5pbmcgYXJlCisgKiBzdXBlcmlvciB0byBpbnRlcmZhY2VzIHRoYXQgYXJlIHVwIGJ1dCBub3QgcnVubmluZywgYW5kIG5vbi1sb29wYmFjaworICogaW50ZXJmYWNlcyB0aGF0IGFyZSB1cCBhbmQgcnVubmluZyBhcmUgc3VwZXJpb3IgdG8gbG9vcGJhY2sgaW50ZXJmYWNlcywKKyAqIGFuZCBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgZmxhZ3MgaGF2ZSBhIGZpZ3VyZSBvZiBtZXJpdCB0aGF0J3MgaGlnaGVyCisgKiB0aGUgbG93ZXIgdGhlIGluc3RhbmNlIG51bWJlci4KKyAqCisgKiBUaGUgZ29hbCBpcyB0byB0cnkgdG8gcHV0IHRoZSBpbnRlcmZhY2VzIG1vc3QgbGlrZWx5IHRvIGJlIHVzZWZ1bCBmb3IKKyAqIGNhcHR1cmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4KKyAqCisgKiBUaGUgZmlndXJlIG9mIG1lcml0LCB3aGljaCBpcyBsb3dlciB0aGUgImJldHRlciIgdGhlIGludGVyZmFjZSBpcywKKyAqIGhhcyB0aGUgdXBwZXJtb3N0IGJpdCBzZXQgaWYgdGhlIGludGVyZmFjZSBpc24ndCBydW5uaW5nLCB0aGUgYml0CisgKiBiZWxvdyB0aGF0IHNldCBpZiB0aGUgaW50ZXJmYWNlIGlzbid0IHVwLCB0aGUgYml0IGJlbG93IHRoYXQgc2V0CisgKiBpZiB0aGUgaW50ZXJmYWNlIGlzIGEgbG9vcGJhY2sgaW50ZXJmYWNlLCBhbmQgdGhlIGludGVyZmFjZSBpbmRleAorICogaW4gdGhlIDI5IGJpdHMgYmVsb3cgdGhhdC4gIChZZXMsIHdlIGFzc3VtZSB1X2ludCBpcyAzMiBiaXRzLikKKyAqLworc3RhdGljIHVfaW50CitnZXRfZmlndXJlX29mX21lcml0KHBjYXBfaWZfdCAqZGV2KQoreworCWNvbnN0IGNoYXIgKmNwOworCXVfaW50IG47CisKKwlpZiAoc3RyY21wKGRldi0+bmFtZSwgImFueSIpID09IDApIHsKKwkJLyoKKwkJICogR2l2ZSB0aGUgImFueSIgZGV2aWNlIGFuIGFydGlmaWNpYWxseSBoaWdoIGluc3RhbmNlCisJCSAqIG51bWJlciwgc28gaXQgc2hvd3MgdXAgYWZ0ZXIgYWxsIG90aGVyIG5vbi1sb29wYmFjaworCQkgKiBpbnRlcmZhY2VzLgorCQkgKi8KKwkJbiA9IDB4MUZGRkZGRkY7CS8qIDI5IGFsbC0xIGJpdHMgKi8KKwl9IGVsc2UgeworCQkvKgorCQkgKiBBIG51bWJlciBhdCB0aGUgZW5kIG9mIHRoZSBkZXZpY2UgbmFtZSBzdHJpbmcgaXMKKwkJICogYXNzdW1lZCB0byBiZSBhIHVuaXQgbnVtYmVyLgorCQkgKi8KKwkJY3AgPSBkZXYtPm5hbWUgKyBzdHJsZW4oZGV2LT5uYW1lKSAtIDE7CisJCXdoaWxlIChjcC0xID49IGRldi0+bmFtZSAmJiAqKGNwLTEpID49ICcwJyAmJiAqKGNwLTEpIDw9ICc5JykKKwkJCWNwLS07CisJCWlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCisJCQluID0gYXRvaShjcCk7CisJCWVsc2UKKwkJCW4gPSAwOworCX0KKwlpZiAoIShkZXYtPmZsYWdzICYgUENBUF9JRl9SVU5OSU5HKSkKKwkJbiB8PSAweDgwMDAwMDAwOworCWlmICghKGRldi0+ZmxhZ3MgJiBQQ0FQX0lGX1VQKSkKKwkJbiB8PSAweDQwMDAwMDAwOworCWlmIChkZXYtPmZsYWdzICYgUENBUF9JRl9MT09QQkFDSykKKwkJbiB8PSAweDIwMDAwMDAwOworCXJldHVybiAobik7Cit9CisKKy8qCisgKiBUcnkgdG8gZ2V0IGEgZGVzY3JpcHRpb24gZm9yIGEgZ2l2ZW4gZGV2aWNlLgorICogUmV0dXJucyBhIG1hbGxvY2F0ZWQgZGVzY3JpcHRpb24gaWYgaXQgY291bGQgYW5kIE5VTEwgaWYgaXQgY291bGRuJ3QuCisgKgorICogWFhYIC0gb24gRnJlZUJTRHMgdGhhdCBzdXBwb3J0IGl0LCBzaG91bGQgaXQgZ2V0IHRoZSBzeXNjdGwgbmFtZWQKKyAqICJkZXYue2FkYXB0ZXIgZmFtaWx5IG5hbWV9LnthZGFwdGVyIHVuaXR9LiVkZXNjIiB0byBnZXQgYSBkZXNjcmlwdGlvbgorICogb2YgdGhlIGFkYXB0ZXI/ICBOb3RlIHRoYXQgImRldi5hbi4wLiVkZXNjIiBpcyAiQWlyb25ldCBQQzQ1MDAvUEM0ODAwIgorICogd2l0aCBteSBDaXNjbyAzNTAgY2FyZCwgc28gdGhlIG5hbWUgaXNuJ3QgZW50aXJlbHkgZGVzY3JpcHRpdmUuICBUaGUKKyAqICJkZXYuYW4uMC4lcG5waW5mbyIgaGFzIGEgYmV0dGVyIGRlc2NyaXB0aW9uLCBhbHRob3VnaCBvbmUgbWlnaHQgYXJndWUKKyAqIHRoYXQgdGhlIHByb2JsZW0gaXMgcmVhbGx5IGEgZHJpdmVyIGJ1ZyAtIGlmIGl0IGNhbiBmaW5kIG91dCB0aGF0IGl0J3MKKyAqIGEgQ2lzY28gMzQwIG9yIDM1MCwgcmF0aGVyIHRoYW4gYW4gb2xkIEFpcm9uZXQgY2FyZCwgaXQgc2hvdWxkIHVzZQorICogdGhhdCBpbiB0aGUgZGVzY3JpcHRpb24uCisgKgorICogRG8gTmV0QlNELCBEcmFnb25mbHlCU0QsIG9yIE9wZW5CU0Qgc3VwcG9ydCB0aGlzIGFzIHdlbGw/ICBGcmVlQlNECisgKiBhbmQgT3BlbkJTRCBsZXQgeW91IGdldCBhIGRlc2NyaXB0aW9uLCBidXQgaXQncyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBPUywKKyAqIGl0J3Mgc2V0IHdpdGggYW5vdGhlciBpb2N0bCB0aGF0IGlmY29uZmlnIHN1cHBvcnRzOyB3ZSB1c2UgdGhhdCB0byBnZXQKKyAqIGEgZGVzY3JpcHRpb24gaW4gRnJlZUJTRCBhbmQgT3BlbkJTRCwgYnV0IGlmIHRoZXJlIGlzIG5vIHN1Y2gKKyAqIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSwgaXQgc3RpbGwgbWlnaHQgYmUgbmljZSB0byBnZXQgc29tZSBkZXNjcmlwdGlvbgorICogc3RyaW5nIGJhc2VkIG9uIHRoZSBkZXZpY2UgdHlwZSBvciBzb21ldGhpbmcgc3VjaCBhcyB0aGF0LgorICoKKyAqIEluIE9TIFgsIHRoZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBmcmFtZXdvcmsgY2FuIGFwcGFyZW50bHkgcmV0dXJuCisgKiBuYW1lcyBpbiAxMC40IGFuZCBsYXRlci4KKyAqCisgKiBJdCBhbHNvIGFwcGVhcnMgdGhhdCBmcmVlZGVza3RvcC5vcmcncyBIQUwgb2ZmZXJzIGFuICJpbmZvLnByb2R1Y3QiCisgKiBzdHJpbmcsIGJ1dCB0aGUgSEFMIHNwZWNpZmljYXRpb24gc2F5cyBpdCAic2hvdWxkIG5vdCBiZSB1c2VkIGluIGFueQorICogVUkiIGFuZCAic3Vic3lzdGVtL2NhcGFiaWxpdHkgc3BlY2lmaWMgcHJvcGVydGllcyIgc2hvdWxkIGJlIHVzZWQKKyAqIGluc3RlYWQgYW5kLCBpbiBhbnkgY2FzZSwgSSB0aGluayBIQUwgaXMgYmVpbmcgZGVwcmVjYXRlZCBpbgorICogZmF2b3Igb2Ygb3RoZXIgc3R1ZmYgc3VjaCBhcyBEZXZpY2VLaXQuICBEZXZpY2VLaXQgZG9lc24ndCBhcHBlYXIKKyAqIHRvIGhhdmUgYW55IG9idmlvdXMgcHJvZHVjdCBpbmZvcm1hdGlvbiBmb3IgZGV2aWNlcywgYnV0IG1heWJlCisgKiBJIGhhdmVuJ3QgbG9va2VkIGhhcmQgZW5vdWdoLgorICoKKyAqIFVzaW5nIHRoZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBmcmFtZXdvcmssIG9yIEhBTCwgb3IgRGV2aWNlS2l0LCBvcgorICogd2hhdGV2ZXIsIHdvdWxkIHJlcXVpcmUgdGhhdCBsaWJwY2FwIGFwcGxpY2F0aW9ucyBiZSBsaW5rZWQgd2l0aAorICogdGhlIGZyYW1ld29ya3MvbGlicmFyaWVzIGluIHF1ZXN0aW9uLiAgVGhhdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtCisgKiBmb3IgcHJvZ3JhbXMgbGlua2luZyB3aXRoIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiBsaWJwY2FwICh1bmxlc3MKKyAqIHlvdSdyZSBydW5uaW5nIG9uIEFJWCAtIHdoaWNoIEkgdGhpbmsgaXMgdGhlIG9ubHkgVU4qWCB0aGF0IGRvZXNuJ3QKKyAqIHN1cHBvcnQgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5IHdpdGggb3RoZXIgbGlicmFyaWVzIG9uIHdoaWNoIGl0CisgKiBkZXBlbmRzLCBhbmQgaGF2aW5nIGFuIGV4ZWN1dGFibGUgbGlua2VkIG9ubHkgd2l0aCB0aGUgZmlyc3Qgc2hhcmVkCisgKiBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgcGljayB1cCB0aGUgb3RoZXIgbGlicmFyaWVzIHdoZW4gc3RhcnRlZCAtCisgKiBhbmQgdXNpbmcgSEFMIG9yIHdoYXRldmVyKS4gIFByb2dyYW1zIGxpbmtlZCB3aXRoIHRoZSBzdGF0aWMKKyAqIHZlcnNpb24gb2YgbGlicGNhcCB3b3VsZCBoYXZlIHRvIHVzZSBwY2FwLWNvbmZpZyB3aXRoIHRoZSAtLXN0YXRpYworICogZmxhZyBpbiBvcmRlciB0byBnZXQgdGhlIHJpZ2h0IGxpbmtlciBmbGFncyBpbiBvcmRlciB0byBwaWNrIHVwCisgKiB0aGUgYWRkaXRpb25hbCBsaWJyYXJpZXMvZnJhbWV3b3JrczsgdGhvc2UgcHJvZ3JhbXMgbmVlZCB0aGF0IGFueXdheQorICogZm9yIGxpYnBjYXAgMS4xIGFuZCBiZXlvbmQgb24gTGludXgsIGFzLCBieSBkZWZhdWx0LCBpdCByZXF1aXJlcworICogLWxubC4KKyAqCisgKiBEbyBhbnkgb3RoZXIgVU4qWGVzLCBvciBkZXNrdG9wIGVudmlyb25tZW50cyBzdXBwb3J0IGdldHRpbmcgYQorICogZGVzY3JpcHRpb24/CisgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9pZl9kZXNjcmlwdGlvbihjb25zdCBjaGFyICpuYW1lKQoreworI2lmZGVmIFNJT0NHSUZERVNDUgorCWNoYXIgKmRlc2NyaXB0aW9uID0gTlVMTDsKKwlpbnQgczsKKwlzdHJ1Y3QgaWZyZXEgaWZyZGVzYzsKKyNpZm5kZWYgSUZERVNDUlNJWkUKKwlzaXplX3QgZGVzY3JsZW4gPSA2NDsKKyNlbHNlCisJc2l6ZV90IGRlc2NybGVuID0gSUZERVNDUlNJWkU7CisjZW5kaWYgLyogSUZERVNDUlNJWkUgKi8KKworCS8qCisJICogR2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGludGVyZmFjZS4KKwkgKi8KKwltZW1zZXQoJmlmcmRlc2MsIDAsIHNpemVvZiBpZnJkZXNjKTsKKwlzdHJsY3B5KGlmcmRlc2MuaWZyX25hbWUsIG5hbWUsIHNpemVvZiBpZnJkZXNjLmlmcl9uYW1lKTsKKwlzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChzID49IDApIHsKKyNpZmRlZiBfX0ZyZWVCU0RfXworCQkvKgorCQkgKiBPbiBGcmVlQlNELCBpZiB0aGUgYnVmZmVyIGlzbid0IGJpZyBlbm91Z2ggZm9yIHRoZQorCQkgKiBkZXNjcmlwdGlvbiwgdGhlIGlvY3RsIHN1Y2NlZWRzLCBidXQgdGhlIGRlc2NyaXB0aW9uCisJCSAqIGlzbid0IGNvcGllZCwgaWZyX2J1ZmZlci5sZW5ndGggaXMgc2V0IHRvIHRoZSBkZXNjcmlwdGlvbgorCQkgKiBsZW5ndGgsIGFuZCBpZnJfYnVmZmVyLmJ1ZmZlciBpcyBzZXQgdG8gTlVMTC4KKwkJICovCisJCWZvciAoOzspIHsKKwkJCWZyZWUoZGVzY3JpcHRpb24pOworCQkJaWYgKChkZXNjcmlwdGlvbiA9IG1hbGxvYyhkZXNjcmxlbikpICE9IE5VTEwpIHsKKwkJCQlpZnJkZXNjLmlmcl9idWZmZXIuYnVmZmVyID0gZGVzY3JpcHRpb247CisJCQkJaWZyZGVzYy5pZnJfYnVmZmVyLmxlbmd0aCA9IGRlc2NybGVuOworCQkJCWlmIChpb2N0bChzLCBTSU9DR0lGREVTQ1IsICZpZnJkZXNjKSA9PSAwKSB7CisJCQkJCWlmIChpZnJkZXNjLmlmcl9idWZmZXIuYnVmZmVyID09CisJCQkJCSAgICBkZXNjcmlwdGlvbikKKwkJCQkJCWJyZWFrOworCQkJCQllbHNlCisJCQkJCQlkZXNjcmxlbiA9IGlmcmRlc2MuaWZyX2J1ZmZlci5sZW5ndGg7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogRmFpbGVkIHRvIGdldCBpbnRlcmZhY2UgZGVzY3JpcHRpb24uCisJCQkJCSAqLworCQkJCQlmcmVlKGRlc2NyaXB0aW9uKTsKKwkJCQkJZGVzY3JpcHRpb24gPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlicmVhazsKKwkJfQorI2Vsc2UgLyogX19GcmVlQlNEX18gKi8KKwkJLyoKKwkJICogVGhlIG9ubHkgb3RoZXIgT1MgdGhhdCBjdXJyZW50bHkgc3VwcG9ydHMKKwkJICogU0lPQ0dJRkRFU0NSIGlzIE9wZW5CU0QsIGFuZCBpdCBoYXMgbm8gd2F5CisJCSAqIHRvIGdldCB0aGUgZGVzY3JpcHRpb24gbGVuZ3RoIC0gaXQncyBjbGFtcGVkCisJCSAqIHRvIGEgbWF4aW11bSBvZiBJRkRFU0NSU0laRS4KKwkJICovCisJCWlmICgoZGVzY3JpcHRpb24gPSBtYWxsb2MoZGVzY3JsZW4pKSAhPSBOVUxMKSB7CisJCQlpZnJkZXNjLmlmcl9kYXRhID0gKGNhZGRyX3QpZGVzY3JpcHRpb247CisJCQlpZiAoaW9jdGwocywgU0lPQ0dJRkRFU0NSLCAmaWZyZGVzYykgIT0gMCkgeworCQkJCS8qCisJCQkJICogRmFpbGVkIHRvIGdldCBpbnRlcmZhY2UgZGVzY3JpcHRpb24uCisJCQkJICovCisJCQkJZnJlZShkZXNjcmlwdGlvbik7CisJCQkJZGVzY3JpcHRpb24gPSBOVUxMOworCQkJfQorCQl9CisjZW5kaWYgLyogX19GcmVlQlNEX18gKi8KKwkJY2xvc2Uocyk7CisJCWlmIChkZXNjcmlwdGlvbiAhPSBOVUxMICYmIHN0cmxlbihkZXNjcmlwdGlvbikgPT0gMCkgeworCQkJLyoKKwkJCSAqIERlc2NyaXB0aW9uIGlzIGVtcHR5LCBzbyBkaXNjYXJkIGl0LgorCQkJICovCisJCQlmcmVlKGRlc2NyaXB0aW9uKTsKKwkJCWRlc2NyaXB0aW9uID0gTlVMTDsKKwkJfQorCX0KKworI2lmZGVmIF9fRnJlZUJTRF9fCisJLyoKKwkgKiBGb3IgRnJlZUJTRCwgaWYgd2UgZGlkbid0IGdldCBhIGRlc2NyaXB0aW9uLCBhbmQgdGhpcyBpcworCSAqIGEgZGV2aWNlIHdpdGggYSBuYW1lIG9mIHRoZSBmb3JtIHVzYnVzTiwgbGFiZWwgaXQgYXMgYSBVU0IKKwkgKiBidXMuCisJICovCisJaWYgKGRlc2NyaXB0aW9uID09IE5VTEwpIHsKKwkJaWYgKHN0cm5jbXAobmFtZSwgInVzYnVzIiwgNSkgPT0gMCkgeworCQkJLyoKKwkJCSAqIE9LLCBpdCBiZWdpbnMgd2l0aCAidXNidXMiLgorCQkJICovCisJCQlsb25nIGJ1c251bTsKKwkJCWNoYXIgKnA7CisKKwkJCWVycm5vID0gMDsKKwkJCWJ1c251bSA9IHN0cnRvbChuYW1lICsgNSwgJnAsIDEwKTsKKwkJCWlmIChlcnJubyA9PSAwICYmIHAgIT0gbmFtZSArIDUgJiYgKnAgPT0gJ1wwJyAmJgorCQkJICAgIGJ1c251bSA+PSAwICYmIGJ1c251bSA8PSBJTlRfTUFYKSB7CisJCQkJLyoKKwkJCQkgKiBPSywgaXQncyBhIHZhbGlkIG51bWJlciB0aGF0J3Mgbm90CisJCQkJICogYmlnZ2VyIHRoYW4gSU5UX01BWC4gIENvbnN0cnVjdAorCQkJCSAqIGEgZGVzY3JpcHRpb24gZnJvbSBpdC4KKwkJCQkgKi8KKwkJCQlzdGF0aWMgY29uc3QgY2hhciBkZXNjcl9wcmVmaXhbXSA9ICJVU0IgYnVzIG51bWJlciAiOworCQkJCXNpemVfdCBkZXNjcl9zaXplOworCisJCQkJLyoKKwkJCQkgKiBBbGxvdyBlbm91Z2ggcm9vbSBmb3IgYSAzMi1iaXQgYnVzIG51bWJlci4KKwkJCQkgKiBzaXplb2YgKGRlc2NyX3ByZWZpeCkgaW5jbHVkZXMgdGhlCisJCQkJICogdGVybWluYXRpbmcgTlVMLgorCQkJCSAqLworCQkJCWRlc2NyX3NpemUgPSBzaXplb2YgKGRlc2NyX3ByZWZpeCkgKyAxMDsKKwkJCQlkZXNjcmlwdGlvbiA9IG1hbGxvYyhkZXNjcl9zaXplKTsKKwkJCQlpZiAoZGVzY3JpcHRpb24gIT0gTlVMTCkgeworCQkJCQlwY2FwX3NucHJpbnRmKGRlc2NyaXB0aW9uLCBkZXNjcl9zaXplLAorCQkJCQkgICAgIiVzJWxkIiwgZGVzY3JfcHJlZml4LCBidXNudW0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiAoZGVzY3JpcHRpb24pOworI2Vsc2UgLyogU0lPQ0dJRkRFU0NSICovCisJcmV0dXJuIChOVUxMKTsKKyNlbmRpZiAvKiBTSU9DR0lGREVTQ1IgKi8KK30KKworLyoKKyAqIExvb2sgZm9yIGEgZ2l2ZW4gZGV2aWNlIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBkZXZpY2VzLgorICoKKyAqIElmIHdlIGZpbmQgaXQsIHJldHVybiAwIGFuZCBzZXQgKmN1cmRldl9yZXQgdG8gcG9pbnQgdG8gaXQuCisgKgorICogSWYgd2UgZG9uJ3QgZmluZCBpdCwgY2hlY2sgd2hldGhlciB3ZSBjYW4gb3BlbiBpdDoKKyAqCisgKiAgICAgSWYgdGhhdCBmYWlscyB3aXRoIFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0Ugb3IKKyAqICAgICBQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCwgZG9uJ3QgYXR0ZW1wdCB0byBhZGQgYW4gZW50cnkgZm9yCisgKiAgICAgaXQsIGFzIHRoYXQgcHJvYmFibHkgbWVhbnMgaXQgZXhpc3RzIGJ1dCBkb2Vzbid0IHN1cHBvcnQKKyAqICAgICBwYWNrZXQgY2FwdHVyZS4KKyAqCisgKiAgICAgT3RoZXJ3aXNlLCBhdHRlbXB0IHRvIGFkZCBhbiBlbnRyeSBmb3IgaXQsIHdpdGggdGhlIHNwZWNpZmllZAorICogICAgIGlmbmV0IGZsYWdzIGFuZCBkZXNjcmlwdGlvbiwgYW5kLCBpZiB0aGF0IHN1Y2NlZWRzLCByZXR1cm4gMAorICogICAgIGFuZCBzZXQgKmN1cmRldl9yZXQgdG8gcG9pbnQgdG8gdGhlIG5ldyBlbnRyeSwgb3RoZXJ3aXNlCisgKiAgICAgcmV0dXJuIFBDQVBfRVJST1IgYW5kIHNldCBlcnJidWYgdG8gYW4gZXJyb3IgbWVzc2FnZS4gIElmIHdlCisgKiAgICAgd2VyZW4ndCBnaXZlbiBhIGRlc2NyaXB0aW9uLCB0cnkgdG8gZ2V0IG9uZS4KKyAqLworaW50CithZGRfb3JfZmluZF9pZihwY2FwX2lmX3QgKipjdXJkZXZfcmV0LCBwY2FwX2lmX3QgKiphbGxkZXZzLCBjb25zdCBjaGFyICpuYW1lLAorICAgIGJwZl91X2ludDMyIGZsYWdzLCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwgY2hhciAqZXJyYnVmKQoreworCXBjYXBfdCAqcDsKKwlwY2FwX2lmX3QgKmN1cmRldiwgKnByZXZkZXYsICpuZXh0ZGV2OworCXVfaW50IHRoaXNfZmlndXJlX29mX21lcml0LCBuZXh0ZGV2X2ZpZ3VyZV9vZl9tZXJpdDsKKwljaGFyIG9wZW5fZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworCWludCByZXQ7CisKKwkvKgorCSAqIElzIHRoZXJlIGFscmVhZHkgYW4gZW50cnkgaW4gdGhlIGxpc3QgZm9yIHRoaXMgaW50ZXJmYWNlPworCSAqLworCWZvciAoY3VyZGV2ID0gKmFsbGRldnM7IGN1cmRldiAhPSBOVUxMOyBjdXJkZXYgPSBjdXJkZXYtPm5leHQpIHsKKwkJaWYgKHN0cmNtcChuYW1lLCBjdXJkZXYtPm5hbWUpID09IDApCisJCQlicmVhazsJLyogeWVzLCB3ZSBmb3VuZCBpdCAqLworCX0KKworCWlmIChjdXJkZXYgPT0gTlVMTCkgeworCQkvKgorCQkgKiBObywgd2UgZGlkbid0IGZpbmQgaXQuCisJCSAqCisJCSAqIENhbiB3ZSBvcGVuIHRoaXMgaW50ZXJmYWNlIGZvciBsaXZlIGNhcHR1cmU/CisJCSAqCisJCSAqIFdlIGRvIHRoaXMgY2hlY2sgc28gdGhhdCBpbnRlcmZhY2VzIHRoYXQgYXJlCisJCSAqIHN1cHBsaWVkIGJ5IHRoZSBpbnRlcmZhY2UgZW51bWVyYXRpb24gbWVjaGFuaXNtCisJCSAqIHdlJ3JlIHVzaW5nIGJ1dCB0aGF0IGRvbid0IHN1cHBvcnQgcGFja2V0IGNhcHR1cmUKKwkJICogYXJlbid0IGluY2x1ZGVkIGluIHRoZSBsaXN0LiAgTG9vcGJhY2sgaW50ZXJmYWNlcworCQkgKiBvbiBTb2xhcmlzIGFyZSBhbiBleGFtcGxlIG9mIHRoaXM7IHdlIGRvbid0IGp1c3QKKwkJICogb21pdCBsb29wYmFjayBpbnRlcmZhY2VzIG9uIGFsbCBwbGF0Zm9ybXMgYmVjYXVzZQorCQkgKiB5b3UgKmNhbiogY2FwdHVyZSBvbiBsb29wYmFjayBpbnRlcmZhY2VzIG9uIHNvbWUKKwkJICogT1Nlcy4KKwkJICoKKwkJICogT24gT1MgWCwgd2UgZG9uJ3QgZG8gdGhpcyBjaGVjayBpZiB0aGUgZGV2aWNlCisJCSAqIG5hbWUgYmVnaW5zIHdpdGggIndsdCI7IGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMKKwkJICogb2YgT1MgWCBvZmZlciBtb25pdG9yIG1vZGUgY2FwdHVyaW5nIGJ5IGhhdmluZworCQkgKiBhIHNlcGFyYXRlICJtb25pdG9yIG1vZGUiIGRldmljZSBmb3IgZWFjaCB3aXJlbGVzcworCQkgKiBhZGFwdGVyLCByYXRoZXIgdGhhbiBieSBpbXBsZW1lbnRpbmcgdGhlIGlvY3RscworCQkgKiB0aGF0IHtGcmVlLE5ldCxPcGVuLERyYWdvbkZseX1CU0QgcHJvdmlkZS4KKwkJICogT3BlbmluZyB0aGF0IGRldmljZSBwdXRzIHRoZSBhZGFwdGVyIGludG8gbW9uaXRvcgorCQkgKiBtb2RlLCB3aGljaCwgYXQgbGVhc3QgZm9yIHNvbWUgYWRhcHRlcnMsIGNhdXNlcworCQkgKiB0aGVtIHRvIGRlYXNzb2NpYXRlIGZyb20gdGhlIG5ldHdvcmsgd2l0aCB3aGljaAorCQkgKiB0aGV5J3JlIGFzc29jaWF0ZWQuCisJCSAqCisJCSAqIEluc3RlYWQsIHdlIHRyeSB0byBvcGVuIHRoZSBjb3JyZXNwb25kaW5nICJlbiIKKwkJICogZGV2aWNlIChzbyB0aGF0IHdlIGRvbid0IGVuZCB1cCB3aXRoLCBmb3IgdXNlcnMKKwkJICogd2l0aG91dCBzdWZmaWNpZW50IHByaXZpbGVnZSB0byBvcGVuIGNhcHR1cmUKKwkJICogZGV2aWNlcywgYSBsaXN0IG9mIGFkYXB0ZXJzIHRoYXQgb25seSBpbmNsdWRlcworCQkgKiB0aGUgd2x0IGRldmljZXMpLgorCQkgKi8KKyNpZmRlZiBfX0FQUExFX18KKwkJaWYgKHN0cm5jbXAobmFtZSwgIndsdCIsIDMpID09IDApIHsKKwkJCWNoYXIgKmVuX25hbWU7CisJCQlzaXplX3QgZW5fbmFtZV9sZW47CisKKwkJCS8qCisJCQkgKiBUcnkgdG8gYWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSAiZW4iCisJCQkgKiBkZXZpY2UncyBuYW1lLgorCQkJICovCisJCQllbl9uYW1lX2xlbiA9IHN0cmxlbihuYW1lKSAtIDE7CisJCQllbl9uYW1lID0gbWFsbG9jKGVuX25hbWVfbGVuICsgMSk7CisJCQlpZiAoZW5fbmFtZSA9PSBOVUxMKSB7CisJCQkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJc3RyY3B5KGVuX25hbWUsICJlbiIpOworCQkJc3RyY2F0KGVuX25hbWUsIG5hbWUgKyAzKTsKKwkJCXAgPSBwY2FwX2NyZWF0ZShlbl9uYW1lLCBvcGVuX2VycmJ1Zik7CisJCQlmcmVlKGVuX25hbWUpOworCQl9IGVsc2UKKyNlbmRpZiAvKiBfX0FQUExFICovCisJCXAgPSBwY2FwX2NyZWF0ZShuYW1lLCBvcGVuX2VycmJ1Zik7CisJCWlmIChwID09IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBUaGUgYXR0ZW1wdCB0byBjcmVhdGUgdGhlIHBjYXBfdCBmYWlsZWQ7CisJCQkgKiB0aGF0J3MgcHJvYmFibHkgYW4gaW5kaWNhdGlvbiB0aGF0IHdlJ3JlCisJCQkgKiBvdXQgb2YgbWVtb3J5LgorCQkJICoKKwkJCSAqIERvbid0IGJvdGhlciBpbmNsdWRpbmcgdGhpcyBpbnRlcmZhY2UsCisJCQkgKiBidXQgZG9uJ3QgdHJlYXQgaXQgYXMgYW4gZXJyb3IuCisJCQkgKi8KKwkJCSpjdXJkZXZfcmV0ID0gTlVMTDsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJLyogU21hbGwgc25hcGxlbiwgc28gd2UgZG9uJ3QgdHJ5IHRvIGFsbG9jYXRlIG11Y2ggbWVtb3J5LiAqLworCQlwY2FwX3NldF9zbmFwbGVuKHAsIDY4KTsKKwkJcmV0ID0gcGNhcF9hY3RpdmF0ZShwKTsKKwkJcGNhcF9jbG9zZShwKTsKKwkJc3dpdGNoIChyZXQpIHsKKworCQljYXNlIFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U6CisJCWNhc2UgUENBUF9FUlJPUl9JRkFDRV9OT1RfVVA6CisJCQkvKgorCQkJICogV2UgZXhwZWN0IHRoZXNlIHR3byBlcnJvcnMgLSB0aGV5J3JlIHRoZQorCQkJICogcmVhc29uIHdlIHRyeSB0byBvcGVuIHRoZSBkZXZpY2UuCisJCQkgKgorCQkJICogUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSB0eXBpY2FsbHkgbWVhbnMKKwkJCSAqICJ0aGVyZSdzIG5vIHN1Y2ggZGV2aWNlICprbm93biB0byB0aGUKKwkJCSAqIE9TJ3MgY2FwdHVyZSBtZWNoYW5pc20qIiwgc28sIGV2ZW4gdGhvdWdoCisJCQkgKiBpdCBtaWdodCBiZSBhIHZhbGlkIG5ldHdvcmsgaW50ZXJmYWNlLCB5b3UKKwkJCSAqIGNhbid0IGNhcHR1cmUgb24gaXQgKGUuZy4sIHRoZSBsb29wYmFjaworCQkJICogZGV2aWNlIGluIFNvbGFyaXMgdXAgdG8gU29sYXJpcyAxMCwgb3IKKwkJCSAqIHRoZSB2bW5ldCBkZXZpY2VzIGluIE9TIFggd2l0aCBWTXdhcmUKKwkJCSAqIEZ1c2lvbikuICBXZSBkb24ndCBpbmNsdWRlIHRob3NlIGRldmljZXMKKwkJCSAqIGluIG91ciBsaXN0IG9mIGRldmljZXMsIGFzIHRoZXJlJ3Mgbm8KKwkJCSAqIHBvaW50IGluIGRvaW5nIHNvIC0gdGhleSdyZSBub3QgYXZhaWxhYmxlCisJCQkgKiBmb3IgY2FwdHVyZS4KKwkJCSAqCisJCQkgKiBQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCBtZWFucyB0aGF0IHRoZQorCQkJICogT1MncyBjYXB0dXJlIG1lY2hhbmlzbSBkb2Vzbid0IHdvcmsgb24KKwkJCSAqIGludGVyZmFjZXMgbm90IG1hcmtlZCBhcyB1cDsgc29tZSBjYXB0dXJlCisJCQkgKiBtZWNoYW5pc21zICpkbyogc3VwcG9ydCB0aGF0LCBzbyB3ZSBubworCQkJICogbG9uZ2VyIHJlamVjdCB0aG9zZSBpbnRlcmZhY2VzIG91dCBvZiBoYW5kLAorCQkJICogYnV0IHdlICpkbyogd2FudCB0byByZWplY3QgdGhlbSBpZiB0aGV5CisJCQkgKiBjYW4ndCBiZSBvcGVuZWQgZm9yIGNhcHR1cmUuCisJCQkgKi8KKwkJCSpjdXJkZXZfcmV0ID0gTlVMTDsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQkvKgorCQkgKiBZZXMsIHdlIGNhbiBvcGVuIGl0LCBvciB3ZSBjYW4ndCwgZm9yIHNvbWUgb3RoZXIKKwkJICogcmVhc29uLgorCQkgKgorCQkgKiBJZiB3ZSBjYW4gb3BlbiBpdCwgd2Ugd2FudCB0byBvZmZlciBpdCBmb3IKKwkJICogY2FwdHVyZSwgYXMgeW91IGNhbiBjYXB0dXJlIG9uIGl0LiAgSWYgd2UgY2FuJ3QsCisJCSAqIHdlIHdhbnQgdG8gb2ZmZXIgaXQgZm9yIGNhcHR1cmUsIHNvIHRoYXQsIGlmCisJCSAqIHRoZSB1c2VyIHRyaWVzIHRvIGNhcHR1cmUgb24gaXQsIHRoZXknbGwgZ2V0CisJCSAqIGFuIGVycm9yIGFuZCB0aGV5J2xsIGtub3cgd2h5IHRoZXkgY2FuJ3QKKwkJICogY2FwdHVyZSBvbiBpdCAoZS5nLiwgaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zKQorCQkgKiBvciB0aGV5J2xsIHJlcG9ydCBpdCBhcyBhIHByb2JsZW0gKGFuZCB0aGVuCisJCSAqIGhhdmUgdGhlIGVycm9yIG1lc3NhZ2UgdG8gcHJvdmlkZSBhcyBpbmZvcm1hdGlvbikuCisJCSAqCisJCSAqIEFsbG9jYXRlIGEgbmV3IGVudHJ5LgorCQkgKi8KKwkJY3VyZGV2ID0gbWFsbG9jKHNpemVvZihwY2FwX2lmX3QpKTsKKwkJaWYgKGN1cmRldiA9PSBOVUxMKSB7CisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisKKwkJLyoKKwkJICogRmlsbCBpbiB0aGUgZW50cnkuCisJCSAqLworCQljdXJkZXYtPm5leHQgPSBOVUxMOworCQljdXJkZXYtPm5hbWUgPSBzdHJkdXAobmFtZSk7CisJCWlmIChjdXJkZXYtPm5hbWUgPT0gTlVMTCkgeworCQkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlmcmVlKGN1cmRldik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZiAoZGVzY3JpcHRpb24gPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIFdlIHdlcmVuJ3QgaGFuZGVkIGEgZGVzY3JpcHRpb24gZm9yIHRoZQorCQkJICogaW50ZXJmYWNlLCBzbyBzZWUgaWYgd2UgY2FuIGdlbmVyYXRlIG9uZQorCQkJICogb3Vyc2VsdmVzLgorCQkJICovCisJCQljdXJkZXYtPmRlc2NyaXB0aW9uID0gZ2V0X2lmX2Rlc2NyaXB0aW9uKG5hbWUpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIHdlcmUgaGFuZGVkIGEgZGVzY3JpcHRpb247IG1ha2UgYSBjb3B5LgorCQkJICovCisJCQljdXJkZXYtPmRlc2NyaXB0aW9uID0gc3RyZHVwKGRlc2NyaXB0aW9uKTsKKwkJCWlmIChjdXJkZXYtPmRlc2NyaXB0aW9uID09IE5VTEwpIHsKKwkJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJZnJlZShjdXJkZXYtPm5hbWUpOworCQkJCWZyZWUoY3VyZGV2KTsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJfQorCQljdXJkZXYtPmFkZHJlc3NlcyA9IE5VTEw7CS8qIGxpc3Qgc3RhcnRzIG91dCBhcyBlbXB0eSAqLworCQljdXJkZXYtPmZsYWdzID0gZmxhZ3M7CisKKwkJLyoKKwkJICogQWRkIGl0IHRvIHRoZSBsaXN0LCBpbiB0aGUgYXBwcm9wcmlhdGUgbG9jYXRpb24uCisJCSAqIEZpcnN0LCBnZXQgdGhlICJmaWd1cmUgb2YgbWVyaXQiIGZvciB0aGlzCisJCSAqIGludGVyZmFjZS4KKwkJICovCisJCXRoaXNfZmlndXJlX29mX21lcml0ID0gZ2V0X2ZpZ3VyZV9vZl9tZXJpdChjdXJkZXYpOworCisJCS8qCisJCSAqIE5vdyBsb29rIGZvciB0aGUgbGFzdCBpbnRlcmZhY2Ugd2l0aCBhbiBmaWd1cmUgb2YgbWVyaXQKKwkJICogbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBuZXcgaW50ZXJmYWNlJ3MgZmlndXJlIG9mCisJCSAqIG1lcml0LgorCQkgKgorCQkgKiBXZSBzdGFydCB3aXRoICJwcmV2ZGV2IiBiZWluZyBOVUxMLCBtZWFuaW5nIHdlJ3JlIGJlZm9yZQorCQkgKiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdC4KKwkJICovCisJCXByZXZkZXYgPSBOVUxMOworCQlmb3IgKDs7KSB7CisJCQkvKgorCQkJICogR2V0IHRoZSBpbnRlcmZhY2UgYWZ0ZXIgdGhpcyBvbmUuCisJCQkgKi8KKwkJCWlmIChwcmV2ZGV2ID09IE5VTEwpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBuZXh0IGVsZW1lbnQgaXMgdGhlIGZpcnN0IGVsZW1lbnQuCisJCQkJICovCisJCQkJbmV4dGRldiA9ICphbGxkZXZzOworCQkJfSBlbHNlCisJCQkJbmV4dGRldiA9IHByZXZkZXYtPm5leHQ7CisKKwkJCS8qCisJCQkgKiBBcmUgd2UgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdD8KKwkJCSAqLworCQkJaWYgKG5leHRkZXYgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogWWVzIC0gd2UgaGF2ZSB0byBwdXQgdGhlIG5ldyBlbnRyeQorCQkJCSAqIGFmdGVyICJwcmV2ZGV2Ii4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElzIHRoZSBuZXcgaW50ZXJmYWNlJ3MgZmlndXJlIG9mIG1lcml0IGxlc3MKKwkJCSAqIHRoYW4gdGhlIG5leHQgaW50ZXJmYWNlJ3MgZmlndXJlIG9mIG1lcml0LAorCQkJICogbWVhbmluZyB0aGF0IHRoZSBuZXcgaW50ZXJmYWNlIGlzIGJldHRlcgorCQkJICogdGhhbiB0aGUgbmV4dCBpbnRlcmZhY2U/CisJCQkgKi8KKwkJCW5leHRkZXZfZmlndXJlX29mX21lcml0ID0gZ2V0X2ZpZ3VyZV9vZl9tZXJpdChuZXh0ZGV2KTsKKwkJCWlmICh0aGlzX2ZpZ3VyZV9vZl9tZXJpdCA8IG5leHRkZXZfZmlndXJlX29mX21lcml0KSB7CisJCQkJLyoKKwkJCQkgKiBZZXMgLSB3ZSBzaG91bGQgcHV0IHRoZSBuZXcgZW50cnkKKwkJCQkgKiBiZWZvcmUgIm5leHRkZXYiLCBpLmUuIGFmdGVyICJwcmV2ZGV2Ii4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcHJldmRldiA9IG5leHRkZXY7CisJCX0KKworCQkvKgorCQkgKiBJbnNlcnQgYmVmb3JlICJuZXh0ZGV2Ii4KKwkJICovCisJCWN1cmRldi0+bmV4dCA9IG5leHRkZXY7CisKKwkJLyoKKwkJICogSW5zZXJ0IGFmdGVyICJwcmV2ZGV2IiAtIHVubGVzcyAicHJldmRldiIgaXMgbnVsbCwKKwkJICogaW4gd2hpY2ggY2FzZSB0aGlzIGlzIHRoZSBmaXJzdCBpbnRlcmZhY2UuCisJCSAqLworCQlpZiAocHJldmRldiA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgZmlyc3QgaW50ZXJmYWNlLiAgUGFzcyBiYWNrIGEKKwkJCSAqIHBvaW50ZXIgdG8gaXQsIGFuZCBwdXQgImN1cmRldiIgYmVmb3JlCisJCQkgKiAibmV4dGRldiIuCisJCQkgKi8KKwkJCSphbGxkZXZzID0gY3VyZGV2OworCQl9IGVsc2UKKwkJCXByZXZkZXYtPm5leHQgPSBjdXJkZXY7CisJfQorCisJKmN1cmRldl9yZXQgPSBjdXJkZXY7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFRyeSB0byBnZXQgYSBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbiBkZXZpY2UsIGFuZCB0aGVuIGxvb2sgZm9yIHRoYXQKKyAqIGRldmljZSBpbiB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgZGV2aWNlcy4KKyAqCisgKiBJZiB3ZSBmaW5kIGl0LCB0aGVuLCBpZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgaXNuJ3QgbnVsbCwgYWRkIGl0IHRvCisgKiB0aGUgbGlzdCBvZiBhZGRyZXNzZXMgZm9yIHRoZSBkZXZpY2UgYW5kIHJldHVybiAwLgorICoKKyAqIElmIHdlIGRvbid0IGZpbmQgaXQsIGNoZWNrIHdoZXRoZXIgd2UgY2FuIG9wZW4gaXQ6CisgKgorICogICAgIElmIHRoYXQgZmFpbHMgd2l0aCBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFIG9yCisgKiAgICAgUENBUF9FUlJPUl9JRkFDRV9OT1RfVVAsIGRvbid0IGF0dGVtcHQgdG8gYWRkIGFuIGVudHJ5IGZvcgorICogICAgIGl0LCBhcyB0aGF0IHByb2JhYmx5IG1lYW5zIGl0IGV4aXN0cyBidXQgZG9lc24ndCBzdXBwb3J0CisgKiAgICAgcGFja2V0IGNhcHR1cmUuCisgKgorICogICAgIE90aGVyd2lzZSwgYXR0ZW1wdCB0byBhZGQgYW4gZW50cnkgZm9yIGl0LCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAqICAgICBpZm5ldCBmbGFncywgYW5kLCBpZiB0aGF0IHN1Y2NlZWRzLCBhZGQgdGhlIHNwZWNpZmllZCBhZGRyZXNzCisgKiAgICAgdG8gaXRzIGxpc3Qgb2YgYWRkcmVzc2VzIGlmIHRoYXQgYWRkcmVzcyBpcyBub24tbnVsbCwgc2V0CisgKiAgICAgKmN1cmRldl9yZXQgdG8gcG9pbnQgdG8gdGhlIG5ldyBlbnRyeSwgYW5kIHJldHVybiAwLCBvdGhlcndpc2UKKyAqICAgICByZXR1cm4gUENBUF9FUlJPUiBhbmQgc2V0IGVycmJ1ZiB0byBhbiBlcnJvciBtZXNzYWdlLgorICoKKyAqIChXZSBjYW4gZ2V0IGNhbGxlZCB3aXRoIGEgbnVsbCBhZGRyZXNzIGJlY2F1c2Ugd2UgbWlnaHQgZ2V0IGEgbGlzdAorICogb2YgaW50ZXJmYWNlIG5hbWUvYWRkcmVzcyBjb21iaW5hdGlvbnMgZnJvbSB0aGUgdW5kZXJseWluZyBPUywgd2l0aAorICogdGhlIGFkZHJlc3MgYmVpbmcgYWJzZW50IGluIHNvbWUgY2FzZXMsIHJhdGhlciB0aGFuIGEgbGlzdCBvZgorICogaW50ZXJmYWNlcyB3aXRoIGVhY2ggaW50ZXJmYWNlIGhhdmluZyBhIGxpc3Qgb2YgYWRkcmVzc2VzLCBzbyB0aGlzCisgKiBjYWxsIG1heSBiZSB0aGUgb25seSBjYWxsIG1hZGUgdG8gYWRkIHRvIHRoZSBsaXN0LCBhbmQgd2Ugd2FudCB0bworICogYWRkIGludGVyZmFjZXMgZXZlbiBpZiB0aGV5IGhhdmUgbm8gYWRkcmVzc2VzLikKKyAqLworaW50CithZGRfYWRkcl90b19pZmxpc3QocGNhcF9pZl90ICoqYWxsZGV2cywgY29uc3QgY2hhciAqbmFtZSwgYnBmX3VfaW50MzIgZmxhZ3MsCisgICAgc3RydWN0IHNvY2thZGRyICphZGRyLCBzaXplX3QgYWRkcl9zaXplLAorICAgIHN0cnVjdCBzb2NrYWRkciAqbmV0bWFzaywgc2l6ZV90IG5ldG1hc2tfc2l6ZSwKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmJyb2FkYWRkciwgc2l6ZV90IGJyb2FkYWRkcl9zaXplLAorICAgIHN0cnVjdCBzb2NrYWRkciAqZHN0YWRkciwgc2l6ZV90IGRzdGFkZHJfc2l6ZSwKKyAgICBjaGFyICplcnJidWYpCit7CisJcGNhcF9pZl90ICpjdXJkZXY7CisKKwlpZiAoYWRkX29yX2ZpbmRfaWYoJmN1cmRldiwgYWxsZGV2cywgbmFtZSwgZmxhZ3MsIE5VTEwsIGVycmJ1ZikgPT0gLTEpIHsKKwkJLyoKKwkJICogRXJyb3IgLSBnaXZlIHVwLgorCQkgKi8KKwkJcmV0dXJuICgtMSk7CisJfQorCWlmIChjdXJkZXYgPT0gTlVMTCkgeworCQkvKgorCQkgKiBEZXZpY2Ugd2Fzbid0IGFkZGVkIGJlY2F1c2UgaXQgY2FuJ3QgYmUgb3BlbmVkLgorCQkgKiBOb3QgYSBmYXRhbCBlcnJvci4KKwkJICovCisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKGFkZHIgPT0gTlVMTCkgeworCQkvKgorCQkgKiBUaGVyZSdzIG5vIGFkZHJlc3MgdG8gYWRkOyB0aGlzIGVudHJ5IGp1c3QgbWVhbnQKKwkJICogImhlcmUncyBhIG5ldyBpbnRlcmZhY2UiLgorCQkgKi8KKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqICJjdXJkZXYiIGlzIGFuIGVudHJ5IGZvciB0aGlzIGludGVyZmFjZSwgYW5kIHdlIGhhdmUgYW4KKwkgKiBhZGRyZXNzIGZvciBpdDsgYWRkIGFuIGVudHJ5IGZvciB0aGF0IGFkZHJlc3MgdG8gdGhlCisJICogaW50ZXJmYWNlJ3MgbGlzdCBvZiBhZGRyZXNzZXMuCisJICoKKwkgKiBBbGxvY2F0ZSB0aGUgbmV3IGVudHJ5IGFuZCBmaWxsIGl0IGluLgorCSAqLworCXJldHVybiAoYWRkX2FkZHJfdG9fZGV2KGN1cmRldiwgYWRkciwgYWRkcl9zaXplLCBuZXRtYXNrLAorCSAgICBuZXRtYXNrX3NpemUsIGJyb2FkYWRkciwgYnJvYWRhZGRyX3NpemUsIGRzdGFkZHIsCisJICAgIGRzdGFkZHJfc2l6ZSwgZXJyYnVmKSk7Cit9CisKKy8qCisgKiBBZGQgYW4gZW50cnkgdG8gdGhlIGxpc3Qgb2YgYWRkcmVzc2VzIGZvciBhbiBpbnRlcmZhY2UuCisgKiAiY3VyZGV2IiBpcyB0aGUgZW50cnkgZm9yIHRoYXQgaW50ZXJmYWNlLgorICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgSVAgYWRkcmVzcyBhZGRlZCB0byB0aGUgaW50ZXJmYWNlLCBtb3ZlIGl0CisgKiBpbiB0aGUgbGlzdCBhcyBhcHByb3ByaWF0ZS4KKyAqLworaW50CithZGRfYWRkcl90b19kZXYocGNhcF9pZl90ICpjdXJkZXYsCisgICAgc3RydWN0IHNvY2thZGRyICphZGRyLCBzaXplX3QgYWRkcl9zaXplLAorICAgIHN0cnVjdCBzb2NrYWRkciAqbmV0bWFzaywgc2l6ZV90IG5ldG1hc2tfc2l6ZSwKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmJyb2FkYWRkciwgc2l6ZV90IGJyb2FkYWRkcl9zaXplLAorICAgIHN0cnVjdCBzb2NrYWRkciAqZHN0YWRkciwgc2l6ZV90IGRzdGFkZHJfc2l6ZSwKKyAgICBjaGFyICplcnJidWYpCit7CisJcGNhcF9hZGRyX3QgKmN1cmFkZHIsICpwcmV2YWRkciwgKm5leHRhZGRyOworCisJY3VyYWRkciA9IG1hbGxvYyhzaXplb2YocGNhcF9hZGRyX3QpKTsKKwlpZiAoY3VyYWRkciA9PSBOVUxMKSB7CisJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKworCWN1cmFkZHItPm5leHQgPSBOVUxMOworCWlmIChhZGRyICE9IE5VTEwpIHsKKwkJY3VyYWRkci0+YWRkciA9IGR1cF9zb2NrYWRkcihhZGRyLCBhZGRyX3NpemUpOworCQlpZiAoY3VyYWRkci0+YWRkciA9PSBOVUxMKSB7CisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWZyZWUoY3VyYWRkcik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0gZWxzZQorCQljdXJhZGRyLT5hZGRyID0gTlVMTDsKKworCWlmIChuZXRtYXNrICE9IE5VTEwpIHsKKwkJY3VyYWRkci0+bmV0bWFzayA9IGR1cF9zb2NrYWRkcihuZXRtYXNrLCBuZXRtYXNrX3NpemUpOworCQlpZiAoY3VyYWRkci0+bmV0bWFzayA9PSBOVUxMKSB7CisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWlmIChjdXJhZGRyLT5hZGRyICE9IE5VTEwpCisJCQkJZnJlZShjdXJhZGRyLT5hZGRyKTsKKwkJCWZyZWUoY3VyYWRkcik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0gZWxzZQorCQljdXJhZGRyLT5uZXRtYXNrID0gTlVMTDsKKworCWlmIChicm9hZGFkZHIgIT0gTlVMTCkgeworCQljdXJhZGRyLT5icm9hZGFkZHIgPSBkdXBfc29ja2FkZHIoYnJvYWRhZGRyLCBicm9hZGFkZHJfc2l6ZSk7CisJCWlmIChjdXJhZGRyLT5icm9hZGFkZHIgPT0gTlVMTCkgeworCQkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlpZiAoY3VyYWRkci0+bmV0bWFzayAhPSBOVUxMKQorCQkJCWZyZWUoY3VyYWRkci0+bmV0bWFzayk7CisJCQlpZiAoY3VyYWRkci0+YWRkciAhPSBOVUxMKQorCQkJCWZyZWUoY3VyYWRkci0+YWRkcik7CisJCQlmcmVlKGN1cmFkZHIpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9IGVsc2UKKwkJY3VyYWRkci0+YnJvYWRhZGRyID0gTlVMTDsKKworCWlmIChkc3RhZGRyICE9IE5VTEwpIHsKKwkJY3VyYWRkci0+ZHN0YWRkciA9IGR1cF9zb2NrYWRkcihkc3RhZGRyLCBkc3RhZGRyX3NpemUpOworCQlpZiAoY3VyYWRkci0+ZHN0YWRkciA9PSBOVUxMKSB7CisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWlmIChjdXJhZGRyLT5icm9hZGFkZHIgIT0gTlVMTCkKKwkJCQlmcmVlKGN1cmFkZHItPmJyb2FkYWRkcik7CisJCQlpZiAoY3VyYWRkci0+bmV0bWFzayAhPSBOVUxMKQorCQkJCWZyZWUoY3VyYWRkci0+bmV0bWFzayk7CisJCQlpZiAoY3VyYWRkci0+YWRkciAhPSBOVUxMKQorCQkJCWZyZWUoY3VyYWRkci0+YWRkcik7CisJCQlmcmVlKGN1cmFkZHIpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9IGVsc2UKKwkJY3VyYWRkci0+ZHN0YWRkciA9IE5VTEw7CisKKwkvKgorCSAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBhZGRyZXNzZXMuCisJICovCisJZm9yIChwcmV2YWRkciA9IGN1cmRldi0+YWRkcmVzc2VzOyBwcmV2YWRkciAhPSBOVUxMOyBwcmV2YWRkciA9IG5leHRhZGRyKSB7CisJCW5leHRhZGRyID0gcHJldmFkZHItPm5leHQ7CisJCWlmIChuZXh0YWRkciA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBsaXN0LgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwcmV2YWRkciA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFRoZSBsaXN0IHdhcyBlbXB0eTsgdGhpcyBpcyB0aGUgZmlyc3QgbWVtYmVyLgorCQkgKi8KKwkJY3VyZGV2LT5hZGRyZXNzZXMgPSBjdXJhZGRyOworCX0gZWxzZSB7CisJCS8qCisJCSAqICJwcmV2YWRkciIgaXMgdGhlIGxhc3QgbWVtYmVyIG9mIHRoZSBsaXN0OyBhcHBlbmQKKwkJICogdGhpcyBtZW1iZXIgdG8gaXQuCisJCSAqLworCQlwcmV2YWRkci0+bmV4dCA9IGN1cmFkZHI7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIExvb2sgZm9yIGEgZ2l2ZW4gZGV2aWNlIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBkZXZpY2VzLgorICoKKyAqIElmIHdlIGZpbmQgaXQsIHJldHVybiAwLgorICoKKyAqIElmIHdlIGRvbid0IGZpbmQgaXQsIGNoZWNrIHdoZXRoZXIgd2UgY2FuIG9wZW4gaXQ6CisgKgorICogICAgIElmIHRoYXQgZmFpbHMgd2l0aCBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFIG9yCisgKiAgICAgUENBUF9FUlJPUl9JRkFDRV9OT1RfVVAsIGRvbid0IGF0dGVtcHQgdG8gYWRkIGFuIGVudHJ5IGZvcgorICogICAgIGl0LCBhcyB0aGF0IHByb2JhYmx5IG1lYW5zIGl0IGV4aXN0cyBidXQgZG9lc24ndCBzdXBwb3J0CisgKiAgICAgcGFja2V0IGNhcHR1cmUuCisgKgorICogICAgIE90aGVyd2lzZSwgYXR0ZW1wdCB0byBhZGQgYW4gZW50cnkgZm9yIGl0LCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAqICAgICBpZm5ldCBmbGFncyBhbmQgZGVzY3JpcHRpb24sIGFuZCwgaWYgdGhhdCBzdWNjZWVkcywgcmV0dXJuIDAKKyAqICAgICBhbmQgc2V0ICpjdXJkZXZfcmV0IHRvIHBvaW50IHRvIHRoZSBuZXcgZW50cnksIG90aGVyd2lzZQorICogICAgIHJldHVybiBQQ0FQX0VSUk9SIGFuZCBzZXQgZXJyYnVmIHRvIGFuIGVycm9yIG1lc3NhZ2UuCisgKi8KK2ludAorcGNhcF9hZGRfaWYocGNhcF9pZl90ICoqZGV2bGlzdCwgY29uc3QgY2hhciAqbmFtZSwgdV9pbnQgZmxhZ3MsCisgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24sIGNoYXIgKmVycmJ1ZikKK3sKKwlwY2FwX2lmX3QgKmN1cmRldjsKKworCXJldHVybiAoYWRkX29yX2ZpbmRfaWYoJmN1cmRldiwgZGV2bGlzdCwgbmFtZSwgZmxhZ3MsIGRlc2NyaXB0aW9uLAorCSAgICBlcnJidWYpKTsKK30KKworCisvKgorICogRnJlZSBhIGxpc3Qgb2YgaW50ZXJmYWNlcy4KKyAqLwordm9pZAorcGNhcF9mcmVlYWxsZGV2cyhwY2FwX2lmX3QgKmFsbGRldnMpCit7CisJcGNhcF9pZl90ICpjdXJkZXYsICpuZXh0ZGV2OworCXBjYXBfYWRkcl90ICpjdXJhZGRyLCAqbmV4dGFkZHI7CisKKwlmb3IgKGN1cmRldiA9IGFsbGRldnM7IGN1cmRldiAhPSBOVUxMOyBjdXJkZXYgPSBuZXh0ZGV2KSB7CisJCW5leHRkZXYgPSBjdXJkZXYtPm5leHQ7CisKKwkJLyoKKwkJICogRnJlZSBhbGwgYWRkcmVzc2VzLgorCQkgKi8KKwkJZm9yIChjdXJhZGRyID0gY3VyZGV2LT5hZGRyZXNzZXM7IGN1cmFkZHIgIT0gTlVMTDsgY3VyYWRkciA9IG5leHRhZGRyKSB7CisJCQluZXh0YWRkciA9IGN1cmFkZHItPm5leHQ7CisJCQlpZiAoY3VyYWRkci0+YWRkcikKKwkJCQlmcmVlKGN1cmFkZHItPmFkZHIpOworCQkJaWYgKGN1cmFkZHItPm5ldG1hc2spCisJCQkJZnJlZShjdXJhZGRyLT5uZXRtYXNrKTsKKwkJCWlmIChjdXJhZGRyLT5icm9hZGFkZHIpCisJCQkJZnJlZShjdXJhZGRyLT5icm9hZGFkZHIpOworCQkJaWYgKGN1cmFkZHItPmRzdGFkZHIpCisJCQkJZnJlZShjdXJhZGRyLT5kc3RhZGRyKTsKKwkJCWZyZWUoY3VyYWRkcik7CisJCX0KKworCQkvKgorCQkgKiBGcmVlIHRoZSBuYW1lIHN0cmluZy4KKwkJICovCisJCWZyZWUoY3VyZGV2LT5uYW1lKTsKKworCQkvKgorCQkgKiBGcmVlIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcsIGlmIGFueS4KKwkJICovCisJCWlmIChjdXJkZXYtPmRlc2NyaXB0aW9uICE9IE5VTEwpCisJCQlmcmVlKGN1cmRldi0+ZGVzY3JpcHRpb24pOworCisJCS8qCisJCSAqIEZyZWUgdGhlIGludGVyZmFjZS4KKwkJICovCisJCWZyZWUoY3VyZGV2KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mYWQtc2l0YS5jIGIvZmFkLXNpdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkZGYxZC4uMDAwMDAwMAotLS0gYS9mYWQtc2l0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqICBmYWQtc2l0YS5jOiBQYWNrZXQgY2FwdHVyZSBpbnRlcmZhY2UgYWRkaXRpb25zIGZvciBTSVRBIEFDTiBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoYykgMjAwNyBGdWxrbyBIZXcsIFNJVEEgSU5DIENhbmFkYSwgSW5jIDxmdWxrby5oZXdAc2l0YS5hZXJvPgotICoKLSAqICBMaWNlbnNlOiBCU0QKLSAqCi0gKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiAgYXJlIG1ldDoKLSAqCi0gKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICAgZGlzdHJpYnV0aW9uLgotICogIDMuIFRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJwY2FwLWludC5oIgotCi0jaW5jbHVkZSAicGNhcC1zaXRhLmgiCi0KLWV4dGVybiBwY2FwX2lmX3QJKmFjbl9pZl9saXN0OwkJCQkJCQkJLyogcGNhcCdzIGxpc3Qgb2YgYXZhaWxhYmxlIGludGVyZmFjZXMgKi8KLQotaW50IHBjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKSB7Ci0KLQkvL3ByaW50ZigicGNhcF9maW5kYWxsZGV2cygpXG4iKTsJCQkJLy8gZnVsa28KLQotCSphbGxkZXZzcCA9IDA7CQkJCQkJCQkJCQkJLyogaW5pdGlhbGl6ZSB0aGUgcmV0dXJuZWQgdmFyaWFibGVzIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyAqLwotCXN0cmNweShlcnJidWYsICIiKTsKLQlpZiAoYWNuX3BhcnNlX2hvc3RzX2ZpbGUoZXJyYnVmKSkJCQkJCQkJLyogc2NhbiB0aGUgaG9zdHMgZmlsZSBmb3IgcG90ZW50aWFsIElPUHMgKi8KLQkJewotCQkvL3ByaW50ZigicGNhcF9maW5kYWxsZGV2cygpIHJldHVybmluZyBCQUQgYWZ0ZXIgcGFyc2Vob3N0c1xuIik7CQkJCS8vIGZ1bGtvCi0JCXJldHVybiAtMTsKLQkJfQotCS8vcHJpbnRmKCJwY2FwX2ZpbmRhbGxkZXZzKCkgZ290IGhvc3RsaXN0IG5vdyBmaW5kaW5nIGRldnNcbiIpOwkJCQkvLyBmdWxrbwotCWlmIChhY25fZmluZGFsbGRldnMoZXJyYnVmKSkJCQkJCQkJCS8qIHRoZW4gYXNrIHRoZSBJT1BzIGZvciB0aGVpciBtb25pdG9yYWJsZSBkZXZpY2VzICovCi0JCXsKLQkJLy9wcmludGYoInBjYXBfZmluZGFsbGRldnMoKSByZXR1cm5pbmcgQkFEIGFmdGVyIGZpbmRhbGxkZXZzXG4iKTsJCQkJLy8gZnVsa28KLQkJcmV0dXJuIC0xOwotCQl9Ci0JKmFsbGRldnNwID0gYWNuX2lmX2xpc3Q7Ci0JYWNuX2lmX2xpc3QgPSAwOwkJCQkJCQkJCQkJLyogdGhlbiBmb3JnZXQgb3VyIGxpc3QgaGVhZCwgYmVjYXVzZSBzb21lb25lIHdpbGwgY2FsbCBwY2FwX2ZyZWVhbGxkZXZzKCkgdG8gZW1wdHkgdGhlIG1hbGxvYydlZCBzdHVmZiAqLwotCS8vcHJpbnRmKCJwY2FwX2ZpbmRhbGxkZXZzKCkgcmV0dXJuaW5nIFpFUk8gT0tcbiIpOwkJCQkvLyBmdWxrbwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZmFkLXdpbjMyLmMgYi9mYWQtd2luMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4NTZiMS4uMDAwMDAwMAotLS0gYS9mYWQtd2luMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAyIC0gMjAwNSBOZXRHcm91cCwgUG9saXRlY25pY28gZGkgVG9yaW5vIChJdGFseSkKLSAqIENvcHlyaWdodCAoYykgMjAwNSAtIDIwMDYgQ0FDRSBUZWNobm9sb2dpZXMsIERhdmlzIChDYWxpZm9ybmlhKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBQb2xpdGVjbmljbyBkaSBUb3Jpbm8sIENBQ0UgVGVjaG5vbG9naWVzCi0gKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAqIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8cGNhcC5oPgotI2luY2x1ZGUgPHBjYXAtaW50Lmg+Ci0jaW5jbHVkZSA8UGFja2V0MzIuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLXN0YXRpYyBpbnQKLXBjYXBfYWRkX2lmX3dpbjMyKHBjYXBfaWZfdCAqKmRldmxpc3QsIGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlc2MsCi0gICAgY2hhciAqZXJyYnVmKQotewotCXBjYXBfaWZfdCAqY3VyZGV2OwotCW5wZl9pZl9hZGRyIGlmX2FkZHJzW01BWF9ORVRXT1JLX0FERFJFU1NFU107Ci0JTE9ORyBpZl9hZGRyX3NpemU7Ci0JaW50IHJlcyA9IDA7Ci0KLQlpZl9hZGRyX3NpemUgPSBNQVhfTkVUV09SS19BRERSRVNTRVM7Ci0KLQkvKgotCSAqIEFkZCBhbiBlbnRyeSBmb3IgdGhpcyBpbnRlcmZhY2UsIHdpdGggbm8gYWRkcmVzc2VzLgotCSAqLwotCWlmIChhZGRfb3JfZmluZF9pZigmY3VyZGV2LCBkZXZsaXN0LCBuYW1lLCAwLCBkZXNjLCBlcnJidWYpID09IC0xKSB7Ci0JCS8qCi0JCSAqIEZhaWx1cmUuCi0JCSAqLwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQkvKgotCSAqIEdldCB0aGUgbGlzdCBvZiBhZGRyZXNzZXMgZm9yIHRoZSBpbnRlcmZhY2UuCi0JICovCi0JaWYgKCFQYWNrZXRHZXROZXRJbmZvRXgoKHZvaWQgKiluYW1lLCBpZl9hZGRycywgJmlmX2FkZHJfc2l6ZSkpIHsKLQkJLyoKLQkJICogRmFpbHVyZS4KLQkJICoKLQkJICogV2UgZG9uJ3QgcmV0dXJuIGFuIGVycm9yLCBiZWNhdXNlIHRoaXMgY2FuIGhhcHBlbiB3aXRoCi0JCSAqIE5kaXNXYW4gaW50ZXJmYWNlcywgYW5kIHdlIHdhbnQgdG8gc3VwcGx5IHRoZW0gZXZlbgotCQkgKiBpZiB3ZSBjYW4ndCBzdXBwbHkgdGhlaXIgYWRkcmVzc2VzLgotCQkgKgotCQkgKiBXZSByZXR1cm4gYW4gZW50cnkgd2l0aCBhbiBlbXB0eSBhZGRyZXNzIGxpc3QuCi0JCSAqLwotCQlyZXR1cm4gKDApOwotCX0KLQotCS8qCi0JICogTm93IGFkZCB0aGUgYWRkcmVzc2VzLgotCSAqLwotCXdoaWxlIChpZl9hZGRyX3NpemUtLSA+IDApIHsKLQkJLyoKLQkJICogImN1cmRldiIgaXMgYW4gZW50cnkgZm9yIHRoaXMgaW50ZXJmYWNlOyBhZGQgYW4gZW50cnkgZm9yCi0JCSAqIHRoaXMgYWRkcmVzcyB0byBpdHMgbGlzdCBvZiBhZGRyZXNzZXMuCi0JCSAqLwotCQlpZihjdXJkZXYgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQlyZXMgPSBhZGRfYWRkcl90b19kZXYoY3VyZGV2LAotCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZpZl9hZGRyc1tpZl9hZGRyX3NpemVdLklQQWRkcmVzcywKLQkJICAgIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpLAotCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZpZl9hZGRyc1tpZl9hZGRyX3NpemVdLlN1Ym5ldE1hc2ssCi0JCSAgICBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSwKLQkJICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmaWZfYWRkcnNbaWZfYWRkcl9zaXplXS5Ccm9hZGNhc3QsCi0JCSAgICBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSwKLQkJICAgIE5VTEwsCi0JCSAgICAwLAotCQkgICAgZXJyYnVmKTsKLQkJaWYgKHJlcyA9PSAtMSkgewotCQkJLyoKLQkJCSAqIEZhaWx1cmUuCi0JCQkgKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIChyZXMpOwotfQotCi0KLS8qCi0gKiBHZXQgYSBsaXN0IG9mIGFsbCBpbnRlcmZhY2VzIHRoYXQgYXJlIHVwIGFuZCB0aGF0IHdlIGNhbiBvcGVuLgotICogUmV0dXJucyAtMSBvbiBlcnJvciwgMCBvdGhlcndpc2UuCi0gKiBUaGUgbGlzdCwgYXMgcmV0dXJuZWQgdGhyb3VnaCAiYWxsZGV2c3AiLCBtYXkgYmUgbnVsbCBpZiBubyBpbnRlcmZhY2VzCi0gKiB3ZXJlIHVwIGFuZCBjb3VsZCBiZSBvcGVuZWQuCi0gKgotICogV2luMzIgaW1wbGVtZW50YXRpb24sIGJhc2VkIG9uIFdpblBjYXAKLSAqLwotaW50Ci1wY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKLXsKLQlwY2FwX2lmX3QgKmRldmxpc3QgPSBOVUxMOwotCWludCByZXQgPSAwOwotCWNvbnN0IGNoYXIgKmRlc2M7Ci0JY2hhciAqQWRhcHRlcnNOYW1lOwotCVVMT05HIE5hbWVMZW5ndGg7Ci0JY2hhciAqbmFtZTsKLQotCS8qCi0JICogRmluZCBvdXQgaG93IGJpZyBhIGJ1ZmZlciB3ZSBuZWVkLgotCSAqCi0JICogVGhpcyBjYWxsIHNob3VsZCBhbHdheXMgcmV0dXJuIEZBTFNFOyBpZiB0aGUgZXJyb3IgaXMKLQkgKiBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSLCBOYW1lTGVuZ3RoIHdpbGwgYmUgc2V0IHRvCi0JICogdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3ZSBuZWVkLCBvdGhlcndpc2UgdGhlcmUncyBhCi0JICogcHJvYmxlbSwgYW5kIE5hbWVMZW5ndGggc2hvdWxkIGJlIHNldCB0byAwLgotCSAqCi0JICogSXQgc2hvdWxkbid0IHJlcXVpcmUgTmFtZUxlbmd0aCB0byBiZSBzZXQsIGJ1dCwKLQkgKiBhdCBsZWFzdCBhcyBvZiBXaW5QY2FwIDQuMS4zLCBpdCBjaGVja3Mgd2hldGhlcgotCSAqIE5hbWVMZW5ndGggaXMgYmlnIGVub3VnaCBiZWZvcmUgaXQgY2hlY2tzIGZvciBhCi0JICogTlVMTCBidWZmZXIgYXJndW1lbnQsIHNvLCB3aGlsZSBpdCdsbCBzdGlsbCBkbwotCSAqIHRoZSByaWdodCB0aGluZyBpZiBOYW1lTGVuZ3RoIGlzIHVuaW5pdGlhbGl6ZWQgYW5kCi0JICogd2hhdGV2ZXIganVuayBoYXBwZW5zIHRvIGJlIHRoZXJlIGlzIGJpZyBlbm91Z2gKLQkgKiAoYmVjYXVzZSB0aGUgcG9pbnRlciBhcmd1bWVudCB3aWxsIGJlIG51bGwpLCBpdCdzCi0JICogc3RpbGwgcmVhZGluZyBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLgotCSAqLwotCU5hbWVMZW5ndGggPSAwOwotCWlmICghUGFja2V0R2V0QWRhcHRlck5hbWVzKE5VTEwsICZOYW1lTGVuZ3RoKSkKLQl7Ci0JCURXT1JEIGxhc3RfZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKLQotCQlpZiAobGFzdF9lcnJvciAhPSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQotCQl7Ci0JCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkJIlBhY2tldEdldEFkYXB0ZXJOYW1lczogJXMiLAotCQkJCXBjYXBfd2luMzJzdHJlcnJvcigpKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JfQotCi0JaWYgKE5hbWVMZW5ndGggPiAwKQotCQlBZGFwdGVyc05hbWUgPSAoY2hhciopIG1hbGxvYyhOYW1lTGVuZ3RoKTsKLQllbHNlCi0JewotCQkqYWxsZGV2c3AgPSBOVUxMOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKEFkYXB0ZXJzTmFtZSA9PSBOVUxMKQotCXsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2Fubm90IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gbGlzdCB0aGUgYWRhcHRlcnMuIik7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCWlmICghUGFja2V0R2V0QWRhcHRlck5hbWVzKEFkYXB0ZXJzTmFtZSwgJk5hbWVMZW5ndGgpKSB7Ci0JCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCSJQYWNrZXRHZXRBZGFwdGVyTmFtZXM6ICVzIiwKLQkJCXBjYXBfd2luMzJzdHJlcnJvcigpKTsKLQkJZnJlZShBZGFwdGVyc05hbWUpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQkvKgotCSAqICJQYWNrZXRHZXRBZGFwdGVyTmFtZXMoKSIgcmV0dXJuZWQgYSBsaXN0IG9mCi0JICogbnVsbC10ZXJtaW5hdGVkIEFTQ0lJIGludGVyZmFjZSBuYW1lIHN0cmluZ3MsCi0JICogdGVybWluYXRlZCBieSBhIG51bGwgc3RyaW5nLCBmb2xsb3dlZCBieSBhIGxpc3QKLQkgKiBvZiBudWxsLXRlcm1pbmF0ZWQgQVNDSUkgaW50ZXJmYWNlIGRlc2NyaXB0aW9uCi0JICogc3RyaW5ncywgdGVybWluYXRlZCBieSBhIG51bGwgc3RyaW5nLgotCSAqIFRoaXMgbWVhbnMgdGhlcmUgYXJlIHR3byBBU0NJSSBudWxscyBhdCB0aGUgZW5kCi0JICogb2YgdGhlIGZpcnN0IGxpc3QuCi0JICoKLQkgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGZpcnN0IGxpc3Q7IHRoYXQncyB0aGUKLQkgKiBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBsaXN0LgotCSAqLwotCWRlc2MgPSAmQWRhcHRlcnNOYW1lWzBdOwotCXdoaWxlICgqZGVzYyAhPSAnXDAnIHx8ICooZGVzYyArIDEpICE9ICdcMCcpCi0JCWRlc2MrKzsKLQotCS8qCi0gCSAqIEZvdW5kIGl0IC0gImRlc2MiIHBvaW50cyB0byB0aGUgZmlyc3Qgb2YgdGhlIHR3bwotCSAqIG51bGxzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgbmFtZXMsIHNvIHRoZQotCSAqIGZpcnN0IGJ5dGUgb2YgdGhlIGxpc3Qgb2YgZGVzY3JpcHRpb25zIGlzIHR3byBieXRlcwotCSAqIGFmdGVyIGl0LgotCSAqLwotCWRlc2MgKz0gMjsKLQotCS8qCi0JICogTG9vcCBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGUgZmlyc3QgbGlzdC4KLQkgKi8KLQluYW1lID0gJkFkYXB0ZXJzTmFtZVswXTsKLQl3aGlsZSAoKm5hbWUgIT0gJ1wwJykgewotCQkvKgotCQkgKiBBZGQgYW4gZW50cnkgZm9yIHRoaXMgaW50ZXJmYWNlLgotCQkgKi8KLQkJaWYgKHBjYXBfYWRkX2lmX3dpbjMyKCZkZXZsaXN0LCBuYW1lLCBkZXNjLCBlcnJidWYpID09IC0xKSB7Ci0JCQkvKgotCQkJICogRmFpbHVyZS4KLQkJCSAqLwotCQkJcmV0ID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCQluYW1lICs9IHN0cmxlbihuYW1lKSArIDE7Ci0JCWRlc2MgKz0gc3RybGVuKGRlc2MpICsgMTsKLQl9Ci0KLQlpZiAocmV0ICE9IC0xKSB7Ci0JCS8qCi0JCSAqIFdlIGhhdmVuJ3QgaGFkIGFueSBlcnJvcnMgeWV0OyBkbyBhbnkgcGxhdGZvcm0tc3BlY2lmaWMKLQkJICogb3BlcmF0aW9ucyB0byBhZGQgZGV2aWNlcy4KLQkJICovCi0JCWlmIChwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKCZkZXZsaXN0LCBlcnJidWYpIDwgMCkKLQkJCXJldCA9IC0xOwotCX0KLQotCWlmIChyZXQgPT0gLTEpIHsKLQkJLyoKLQkJICogV2UgaGFkIGFuIGVycm9yOyBmcmVlIHRoZSBsaXN0IHdlJ3ZlIGJlZW4gY29uc3RydWN0aW5nLgotCQkgKi8KLQkJaWYgKGRldmxpc3QgIT0gTlVMTCkgewotCQkJcGNhcF9mcmVlYWxsZGV2cyhkZXZsaXN0KTsKLQkJCWRldmxpc3QgPSBOVUxMOwotCQl9Ci0JfQotCi0JKmFsbGRldnNwID0gZGV2bGlzdDsKLQlmcmVlKEFkYXB0ZXJzTmFtZSk7Ci0JcmV0dXJuIChyZXQpOwotfQpkaWZmIC0tZ2l0IGEvZ2VuX3ZlcnNpb25fYy5zaCBiL2dlbl92ZXJzaW9uX2Muc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDVhNWU3NQotLS0gL2Rldi9udWxsCisrKyBiL2dlbl92ZXJzaW9uX2Muc2gKQEAgLTAsMCArMSwxMSBAQAorIyEgL2Jpbi9zaAorZWNobyAnI2luY2x1ZGUgPHBjYXAvZXhwb3J0LWRlZnMuaD4nID4gIiQyIgorZWNobyAnUENBUF9BUElfREVGJyA+PiAiJDIiCitpZiBncmVwIEdJVCAiJDEiID4vZGV2L251bGw7IHRoZW4KKwlyZWFkIHZlciA8IiQxIgorCWVjaG8gJHZlciB8IHRyIC1kICdcMDEyJworCWRhdGUgK18lWV8lbV8lZAorZWxzZQorCWNhdCAiJDEiCitmaSB8IHNlZCAtZSAncy8uKi9jaGFyIHBjYXBfdmVyc2lvbltdID0gIiYiOy8nID4+ICIkMiIKKwpkaWZmIC0tZ2l0IGEvZ2VuX3ZlcnNpb25faGVhZGVyLnNoIGIvZ2VuX3ZlcnNpb25faGVhZGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZiNGI4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9nZW5fdmVyc2lvbl9oZWFkZXIuc2gKQEAgLTAsMCArMSwxOSBAQAorIyEgL2Jpbi9zaAorcHJpbnRfdmVyc2lvbl9zdHJpbmcoKQoreworCWlmIGdyZXAgR0lUICIkMSIgPi9kZXYvbnVsbAorCXRoZW4KKwkJcmVhZCB2ZXIgPCIkMSIKKwkJZWNobyAkdmVyIHwgdHIgLWQgJ1wwMTInCisJCWRhdGUgK18lWV8lbV8lZAorCWVsc2UKKwkJY2F0ICIkMSIKKwlmaQorfQoraWYgdGVzdCAkIyAhPSAzCit0aGVuCisJZWNobyAiVXNhZ2U6IGdlbl92ZXJzaW9uX2hlYWRlci5zaCA8dmVyc2lvbiBmaWxlPiA8dGVtcGxhdGU+IDxvdXRwdXQgZmlsZT4iIDE+JjIKKwlleGl0IDEKK2ZpCit2ZXJzaW9uX3N0cmluZz1gcHJpbnRfdmVyc2lvbl9zdHJpbmcgIiQxImAKK3NlZCAicy8lJUxJQlBDQVBfVkVSU0lPTiUlLyR2ZXJzaW9uX3N0cmluZy8iICIkMiIgPiIkMyIKZGlmZiAtLWdpdCBhL2dlbmNvZGUuYyBiL2dlbmNvZGUuYwppbmRleCBhZDkzOGQ0Li5hODg3ZjI3IDEwMDY0NAotLS0gYS9nZW5jb2RlLmMKKysrIGIvZ2VuY29kZS5jCkBAIC0yNCw5ICsyNCw5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKIAotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCiAjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KLSNlbHNlIC8qIFdJTjMyICovCisjZWxzZSAvKiBfV0lOMzIgKi8KICNpZiBIQVZFX0lOVFRZUEVTX0gKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2VsaWYgSEFWRV9TVERJTlRfSApAQCAtMzcsMTYgKzM3LDkgQEAKICNlbmRpZgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIF9XSU4zMiAqLwogCi0vKgotICogWFhYIC0gd2h5IHdhcyB0aGlzIGluY2x1ZGVkIGV2ZW4gb24gVU5JWD8KLSAqLwotI2lmZGVmIF9fTUlOR1czMl9fCi0jaW5jbHVkZSAiaXA2X21pc2MuaCIKLSNlbmRpZgotCi0jaWZuZGVmIFdJTjMyCisjaWZuZGVmIF9XSU4zMgogCiAjaWZkZWYgX19OZXRCU0RfXwogI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgpAQCAtNTUsNyArNDgsNyBAQAogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2VuZGlmIC8qIFdJTjMyICovCisjZW5kaWYgLyogX1dJTjMyICovCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTgwLDI3ICs3Myw4MCBAQAogI2luY2x1ZGUgInBjYXAvc2xsLmgiCiAjaW5jbHVkZSAicGNhcC9pcG5ldC5oIgogI2luY2x1ZGUgImFyY25ldC5oIgorCisjaW5jbHVkZSAiZ3JhbW1hci5oIgorI2luY2x1ZGUgInNjYW5uZXIuaCIKKwogI2lmIGRlZmluZWQobGludXgpICYmIGRlZmluZWQoUEZfUEFDS0VUKSAmJiBkZWZpbmVkKFNPX0FUVEFDSF9GSUxURVIpCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KICNlbmRpZgorCiAjaWZkZWYgSEFWRV9ORVRfUEZWQVJfSAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxuZXQvaWYuaD4KICNpbmNsdWRlIDxuZXQvcGZ2YXIuaD4KICNpbmNsdWRlIDxuZXQvaWZfcGZsb2cuaD4KICNlbmRpZgorCiAjaWZuZGVmIG9mZnNldG9mCiAjZGVmaW5lIG9mZnNldG9mKHMsIGUpICgoc2l6ZV90KSYoKHMgKikwKS0+ZSkKICNlbmRpZgorCiAjaWZkZWYgSU5FVDYKLSNpZm5kZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiBkZWZpbmVkKERFRklORV9BRERJVElPTkFMX0lQVjZfU1RVRkYpCisvKiBJUHY2IGFkZHJlc3MgKi8KK3N0cnVjdCBpbjZfYWRkcgorICB7CisgICAgdW5pb24KKyAgICAgIHsKKwl1X2ludDhfdAkJdTZfYWRkcjhbMTZdOworCXVfaW50MTZfdAl1Nl9hZGRyMTZbOF07CisJdV9pbnQzMl90CXU2X2FkZHIzMls0XTsKKyAgICAgIH0gaW42X3U7CisjZGVmaW5lIHM2X2FkZHIJCQlpbjZfdS51Nl9hZGRyOAorI2RlZmluZSBzNl9hZGRyMTYJCWluNl91LnU2X2FkZHIxNgorI2RlZmluZSBzNl9hZGRyMzIJCWluNl91LnU2X2FkZHIzMgorI2RlZmluZSBzNl9hZGRyNjQJCWluNl91LnU2X2FkZHI2NAorICB9OworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CXNhX2ZhbWlseV90OworCisjZGVmaW5lCV9fU09DS0FERFJfQ09NTU9OKHNhX3ByZWZpeCkgXAorICBzYV9mYW1pbHlfdCBzYV9wcmVmaXgjI2ZhbWlseQorCisvKiBEaXR0bywgZm9yIElQdjYuICAqLworc3RydWN0IHNvY2thZGRyX2luNgorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNpbjZfKTsKKyAgICB1X2ludDE2X3Qgc2luNl9wb3J0OwkJLyogVHJhbnNwb3J0IGxheWVyIHBvcnQgIyAqLworICAgIHVfaW50MzJfdCBzaW42X2Zsb3dpbmZvOwkvKiBJUHY2IGZsb3cgaW5mb3JtYXRpb24gKi8KKyAgICBzdHJ1Y3QgaW42X2FkZHIgc2luNl9hZGRyOwkvKiBJUHY2IGFkZHJlc3MgKi8KKyAgfTsKKworI2lmbmRlZiBFQUlfQUREUkZBTUlMWQorc3RydWN0IGFkZHJpbmZvIHsKKwlpbnQJYWlfZmxhZ3M7CS8qIEFJX1BBU1NJVkUsIEFJX0NBTk9OTkFNRSAqLworCWludAlhaV9mYW1pbHk7CS8qIFBGX3h4eCAqLworCWludAlhaV9zb2NrdHlwZTsJLyogU09DS194eHggKi8KKwlpbnQJYWlfcHJvdG9jb2w7CS8qIDAgb3IgSVBQUk9UT194eHggZm9yIElQdjQgYW5kIElQdjYgKi8KKwlzaXplX3QJYWlfYWRkcmxlbjsJLyogbGVuZ3RoIG9mIGFpX2FkZHIgKi8KKwljaGFyCSphaV9jYW5vbm5hbWU7CS8qIGNhbm9uaWNhbCBuYW1lIGZvciBob3N0bmFtZSAqLworCXN0cnVjdCBzb2NrYWRkciAqYWlfYWRkcjsJLyogYmluYXJ5IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWRkcmluZm8gKmFpX25leHQ7CS8qIG5leHQgc3RydWN0dXJlIGluIGxpbmtlZCBsaXN0ICovCit9OworI2VuZGlmIC8qIEVBSV9BRERSRkFNSUxZICovCisjZW5kaWYgLyogZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChERUZJTkVfQURESVRJT05BTF9JUFY2X1NUVUZGKSAqLworI2Vsc2UgLyogX1dJTjMyICovCiAjaW5jbHVkZSA8bmV0ZGIuaD4JLyogZm9yICJzdHJ1Y3QgYWRkcmluZm8iICovCi0jZW5kaWYgLyogV0lOMzIgKi8KLSNlbmRpZiAvKklORVQ2Ki8KKyNlbmRpZiAvKiBfV0lOMzIgKi8KKyNlbmRpZiAvKiBJTkVUNiAqLwogI2luY2x1ZGUgPHBjYXAvbmFtZWRiLmg+CiAKKyNpbmNsdWRlICJuYW1ldG9hZGRyLmgiCisKICNkZWZpbmUgRVRIRVJNVFUJMTUwMAogCiAjaWZuZGVmIEVUSEVSVFlQRV9URUIKQEAgLTEzMSw0MiArMTc3LDI2IEBACiAKICNkZWZpbmUgSk1QKGMpICgoYyl8QlBGX0pNUHxCUEZfSykKIAotLyogTG9jYWxzICovCi1zdGF0aWMgam1wX2J1ZiB0b3BfY3R4Owotc3RhdGljIHBjYXBfdCAqYnBmX3BjYXA7Ci0KLS8qIEhhY2sgZm9yIGhhbmRsaW5nIFZMQU4gYW5kIE1QTFMgc3RhY2tzLiAqLwotI2lmZGVmIFdJTjMyCi1zdGF0aWMgdV9pbnQJbGFiZWxfc3RhY2tfZGVwdGggPSAodV9pbnQpLTEsIHZsYW5fc3RhY2tfZGVwdGggPSAodV9pbnQpLTE7Ci0jZWxzZQotc3RhdGljIHVfaW50CWxhYmVsX3N0YWNrX2RlcHRoID0gLTFVLCB2bGFuX3N0YWNrX2RlcHRoID0gLTFVOwotI2VuZGlmCi0KLS8qIFhYWCAqLwotc3RhdGljIGludAlwY2FwX2ZkZGlwYWQ7Ci0KLS8qIFZBUkFSR1MgKi8KLXZvaWQKLWJwZl9lcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFwOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JaWYgKGJwZl9wY2FwICE9IE5VTEwpCi0JCSh2b2lkKXZzbnByaW50ZihwY2FwX2dldGVycihicGZfcGNhcCksIFBDQVBfRVJSQlVGX1NJWkUsCi0JCSAgICBmbXQsIGFwKTsKLQl2YV9lbmQoYXApOwotCWxvbmdqbXAodG9wX2N0eCwgMSk7Ci0JLyogTk9UUkVBQ0hFRCAqLworLyoKKyAqICJQdXNoIiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbGluay1sYXllciBoZWFkZXIgdHlwZSBhbmQgbGluay1sYXllcgorICogaGVhZGVyIG9mZnNldCBvbnRvIGEgInN0YWNrIiwgYW5kIHNldCBhIG5ldyB2YWx1ZS4gIChJdCdzIG5vdCBhCisgKiBmdWxsLWJsb3duIHN0YWNrOyB3ZSBrZWVwIG9ubHkgdGhlIHRvcCB0d28gaXRlbXMuKQorICovCisjZGVmaW5lIFBVU0hfTElOS0hEUihjcywgbmV3X2xpbmt0eXBlLCBuZXdfaXNfdmFyaWFibGUsIG5ld19jb25zdGFudF9wYXJ0LCBuZXdfcmVnKSBcCit7IFwKKwkoY3MpLT5wcmV2bGlua3R5cGUgPSAoY3MpLT5saW5rdHlwZTsgXAorCShjcyktPm9mZl9wcmV2bGlua2hkciA9IChjcyktPm9mZl9saW5raGRyOyBcCisJKGNzKS0+bGlua3R5cGUgPSAobmV3X2xpbmt0eXBlKTsgXAorCShjcyktPm9mZl9saW5raGRyLmlzX3ZhcmlhYmxlID0gKG5ld19pc192YXJpYWJsZSk7IFwKKwkoY3MpLT5vZmZfbGlua2hkci5jb25zdGFudF9wYXJ0ID0gKG5ld19jb25zdGFudF9wYXJ0KTsgXAorCShjcyktPm9mZl9saW5raGRyLnJlZyA9IChuZXdfcmVnKTsgXAorCShjcyktPmlzX2dlbmV2ZSA9IDA7IFwKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9saW5rdHlwZShwY2FwX3QgKik7Ci0KLXN0YXRpYyB2b2lkIGluaXRfcmVncyh2b2lkKTsKLXN0YXRpYyBpbnQgYWxsb2NfcmVnKHZvaWQpOwotc3RhdGljIHZvaWQgZnJlZV9yZWcoaW50KTsKLQotc3RhdGljIHN0cnVjdCBibG9jayAqcm9vdDsKKy8qCisgKiBPZmZzZXQgIm5vdCBzZXQiIHZhbHVlLgorICovCisjZGVmaW5lIE9GRlNFVF9OT1RfU0VUCTB4ZmZmZmZmZmZVCiAKIC8qCiAgKiBBYnNvbHV0ZSBvZmZzZXRzLCB3aGljaCBhcmUgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhdwpAQCAtMjA4LDE3ICsyMzgsNiBAQAogCU9SX1RSQU5fSVBWNgkJLyogdHJhbnNwb3J0LWxheWVyIGhlYWRlciwgd2l0aCBJUHY2IG5ldHdvcmsgbGF5ZXIgKi8KIH07CiAKLSNpZmRlZiBJTkVUNgotLyoKLSAqIEFzIGVycm9ycyBhcmUgaGFuZGxlZCBieSBhIGxvbmdqbXAsIGFueXRoaW5nIGFsbG9jYXRlZCBtdXN0IGJlIGZyZWVkCi0gKiBpbiB0aGUgbG9uZ2ptcCBoYW5kbGVyLCBzbyBpdCBtdXN0IGJlIHJlYWNoYWJsZSBmcm9tIHRoYXQgaGFuZGxlci4KLSAqIE9uZSB0aGluZyB0aGF0J3MgYWxsb2NhdGVkIGlzIHRoZSByZXN1bHQgb2YgcGNhcF9uYW1ldG9hZGRyaW5mbygpOwotICogaXQgbXVzdCBiZSBmcmVlZCB3aXRoIGZyZWVhZGRyaW5mbygpLiAgVGhpcyB2YXJpYWJsZSBwb2ludHMgdG8gYW55Ci0gKiBhZGRyaW5mbyBzdHJ1Y3R1cmUgdGhhdCB3b3VsZCBuZWVkIHRvIGJlIGZyZWVkLgotICovCi1zdGF0aWMgc3RydWN0IGFkZHJpbmZvICphaTsKLSNlbmRpZgotCiAvKgogICogV2UgZGl2eSBvdXQgY2h1bmtzIG9mIG1lbW9yeSByYXRoZXIgdGhhbiBjYWxsIG1hbGxvYyBlYWNoIHRpbWUgc28KICAqIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbGVha2luZyBtZW1vcnkuICBJdCdzIHByb2JhYmx5CkBAIC0yMzAsOTkgKzI0OSwzMjQgQEAKICNkZWZpbmUgTkNIVU5LUyAxNgogI2RlZmluZSBDSFVOSzBTSVpFIDEwMjQKIHN0cnVjdCBjaHVuayB7Ci0JdV9pbnQgbl9sZWZ0OworCXNpemVfdCBuX2xlZnQ7CiAJdm9pZCAqbTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2h1bmsgY2h1bmtzW05DSFVOS1NdOwotc3RhdGljIGludCBjdXJfY2h1bms7CisvKiBDb2RlIGdlbmVyYXRvciBzdGF0ZSAqLwogCi1zdGF0aWMgdm9pZCAqbmV3Y2h1bmsodV9pbnQpOwotc3RhdGljIHZvaWQgZnJlZWNodW5rcyh2b2lkKTsKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJsb2NrICpuZXdfYmxvY2soaW50KTsKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNsaXN0ICpuZXdfc3RtdChpbnQpOwotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3JldGJsayhpbnQpOwotc3RhdGljIGlubGluZSB2b2lkIHN5bnRheCh2b2lkKTsKK3N0cnVjdCBfY29tcGlsZXJfc3RhdGUgeworCWptcF9idWYgdG9wX2N0eDsKKwlwY2FwX3QgKmJwZl9wY2FwOworCisJc3RydWN0IGljb2RlIGljOworCisJaW50IHNuYXBsZW47CisKKwlpbnQgbGlua3R5cGU7CisJaW50IHByZXZsaW5rdHlwZTsKKwlpbnQgb3V0ZXJtb3N0bGlua3R5cGU7CisKKwlicGZfdV9pbnQzMiBuZXRtYXNrOworCWludCBub19vcHRpbWl6ZTsKKworCS8qIEhhY2sgZm9yIGhhbmRsaW5nIFZMQU4gYW5kIE1QTFMgc3RhY2tzLiAqLworCXVfaW50IGxhYmVsX3N0YWNrX2RlcHRoOworCXVfaW50IHZsYW5fc3RhY2tfZGVwdGg7CisKKwkvKiBYWFggKi8KKwl1X2ludCBwY2FwX2ZkZGlwYWQ7CisKKyNpZmRlZiBJTkVUNgorCS8qCisJICogQXMgZXJyb3JzIGFyZSBoYW5kbGVkIGJ5IGEgbG9uZ2ptcCwgYW55dGhpbmcgYWxsb2NhdGVkIG11c3QKKwkgKiBiZSBmcmVlZCBpbiB0aGUgbG9uZ2ptcCBoYW5kbGVyLCBzbyBpdCBtdXN0IGJlIHJlYWNoYWJsZQorCSAqIGZyb20gdGhhdCBoYW5kbGVyLgorCSAqCisJICogT25lIHRoaW5nIHRoYXQncyBhbGxvY2F0ZWQgaXMgdGhlIHJlc3VsdCBvZiBwY2FwX25hbWV0b2FkZHJpbmZvKCk7CisJICogaXQgbXVzdCBiZSBmcmVlZCB3aXRoIGZyZWVhZGRyaW5mbygpLiAgVGhpcyB2YXJpYWJsZSBwb2ludHMgdG8KKwkgKiBhbnkgYWRkcmluZm8gc3RydWN0dXJlIHRoYXQgd291bGQgbmVlZCB0byBiZSBmcmVlZC4KKwkgKi8KKwlzdHJ1Y3QgYWRkcmluZm8gKmFpOworI2VuZGlmCisKKwkvKgorCSAqIFZhcmlvdXMgY29kZSBjb25zdHJ1Y3RzIG5lZWQgdG8ga25vdyB0aGUgbGF5b3V0IG9mIHRoZSBwYWNrZXQuCisJICogVGhlc2UgdmFsdWVzIGdpdmUgdGhlIG5lY2Vzc2FyeSBvZmZzZXRzIGZyb20gdGhlIGJlZ2lubmluZworCSAqIG9mIHRoZSBwYWNrZXQgZGF0YS4KKwkgKi8KKworCS8qCisJICogQWJzb2x1dGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLgorCSAqLworCWJwZl9hYnNfb2Zmc2V0IG9mZl9saW5raGRyOworCisJLyoKKwkgKiBJZiB3ZSdyZSBjaGVja2luZyBhIGxpbmstbGF5ZXIgaGVhZGVyIGZvciBhIHBhY2tldCBlbmNhcHN1bGF0ZWQKKwkgKiBpbiBhbm90aGVyIHByb3RvY29sIGxheWVyLCB0aGlzIGlzIHRoZSBlcXVpdmFsZW50IGluZm9ybWF0aW9uCisJICogZm9yIHRoZSBwcmV2aW91cyBsYXllcnMnIGxpbmstbGF5ZXIgaGVhZGVyIGZyb20gdGhlIGJlZ2lubmluZworCSAqIG9mIHRoZSByYXcgcGFja2V0IGRhdGEuCisJICovCisJYnBmX2Fic19vZmZzZXQgb2ZmX3ByZXZsaW5raGRyOworCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IGluZm9ybWF0aW9uIGZvciB0aGUgb3V0ZXJtb3N0IGxheWVycycKKwkgKiBsaW5rLWxheWVyIGhlYWRlci4KKwkgKi8KKwlicGZfYWJzX29mZnNldCBvZmZfb3V0ZXJtb3N0bGlua2hkcjsKKworCS8qCisJICogQWJzb2x1dGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgcGF5bG9hZC4KKwkgKi8KKwlicGZfYWJzX29mZnNldCBvZmZfbGlua3BsOworCisJLyoKKwkgKiAib2ZmX2xpbmt0eXBlIiBpcyB0aGUgb2Zmc2V0IHRvIGluZm9ybWF0aW9uIGluIHRoZSBsaW5rLWxheWVyCisJICogaGVhZGVyIGdpdmluZyB0aGUgcGFja2V0IHR5cGUuIFRoaXMgaXMgYW4gYWJzb2x1dGUgb2Zmc2V0CisJICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQuCisJICoKKwkgKiBGb3IgRXRoZXJuZXQsIGl0J3MgdGhlIG9mZnNldCBvZiB0aGUgRXRoZXJuZXQgdHlwZSBmaWVsZDsgdGhpcworCSAqIG1lYW5zIHRoYXQgaXQgbXVzdCBoYXZlIGEgdmFsdWUgdGhhdCBza2lwcyBWTEFOIHRhZ3MuCisJICoKKwkgKiBGb3IgbGluay1sYXllciB0eXBlcyB0aGF0IGFsd2F5cyB1c2UgODAyLjIgaGVhZGVycywgaXQncyB0aGUKKwkgKiBvZmZzZXQgb2YgdGhlIExMQyBoZWFkZXI7IHRoaXMgbWVhbnMgdGhhdCBpdCBtdXN0IGhhdmUgYSB2YWx1ZQorCSAqIHRoYXQgc2tpcHMgVkxBTiB0YWdzLgorCSAqCisJICogRm9yIFBQUCwgaXQncyB0aGUgb2Zmc2V0IG9mIHRoZSBQUFAgdHlwZSBmaWVsZC4KKwkgKgorCSAqIEZvciBDaXNjbyBIRExDLCBpdCdzIHRoZSBvZmZzZXQgb2YgdGhlIENIRExDIHR5cGUgZmllbGQuCisJICoKKwkgKiBGb3IgQlNEIGxvb3BiYWNrLCBpdCdzIHRoZSBvZmZzZXQgb2YgdGhlIEFGXyB2YWx1ZS4KKwkgKgorCSAqIEZvciBMaW51eCBjb29rZWQgc29ja2V0cywgaXQncyB0aGUgb2Zmc2V0IG9mIHRoZSB0eXBlIGZpZWxkLgorCSAqCisJICogb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgaXMgc2V0IHRvIE9GRlNFVF9OT1RfU0VUIGZvciBubworCSAqIGVuY2Fwc3VsYXRpb24sIGluIHdoaWNoIGNhc2UsIElQIGlzIGFzc3VtZWQuCisJICovCisJYnBmX2Fic19vZmZzZXQgb2ZmX2xpbmt0eXBlOworCisJLyoKKwkgKiBUUlVFIGlmIHRoZSBsaW5rIGxheWVyIGluY2x1ZGVzIGFuIEFUTSBwc2V1ZG8taGVhZGVyLgorCSAqLworCWludCBpc19hdG07CisKKwkvKgorCSAqIFRSVUUgaWYgImdlbmV2ZSIgYXBwZWFyZWQgaW4gdGhlIGZpbHRlcjsgaXQgY2F1c2VzIHVzIHRvCisJICogZ2VuZXJhdGUgY29kZSB0aGF0IGNoZWNrcyBmb3IgYSBHZW5ldmUgaGVhZGVyIGFuZCBhc3N1bWUKKwkgKiB0aGF0IGxhdGVyIGZpbHRlcnMgYXBwbHkgdG8gdGhlIGVuY2Fwc3VsYXRlZCBwYXlsb2FkLgorCSAqLworCWludCBpc19nZW5ldmU7CisKKwkvKgorCSAqIFRoZXNlIGFyZSBvZmZzZXRzIGZvciB0aGUgQVRNIHBzZXVkby1oZWFkZXIuCisJICovCisJdV9pbnQgb2ZmX3ZwaTsKKwl1X2ludCBvZmZfdmNpOworCXVfaW50IG9mZl9wcm90bzsKKworCS8qCisJICogVGhlc2UgYXJlIG9mZnNldHMgZm9yIHRoZSBNVFAyIGZpZWxkcy4KKwkgKi8KKwl1X2ludCBvZmZfbGk7CisJdV9pbnQgb2ZmX2xpX2hzbDsKKworCS8qCisJICogVGhlc2UgYXJlIG9mZnNldHMgZm9yIHRoZSBNVFAzIGZpZWxkcy4KKwkgKi8KKwl1X2ludCBvZmZfc2lvOworCXVfaW50IG9mZl9vcGM7CisJdV9pbnQgb2ZmX2RwYzsKKwl1X2ludCBvZmZfc2xzOworCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIEFUTSBwc2V1ZG9faGVhZGVyLAorCSAqIG9yIC0xIGlmIHRoZXJlIGlzIG5vIEFUTSBwc2V1ZG8taGVhZGVyLgorCSAqLworCXVfaW50IG9mZl9wYXlsb2FkOworCisJLyoKKwkgKiBUaGVzZSBhcmUgb2Zmc2V0cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXR3b3JrLWxheWVyIGhlYWRlci4KKwkgKiBUaGV5IGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5rLWxheWVyIHBheWxvYWQKKwkgKiAoaS5lLiwgdGhleSBkb24ndCBpbmNsdWRlIG9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgb3IKKwkgKiBvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQpLgorCSAqCisJICogSWYgdGhlIGxpbmsgbGF5ZXIgbmV2ZXIgdXNlcyA4MDIuMiBMTEM6CisJICoKKwkgKgkib2ZmX25sIiBhbmQgIm9mZl9ubF9ub3NuYXAiIGFyZSB0aGUgc2FtZS4KKwkgKgorCSAqIElmIHRoZSBsaW5rIGxheWVyIGFsd2F5cyB1c2VzIDgwMi4yIExMQzoKKwkgKgorCSAqCSJvZmZfbmwiIGlzIHRoZSBvZmZzZXQgaWYgdGhlcmUncyBhIFNOQVAgaGVhZGVyIGZvbGxvd2luZworCSAqCXRoZSA4MDIuMiBoZWFkZXI7CisJICoKKwkgKgkib2ZmX25sX25vc25hcCIgaXMgdGhlIG9mZnNldCBpZiB0aGVyZSdzIG5vIFNOQVAgaGVhZGVyLgorCSAqCisJICogSWYgdGhlIGxpbmsgbGF5ZXIgaXMgRXRoZXJuZXQ6CisJICoKKwkgKgkib2ZmX25sIiBpcyB0aGUgb2Zmc2V0IGlmIHRoZSBwYWNrZXQgaXMgYW4gRXRoZXJuZXQgSUkgcGFja2V0CisJICoJKHdlIGFzc3VtZSBubyA4MDIuMys4MDIuMitTTkFQKTsKKwkgKgorCSAqCSJvZmZfbmxfbm9zbmFwIiBpcyB0aGUgb2Zmc2V0IGlmIHRoZSBwYWNrZXQgaXMgYW4gODAyLjMgcGFja2V0CisJICoJd2l0aCBhbiA4MDIuMiBoZWFkZXIgZm9sbG93aW5nIGl0LgorCSAqLworCXVfaW50IG9mZl9ubDsKKwl1X2ludCBvZmZfbmxfbm9zbmFwOworCisJLyoKKwkgKiBIZXJlIHdlIGhhbmRsZSBzaW1wbGUgYWxsb2NhdGlvbiBvZiB0aGUgc2NyYXRjaCByZWdpc3RlcnMuCisJICogSWYgdG9vIG1hbnkgcmVnaXN0ZXJzIGFyZSBhbGxvYydkLCB0aGUgYWxsb2NhdG9yIHB1bnRzLgorCSAqLworCWludCByZWd1c2VkW0JQRl9NRU1XT1JEU107CisJaW50IGN1cnJlZzsKKworCS8qCisJICogTWVtb3J5IGNodW5rcy4KKwkgKi8KKwlzdHJ1Y3QgY2h1bmsgY2h1bmtzW05DSFVOS1NdOworCWludCBjdXJfY2h1bms7Cit9OworCit2b2lkCiticGZfc3ludGF4X2Vycm9yKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgY2hhciAqbXNnKQoreworCWJwZl9lcnJvcihjc3RhdGUsICJzeW50YXggZXJyb3IgaW4gZmlsdGVyIGV4cHJlc3Npb246ICVzIiwgbXNnKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qIFZBUkFSR1MgKi8KK3ZvaWQKK2JwZl9lcnJvcihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlpZiAoY3N0YXRlLT5icGZfcGNhcCAhPSBOVUxMKQorCQkodm9pZClwY2FwX3ZzbnByaW50ZihwY2FwX2dldGVycihjc3RhdGUtPmJwZl9wY2FwKSwKKwkJICAgIFBDQVBfRVJSQlVGX1NJWkUsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJbG9uZ2ptcChjc3RhdGUtPnRvcF9jdHgsIDEpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQgaW5pdF9saW5rdHlwZShjb21waWxlcl9zdGF0ZV90ICosIHBjYXBfdCAqKTsKKworc3RhdGljIHZvaWQgaW5pdF9yZWdzKGNvbXBpbGVyX3N0YXRlX3QgKik7CitzdGF0aWMgaW50IGFsbG9jX3JlZyhjb21waWxlcl9zdGF0ZV90ICopOworc3RhdGljIHZvaWQgZnJlZV9yZWcoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOworCitzdGF0aWMgdm9pZCBpbml0Y2h1bmtzKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSk7CitzdGF0aWMgdm9pZCAqbmV3Y2h1bmsoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBzaXplX3QpOworc3RhdGljIHZvaWQgZnJlZWNodW5rcyhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2sgKm5ld19ibG9jayhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCk7CitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbGlzdCAqbmV3X3N0bXQoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3JldGJsayhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCk7CitzdGF0aWMgaW5saW5lIHZvaWQgc3ludGF4KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSk7CiAKIHN0YXRpYyB2b2lkIGJhY2twYXRjaChzdHJ1Y3QgYmxvY2sgKiwgc3RydWN0IGJsb2NrICopOwogc3RhdGljIHZvaWQgbWVyZ2Uoc3RydWN0IGJsb2NrICosIHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9jbXAoZW51bSBlX29mZnJlbCwgdV9pbnQsIHVfaW50LCBicGZfaW50MzIpOwotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2NtcF9ndChlbnVtIGVfb2ZmcmVsLCB1X2ludCwgdV9pbnQsIGJwZl9pbnQzMik7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fY21wX2dlKGVudW0gZV9vZmZyZWwsIHVfaW50LCB1X2ludCwgYnBmX2ludDMyKTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9jbXBfbHQoZW51bSBlX29mZnJlbCwgdV9pbnQsIHVfaW50LCBicGZfaW50MzIpOwotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2NtcF9sZShlbnVtIGVfb2ZmcmVsLCB1X2ludCwgdV9pbnQsIGJwZl9pbnQzMik7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbWNtcChlbnVtIGVfb2ZmcmVsLCB1X2ludCwgdV9pbnQsIGJwZl9pbnQzMiwKLSAgICBicGZfdV9pbnQzMik7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fYmNtcChlbnVtIGVfb2ZmcmVsLCB1X2ludCwgdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9uY21wKGVudW0gZV9vZmZyZWwsIGJwZl91X2ludDMyLCBicGZfdV9pbnQzMiwKLSAgICBicGZfdV9pbnQzMiwgYnBmX3VfaW50MzIsIGludCwgYnBmX2ludDMyKTsKLXN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKmdlbl9sb2FkX2Fic29mZnNldHJlbChicGZfYWJzX29mZnNldCAqLCB1X2ludCwgdV9pbnQpOwotc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWRfYShlbnVtIGVfb2ZmcmVsLCB1X2ludCwgdV9pbnQpOwotc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWR4X2lwaGRybGVuKHZvaWQpOwotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3VuY29uZChpbnQpOwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2sgKmdlbl90cnVlKHZvaWQpOwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2sgKmdlbl9mYWxzZSh2b2lkKTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9ldGhlcl9saW5rdHlwZShpbnQpOwotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2lwbmV0X2xpbmt0eXBlKGludCk7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbGludXhfc2xsX2xpbmt0eXBlKGludCk7Ci1zdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbG9hZF9wcmlzbV9sbHByZWZpeGxlbih2b2lkKTsKLXN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKmdlbl9sb2FkX2F2c19sbHByZWZpeGxlbih2b2lkKTsKLXN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKmdlbl9sb2FkX3JhZGlvdGFwX2xscHJlZml4bGVuKHZvaWQpOwotc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWRfcHBpX2xscHJlZml4bGVuKHZvaWQpOwotc3RhdGljIHZvaWQgaW5zZXJ0X2NvbXB1dGVfdmxvZmZzZXRzKHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKmdlbl9hYnNfb2Zmc2V0X3ZhcnBhcnQoYnBmX2Fic19vZmZzZXQgKik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fY21wKGNvbXBpbGVyX3N0YXRlX3QgKiwgZW51bSBlX29mZnJlbCwgdV9pbnQsCisgICAgdV9pbnQsIGJwZl9pbnQzMik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fY21wX2d0KGNvbXBpbGVyX3N0YXRlX3QgKiwgZW51bSBlX29mZnJlbCwgdV9pbnQsCisgICAgdV9pbnQsIGJwZl9pbnQzMik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fY21wX2dlKGNvbXBpbGVyX3N0YXRlX3QgKiwgZW51bSBlX29mZnJlbCwgdV9pbnQsCisgICAgdV9pbnQsIGJwZl9pbnQzMik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fY21wX2x0KGNvbXBpbGVyX3N0YXRlX3QgKiwgZW51bSBlX29mZnJlbCwgdV9pbnQsCisgICAgdV9pbnQsIGJwZl9pbnQzMik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fY21wX2xlKGNvbXBpbGVyX3N0YXRlX3QgKiwgZW51bSBlX29mZnJlbCwgdV9pbnQsCisgICAgdV9pbnQsIGJwZl9pbnQzMik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbWNtcChjb21waWxlcl9zdGF0ZV90ICosIGVudW0gZV9vZmZyZWwsIHVfaW50LAorICAgIHVfaW50LCBicGZfaW50MzIsIGJwZl91X2ludDMyKTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9iY21wKGNvbXBpbGVyX3N0YXRlX3QgKiwgZW51bSBlX29mZnJlbCwgdV9pbnQsCisgICAgdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9uY21wKGNvbXBpbGVyX3N0YXRlX3QgKiwgZW51bSBlX29mZnJlbCwgYnBmX3VfaW50MzIsCisgICAgYnBmX3VfaW50MzIsIGJwZl91X2ludDMyLCBicGZfdV9pbnQzMiwgaW50LCBicGZfaW50MzIpOworc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWRfYWJzb2Zmc2V0cmVsKGNvbXBpbGVyX3N0YXRlX3QgKiwgYnBmX2Fic19vZmZzZXQgKiwKKyAgICB1X2ludCwgdV9pbnQpOworc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWRfYShjb21waWxlcl9zdGF0ZV90ICosIGVudW0gZV9vZmZyZWwsIHVfaW50LAorICAgIHVfaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKmdlbl9sb2FkeF9pcGhkcmxlbihjb21waWxlcl9zdGF0ZV90ICopOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3VuY29uZChjb21waWxlcl9zdGF0ZV90ICosIGludCk7CitzdGF0aWMgaW5saW5lIHN0cnVjdCBibG9jayAqZ2VuX3RydWUoY29tcGlsZXJfc3RhdGVfdCAqKTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJsb2NrICpnZW5fZmFsc2UoY29tcGlsZXJfc3RhdGVfdCAqKTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9ldGhlcl9saW5rdHlwZShjb21waWxlcl9zdGF0ZV90ICosIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5faXBuZXRfbGlua3R5cGUoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2xpbnV4X3NsbF9saW5rdHlwZShjb21waWxlcl9zdGF0ZV90ICosIGludCk7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbG9hZF9wcmlzbV9sbHByZWZpeGxlbihjb21waWxlcl9zdGF0ZV90ICopOworc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWRfYXZzX2xscHJlZml4bGVuKGNvbXBpbGVyX3N0YXRlX3QgKik7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbG9hZF9yYWRpb3RhcF9sbHByZWZpeGxlbihjb21waWxlcl9zdGF0ZV90ICopOworc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWRfcHBpX2xscHJlZml4bGVuKGNvbXBpbGVyX3N0YXRlX3QgKik7CitzdGF0aWMgdm9pZCBpbnNlcnRfY29tcHV0ZV92bG9mZnNldHMoY29tcGlsZXJfc3RhdGVfdCAqLCBzdHJ1Y3QgYmxvY2sgKik7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fYWJzX29mZnNldF92YXJwYXJ0KGNvbXBpbGVyX3N0YXRlX3QgKiwKKyAgICBicGZfYWJzX29mZnNldCAqKTsKIHN0YXRpYyBpbnQgZXRoZXJ0eXBlX3RvX3BwcHR5cGUoaW50KTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9saW5rdHlwZShpbnQpOwotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3NuYXAoYnBmX3VfaW50MzIsIGJwZl91X2ludDMyKTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9sbGNfbGlua3R5cGUoaW50KTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9ob3N0b3AoYnBmX3VfaW50MzIsIGJwZl91X2ludDMyLCBpbnQsIGludCwgdV9pbnQsIHVfaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9saW5rdHlwZShjb21waWxlcl9zdGF0ZV90ICosIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fc25hcChjb21waWxlcl9zdGF0ZV90ICosIGJwZl91X2ludDMyLCBicGZfdV9pbnQzMik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbGxjX2xpbmt0eXBlKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9ob3N0b3AoY29tcGlsZXJfc3RhdGVfdCAqLCBicGZfdV9pbnQzMiwgYnBmX3VfaW50MzIsCisgICAgaW50LCBpbnQsIHVfaW50LCB1X2ludCk7CiAjaWZkZWYgSU5FVDYKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9ob3N0b3A2KHN0cnVjdCBpbjZfYWRkciAqLCBzdHJ1Y3QgaW42X2FkZHIgKiwgaW50LCBpbnQsIHVfaW50LCB1X2ludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5faG9zdG9wNihjb21waWxlcl9zdGF0ZV90ICosIHN0cnVjdCBpbjZfYWRkciAqLAorICAgIHN0cnVjdCBpbjZfYWRkciAqLCBpbnQsIGludCwgdV9pbnQsIHVfaW50KTsKICNlbmRpZgotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2Fob3N0b3AoY29uc3QgdV9jaGFyICosIGludCk7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fZWhvc3RvcChjb25zdCB1X2NoYXIgKiwgaW50KTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9maG9zdG9wKGNvbnN0IHVfY2hhciAqLCBpbnQpOwotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3Rob3N0b3AoY29uc3QgdV9jaGFyICosIGludCk7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fd2xhbmhvc3RvcChjb25zdCB1X2NoYXIgKiwgaW50KTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9pcGZjaG9zdG9wKGNvbnN0IHVfY2hhciAqLCBpbnQpOwotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2RuaG9zdG9wKGJwZl91X2ludDMyLCBpbnQpOwotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX21wbHNfbGlua3R5cGUoaW50KTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9ob3N0KGJwZl91X2ludDMyLCBicGZfdV9pbnQzMiwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fYWhvc3RvcChjb21waWxlcl9zdGF0ZV90ICosIGNvbnN0IHVfY2hhciAqLCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2Vob3N0b3AoY29tcGlsZXJfc3RhdGVfdCAqLCBjb25zdCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9maG9zdG9wKGNvbXBpbGVyX3N0YXRlX3QgKiwgY29uc3QgdV9jaGFyICosIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fdGhvc3RvcChjb21waWxlcl9zdGF0ZV90ICosIGNvbnN0IHVfY2hhciAqLCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3dsYW5ob3N0b3AoY29tcGlsZXJfc3RhdGVfdCAqLCBjb25zdCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9pcGZjaG9zdG9wKGNvbXBpbGVyX3N0YXRlX3QgKiwgY29uc3QgdV9jaGFyICosIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fZG5ob3N0b3AoY29tcGlsZXJfc3RhdGVfdCAqLCBicGZfdV9pbnQzMiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9tcGxzX2xpbmt0eXBlKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9ob3N0KGNvbXBpbGVyX3N0YXRlX3QgKiwgYnBmX3VfaW50MzIsIGJwZl91X2ludDMyLAorICAgIGludCwgaW50LCBpbnQpOwogI2lmZGVmIElORVQ2Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5faG9zdDYoc3RydWN0IGluNl9hZGRyICosIHN0cnVjdCBpbjZfYWRkciAqLCBpbnQsIGludCwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9ob3N0Nihjb21waWxlcl9zdGF0ZV90ICosIHN0cnVjdCBpbjZfYWRkciAqLAorICAgIHN0cnVjdCBpbjZfYWRkciAqLCBpbnQsIGludCwgaW50KTsKICNlbmRpZgogI2lmbmRlZiBJTkVUNgogc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2dhdGV3YXkoY29uc3QgdV9jaGFyICosIGJwZl91X2ludDMyICoqLCBpbnQsIGludCk7CiAjZW5kaWYKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9pcGZyYWcodm9pZCk7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcG9ydGF0b20oaW50LCBicGZfaW50MzIpOwotc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnRyYW5nZWF0b20oaW50LCBicGZfaW50MzIsIGJwZl9pbnQzMik7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcG9ydGF0b202KGludCwgYnBmX2ludDMyKTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2VhdG9tNihpbnQsIGJwZl9pbnQzMiwgYnBmX2ludDMyKTsKLXN0cnVjdCBibG9jayAqZ2VuX3BvcnRvcChpbnQsIGludCwgaW50KTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0KGludCwgaW50LCBpbnQpOwotc3RydWN0IGJsb2NrICpnZW5fcG9ydHJhbmdlb3AoaW50LCBpbnQsIGludCwgaW50KTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2UoaW50LCBpbnQsIGludCwgaW50KTsKLXN0cnVjdCBibG9jayAqZ2VuX3BvcnRvcDYoaW50LCBpbnQsIGludCk7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcG9ydDYoaW50LCBpbnQsIGludCk7Ci1zdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2VvcDYoaW50LCBpbnQsIGludCwgaW50KTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2U2KGludCwgaW50LCBpbnQsIGludCk7Ci1zdGF0aWMgaW50IGxvb2t1cF9wcm90byhjb25zdCBjaGFyICosIGludCk7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcHJvdG9jaGFpbihpbnQsIGludCwgaW50KTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wcm90byhpbnQsIGludCwgaW50KTsKLXN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKnhmZXJfdG9feChzdHJ1Y3QgYXJ0aCAqKTsKLXN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKnhmZXJfdG9fYShzdHJ1Y3QgYXJ0aCAqKTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9tYWNfbXVsdGljYXN0KGludCk7Ci1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbGVuKGludCwgaW50KTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9jaGVja184MDJfMTFfZGF0YV9mcmFtZSh2b2lkKTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9nZW5ldmVfbGxfY2hlY2sodm9pZCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5faXBmcmFnKGNvbXBpbGVyX3N0YXRlX3QgKik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcG9ydGF0b20oY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQsIGJwZl9pbnQzMik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcG9ydHJhbmdlYXRvbShjb21waWxlcl9zdGF0ZV90ICosIGludCwgYnBmX2ludDMyLAorICAgIGJwZl9pbnQzMik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcG9ydGF0b202KGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50LCBicGZfaW50MzIpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnRyYW5nZWF0b202KGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50LCBicGZfaW50MzIsCisgICAgYnBmX2ludDMyKTsKK3N0cnVjdCBibG9jayAqZ2VuX3BvcnRvcChjb21waWxlcl9zdGF0ZV90ICosIGludCwgaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnQoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQsIGludCwgaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX3BvcnRyYW5nZW9wKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50LCBpbnQsIGludCwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2UoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQsIGludCwgaW50LCBpbnQpOworc3RydWN0IGJsb2NrICpnZW5fcG9ydG9wNihjb21waWxlcl9zdGF0ZV90ICosIGludCwgaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnQ2KGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50LCBpbnQsIGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2VvcDYoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQsIGludCwgaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnRyYW5nZTYoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQsIGludCwgaW50LCBpbnQpOworc3RhdGljIGludCBsb29rdXBfcHJvdG8oY29tcGlsZXJfc3RhdGVfdCAqLCBjb25zdCBjaGFyICosIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcHJvdG9jaGFpbihjb21waWxlcl9zdGF0ZV90ICosIGludCwgaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3Byb3RvKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgc3RydWN0IHNsaXN0ICp4ZmVyX3RvX3goY29tcGlsZXJfc3RhdGVfdCAqLCBzdHJ1Y3QgYXJ0aCAqKTsKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKnhmZXJfdG9fYShjb21waWxlcl9zdGF0ZV90ICosIHN0cnVjdCBhcnRoICopOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX21hY19tdWx0aWNhc3QoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2xlbihjb21waWxlcl9zdGF0ZV90ICosIGludCwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9jaGVja184MDJfMTFfZGF0YV9mcmFtZShjb21waWxlcl9zdGF0ZV90ICopOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2dlbmV2ZV9sbF9jaGVjayhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpOwogCi1zdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcHBpX2RsdF9jaGVjayh2b2lkKTsKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9tc2dfYWJicmV2KGludCB0eXBlKTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wcGlfZGx0X2NoZWNrKGNvbXBpbGVyX3N0YXRlX3QgKik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbXNnX2FiYnJldihjb21waWxlcl9zdGF0ZV90ICosIGludCB0eXBlKTsKKworc3RhdGljIHZvaWQKK2luaXRjaHVua3MoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5DSFVOS1M7IGkrKykgeworCQljc3RhdGUtPmNodW5rc1tpXS5uX2xlZnQgPSAwOworCQljc3RhdGUtPmNodW5rc1tpXS5tID0gTlVMTDsKKwl9CisJY3N0YXRlLT5jdXJfY2h1bmsgPSAwOworfQogCiBzdGF0aWMgdm9pZCAqCi1uZXdjaHVuayhuKQotCXVfaW50IG47CituZXdjaHVuayhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIHNpemVfdCBuKQogewogCXN0cnVjdCBjaHVuayAqY3A7CiAJaW50IGs7CkBAIC0zMzYsNTggKzU4MCw1MyBAQAogCW4gPSBBTElHTihuKTsKICNlbmRpZgogCi0JY3AgPSAmY2h1bmtzW2N1cl9jaHVua107CisJY3AgPSAmY3N0YXRlLT5jaHVua3NbY3N0YXRlLT5jdXJfY2h1bmtdOwogCWlmIChuID4gY3AtPm5fbGVmdCkgewotCQkrK2NwLCBrID0gKytjdXJfY2h1bms7CisJCSsrY3AsIGsgPSArK2NzdGF0ZS0+Y3VyX2NodW5rOwogCQlpZiAoayA+PSBOQ0hVTktTKQotCQkJYnBmX2Vycm9yKCJvdXQgb2YgbWVtb3J5Iik7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAib3V0IG9mIG1lbW9yeSIpOwogCQlzaXplID0gQ0hVTkswU0laRSA8PCBrOwogCQljcC0+bSA9ICh2b2lkICopbWFsbG9jKHNpemUpOwogCQlpZiAoY3AtPm0gPT0gTlVMTCkKLQkJCWJwZl9lcnJvcigib3V0IG9mIG1lbW9yeSIpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIm91dCBvZiBtZW1vcnkiKTsKIAkJbWVtc2V0KChjaGFyICopY3AtPm0sIDAsIHNpemUpOwogCQljcC0+bl9sZWZ0ID0gc2l6ZTsKIAkJaWYgKG4gPiBzaXplKQotCQkJYnBmX2Vycm9yKCJvdXQgb2YgbWVtb3J5Iik7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAib3V0IG9mIG1lbW9yeSIpOwogCX0KIAljcC0+bl9sZWZ0IC09IG47CiAJcmV0dXJuICh2b2lkICopKChjaGFyICopY3AtPm0gKyBjcC0+bl9sZWZ0KTsKIH0KIAogc3RhdGljIHZvaWQKLWZyZWVjaHVua3MoKQorZnJlZWNodW5rcyhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJaW50IGk7CiAKLQljdXJfY2h1bmsgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBOQ0hVTktTOyArK2kpCi0JCWlmIChjaHVua3NbaV0ubSAhPSBOVUxMKSB7Ci0JCQlmcmVlKGNodW5rc1tpXS5tKTsKLQkJCWNodW5rc1tpXS5tID0gTlVMTDsKLQkJfQorCQlpZiAoY3N0YXRlLT5jaHVua3NbaV0ubSAhPSBOVUxMKQorCQkJZnJlZShjc3RhdGUtPmNodW5rc1tpXS5tKTsKIH0KIAogLyoKICAqIEEgc3RyZHVwIHdob3NlIGFsbG9jYXRpb25zIGFyZSBmcmVlZCBhZnRlciBjb2RlIGdlbmVyYXRpb24gaXMgb3Zlci4KICAqLwogY2hhciAqCi1zZHVwKHMpCi0JcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKK3NkdXAoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBjb25zdCBjaGFyICpzKQogewotCWludCBuID0gc3RybGVuKHMpICsgMTsKLQljaGFyICpjcCA9IG5ld2NodW5rKG4pOworCXNpemVfdCBuID0gc3RybGVuKHMpICsgMTsKKwljaGFyICpjcCA9IG5ld2NodW5rKGNzdGF0ZSwgbik7CiAKIAlzdHJsY3B5KGNwLCBzLCBuKTsKIAlyZXR1cm4gKGNwKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2sgKgotbmV3X2Jsb2NrKGNvZGUpCi0JaW50IGNvZGU7CituZXdfYmxvY2soY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgY29kZSkKIHsKIAlzdHJ1Y3QgYmxvY2sgKnA7CiAKLQlwID0gKHN0cnVjdCBibG9jayAqKW5ld2NodW5rKHNpemVvZigqcCkpOworCXAgPSAoc3RydWN0IGJsb2NrICopbmV3Y2h1bmsoY3N0YXRlLCBzaXplb2YoKnApKTsKIAlwLT5zLmNvZGUgPSBjb2RlOwogCXAtPmhlYWQgPSBwOwogCkBAIC0zOTUsNTkgKzYzNCw0OCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzbGlzdCAqCi1uZXdfc3RtdChjb2RlKQotCWludCBjb2RlOworbmV3X3N0bXQoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgY29kZSkKIHsKIAlzdHJ1Y3Qgc2xpc3QgKnA7CiAKLQlwID0gKHN0cnVjdCBzbGlzdCAqKW5ld2NodW5rKHNpemVvZigqcCkpOworCXAgPSAoc3RydWN0IHNsaXN0ICopbmV3Y2h1bmsoY3N0YXRlLCBzaXplb2YoKnApKTsKIAlwLT5zLmNvZGUgPSBjb2RlOwogCiAJcmV0dXJuIHA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3JldGJsayh2KQotCWludCB2OworZ2VuX3JldGJsayhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCB2KQogewotCXN0cnVjdCBibG9jayAqYiA9IG5ld19ibG9jayhCUEZfUkVUfEJQRl9LKTsKKwlzdHJ1Y3QgYmxvY2sgKmIgPSBuZXdfYmxvY2soY3N0YXRlLCBCUEZfUkVUfEJQRl9LKTsKIAogCWItPnMuayA9IHY7CiAJcmV0dXJuIGI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc3ludGF4KCkKK3N5bnRheChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7Ci0JYnBmX2Vycm9yKCJzeW50YXggZXJyb3IgaW4gZmlsdGVyIGV4cHJlc3Npb24iKTsKKwlicGZfZXJyb3IoY3N0YXRlLCAic3ludGF4IGVycm9yIGluIGZpbHRlciBleHByZXNzaW9uIik7CiB9CiAKLXN0YXRpYyBicGZfdV9pbnQzMiBuZXRtYXNrOwotc3RhdGljIGludCBzbmFwbGVuOwotaW50IG5vX29wdGltaXplOwotCiBpbnQKIHBjYXBfY29tcGlsZShwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZ3JhbSwKIAkgICAgIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG9wdGltaXplLCBicGZfdV9pbnQzMiBtYXNrKQogewotCWV4dGVybiBpbnQgbl9lcnJvcnM7CisJY29tcGlsZXJfc3RhdGVfdCBjc3RhdGU7CiAJY29uc3QgY2hhciAqIHZvbGF0aWxlIHhidWYgPSBidWY7CisJeXlzY2FuX3Qgc2Nhbm5lciA9IE5VTEw7CisJWVlfQlVGRkVSX1NUQVRFIGluX2J1ZmZlciA9IE5VTEw7CiAJdV9pbnQgbGVuOwogCWludCAgcmM7CiAKLQkvKgotCSAqIFhYWCAtIHNpbmdsZS10aHJlYWQgdGhpcyBjb2RlIHBhdGggd2l0aCBwdGhyZWFkIGNhbGxzIG9uCi0JICogVU4qWCwgaWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIHB0aHJlYWRzPyAgSWYgdGhhdCByZXF1aXJlcwotCSAqIGEgc2VwYXJhdGUgLWxwdGhyZWFkLCB3ZSBtaWdodCBub3Qgd2FudCB0byBkbyB0aGF0LgotCSAqLwotI2lmZGVmIFdJTjMyCi0JZXh0ZXJuIGludCB3c29ja2luaXQgKHZvaWQpOworI2lmZGVmIF9XSU4zMgogCXN0YXRpYyBpbnQgZG9uZSA9IDA7CiAKIAlpZiAoIWRvbmUpCi0JCXdzb2NraW5pdCgpOworCQlwY2FwX3dzb2NraW5pdCgpOwogCWRvbmUgPSAxOwotCUVudGVyQ3JpdGljYWxTZWN0aW9uKCZnX1BjYXBDb21waWxlQ3JpdGljYWxTZWN0aW9uKTsKICNlbmRpZgogCiAJLyoKQEAgLTQ1NSw2OSArNjgzLDc4IEBACiAJICogbGluay1sYXllciB0eXBlLCBzbyB3ZSBjYW4ndCB1c2UgaXQuCiAJICovCiAJaWYgKCFwLT5hY3RpdmF0ZWQpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJub3QteWV0LWFjdGl2YXRlZCBwY2FwX3QgcGFzc2VkIHRvIHBjYXBfY29tcGlsZSIpOwogCQlyYyA9IC0xOwogCQlnb3RvIHF1aXQ7CiAJfQotCW5vX29wdGltaXplID0gMDsKLQluX2Vycm9ycyA9IDA7Ci0Jcm9vdCA9IE5VTEw7Ci0JYnBmX3BjYXAgPSBwOwotCWluaXRfcmVncygpOworCWluaXRjaHVua3MoJmNzdGF0ZSk7CisJY3N0YXRlLm5vX29wdGltaXplID0gMDsKKwljc3RhdGUuYWkgPSBOVUxMOworCWNzdGF0ZS5pYy5yb290ID0gTlVMTDsKKwljc3RhdGUuaWMuY3VyX21hcmsgPSAwOworCWNzdGF0ZS5icGZfcGNhcCA9IHA7CisJaW5pdF9yZWdzKCZjc3RhdGUpOwogCi0JaWYgKHNldGptcCh0b3BfY3R4KSkgeworCWlmIChzZXRqbXAoY3N0YXRlLnRvcF9jdHgpKSB7CiAjaWZkZWYgSU5FVDYKLQkJaWYgKGFpICE9IE5VTEwpIHsKLQkJCWZyZWVhZGRyaW5mbyhhaSk7Ci0JCQlhaSA9IE5VTEw7Ci0JCX0KKwkJaWYgKGNzdGF0ZS5haSAhPSBOVUxMKQorCQkJZnJlZWFkZHJpbmZvKGNzdGF0ZS5haSk7CiAjZW5kaWYKLQkJbGV4X2NsZWFudXAoKTsKLQkJZnJlZWNodW5rcygpOwogCQlyYyA9IC0xOwogCQlnb3RvIHF1aXQ7CiAJfQogCi0JbmV0bWFzayA9IG1hc2s7CisJY3N0YXRlLm5ldG1hc2sgPSBtYXNrOwogCi0Jc25hcGxlbiA9IHBjYXBfc25hcHNob3QocCk7Ci0JaWYgKHNuYXBsZW4gPT0gMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJY3N0YXRlLnNuYXBsZW4gPSBwY2FwX3NuYXBzaG90KHApOworCWlmIChjc3RhdGUuc25hcGxlbiA9PSAwKSB7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJzbmFwbGVuIG9mIDAgcmVqZWN0cyBhbGwgcGFja2V0cyIpOwogCQlyYyA9IC0xOwogCQlnb3RvIHF1aXQ7CiAJfQogCi0JbGV4X2luaXQoeGJ1ZiA/IHhidWYgOiAiIik7Ci0JaW5pdF9saW5rdHlwZShwKTsKLQkodm9pZClwY2FwX3BhcnNlKCk7CisJaWYgKHBjYXBfbGV4X2luaXQoJnNjYW5uZXIpICE9IDApCisJCWJwZl9lcnJvcigmY3N0YXRlLCAiY2FuJ3QgaW5pdGlhbGl6ZSBzY2FubmVyOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwlpbl9idWZmZXIgPSBwY2FwX19zY2FuX3N0cmluZyh4YnVmID8geGJ1ZiA6ICIiLCBzY2FubmVyKTsKIAotCWlmIChuX2Vycm9ycykKLQkJc3ludGF4KCk7CisJLyoKKwkgKiBBc3NvY2lhdGUgdGhlIGNvbXBpbGVyIHN0YXRlIHdpdGggdGhlIGxleGljYWwgYW5hbHl6ZXIKKwkgKiBzdGF0ZS4KKwkgKi8KKwlwY2FwX3NldF9leHRyYSgmY3N0YXRlLCBzY2FubmVyKTsKIAotCWlmIChyb290ID09IE5VTEwpCi0JCXJvb3QgPSBnZW5fcmV0YmxrKHNuYXBsZW4pOworCWluaXRfbGlua3R5cGUoJmNzdGF0ZSwgcCk7CisJKHZvaWQpcGNhcF9wYXJzZShzY2FubmVyLCAmY3N0YXRlKTsKIAotCWlmIChvcHRpbWl6ZSAmJiAhbm9fb3B0aW1pemUpIHsKLQkJYnBmX29wdGltaXplKCZyb290KTsKLQkJaWYgKHJvb3QgPT0gTlVMTCB8fAotCQkgICAgKHJvb3QtPnMuY29kZSA9PSAoQlBGX1JFVHxCUEZfSykgJiYgcm9vdC0+cy5rID09IDApKQotCQkJYnBmX2Vycm9yKCJleHByZXNzaW9uIHJlamVjdHMgYWxsIHBhY2tldHMiKTsKKwlpZiAoY3N0YXRlLmljLnJvb3QgPT0gTlVMTCkKKwkJY3N0YXRlLmljLnJvb3QgPSBnZW5fcmV0YmxrKCZjc3RhdGUsIGNzdGF0ZS5zbmFwbGVuKTsKKworCWlmIChvcHRpbWl6ZSAmJiAhY3N0YXRlLm5vX29wdGltaXplKSB7CisJCWJwZl9vcHRpbWl6ZSgmY3N0YXRlLCAmY3N0YXRlLmljKTsKKwkJaWYgKGNzdGF0ZS5pYy5yb290ID09IE5VTEwgfHwKKwkJICAgIChjc3RhdGUuaWMucm9vdC0+cy5jb2RlID09IChCUEZfUkVUfEJQRl9LKSAmJiBjc3RhdGUuaWMucm9vdC0+cy5rID09IDApKQorCQkJYnBmX2Vycm9yKCZjc3RhdGUsICJleHByZXNzaW9uIHJlamVjdHMgYWxsIHBhY2tldHMiKTsKIAl9Ci0JcHJvZ3JhbS0+YmZfaW5zbnMgPSBpY29kZV90b19mY29kZShyb290LCAmbGVuKTsKKwlwcm9ncmFtLT5iZl9pbnNucyA9IGljb2RlX3RvX2Zjb2RlKCZjc3RhdGUsICZjc3RhdGUuaWMsIGNzdGF0ZS5pYy5yb290LCAmbGVuKTsKIAlwcm9ncmFtLT5iZl9sZW4gPSBsZW47CiAKLQlsZXhfY2xlYW51cCgpOwotCWZyZWVjaHVua3MoKTsKLQogCXJjID0gMDsgIC8qIFdlJ3JlIGFsbCBva2F5ICovCiAKIHF1aXQ6CisJLyoKKwkgKiBDbGVhbiB1cCBldmVyeXRoaW5nIGZvciB0aGUgbGV4aWNhbCBhbmFseXplci4KKwkgKi8KKwlpZiAoaW5fYnVmZmVyICE9IE5VTEwpCisJCXBjYXBfX2RlbGV0ZV9idWZmZXIoaW5fYnVmZmVyLCBzY2FubmVyKTsKKwlpZiAoc2Nhbm5lciAhPSBOVUxMKQorCQlwY2FwX2xleF9kZXN0cm95KHNjYW5uZXIpOwogCi0jaWZkZWYgV0lOMzIKLQlMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZ19QY2FwQ29tcGlsZUNyaXRpY2FsU2VjdGlvbik7Ci0jZW5kaWYKKwkvKgorCSAqIENsZWFuIHVwIG91ciBvd24gYWxsb2NhdGVkIG1lbW9yeS4KKwkgKi8KKwlmcmVlY2h1bmtzKCZjc3RhdGUpOwogCiAJcmV0dXJuIChyYyk7CiB9CkBAIC01OTksOCArODM2LDcgQEAKIH0KIAogdm9pZAotZmluaXNoX3BhcnNlKHApCi0Jc3RydWN0IGJsb2NrICpwOworZmluaXNoX3BhcnNlKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgc3RydWN0IGJsb2NrICpwKQogewogCXN0cnVjdCBibG9jayAqcHBpX2RsdF9jaGVjazsKIApAQCAtNjIzLDIwICs4NTksMjkgQEAKIAkgKiBmb3IgdGVzdHMgdGhhdCBmYWlsIGVhcmx5LCBhbmQgaXQncyBub3QgY2xlYXIgdGhhdCdzCiAJICogd29ydGggdGhlIGVmZm9ydC4KIAkgKi8KLQlpbnNlcnRfY29tcHV0ZV92bG9mZnNldHMocC0+aGVhZCk7CisJaW5zZXJ0X2NvbXB1dGVfdmxvZmZzZXRzKGNzdGF0ZSwgcC0+aGVhZCk7CiAKIAkvKgogCSAqIEZvciBETFRfUFBJIGNhcHR1cmVzLCBnZW5lcmF0ZSBhIGNoZWNrIG9mIHRoZSBwZXItcGFja2V0CiAJICogRExUIHZhbHVlIHRvIG1ha2Ugc3VyZSBpdCdzIERMVF9JRUVFODAyXzExLgorCSAqCisJICogWFhYIC0gVHVyYm9DYXAgY2FyZHMgdXNlIERMVF9QUEkgZm9yIEV0aGVybmV0LgorCSAqIENhbiB3ZSBqdXN0IGRlZmluZSBzb21lIERMVF9FVEhFUk5FVF9XSVRIX1BIRFIgcHNldWRvLWhlYWRlcgorCSAqIHdpdGggYXBwcm9wcmlhdGUgRXRoZXJuZXQgaW5mb3JtYXRpb24gYW5kIHVzZSB0aGF0IHJhdGhlcgorCSAqIHRoYW4gdXNpbmcgc29tZXRoaW5nIHN1Y2ggYXMgRExUX1BQSSB3aGVyZSB5b3UgZG9uJ3Qga25vdworCSAqIHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIHVudGlsIHJ1bnRpbWUsIHdoaWNoLCBpbiB0aGUKKwkgKiBnZW5lcmFsIGNhc2UsIHdvdWxkIGZvcmNlIHVzIHRvIGdlbmVyYXRlIGJvdGggRXRoZXJuZXQgKmFuZCoKKwkgKiA4MDIuMTEgY29kZSAoKmFuZCogYW55dGhpbmcgZWxzZSBmb3Igd2hpY2ggUFBJIGlzIHVzZWQpCisJICogYW5kIGNob29zZSBiZXR3ZWVuIHRoZW0gZWFybHkgaW4gdGhlIEJQRiBwcm9ncmFtPwogCSAqLwotCXBwaV9kbHRfY2hlY2sgPSBnZW5fcHBpX2RsdF9jaGVjaygpOworCXBwaV9kbHRfY2hlY2sgPSBnZW5fcHBpX2RsdF9jaGVjayhjc3RhdGUpOwogCWlmIChwcGlfZGx0X2NoZWNrICE9IE5VTEwpCiAJCWdlbl9hbmQocHBpX2RsdF9jaGVjaywgcCk7CiAKLQliYWNrcGF0Y2gocCwgZ2VuX3JldGJsayhzbmFwbGVuKSk7CisJYmFja3BhdGNoKHAsIGdlbl9yZXRibGsoY3N0YXRlLCBjc3RhdGUtPnNuYXBsZW4pKTsKIAlwLT5zZW5zZSA9ICFwLT5zZW5zZTsKLQliYWNrcGF0Y2gocCwgZ2VuX3JldGJsaygwKSk7Ci0Jcm9vdCA9IHAtPmhlYWQ7CisJYmFja3BhdGNoKHAsIGdlbl9yZXRibGsoY3N0YXRlLCAwKSk7CisJY3N0YXRlLT5pYy5yb290ID0gcC0+aGVhZDsKIH0KIAogdm9pZApAQCAtNjcwLDY1ICs5MTUsNTAgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fY21wKG9mZnJlbCwgb2Zmc2V0LCBzaXplLCB2KQotCWVudW0gZV9vZmZyZWwgb2ZmcmVsOwotCXVfaW50IG9mZnNldCwgc2l6ZTsKLQlicGZfaW50MzIgdjsKK2dlbl9jbXAoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBlbnVtIGVfb2ZmcmVsIG9mZnJlbCwgdV9pbnQgb2Zmc2V0LAorICAgIHVfaW50IHNpemUsIGJwZl9pbnQzMiB2KQogewotCXJldHVybiBnZW5fbmNtcChvZmZyZWwsIG9mZnNldCwgc2l6ZSwgMHhmZmZmZmZmZiwgQlBGX0pFUSwgMCwgdik7CisJcmV0dXJuIGdlbl9uY21wKGNzdGF0ZSwgb2ZmcmVsLCBvZmZzZXQsIHNpemUsIDB4ZmZmZmZmZmYsIEJQRl9KRVEsIDAsIHYpOwogfQogCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9jbXBfZ3Qob2ZmcmVsLCBvZmZzZXQsIHNpemUsIHYpCi0JZW51bSBlX29mZnJlbCBvZmZyZWw7Ci0JdV9pbnQgb2Zmc2V0LCBzaXplOwotCWJwZl9pbnQzMiB2OworZ2VuX2NtcF9ndChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGVudW0gZV9vZmZyZWwgb2ZmcmVsLCB1X2ludCBvZmZzZXQsCisgICAgdV9pbnQgc2l6ZSwgYnBmX2ludDMyIHYpCiB7Ci0JcmV0dXJuIGdlbl9uY21wKG9mZnJlbCwgb2Zmc2V0LCBzaXplLCAweGZmZmZmZmZmLCBCUEZfSkdULCAwLCB2KTsKKwlyZXR1cm4gZ2VuX25jbXAoY3N0YXRlLCBvZmZyZWwsIG9mZnNldCwgc2l6ZSwgMHhmZmZmZmZmZiwgQlBGX0pHVCwgMCwgdik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2NtcF9nZShvZmZyZWwsIG9mZnNldCwgc2l6ZSwgdikKLQllbnVtIGVfb2ZmcmVsIG9mZnJlbDsKLQl1X2ludCBvZmZzZXQsIHNpemU7Ci0JYnBmX2ludDMyIHY7CitnZW5fY21wX2dlKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgZW51bSBlX29mZnJlbCBvZmZyZWwsIHVfaW50IG9mZnNldCwKKyAgICB1X2ludCBzaXplLCBicGZfaW50MzIgdikKIHsKLQlyZXR1cm4gZ2VuX25jbXAob2ZmcmVsLCBvZmZzZXQsIHNpemUsIDB4ZmZmZmZmZmYsIEJQRl9KR0UsIDAsIHYpOworCXJldHVybiBnZW5fbmNtcChjc3RhdGUsIG9mZnJlbCwgb2Zmc2V0LCBzaXplLCAweGZmZmZmZmZmLCBCUEZfSkdFLCAwLCB2KTsKIH0KIAogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fY21wX2x0KG9mZnJlbCwgb2Zmc2V0LCBzaXplLCB2KQotCWVudW0gZV9vZmZyZWwgb2ZmcmVsOwotCXVfaW50IG9mZnNldCwgc2l6ZTsKLQlicGZfaW50MzIgdjsKK2dlbl9jbXBfbHQoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBlbnVtIGVfb2ZmcmVsIG9mZnJlbCwgdV9pbnQgb2Zmc2V0LAorICAgIHVfaW50IHNpemUsIGJwZl9pbnQzMiB2KQogewotCXJldHVybiBnZW5fbmNtcChvZmZyZWwsIG9mZnNldCwgc2l6ZSwgMHhmZmZmZmZmZiwgQlBGX0pHRSwgMSwgdik7CisJcmV0dXJuIGdlbl9uY21wKGNzdGF0ZSwgb2ZmcmVsLCBvZmZzZXQsIHNpemUsIDB4ZmZmZmZmZmYsIEJQRl9KR0UsIDEsIHYpOwogfQogCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9jbXBfbGUob2ZmcmVsLCBvZmZzZXQsIHNpemUsIHYpCi0JZW51bSBlX29mZnJlbCBvZmZyZWw7Ci0JdV9pbnQgb2Zmc2V0LCBzaXplOwotCWJwZl9pbnQzMiB2OworZ2VuX2NtcF9sZShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGVudW0gZV9vZmZyZWwgb2ZmcmVsLCB1X2ludCBvZmZzZXQsCisgICAgdV9pbnQgc2l6ZSwgYnBmX2ludDMyIHYpCiB7Ci0JcmV0dXJuIGdlbl9uY21wKG9mZnJlbCwgb2Zmc2V0LCBzaXplLCAweGZmZmZmZmZmLCBCUEZfSkdULCAxLCB2KTsKKwlyZXR1cm4gZ2VuX25jbXAoY3N0YXRlLCBvZmZyZWwsIG9mZnNldCwgc2l6ZSwgMHhmZmZmZmZmZiwgQlBGX0pHVCwgMSwgdik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX21jbXAob2ZmcmVsLCBvZmZzZXQsIHNpemUsIHYsIG1hc2spCi0JZW51bSBlX29mZnJlbCBvZmZyZWw7Ci0JdV9pbnQgb2Zmc2V0LCBzaXplOwotCWJwZl9pbnQzMiB2OwotCWJwZl91X2ludDMyIG1hc2s7CitnZW5fbWNtcChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGVudW0gZV9vZmZyZWwgb2ZmcmVsLCB1X2ludCBvZmZzZXQsCisgICAgdV9pbnQgc2l6ZSwgYnBmX2ludDMyIHYsIGJwZl91X2ludDMyIG1hc2spCiB7Ci0JcmV0dXJuIGdlbl9uY21wKG9mZnJlbCwgb2Zmc2V0LCBzaXplLCBtYXNrLCBCUEZfSkVRLCAwLCB2KTsKKwlyZXR1cm4gZ2VuX25jbXAoY3N0YXRlLCBvZmZyZWwsIG9mZnNldCwgc2l6ZSwgbWFzaywgQlBGX0pFUSwgMCwgdik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2JjbXAob2ZmcmVsLCBvZmZzZXQsIHNpemUsIHYpCi0JZW51bSBlX29mZnJlbCBvZmZyZWw7Ci0JcmVnaXN0ZXIgdV9pbnQgb2Zmc2V0LCBzaXplOwotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqdjsKK2dlbl9iY21wKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgZW51bSBlX29mZnJlbCBvZmZyZWwsIHVfaW50IG9mZnNldCwKKyAgICB1X2ludCBzaXplLCBjb25zdCB1X2NoYXIgKnYpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiLCAqdG1wOwogCkBAIC03MzgsNyArOTY4LDcgQEAKIAkJYnBmX2ludDMyIHcgPSAoKGJwZl9pbnQzMilwWzBdIDw8IDI0KSB8CiAJCSAgICAoKGJwZl9pbnQzMilwWzFdIDw8IDE2KSB8ICgoYnBmX2ludDMyKXBbMl0gPDwgOCkgfCBwWzNdOwogCi0JCXRtcCA9IGdlbl9jbXAob2ZmcmVsLCBvZmZzZXQgKyBzaXplIC0gNCwgQlBGX1csIHcpOworCQl0bXAgPSBnZW5fY21wKGNzdGF0ZSwgb2ZmcmVsLCBvZmZzZXQgKyBzaXplIC0gNCwgQlBGX1csIHcpOwogCQlpZiAoYiAhPSBOVUxMKQogCQkJZ2VuX2FuZChiLCB0bXApOwogCQliID0gdG1wOwpAQCAtNzQ4LDE0ICs5NzgsMTQgQEAKIAkJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwID0gJnZbc2l6ZSAtIDJdOwogCQlicGZfaW50MzIgdyA9ICgoYnBmX2ludDMyKXBbMF0gPDwgOCkgfCBwWzFdOwogCi0JCXRtcCA9IGdlbl9jbXAob2ZmcmVsLCBvZmZzZXQgKyBzaXplIC0gMiwgQlBGX0gsIHcpOworCQl0bXAgPSBnZW5fY21wKGNzdGF0ZSwgb2ZmcmVsLCBvZmZzZXQgKyBzaXplIC0gMiwgQlBGX0gsIHcpOwogCQlpZiAoYiAhPSBOVUxMKQogCQkJZ2VuX2FuZChiLCB0bXApOwogCQliID0gdG1wOwogCQlzaXplIC09IDI7CiAJfQogCWlmIChzaXplID4gMCkgewotCQl0bXAgPSBnZW5fY21wKG9mZnJlbCwgb2Zmc2V0LCBCUEZfQiwgKGJwZl9pbnQzMil2WzBdKTsKKwkJdG1wID0gZ2VuX2NtcChjc3RhdGUsIG9mZnJlbCwgb2Zmc2V0LCBCUEZfQiwgKGJwZl9pbnQzMil2WzBdKTsKIAkJaWYgKGIgIT0gTlVMTCkKIAkJCWdlbl9hbmQoYiwgdG1wKTsKIAkJYiA9IHRtcDsKQEAgLTc3MCwyNCArMTAwMCwyMiBAQAogICogc2hvdWxkIHRlc3QgdGhlIG9wcG9zaXRlIG9mICJqdHlwZSIuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX25jbXAob2ZmcmVsLCBvZmZzZXQsIHNpemUsIG1hc2ssIGp0eXBlLCByZXZlcnNlLCB2KQotCWVudW0gZV9vZmZyZWwgb2ZmcmVsOwotCWJwZl9pbnQzMiB2OwotCWJwZl91X2ludDMyIG9mZnNldCwgc2l6ZSwgbWFzaywganR5cGU7Ci0JaW50IHJldmVyc2U7CitnZW5fbmNtcChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGVudW0gZV9vZmZyZWwgb2ZmcmVsLCBicGZfdV9pbnQzMiBvZmZzZXQsCisgICAgYnBmX3VfaW50MzIgc2l6ZSwgYnBmX3VfaW50MzIgbWFzaywgYnBmX3VfaW50MzIganR5cGUsIGludCByZXZlcnNlLAorICAgIGJwZl9pbnQzMiB2KQogewogCXN0cnVjdCBzbGlzdCAqcywgKnMyOwogCXN0cnVjdCBibG9jayAqYjsKIAotCXMgPSBnZW5fbG9hZF9hKG9mZnJlbCwgb2Zmc2V0LCBzaXplKTsKKwlzID0gZ2VuX2xvYWRfYShjc3RhdGUsIG9mZnJlbCwgb2Zmc2V0LCBzaXplKTsKIAogCWlmIChtYXNrICE9IDB4ZmZmZmZmZmYpIHsKLQkJczIgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BTkR8QlBGX0spOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQU5EfEJQRl9LKTsKIAkJczItPnMuayA9IG1hc2s7CiAJCXNhcHBlbmQocywgczIpOwogCX0KIAotCWIgPSBuZXdfYmxvY2soSk1QKGp0eXBlKSk7CisJYiA9IG5ld19ibG9jayhjc3RhdGUsIEpNUChqdHlwZSkpOwogCWItPnN0bXRzID0gczsKIAliLT5zLmsgPSB2OwogCWlmIChyZXZlcnNlICYmIChqdHlwZSA9PSBCUEZfSkdUIHx8IGp0eXBlID09IEJQRl9KR0UpKQpAQCAtNzk1LDIzMCArMTAyMyw4OCBAQAogCXJldHVybiBiOwogfQogCi0vKgotICogVmFyaW91cyBjb2RlIGNvbnN0cnVjdHMgbmVlZCB0byBrbm93IHRoZSBsYXlvdXQgb2YgdGhlIHBhY2tldC4KLSAqIFRoZXNlIHZhcmlhYmxlcyBnaXZlIHRoZSBuZWNlc3Nhcnkgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcKLSAqIG9mIHRoZSBwYWNrZXQgZGF0YS4KLSAqLwotCi0vKgotICogQWJzb2x1dGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLgotICovCi1zdGF0aWMgYnBmX2Fic19vZmZzZXQgb2ZmX2xpbmtoZHI7Ci0KLS8qCi0gKiBJZiB3ZSdyZSBjaGVja2luZyBhIGxpbmstbGF5ZXIgaGVhZGVyIGZvciBhIHBhY2tldCBlbmNhcHN1bGF0ZWQgaW4KLSAqIGFub3RoZXIgcHJvdG9jb2wgbGF5ZXIsIHRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgaW5mb3JtYXRpb24gZm9yIHRoZQotICogcHJldmlvdXMgbGF5ZXJzJyBsaW5rLWxheWVyIGhlYWRlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhdwotICogcGFja2V0IGRhdGEuCi0gKi8KLXN0YXRpYyBicGZfYWJzX29mZnNldCBvZmZfcHJldmxpbmtoZHI7Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IGluZm9ybWF0aW9uIGZvciB0aGUgb3V0ZXJtb3N0IGxheWVycycgbGluay1sYXllcgotICogaGVhZGVyLgotICovCi1zdGF0aWMgYnBmX2Fic19vZmZzZXQgb2ZmX291dGVybW9zdGxpbmtoZHI7Ci0KLS8qCi0gKiAiUHVzaCIgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgYW5kIGxpbmstbGF5ZXIKLSAqIGhlYWRlciBvZmZzZXQgb250byBhICJzdGFjayIsIGFuZCBzZXQgYSBuZXcgdmFsdWUuICAoSXQncyBub3QgYQotICogZnVsbC1ibG93biBzdGFjazsgd2Uga2VlcCBvbmx5IHRoZSB0b3AgdHdvIGl0ZW1zLikKLSAqLwotI2RlZmluZSBQVVNIX0xJTktIRFIobmV3X2xpbmt0eXBlLCBuZXdfaXNfdmFyaWFibGUsIG5ld19jb25zdGFudF9wYXJ0LCBuZXdfcmVnKSBcCi17IFwKLQlwcmV2bGlua3R5cGUgPSBuZXdfbGlua3R5cGU7IFwKLQlvZmZfcHJldmxpbmtoZHIgPSBvZmZfbGlua2hkcjsgXAotCWxpbmt0eXBlID0gbmV3X2xpbmt0eXBlOyBcCi0Jb2ZmX2xpbmtoZHIuaXNfdmFyaWFibGUgPSBuZXdfaXNfdmFyaWFibGU7IFwKLQlvZmZfbGlua2hkci5jb25zdGFudF9wYXJ0ID0gbmV3X2NvbnN0YW50X3BhcnQ7IFwKLQlvZmZfbGlua2hkci5yZWcgPSBuZXdfcmVnOyBcCi0JaXNfZ2VuZXZlID0gMDsgXAotfQotCi0vKgotICogQWJzb2x1dGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgcGF5bG9hZC4KLSAqLwotc3RhdGljIGJwZl9hYnNfb2Zmc2V0IG9mZl9saW5rcGw7Ci0KLS8qCi0gKiAib2ZmX2xpbmt0eXBlIiBpcyB0aGUgb2Zmc2V0IHRvIGluZm9ybWF0aW9uIGluIHRoZSBsaW5rLWxheWVyIGhlYWRlcgotICogZ2l2aW5nIHRoZSBwYWNrZXQgdHlwZS4gVGhpcyBpcyBhbiBhYnNvbHV0ZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nCi0gKiBvZiB0aGUgcGFja2V0LgotICoKLSAqIEZvciBFdGhlcm5ldCwgaXQncyB0aGUgb2Zmc2V0IG9mIHRoZSBFdGhlcm5ldCB0eXBlIGZpZWxkOyB0aGlzCi0gKiBtZWFucyB0aGF0IGl0IG11c3QgaGF2ZSBhIHZhbHVlIHRoYXQgc2tpcHMgVkxBTiB0YWdzLgotICoKLSAqIEZvciBsaW5rLWxheWVyIHR5cGVzIHRoYXQgYWx3YXlzIHVzZSA4MDIuMiBoZWFkZXJzLCBpdCdzIHRoZQotICogb2Zmc2V0IG9mIHRoZSBMTEMgaGVhZGVyOyB0aGlzIG1lYW5zIHRoYXQgaXQgbXVzdCBoYXZlIGEgdmFsdWUKLSAqIHRoYXQgc2tpcHMgVkxBTiB0YWdzLgotICoKLSAqIEZvciBQUFAsIGl0J3MgdGhlIG9mZnNldCBvZiB0aGUgUFBQIHR5cGUgZmllbGQuCi0gKgotICogRm9yIENpc2NvIEhETEMsIGl0J3MgdGhlIG9mZnNldCBvZiB0aGUgQ0hETEMgdHlwZSBmaWVsZC4KLSAqCi0gKiBGb3IgQlNEIGxvb3BiYWNrLCBpdCdzIHRoZSBvZmZzZXQgb2YgdGhlIEFGXyB2YWx1ZS4KLSAqCi0gKiBGb3IgTGludXggY29va2VkIHNvY2tldHMsIGl0J3MgdGhlIG9mZnNldCBvZiB0aGUgdHlwZSBmaWVsZC4KLSAqCi0gKiBvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCBpcyBzZXQgdG8gLTEgZm9yIG5vIGVuY2Fwc3VsYXRpb24sCi0gKiBpbiB3aGljaCBjYXNlLCBJUCBpcyBhc3N1bWVkLgotICovCi1zdGF0aWMgYnBmX2Fic19vZmZzZXQgb2ZmX2xpbmt0eXBlOwotCi0vKgotICogVFJVRSBpZiB0aGUgbGluayBsYXllciBpbmNsdWRlcyBhbiBBVE0gcHNldWRvLWhlYWRlci4KLSAqLwotc3RhdGljIGludCBpc19hdG0gPSAwOwotCi0vKgotICogVFJVRSBpZiAiZ2VuZXZlIiBhcHBlYXJlZCBpbiB0aGUgZmlsdGVyOyBpdCBjYXVzZXMgdXMgdG8gZ2VuZXJhdGUKLSAqIGNvZGUgdGhhdCBjaGVja3MgZm9yIGEgR2VuZXZlIGhlYWRlciBhbmQgYXNzdW1lIHRoYXQgbGF0ZXIgZmlsdGVycwotICogYXBwbHkgdG8gdGhlIGVuY2Fwc3VsYXRlZCBwYXlsb2FkLgotICovCi1zdGF0aWMgaW50IGlzX2dlbmV2ZSA9IDA7Ci0KLS8qCi0gKiBUaGVzZSBhcmUgb2Zmc2V0cyBmb3IgdGhlIEFUTSBwc2V1ZG8taGVhZGVyLgotICovCi1zdGF0aWMgdV9pbnQgb2ZmX3ZwaTsKLXN0YXRpYyB1X2ludCBvZmZfdmNpOwotc3RhdGljIHVfaW50IG9mZl9wcm90bzsKLQotLyoKLSAqIFRoZXNlIGFyZSBvZmZzZXRzIGZvciB0aGUgTVRQMiBmaWVsZHMuCi0gKi8KLXN0YXRpYyB1X2ludCBvZmZfbGk7Ci1zdGF0aWMgdV9pbnQgb2ZmX2xpX2hzbDsKLQotLyoKLSAqIFRoZXNlIGFyZSBvZmZzZXRzIGZvciB0aGUgTVRQMyBmaWVsZHMuCi0gKi8KLXN0YXRpYyB1X2ludCBvZmZfc2lvOwotc3RhdGljIHVfaW50IG9mZl9vcGM7Ci1zdGF0aWMgdV9pbnQgb2ZmX2RwYzsKLXN0YXRpYyB1X2ludCBvZmZfc2xzOwotCi0vKgotICogVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBBVE0gcHNldWRvX2hlYWRlciwKLSAqIG9yIC0xIGlmIHRoZXJlIGlzIG5vIEFUTSBwc2V1ZG8taGVhZGVyLgotICovCi1zdGF0aWMgdV9pbnQgb2ZmX3BheWxvYWQ7Ci0KLS8qCi0gKiBUaGVzZSBhcmUgb2Zmc2V0cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXR3b3JrLWxheWVyIGhlYWRlci4KLSAqIFRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgcGF5bG9hZCAoaS5lLiwKLSAqIHRoZXkgZG9uJ3QgaW5jbHVkZSBvZmZfbGlua2hkci5jb25zdGFudF9wYXJ0IG9yIG9mZl9saW5rcGwuY29uc3RhbnRfcGFydCkuCi0gKgotICogSWYgdGhlIGxpbmsgbGF5ZXIgbmV2ZXIgdXNlcyA4MDIuMiBMTEM6Ci0gKgotICoJIm9mZl9ubCIgYW5kICJvZmZfbmxfbm9zbmFwIiBhcmUgdGhlIHNhbWUuCi0gKgotICogSWYgdGhlIGxpbmsgbGF5ZXIgYWx3YXlzIHVzZXMgODAyLjIgTExDOgotICoKLSAqCSJvZmZfbmwiIGlzIHRoZSBvZmZzZXQgaWYgdGhlcmUncyBhIFNOQVAgaGVhZGVyIGZvbGxvd2luZwotICoJdGhlIDgwMi4yIGhlYWRlcjsKLSAqCi0gKgkib2ZmX25sX25vc25hcCIgaXMgdGhlIG9mZnNldCBpZiB0aGVyZSdzIG5vIFNOQVAgaGVhZGVyLgotICoKLSAqIElmIHRoZSBsaW5rIGxheWVyIGlzIEV0aGVybmV0OgotICoKLSAqCSJvZmZfbmwiIGlzIHRoZSBvZmZzZXQgaWYgdGhlIHBhY2tldCBpcyBhbiBFdGhlcm5ldCBJSSBwYWNrZXQKLSAqCSh3ZSBhc3N1bWUgbm8gODAyLjMrODAyLjIrU05BUCk7Ci0gKgotICoJIm9mZl9ubF9ub3NuYXAiIGlzIHRoZSBvZmZzZXQgaWYgdGhlIHBhY2tldCBpcyBhbiA4MDIuMyBwYWNrZXQKLSAqCXdpdGggYW4gODAyLjIgaGVhZGVyIGZvbGxvd2luZyBpdC4KLSAqLwotc3RhdGljIHVfaW50IG9mZl9ubDsKLXN0YXRpYyB1X2ludCBvZmZfbmxfbm9zbmFwOwotCi1zdGF0aWMgaW50IGxpbmt0eXBlOwotc3RhdGljIGludCBwcmV2bGlua3R5cGU7Ci1zdGF0aWMgaW50IG91dGVybW9zdGxpbmt0eXBlOwotCiBzdGF0aWMgdm9pZAotaW5pdF9saW5rdHlwZShwKQotCXBjYXBfdCAqcDsKK2luaXRfbGlua3R5cGUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBwY2FwX3QgKnApCiB7Ci0JcGNhcF9mZGRpcGFkID0gcC0+ZmRkaXBhZDsKKwljc3RhdGUtPnBjYXBfZmRkaXBhZCA9IHAtPmZkZGlwYWQ7CiAKIAkvKgogCSAqIFdlIHN0YXJ0IG91dCB3aXRoIG9ubHkgb25lIGxpbmstbGF5ZXIgaGVhZGVyLgogCSAqLwotCW91dGVybW9zdGxpbmt0eXBlID0gcGNhcF9kYXRhbGluayhwKTsKLQlvZmZfb3V0ZXJtb3N0bGlua2hkci5jb25zdGFudF9wYXJ0ID0gMDsKLQlvZmZfb3V0ZXJtb3N0bGlua2hkci5pc192YXJpYWJsZSA9IDA7Ci0Jb2ZmX291dGVybW9zdGxpbmtoZHIucmVnID0gLTE7CisJY3N0YXRlLT5vdXRlcm1vc3RsaW5rdHlwZSA9IHBjYXBfZGF0YWxpbmsocCk7CisJY3N0YXRlLT5vZmZfb3V0ZXJtb3N0bGlua2hkci5jb25zdGFudF9wYXJ0ID0gMDsKKwljc3RhdGUtPm9mZl9vdXRlcm1vc3RsaW5raGRyLmlzX3ZhcmlhYmxlID0gMDsKKwljc3RhdGUtPm9mZl9vdXRlcm1vc3RsaW5raGRyLnJlZyA9IC0xOwogCi0JcHJldmxpbmt0eXBlID0gb3V0ZXJtb3N0bGlua3R5cGU7Ci0Jb2ZmX3ByZXZsaW5raGRyLmNvbnN0YW50X3BhcnQgPSAwOwotCW9mZl9wcmV2bGlua2hkci5pc192YXJpYWJsZSA9IDA7Ci0Jb2ZmX3ByZXZsaW5raGRyLnJlZyA9IC0xOworCWNzdGF0ZS0+cHJldmxpbmt0eXBlID0gY3N0YXRlLT5vdXRlcm1vc3RsaW5rdHlwZTsKKwljc3RhdGUtPm9mZl9wcmV2bGlua2hkci5jb25zdGFudF9wYXJ0ID0gMDsKKwljc3RhdGUtPm9mZl9wcmV2bGlua2hkci5pc192YXJpYWJsZSA9IDA7CisJY3N0YXRlLT5vZmZfcHJldmxpbmtoZHIucmVnID0gLTE7CiAKLQlsaW5rdHlwZSA9IG91dGVybW9zdGxpbmt0eXBlOwotCW9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgPSAwOwotCW9mZl9saW5raGRyLmlzX3ZhcmlhYmxlID0gMDsKLQlvZmZfbGlua2hkci5yZWcgPSAtMTsKKwljc3RhdGUtPmxpbmt0eXBlID0gY3N0YXRlLT5vdXRlcm1vc3RsaW5rdHlwZTsKKwljc3RhdGUtPm9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgPSAwOworCWNzdGF0ZS0+b2ZmX2xpbmtoZHIuaXNfdmFyaWFibGUgPSAwOworCWNzdGF0ZS0+b2ZmX2xpbmtoZHIucmVnID0gLTE7CiAKIAkvKgogCSAqIFhYWAogCSAqLwotCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDA7Ci0Jb2ZmX2xpbmtwbC5pc192YXJpYWJsZSA9IDA7Ci0Jb2ZmX2xpbmtwbC5yZWcgPSAtMTsKKwljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDA7CisJY3N0YXRlLT5vZmZfbGlua3BsLmlzX3ZhcmlhYmxlID0gMDsKKwljc3RhdGUtPm9mZl9saW5rcGwucmVnID0gLTE7CiAKLQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDA7Ci0Jb2ZmX2xpbmt0eXBlLmlzX3ZhcmlhYmxlID0gMDsKLQlvZmZfbGlua3R5cGUucmVnID0gLTE7CisJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDA7CisJY3N0YXRlLT5vZmZfbGlua3R5cGUuaXNfdmFyaWFibGUgPSAwOworCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLnJlZyA9IC0xOwogCiAJLyoKIAkgKiBBc3N1bWUgaXQncyBub3QgcmF3IEFUTSB3aXRoIGEgcHNldWRvLWhlYWRlciwgZm9yIG5vdy4KIAkgKi8KLQlpc19hdG0gPSAwOwotCW9mZl92cGkgPSAtMTsKLQlvZmZfdmNpID0gLTE7Ci0Jb2ZmX3Byb3RvID0gLTE7Ci0Jb2ZmX3BheWxvYWQgPSAtMTsKKwljc3RhdGUtPmlzX2F0bSA9IDA7CisJY3N0YXRlLT5vZmZfdnBpID0gLTE7CisJY3N0YXRlLT5vZmZfdmNpID0gLTE7CisJY3N0YXRlLT5vZmZfcHJvdG8gPSAtMTsKKwljc3RhdGUtPm9mZl9wYXlsb2FkID0gLTE7CiAKIAkvKgogCSAqIEFuZCBub3QgR2VuZXZlLgogCSAqLwotCWlzX2dlbmV2ZSA9IDA7CisJY3N0YXRlLT5pc19nZW5ldmUgPSAwOwogCiAJLyoKIAkgKiBBbmQgYXNzdW1lIHdlJ3JlIG5vdCBkb2luZyBTUzcuCiAJICovCi0Jb2ZmX2xpID0gLTE7Ci0Jb2ZmX2xpX2hzbCA9IC0xOwotCW9mZl9zaW8gPSAtMTsKLQlvZmZfb3BjID0gLTE7Ci0Jb2ZmX2RwYyA9IC0xOwotCW9mZl9zbHMgPSAtMTsKKwljc3RhdGUtPm9mZl9saSA9IC0xOworCWNzdGF0ZS0+b2ZmX2xpX2hzbCA9IC0xOworCWNzdGF0ZS0+b2ZmX3NpbyA9IC0xOworCWNzdGF0ZS0+b2ZmX29wYyA9IC0xOworCWNzdGF0ZS0+b2ZmX2RwYyA9IC0xOworCWNzdGF0ZS0+b2ZmX3NscyA9IC0xOwogCi0gICAgICAgIGxhYmVsX3N0YWNrX2RlcHRoID0gMDsKLSAgICAgICAgdmxhbl9zdGFja19kZXB0aCA9IDA7CisJY3N0YXRlLT5sYWJlbF9zdGFja19kZXB0aCA9IDA7CisJY3N0YXRlLT52bGFuX3N0YWNrX2RlcHRoID0gMDsKIAotCXN3aXRjaCAobGlua3R5cGUpIHsKKwlzd2l0Y2ggKGNzdGF0ZS0+bGlua3R5cGUpIHsKIAogCWNhc2UgRExUX0FSQ05FVDoKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAyOwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSA2OwotCQlvZmZfbmwgPSAwOwkJLyogWFhYIGluIHJlYWxpdHksIHZhcmlhYmxlISAqLwotCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAyOworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDY7CisJCWNzdGF0ZS0+b2ZmX25sID0gMDsJLyogWFhYIGluIHJlYWxpdHksIHZhcmlhYmxlISAqLworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9BUkNORVRfTElOVVg6Ci0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gNDsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gODsKLQkJb2ZmX25sID0gMDsJCS8qIFhYWCBpbiByZWFsaXR5LCB2YXJpYWJsZSEgKi8KLQkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLworCQljc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gNDsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSA4OworCQljc3RhdGUtPm9mZl9ubCA9IDA7CQkvKiBYWFggaW4gcmVhbGl0eSwgdmFyaWFibGUhICovCisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0VOMTBNQjoKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxMjsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMTQ7CS8qIEV0aGVybmV0IGhlYWRlciBsZW5ndGggKi8KLQkJb2ZmX25sID0gMDsJCS8qIEV0aGVybmV0IElJICovCi0JCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMys4MDIuMiAqLworCQljc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gMTI7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMTQ7CS8qIEV0aGVybmV0IGhlYWRlciBsZW5ndGggKi8KKwkJY3N0YXRlLT5vZmZfbmwgPSAwOwkJLyogRXRoZXJuZXQgSUkgKi8KKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjMrODAyLjIgKi8KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9TTElQOgpAQCAtMTAyNiw0NCArMTExMiw0NCBAQAogCQkgKiBTTElQIGRvZXNuJ3QgaGF2ZSBhIGxpbmsgbGV2ZWwgdHlwZS4gIFRoZSAxNiBieXRlCiAJCSAqIGhlYWRlciBpcyBoYWNrZWQgaW50byBvdXIgU0xJUCBkcml2ZXIuCiAJCSAqLwotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IC0xOwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAxNjsKLQkJb2ZmX25sID0gMDsKLQkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLworCQljc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gT0ZGU0VUX05PVF9TRVQ7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMTY7CisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCWJyZWFrOwogCiAJY2FzZSBETFRfU0xJUF9CU0RPUzoKIAkJLyogWFhYIHRoaXMgbWF5IGJlIHRoZSBzYW1lIGFzIHRoZSBETFRfUFBQX0JTRE9TIGNhc2UgKi8KLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAtMTsKKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IE9GRlNFVF9OT1RfU0VUOwogCQkvKiBYWFggZW5kICovCi0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDI0OwotCQlvZmZfbmwgPSAwOwotCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMjQ7CisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCWJyZWFrOwogCiAJY2FzZSBETFRfTlVMTDoKIAljYXNlIERMVF9MT09QOgotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDA7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDQ7Ci0JCW9mZl9ubCA9IDA7Ci0JCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDA7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gNDsKKwkJY3N0YXRlLT5vZmZfbmwgPSAwOworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9FTkM6Ci0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gMDsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMTI7Ci0JCW9mZl9ubCA9IDA7Ci0JCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDA7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMTI7CisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCWJyZWFrOwogCiAJY2FzZSBETFRfUFBQOgogCWNhc2UgRExUX1BQUF9QUFBEOgogCWNhc2UgRExUX0NfSERMQzoJCS8qIEJTRC9PUyBDaXNjbyBIRExDICovCiAJY2FzZSBETFRfUFBQX1NFUklBTDoJCS8qIE5ldEJTRCBzeW5jL2FzeW5jIHNlcmlhbCBQUFAgKi8KLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAyOwkvKiBza2lwIEhETEMtbGlrZSBmcmFtaW5nICovCi0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDQ7CS8qIHNraXAgSERMQy1saWtlIGZyYW1pbmcgYW5kIHByb3RvY29sIGZpZWxkICovCi0JCW9mZl9ubCA9IDA7Ci0JCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDI7CS8qIHNraXAgSERMQy1saWtlIGZyYW1pbmcgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSA0OwkvKiBza2lwIEhETEMtbGlrZSBmcmFtaW5nIGFuZCBwcm90b2NvbCBmaWVsZCAqLworCQljc3RhdGUtPm9mZl9ubCA9IDA7CisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX1BQUF9FVEhFUjoKQEAgLTEwNzEsMTcgKzExNTcsMTcgQEAKIAkJICogVGhpcyBkb2VzIG5vIGluY2x1ZGUgdGhlIEV0aGVybmV0IGhlYWRlciwgYW5kCiAJCSAqIG9ubHkgY292ZXJzIHNlc3Npb24gc3RhdGUuCiAJCSAqLwotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDY7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDg7Ci0JCW9mZl9ubCA9IDA7Ci0JCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDY7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gODsKKwkJY3N0YXRlLT5vZmZfbmwgPSAwOworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9QUFBfQlNET1M6Ci0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gNTsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMjQ7Ci0JCW9mZl9ubCA9IDA7Ci0JCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDU7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMjQ7CisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCWJyZWFrOwogCiAJY2FzZSBETFRfRkRESToKQEAgLTEwOTMsMTIgKzExNzksMTIgQEAKIAkJICogaXMgYmVpbmcgdXNlZCBhbmQgcGljayBvdXQgdGhlIGVuY2Fwc3VsYXRlZCBFdGhlcm5ldCB0eXBlLgogCQkgKiBYWFggLSBzaG91bGQgd2UgZ2VuZXJhdGUgY29kZSB0byBjaGVjayBmb3IgU05BUD8KIAkJICovCi0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gMTM7Ci0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ICs9IHBjYXBfZmRkaXBhZDsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMTM7CS8qIEZEREkgTUFDIGhlYWRlciBsZW5ndGggKi8KLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICs9IHBjYXBfZmRkaXBhZDsKLQkJb2ZmX25sID0gODsJCS8qIDgwMi4yK1NOQVAgKi8KLQkJb2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4yICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxMzsKKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCArPSBjc3RhdGUtPnBjYXBfZmRkaXBhZDsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAxMzsJLyogRkRESSBNQUMgaGVhZGVyIGxlbmd0aCAqLworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCArPSBjc3RhdGUtPnBjYXBfZmRkaXBhZDsKKwkJY3N0YXRlLT5vZmZfbmwgPSA4OwkJLyogODAyLjIrU05BUCAqLworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0lFRUU4MDI6CkBAIC0xMTI1LDE2ICsxMjExLDE2IEBACiAJCSAqIHRoZSAxNi1iaXQgdmFsdWUgYXQgYW4gb2Zmc2V0IG9mIDE0IChzaGlmdGVkIHJpZ2h0CiAJCSAqIDggLSBmaWd1cmUgb3V0IHdoaWNoIGJ5dGUgdGhhdCBpcykuCiAJCSAqLwotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDE0OwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAxNDsJLyogVG9rZW4gUmluZyBNQUMgaGVhZGVyIGxlbmd0aCAqLwotCQlvZmZfbmwgPSA4OwkJLyogODAyLjIrU05BUCAqLwotCQlvZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjIgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDE0OworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDE0OwkvKiBUb2tlbiBSaW5nIE1BQyBoZWFkZXIgbGVuZ3RoICovCisJCWNzdGF0ZS0+b2ZmX25sID0gODsJCS8qIDgwMi4yK1NOQVAgKi8KKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjIgKi8KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9QUklTTV9IRUFERVI6CiAJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CiAJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKLQkJb2ZmX2xpbmtoZHIuaXNfdmFyaWFibGUgPSAxOworCQljc3RhdGUtPm9mZl9saW5raGRyLmlzX3ZhcmlhYmxlID0gMTsKIAkJLyogRmFsbCB0aHJvdWdoLCA4MDIuMTEgZG9lc24ndCBoYXZlIGEgdmFyaWFibGUgbGluawogCQkgKiBwcmVmaXggYnV0IGlzIG90aGVyd2lzZSB0aGUgc2FtZS4gKi8KIApAQCAtMTE1NywxMSArMTI0MywxMSBAQAogCQkgKiBoZWFkZXIgb3IgYW4gQVZTIGhlYWRlciwgc28sIGluIHByYWN0aWNlLCBpdCdzCiAJCSAqIHZhcmlhYmxlLWxlbmd0aC4KIAkJICovCi0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gMjQ7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDA7CS8qIGxpbmstbGF5ZXIgaGVhZGVyIGlzIHZhcmlhYmxlLWxlbmd0aCAqLwotCQlvZmZfbGlua3BsLmlzX3ZhcmlhYmxlID0gMTsKLQkJb2ZmX25sID0gODsJCS8qIDgwMi4yK1NOQVAgKi8KLQkJb2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4yICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAyNDsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAwOwkvKiBsaW5rLWxheWVyIGhlYWRlciBpcyB2YXJpYWJsZS1sZW5ndGggKi8KKwkJY3N0YXRlLT5vZmZfbGlua3BsLmlzX3ZhcmlhYmxlID0gMTsKKwkJY3N0YXRlLT5vZmZfbmwgPSA4OwkJLyogODAyLjIrU05BUCAqLworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX1BQSToKQEAgLTExNzQsMTIgKzEyNjAsMTIgQEAKIAkJICogdGhlIGVuY2Fwc3VsYXRlZCBETFQgc2hvdWxkIGJlIERMVF9JRUVFODAyXzExKSB3ZQogCQkgKiBnZW5lcmF0ZSBjb2RlIHRvIGNoZWNrIGZvciB0aGlzIHRvby4KIAkJICovCi0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gMjQ7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDA7CS8qIGxpbmstbGF5ZXIgaGVhZGVyIGlzIHZhcmlhYmxlLWxlbmd0aCAqLwotCQlvZmZfbGlua3BsLmlzX3ZhcmlhYmxlID0gMTsKLQkJb2ZmX2xpbmtoZHIuaXNfdmFyaWFibGUgPSAxOwotCQlvZmZfbmwgPSA4OwkJLyogODAyLjIrU05BUCAqLwotCQlvZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjIgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDI0OworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDA7CS8qIGxpbmstbGF5ZXIgaGVhZGVyIGlzIHZhcmlhYmxlLWxlbmd0aCAqLworCQljc3RhdGUtPm9mZl9saW5rcGwuaXNfdmFyaWFibGUgPSAxOworCQljc3RhdGUtPm9mZl9saW5raGRyLmlzX3ZhcmlhYmxlID0gMTsKKwkJY3N0YXRlLT5vZmZfbmwgPSA4OwkJLyogODAyLjIrU05BUCAqLworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0FUTV9SRkMxNDgzOgpAQCAtMTE5NSwxMCArMTI4MSwxMCBAQAogCQkgKiBvciAicHBwb2EgYW5kIHRjcCBwb3J0IDgwIiBhbmQgaGF2ZSBpdCBjaGVjayBmb3IKIAkJICogUFBQb3tBLEV9IGFuZCBhIFBQUCBwcm90b2NvbCBvZiBJUCBhbmQuLi4uCiAJCSAqLwotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDA7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDA7CS8qIHBhY2tldCBiZWdpbnMgd2l0aCBMTEMgaGVhZGVyICovCi0JCW9mZl9ubCA9IDg7CQkvKiA4MDIuMitTTkFQICovCi0JCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLworCQljc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gMDsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAwOwkvKiBwYWNrZXQgYmVnaW5zIHdpdGggTExDIGhlYWRlciAqLworCQljc3RhdGUtPm9mZl9ubCA9IDg7CQkvKiA4MDIuMitTTkFQICovCisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4yICovCiAJCWJyZWFrOwogCiAJY2FzZSBETFRfU1VOQVRNOgpAQCAtMTIwNiwzMSArMTI5MiwzMSBAQAogCQkgKiBGdWxsIEZyb250YWwgQVRNOyB5b3UgZ2V0IEFBTG4gUERVcyB3aXRoIGFuIEFUTQogCQkgKiBwc2V1ZG8taGVhZGVyLgogCQkgKi8KLQkJaXNfYXRtID0gMTsKLQkJb2ZmX3ZwaSA9IFNVTkFUTV9WUElfUE9TOwotCQlvZmZfdmNpID0gU1VOQVRNX1ZDSV9QT1M7Ci0JCW9mZl9wcm90byA9IFBST1RPX1BPUzsKLQkJb2ZmX3BheWxvYWQgPSBTVU5BVE1fUEtUX0JFR0lOX1BPUzsKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBvZmZfcGF5bG9hZDsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gb2ZmX3BheWxvYWQ7CS8qIGlmIExMQy1lbmNhcHN1bGF0ZWQgKi8KLQkJb2ZmX25sID0gODsJCS8qIDgwMi4yK1NOQVAgKi8KLQkJb2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4yICovCisJCWNzdGF0ZS0+aXNfYXRtID0gMTsKKwkJY3N0YXRlLT5vZmZfdnBpID0gU1VOQVRNX1ZQSV9QT1M7CisJCWNzdGF0ZS0+b2ZmX3ZjaSA9IFNVTkFUTV9WQ0lfUE9TOworCQljc3RhdGUtPm9mZl9wcm90byA9IFBST1RPX1BPUzsKKwkJY3N0YXRlLT5vZmZfcGF5bG9hZCA9IFNVTkFUTV9QS1RfQkVHSU5fUE9TOworCQljc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gY3N0YXRlLT5vZmZfcGF5bG9hZDsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBjc3RhdGUtPm9mZl9wYXlsb2FkOwkvKiBpZiBMTEMtZW5jYXBzdWxhdGVkICovCisJCWNzdGF0ZS0+b2ZmX25sID0gODsJCS8qIDgwMi4yK1NOQVAgKi8KKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjIgKi8KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9SQVc6CiAJY2FzZSBETFRfSVBWNDoKIAljYXNlIERMVF9JUFY2OgotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IC0xOwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAwOwotCQlvZmZfbmwgPSAwOwotCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAwOworCQljc3RhdGUtPm9mZl9ubCA9IDA7CisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0xJTlVYX1NMTDoJLyogZmFrZSBoZWFkZXIgZm9yIExpbnV4IGNvb2tlZCBzb2NrZXQgKi8KLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxNDsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMTY7Ci0JCW9mZl9ubCA9IDA7Ci0JCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDE0OworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDE2OworCQljc3RhdGUtPm9mZl9ubCA9IDA7CisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0xUQUxLOgpAQCAtMTIzOSwxMCArMTMyNSwxMCBAQAogCQkgKiBidXQgcmVhbGx5IGl0IGp1c3QgaW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgaXMgYSAic2hvcnQiIG9yCiAJCSAqICJsb25nIiBERFAgcGFja2V0IGZvbGxvd2luZy4KIAkJICovCi0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gLTE7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDA7Ci0JCW9mZl9ubCA9IDA7Ci0JCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IE9GRlNFVF9OT1RfU0VUOworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDA7CisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCiAJCWJyZWFrOwogCiAJY2FzZSBETFRfSVBfT1ZFUl9GQzoKQEAgLTEyNTYsMTAgKzEzNDIsMTAgQEAKIAkJICogWFhYIC0gc2hvdWxkIHdlIGdlbmVyYXRlIGNvZGUgdG8gY2hlY2sgZm9yIFNOQVA/IFJGQwogCQkgKiAyNjI1IHNheXMgU05BUCBzaG91bGQgYmUgdXNlZC4KIAkJICovCi0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gMTY7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDE2OwotCQlvZmZfbmwgPSA4OwkJLyogODAyLjIrU05BUCAqLwotCQlvZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjIgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDE2OworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDE2OworCQljc3RhdGUtPm9mZl9ubCA9IDg7CQkvKiA4MDIuMitTTkFQICovCisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4yICovCiAJCWJyZWFrOwogCiAJY2FzZSBETFRfRlJFTEFZOgpAQCAtMTI2NywxMCArMTM1MywxMCBAQAogCQkgKiBYWFggLSB3ZSBzaG91bGQgc2V0IHRoaXMgdG8gaGFuZGxlIFNOQVAtZW5jYXBzdWxhdGVkCiAJCSAqIGZyYW1lcyAoTkxQSUQgb2YgMHg4MCkuCiAJCSAqLwotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IC0xOwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAwOwotCQlvZmZfbmwgPSAwOwotCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAwOworCQljc3RhdGUtPm9mZl9ubCA9IDA7CisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlicmVhazsKIAogICAgICAgICAgICAgICAgIC8qCkBAIC0xMjc5LDMyICsxMzY1LDMyIEBACiAgICAgICAgICAgICAgICAgICogc28gbGV0cyBzdGFydCB3aXRoIG9mZnNldCA0IGZvciBub3cgYW5kIGluY3JlbWVudHMgbGF0ZXIgb24gKEZJWE1FKTsKICAgICAgICAgICAgICAgICAgKi8KIAljYXNlIERMVF9NRlI6Ci0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gLTE7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDA7Ci0JCW9mZl9ubCA9IDQ7Ci0JCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBYWFggLSBmb3Igbm93IC0+IG5vIDgwMi4yIExMQyAqLworCQljc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gT0ZGU0VUX05PVF9TRVQ7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMDsKKwkJY3N0YXRlLT5vZmZfbmwgPSA0OworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAwOwkvKiBYWFggLSBmb3Igbm93IC0+IG5vIDgwMi4yIExMQyAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0FQUExFX0lQX09WRVJfSUVFRTEzOTQ6Ci0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gMTY7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDE4OwotCQlvZmZfbmwgPSAwOwotCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxNjsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAxODsKKwkJY3N0YXRlLT5vZmZfbmwgPSAwOworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9TWU1BTlRFQ19GSVJFV0FMTDoKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSA2OwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSA0NDsKLQkJb2ZmX25sID0gMDsJCS8qIEV0aGVybmV0IElJICovCi0JCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBYWFggLSB3aGF0IGRvZXMgaXQgZG8gd2l0aCA4MDIuMyBwYWNrZXRzPyAqLworCQljc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gNjsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSA0NDsKKwkJY3N0YXRlLT5vZmZfbmwgPSAwOwkJLyogRXRoZXJuZXQgSUkgKi8KKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMDsJLyogWFhYIC0gd2hhdCBkb2VzIGl0IGRvIHdpdGggODAyLjMgcGFja2V0cz8gKi8KIAkJYnJlYWs7CiAKICNpZmRlZiBIQVZFX05FVF9QRlZBUl9ICiAJY2FzZSBETFRfUEZMT0c6Ci0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gMDsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gUEZMT0dfSERSTEVOOwotCQlvZmZfbmwgPSAwOwotCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAwOworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IFBGTE9HX0hEUkxFTjsKKwkJY3N0YXRlLT5vZmZfbmwgPSAwOworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KIAkJYnJlYWs7CiAjZW5kaWYKIApAQCAtMTMxNCwxODYgKzE0MDAsMTg2IEBACiAgICAgICAgIGNhc2UgRExUX0pVTklQRVJfUFBQOgogICAgICAgICBjYXNlIERMVF9KVU5JUEVSX0NIRExDOgogICAgICAgICBjYXNlIERMVF9KVU5JUEVSX0ZSRUxBWToKLSAgICAgICAgICAgICAgICBvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDQ7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDQ7Ci0JCW9mZl9ubCA9IDA7Ci0JCW9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSA0OworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDQ7CisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gLTE7CS8qIG5vIDgwMi4yIExMQyAqLwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAJY2FzZSBETFRfSlVOSVBFUl9BVE0xOgotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDQ7CQkvKiBpbiByZWFsaXR5IHZhcmlhYmxlIGJldHdlZW4gNC04ICovCi0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDQ7CS8qIGluIHJlYWxpdHkgdmFyaWFibGUgYmV0d2VlbiA0LTggKi8KLQkJb2ZmX25sID0gMDsKLQkJb2ZmX25sX25vc25hcCA9IDEwOworCQljc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gNDsJCS8qIGluIHJlYWxpdHkgdmFyaWFibGUgYmV0d2VlbiA0LTggKi8KKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSA0OwkvKiBpbiByZWFsaXR5IHZhcmlhYmxlIGJldHdlZW4gNC04ICovCisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMTA7CiAJCWJyZWFrOwogCiAJY2FzZSBETFRfSlVOSVBFUl9BVE0yOgotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDg7CQkvKiBpbiByZWFsaXR5IHZhcmlhYmxlIGJldHdlZW4gOC0xMiAqLwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSA4OwkvKiBpbiByZWFsaXR5IHZhcmlhYmxlIGJldHdlZW4gOC0xMiAqLwotCQlvZmZfbmwgPSAwOwotCQlvZmZfbmxfbm9zbmFwID0gMTA7CisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSA4OwkJLyogaW4gcmVhbGl0eSB2YXJpYWJsZSBiZXR3ZWVuIDgtMTIgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSA4OwkvKiBpbiByZWFsaXR5IHZhcmlhYmxlIGJldHdlZW4gOC0xMiAqLworCQljc3RhdGUtPm9mZl9ubCA9IDA7CisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDEwOwogCQlicmVhazsKIAogCQkvKiBmcmFtZXMgY2FwdHVyZWQgb24gYSBKdW5pcGVyIFBQUG9FIHNlcnZpY2UgUElDCiAJCSAqIGNvbnRhaW4gcmF3IGV0aGVybmV0IGZyYW1lcyAqLwogCWNhc2UgRExUX0pVTklQRVJfUFBQT0U6CiAgICAgICAgIGNhc2UgRExUX0pVTklQRVJfRVRIRVI6Ci0gICAgICAgIAlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAxNDsKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxNjsKLQkJb2ZmX25sID0gMTg7CQkvKiBFdGhlcm5ldCBJSSAqLwotCQlvZmZfbmxfbm9zbmFwID0gMjE7CS8qIDgwMi4zKzgwMi4yICovCisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMTQ7CisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxNjsKKwkJY3N0YXRlLT5vZmZfbmwgPSAxODsJCS8qIEV0aGVybmV0IElJICovCisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDIxOwkvKiA4MDIuMys4MDIuMiAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0pVTklQRVJfUFBQT0VfQVRNOgotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDQ7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDY7Ci0JCW9mZl9ubCA9IDA7Ci0JCW9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSA0OworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDY7CisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gLTE7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0pVTklQRVJfR0dTTjoKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSA2OwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAxMjsKLQkJb2ZmX25sID0gMDsKLQkJb2ZmX25sX25vc25hcCA9IC0xOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDY7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMTI7CisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gLTE7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0pVTklQRVJfRVM6Ci0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gNjsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gLTE7CS8qIG5vdCByZWFsbHkgYSBuZXR3b3JrIGxheWVyIGJ1dCByYXcgSVAgYWRkcmVzc2VzICovCi0JCW9mZl9ubCA9IC0xOwkJLyogbm90IHJlYWxseSBhIG5ldHdvcmsgbGF5ZXIgYnV0IHJhdyBJUCBhZGRyZXNzZXMgKi8KLQkJb2ZmX25sX25vc25hcCA9IC0xOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDY7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gT0ZGU0VUX05PVF9TRVQ7CS8qIG5vdCByZWFsbHkgYSBuZXR3b3JrIGxheWVyIGJ1dCByYXcgSVAgYWRkcmVzc2VzICovCisJCWNzdGF0ZS0+b2ZmX25sID0gLTE7CQkvKiBub3QgcmVhbGx5IGEgbmV0d29yayBsYXllciBidXQgcmF3IElQIGFkZHJlc3NlcyAqLworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCiAJCWJyZWFrOwogCiAJY2FzZSBETFRfSlVOSVBFUl9NT05JVE9SOgotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDEyOwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAxMjsKLQkJb2ZmX25sID0gMDsJCS8qIHJhdyBJUC9JUDYgaGVhZGVyICovCi0JCW9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxMjsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAxMjsKKwkJY3N0YXRlLT5vZmZfbmwgPSAwOwkJLyogcmF3IElQL0lQNiBoZWFkZXIgKi8KKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gLTE7CS8qIG5vIDgwMi4yIExMQyAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0JBQ05FVF9NU19UUDoKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAtMTsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gLTE7Ci0JCW9mZl9ubCA9IC0xOwotCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbmwgPSAtMTsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gLTE7CiAJCWJyZWFrOwogCiAJY2FzZSBETFRfSlVOSVBFUl9TRVJWSUNFUzoKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxMjsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gLTE7CS8qIEwzIHByb3RvIGxvY2F0aW9uIGRlcC4gb24gY29va2llIHR5cGUgKi8KLQkJb2ZmX25sID0gLTE7CQkvKiBMMyBwcm90byBsb2NhdGlvbiBkZXAuIG9uIGNvb2tpZSB0eXBlICovCi0JCW9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxMjsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsJLyogTDMgcHJvdG8gbG9jYXRpb24gZGVwLiBvbiBjb29raWUgdHlwZSAqLworCQljc3RhdGUtPm9mZl9ubCA9IC0xOwkJLyogTDMgcHJvdG8gbG9jYXRpb24gZGVwLiBvbiBjb29raWUgdHlwZSAqLworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCiAJCWJyZWFrOwogCiAJY2FzZSBETFRfSlVOSVBFUl9WUDoKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxODsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gLTE7Ci0JCW9mZl9ubCA9IC0xOwotCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxODsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbmwgPSAtMTsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gLTE7CiAJCWJyZWFrOwogCiAJY2FzZSBETFRfSlVOSVBFUl9TVDoKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxODsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gLTE7Ci0JCW9mZl9ubCA9IC0xOwotCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxODsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbmwgPSAtMTsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gLTE7CiAJCWJyZWFrOwogCiAJY2FzZSBETFRfSlVOSVBFUl9JU006Ci0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gODsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gLTE7Ci0JCW9mZl9ubCA9IC0xOwotCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSA4OworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IE9GRlNFVF9OT1RfU0VUOworCQljc3RhdGUtPm9mZl9ubCA9IC0xOworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAtMTsKIAkJYnJlYWs7CiAKIAljYXNlIERMVF9KVU5JUEVSX1ZTOgogCWNhc2UgRExUX0pVTklQRVJfU1JYX0UyRToKIAljYXNlIERMVF9KVU5JUEVSX0ZJQlJFQ0hBTk5FTDoKIAljYXNlIERMVF9KVU5JUEVSX0FUTV9DRU1JQzoKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSA4OwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAtMTsKLQkJb2ZmX25sID0gLTE7Ci0JCW9mZl9ubF9ub3NuYXAgPSAtMTsKKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDg7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gT0ZGU0VUX05PVF9TRVQ7CisJCWNzdGF0ZS0+b2ZmX25sID0gLTE7CisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IC0xOwogCQlicmVhazsKIAogCWNhc2UgRExUX01UUDI6Ci0JCW9mZl9saSA9IDI7Ci0JCW9mZl9saV9oc2wgPSA0OwotCQlvZmZfc2lvID0gMzsKLQkJb2ZmX29wYyA9IDQ7Ci0JCW9mZl9kcGMgPSA0OwotCQlvZmZfc2xzID0gNzsKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAtMTsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gLTE7Ci0JCW9mZl9ubCA9IC0xOwotCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCWNzdGF0ZS0+b2ZmX2xpID0gMjsKKwkJY3N0YXRlLT5vZmZfbGlfaHNsID0gNDsKKwkJY3N0YXRlLT5vZmZfc2lvID0gMzsKKwkJY3N0YXRlLT5vZmZfb3BjID0gNDsKKwkJY3N0YXRlLT5vZmZfZHBjID0gNDsKKwkJY3N0YXRlLT5vZmZfc2xzID0gNzsKKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IE9GRlNFVF9OT1RfU0VUOworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IE9GRlNFVF9OT1RfU0VUOworCQljc3RhdGUtPm9mZl9ubCA9IC0xOworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAtMTsKIAkJYnJlYWs7CiAKIAljYXNlIERMVF9NVFAyX1dJVEhfUEhEUjoKLQkJb2ZmX2xpID0gNjsKLQkJb2ZmX2xpX2hzbCA9IDg7Ci0JCW9mZl9zaW8gPSA3OwotCQlvZmZfb3BjID0gODsKLQkJb2ZmX2RwYyA9IDg7Ci0JCW9mZl9zbHMgPSAxMTsKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAtMTsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gLTE7Ci0JCW9mZl9ubCA9IC0xOwotCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCWNzdGF0ZS0+b2ZmX2xpID0gNjsKKwkJY3N0YXRlLT5vZmZfbGlfaHNsID0gODsKKwkJY3N0YXRlLT5vZmZfc2lvID0gNzsKKwkJY3N0YXRlLT5vZmZfb3BjID0gODsKKwkJY3N0YXRlLT5vZmZfZHBjID0gODsKKwkJY3N0YXRlLT5vZmZfc2xzID0gMTE7CisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbmwgPSAtMTsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gLTE7CiAJCWJyZWFrOwogCiAJY2FzZSBETFRfRVJGOgotCQlvZmZfbGkgPSAyMjsKLQkJb2ZmX2xpX2hzbCA9IDI0OwotCQlvZmZfc2lvID0gMjM7Ci0JCW9mZl9vcGMgPSAyNDsKLQkJb2ZmX2RwYyA9IDI0OwotCQlvZmZfc2xzID0gMjc7Ci0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gLTE7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IC0xOwotCQlvZmZfbmwgPSAtMTsKLQkJb2ZmX25sX25vc25hcCA9IC0xOworCQljc3RhdGUtPm9mZl9saSA9IDIyOworCQljc3RhdGUtPm9mZl9saV9oc2wgPSAyNDsKKwkJY3N0YXRlLT5vZmZfc2lvID0gMjM7CisJCWNzdGF0ZS0+b2ZmX29wYyA9IDI0OworCQljc3RhdGUtPm9mZl9kcGMgPSAyNDsKKwkJY3N0YXRlLT5vZmZfc2xzID0gMjc7CisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbmwgPSAtMTsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gLTE7CiAJCWJyZWFrOwogCiAJY2FzZSBETFRfUEZTWU5DOgotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IC0xOwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSA0OwotCQlvZmZfbmwgPSAwOwotCQlvZmZfbmxfbm9zbmFwID0gMDsKKwkJY3N0YXRlLT5vZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IE9GRlNFVF9OT1RfU0VUOworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDQ7CisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIERMVF9BWDI1X0tJU1M6CiAJCS8qCiAJCSAqIEN1cnJlbnRseSwgb25seSByYXcgImxpbmtbTjpNXSIgZmlsdGVyaW5nIGlzIHN1cHBvcnRlZC4KIAkJICovCi0JCW9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gLTE7CS8qIHZhcmlhYmxlLCBtaW4gMTUsIG1heCA3MSBzdGVwcyBvZiA3ICovCi0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IC0xOwotCQlvZmZfbmwgPSAtMTsJCS8qIHZhcmlhYmxlLCBtaW4gMTYsIG1heCA3MSBzdGVwcyBvZiA3ICovCi0JCW9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsJLyogdmFyaWFibGUsIG1pbiAxNSwgbWF4IDcxIHN0ZXBzIG9mIDcgKi8KKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBPRkZTRVRfTk9UX1NFVDsKKwkJY3N0YXRlLT5vZmZfbmwgPSAtMTsJCS8qIHZhcmlhYmxlLCBtaW4gMTYsIG1heCA3MSBzdGVwcyBvZiA3ICovCisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IC0xOwkvKiBubyA4MDIuMiBMTEMgKi8KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9JUE5FVDoKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxOwotCQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSAyNDsJLyogaXBuZXQgaGVhZGVyIGxlbmd0aCAqLwotCQlvZmZfbmwgPSAwOwotCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAxOworCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDI0OwkvKiBpcG5ldCBoZWFkZXIgbGVuZ3RoICovCisJCWNzdGF0ZS0+b2ZmX25sID0gMDsKKwkJY3N0YXRlLT5vZmZfbmxfbm9zbmFwID0gLTE7CiAJCWJyZWFrOwogCiAJY2FzZSBETFRfTkVUQU5BTFlaRVI6Ci0JCW9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgPSA0OwkvKiBFdGhlcm5ldCBoZWFkZXIgaXMgcGFzdCA0LWJ5dGUgcHNldWRvLWhlYWRlciAqLwotCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IG9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgKyAxMjsKLQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gb2ZmX2xpbmtoZHIuY29uc3RhbnRfcGFydCArIDE0OwkvKiBwc2V1ZG8taGVhZGVyK0V0aGVybmV0IGhlYWRlciBsZW5ndGggKi8KLQkJb2ZmX25sID0gMDsJCS8qIEV0aGVybmV0IElJICovCi0JCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMys4MDIuMiAqLworCQljc3RhdGUtPm9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgPSA0OwkvKiBFdGhlcm5ldCBoZWFkZXIgaXMgcGFzdCA0LWJ5dGUgcHNldWRvLWhlYWRlciAqLworCQljc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gY3N0YXRlLT5vZmZfbGlua2hkci5jb25zdGFudF9wYXJ0ICsgMTI7CisJCWNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gY3N0YXRlLT5vZmZfbGlua2hkci5jb25zdGFudF9wYXJ0ICsgMTQ7CS8qIHBzZXVkby1oZWFkZXIrRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAqLworCQljc3RhdGUtPm9mZl9ubCA9IDA7CQkvKiBFdGhlcm5ldCBJSSAqLworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMys4MDIuMiAqLwogCQlicmVhazsKIAogCWNhc2UgRExUX05FVEFOQUxZWkVSX1RSQU5TUEFSRU5UOgotCQlvZmZfbGlua2hkci5jb25zdGFudF9wYXJ0ID0gMTI7CS8qIE1BQyBoZWFkZXIgaXMgcGFzdCA0LWJ5dGUgcHNldWRvLWhlYWRlciwgcHJlYW1ibGUsIGFuZCBTRkQgKi8KLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBvZmZfbGlua2hkci5jb25zdGFudF9wYXJ0ICsgMTI7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IG9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgKyAxNDsJLyogcHNldWRvLWhlYWRlcitwcmVhbWJsZStTRkQrRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAqLwotCQlvZmZfbmwgPSAwOwkJLyogRXRoZXJuZXQgSUkgKi8KLQkJb2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4zKzgwMi4yICovCisJCWNzdGF0ZS0+b2ZmX2xpbmtoZHIuY29uc3RhbnRfcGFydCA9IDEyOwkvKiBNQUMgaGVhZGVyIGlzIHBhc3QgNC1ieXRlIHBzZXVkby1oZWFkZXIsIHByZWFtYmxlLCBhbmQgU0ZEICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBjc3RhdGUtPm9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgKyAxMjsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBjc3RhdGUtPm9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgKyAxNDsJLyogcHNldWRvLWhlYWRlcitwcmVhbWJsZStTRkQrRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAqLworCQljc3RhdGUtPm9mZl9ubCA9IDA7CQkvKiBFdGhlcm5ldCBJSSAqLworCQljc3RhdGUtPm9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMys4MDIuMiAqLwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0xNTAxLDMwICsxNTg3LDMxIEBACiAJCSAqIEZvciB2YWx1ZXMgaW4gdGhlIHJhbmdlIGluIHdoaWNoIHdlJ3ZlIGFzc2lnbmVkIG5ldwogCQkgKiBETFRfIHZhbHVlcywgb25seSByYXcgImxpbmtbTjpNXSIgZmlsdGVyaW5nIGlzIHN1cHBvcnRlZC4KIAkJICovCi0JCWlmIChsaW5rdHlwZSA+PSBETFRfTUFUQ0hJTkdfTUlOICYmCi0JCSAgICBsaW5rdHlwZSA8PSBETFRfTUFUQ0hJTkdfTUFYKSB7Ci0JCQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IC0xOwotCQkJb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gLTE7Ci0JCQlvZmZfbmwgPSAtMTsKLQkJCW9mZl9ubF9ub3NuYXAgPSAtMTsKKwkJaWYgKGNzdGF0ZS0+bGlua3R5cGUgPj0gRExUX01BVENISU5HX01JTiAmJgorCQkgICAgY3N0YXRlLT5saW5rdHlwZSA8PSBETFRfTUFUQ0hJTkdfTUFYKSB7CisJCQljc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID0gT0ZGU0VUX05PVF9TRVQ7CisJCQljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IE9GRlNFVF9OT1RfU0VUOworCQkJY3N0YXRlLT5vZmZfbmwgPSAtMTsKKwkJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IC0xOwogCQl9IGVsc2UgewotCQkJYnBmX2Vycm9yKCJ1bmtub3duIGRhdGEgbGluayB0eXBlICVkIiwgbGlua3R5cGUpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gZGF0YSBsaW5rIHR5cGUgJWQiLCBjc3RhdGUtPmxpbmt0eXBlKTsKIAkJfQogCQlicmVhazsKIAl9CiAKLQlvZmZfb3V0ZXJtb3N0bGlua2hkciA9IG9mZl9wcmV2bGlua2hkciA9IG9mZl9saW5raGRyOworCWNzdGF0ZS0+b2ZmX291dGVybW9zdGxpbmtoZHIgPSBjc3RhdGUtPm9mZl9wcmV2bGlua2hkciA9IGNzdGF0ZS0+b2ZmX2xpbmtoZHI7CiB9CiAKIC8qCiAgKiBMb2FkIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBhYnNvbHV0ZSBvZmZzZXQuCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgotZ2VuX2xvYWRfYWJzb2Zmc2V0cmVsKGJwZl9hYnNfb2Zmc2V0ICphYnNfb2Zmc2V0LCB1X2ludCBvZmZzZXQsIHVfaW50IHNpemUpCitnZW5fbG9hZF9hYnNvZmZzZXRyZWwoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBicGZfYWJzX29mZnNldCAqYWJzX29mZnNldCwKKyAgICB1X2ludCBvZmZzZXQsIHVfaW50IHNpemUpCiB7CiAJc3RydWN0IHNsaXN0ICpzLCAqczI7CiAKLQlzID0gZ2VuX2Fic19vZmZzZXRfdmFycGFydChhYnNfb2Zmc2V0KTsKKwlzID0gZ2VuX2Fic19vZmZzZXRfdmFycGFydChjc3RhdGUsIGFic19vZmZzZXQpOwogCiAJLyoKIAkgKiBJZiAicyIgaXMgbm9uLW51bGwsIGl0IGhhcyBjb2RlIHRvIGFycmFuZ2UgdGhhdCB0aGUgWCByZWdpc3RlcgpAQCAtMTU0MSw3ICsxNjI4LDcgQEAKIAkJICogdmFyaWFibGUgcGFydCBvZiB0aGUgYWJzb2x1dGUgb2Zmc2V0IGludG8gdGhlIFggcmVnaXN0ZXIuCiAJCSAqIERvIGFuIGluZGlyZWN0IGxvYWQsIHRvIHVzZSB0aGUgWCByZWdpc3RlciBhcyBhbiBvZmZzZXQuCiAJCSAqLwotCQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfHNpemUpOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9JTkR8c2l6ZSk7CiAJCXMyLT5zLmsgPSBhYnNfb2Zmc2V0LT5jb25zdGFudF9wYXJ0ICsgb2Zmc2V0OwogCQlzYXBwZW5kKHMsIHMyKTsKIAl9IGVsc2UgewpAQCAtMTU0OSw3ICsxNjM2LDcgQEAKIAkJICogVGhlcmUgaXMgbm8gdmFyaWFibGUgcGFydCBvZiB0aGUgYWJzb2x1dGUgb2Zmc2V0LCBzbwogCQkgKiBqdXN0IGRvIGFuIGFic29sdXRlIGxvYWQuCiAJCSAqLwotCQlzID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9BQlN8c2l6ZSk7CisJCXMgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfQUJTfHNpemUpOwogCQlzLT5zLmsgPSBhYnNfb2Zmc2V0LT5jb25zdGFudF9wYXJ0ICsgb2Zmc2V0OwogCX0KIAlyZXR1cm4gczsKQEAgLTE1NTksNDUgKzE2NDYsNDQgQEAKICAqIExvYWQgYSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzcGVjaWZpZWQgaGVhZGVyLgogICovCiBzdGF0aWMgc3RydWN0IHNsaXN0ICoKLWdlbl9sb2FkX2Eob2ZmcmVsLCBvZmZzZXQsIHNpemUpCi0JZW51bSBlX29mZnJlbCBvZmZyZWw7Ci0JdV9pbnQgb2Zmc2V0LCBzaXplOworZ2VuX2xvYWRfYShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGVudW0gZV9vZmZyZWwgb2ZmcmVsLCB1X2ludCBvZmZzZXQsCisgICAgdV9pbnQgc2l6ZSkKIHsKIAlzdHJ1Y3Qgc2xpc3QgKnMsICpzMjsKIAogCXN3aXRjaCAob2ZmcmVsKSB7CiAKIAljYXNlIE9SX1BBQ0tFVDoKLSAgICAgICAgICAgICAgICBzID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9BQlN8c2l6ZSk7CisgICAgICAgICAgICAgICAgcyA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9BQlN8c2l6ZSk7CiAgICAgICAgICAgICAgICAgcy0+cy5rID0gb2Zmc2V0OwogCQlicmVhazsKIAogCWNhc2UgT1JfTElOS0hEUjoKLQkJcyA9IGdlbl9sb2FkX2Fic29mZnNldHJlbCgmb2ZmX2xpbmtoZHIsIG9mZnNldCwgc2l6ZSk7CisJCXMgPSBnZW5fbG9hZF9hYnNvZmZzZXRyZWwoY3N0YXRlLCAmY3N0YXRlLT5vZmZfbGlua2hkciwgb2Zmc2V0LCBzaXplKTsKIAkJYnJlYWs7CiAKIAljYXNlIE9SX1BSRVZMSU5LSERSOgotCQlzID0gZ2VuX2xvYWRfYWJzb2Zmc2V0cmVsKCZvZmZfcHJldmxpbmtoZHIsIG9mZnNldCwgc2l6ZSk7CisJCXMgPSBnZW5fbG9hZF9hYnNvZmZzZXRyZWwoY3N0YXRlLCAmY3N0YXRlLT5vZmZfcHJldmxpbmtoZHIsIG9mZnNldCwgc2l6ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBPUl9MTEM6Ci0JCXMgPSBnZW5fbG9hZF9hYnNvZmZzZXRyZWwoJm9mZl9saW5rcGwsIG9mZnNldCwgc2l6ZSk7CisJCXMgPSBnZW5fbG9hZF9hYnNvZmZzZXRyZWwoY3N0YXRlLCAmY3N0YXRlLT5vZmZfbGlua3BsLCBvZmZzZXQsIHNpemUpOwogCQlicmVhazsKIAogCWNhc2UgT1JfUFJFVk1QTFNIRFI6Ci0JCXMgPSBnZW5fbG9hZF9hYnNvZmZzZXRyZWwoJm9mZl9saW5rcGwsIG9mZl9ubCAtIDQgKyBvZmZzZXQsIHNpemUpOworCQlzID0gZ2VuX2xvYWRfYWJzb2Zmc2V0cmVsKGNzdGF0ZSwgJmNzdGF0ZS0+b2ZmX2xpbmtwbCwgY3N0YXRlLT5vZmZfbmwgLSA0ICsgb2Zmc2V0LCBzaXplKTsKIAkJYnJlYWs7CiAKIAljYXNlIE9SX0xJTktQTDoKLQkJcyA9IGdlbl9sb2FkX2Fic29mZnNldHJlbCgmb2ZmX2xpbmtwbCwgb2ZmX25sICsgb2Zmc2V0LCBzaXplKTsKKwkJcyA9IGdlbl9sb2FkX2Fic29mZnNldHJlbChjc3RhdGUsICZjc3RhdGUtPm9mZl9saW5rcGwsIGNzdGF0ZS0+b2ZmX25sICsgb2Zmc2V0LCBzaXplKTsKIAkJYnJlYWs7CiAKIAljYXNlIE9SX0xJTktQTF9OT1NOQVA6Ci0JCXMgPSBnZW5fbG9hZF9hYnNvZmZzZXRyZWwoJm9mZl9saW5rcGwsIG9mZl9ubF9ub3NuYXAgKyBvZmZzZXQsIHNpemUpOworCQlzID0gZ2VuX2xvYWRfYWJzb2Zmc2V0cmVsKGNzdGF0ZSwgJmNzdGF0ZS0+b2ZmX2xpbmtwbCwgY3N0YXRlLT5vZmZfbmxfbm9zbmFwICsgb2Zmc2V0LCBzaXplKTsKIAkJYnJlYWs7CiAKIAljYXNlIE9SX0xJTktUWVBFOgotCQlzID0gZ2VuX2xvYWRfYWJzb2Zmc2V0cmVsKCZvZmZfbGlua3R5cGUsIG9mZnNldCwgc2l6ZSk7CisJCXMgPSBnZW5fbG9hZF9hYnNvZmZzZXRyZWwoY3N0YXRlLCAmY3N0YXRlLT5vZmZfbGlua3R5cGUsIG9mZnNldCwgc2l6ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBPUl9UUkFOX0lQVjQ6CkBAIC0xNjA3LDcgKzE2OTMsNyBAQAogCQkgKiBwcmVjZWRlZCBieSBhIHZhcmlhYmxlLWxlbmd0aCBoZWFkZXIgc3VjaCBhcyBhIHJhZGlvCiAJCSAqIGhlYWRlciksIGluIGJ5dGVzLgogCQkgKi8KLQkJcyA9IGdlbl9sb2FkeF9pcGhkcmxlbigpOworCQlzID0gZ2VuX2xvYWR4X2lwaGRybGVuKGNzdGF0ZSk7CiAKIAkJLyoKIAkJICogTG9hZCB0aGUgaXRlbSBhdCB7b2Zmc2V0IG9mIHRoZSBsaW5rLWxheWVyIHBheWxvYWR9ICsKQEAgLTE2MjAsMTMgKzE3MDYsMTMgQEAKIAkJICogdmFsdWUgaW4gdGhlIFggcmVnaXN0ZXIsIGFuZCB3ZSBpbmNsdWRlIHRoZSBjb25zdGFudAogCQkgKiBwYXJ0IGluIHRoZSBvZmZzZXQgb2YgdGhlIGxvYWQuCiAJCSAqLwotCQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfHNpemUpOwotCQlzMi0+cy5rID0gb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgb2ZmX25sICsgb2Zmc2V0OworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9JTkR8c2l6ZSk7CisJCXMyLT5zLmsgPSBjc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCArIGNzdGF0ZS0+b2ZmX25sICsgb2Zmc2V0OwogCQlzYXBwZW5kKHMsIHMyKTsKIAkJYnJlYWs7CiAKIAljYXNlIE9SX1RSQU5fSVBWNjoKLQkJcyA9IGdlbl9sb2FkX2Fic29mZnNldHJlbCgmb2ZmX2xpbmtwbCwgb2ZmX25sICsgNDAgKyBvZmZzZXQsIHNpemUpOworCQlzID0gZ2VuX2xvYWRfYWJzb2Zmc2V0cmVsKGNzdGF0ZSwgJmNzdGF0ZS0+b2ZmX2xpbmtwbCwgY3N0YXRlLT5vZmZfbmwgKyA0MCArIG9mZnNldCwgc2l6ZSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTE2NDIsMTEgKzE3MjgsMTEgQEAKICAqIHBheWxvYWQuCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgotZ2VuX2xvYWR4X2lwaGRybGVuKCkKK2dlbl9sb2FkeF9pcGhkcmxlbihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJc3RydWN0IHNsaXN0ICpzLCAqczI7CiAKLQlzID0gZ2VuX2Fic19vZmZzZXRfdmFycGFydCgmb2ZmX2xpbmtwbCk7CisJcyA9IGdlbl9hYnNfb2Zmc2V0X3ZhcnBhcnQoY3N0YXRlLCAmY3N0YXRlLT5vZmZfbGlua3BsKTsKIAlpZiAocyAhPSBOVUxMKSB7CiAJCS8qCiAJCSAqIFRoZSBvZmZzZXQgb2YgdGhlIGxpbmstbGF5ZXIgcGF5bG9hZCBoYXMgYSB2YXJpYWJsZQpAQCAtMTY1OCwxMyArMTc0NCwxMyBAQAogCQkgKiB2YWx1ZSBpbiBxdWVzdGlvbiBpbnRvIHRoZSBBIHJlZ2lzdGVyIGFuZCBhZGQgdG8gaXQKIAkJICogdGhlIHZhbHVlIGZyb20gdGhlIFggcmVnaXN0ZXIuCiAJCSAqLwotCQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfEJQRl9CKTsKLQkJczItPnMuayA9IG9mZl9saW5rcGwuY29uc3RhbnRfcGFydCArIG9mZl9ubDsKKwkJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfSU5EfEJQRl9CKTsKKwkJczItPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgY3N0YXRlLT5vZmZfbmw7CiAJCXNhcHBlbmQocywgczIpOwotCQlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FORHxCUEZfSyk7CisJCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfQUxVfEJQRl9BTkR8QlBGX0spOwogCQlzMi0+cy5rID0gMHhmOwogCQlzYXBwZW5kKHMsIHMyKTsKLQkJczIgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9MU0h8QlBGX0spOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfTFNIfEJQRl9LKTsKIAkJczItPnMuayA9IDI7CiAJCXNhcHBlbmQocywgczIpOwogCkBAIC0xNjc0LDggKzE3NjAsOCBAQAogCQkgKiB0aGUgbGluay1sYXllciBwYXlsb2FkLCB3aGljaCBpcyBzdGlsbCBpbiB0aGUgWAogCQkgKiByZWdpc3RlciwgYW5kIG1vdmUgdGhlIHJlc3VsdCBpbnRvIHRoZSBYIHJlZ2lzdGVyLgogCQkgKi8KLQkJc2FwcGVuZChzLCBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX1gpKTsKLQkJc2FwcGVuZChzLCBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKSk7CisJCXNhcHBlbmQocywgbmV3X3N0bXQoY3N0YXRlLCBCUEZfQUxVfEJQRl9BRER8QlBGX1gpKTsKKwkJc2FwcGVuZChzLCBuZXdfc3RtdChjc3RhdGUsIEJQRl9NSVNDfEJQRl9UQVgpKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBUaGUgb2Zmc2V0IG9mIHRoZSBsaW5rLWxheWVyIHBheWxvYWQgaXMgYSBjb25zdGFudCwKQEAgLTE2ODQsNDIgKzE3NzAsNDEgQEAKIAkJICoKIAkJICogVGhpcyBtZWFucyB3ZSBjYW4gdXNlIHRoZSA0Kihba10mMHhmKSBhZGRyZXNzaW5nCiAJCSAqIG1vZGUuICBMb2FkIHRoZSBsZW5ndGggb2YgdGhlIElQdjQgaGVhZGVyLCB3aGljaAotCQkgKiBpcyBhdCBhbiBvZmZzZXQgb2Ygb2ZmX25sIGZyb20gdGhlIGJlZ2lubmluZyBvZgorCQkgKiBpcyBhdCBhbiBvZmZzZXQgb2YgY3N0YXRlLT5vZmZfbmwgZnJvbSB0aGUgYmVnaW5uaW5nIG9mCiAJCSAqIHRoZSBsaW5rLWxheWVyIHBheWxvYWQsIGFuZCB0aHVzIGF0IGFuIG9mZnNldCBvZgotCQkgKiBvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBvZmZfbmwgZnJvbSB0aGUgYmVnaW5uaW5nCisJCSAqIGNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgY3N0YXRlLT5vZmZfbmwgZnJvbSB0aGUgYmVnaW5uaW5nCiAJCSAqIG9mIHRoZSByYXcgcGFja2V0IGRhdGEsIHVzaW5nIHRoYXQgYWRkcmVzc2luZyBtb2RlLgogCQkgKi8KLQkJcyA9IG5ld19zdG10KEJQRl9MRFh8QlBGX01TSHxCUEZfQik7Ci0JCXMtPnMuayA9IG9mZl9saW5rcGwuY29uc3RhbnRfcGFydCArIG9mZl9ubDsKKwkJcyA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEWHxCUEZfTVNIfEJQRl9CKTsKKwkJcy0+cy5rID0gY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBjc3RhdGUtPm9mZl9ubDsKIAl9CiAJcmV0dXJuIHM7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3VuY29uZChyc2Vuc2UpCi0JaW50IHJzZW5zZTsKK2dlbl91bmNvbmQoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgcnNlbnNlKQogewogCXN0cnVjdCBibG9jayAqYjsKIAlzdHJ1Y3Qgc2xpc3QgKnM7CiAKLQlzID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTU0pOworCXMgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfSU1NKTsKIAlzLT5zLmsgPSAhcnNlbnNlOwotCWIgPSBuZXdfYmxvY2soSk1QKEJQRl9KRVEpKTsKKwliID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KRVEpKTsKIAliLT5zdG10cyA9IHM7CiAKIAlyZXR1cm4gYjsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3RydWUoKQorZ2VuX3RydWUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlKQogewotCXJldHVybiBnZW5fdW5jb25kKDEpOworCXJldHVybiBnZW5fdW5jb25kKGNzdGF0ZSwgMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGJsb2NrICoKLWdlbl9mYWxzZSgpCitnZW5fZmFsc2UoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlKQogewotCXJldHVybiBnZW5fdW5jb25kKDApOworCXJldHVybiBnZW5fdW5jb25kKGNzdGF0ZSwgMCk7CiB9CiAKIC8qCkBAIC0xNzQwLDggKzE4MjUsNyBAQAogICogdGhlIGFwcHJvcHJpYXRlIHRlc3QuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2V0aGVyX2xpbmt0eXBlKHByb3RvKQotCXJlZ2lzdGVyIGludCBwcm90bzsKK2dlbl9ldGhlcl9saW5rdHlwZShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBwcm90bykKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CiAKQEAgLTE3NjIsOSArMTg0Niw5IEBACiAJCSAqIERTQVAsIGFzIHdlIGRvIGZvciBvdGhlciB0eXBlcyA8PSBFVEhFUk1UVQogCQkgKiAoaS5lLiwgb3RoZXIgU0FQIHZhbHVlcyk/CiAJCSAqLwotCQliMCA9IGdlbl9jbXBfZ3QoT1JfTElOS1RZUEUsIDAsIEJQRl9ILCBFVEhFUk1UVSk7CisJCWIwID0gZ2VuX2NtcF9ndChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgRVRIRVJNVFUpOwogCQlnZW5fbm90KGIwKTsKLQkJYjEgPSBnZW5fY21wKE9SX0xMQywgMCwgQlBGX0gsIChicGZfaW50MzIpCisJCWIxID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xMQywgMCwgQlBGX0gsIChicGZfaW50MzIpCiAJCQkgICAgICgocHJvdG8gPDwgOCkgfCBwcm90bykpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKQEAgLTE4MDIsMjIgKzE4ODYsMjIgQEAKIAkJICogVGhpcyBnZW5lcmF0ZXMgY29kZSB0byBjaGVjayBib3RoIGZvciB0aGUKIAkJICogSVBYIExTQVAgKEV0aGVybmV0XzgwMi4yKSBhbmQgZm9yIEV0aGVybmV0XzgwMi4zLgogCQkgKi8KLQkJYjAgPSBnZW5fY21wKE9SX0xMQywgMCwgQlBGX0IsIChicGZfaW50MzIpTExDU0FQX0lQWCk7Ci0JCWIxID0gZ2VuX2NtcChPUl9MTEMsIDAsIEJQRl9ILCAoYnBmX2ludDMyKTB4RkZGRik7CisJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xMQywgMCwgQlBGX0IsIChicGZfaW50MzIpTExDU0FQX0lQWCk7CisJCWIxID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xMQywgMCwgQlBGX0gsIChicGZfaW50MzIpMHhGRkZGKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAKIAkJLyoKIAkJICogTm93IHdlIGFkZCBjb2RlIHRvIGNoZWNrIGZvciBTTkFQIGZyYW1lcyB3aXRoCiAJCSAqIEVUSEVSVFlQRV9JUFgsIGkuZS4gRXRoZXJuZXRfU05BUC4KIAkJICovCi0JCWIwID0gZ2VuX3NuYXAoMHgwMDAwMDAsIEVUSEVSVFlQRV9JUFgpOworCQliMCA9IGdlbl9zbmFwKGNzdGF0ZSwgMHgwMDAwMDAsIEVUSEVSVFlQRV9JUFgpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAogCQkvKgogCQkgKiBOb3cgd2UgZ2VuZXJhdGUgY29kZSB0byBjaGVjayBmb3IgODAyLjMKIAkJICogZnJhbWVzIGluIGdlbmVyYWwuCiAJCSAqLwotCQliMCA9IGdlbl9jbXBfZ3QoT1JfTElOS1RZUEUsIDAsIEJQRl9ILCBFVEhFUk1UVSk7CisJCWIwID0gZ2VuX2NtcF9ndChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgRVRIRVJNVFUpOwogCQlnZW5fbm90KGIwKTsKIAogCQkvKgpAQCAtMTgzMyw3ICsxOTE3LDcgQEAKIAkJICogZG8gdGhhdCBiZWZvcmUgY2hlY2tpbmcgZm9yIHRoZSBvdGhlciBmcmFtZQogCQkgKiB0eXBlcy4KIAkJICovCi0JCWIwID0gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIChicGZfaW50MzIpRVRIRVJUWVBFX0lQWCk7CisJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgKGJwZl9pbnQzMilFVEhFUlRZUEVfSVBYKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIApAQCAtMTg0OSw3ICsxOTMzLDcgQEAKIAkJICogd2UgY2hlY2sgZm9yIGFuIEV0aGVybmV0IHR5cGUgZmllbGQgbGVzcyB0aGFuCiAJCSAqIDE1MDAsIHdoaWNoIG1lYW5zIGl0J3MgYW4gODAyLjMgbGVuZ3RoIGZpZWxkLgogCQkgKi8KLQkJYjAgPSBnZW5fY21wX2d0KE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgRVRIRVJNVFUpOworCQliMCA9IGdlbl9jbXBfZ3QoY3N0YXRlLCBPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIEVUSEVSTVRVKTsKIAkJZ2VuX25vdChiMCk7CiAKIAkJLyoKQEAgLTE4NjQsOSArMTk0OCw5IEBACiAJCSAqIHR5cGUgb2YgRVRIRVJUWVBFX0FBUlAgKEFwcGxldGFsayBBUlApLgogCQkgKi8KIAkJaWYgKHByb3RvID09IEVUSEVSVFlQRV9BVEFMSykKLQkJCWIxID0gZ2VuX3NuYXAoMHgwODAwMDcsIEVUSEVSVFlQRV9BVEFMSyk7CisJCQliMSA9IGdlbl9zbmFwKGNzdGF0ZSwgMHgwODAwMDcsIEVUSEVSVFlQRV9BVEFMSyk7CiAJCWVsc2UJLyogcHJvdG8gPT0gRVRIRVJUWVBFX0FBUlAgKi8KLQkJCWIxID0gZ2VuX3NuYXAoMHgwMDAwMDAsIEVUSEVSVFlQRV9BQVJQKTsKKwkJCWIxID0gZ2VuX3NuYXAoY3N0YXRlLCAweDAwMDAwMCwgRVRIRVJUWVBFX0FBUlApOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAKIAkJLyoKQEAgLTE4NzQsNyArMTk1OCw3IEBACiAJCSAqIHBoYXNlIDE/KTsgd2UganVzdCBjaGVjayBmb3IgdGhlIEV0aGVybmV0CiAJCSAqIHByb3RvY29sIHR5cGUuCiAJCSAqLwotCQliMCA9IGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9ILCAoYnBmX2ludDMyKXByb3RvKTsKKwkJYjAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1RZUEUsIDAsIEJQRl9ILCAoYnBmX2ludDMyKXByb3RvKTsKIAogCQlnZW5fb3IoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwpAQCAtMTg4OSw5ICsxOTczLDkgQEAKIAkJCSAqIGEgbGVuZ3RoIGZpZWxkLCA8PSBFVEhFUk1UVSkgYW5kCiAJCQkgKiB0aGVuIGNoZWNrIHRoZSBEU0FQLgogCQkJICovCi0JCQliMCA9IGdlbl9jbXBfZ3QoT1JfTElOS1RZUEUsIDAsIEJQRl9ILCBFVEhFUk1UVSk7CisJCQliMCA9IGdlbl9jbXBfZ3QoY3N0YXRlLCBPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIEVUSEVSTVRVKTsKIAkJCWdlbl9ub3QoYjApOwotCQkJYjEgPSBnZW5fY21wKE9SX0xJTktUWVBFLCAyLCBCUEZfQiwgKGJwZl9pbnQzMilwcm90byk7CisJCQliMSA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LVFlQRSwgMiwgQlBGX0IsIChicGZfaW50MzIpcHJvdG8pOwogCQkJZ2VuX2FuZChiMCwgYjEpOwogCQkJcmV0dXJuIGIxOwogCQl9IGVsc2UgewpAQCAtMTkwNCwyOCArMTk4OCw2MiBAQAogCQkJICogd2lsbCBmYWlsIGFuZCB0aGUgZnJhbWUgd29uJ3QgbWF0Y2gsCiAJCQkgKiB3aGljaCBpcyB3aGF0IHdlIHdhbnQpLgogCQkJICovCi0JCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0gsCisJCQlyZXR1cm4gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwKIAkJCSAgICAoYnBmX2ludDMyKXByb3RvKTsKIAkJfQogCX0KIH0KIAorc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5fbG9vcGJhY2tfbGlua3R5cGUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgcHJvdG8pCit7CisJLyoKKwkgKiBGb3IgRExUX05VTEwsIHRoZSBsaW5rLWxheWVyIGhlYWRlciBpcyBhIDMyLWJpdCB3b3JkCisJICogY29udGFpbmluZyBhbiBBRl8gdmFsdWUgaW4gKmhvc3QqIGJ5dGUgb3JkZXIsIGFuZCBmb3IKKwkgKiBETFRfRU5DLCB0aGUgbGluay1sYXllciBoZWFkZXIgYmVnaW5zIHdpdGggYSAzMi1iaXQKKwkgKiB3b3JkIGNvbnRhaW5pbmcgYW4gQUZfIHZhbHVlIGluIGhvc3QgYnl0ZSBvcmRlci4KKwkgKgorCSAqIEluIGFkZGl0aW9uLCBpZiB3ZSdyZSByZWFkaW5nIGEgc2F2ZWQgY2FwdHVyZSBmaWxlLAorCSAqIHRoZSBob3N0IGJ5dGUgb3JkZXIgaW4gdGhlIGNhcHR1cmUgbWF5IG5vdCBiZSB0aGUKKwkgKiBzYW1lIGFzIHRoZSBob3N0IGJ5dGUgb3JkZXIgb24gdGhpcyBtYWNoaW5lLgorCSAqCisJICogRm9yIERMVF9MT09QLCB0aGUgbGluay1sYXllciBoZWFkZXIgaXMgYSAzMi1iaXQKKwkgKiB3b3JkIGNvbnRhaW5pbmcgYW4gQUZfIHZhbHVlIGluICpuZXR3b3JrKiBieXRlIG9yZGVyLgorCSAqLworCWlmIChjc3RhdGUtPmxpbmt0eXBlID09IERMVF9OVUxMIHx8IGNzdGF0ZS0+bGlua3R5cGUgPT0gRExUX0VOQykgeworCQkvKgorCQkgKiBUaGUgQUZfIHZhbHVlIGlzIGluIGhvc3QgYnl0ZSBvcmRlciwgYnV0IHRoZSBCUEYKKwkJICogaW50ZXJwcmV0ZXIgd2lsbCBjb252ZXJ0IGl0IHRvIG5ldHdvcmsgYnl0ZSBvcmRlci4KKwkJICoKKwkJICogSWYgdGhpcyBpcyBhIHNhdmUgZmlsZSwgYW5kIGl0J3MgZnJvbSBhIG1hY2hpbmUKKwkJICogd2l0aCB0aGUgb3Bwb3NpdGUgYnl0ZSBvcmRlciB0byBvdXJzLCB3ZSBieXRlLXN3YXAKKwkJICogdGhlIEFGXyB2YWx1ZS4KKwkJICoKKwkJICogVGhlbiB3ZSBydW4gaXQgdGhyb3VnaCAiaHRvbmwoKSIsIGFuZCBnZW5lcmF0ZQorCQkgKiBjb2RlIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcmVzdWx0LgorCQkgKi8KKwkJaWYgKGNzdGF0ZS0+YnBmX3BjYXAtPnJmaWxlICE9IE5VTEwgJiYgY3N0YXRlLT5icGZfcGNhcC0+c3dhcHBlZCkKKwkJCXByb3RvID0gU1dBUExPTkcocHJvdG8pOworCQlwcm90byA9IGh0b25sKHByb3RvKTsKKwl9CisJcmV0dXJuIChnZW5fY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX1csIChicGZfaW50MzIpcHJvdG8pKTsKK30KKwogLyoKICAqICJwcm90byIgaXMgYW4gRXRoZXJuZXQgdHlwZSB2YWx1ZSBhbmQgZm9yIElQTkVULCBpZiBpdCBpcyBub3QgSVB2NAogICogb3IgSVB2NiB0aGVuIHdlIGhhdmUgYW4gZXJyb3IuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2lwbmV0X2xpbmt0eXBlKHByb3RvKQotCXJlZ2lzdGVyIGludCBwcm90bzsKK2dlbl9pcG5ldF9saW5rdHlwZShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBwcm90bykKIHsKIAlzd2l0Y2ggKHByb3RvKSB7CiAKIAljYXNlIEVUSEVSVFlQRV9JUDoKLQkJcmV0dXJuIGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9CLCAoYnBmX2ludDMyKUlQSF9BRl9JTkVUKTsKKwkJcmV0dXJuIGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LVFlQRSwgMCwgQlBGX0IsIChicGZfaW50MzIpSVBIX0FGX0lORVQpOwogCQkvKiBOT1RSRUFDSEVEICovCiAKIAljYXNlIEVUSEVSVFlQRV9JUFY2OgotCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0IsCisJCXJldHVybiBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1RZUEUsIDAsIEJQRl9CLAogCQkgICAgKGJwZl9pbnQzMilJUEhfQUZfSU5FVDYpOwogCQkvKiBOT1RSRUFDSEVEICovCiAKQEAgLTE5MzMsNyArMjA1MSw3IEBACiAJCWJyZWFrOwogCX0KIAotCXJldHVybiBnZW5fZmFsc2UoKTsKKwlyZXR1cm4gZ2VuX2ZhbHNlKGNzdGF0ZSk7CiB9CiAKIC8qCkBAIC0xOTQ1LDggKzIwNjMsNyBAQAogICogTElOVVhfU0xMX1BfODAyXzIgdmFsdWUgYW5kIHRoZW4gZG8gdGhlIGFwcHJvcHJpYXRlIHRlc3QuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2xpbnV4X3NsbF9saW5rdHlwZShwcm90bykKLQlyZWdpc3RlciBpbnQgcHJvdG87CitnZW5fbGludXhfc2xsX2xpbmt0eXBlKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHByb3RvKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMTsKIApAQCAtMTk2Nyw4ICsyMDg0LDggQEAKIAkJICogRFNBUCwgYXMgd2UgZG8gZm9yIG90aGVyIHR5cGVzIDw9IEVUSEVSTVRVCiAJCSAqIChpLmUuLCBvdGhlciBTQVAgdmFsdWVzKT8KIAkJICovCi0JCWIwID0gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIExJTlVYX1NMTF9QXzgwMl8yKTsKLQkJYjEgPSBnZW5fY21wKE9SX0xMQywgMCwgQlBGX0gsIChicGZfaW50MzIpCisJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgTElOVVhfU0xMX1BfODAyXzIpOworCQliMSA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MTEMsIDAsIEJQRl9ILCAoYnBmX2ludDMyKQogCQkJICAgICAoKHByb3RvIDw8IDgpIHwgcHJvdG8pKTsKIAkJZ2VuX2FuZChiMCwgYjEpOwogCQlyZXR1cm4gYjE7CkBAIC0xOTk5LDE3ICsyMTE2LDE3IEBACiAJCSAqIHRoZW4gcHV0IGEgY2hlY2sgZm9yIExJTlVYX1NMTF9QXzgwMl8yIGZyYW1lcwogCQkgKiBiZWZvcmUgaXQuCiAJCSAqLwotCQliMCA9IGdlbl9jbXAoT1JfTExDLCAwLCBCUEZfQiwgKGJwZl9pbnQzMilMTENTQVBfSVBYKTsKLQkJYjEgPSBnZW5fc25hcCgweDAwMDAwMCwgRVRIRVJUWVBFX0lQWCk7CisJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xMQywgMCwgQlBGX0IsIChicGZfaW50MzIpTExDU0FQX0lQWCk7CisJCWIxID0gZ2VuX3NuYXAoY3N0YXRlLCAweDAwMDAwMCwgRVRIRVJUWVBFX0lQWCk7CiAJCWdlbl9vcihiMCwgYjEpOwotCQliMCA9IGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9ILCBMSU5VWF9TTExfUF84MDJfMik7CisJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgTElOVVhfU0xMX1BfODAyXzIpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAKIAkJLyoKIAkJICogTm93IGNoZWNrIGZvciA4MDIuMyBmcmFtZXMgYW5kIE9SIHRoYXQgd2l0aAogCQkgKiB0aGUgcHJldmlvdXMgdGVzdC4KIAkJICovCi0JCWIwID0gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIExJTlVYX1NMTF9QXzgwMl8zKTsKKwkJYjAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1RZUEUsIDAsIEJQRl9ILCBMSU5VWF9TTExfUF84MDJfMyk7CiAJCWdlbl9vcihiMCwgYjEpOwogCiAJCS8qCkBAIC0yMDE3LDcgKzIxMzQsNyBAQAogCQkgKiBkbyB0aGF0IGJlZm9yZSBjaGVja2luZyBmb3IgdGhlIG90aGVyIGZyYW1lCiAJCSAqIHR5cGVzLgogCQkgKi8KLQkJYjAgPSBnZW5fY21wKE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgKGJwZl9pbnQzMilFVEhFUlRZUEVfSVBYKTsKKwkJYjAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1RZUEUsIDAsIEJQRl9ILCAoYnBmX2ludDMyKUVUSEVSVFlQRV9JUFgpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCkBAIC0yMDMzLDcgKzIxNTAsNyBAQAogCQkgKiB3ZSBjaGVjayBmb3IgdGhlIDgwMi4yIHByb3RvY29sIHR5cGUgaW4gdGhlCiAJCSAqICJFdGhlcm5ldCB0eXBlIiBmaWVsZC4KIAkJICovCi0JCWIwID0gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIExJTlVYX1NMTF9QXzgwMl8yKTsKKwkJYjAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1RZUEUsIDAsIEJQRl9ILCBMSU5VWF9TTExfUF84MDJfMik7CiAKIAkJLyoKIAkJICogODAyLjItZW5jYXBzdWxhdGVkIEVUSEVSVFlQRV9BVEFMSyBwYWNrZXRzIGFyZQpAQCAtMjA0Nyw5ICsyMTY0LDkgQEAKIAkJICogdHlwZSBvZiBFVEhFUlRZUEVfQUFSUCAoQXBwbGV0YWxrIEFSUCkuCiAJCSAqLwogCQlpZiAocHJvdG8gPT0gRVRIRVJUWVBFX0FUQUxLKQotCQkJYjEgPSBnZW5fc25hcCgweDA4MDAwNywgRVRIRVJUWVBFX0FUQUxLKTsKKwkJCWIxID0gZ2VuX3NuYXAoY3N0YXRlLCAweDA4MDAwNywgRVRIRVJUWVBFX0FUQUxLKTsKIAkJZWxzZQkvKiBwcm90byA9PSBFVEhFUlRZUEVfQUFSUCAqLwotCQkJYjEgPSBnZW5fc25hcCgweDAwMDAwMCwgRVRIRVJUWVBFX0FBUlApOworCQkJYjEgPSBnZW5fc25hcChjc3RhdGUsIDB4MDAwMDAwLCBFVEhFUlRZUEVfQUFSUCk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAogCQkvKgpAQCAtMjA1Nyw3ICsyMTc0LDcgQEAKIAkJICogcGhhc2UgMT8pOyB3ZSBqdXN0IGNoZWNrIGZvciB0aGUgRXRoZXJuZXQKIAkJICogcHJvdG9jb2wgdHlwZS4KIAkJICovCi0JCWIwID0gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOworCQliMCA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOwogCiAJCWdlbl9vcihiMCwgYjEpOwogCQlyZXR1cm4gYjE7CkBAIC0yMDcxLDggKzIxODgsOCBAQAogCQkJICogaW4gdGhlICJFdGhlcm5ldCB0eXBlIiBmaWVsZCwgYW5kCiAJCQkgKiB0aGVuIGNoZWNrIHRoZSBEU0FQLgogCQkJICovCi0JCQliMCA9IGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9ILCBMSU5VWF9TTExfUF84MDJfMik7Ci0JCQliMSA9IGdlbl9jbXAoT1JfTElOS0hEUiwgb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0LCBCUEZfQiwKKwkJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgTElOVVhfU0xMX1BfODAyXzIpOworCQkJYjEgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQsIEJQRl9CLAogCQkJICAgICAoYnBmX2ludDMyKXByb3RvKTsKIAkJCWdlbl9hbmQoYjAsIGIxKTsKIAkJCXJldHVybiBiMTsKQEAgLTIwODYsMTMgKzIyMDMsMTMgQEAKIAkJCSAqIHdpbGwgZmFpbCBhbmQgdGhlIGZyYW1lIHdvbid0IG1hdGNoLAogCQkJICogd2hpY2ggaXMgd2hhdCB3ZSB3YW50KS4KIAkJCSAqLwotCQkJcmV0dXJuIGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9ILCAoYnBmX2ludDMyKXByb3RvKTsKKwkJCXJldHVybiBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1RZUEUsIDAsIEJQRl9ILCAoYnBmX2ludDMyKXByb3RvKTsKIAkJfQogCX0KIH0KIAogc3RhdGljIHN0cnVjdCBzbGlzdCAqCi1nZW5fbG9hZF9wcmlzbV9sbHByZWZpeGxlbigpCitnZW5fbG9hZF9wcmlzbV9sbHByZWZpeGxlbihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJc3RydWN0IHNsaXN0ICpzMSwgKnMyOwogCXN0cnVjdCBzbGlzdCAqc2plcV9hdnNfY29va2llOwpAQCAtMjEwMyw3ICsyMjIwLDcgQEAKIAkgKiB3ZSBhcmUgZ2VuZXJhdGluZyBqbXAgaW5zdHJ1Y3Rpb25zIHdpdGhpbiBhIG5vcm1hbAogCSAqIHNsaXN0IG9mIGluc3RydWN0aW9ucwogCSAqLwotCW5vX29wdGltaXplID0gMTsKKwljc3RhdGUtPm5vX29wdGltaXplID0gMTsKIAogCS8qCiAJICogR2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSBsZW5ndGggb2YgdGhlIHJhZGlvIGhlYWRlciBpbnRvCkBAIC0yMTI0LDI0ICsyMjQxLDI0IEBACiAJICogYnV0IG5vIGtub3duIHNvZnR3YXJlIGdlbmVyYXRlcyBoZWFkZXJzIHRoYXQgYXJlbid0IDE0NAogCSAqIGJ5dGVzIGxvbmcuCiAJICovCi0JaWYgKG9mZl9saW5raGRyLnJlZyAhPSAtMSkgeworCWlmIChjc3RhdGUtPm9mZl9saW5raGRyLnJlZyAhPSAtMSkgewogCQkvKgogCQkgKiBMb2FkIHRoZSBjb29raWUuCiAJCSAqLwotCQlzMSA9IG5ld19zdG10KEJQRl9MRHxCUEZfV3xCUEZfQUJTKTsKKwkJczEgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfV3xCUEZfQUJTKTsKIAkJczEtPnMuayA9IDA7CiAKIAkJLyoKIAkJICogQU5EIGl0IHdpdGggMHhGRkZGRjAwMC4KIAkJICovCi0JCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQU5EfEJQRl9LKTsKKwkJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX0FORHxCUEZfSyk7CiAJCXMyLT5zLmsgPSAweEZGRkZGMDAwOwogCQlzYXBwZW5kKHMxLCBzMik7CiAKIAkJLyoKIAkJICogQ29tcGFyZSB3aXRoIDB4ODAyMTEwMDAuCiAJCSAqLwotCQlzamVxX2F2c19jb29raWUgPSBuZXdfc3RtdChKTVAoQlBGX0pFUSkpOworCQlzamVxX2F2c19jb29raWUgPSBuZXdfc3RtdChjc3RhdGUsIEpNUChCUEZfSkVRKSk7CiAJCXNqZXFfYXZzX2Nvb2tpZS0+cy5rID0gMHg4MDIxMTAwMDsKIAkJc2FwcGVuZChzMSwgc2plcV9hdnNfY29va2llKTsKIApAQCAtMjE1Miw3ICsyMjY5LDcgQEAKIAkJICogdGhlIEFWUyBoZWFkZXIgYXJlIHRoZSBsZW5ndGggb2YgdGhlIEFWUyBoZWFkZXIuCiAJCSAqIFRoYXQgZmllbGQgaXMgYmlnLWVuZGlhbi4KIAkJICovCi0JCXMyID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9XfEJQRl9BQlMpOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9XfEJQRl9BQlMpOwogCQlzMi0+cy5rID0gNDsKIAkJc2FwcGVuZChzMSwgczIpOwogCQlzamVxX2F2c19jb29raWUtPnMuanQgPSBzMjsKQEAgLTIxNjUsNyArMjI4Miw3IEBACiAJCSAqIGl0J3MgYWRkZWQgdG8gdGhlIFBDLCBzbywgYXMgd2UncmUganVtcGluZwogCQkgKiBvdmVyIGEgc2luZ2xlIGluc3RydWN0aW9uLCBpdCBzaG91bGQgYmUgMS4pCiAJCSAqLwotCQlzamNvbW1vbiA9IG5ld19zdG10KEpNUChCUEZfSkEpKTsKKwkJc2pjb21tb24gPSBuZXdfc3RtdChjc3RhdGUsIEpNUChCUEZfSkEpKTsKIAkJc2pjb21tb24tPnMuayA9IDE7CiAJCXNhcHBlbmQoczEsIHNqY29tbW9uKTsKIApAQCAtMjE3NSw3ICsyMjkyLDcgQEAKIAkJICogaW50byB0aGUgQSByZWdpc3Rlci4gIEhhdmUgdGhlIHRlc3QgZm9yIGFuIEFWUwogCQkgKiBoZWFkZXIgYnJhbmNoIGhlcmUgaWYgd2UgZG9uJ3QgaGF2ZSBhbiBBVlMgaGVhZGVyLgogCQkgKi8KLQkJczIgPSBuZXdfc3RtdChCUEZfTER8QlBGX1d8QlBGX0lNTSk7CisJCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX1d8QlBGX0lNTSk7CiAJCXMyLT5zLmsgPSAxNDQ7CiAJCXNhcHBlbmQoczEsIHMyKTsKIAkJc2plcV9hdnNfY29va2llLT5zLmpmID0gczI7CkBAIC0yMTg1LDE1ICsyMzAyLDE1IEBACiAJCSAqIGl0LiAgVGhlIGNvZGUgZm9yIHRoZSBBVlMgaGVhZGVyIHdpbGwganVtcCBoZXJlIGFmdGVyCiAJCSAqIGxvYWRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgQVZTIGhlYWRlci4KIAkJICovCi0JCXMyID0gbmV3X3N0bXQoQlBGX1NUKTsKLQkJczItPnMuayA9IG9mZl9saW5raGRyLnJlZzsKKwkJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9TVCk7CisJCXMyLT5zLmsgPSBjc3RhdGUtPm9mZl9saW5raGRyLnJlZzsKIAkJc2FwcGVuZChzMSwgczIpOwogCQlzamNvbW1vbi0+cy5qZiA9IHMyOwogCiAJCS8qCiAJCSAqIE5vdyBtb3ZlIGl0IGludG8gdGhlIFggcmVnaXN0ZXIuCiAJCSAqLwotCQlzMiA9IG5ld19zdG10KEJQRl9NSVNDfEJQRl9UQVgpOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX01JU0N8QlBGX1RBWCk7CiAJCXNhcHBlbmQoczEsIHMyKTsKIAogCQlyZXR1cm4gKHMxKTsKQEAgLTIyMDIsNyArMjMxOSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgotZ2VuX2xvYWRfYXZzX2xscHJlZml4bGVuKCkKK2dlbl9sb2FkX2F2c19sbHByZWZpeGxlbihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJc3RydWN0IHNsaXN0ICpzMSwgKnMyOwogCkBAIC0yMjEzLDI3ICsyMzMwLDI3IEBACiAJICogZ2VuZXJhdGVkIHVzZXMgdGhhdCBwcmVmaXgsIHNvIHdlIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYW55CiAJICogY29kZSB0byBsb2FkIGl0LikKIAkgKi8KLQlpZiAob2ZmX2xpbmtoZHIucmVnICE9IC0xKSB7CisJaWYgKGNzdGF0ZS0+b2ZmX2xpbmtoZHIucmVnICE9IC0xKSB7CiAJCS8qCiAJCSAqIFRoZSA0IGJ5dGVzIGF0IGFuIG9mZnNldCBvZiA0IGZyb20gdGhlIGJlZ2lubmluZyBvZgogCQkgKiB0aGUgQVZTIGhlYWRlciBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgQVZTIGhlYWRlci4KIAkJICogVGhhdCBmaWVsZCBpcyBiaWctZW5kaWFuLgogCQkgKi8KLQkJczEgPSBuZXdfc3RtdChCUEZfTER8QlBGX1d8QlBGX0FCUyk7CisJCXMxID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX1d8QlBGX0FCUyk7CiAJCXMxLT5zLmsgPSA0OwogCiAJCS8qCiAJCSAqIE5vdyBhbGxvY2F0ZSBhIHJlZ2lzdGVyIHRvIGhvbGQgdGhhdCB2YWx1ZSBhbmQgc3RvcmUKIAkJICogaXQuCiAJCSAqLwotCQlzMiA9IG5ld19zdG10KEJQRl9TVCk7Ci0JCXMyLT5zLmsgPSBvZmZfbGlua2hkci5yZWc7CisJCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfU1QpOworCQlzMi0+cy5rID0gY3N0YXRlLT5vZmZfbGlua2hkci5yZWc7CiAJCXNhcHBlbmQoczEsIHMyKTsKIAogCQkvKgogCQkgKiBOb3cgbW92ZSBpdCBpbnRvIHRoZSBYIHJlZ2lzdGVyLgogCQkgKi8KLQkJczIgPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKKwkJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9NSVNDfEJQRl9UQVgpOwogCQlzYXBwZW5kKHMxLCBzMik7CiAKIAkJcmV0dXJuIChzMSk7CkBAIC0yMjQyLDcgKzIzNTksNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNsaXN0ICoKLWdlbl9sb2FkX3JhZGlvdGFwX2xscHJlZml4bGVuKCkKK2dlbl9sb2FkX3JhZGlvdGFwX2xscHJlZml4bGVuKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSkKIHsKIAlzdHJ1Y3Qgc2xpc3QgKnMxLCAqczI7CiAKQEAgLTIyNTMsNyArMjM3MCw3IEBACiAJICogZ2VuZXJhdGVkIHVzZXMgdGhhdCBwcmVmaXgsIHNvIHdlIGRvbid0IG5lZWQgdG8gZ2VuZXJhdGUgYW55CiAJICogY29kZSB0byBsb2FkIGl0LikKIAkgKi8KLQlpZiAob2ZmX2xpbmtoZHIucmVnICE9IC0xKSB7CisJaWYgKGNzdGF0ZS0+b2ZmX2xpbmtoZHIucmVnICE9IC0xKSB7CiAJCS8qCiAJCSAqIFRoZSAyIGJ5dGVzIGF0IG9mZnNldHMgb2YgMiBhbmQgMyBmcm9tIHRoZSBiZWdpbm5pbmcKIAkJICogb2YgdGhlIHJhZGlvdGFwIGhlYWRlciBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgcmFkaW90YXAKQEAgLTIyNjUsMzYgKzIzODIsMzYgQEAKIAkJICogTG9hZCB0aGUgaGlnaC1vcmRlciBieXRlLCBhdCBhbiBvZmZzZXQgb2YgMywgc2hpZnQgaXQKIAkJICogbGVmdCBhIGJ5dGUsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiB0aGUgWCByZWdpc3Rlci4KIAkJICovCi0JCXMxID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9CfEJQRl9BQlMpOworCQlzMSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9CfEJQRl9BQlMpOwogCQlzMS0+cy5rID0gMzsKLQkJczIgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9MU0h8QlBGX0spOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfTFNIfEJQRl9LKTsKIAkJc2FwcGVuZChzMSwgczIpOwogCQlzMi0+cy5rID0gODsKLQkJczIgPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKKwkJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9NSVNDfEJQRl9UQVgpOwogCQlzYXBwZW5kKHMxLCBzMik7CiAKIAkJLyoKIAkJICogTG9hZCB0aGUgbmV4dCBieXRlLCBhdCBhbiBvZmZzZXQgb2YgMiwgYW5kIE9SIHRoZQogCQkgKiB2YWx1ZSBmcm9tIHRoZSBYIHJlZ2lzdGVyIGludG8gaXQuCiAJCSAqLwotCQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfQnxCUEZfQUJTKTsKKwkJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfQnxCUEZfQUJTKTsKIAkJc2FwcGVuZChzMSwgczIpOwogCQlzMi0+cy5rID0gMjsKLQkJczIgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9PUnxCUEZfWCk7CisJCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfQUxVfEJQRl9PUnxCUEZfWCk7CiAJCXNhcHBlbmQoczEsIHMyKTsKIAogCQkvKgogCQkgKiBOb3cgYWxsb2NhdGUgYSByZWdpc3RlciB0byBob2xkIHRoYXQgdmFsdWUgYW5kIHN0b3JlCiAJCSAqIGl0LgogCQkgKi8KLQkJczIgPSBuZXdfc3RtdChCUEZfU1QpOwotCQlzMi0+cy5rID0gb2ZmX2xpbmtoZHIucmVnOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX1NUKTsKKwkJczItPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtoZHIucmVnOwogCQlzYXBwZW5kKHMxLCBzMik7CiAKIAkJLyoKIAkJICogTm93IG1vdmUgaXQgaW50byB0aGUgWCByZWdpc3Rlci4KIAkJICovCi0JCXMyID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CisJCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTUlTQ3xCUEZfVEFYKTsKIAkJc2FwcGVuZChzMSwgczIpOwogCiAJCXJldHVybiAoczEpOwpAQCAtMjMxMiw3ICsyNDI5LDcgQEAKICAqIHRoYXQncyBkb25lIGluIGZpbmlzaF9wYXJzZSgpLgogICovCiBzdGF0aWMgc3RydWN0IHNsaXN0ICoKLWdlbl9sb2FkX3BwaV9sbHByZWZpeGxlbigpCitnZW5fbG9hZF9wcGlfbGxwcmVmaXhsZW4oY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlKQogewogCXN0cnVjdCBzbGlzdCAqczEsICpzMjsKIApAQCAtMjMyMSw3ICsyNDM4LDcgQEAKIAkgKiBpbnRvIHRoZSByZWdpc3RlciBhc3NpZ25lZCB0byBob2xkIHRoYXQgbGVuZ3RoLCBpZiBvbmUgaGFzCiAJICogYmVlbiBhc3NpZ25lZC4KIAkgKi8KLQlpZiAob2ZmX2xpbmtoZHIucmVnICE9IC0xKSB7CisJaWYgKGNzdGF0ZS0+b2ZmX2xpbmtoZHIucmVnICE9IC0xKSB7CiAJCS8qCiAJCSAqIFRoZSAyIGJ5dGVzIGF0IG9mZnNldHMgb2YgMiBhbmQgMyBmcm9tIHRoZSBiZWdpbm5pbmcKIAkJICogb2YgdGhlIHJhZGlvdGFwIGhlYWRlciBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgcmFkaW90YXAKQEAgLTIzMzMsMzYgKzI0NTAsMzYgQEAKIAkJICogTG9hZCB0aGUgaGlnaC1vcmRlciBieXRlLCBhdCBhbiBvZmZzZXQgb2YgMywgc2hpZnQgaXQKIAkJICogbGVmdCBhIGJ5dGUsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiB0aGUgWCByZWdpc3Rlci4KIAkJICovCi0JCXMxID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9CfEJQRl9BQlMpOworCQlzMSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9CfEJQRl9BQlMpOwogCQlzMS0+cy5rID0gMzsKLQkJczIgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9MU0h8QlBGX0spOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfTFNIfEJQRl9LKTsKIAkJc2FwcGVuZChzMSwgczIpOwogCQlzMi0+cy5rID0gODsKLQkJczIgPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKKwkJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9NSVNDfEJQRl9UQVgpOwogCQlzYXBwZW5kKHMxLCBzMik7CiAKIAkJLyoKIAkJICogTG9hZCB0aGUgbmV4dCBieXRlLCBhdCBhbiBvZmZzZXQgb2YgMiwgYW5kIE9SIHRoZQogCQkgKiB2YWx1ZSBmcm9tIHRoZSBYIHJlZ2lzdGVyIGludG8gaXQuCiAJCSAqLwotCQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfQnxCUEZfQUJTKTsKKwkJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfQnxCUEZfQUJTKTsKIAkJc2FwcGVuZChzMSwgczIpOwogCQlzMi0+cy5rID0gMjsKLQkJczIgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9PUnxCUEZfWCk7CisJCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfQUxVfEJQRl9PUnxCUEZfWCk7CiAJCXNhcHBlbmQoczEsIHMyKTsKIAogCQkvKgogCQkgKiBOb3cgYWxsb2NhdGUgYSByZWdpc3RlciB0byBob2xkIHRoYXQgdmFsdWUgYW5kIHN0b3JlCiAJCSAqIGl0LgogCQkgKi8KLQkJczIgPSBuZXdfc3RtdChCUEZfU1QpOwotCQlzMi0+cy5rID0gb2ZmX2xpbmtoZHIucmVnOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX1NUKTsKKwkJczItPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtoZHIucmVnOwogCQlzYXBwZW5kKHMxLCBzMik7CiAKIAkJLyoKIAkJICogTm93IG1vdmUgaXQgaW50byB0aGUgWCByZWdpc3Rlci4KIAkJICovCi0JCXMyID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CisJCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTUlTQ3xCUEZfVEFYKTsKIAkJc2FwcGVuZChzMSwgczIpOwogCiAJCXJldHVybiAoczEpOwpAQCAtMjM3OCwxOCArMjQ5NSwxOSBAQAogICogcmFkaW8gaW5mb3JtYXRpb24uCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgotZ2VuX2xvYWRfODAyXzExX2hlYWRlcl9sZW4oc3RydWN0IHNsaXN0ICpzLCBzdHJ1Y3Qgc2xpc3QgKnNuZXh0KQorZ2VuX2xvYWRfODAyXzExX2hlYWRlcl9sZW4oY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBzdHJ1Y3Qgc2xpc3QgKnMsIHN0cnVjdCBzbGlzdCAqc25leHQpCiB7CiAJc3RydWN0IHNsaXN0ICpzMjsKIAlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X2RhdGFfZnJhbWVfMTsKIAlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X2RhdGFfZnJhbWVfMjsKIAlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X3FvczsKLQlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X3JhZGlvdGFwX2ZsYWdzOwotCXN0cnVjdCBzbGlzdCAqc2pzZXRfcmFkaW90YXBfdHNmdDsKKwlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X3JhZGlvdGFwX2ZsYWdzX3ByZXNlbnQ7CisJc3RydWN0IHNsaXN0ICpzanNldF9yYWRpb3RhcF9leHRfcHJlc2VudDsKKwlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X3JhZGlvdGFwX3RzZnRfcHJlc2VudDsKIAlzdHJ1Y3Qgc2xpc3QgKnNqc2V0X3RzZnRfZGF0YXBhZCwgKnNqc2V0X25vdHNmdF9kYXRhcGFkOwogCXN0cnVjdCBzbGlzdCAqc19yb3VuZHVwOwogCi0JaWYgKG9mZl9saW5rcGwucmVnID09IC0xKSB7CisJaWYgKGNzdGF0ZS0+b2ZmX2xpbmtwbC5yZWcgPT0gLTEpIHsKIAkJLyoKIAkJICogTm8gcmVnaXN0ZXIgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIG9mZnNldCBvZgogCQkgKiB0aGUgbGluay1sYXllciBwYXlsb2FkLCB3aGljaCBtZWFucyBub2JvZHkgbmVlZHMKQEAgLTI0MDQsNyArMjUyMiw3IEBACiAJICogd2UgYXJlIGdlbmVyYXRpbmcgam1wIGluc3RydWN0aW9ucyB3aXRoaW4gYSBub3JtYWwKIAkgKiBzbGlzdCBvZiBpbnN0cnVjdGlvbnMKIAkgKi8KLQlub19vcHRpbWl6ZSA9IDE7CisJY3N0YXRlLT5ub19vcHRpbWl6ZSA9IDE7CiAKIAkvKgogCSAqIElmICJzIiBpcyBub24tbnVsbCwgaXQgaGFzIGNvZGUgdG8gYXJyYW5nZSB0aGF0IHRoZSBYIHJlZ2lzdGVyCkBAIC0yNDIxLDMwICsyNTM5LDMwIEBACiAJCSAqCiAJCSAqIExvYWQgdGhlIGxlbmd0aCBvZiB0aGUgZml4ZWQtbGVuZ3RoIHByZWZpeCBwcmVjZWRpbmcKIAkJICogdGhlIGxpbmstbGF5ZXIgaGVhZGVyIChpZiBhbnkpIGludG8gdGhlIFggcmVnaXN0ZXIsCi0JCSAqIGFuZCBzdG9yZSBpdCBpbiB0aGUgb2ZmX2xpbmtwbC5yZWcgcmVnaXN0ZXIuCisJCSAqIGFuZCBzdG9yZSBpdCBpbiB0aGUgY3N0YXRlLT5vZmZfbGlua3BsLnJlZyByZWdpc3Rlci4KIAkJICogVGhhdCBsZW5ndGggaXMgb2ZmX291dGVybW9zdGxpbmtoZHIuY29uc3RhbnRfcGFydC4KIAkJICovCi0JCXMgPSBuZXdfc3RtdChCUEZfTERYfEJQRl9JTU0pOwotCQlzLT5zLmsgPSBvZmZfb3V0ZXJtb3N0bGlua2hkci5jb25zdGFudF9wYXJ0OworCQlzID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTERYfEJQRl9JTU0pOworCQlzLT5zLmsgPSBjc3RhdGUtPm9mZl9vdXRlcm1vc3RsaW5raGRyLmNvbnN0YW50X3BhcnQ7CiAJfQogCiAJLyoKIAkgKiBUaGUgWCByZWdpc3RlciBjb250YWlucyB0aGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlCiAJICogbGluay1sYXllciBoZWFkZXI7IGFkZCAyNCwgd2hpY2ggaXMgdGhlIG1pbmltdW0gbGVuZ3RoCiAJICogb2YgdGhlIE1BQyBoZWFkZXIgZm9yIGEgZGF0YSBmcmFtZSwgdG8gdGhhdCwgYW5kIHN0b3JlIGl0Ci0JICogaW4gb2ZmX2xpbmtwbC5yZWcsIGFuZCB0aGVuIGxvYWQgdGhlIEZyYW1lIENvbnRyb2wgZmllbGQsCisJICogaW4gY3N0YXRlLT5vZmZfbGlua3BsLnJlZywgYW5kIHRoZW4gbG9hZCB0aGUgRnJhbWUgQ29udHJvbCBmaWVsZCwKIAkgKiB3aGljaCBpcyBhdCB0aGUgb2Zmc2V0IGluIHRoZSBYIHJlZ2lzdGVyLCB3aXRoIGFuIGluZGV4ZWQgbG9hZC4KIAkgKi8KLQlzMiA9IG5ld19zdG10KEJQRl9NSVNDfEJQRl9UWEEpOworCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTUlTQ3xCUEZfVFhBKTsKIAlzYXBwZW5kKHMsIHMyKTsKLQlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfSyk7CisJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX0FERHxCUEZfSyk7CiAJczItPnMuayA9IDI0OwogCXNhcHBlbmQocywgczIpOwotCXMyID0gbmV3X3N0bXQoQlBGX1NUKTsKLQlzMi0+cy5rID0gb2ZmX2xpbmtwbC5yZWc7CisJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9TVCk7CisJczItPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtwbC5yZWc7CiAJc2FwcGVuZChzLCBzMik7CiAKLQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfEJQRl9CKTsKKwlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9JTkR8QlBGX0IpOwogCXMyLT5zLmsgPSAwOwogCXNhcHBlbmQocywgczIpOwogCkBAIC0yNDUzLDcgKzI1NzEsNyBAQAogCSAqIGEgZGF0YSBmcmFtZSBoYXMgdGhlIDB4MDggYml0IChiMykgaW4gdGhhdCBmaWVsZCBzZXQgYW5kIHRoZQogCSAqIDB4MDQgYml0IChiMikgY2xlYXIuCiAJICovCi0Jc2pzZXRfZGF0YV9mcmFtZV8xID0gbmV3X3N0bXQoSk1QKEJQRl9KU0VUKSk7CisJc2pzZXRfZGF0YV9mcmFtZV8xID0gbmV3X3N0bXQoY3N0YXRlLCBKTVAoQlBGX0pTRVQpKTsKIAlzanNldF9kYXRhX2ZyYW1lXzEtPnMuayA9IDB4MDg7CiAJc2FwcGVuZChzLCBzanNldF9kYXRhX2ZyYW1lXzEpOwogCkBAIC0yNDYxLDcgKzI1NzksNyBAQAogCSAqIElmIGIzIGlzIHNldCwgdGVzdCBiMiwgb3RoZXJ3aXNlIGdvIHRvIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YKIAkgKiB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS4KIAkgKi8KLQlzanNldF9kYXRhX2ZyYW1lXzEtPnMuanQgPSBzanNldF9kYXRhX2ZyYW1lXzIgPSBuZXdfc3RtdChKTVAoQlBGX0pTRVQpKTsKKwlzanNldF9kYXRhX2ZyYW1lXzEtPnMuanQgPSBzanNldF9kYXRhX2ZyYW1lXzIgPSBuZXdfc3RtdChjc3RhdGUsIEpNUChCUEZfSlNFVCkpOwogCXNqc2V0X2RhdGFfZnJhbWVfMi0+cy5rID0gMHgwNDsKIAlzYXBwZW5kKHMsIHNqc2V0X2RhdGFfZnJhbWVfMik7CiAJc2pzZXRfZGF0YV9mcmFtZV8xLT5zLmpmID0gc25leHQ7CkBAIC0yNDcyLDI0ICsyNTkwLDI0IEBACiAJICogcHJvZ3JhbS4KIAkgKi8KIAlzanNldF9kYXRhX2ZyYW1lXzItPnMuanQgPSBzbmV4dDsKLQlzanNldF9kYXRhX2ZyYW1lXzItPnMuamYgPSBzanNldF9xb3MgPSBuZXdfc3RtdChKTVAoQlBGX0pTRVQpKTsKKwlzanNldF9kYXRhX2ZyYW1lXzItPnMuamYgPSBzanNldF9xb3MgPSBuZXdfc3RtdChjc3RhdGUsIEpNUChCUEZfSlNFVCkpOwogCXNqc2V0X3Fvcy0+cy5rID0gMHg4MDsJLyogUW9TIGJpdCAqLwogCXNhcHBlbmQocywgc2pzZXRfcW9zKTsKIAogCS8qCi0JICogSWYgaXQncyBzZXQsIGFkZCAyIHRvIG9mZl9saW5rcGwucmVnLCB0byBza2lwIHRoZSBRb1MKKwkgKiBJZiBpdCdzIHNldCwgYWRkIDIgdG8gY3N0YXRlLT5vZmZfbGlua3BsLnJlZywgdG8gc2tpcCB0aGUgUW9TCiAJICogZmllbGQuCiAJICogT3RoZXJ3aXNlLCBnbyB0byB0aGUgZmlyc3Qgc3RhdGVtZW50IG9mIHRoZSByZXN0IG9mIHRoZQogCSAqIHByb2dyYW0uCiAJICovCi0Jc2pzZXRfcW9zLT5zLmp0ID0gczIgPSBuZXdfc3RtdChCUEZfTER8QlBGX01FTSk7Ci0JczItPnMuayA9IG9mZl9saW5rcGwucmVnOworCXNqc2V0X3Fvcy0+cy5qdCA9IHMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX01FTSk7CisJczItPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtwbC5yZWc7CiAJc2FwcGVuZChzLCBzMik7Ci0JczIgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX0lNTSk7CisJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX0FERHxCUEZfSU1NKTsKIAlzMi0+cy5rID0gMjsKIAlzYXBwZW5kKHMsIHMyKTsKLQlzMiA9IG5ld19zdG10KEJQRl9TVCk7Ci0JczItPnMuayA9IG9mZl9saW5rcGwucmVnOworCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfU1QpOworCXMyLT5zLmsgPSBjc3RhdGUtPm9mZl9saW5rcGwucmVnOwogCXNhcHBlbmQocywgczIpOwogCiAJLyoKQEAgLTI1MDEsMzIgKzI2MTksNTQgQEAKIAkgKiBsaXR0bGUtZW5kaWFuLCBzbyB3ZSBieXRlLXN3YXAgYWxsIG9mIHRoZSB2YWx1ZXMKIAkgKiB3ZSB0ZXN0IGFnYWluc3QsIGFzIHRoZXkgd2lsbCBiZSBsb2FkZWQgYXMgYmlnLWVuZGlhbgogCSAqIHZhbHVlcy4KKwkgKgorCSAqIFhYWCAtIGluIHRoZSBnZW5lcmFsIGNhc2UsIHdlIHdvdWxkIGhhdmUgdG8gc2NhbiB0aHJvdWdoCisJICogKmFsbCogdGhlIHByZXNlbmNlIGJpdHMsIGlmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSB3b3JkIG9mCisJICogcHJlc2VuY2UgYml0cy4gIFRoYXQgd291bGQgcmVxdWlyZSBhIGxvb3AsIG1lYW5pbmcgdGhhdAorCSAqIHdlIHdvdWxkbid0IGJlIGFibGUgdG8gcnVuIHRoZSBmaWx0ZXIgaW4gdGhlIGtlcm5lbC4KKwkgKgorCSAqIFdlIGFzc3VtZSBoZXJlIHRoYXQgdGhlIEF0aGVyb3MgYWRhcHRlcnMgdGhhdCBpbnNlcnQgdGhlCisJICogYW5ub3lpbmcgcGFkZGluZyBkb24ndCBoYXZlIG11bHRpcGxlIGFudGVubmFlIGFuZCB0aGVyZWZvcmUKKwkgKiBkbyBub3QgZ2VuZXJhdGUgcmFkaW90YXAgaGVhZGVycyB3aXRoIG11bHRpcGxlIHByZXNlbmNlIHdvcmRzLgogCSAqLwotCWlmIChsaW5rdHlwZSA9PSBETFRfSUVFRTgwMl8xMV9SQURJTykgeworCWlmIChjc3RhdGUtPmxpbmt0eXBlID09IERMVF9JRUVFODAyXzExX1JBRElPKSB7CiAJCS8qCiAJCSAqIElzIHRoZSBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MgYml0ICgweDAwMDAwMDIpIHNldAotCQkgKiBpbiB0aGUgcHJlc2VuY2UgZmxhZz8KKwkJICogaW4gdGhlIGZpcnN0IHByZXNlbmNlIGZsYWcgd29yZD8KIAkJICovCi0JCXNqc2V0X3Fvcy0+cy5qZiA9IHMyID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9BQlN8QlBGX1cpOworCQlzanNldF9xb3MtPnMuamYgPSBzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9BQlN8QlBGX1cpOwogCQlzMi0+cy5rID0gNDsKIAkJc2FwcGVuZChzLCBzMik7CiAKLQkJc2pzZXRfcmFkaW90YXBfZmxhZ3MgPSBuZXdfc3RtdChKTVAoQlBGX0pTRVQpKTsKLQkJc2pzZXRfcmFkaW90YXBfZmxhZ3MtPnMuayA9IFNXQVBMT05HKDB4MDAwMDAwMDIpOwotCQlzYXBwZW5kKHMsIHNqc2V0X3JhZGlvdGFwX2ZsYWdzKTsKKwkJc2pzZXRfcmFkaW90YXBfZmxhZ3NfcHJlc2VudCA9IG5ld19zdG10KGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CisJCXNqc2V0X3JhZGlvdGFwX2ZsYWdzX3ByZXNlbnQtPnMuayA9IFNXQVBMT05HKDB4MDAwMDAwMDIpOworCQlzYXBwZW5kKHMsIHNqc2V0X3JhZGlvdGFwX2ZsYWdzX3ByZXNlbnQpOwogCiAJCS8qCiAJCSAqIElmIG5vdCwgc2tpcCBhbGwgb2YgdGhpcy4KIAkJICovCi0JCXNqc2V0X3JhZGlvdGFwX2ZsYWdzLT5zLmpmID0gc25leHQ7CisJCXNqc2V0X3JhZGlvdGFwX2ZsYWdzX3ByZXNlbnQtPnMuamYgPSBzbmV4dDsKKworCQkvKgorCQkgKiBPdGhlcndpc2UsIGlzIHRoZSAiZXh0ZW5zaW9uIiBiaXQgc2V0IGluIHRoYXQgd29yZD8KKwkJICovCisJCXNqc2V0X3JhZGlvdGFwX2V4dF9wcmVzZW50ID0gbmV3X3N0bXQoY3N0YXRlLCBKTVAoQlBGX0pTRVQpKTsKKwkJc2pzZXRfcmFkaW90YXBfZXh0X3ByZXNlbnQtPnMuayA9IFNXQVBMT05HKDB4ODAwMDAwMDApOworCQlzYXBwZW5kKHMsIHNqc2V0X3JhZGlvdGFwX2V4dF9wcmVzZW50KTsKKwkJc2pzZXRfcmFkaW90YXBfZmxhZ3NfcHJlc2VudC0+cy5qdCA9IHNqc2V0X3JhZGlvdGFwX2V4dF9wcmVzZW50OworCisJCS8qCisJCSAqIElmIHNvLCBza2lwIGFsbCBvZiB0aGlzLgorCQkgKi8KKwkJc2pzZXRfcmFkaW90YXBfZXh0X3ByZXNlbnQtPnMuanQgPSBzbmV4dDsKIAogCQkvKgogCQkgKiBPdGhlcndpc2UsIGlzIHRoZSBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCBiaXQgc2V0PwogCQkgKi8KLQkJc2pzZXRfcmFkaW90YXBfdHNmdCA9IHNqc2V0X3JhZGlvdGFwX2ZsYWdzLT5zLmp0ID0KLQkJICAgIG5ld19zdG10KEpNUChCUEZfSlNFVCkpOwotCQlzanNldF9yYWRpb3RhcF90c2Z0LT5zLmsgPSBTV0FQTE9ORygweDAwMDAwMDAxKTsKLQkJc2FwcGVuZChzLCBzanNldF9yYWRpb3RhcF90c2Z0KTsKKwkJc2pzZXRfcmFkaW90YXBfdHNmdF9wcmVzZW50ID0gbmV3X3N0bXQoY3N0YXRlLCBKTVAoQlBGX0pTRVQpKTsKKwkJc2pzZXRfcmFkaW90YXBfdHNmdF9wcmVzZW50LT5zLmsgPSBTV0FQTE9ORygweDAwMDAwMDAxKTsKKwkJc2FwcGVuZChzLCBzanNldF9yYWRpb3RhcF90c2Z0X3ByZXNlbnQpOworCQlzanNldF9yYWRpb3RhcF9leHRfcHJlc2VudC0+cy5qZiA9IHNqc2V0X3JhZGlvdGFwX3RzZnRfcHJlc2VudDsKIAogCQkvKgogCQkgKiBJZiBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCBpcyBzZXQsIHRoZSBmbGFncyBmaWVsZCBpcwpAQCAtMjUzNywxMSArMjY3NywxMiBAQAogCQkgKiBUZXN0IHdoZXRoZXIgdGhlIElFRUU4MDIxMV9SQURJT1RBUF9GX0RBVEFQQUQgYml0ICgweDIwKQogCQkgKiBpcyBzZXQuCiAJCSAqLwotCQlzanNldF9yYWRpb3RhcF90c2Z0LT5zLmp0ID0gczIgPSBuZXdfc3RtdChCUEZfTER8QlBGX0FCU3xCUEZfQik7CisJCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX0FCU3xCUEZfQik7CiAJCXMyLT5zLmsgPSAxNjsKIAkJc2FwcGVuZChzLCBzMik7CisJCXNqc2V0X3JhZGlvdGFwX3RzZnRfcHJlc2VudC0+cy5qdCA9IHMyOwogCi0JCXNqc2V0X3RzZnRfZGF0YXBhZCA9IG5ld19zdG10KEpNUChCUEZfSlNFVCkpOworCQlzanNldF90c2Z0X2RhdGFwYWQgPSBuZXdfc3RtdChjc3RhdGUsIEpNUChCUEZfSlNFVCkpOwogCQlzanNldF90c2Z0X2RhdGFwYWQtPnMuayA9IDB4MjA7CiAJCXNhcHBlbmQocywgc2pzZXRfdHNmdF9kYXRhcGFkKTsKIApAQCAtMjU1MywxMSArMjY5NCwxMiBAQAogCQkgKiBUZXN0IHdoZXRoZXIgdGhlIElFRUU4MDIxMV9SQURJT1RBUF9GX0RBVEFQQUQgYml0ICgweDIwKQogCQkgKiBpcyBzZXQuCiAJCSAqLwotCQlzanNldF9yYWRpb3RhcF90c2Z0LT5zLmpmID0gczIgPSBuZXdfc3RtdChCUEZfTER8QlBGX0FCU3xCUEZfQik7CisJCXMyID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX0FCU3xCUEZfQik7CiAJCXMyLT5zLmsgPSA4OwogCQlzYXBwZW5kKHMsIHMyKTsKKwkJc2pzZXRfcmFkaW90YXBfdHNmdF9wcmVzZW50LT5zLmpmID0gczI7CiAKLQkJc2pzZXRfbm90c2Z0X2RhdGFwYWQgPSBuZXdfc3RtdChKTVAoQlBGX0pTRVQpKTsKKwkJc2pzZXRfbm90c2Z0X2RhdGFwYWQgPSBuZXdfc3RtdChjc3RhdGUsIEpNUChCUEZfSlNFVCkpOwogCQlzanNldF9ub3RzZnRfZGF0YXBhZC0+cy5rID0gMHgyMDsKIAkJc2FwcGVuZChzLCBzanNldF9ub3RzZnRfZGF0YXBhZCk7CiAKQEAgLTI1NjgsMTcgKzI3MTAsMTcgQEAKIAkJICogZGl2aWRpbmcgYnkgYW5kIG11bHRpcGx5aW5nIGJ5IDQsIHdoaWNoIHdlIGRvIGJ5CiAJCSAqIEFORGluZyB3aXRoIH4zLgogCQkgKi8KLQkJc19yb3VuZHVwID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9NRU0pOwotCQlzX3JvdW5kdXAtPnMuayA9IG9mZl9saW5rcGwucmVnOworCQlzX3JvdW5kdXAgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfTUVNKTsKKwkJc19yb3VuZHVwLT5zLmsgPSBjc3RhdGUtPm9mZl9saW5rcGwucmVnOwogCQlzYXBwZW5kKHMsIHNfcm91bmR1cCk7Ci0JCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9JTU0pOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQUREfEJQRl9JTU0pOwogCQlzMi0+cy5rID0gMzsKIAkJc2FwcGVuZChzLCBzMik7Ci0JCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQU5EfEJQRl9JTU0pOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQU5EfEJQRl9JTU0pOwogCQlzMi0+cy5rID0gfjM7CiAJCXNhcHBlbmQocywgczIpOwotCQlzMiA9IG5ld19zdG10KEJQRl9TVCk7Ci0JCXMyLT5zLmsgPSBvZmZfbGlua3BsLnJlZzsKKwkJczIgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9TVCk7CisJCXMyLT5zLmsgPSBjc3RhdGUtPm9mZl9saW5rcGwucmVnOwogCQlzYXBwZW5kKHMsIHMyKTsKIAogCQlzanNldF90c2Z0X2RhdGFwYWQtPnMuanQgPSBzX3JvdW5kdXA7CkBAIC0yNTkyLDggKzI3MzQsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotaW5zZXJ0X2NvbXB1dGVfdmxvZmZzZXRzKGIpCi0Jc3RydWN0IGJsb2NrICpiOworaW5zZXJ0X2NvbXB1dGVfdmxvZmZzZXRzKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgc3RydWN0IGJsb2NrICpiKQogewogCXN0cnVjdCBzbGlzdCAqczsKIApAQCAtMjYwMiw5ICsyNzQzLDkgQEAKIAkgKiBpbmNsdWRlcyB0aGUgdmFyaWFibGUgcGFydCBvZiB0aGUgaGVhZGVyLiBUaGVyZWZvcmUsCiAJICogaWYgbm9ib2R5IGVsc2UgaGFzIGFsbG9jYXRlZCBhIHJlZ2lzdGVyIGZvciB0aGUgbGluawogCSAqIGhlYWRlciBhbmQgd2UgbmVlZCBpdCwgZG8gaXQgbm93LiAqLwotCWlmIChvZmZfbGlua3BsLnJlZyAhPSAtMSAmJiBvZmZfbGlua2hkci5pc192YXJpYWJsZSAmJgotCSAgICBvZmZfbGlua2hkci5yZWcgPT0gLTEpCi0JCW9mZl9saW5raGRyLnJlZyA9IGFsbG9jX3JlZygpOworCWlmIChjc3RhdGUtPm9mZl9saW5rcGwucmVnICE9IC0xICYmIGNzdGF0ZS0+b2ZmX2xpbmtoZHIuaXNfdmFyaWFibGUgJiYKKwkgICAgY3N0YXRlLT5vZmZfbGlua2hkci5yZWcgPT0gLTEpCisJCWNzdGF0ZS0+b2ZmX2xpbmtoZHIucmVnID0gYWxsb2NfcmVnKGNzdGF0ZSk7CiAKIAkvKgogCSAqIEZvciBsaW5rLWxheWVyIHR5cGVzIHRoYXQgaGF2ZSBhIHZhcmlhYmxlLWxlbmd0aCBoZWFkZXIKQEAgLTI2MTcsMjIgKzI3NTgsMjIgQEAKIAkgKiBzb21lIG90aGVyIHByb3RvY29sIHN0YWNrLiAgVGhhdCdzIHNpZ25pZmljYW50bHkgbW9yZQogCSAqIGNvbXBsaWNhdGVkLgogCSAqLwotCXN3aXRjaCAob3V0ZXJtb3N0bGlua3R5cGUpIHsKKwlzd2l0Y2ggKGNzdGF0ZS0+b3V0ZXJtb3N0bGlua3R5cGUpIHsKIAogCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKLQkJcyA9IGdlbl9sb2FkX3ByaXNtX2xscHJlZml4bGVuKCk7CisJCXMgPSBnZW5fbG9hZF9wcmlzbV9sbHByZWZpeGxlbihjc3RhdGUpOwogCQlicmVhazsKIAogCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgotCQlzID0gZ2VuX2xvYWRfYXZzX2xscHJlZml4bGVuKCk7CisJCXMgPSBnZW5fbG9hZF9hdnNfbGxwcmVmaXhsZW4oY3N0YXRlKTsKIAkJYnJlYWs7CiAKIAljYXNlIERMVF9JRUVFODAyXzExX1JBRElPOgotCQlzID0gZ2VuX2xvYWRfcmFkaW90YXBfbGxwcmVmaXhsZW4oKTsKKwkJcyA9IGdlbl9sb2FkX3JhZGlvdGFwX2xscHJlZml4bGVuKGNzdGF0ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBETFRfUFBJOgotCQlzID0gZ2VuX2xvYWRfcHBpX2xscHJlZml4bGVuKCk7CisJCXMgPSBnZW5fbG9hZF9wcGlfbGxwcmVmaXhsZW4oY3N0YXRlKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjY0NSwxNCArMjc4NiwxNCBAQAogCSAqIGhlYWRlciwgZ2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSBvZmZzZXQgb2YgdGhlIGxpbmstbGF5ZXIKIAkgKiBwYXlsb2FkIGludG8gdGhlIHJlZ2lzdGVyIGFzc2lnbmVkIHRvIHRoYXQgb2Zmc2V0LCBpZiBhbnkuCiAJICovCi0Jc3dpdGNoIChvdXRlcm1vc3RsaW5rdHlwZSkgeworCXN3aXRjaCAoY3N0YXRlLT5vdXRlcm1vc3RsaW5rdHlwZSkgewogCiAJY2FzZSBETFRfSUVFRTgwMl8xMToKIAljYXNlIERMVF9QUklTTV9IRUFERVI6CiAJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CiAJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKIAljYXNlIERMVF9QUEk6Ci0JCXMgPSBnZW5fbG9hZF84MDJfMTFfaGVhZGVyX2xlbihzLCBiLT5zdG10cyk7CisJCXMgPSBnZW5fbG9hZF84MDJfMTFfaGVhZGVyX2xlbihjc3RhdGUsIHMsIGItPnN0bXRzKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNjY5LDE5ICsyODEwLDE5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BwaV9kbHRfY2hlY2sodm9pZCkKK2dlbl9wcGlfZGx0X2NoZWNrKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSkKIHsKIAlzdHJ1Y3Qgc2xpc3QgKnNfbG9hZF9kbHQ7CiAJc3RydWN0IGJsb2NrICpiOwogCi0JaWYgKGxpbmt0eXBlID09IERMVF9QUEkpCisJaWYgKGNzdGF0ZS0+bGlua3R5cGUgPT0gRExUX1BQSSkKIAl7CiAJCS8qIENyZWF0ZSB0aGUgc3RhdGVtZW50cyB0aGF0IGNoZWNrIGZvciB0aGUgRExUCiAJCSAqLwotCQlzX2xvYWRfZGx0ID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9XfEJQRl9BQlMpOworCQlzX2xvYWRfZGx0ID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX1d8QlBGX0FCUyk7CiAJCXNfbG9hZF9kbHQtPnMuayA9IDQ7CiAKLQkJYiA9IG5ld19ibG9jayhKTVAoQlBGX0pFUSkpOworCQliID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KRVEpKTsKIAogCQliLT5zdG10cyA9IHNfbG9hZF9kbHQ7CiAJCWItPnMuayA9IFNXQVBMT05HKERMVF9JRUVFODAyXzExKTsKQEAgLTI3MDgsNyArMjg0OSw3IEBACiAgKiBiZSBwbGFjZWQgZWFybGllciBpbiB0aGUgY29kZSBzZXF1ZW5jZS4pCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgotZ2VuX2Fic19vZmZzZXRfdmFycGFydChicGZfYWJzX29mZnNldCAqb2ZmKQorZ2VuX2Fic19vZmZzZXRfdmFycGFydChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGJwZl9hYnNfb2Zmc2V0ICpvZmYpCiB7CiAJc3RydWN0IHNsaXN0ICpzOwogCkBAIC0yNzE5LDE0ICsyODYwLDE0IEBACiAJCQkgKiB2YXJpYWJsZSBwYXJ0IG9mIHRoZSBvZmZzZXQgb2YgdGhlIGxpbmstbGF5ZXIKIAkJCSAqIGhlYWRlcjsgYWxsb2NhdGUgb25lLgogCQkJICovCi0JCQlvZmYtPnJlZyA9IGFsbG9jX3JlZygpOworCQkJb2ZmLT5yZWcgPSBhbGxvY19yZWcoY3N0YXRlKTsKIAkJfQogCiAJCS8qCiAJCSAqIExvYWQgdGhlIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIHZhcmlhYmxlIHBhcnQgb2YgdGhlCiAJCSAqIG9mZnNldCBvZiB0aGUgbGluay1sYXllciBoZWFkZXIgaW50byB0aGUgWCByZWdpc3Rlci4KIAkJICovCi0JCXMgPSBuZXdfc3RtdChCUEZfTERYfEJQRl9NRU0pOworCQlzID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTERYfEJQRl9NRU0pOwogCQlzLT5zLmsgPSBvZmYtPnJlZzsKIAkJcmV0dXJuIHM7CiAJfSBlbHNlIHsKQEAgLTI3OTQsMTQgKzI5MzUsMTQgQEAKICAqIGZvciB0aGF0IGVuY2Fwc3VsYXRpb24pLgogICovCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9wcmV2bGlua2hkcl9jaGVjayh2b2lkKQorZ2VuX3ByZXZsaW5raGRyX2NoZWNrKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSkKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwOwogCi0JaWYgKGlzX2dlbmV2ZSkKLQkJcmV0dXJuIGdlbl9nZW5ldmVfbGxfY2hlY2soKTsKKwlpZiAoY3N0YXRlLT5pc19nZW5ldmUpCisJCXJldHVybiBnZW5fZ2VuZXZlX2xsX2NoZWNrKGNzdGF0ZSk7CiAKLQlzd2l0Y2ggKHByZXZsaW5rdHlwZSkgeworCXN3aXRjaCAoY3N0YXRlLT5wcmV2bGlua3R5cGUpIHsKIAogCWNhc2UgRExUX1NVTkFUTToKIAkJLyoKQEAgLTI4MTEsNyArMjk1Miw3IEBACiAJCSAqCiAJCSAqIChXZSd2ZSBhbHJlYWR5IGdlbmVyYXRlZCBhIHRlc3QgZm9yIExBTkUuKQogCQkgKi8KLQkJYjAgPSBnZW5fY21wKE9SX1BSRVZMSU5LSERSLCBTVU5BVE1fUEtUX0JFR0lOX1BPUywgQlBGX0gsIDB4RkYwMCk7CisJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX1BSRVZMSU5LSERSLCBTVU5BVE1fUEtUX0JFR0lOX1BPUywgQlBGX0gsIDB4RkYwMCk7CiAJCWdlbl9ub3QoYjApOwogCQlyZXR1cm4gYjA7CiAKQEAgLTI4MjUsNiArMjk2NiwxNCBAQAogfQogCiAvKgorICogVGhlIHRocmVlIGRpZmZlcmVudCB2YWx1ZXMgd2Ugc2hvdWxkIGNoZWNrIGZvciB3aGVuIGNoZWNraW5nIGZvciBhbgorICogSVB2NiBwYWNrZXQgd2l0aCBETFRfTlVMTC4KKyAqLworI2RlZmluZSBCU0RfQUZOVU1fSU5FVDZfQlNECTI0CS8qIE5ldEJTRCwgT3BlbkJTRCwgQlNEL09TLCBOcGNhcCAqLworI2RlZmluZSBCU0RfQUZOVU1fSU5FVDZfRlJFRUJTRAkyOAkvKiBGcmVlQlNEICovCisjZGVmaW5lIEJTRF9BRk5VTV9JTkVUNl9EQVJXSU4JMzAJLyogT1MgWCwgaU9TLCBvdGhlciBEYXJ3aW4tYmFzZWQgT1NlcyAqLworCisvKgogICogR2VuZXJhdGUgY29kZSB0byBtYXRjaCBhIHBhcnRpY3VsYXIgcGFja2V0IHR5cGUgYnkgbWF0Y2hpbmcgdGhlCiAgKiBsaW5rLWxheWVyIHR5cGUgZmllbGQgb3IgZmllbGRzIGluIHRoZSA4MDIuMiBMTEMgaGVhZGVyLgogICoKQEAgLTI4MzIsNDQgKzI5ODEsNDMgQEAKICAqIHZhbHVlLCBpZiA8PSBFVEhFUk1UVS4KICAqLwogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fbGlua3R5cGUocHJvdG8pCi0JcmVnaXN0ZXIgaW50IHByb3RvOworZ2VuX2xpbmt0eXBlKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHByb3RvKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMSwgKmIyOwogCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOwogCiAJLyogYXJlIHdlIGNoZWNraW5nIE1QTFMtZW5jYXBzdWxhdGVkIHBhY2tldHM/ICovCi0JaWYgKGxhYmVsX3N0YWNrX2RlcHRoID4gMCkgeworCWlmIChjc3RhdGUtPmxhYmVsX3N0YWNrX2RlcHRoID4gMCkgewogCQlzd2l0Y2ggKHByb3RvKSB7CiAJCWNhc2UgRVRIRVJUWVBFX0lQOgogCQljYXNlIFBQUF9JUDoKIAkJCS8qIEZJWE1FIGFkZCBvdGhlciBMMyBwcm90byBJRHMgKi8KLQkJCXJldHVybiBnZW5fbXBsc19saW5rdHlwZShRX0lQKTsKKwkJCXJldHVybiBnZW5fbXBsc19saW5rdHlwZShjc3RhdGUsIFFfSVApOwogCiAJCWNhc2UgRVRIRVJUWVBFX0lQVjY6CiAJCWNhc2UgUFBQX0lQVjY6CiAJCQkvKiBGSVhNRSBhZGQgb3RoZXIgTDMgcHJvdG8gSURzICovCi0JCQlyZXR1cm4gZ2VuX21wbHNfbGlua3R5cGUoUV9JUFY2KTsKKwkJCXJldHVybiBnZW5fbXBsc19saW5rdHlwZShjc3RhdGUsIFFfSVBWNik7CiAKIAkJZGVmYXVsdDoKLQkJCWJwZl9lcnJvcigidW5zdXBwb3J0ZWQgcHJvdG9jb2wgb3ZlciBtcGxzIik7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAidW5zdXBwb3J0ZWQgcHJvdG9jb2wgb3ZlciBtcGxzIik7CiAJCQkvKiBOT1RSRUFDSEVEICovCiAJCX0KIAl9CiAKLQlzd2l0Y2ggKGxpbmt0eXBlKSB7CisJc3dpdGNoIChjc3RhdGUtPmxpbmt0eXBlKSB7CiAKIAljYXNlIERMVF9FTjEwTUI6CiAJY2FzZSBETFRfTkVUQU5BTFlaRVI6CiAJY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CiAJCS8qIEdlbmV2ZSBoYXMgYW4gRXRoZXJUeXBlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVyZSBpcyBhbgogCQkgKiBMMiBoZWFkZXIuICovCi0JCWlmICghaXNfZ2VuZXZlKQotCQkJYjAgPSBnZW5fcHJldmxpbmtoZHJfY2hlY2soKTsKKwkJaWYgKCFjc3RhdGUtPmlzX2dlbmV2ZSkKKwkJCWIwID0gZ2VuX3ByZXZsaW5raGRyX2NoZWNrKGNzdGF0ZSk7CiAJCWVsc2UKIAkJCWIwID0gTlVMTDsKIAotCQliMSA9IGdlbl9ldGhlcl9saW5rdHlwZShwcm90byk7CisJCWIxID0gZ2VuX2V0aGVyX2xpbmt0eXBlKGNzdGF0ZSwgcHJvdG8pOwogCQlpZiAoYjAgIT0gTlVMTCkKIAkJCWdlbl9hbmQoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwpAQCAtMjg4NCw3ICszMDMyLDcgQEAKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCiAJCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOworCQkJcmV0dXJuIGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOwogCQkJLypOT1RSRUFDSEVEKi8KIAkJCWJyZWFrOwogCQl9CkBAIC0yODk4LDEyICszMDQ2LDEyIEBACiAJCS8qCiAJCSAqIENoZWNrIHRoYXQgd2UgaGF2ZSBhIGRhdGEgZnJhbWUuCiAJCSAqLwotCQliMCA9IGdlbl9jaGVja184MDJfMTFfZGF0YV9mcmFtZSgpOworCQliMCA9IGdlbl9jaGVja184MDJfMTFfZGF0YV9mcmFtZShjc3RhdGUpOwogCiAJCS8qCiAJCSAqIE5vdyBjaGVjayBmb3IgdGhlIHNwZWNpZmllZCBsaW5rLWxheWVyIHR5cGUuCiAJCSAqLwotCQliMSA9IGdlbl9sbGNfbGlua3R5cGUocHJvdG8pOworCQliMSA9IGdlbl9sbGNfbGlua3R5cGUoY3N0YXRlLCBwcm90byk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCQkvKk5PVFJFQUNIRUQqLwpAQCAtMjkxMyw3ICszMDYxLDcgQEAKIAkJLyoKIAkJICogWFhYIC0gY2hlY2sgZm9yIExMQyBmcmFtZXMuCiAJCSAqLwotCQlyZXR1cm4gZ2VuX2xsY19saW5rdHlwZShwcm90byk7CisJCXJldHVybiBnZW5fbGxjX2xpbmt0eXBlKGNzdGF0ZSwgcHJvdG8pOwogCQkvKk5PVFJFQUNIRUQqLwogCQlicmVhazsKIApAQCAtMjkyMSwxNCArMzA2OSwxNCBAQAogCQkvKgogCQkgKiBYWFggLSBjaGVjayBmb3IgTExDIFBEVXMsIGFzIHBlciBJRUVFIDgwMi41LgogCQkgKi8KLQkJcmV0dXJuIGdlbl9sbGNfbGlua3R5cGUocHJvdG8pOworCQlyZXR1cm4gZ2VuX2xsY19saW5rdHlwZShjc3RhdGUsIHByb3RvKTsKIAkJLypOT1RSRUFDSEVEKi8KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9BVE1fUkZDMTQ4MzoKIAljYXNlIERMVF9BVE1fQ0xJUDoKIAljYXNlIERMVF9JUF9PVkVSX0ZDOgotCQlyZXR1cm4gZ2VuX2xsY19saW5rdHlwZShwcm90byk7CisJCXJldHVybiBnZW5fbGxjX2xpbmt0eXBlKGNzdGF0ZSwgcHJvdG8pOwogCQkvKk5PVFJFQUNIRUQqLwogCQlicmVhazsKIApAQCAtMjk0MCwxNSArMzA4OCwxNSBAQAogCQkgKgogCQkgKiBDaGVjayBmb3IgTExDIGVuY2Fwc3VsYXRpb24gYW5kIHRoZW4gY2hlY2sgdGhlIHByb3RvY29sLgogCQkgKi8KLQkJYjAgPSBnZW5fYXRtZmllbGRfY29kZShBX1BST1RPVFlQRSwgUFRfTExDLCBCUEZfSkVRLCAwKTsKLQkJYjEgPSBnZW5fbGxjX2xpbmt0eXBlKHByb3RvKTsKKwkJYjAgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfUFJPVE9UWVBFLCBQVF9MTEMsIEJQRl9KRVEsIDApOworCQliMSA9IGdlbl9sbGNfbGlua3R5cGUoY3N0YXRlLCBwcm90byk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCQkvKk5PVFJFQUNIRUQqLwogCQlicmVhazsKIAogCWNhc2UgRExUX0xJTlVYX1NMTDoKLQkJcmV0dXJuIGdlbl9saW51eF9zbGxfbGlua3R5cGUocHJvdG8pOworCQlyZXR1cm4gZ2VuX2xpbnV4X3NsbF9saW5rdHlwZShjc3RhdGUsIHByb3RvKTsKIAkJLypOT1RSRUFDSEVEKi8KIAkJYnJlYWs7CiAKQEAgLTI5NjYsMTQgKzMxMTQsMTQgQEAKIAogCQljYXNlIEVUSEVSVFlQRV9JUDoKIAkJCS8qIENoZWNrIGZvciBhIHZlcnNpb24gbnVtYmVyIG9mIDQuICovCi0JCQlyZXR1cm4gZ2VuX21jbXAoT1JfTElOS0hEUiwgMCwgQlBGX0IsIDB4NDAsIDB4RjApOworCQkJcmV0dXJuIGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IsIDB4NDAsIDB4RjApOwogCiAJCWNhc2UgRVRIRVJUWVBFX0lQVjY6CiAJCQkvKiBDaGVjayBmb3IgYSB2ZXJzaW9uIG51bWJlciBvZiA2LiAqLwotCQkJcmV0dXJuIGdlbl9tY21wKE9SX0xJTktIRFIsIDAsIEJQRl9CLCAweDYwLCAweEYwKTsKKwkJCXJldHVybiBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDAsIEJQRl9CLCAweDYwLCAweEYwKTsKIAogCQlkZWZhdWx0OgotCQkJcmV0dXJuIGdlbl9mYWxzZSgpOwkJLyogYWx3YXlzIGZhbHNlICovCisJCQlyZXR1cm4gZ2VuX2ZhbHNlKGNzdGF0ZSk7CS8qIGFsd2F5cyBmYWxzZSAqLwogCQl9CiAJCS8qTk9UUkVBQ0hFRCovCiAJCWJyZWFrOwpAQCAtMjk4MywxMCArMzEzMSwxMCBAQAogCQkgKiBSYXcgSVB2NCwgc28gbm8gdHlwZSBmaWVsZC4KIAkJICovCiAJCWlmIChwcm90byA9PSBFVEhFUlRZUEVfSVApCi0JCQlyZXR1cm4gZ2VuX3RydWUoKTsJCS8qIGFsd2F5cyB0cnVlICovCisJCQlyZXR1cm4gZ2VuX3RydWUoY3N0YXRlKTsJLyogYWx3YXlzIHRydWUgKi8KIAogCQkvKiBDaGVja2luZyBmb3Igc29tZXRoaW5nIG90aGVyIHRoYW4gSVB2NDsgYWx3YXlzIGZhbHNlICovCi0JCXJldHVybiBnZW5fZmFsc2UoKTsKKwkJcmV0dXJuIGdlbl9mYWxzZShjc3RhdGUpOwogCQkvKk5PVFJFQUNIRUQqLwogCQlicmVhazsKIApAQCAtMjk5NSwxMCArMzE0MywxMCBAQAogCQkgKiBSYXcgSVB2Niwgc28gbm8gdHlwZSBmaWVsZC4KIAkJICovCiAJCWlmIChwcm90byA9PSBFVEhFUlRZUEVfSVBWNikKLQkJCXJldHVybiBnZW5fdHJ1ZSgpOwkJLyogYWx3YXlzIHRydWUgKi8KKwkJCXJldHVybiBnZW5fdHJ1ZShjc3RhdGUpOwkvKiBhbHdheXMgdHJ1ZSAqLwogCiAJCS8qIENoZWNraW5nIGZvciBzb21ldGhpbmcgb3RoZXIgdGhhbiBJUHY2OyBhbHdheXMgZmFsc2UgKi8KLQkJcmV0dXJuIGdlbl9mYWxzZSgpOworCQlyZXR1cm4gZ2VuX2ZhbHNlKGNzdGF0ZSk7CiAJCS8qTk9UUkVBQ0hFRCovCiAJCWJyZWFrOwogCkBAIC0zMDExLDcgKzMxNTksNyBAQAogCQkgKiBtYXAgdGhlbSB0byB0aGUgY29ycmVzcG9uZGluZyBQUFAgcHJvdG9jb2wgdHlwZXMuCiAJCSAqLwogCQlwcm90byA9IGV0aGVydHlwZV90b19wcHB0eXBlKHByb3RvKTsKLQkJcmV0dXJuIGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9ILCAoYnBmX2ludDMyKXByb3RvKTsKKwkJcmV0dXJuIGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOwogCQkvKk5PVFJFQUNIRUQqLwogCQlicmVhazsKIApAQCAtMzAyNywxNiArMzE3NSwxNiBAQAogCQkJICogQWxzbyBjaGVjayBmb3IgVmFuIEphY29ic29uLWNvbXByZXNzZWQgSVAuCiAJCQkgKiBYWFggLSBkbyB0aGlzIGZvciBvdGhlciBmb3JtcyBvZiBQUFA/CiAJCQkgKi8KLQkJCWIwID0gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIFBQUF9JUCk7Ci0JCQliMSA9IGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9ILCBQUFBfVkpDKTsKKwkJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgUFBQX0lQKTsKKwkJCWIxID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgUFBQX1ZKQyk7CiAJCQlnZW5fb3IoYjAsIGIxKTsKLQkJCWIwID0gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIFBQUF9WSk5DKTsKKwkJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgUFBQX1ZKTkMpOwogCQkJZ2VuX29yKGIxLCBiMCk7CiAJCQlyZXR1cm4gYjA7CiAKIAkJZGVmYXVsdDoKIAkJCXByb3RvID0gZXRoZXJ0eXBlX3RvX3BwcHR5cGUocHJvdG8pOwotCQkJcmV0dXJuIGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9ILAorCQkJcmV0dXJuIGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LVFlQRSwgMCwgQlBGX0gsCiAJCQkJKGJwZl9pbnQzMilwcm90byk7CiAJCX0KIAkJLypOT1RSRUFDSEVEKi8KQEAgLTMwNDUsMzkgKzMxOTMsNzEgQEAKIAljYXNlIERMVF9OVUxMOgogCWNhc2UgRExUX0xPT1A6CiAJY2FzZSBETFRfRU5DOgotCQkvKgotCQkgKiBGb3IgRExUX05VTEwsIHRoZSBsaW5rLWxheWVyIGhlYWRlciBpcyBhIDMyLWJpdAotCQkgKiB3b3JkIGNvbnRhaW5pbmcgYW4gQUZfIHZhbHVlIGluICpob3N0KiBieXRlIG9yZGVyLAotCQkgKiBhbmQgZm9yIERMVF9FTkMsIHRoZSBsaW5rLWxheWVyIGhlYWRlciBiZWdpbnMKLQkJICogd2l0aCBhIDMyLWJpdCB3b3JrIGNvbnRhaW5pbmcgYW4gQUZfIHZhbHVlIGluCi0JCSAqIGhvc3QgYnl0ZSBvcmRlci4KLQkJICoKLQkJICogSW4gYWRkaXRpb24sIGlmIHdlJ3JlIHJlYWRpbmcgYSBzYXZlZCBjYXB0dXJlIGZpbGUsCi0JCSAqIHRoZSBob3N0IGJ5dGUgb3JkZXIgaW4gdGhlIGNhcHR1cmUgbWF5IG5vdCBiZSB0aGUKLQkJICogc2FtZSBhcyB0aGUgaG9zdCBieXRlIG9yZGVyIG9uIHRoaXMgbWFjaGluZS4KLQkJICoKLQkJICogRm9yIERMVF9MT09QLCB0aGUgbGluay1sYXllciBoZWFkZXIgaXMgYSAzMi1iaXQKLQkJICogd29yZCBjb250YWluaW5nIGFuIEFGXyB2YWx1ZSBpbiAqbmV0d29yayogYnl0ZSBvcmRlci4KLQkJICoKLQkJICogWFhYIC0gQUZfIHZhbHVlcyBtYXksIHVuZm9ydHVuYXRlbHksIGJlIHBsYXRmb3JtLQotCQkgKiBkZXBlbmRlbnQ7IGZvciBleGFtcGxlLCBGcmVlQlNEJ3MgQUZfSU5FVDYgaXMgMjQKLQkJICogd2hpbHN0IE5ldEJTRCdzIGFuZCBPcGVuQlNEJ3MgaXMgMjYuCi0JCSAqCi0JCSAqIFRoaXMgbWVhbnMgdGhhdCwgd2hlbiByZWFkaW5nIGEgY2FwdHVyZSBmaWxlLCBqdXN0Ci0JCSAqIGNoZWNraW5nIGZvciBvdXIgQUZfSU5FVDYgdmFsdWUgd29uJ3Qgd29yayBpZiB0aGUKLQkJICogY2FwdHVyZSBmaWxlIGNhbWUgZnJvbSBhbm90aGVyIE9TLgotCQkgKi8KIAkJc3dpdGNoIChwcm90bykgewogCiAJCWNhc2UgRVRIRVJUWVBFX0lQOgotCQkJcHJvdG8gPSBBRl9JTkVUOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gKGdlbl9sb29wYmFja19saW5rdHlwZShjc3RhdGUsIEFGX0lORVQpKTsKIAotI2lmZGVmIElORVQ2CiAJCWNhc2UgRVRIRVJUWVBFX0lQVjY6Ci0JCQlwcm90byA9IEFGX0lORVQ2OwotCQkJYnJlYWs7Ci0jZW5kaWYKKwkJCS8qCisJCQkgKiBBRl8gdmFsdWVzIG1heSwgdW5mb3J0dW5hdGVseSwgYmUgcGxhdGZvcm0tCisJCQkgKiBkZXBlbmRlbnQ7IEFGX0lORVQgaXNuJ3QsIGJlY2F1c2UgZXZlcnlib2R5CisJCQkgKiB1c2VkIDQuMkJTRCdzIHZhbHVlLCBidXQgQUZfSU5FVDYgaXMsIGJlY2F1c2UKKwkJCSAqIDQuMkJTRCBkaWRuJ3QgaGF2ZSBhIHZhbHVlIGZvciBpdCAoZ2l2ZW4gdGhhdAorCQkJICogSVB2NiBkaWRuJ3QgZXhpc3QgYmFjayBpbiB0aGUgZWFybHkgMTk4MCdzKSwKKwkJCSAqIGFuZCB0aGV5IGFsbCBwaWNrZWQgdGhlaXIgb3duIHZhbHVlcy4KKwkJCSAqCisJCQkgKiBUaGlzIG1lYW5zIHRoYXQsIGlmIHdlJ3JlIHJlYWRpbmcgZnJvbSBhCisJCQkgKiBzYXZlZmlsZSwgd2UgbmVlZCB0byBjaGVjayBmb3IgYWxsIHRoZQorCQkJICogcG9zc2libGUgdmFsdWVzLgorCQkJICoKKwkJCSAqIElmIHdlJ3JlIGRvaW5nIGEgbGl2ZSBjYXB0dXJlLCB3ZSBvbmx5IG5lZWQKKwkJCSAqIHRvIGNoZWNrIGZvciB0aGlzIHBsYXRmb3JtJ3MgdmFsdWU7IGhvd2V2ZXIsCisJCQkgKiBOcGNhcCB1c2VzIDI0LCB3aGljaCBpc24ndCBXaW5kb3dzJ3MgQUZfSU5FVDYKKwkJCSAqIHZhbHVlLiAgKEdpdmVuIHRoZSBtdWx0aXBsZSBkaWZmZXJlbnQgdmFsdWVzLAorCQkJICogcHJvZ3JhbXMgdGhhdCByZWFkIHBjYXAgZmlsZXMgc2hvdWxkbid0IGJlCisJCQkgKiBjaGVja2luZyBmb3IgdGhlaXIgcGxhdGZvcm0ncyBBRl9JTkVUNiB2YWx1ZQorCQkJICogYW55d2F5LCB0aGV5IHNob3VsZCBjaGVjayBmb3IgYWxsIG9mIHRoZQorCQkJICogcG9zc2libGUgdmFsdWVzLiBhbmQgdGhleSBtaWdodCBhcyB3ZWxsIGRvCisJCQkgKiB0aGF0IGV2ZW4gZm9yIGxpdmUgY2FwdHVyZXMuKQorCQkJICovCisJCQlpZiAoY3N0YXRlLT5icGZfcGNhcC0+cmZpbGUgIT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogU2F2ZWZpbGUgLSBjaGVjayBmb3IgYWxsIHRocmVlCisJCQkJICogcG9zc2libGUgSVB2NiB2YWx1ZXMuCisJCQkJICovCisJCQkJYjAgPSBnZW5fbG9vcGJhY2tfbGlua3R5cGUoY3N0YXRlLCBCU0RfQUZOVU1fSU5FVDZfQlNEKTsKKwkJCQliMSA9IGdlbl9sb29wYmFja19saW5rdHlwZShjc3RhdGUsIEJTRF9BRk5VTV9JTkVUNl9GUkVFQlNEKTsKKwkJCQlnZW5fb3IoYjAsIGIxKTsKKwkJCQliMCA9IGdlbl9sb29wYmFja19saW5rdHlwZShjc3RhdGUsIEJTRF9BRk5VTV9JTkVUNl9EQVJXSU4pOworCQkJCWdlbl9vcihiMCwgYjEpOworCQkJCXJldHVybiAoYjEpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIExpdmUgY2FwdHVyZSwgc28gd2Ugb25seSBuZWVkIHRvCisJCQkJICogY2hlY2sgZm9yIHRoZSB2YWx1ZSB1c2VkIG9uIHRoaXMKKwkJCQkgKiBwbGF0Zm9ybS4KKwkJCQkgKi8KKyNpZmRlZiBfV0lOMzIKKwkJCQkvKgorCQkJCSAqIE5wY2FwIGRvZXNuJ3QgdXNlIFdpbmRvd3MncyBBRl9JTkVUNiwKKwkJCQkgKiBhcyB0aGF0IGNvbGxpZGVzIHdpdGggQUZfSVBYIG9uCisJCQkJICogc29tZSBCU0RzIChib3RoIGhhdmUgdGhlIHZhbHVlIDIzKS4KKwkJCQkgKiBJbnN0ZWFkLCBpdCB1c2VzIDI0LgorCQkJCSAqLworCQkJCXJldHVybiAoZ2VuX2xvb3BiYWNrX2xpbmt0eXBlKGNzdGF0ZSwgMjQpKTsKKyNlbHNlIC8qIF9XSU4zMiAqLworI2lmZGVmIEFGX0lORVQ2CisJCQkJcmV0dXJuIChnZW5fbG9vcGJhY2tfbGlua3R5cGUoY3N0YXRlLCBBRl9JTkVUNikpOworI2Vsc2UgLyogQUZfSU5FVDYgKi8KKwkJCQkvKgorCQkJCSAqIEkgZ3Vlc3MgdGhpcyBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQKKwkJCQkgKiBJUHY2LCBzbyB3ZSBqdXN0IHJlamVjdCBhbGwgcGFja2V0cy4KKwkJCQkgKi8KKwkJCQlyZXR1cm4gZ2VuX2ZhbHNlKGNzdGF0ZSk7CisjZW5kaWYgLyogQUZfSU5FVDYgKi8KKyNlbmRpZiAvKiBfV0lOMzIgKi8KKwkJCX0KIAogCQlkZWZhdWx0OgogCQkJLyoKQEAgLTMwODUsMjggKzMyNjUsOSBAQAogCQkJICogWFhYIC0gc3VwcG9ydCB0aG9zZSB0aGF0IGhhdmUgQUZfIHZhbHVlcwogCQkJICogI2RlZmluZWQgb24gdGhpcyBwbGF0Zm9ybSwgYXQgbGVhc3Q/CiAJCQkgKi8KLQkJCXJldHVybiBnZW5fZmFsc2UoKTsKKwkJCXJldHVybiBnZW5fZmFsc2UoY3N0YXRlKTsKIAkJfQogCi0JCWlmIChsaW5rdHlwZSA9PSBETFRfTlVMTCB8fCBsaW5rdHlwZSA9PSBETFRfRU5DKSB7Ci0JCQkvKgotCQkJICogVGhlIEFGXyB2YWx1ZSBpcyBpbiBob3N0IGJ5dGUgb3JkZXIsIGJ1dAotCQkJICogdGhlIEJQRiBpbnRlcnByZXRlciB3aWxsIGNvbnZlcnQgaXQgdG8KLQkJCSAqIG5ldHdvcmsgYnl0ZSBvcmRlci4KLQkJCSAqCi0JCQkgKiBJZiB0aGlzIGlzIGEgc2F2ZSBmaWxlLCBhbmQgaXQncyBmcm9tIGEKLQkJCSAqIG1hY2hpbmUgd2l0aCB0aGUgb3Bwb3NpdGUgYnl0ZSBvcmRlciB0bwotCQkJICogb3Vycywgd2UgYnl0ZS1zd2FwIHRoZSBBRl8gdmFsdWUuCi0JCQkgKgotCQkJICogVGhlbiB3ZSBydW4gaXQgdGhyb3VnaCAiaHRvbmwoKSIsIGFuZAotCQkJICogZ2VuZXJhdGUgY29kZSB0byBjb21wYXJlIGFnYWluc3QgdGhlIHJlc3VsdC4KLQkJCSAqLwotCQkJaWYgKGJwZl9wY2FwLT5yZmlsZSAhPSBOVUxMICYmIGJwZl9wY2FwLT5zd2FwcGVkKQotCQkJCXByb3RvID0gU1dBUExPTkcocHJvdG8pOwotCQkJcHJvdG8gPSBodG9ubChwcm90byk7Ci0JCX0KLQkJcmV0dXJuIChnZW5fY21wKE9SX0xJTktIRFIsIDAsIEJQRl9XLCAoYnBmX2ludDMyKXByb3RvKSk7Ci0KICNpZmRlZiBIQVZFX05FVF9QRlZBUl9ICiAJY2FzZSBETFRfUEZMT0c6CiAJCS8qCkBAIC0zMTE0LDEzICszMjc1LDEzIEBACiAJCSAqIHRoZSBwYWNrZXQuCiAJCSAqLwogCQlpZiAocHJvdG8gPT0gRVRIRVJUWVBFX0lQKQotCQkJcmV0dXJuIChnZW5fY21wKE9SX0xJTktIRFIsIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgYWYpLAorCQkJcmV0dXJuIChnZW5fY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBhZiksCiAJCQkgICAgQlBGX0IsIChicGZfaW50MzIpQUZfSU5FVCkpOwogCQllbHNlIGlmIChwcm90byA9PSBFVEhFUlRZUEVfSVBWNikKLQkJCXJldHVybiAoZ2VuX2NtcChPUl9MSU5LSERSLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIGFmKSwKKwkJCXJldHVybiAoZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktIRFIsIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgYWYpLAogCQkJICAgIEJQRl9CLCAoYnBmX2ludDMyKUFGX0lORVQ2KSk7CiAJCWVsc2UKLQkJCXJldHVybiBnZW5fZmFsc2UoKTsKKwkJCXJldHVybiBnZW5fZmFsc2UoY3N0YXRlKTsKIAkJLypOT1RSRUFDSEVEKi8KIAkJYnJlYWs7CiAjZW5kaWYgLyogSEFWRV9ORVRfUEZWQVJfSCAqLwpAQCAtMzEzNCwzNCArMzI5NSwzNCBAQAogCQlzd2l0Y2ggKHByb3RvKSB7CiAKIAkJZGVmYXVsdDoKLQkJCXJldHVybiBnZW5fZmFsc2UoKTsKKwkJCXJldHVybiBnZW5fZmFsc2UoY3N0YXRlKTsKIAogCQljYXNlIEVUSEVSVFlQRV9JUFY2OgotCQkJcmV0dXJuIChnZW5fY21wKE9SX0xJTktUWVBFLCAwLCBCUEZfQiwKKwkJCXJldHVybiAoZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfQiwKIAkJCQkoYnBmX2ludDMyKUFSQ1RZUEVfSU5FVDYpKTsKIAogCQljYXNlIEVUSEVSVFlQRV9JUDoKLQkJCWIwID0gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0IsCisJCQliMCA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LVFlQRSwgMCwgQlBGX0IsCiAJCQkJICAgICAoYnBmX2ludDMyKUFSQ1RZUEVfSVApOwotCQkJYjEgPSBnZW5fY21wKE9SX0xJTktUWVBFLCAwLCBCUEZfQiwKKwkJCWIxID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfQiwKIAkJCQkgICAgIChicGZfaW50MzIpQVJDVFlQRV9JUF9PTEQpOwogCQkJZ2VuX29yKGIwLCBiMSk7CiAJCQlyZXR1cm4gKGIxKTsKIAogCQljYXNlIEVUSEVSVFlQRV9BUlA6Ci0JCQliMCA9IGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9CLAorCQkJYjAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1RZUEUsIDAsIEJQRl9CLAogCQkJCSAgICAgKGJwZl9pbnQzMilBUkNUWVBFX0FSUCk7Ci0JCQliMSA9IGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9CLAorCQkJYjEgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1RZUEUsIDAsIEJQRl9CLAogCQkJCSAgICAgKGJwZl9pbnQzMilBUkNUWVBFX0FSUF9PTEQpOwogCQkJZ2VuX29yKGIwLCBiMSk7CiAJCQlyZXR1cm4gKGIxKTsKIAogCQljYXNlIEVUSEVSVFlQRV9SRVZBUlA6Ci0JCQlyZXR1cm4gKGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9CLAorCQkJcmV0dXJuIChnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1RZUEUsIDAsIEJQRl9CLAogCQkJCQkoYnBmX2ludDMyKUFSQ1RZUEVfUkVWQVJQKSk7CiAKIAkJY2FzZSBFVEhFUlRZUEVfQVRBTEs6Ci0JCQlyZXR1cm4gKGdlbl9jbXAoT1JfTElOS1RZUEUsIDAsIEJQRl9CLAorCQkJcmV0dXJuIChnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1RZUEUsIDAsIEJQRl9CLAogCQkJCQkoYnBmX2ludDMyKUFSQ1RZUEVfQVRBTEspKTsKIAkJfQogCQkvKk5PVFJFQUNIRUQqLwpAQCAtMzE3MCw5ICszMzMxLDkgQEAKIAljYXNlIERMVF9MVEFMSzoKIAkJc3dpdGNoIChwcm90bykgewogCQljYXNlIEVUSEVSVFlQRV9BVEFMSzoKLQkJCXJldHVybiBnZW5fdHJ1ZSgpOworCQkJcmV0dXJuIGdlbl90cnVlKGNzdGF0ZSk7CiAJCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZ2VuX2ZhbHNlKCk7CisJCQlyZXR1cm4gZ2VuX2ZhbHNlKGNzdGF0ZSk7CiAJCX0KIAkJLypOT1RSRUFDSEVEKi8KIAkJYnJlYWs7CkBAIC0zMTg4LDEzICszMzQ5LDEzIEBACiAJCQkvKgogCQkJICogQ2hlY2sgZm9yIHRoZSBzcGVjaWFsIE5MUElEIGZvciBJUC4KIAkJCSAqLwotCQkJcmV0dXJuIGdlbl9jbXAoT1JfTElOS0hEUiwgMiwgQlBGX0gsICgweDAzPDw4KSB8IDB4Y2MpOworCQkJcmV0dXJuIGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LSERSLCAyLCBCUEZfSCwgKDB4MDM8PDgpIHwgMHhjYyk7CiAKIAkJY2FzZSBFVEhFUlRZUEVfSVBWNjoKIAkJCS8qCiAJCQkgKiBDaGVjayBmb3IgdGhlIHNwZWNpYWwgTkxQSUQgZm9yIElQdjYuCiAJCQkgKi8KLQkJCXJldHVybiBnZW5fY21wKE9SX0xJTktIRFIsIDIsIEJQRl9ILCAoMHgwMzw8OCkgfCAweDhlKTsKKwkJCXJldHVybiBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMiwgQlBGX0gsICgweDAzPDw4KSB8IDB4OGUpOwogCiAJCWNhc2UgTExDU0FQX0lTT05TOgogCQkJLyoKQEAgLTMyMDgsMjEgKzMzNjksMjEgQEAKIAkJCSAqIGNvbnRyb2wgZmllbGQgb2YgVUksIGkuZS4gMHgwMyBmb2xsb3dlZAogCQkJICogYnkgdGhlIE5MUElELgogCQkJICovCi0JCQliMCA9IGdlbl9jbXAoT1JfTElOS0hEUiwgMiwgQlBGX0gsICgweDAzPDw4KSB8IElTTzg0NzNfQ0xOUCk7Ci0JCQliMSA9IGdlbl9jbXAoT1JfTElOS0hEUiwgMiwgQlBGX0gsICgweDAzPDw4KSB8IElTTzk1NDJfRVNJUyk7Ci0JCQliMiA9IGdlbl9jbXAoT1JfTElOS0hEUiwgMiwgQlBGX0gsICgweDAzPDw4KSB8IElTTzEwNTg5X0lTSVMpOworCQkJYjAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMiwgQlBGX0gsICgweDAzPDw4KSB8IElTTzg0NzNfQ0xOUCk7CisJCQliMSA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LSERSLCAyLCBCUEZfSCwgKDB4MDM8PDgpIHwgSVNPOTU0Ml9FU0lTKTsKKwkJCWIyID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktIRFIsIDIsIEJQRl9ILCAoMHgwMzw8OCkgfCBJU08xMDU4OV9JU0lTKTsKIAkJCWdlbl9vcihiMSwgYjIpOwogCQkJZ2VuX29yKGIwLCBiMik7CiAJCQlyZXR1cm4gYjI7CiAKIAkJZGVmYXVsdDoKLQkJCXJldHVybiBnZW5fZmFsc2UoKTsKKwkJCXJldHVybiBnZW5fZmFsc2UoY3N0YXRlKTsKIAkJfQogCQkvKk5PVFJFQUNIRUQqLwogCQlicmVhazsKIAogCWNhc2UgRExUX01GUjoKLQkJYnBmX2Vycm9yKCJNdWx0aS1saW5rIEZyYW1lIFJlbGF5IGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJNdWx0aS1saW5rIEZyYW1lIFJlbGF5IGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKICAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9NRlI6CiAgICAgICAgIGNhc2UgRExUX0pVTklQRVJfTUxGUjoKQEAgLTMyNTQsOTkgKzM0MTUsMTAwIEBACiAJCSAqCiAJCSAqIEZJWE1FIGVuY2Fwc3VsYXRpb24gc3BlY2lmaWMgQlBGXyBmaWx0ZXJzCiAJCSAqLwotCQlyZXR1cm4gZ2VuX21jbXAoT1JfTElOS0hEUiwgMCwgQlBGX1csIDB4NGQ0NzQzMDAsIDB4ZmZmZmZmMDApOyAvKiBjb21wYXJlIHRoZSBtYWdpYyBudW1iZXIgKi8KKwkJcmV0dXJuIGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX1csIDB4NGQ0NzQzMDAsIDB4ZmZmZmZmMDApOyAvKiBjb21wYXJlIHRoZSBtYWdpYyBudW1iZXIgKi8KIAogCWNhc2UgRExUX0JBQ05FVF9NU19UUDoKLQkJcmV0dXJuIGdlbl9tY21wKE9SX0xJTktIRFIsIDAsIEJQRl9XLCAweDU1RkYwMDAwLCAweGZmZmYwMDAwKTsKKwkJcmV0dXJuIGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX1csIDB4NTVGRjAwMDAsIDB4ZmZmZjAwMDApOwogCiAJY2FzZSBETFRfSVBORVQ6Ci0JCXJldHVybiBnZW5faXBuZXRfbGlua3R5cGUocHJvdG8pOworCQlyZXR1cm4gZ2VuX2lwbmV0X2xpbmt0eXBlKGNzdGF0ZSwgcHJvdG8pOwogCiAJY2FzZSBETFRfTElOVVhfSVJEQToKLQkJYnBmX2Vycm9yKCJJckRBIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJJckRBIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIERMVF9ET0NTSVM6Ci0JCWJwZl9lcnJvcigiRE9DU0lTIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJET0NTSVMgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAogCWNhc2UgRExUX01UUDI6CiAJY2FzZSBETFRfTVRQMl9XSVRIX1BIRFI6Ci0JCWJwZl9lcnJvcigiTVRQMiBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiTVRQMiBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBETFRfRVJGOgotCQlicGZfZXJyb3IoIkVSRiBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiRVJGIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIERMVF9QRlNZTkM6Ci0JCWJwZl9lcnJvcigiUEZTWU5DIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJQRlNZTkMgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAogCWNhc2UgRExUX0xJTlVYX0xBUEQ6Ci0JCWJwZl9lcnJvcigiTEFQRCBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiTEFQRCBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCi0JY2FzZSBETFRfVVNCOgorCWNhc2UgRExUX1VTQl9GUkVFQlNEOgogCWNhc2UgRExUX1VTQl9MSU5VWDoKIAljYXNlIERMVF9VU0JfTElOVVhfTU1BUFBFRDoKLQkJYnBmX2Vycm9yKCJVU0IgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKwljYXNlIERMVF9VU0JQQ0FQOgorCQlicGZfZXJyb3IoY3N0YXRlLCAiVVNCIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIERMVF9CTFVFVE9PVEhfSENJX0g0OgogCWNhc2UgRExUX0JMVUVUT09USF9IQ0lfSDRfV0lUSF9QSERSOgotCQlicGZfZXJyb3IoIkJsdWV0b290aCBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiQmx1ZXRvb3RoIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIERMVF9DQU4yMEI6CiAJY2FzZSBETFRfQ0FOX1NPQ0tFVENBTjoKLQkJYnBmX2Vycm9yKCJDQU4gbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIkNBTiBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBETFRfSUVFRTgwMl8xNV80OgogCWNhc2UgRExUX0lFRUU4MDJfMTVfNF9MSU5VWDoKIAljYXNlIERMVF9JRUVFODAyXzE1XzRfTk9OQVNLX1BIWToKIAljYXNlIERMVF9JRUVFODAyXzE1XzRfTk9GQ1M6Ci0JCWJwZl9lcnJvcigiSUVFRSA4MDIuMTUuNCBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiSUVFRSA4MDIuMTUuNCBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBETFRfSUVFRTgwMl8xNl9NQUNfQ1BTX1JBRElPOgotCQlicGZfZXJyb3IoIklFRUUgODAyLjE2IGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJJRUVFIDgwMi4xNiBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBETFRfU0lUQToKLQkJYnBmX2Vycm9yKCJTSVRBIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJTSVRBIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIERMVF9SQUlGMToKLQkJYnBmX2Vycm9yKCJSQUlGMSBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiUkFJRjEgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAogCWNhc2UgRExUX0lQTUI6Ci0JCWJwZl9lcnJvcigiSVBNQiBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiSVBNQiBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBETFRfQVgyNV9LSVNTOgotCQlicGZfZXJyb3IoIkFYLjI1IGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJBWC4yNSBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBETFRfTkZMT0c6CiAJCS8qIFVzaW5nIHRoZSBmaXhlZC1zaXplIE5GTE9HIGhlYWRlciBpdCBpcyBwb3NzaWJsZSB0byB0ZWxsIG9ubHkKIAkJICogdGhlIGFkZHJlc3MgZmFtaWx5IG9mIHRoZSBwYWNrZXQsIG90aGVyIG1lYW5pbmdmdWwgZGF0YSBpcwogCQkgKiBlaXRoZXIgbWlzc2luZyBvciBiZWhpbmQgVExWcy4KIAkJICovCi0JCWJwZl9lcnJvcigiTkZMT0cgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIk5GTE9HIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAlkZWZhdWx0OgogCQkvKgogCQkgKiBEb2VzIHRoaXMgbGluay1sYXllciBoZWFkZXIgdHlwZSBoYXZlIGEgZmllbGQKIAkJICogaW5kaWNhdGluZyB0aGUgdHlwZSBvZiB0aGUgbmV4dCBwcm90b2NvbD8gIElmCiAJCSAqIHNvLCBvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCB3aWxsIGJlIHRoZSBvZmZzZXQgb2YgdGhhdAotCQkgKiBmaWVsZCBpbiB0aGUgcGFja2V0OyBpZiBub3QsIGl0IHdpbGwgYmUgLTEuCisJCSAqIGZpZWxkIGluIHRoZSBwYWNrZXQ7IGlmIG5vdCwgaXQgd2lsbCBiZSBPRkZTRVRfTk9UX1NFVC4KIAkJICovCi0JCWlmIChvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCAhPSAodV9pbnQpLTEpIHsKKwkJaWYgKGNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgIT0gT0ZGU0VUX05PVF9TRVQpIHsKIAkJCS8qCiAJCQkgKiBZZXM7IGFzc3VtZSBpdCdzIGFuIEV0aGVybmV0IHR5cGUuICAoSWYKIAkJCSAqIGl0J3Mgbm90LCBpdCBuZWVkcyB0byBiZSBoYW5kbGVkIHNwZWNpYWxseQogCQkJICogYWJvdmUuKQogCQkJICovCi0JCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOworCQkJcmV0dXJuIGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LVFlQRSwgMCwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIE5vOyByZXBvcnQgYW4gZXJyb3IuCiAJCQkgKi8KLQkJCWRlc2NyaXB0aW9uID0gcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24obGlua3R5cGUpOworCQkJZGVzY3JpcHRpb24gPSBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbihjc3RhdGUtPmxpbmt0eXBlKTsKIAkJCWlmIChkZXNjcmlwdGlvbiAhPSBOVUxMKSB7Ci0JCQkJYnBmX2Vycm9yKCIlcyBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIsCisJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIiVzIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIiwKIAkJCQkgICAgZGVzY3JpcHRpb24pOwogCQkJfSBlbHNlIHsKLQkJCQlicGZfZXJyb3IoIkRMVCAldSBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIsCi0JCQkJICAgIGxpbmt0eXBlKTsKKwkJCQlicGZfZXJyb3IoY3N0YXRlLCAiRExUICV1IGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIiwKKwkJCQkgICAgY3N0YXRlLT5saW5rdHlwZSk7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CkBAIC0zMzYxLDkgKzM1MjMsNyBAQAogICogY29kZSBhbmQgcHJvdG9jb2wgdHlwZSBpbiB0aGUgU05BUCBoZWFkZXIuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3NuYXAob3JnY29kZSwgcHR5cGUpCi0JYnBmX3VfaW50MzIgb3JnY29kZTsKLQlicGZfdV9pbnQzMiBwdHlwZTsKK2dlbl9zbmFwKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgYnBmX3VfaW50MzIgb3JnY29kZSwgYnBmX3VfaW50MzIgcHR5cGUpCiB7CiAJdV9jaGFyIHNuYXBibG9ja1s4XTsKIApAQCAtMzM3NSwzMiArMzUzNSwzMiBAQAogCXNuYXBibG9ja1s1XSA9IChvcmdjb2RlID4+IDApOwkvKiBsb3dlciA4IGJpdHMgb2Ygb3JnYW5pemF0aW9uIGNvZGUgKi8KIAlzbmFwYmxvY2tbNl0gPSAocHR5cGUgPj4gOCk7CS8qIHVwcGVyIDggYml0cyBvZiBwcm90b2NvbCB0eXBlICovCiAJc25hcGJsb2NrWzddID0gKHB0eXBlID4+IDApOwkvKiBsb3dlciA4IGJpdHMgb2YgcHJvdG9jb2wgdHlwZSAqLwotCXJldHVybiBnZW5fYmNtcChPUl9MTEMsIDAsIDgsIHNuYXBibG9jayk7CisJcmV0dXJuIGdlbl9iY21wKGNzdGF0ZSwgT1JfTExDLCAwLCA4LCBzbmFwYmxvY2spOwogfQogCiAvKgogICogR2VuZXJhdGUgY29kZSB0byBtYXRjaCBmcmFtZXMgd2l0aCBhbiBMTEMgaGVhZGVyLgogICovCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2xsYyh2b2lkKQorZ2VuX2xsYyhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJc3RydWN0IGJsb2NrICpiMCwgKmIxOwogCi0Jc3dpdGNoIChsaW5rdHlwZSkgeworCXN3aXRjaCAoY3N0YXRlLT5saW5rdHlwZSkgewogCiAJY2FzZSBETFRfRU4xME1COgogCQkvKgogCQkgKiBXZSBjaGVjayBmb3IgYW4gRXRoZXJuZXQgdHlwZSBmaWVsZCBsZXNzIHRoYW4KIAkJICogMTUwMCwgd2hpY2ggbWVhbnMgaXQncyBhbiA4MDIuMyBsZW5ndGggZmllbGQuCiAJCSAqLwotCQliMCA9IGdlbl9jbXBfZ3QoT1JfTElOS1RZUEUsIDAsIEJQRl9ILCBFVEhFUk1UVSk7CisJCWIwID0gZ2VuX2NtcF9ndChjc3RhdGUsIE9SX0xJTktUWVBFLCAwLCBCUEZfSCwgRVRIRVJNVFUpOwogCQlnZW5fbm90KGIwKTsKIAogCQkvKgogCQkgKiBOb3cgY2hlY2sgZm9yIHRoZSBwdXJwb3J0ZWQgRFNBUCBhbmQgU1NBUCBub3QgYmVpbmcKIAkJICogMHhGRiwgdG8gcnVsZSBvdXQgTmV0V2FyZS1vdmVyLTgwMi4zLgogCQkgKi8KLQkJYjEgPSBnZW5fY21wKE9SX0xMQywgMCwgQlBGX0gsIChicGZfaW50MzIpMHhGRkZGKTsKKwkJYjEgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTExDLCAwLCBCUEZfSCwgKGJwZl9pbnQzMikweEZGRkYpOwogCQlnZW5fbm90KGIxKTsKIAkJZ2VuX2FuZChiMCwgYjEpOwogCQlyZXR1cm4gYjE7CkBAIC0zNDA5LDIwICszNTY5LDIwIEBACiAJCS8qCiAJCSAqIFdlIGNoZWNrIGZvciBMTEMgdHJhZmZpYy4KIAkJICovCi0JCWIwID0gZ2VuX2F0bXR5cGVfYWJicmV2KEFfTExDKTsKKwkJYjAgPSBnZW5fYXRtdHlwZV9hYmJyZXYoY3N0YXRlLCBBX0xMQyk7CiAJCXJldHVybiBiMDsKIAogCWNhc2UgRExUX0lFRUU4MDI6CS8qIFRva2VuIFJpbmcgKi8KIAkJLyoKIAkJICogWFhYIC0gY2hlY2sgZm9yIExMQyBmcmFtZXMuCiAJCSAqLwotCQlyZXR1cm4gZ2VuX3RydWUoKTsKKwkJcmV0dXJuIGdlbl90cnVlKGNzdGF0ZSk7CiAKIAljYXNlIERMVF9GRERJOgogCQkvKgogCQkgKiBYWFggLSBjaGVjayBmb3IgTExDIGZyYW1lcy4KIAkJICovCi0JCXJldHVybiBnZW5fdHJ1ZSgpOworCQlyZXR1cm4gZ2VuX3RydWUoY3N0YXRlKTsKIAogCWNhc2UgRExUX0FUTV9SRkMxNDgzOgogCQkvKgpAQCAtMzQzMyw3ICszNTkzLDcgQEAKIAkJICogd2F5IHRvIGNoZWNrIGZvciB0aGF0OyB0aGUgcHJvdG9jb2wgdXNlZCBvbiB0aGUgVkMKIAkJICogaXMgbmVnb3RpYXRlZCBvdXQgb2YgYmFuZC4KIAkJICovCi0JCXJldHVybiBnZW5fdHJ1ZSgpOworCQlyZXR1cm4gZ2VuX3RydWUoY3N0YXRlKTsKIAogCWNhc2UgRExUX0lFRUU4MDJfMTE6CiAJY2FzZSBETFRfUFJJU01fSEVBREVSOgpAQCAtMzQ0MywxNyArMzYwMywxNyBAQAogCQkvKgogCQkgKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBkYXRhIGZyYW1lLgogCQkgKi8KLQkJYjAgPSBnZW5fY2hlY2tfODAyXzExX2RhdGFfZnJhbWUoKTsKKwkJYjAgPSBnZW5fY2hlY2tfODAyXzExX2RhdGFfZnJhbWUoY3N0YXRlKTsKIAkJcmV0dXJuIGIwOwogCiAJZGVmYXVsdDoKLQkJYnBmX2Vycm9yKCInbGxjJyBub3Qgc3VwcG9ydGVkIGZvciBsaW5rdHlwZSAlZCIsIGxpbmt0eXBlKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidsbGMnIG5vdCBzdXBwb3J0ZWQgZm9yIGxpbmt0eXBlICVkIiwgY3N0YXRlLT5saW5rdHlwZSk7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAl9CiB9CiAKIHN0cnVjdCBibG9jayAqCi1nZW5fbGxjX2kodm9pZCkKK2dlbl9sbGNfaShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJc3RydWN0IGJsb2NrICpiMCwgKmIxOwogCXN0cnVjdCBzbGlzdCAqczsKQEAgLTM0NjEsMTQgKzM2MjEsMTQgQEAKIAkvKgogCSAqIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBMTEMgZnJhbWUuCiAJICovCi0JYjAgPSBnZW5fbGxjKCk7CisJYjAgPSBnZW5fbGxjKGNzdGF0ZSk7CiAKIAkvKgogCSAqIExvYWQgdGhlIGNvbnRyb2wgYnl0ZSBhbmQgdGVzdCB0aGUgbG93LW9yZGVyIGJpdDsgaXQgbXVzdAogCSAqIGJlIGNsZWFyIGZvciBJIGZyYW1lcy4KIAkgKi8KLQlzID0gZ2VuX2xvYWRfYShPUl9MTEMsIDIsIEJQRl9CKTsKLQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwlzID0gZ2VuX2xvYWRfYShjc3RhdGUsIE9SX0xMQywgMiwgQlBGX0IpOworCWIxID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJYjEtPnMuayA9IDB4MDE7CiAJYjEtPnN0bXRzID0gczsKIAlnZW5fbm90KGIxKTsKQEAgLTM0NzcsNzUgKzM2MzcsNzUgQEAKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9sbGNfcyh2b2lkKQorZ2VuX2xsY19zKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSkKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CiAKIAkvKgogCSAqIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBMTEMgZnJhbWUuCiAJICovCi0JYjAgPSBnZW5fbGxjKCk7CisJYjAgPSBnZW5fbGxjKGNzdGF0ZSk7CiAKIAkvKgogCSAqIE5vdyBjb21wYXJlIHRoZSBsb3ctb3JkZXIgMiBiaXQgb2YgdGhlIGNvbnRyb2wgYnl0ZSBhZ2FpbnN0CiAJICogdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZvciBTIGZyYW1lcy4KIAkgKi8KLQliMSA9IGdlbl9tY21wKE9SX0xMQywgMiwgQlBGX0IsIExMQ19TX0ZNVCwgMHgwMyk7CisJYjEgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xMQywgMiwgQlBGX0IsIExMQ19TX0ZNVCwgMHgwMyk7CiAJZ2VuX2FuZChiMCwgYjEpOwogCXJldHVybiBiMTsKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9sbGNfdSh2b2lkKQorZ2VuX2xsY191KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSkKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CiAKIAkvKgogCSAqIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBMTEMgZnJhbWUuCiAJICovCi0JYjAgPSBnZW5fbGxjKCk7CisJYjAgPSBnZW5fbGxjKGNzdGF0ZSk7CiAKIAkvKgogCSAqIE5vdyBjb21wYXJlIHRoZSBsb3ctb3JkZXIgMiBiaXQgb2YgdGhlIGNvbnRyb2wgYnl0ZSBhZ2FpbnN0CiAJICogdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZvciBVIGZyYW1lcy4KIAkgKi8KLQliMSA9IGdlbl9tY21wKE9SX0xMQywgMiwgQlBGX0IsIExMQ19VX0ZNVCwgMHgwMyk7CisJYjEgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xMQywgMiwgQlBGX0IsIExMQ19VX0ZNVCwgMHgwMyk7CiAJZ2VuX2FuZChiMCwgYjEpOwogCXJldHVybiBiMTsKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9sbGNfc19zdWJ0eXBlKGJwZl91X2ludDMyIHN1YnR5cGUpCitnZW5fbGxjX3Nfc3VidHlwZShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGJwZl91X2ludDMyIHN1YnR5cGUpCiB7CiAJc3RydWN0IGJsb2NrICpiMCwgKmIxOwogCiAJLyoKIAkgKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gTExDIGZyYW1lLgogCSAqLwotCWIwID0gZ2VuX2xsYygpOworCWIwID0gZ2VuX2xsYyhjc3RhdGUpOwogCiAJLyoKIAkgKiBOb3cgY2hlY2sgZm9yIGFuIFMgZnJhbWUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KIAkgKi8KLQliMSA9IGdlbl9tY21wKE9SX0xMQywgMiwgQlBGX0IsIHN1YnR5cGUsIExMQ19TX0NNRF9NQVNLKTsKKwliMSA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTExDLCAyLCBCUEZfQiwgc3VidHlwZSwgTExDX1NfQ01EX01BU0spOwogCWdlbl9hbmQoYjAsIGIxKTsKIAlyZXR1cm4gYjE7CiB9CiAKIHN0cnVjdCBibG9jayAqCi1nZW5fbGxjX3Vfc3VidHlwZShicGZfdV9pbnQzMiBzdWJ0eXBlKQorZ2VuX2xsY191X3N1YnR5cGUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBicGZfdV9pbnQzMiBzdWJ0eXBlKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMTsKIAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIExMQyBmcmFtZS4KIAkgKi8KLQliMCA9IGdlbl9sbGMoKTsKKwliMCA9IGdlbl9sbGMoY3N0YXRlKTsKIAogCS8qCiAJICogTm93IGNoZWNrIGZvciBhIFUgZnJhbWUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KIAkgKi8KLQliMSA9IGdlbl9tY21wKE9SX0xMQywgMiwgQlBGX0IsIHN1YnR5cGUsIExMQ19VX0NNRF9NQVNLKTsKKwliMSA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTExDLCAyLCBCUEZfQiwgc3VidHlwZSwgTExDX1VfQ01EX01BU0spOwogCWdlbl9hbmQoYjAsIGIxKTsKIAlyZXR1cm4gYjE7CiB9CkBAIC0zNTYzLDggKzM3MjMsNyBAQAogICogcHJvdG9jb2wgSUQgaW4gYSBTTkFQIGhlYWRlci4KICAqLwogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fbGxjX2xpbmt0eXBlKHByb3RvKQotCWludCBwcm90bzsKK2dlbl9sbGNfbGlua3R5cGUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgcHJvdG8pCiB7CiAJLyoKIAkgKiBYWFggLSBoYW5kbGUgdG9rZW4tcmluZyB2YXJpYWJsZS1sZW5ndGggaGVhZGVyLgpAQCAtMzU3OSw3ICszNzM4LDcgQEAKIAkJICogU1NBUCwgbGlrZSB0aGlzLCBvciBzaG91bGQgd2UgY2hlY2sganVzdCB0aGUKIAkJICogRFNBUCwgYXMgd2UgZG8gZm9yIG90aGVyIFNBUCB2YWx1ZXM/CiAJCSAqLwotCQlyZXR1cm4gZ2VuX2NtcChPUl9MTEMsIDAsIEJQRl9ILCAoYnBmX3VfaW50MzIpCisJCXJldHVybiBnZW5fY21wKGNzdGF0ZSwgT1JfTExDLCAwLCBCUEZfSCwgKGJwZl91X2ludDMyKQogCQkJICAgICAoKHByb3RvIDw8IDgpIHwgcHJvdG8pKTsKIAogCWNhc2UgTExDU0FQX0lQWDoKQEAgLTM1ODcsNyArMzc0Niw3IEBACiAJCSAqIFhYWCAtIGFyZSB0aGVyZSBldmVyIFNOQVAgZnJhbWVzIGZvciBJUFggb24KIAkJICogbm9uLUV0aGVybmV0IDgwMi54IG5ldHdvcmtzPwogCQkgKi8KLQkJcmV0dXJuIGdlbl9jbXAoT1JfTExDLCAwLCBCUEZfQiwKKwkJcmV0dXJuIGdlbl9jbXAoY3N0YXRlLCBPUl9MTEMsIDAsIEJQRl9CLAogCQkgICAgKGJwZl9pbnQzMilMTENTQVBfSVBYKTsKIAogCWNhc2UgRVRIRVJUWVBFX0FUQUxLOgpAQCAtMzYwMCw3ICszNzU5LDcgQEAKIAkJICogWFhYIC0gY2hlY2sgZm9yIGFuIG9yZ2FuaXphdGlvbiBjb2RlIG9mCiAJCSAqIGVuY2Fwc3VsYXRlZCBFdGhlcm5ldCBhcyB3ZWxsPwogCQkgKi8KLQkJcmV0dXJuIGdlbl9zbmFwKDB4MDgwMDA3LCBFVEhFUlRZUEVfQVRBTEspOworCQlyZXR1cm4gZ2VuX3NuYXAoY3N0YXRlLCAweDA4MDAwNywgRVRIRVJUWVBFX0FUQUxLKTsKIAogCWRlZmF1bHQ6CiAJCS8qCkBAIC0zNjEyLDcgKzM3NzEsNyBAQAogCQkJICogVGhpcyBpcyBhbiBMTEMgU0FQIHZhbHVlLCBzbyBjaGVjawogCQkJICogdGhlIERTQVAuCiAJCQkgKi8KLQkJCXJldHVybiBnZW5fY21wKE9SX0xMQywgMCwgQlBGX0IsIChicGZfaW50MzIpcHJvdG8pOworCQkJcmV0dXJuIGdlbl9jbXAoY3N0YXRlLCBPUl9MTEMsIDAsIEJQRl9CLCAoYnBmX2ludDMyKXByb3RvKTsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBUaGlzIGlzIGFuIEV0aGVybmV0IHR5cGU7IHdlIGFzc3VtZSB0aGF0IGl0J3MKQEAgLTM2MjcsMjMgKzM3ODYsMjAgQEAKIAkJCSAqIG9yZ2FuaXphdGlvbiBjb2RlIG9mIDB4MDAwMDAwIChlbmNhcHN1bGF0ZWQKIAkJCSAqIEV0aGVybmV0KSwgd2UnZCBkbwogCQkJICoKLQkJCSAqCXJldHVybiBnZW5fc25hcCgweDAwMDAwMCwgcHJvdG8pOworCQkJICoJcmV0dXJuIGdlbl9zbmFwKGNzdGF0ZSwgMHgwMDAwMDAsIHByb3RvKTsKIAkJCSAqCiAJCQkgKiBoZXJlOyBmb3Igbm93LCB3ZSBkb24ndCwgYXMgcGVyIHRoZSBhYm92ZS4KIAkJCSAqIEkgZG9uJ3Qga25vdyB3aGV0aGVyIGl0J3Mgd29ydGggdGhlIGV4dHJhIENQVQogCQkJICogdGltZSB0byBkbyB0aGUgcmlnaHQgY2hlY2sgb3Igbm90LgogCQkJICovCi0JCQlyZXR1cm4gZ2VuX2NtcChPUl9MTEMsIDYsIEJQRl9ILCAoYnBmX2ludDMyKXByb3RvKTsKKwkJCXJldHVybiBnZW5fY21wKGNzdGF0ZSwgT1JfTExDLCA2LCBCUEZfSCwgKGJwZl9pbnQzMilwcm90byk7CiAJCX0KIAl9CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2hvc3RvcChhZGRyLCBtYXNrLCBkaXIsIHByb3RvLCBzcmNfb2ZmLCBkc3Rfb2ZmKQotCWJwZl91X2ludDMyIGFkZHI7Ci0JYnBmX3VfaW50MzIgbWFzazsKLQlpbnQgZGlyLCBwcm90bzsKLQl1X2ludCBzcmNfb2ZmLCBkc3Rfb2ZmOworZ2VuX2hvc3RvcChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGJwZl91X2ludDMyIGFkZHIsIGJwZl91X2ludDMyIG1hc2ssCisgICAgaW50IGRpciwgaW50IHByb3RvLCB1X2ludCBzcmNfb2ZmLCB1X2ludCBkc3Rfb2ZmKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMTsKIAl1X2ludCBvZmZzZXQ7CkBAIC0zNjU5LDM0ICszODE1LDMxIEBACiAJCWJyZWFrOwogCiAJY2FzZSBRX0FORDoKLQkJYjAgPSBnZW5faG9zdG9wKGFkZHIsIG1hc2ssIFFfU1JDLCBwcm90bywgc3JjX29mZiwgZHN0X29mZik7Ci0JCWIxID0gZ2VuX2hvc3RvcChhZGRyLCBtYXNrLCBRX0RTVCwgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOworCQliMCA9IGdlbl9ob3N0b3AoY3N0YXRlLCBhZGRyLCBtYXNrLCBRX1NSQywgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOworCQliMSA9IGdlbl9ob3N0b3AoY3N0YXRlLCBhZGRyLCBtYXNrLCBRX0RTVCwgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIAogCWNhc2UgUV9PUjoKIAljYXNlIFFfREVGQVVMVDoKLQkJYjAgPSBnZW5faG9zdG9wKGFkZHIsIG1hc2ssIFFfU1JDLCBwcm90bywgc3JjX29mZiwgZHN0X29mZik7Ci0JCWIxID0gZ2VuX2hvc3RvcChhZGRyLCBtYXNrLCBRX0RTVCwgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOworCQliMCA9IGdlbl9ob3N0b3AoY3N0YXRlLCBhZGRyLCBtYXNrLCBRX1NSQywgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOworCQliMSA9IGdlbl9ob3N0b3AoY3N0YXRlLCBhZGRyLCBtYXNrLCBRX0RTVCwgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCiAJZGVmYXVsdDoKIAkJYWJvcnQoKTsKIAl9Ci0JYjAgPSBnZW5fbGlua3R5cGUocHJvdG8pOwotCWIxID0gZ2VuX21jbXAoT1JfTElOS1BMLCBvZmZzZXQsIEJQRl9XLCAoYnBmX2ludDMyKWFkZHIsIG1hc2spOworCWIwID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgcHJvdG8pOworCWIxID0gZ2VuX21jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIG9mZnNldCwgQlBGX1csIChicGZfaW50MzIpYWRkciwgbWFzayk7CiAJZ2VuX2FuZChiMCwgYjEpOwogCXJldHVybiBiMTsKIH0KIAogI2lmZGVmIElORVQ2CiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9ob3N0b3A2KGFkZHIsIG1hc2ssIGRpciwgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpCi0Jc3RydWN0IGluNl9hZGRyICphZGRyOwotCXN0cnVjdCBpbjZfYWRkciAqbWFzazsKLQlpbnQgZGlyLCBwcm90bzsKLQl1X2ludCBzcmNfb2ZmLCBkc3Rfb2ZmOworZ2VuX2hvc3RvcDYoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCisgICAgc3RydWN0IGluNl9hZGRyICptYXNrLCBpbnQgZGlyLCBpbnQgcHJvdG8sIHVfaW50IHNyY19vZmYsIHVfaW50IGRzdF9vZmYpCiB7CiAJc3RydWN0IGJsb2NrICpiMCwgKmIxOwogCXVfaW50IG9mZnNldDsKQEAgLTM3MDMsMTUgKzM4NTYsMTUgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFFfQU5EOgotCQliMCA9IGdlbl9ob3N0b3A2KGFkZHIsIG1hc2ssIFFfU1JDLCBwcm90bywgc3JjX29mZiwgZHN0X29mZik7Ci0JCWIxID0gZ2VuX2hvc3RvcDYoYWRkciwgbWFzaywgUV9EU1QsIHByb3RvLCBzcmNfb2ZmLCBkc3Rfb2ZmKTsKKwkJYjAgPSBnZW5faG9zdG9wNihjc3RhdGUsIGFkZHIsIG1hc2ssIFFfU1JDLCBwcm90bywgc3JjX29mZiwgZHN0X29mZik7CisJCWIxID0gZ2VuX2hvc3RvcDYoY3N0YXRlLCBhZGRyLCBtYXNrLCBRX0RTVCwgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIAogCWNhc2UgUV9PUjoKIAljYXNlIFFfREVGQVVMVDoKLQkJYjAgPSBnZW5faG9zdG9wNihhZGRyLCBtYXNrLCBRX1NSQywgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOwotCQliMSA9IGdlbl9ob3N0b3A2KGFkZHIsIG1hc2ssIFFfRFNULCBwcm90bywgc3JjX29mZiwgZHN0X29mZik7CisJCWIwID0gZ2VuX2hvc3RvcDYoY3N0YXRlLCBhZGRyLCBtYXNrLCBRX1NSQywgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOworCQliMSA9IGdlbl9ob3N0b3A2KGNzdGF0ZSwgYWRkciwgbWFzaywgUV9EU1QsIHByb3RvLCBzcmNfb2ZmLCBkc3Rfb2ZmKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIApAQCAtMzcyMSw2OCArMzg3NCw2NiBAQAogCS8qIHRoaXMgb3JkZXIgaXMgaW1wb3J0YW50ICovCiAJYSA9ICh1X2ludDMyX3QgKilhZGRyOwogCW0gPSAodV9pbnQzMl90ICopbWFzazsKLQliMSA9IGdlbl9tY21wKE9SX0xJTktQTCwgb2Zmc2V0ICsgMTIsIEJQRl9XLCBudG9obChhWzNdKSwgbnRvaGwobVszXSkpOwotCWIwID0gZ2VuX21jbXAoT1JfTElOS1BMLCBvZmZzZXQgKyA4LCBCUEZfVywgbnRvaGwoYVsyXSksIG50b2hsKG1bMl0pKTsKKwliMSA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS1BMLCBvZmZzZXQgKyAxMiwgQlBGX1csIG50b2hsKGFbM10pLCBudG9obChtWzNdKSk7CisJYjAgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktQTCwgb2Zmc2V0ICsgOCwgQlBGX1csIG50b2hsKGFbMl0pLCBudG9obChtWzJdKSk7CiAJZ2VuX2FuZChiMCwgYjEpOwotCWIwID0gZ2VuX21jbXAoT1JfTElOS1BMLCBvZmZzZXQgKyA0LCBCUEZfVywgbnRvaGwoYVsxXSksIG50b2hsKG1bMV0pKTsKKwliMCA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS1BMLCBvZmZzZXQgKyA0LCBCUEZfVywgbnRvaGwoYVsxXSksIG50b2hsKG1bMV0pKTsKIAlnZW5fYW5kKGIwLCBiMSk7Ci0JYjAgPSBnZW5fbWNtcChPUl9MSU5LUEwsIG9mZnNldCArIDAsIEJQRl9XLCBudG9obChhWzBdKSwgbnRvaGwobVswXSkpOworCWIwID0gZ2VuX21jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIG9mZnNldCArIDAsIEJQRl9XLCBudG9obChhWzBdKSwgbnRvaGwobVswXSkpOwogCWdlbl9hbmQoYjAsIGIxKTsKLQliMCA9IGdlbl9saW5rdHlwZShwcm90byk7CisJYjAgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBwcm90byk7CiAJZ2VuX2FuZChiMCwgYjEpOwogCXJldHVybiBiMTsKIH0KICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9laG9zdG9wKGVhZGRyLCBkaXIpCi0JcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplYWRkcjsKLQlyZWdpc3RlciBpbnQgZGlyOworZ2VuX2Vob3N0b3AoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBjb25zdCB1X2NoYXIgKmVhZGRyLCBpbnQgZGlyKQogewogCXJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjAsICpiMTsKIAogCXN3aXRjaCAoZGlyKSB7CiAJY2FzZSBRX1NSQzoKLQkJcmV0dXJuIGdlbl9iY21wKE9SX0xJTktIRFIsIDYsIDYsIGVhZGRyKTsKKwkJcmV0dXJuIGdlbl9iY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgNiwgNiwgZWFkZHIpOwogCiAJY2FzZSBRX0RTVDoKLQkJcmV0dXJuIGdlbl9iY21wKE9SX0xJTktIRFIsIDAsIDYsIGVhZGRyKTsKKwkJcmV0dXJuIGdlbl9iY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgNiwgZWFkZHIpOwogCiAJY2FzZSBRX0FORDoKLQkJYjAgPSBnZW5fZWhvc3RvcChlYWRkciwgUV9TUkMpOwotCQliMSA9IGdlbl9laG9zdG9wKGVhZGRyLCBRX0RTVCk7CisJCWIwID0gZ2VuX2Vob3N0b3AoY3N0YXRlLCBlYWRkciwgUV9TUkMpOworCQliMSA9IGdlbl9laG9zdG9wKGNzdGF0ZSwgZWFkZHIsIFFfRFNUKTsKIAkJZ2VuX2FuZChiMCwgYjEpOwogCQlyZXR1cm4gYjE7CiAKIAljYXNlIFFfREVGQVVMVDoKIAljYXNlIFFfT1I6Ci0JCWIwID0gZ2VuX2Vob3N0b3AoZWFkZHIsIFFfU1JDKTsKLQkJYjEgPSBnZW5fZWhvc3RvcChlYWRkciwgUV9EU1QpOworCQliMCA9IGdlbl9laG9zdG9wKGNzdGF0ZSwgZWFkZHIsIFFfU1JDKTsKKwkJYjEgPSBnZW5fZWhvc3RvcChjc3RhdGUsIGVhZGRyLCBRX0RTVCk7CiAJCWdlbl9vcihiMCwgYjEpOwogCQlyZXR1cm4gYjE7CiAKIAljYXNlIFFfQUREUjE6Ci0JCWJwZl9lcnJvcigiJ2FkZHIxJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEgd2l0aCA4MDIuMTEgaGVhZGVycyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2FkZHIxJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEgd2l0aCA4MDIuMTEgaGVhZGVycyIpOwogCQlicmVhazsKIAogCWNhc2UgUV9BRERSMjoKLQkJYnBmX2Vycm9yKCInYWRkcjInIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSB3aXRoIDgwMi4xMSBoZWFkZXJzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYWRkcjInIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSB3aXRoIDgwMi4xMSBoZWFkZXJzIik7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0FERFIzOgotCQlicGZfZXJyb3IoIidhZGRyMycgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIHdpdGggODAyLjExIGhlYWRlcnMiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidhZGRyMycgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIHdpdGggODAyLjExIGhlYWRlcnMiKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfQUREUjQ6Ci0JCWJwZl9lcnJvcigiJ2FkZHI0JyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEgd2l0aCA4MDIuMTEgaGVhZGVycyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2FkZHI0JyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEgd2l0aCA4MDIuMTEgaGVhZGVycyIpOwogCQlicmVhazsKIAogCWNhc2UgUV9SQToKLQkJYnBmX2Vycm9yKCIncmEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSB3aXRoIDgwMi4xMSBoZWFkZXJzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICIncmEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSB3aXRoIDgwMi4xMSBoZWFkZXJzIik7CiAJCWJyZWFrOwogCiAJY2FzZSBRX1RBOgotCQlicGZfZXJyb3IoIid0YScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIHdpdGggODAyLjExIGhlYWRlcnMiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIid0YScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIHdpdGggODAyLjExIGhlYWRlcnMiKTsKIAkJYnJlYWs7CiAJfQogCWFib3J0KCk7CkBAIC0zNzkzLDU0ICszOTQ0LDUyIEBACiAgKiBMaWtlIGdlbl9laG9zdG9wLCBidXQgZm9yIERMVF9GRERJCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2Zob3N0b3AoZWFkZHIsIGRpcikKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVhZGRyOwotCXJlZ2lzdGVyIGludCBkaXI7CitnZW5fZmhvc3RvcChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGNvbnN0IHVfY2hhciAqZWFkZHIsIGludCBkaXIpCiB7CiAJc3RydWN0IGJsb2NrICpiMCwgKmIxOwogCiAJc3dpdGNoIChkaXIpIHsKIAljYXNlIFFfU1JDOgotCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOS0hEUiwgNiArIDEgKyBwY2FwX2ZkZGlwYWQsIDYsIGVhZGRyKTsKKwkJcmV0dXJuIGdlbl9iY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgNiArIDEgKyBjc3RhdGUtPnBjYXBfZmRkaXBhZCwgNiwgZWFkZHIpOwogCiAJY2FzZSBRX0RTVDoKLQkJcmV0dXJuIGdlbl9iY21wKE9SX0xJTktIRFIsIDAgKyAxICsgcGNhcF9mZGRpcGFkLCA2LCBlYWRkcik7CisJCXJldHVybiBnZW5fYmNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDAgKyAxICsgY3N0YXRlLT5wY2FwX2ZkZGlwYWQsIDYsIGVhZGRyKTsKIAogCWNhc2UgUV9BTkQ6Ci0JCWIwID0gZ2VuX2Zob3N0b3AoZWFkZHIsIFFfU1JDKTsKLQkJYjEgPSBnZW5fZmhvc3RvcChlYWRkciwgUV9EU1QpOworCQliMCA9IGdlbl9maG9zdG9wKGNzdGF0ZSwgZWFkZHIsIFFfU1JDKTsKKwkJYjEgPSBnZW5fZmhvc3RvcChjc3RhdGUsIGVhZGRyLCBRX0RTVCk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCiAJY2FzZSBRX0RFRkFVTFQ6CiAJY2FzZSBRX09SOgotCQliMCA9IGdlbl9maG9zdG9wKGVhZGRyLCBRX1NSQyk7Ci0JCWIxID0gZ2VuX2Zob3N0b3AoZWFkZHIsIFFfRFNUKTsKKwkJYjAgPSBnZW5fZmhvc3RvcChjc3RhdGUsIGVhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX2Zob3N0b3AoY3N0YXRlLCBlYWRkciwgUV9EU1QpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCiAJY2FzZSBRX0FERFIxOgotCQlicGZfZXJyb3IoIidhZGRyMScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYWRkcjEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOwogCQlicmVhazsKIAogCWNhc2UgUV9BRERSMjoKLQkJYnBmX2Vycm9yKCInYWRkcjInIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2FkZHIyJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfQUREUjM6Ci0JCWJwZl9lcnJvcigiJ2FkZHIzJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidhZGRyMycgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0FERFI0OgotCQlicGZfZXJyb3IoIidhZGRyNCcgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYWRkcjQnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOwogCQlicmVhazsKIAogCWNhc2UgUV9SQToKLQkJYnBmX2Vycm9yKCIncmEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3JhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfVEE6Ci0JCWJwZl9lcnJvcigiJ3RhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIid0YScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CiAJCWJyZWFrOwogCX0KIAlhYm9ydCgpOwpAQCAtMzg1MSw1NCArNDAwMCw1MiBAQAogICogTGlrZSBnZW5fZWhvc3RvcCwgYnV0IGZvciBETFRfSUVFRTgwMiAoVG9rZW4gUmluZykKICAqLwogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fdGhvc3RvcChlYWRkciwgZGlyKQotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZWFkZHI7Ci0JcmVnaXN0ZXIgaW50IGRpcjsKK2dlbl90aG9zdG9wKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgdV9jaGFyICplYWRkciwgaW50IGRpcikKIHsKIAlyZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CiAKIAlzd2l0Y2ggKGRpcikgewogCWNhc2UgUV9TUkM6Ci0JCXJldHVybiBnZW5fYmNtcChPUl9MSU5LSERSLCA4LCA2LCBlYWRkcik7CisJCXJldHVybiBnZW5fYmNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDgsIDYsIGVhZGRyKTsKIAogCWNhc2UgUV9EU1Q6Ci0JCXJldHVybiBnZW5fYmNtcChPUl9MSU5LSERSLCAyLCA2LCBlYWRkcik7CisJCXJldHVybiBnZW5fYmNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDIsIDYsIGVhZGRyKTsKIAogCWNhc2UgUV9BTkQ6Ci0JCWIwID0gZ2VuX3Rob3N0b3AoZWFkZHIsIFFfU1JDKTsKLQkJYjEgPSBnZW5fdGhvc3RvcChlYWRkciwgUV9EU1QpOworCQliMCA9IGdlbl90aG9zdG9wKGNzdGF0ZSwgZWFkZHIsIFFfU1JDKTsKKwkJYjEgPSBnZW5fdGhvc3RvcChjc3RhdGUsIGVhZGRyLCBRX0RTVCk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCiAJY2FzZSBRX0RFRkFVTFQ6CiAJY2FzZSBRX09SOgotCQliMCA9IGdlbl90aG9zdG9wKGVhZGRyLCBRX1NSQyk7Ci0JCWIxID0gZ2VuX3Rob3N0b3AoZWFkZHIsIFFfRFNUKTsKKwkJYjAgPSBnZW5fdGhvc3RvcChjc3RhdGUsIGVhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX3Rob3N0b3AoY3N0YXRlLCBlYWRkciwgUV9EU1QpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCiAJY2FzZSBRX0FERFIxOgotCQlicGZfZXJyb3IoIidhZGRyMScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYWRkcjEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOwogCQlicmVhazsKIAogCWNhc2UgUV9BRERSMjoKLQkJYnBmX2Vycm9yKCInYWRkcjInIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2FkZHIyJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfQUREUjM6Ci0JCWJwZl9lcnJvcigiJ2FkZHIzJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidhZGRyMycgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0FERFI0OgotCQlicGZfZXJyb3IoIidhZGRyNCcgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYWRkcjQnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOwogCQlicmVhazsKIAogCWNhc2UgUV9SQToKLQkJYnBmX2Vycm9yKCIncmEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3JhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfVEE6Ci0JCWJwZl9lcnJvcigiJ3RhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIid0YScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CiAJCWJyZWFrOwogCX0KIAlhYm9ydCgpOwpAQCAtMzkxMCw5ICs0MDU3LDcgQEAKICAqIHZhcmlvdXMgODAyLjExICsgcmFkaW8gaGVhZGVycy4KICAqLwogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fd2xhbmhvc3RvcChlYWRkciwgZGlyKQotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZWFkZHI7Ci0JcmVnaXN0ZXIgaW50IGRpcjsKK2dlbl93bGFuaG9zdG9wKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgdV9jaGFyICplYWRkciwgaW50IGRpcikKIHsKIAlyZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICpiMjsKIAlyZWdpc3RlciBzdHJ1Y3Qgc2xpc3QgKnM7CkBAIC0zOTI0LDcgKzQwNjksNyBAQAogCSAqIGFuZCB3aXBlcyBvdXQgc29tZSBMRCBpbnN0cnVjdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBiZWxvdwogCSAqIGNvZGUgdG8gdmFsaWRhdGUgdGhlIEZyYW1lIENvbnRyb2wgYml0cwogCSAqLwotCW5vX29wdGltaXplID0gMTsKKwljc3RhdGUtPm5vX29wdGltaXplID0gMTsKICNlbmRpZiAvKiBFTkFCTEVfV0xBTl9GSUxURVJJTkdfUEFUQ0ggKi8KIAogCXN3aXRjaCAoZGlyKSB7CkBAIC0zOTU0LDIzICs0MDk5LDIzIEBACiAJCSAqCiAJCSAqIEZpcnN0LCBjaGVjayBmb3IgVG8gRFMgc2V0LCBpLmUuIGNoZWNrICJsaW5rWzFdICYgMHgwMSIuCiAJCSAqLwotCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LSERSLCAxLCBCUEZfQik7Ci0JCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQlzID0gZ2VuX2xvYWRfYShjc3RhdGUsIE9SX0xJTktIRFIsIDEsIEJQRl9CKTsKKwkJYjEgPSBuZXdfYmxvY2soY3N0YXRlLCBKTVAoQlBGX0pTRVQpKTsKIAkJYjEtPnMuayA9IDB4MDE7CS8qIFRvIERTICovCiAJCWIxLT5zdG10cyA9IHM7CiAKIAkJLyoKIAkJICogSWYgVG8gRFMgaXMgc2V0LCB0aGUgU0EgaXMgYXQgMjQuCiAJCSAqLwotCQliMCA9IGdlbl9iY21wKE9SX0xJTktIRFIsIDI0LCA2LCBlYWRkcik7CisJCWIwID0gZ2VuX2JjbXAoY3N0YXRlLCBPUl9MSU5LSERSLCAyNCwgNiwgZWFkZHIpOwogCQlnZW5fYW5kKGIxLCBiMCk7CiAKIAkJLyoKIAkJICogTm93LCBjaGVjayBmb3IgVG8gRFMgbm90IHNldCwgaS5lLiBjaGVjawogCQkgKiAiIShsaW5rWzFdICYgMHgwMSkiLgogCQkgKi8KLQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOS0hEUiwgMSwgQlBGX0IpOwotCQliMiA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LSERSLCAxLCBCUEZfQik7CisJCWIyID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJCWIyLT5zLmsgPSAweDAxOwkvKiBUbyBEUyAqLwogCQliMi0+c3RtdHMgPSBzOwogCQlnZW5fbm90KGIyKTsKQEAgLTM5NzgsNyArNDEyMyw3IEBACiAJCS8qCiAJCSAqIElmIFRvIERTIGlzIG5vdCBzZXQsIHRoZSBTQSBpcyBhdCAxNi4KIAkJICovCi0JCWIxID0gZ2VuX2JjbXAoT1JfTElOS0hEUiwgMTYsIDYsIGVhZGRyKTsKKwkJYjEgPSBnZW5fYmNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDE2LCA2LCBlYWRkcik7CiAJCWdlbl9hbmQoYjIsIGIxKTsKIAogCQkvKgpAQCAtMzk5Miw4ICs0MTM3LDggQEAKIAkJICogTm93IGNoZWNrIGZvciBGcm9tIERTIGJlaW5nIHNldCwgYW5kIEFORCB0aGF0IHdpdGgKIAkJICogdGhlIE9SZWQtdG9nZXRoZXIgY2hlY2tzLgogCQkgKi8KLQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOS0hEUiwgMSwgQlBGX0IpOwotCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LSERSLCAxLCBCUEZfQik7CisJCWIxID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJCWIxLT5zLmsgPSAweDAyOwkvKiBGcm9tIERTICovCiAJCWIxLT5zdG10cyA9IHM7CiAJCWdlbl9hbmQoYjEsIGIwKTsKQEAgLTQwMDEsOCArNDE0Niw4IEBACiAJCS8qCiAJCSAqIE5vdyBjaGVjayBmb3IgZGF0YSBmcmFtZXMgd2l0aCBGcm9tIERTIG5vdCBzZXQuCiAJCSAqLwotCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LSERSLCAxLCBCUEZfQik7Ci0JCWIyID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQlzID0gZ2VuX2xvYWRfYShjc3RhdGUsIE9SX0xJTktIRFIsIDEsIEJQRl9CKTsKKwkJYjIgPSBuZXdfYmxvY2soY3N0YXRlLCBKTVAoQlBGX0pTRVQpKTsKIAkJYjItPnMuayA9IDB4MDI7CS8qIEZyb20gRFMgKi8KIAkJYjItPnN0bXRzID0gczsKIAkJZ2VuX25vdChiMik7CkBAIC00MDEwLDcgKzQxNTUsNyBAQAogCQkvKgogCQkgKiBJZiBGcm9tIERTIGlzbid0IHNldCwgdGhlIFNBIGlzIGF0IDEwLgogCQkgKi8KLQkJYjEgPSBnZW5fYmNtcChPUl9MSU5LSERSLCAxMCwgNiwgZWFkZHIpOworCQliMSA9IGdlbl9iY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMTAsIDYsIGVhZGRyKTsKIAkJZ2VuX2FuZChiMiwgYjEpOwogCiAJCS8qCkBAIC00MDI0LDggKzQxNjksOCBAQAogCQkgKiBOb3cgY2hlY2sgZm9yIGEgZGF0YSBmcmFtZS4KIAkJICogSS5lLCBjaGVjayAibGlua1swXSAmIDB4MDgiLgogCQkgKi8KLQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOS0hEUiwgMCwgQlBGX0IpOwotCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LSERSLCAwLCBCUEZfQik7CisJCWIxID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJCWIxLT5zLmsgPSAweDA4OwogCQliMS0+c3RtdHMgPSBzOwogCkBAIC00MDM5LDggKzQxODQsOCBAQAogCQkgKiBpcyBhIG1hbmFnZW1lbnQgZnJhbWUuCiAJCSAqIEkuZSwgY2hlY2sgIiEobGlua1swXSAmIDB4MDgpIi4KIAkJICovCi0JCXMgPSBnZW5fbG9hZF9hKE9SX0xJTktIRFIsIDAsIEJQRl9CKTsKLQkJYjIgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCXMgPSBnZW5fbG9hZF9hKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IpOworCQliMiA9IG5ld19ibG9jayhjc3RhdGUsIEpNUChCUEZfSlNFVCkpOwogCQliMi0+cy5rID0gMHgwODsKIAkJYjItPnN0bXRzID0gczsKIAkJZ2VuX25vdChiMik7CkBAIC00MDQ4LDcgKzQxOTMsNyBAQAogCQkvKgogCQkgKiBGb3IgbWFuYWdlbWVudCBmcmFtZXMsIHRoZSBTQSBpcyBhdCAxMC4KIAkJICovCi0JCWIxID0gZ2VuX2JjbXAoT1JfTElOS0hEUiwgMTAsIDYsIGVhZGRyKTsKKwkJYjEgPSBnZW5fYmNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDEwLCA2LCBlYWRkcik7CiAJCWdlbl9hbmQoYjIsIGIxKTsKIAogCQkvKgpAQCAtNDA2Niw4ICs0MjExLDggQEAKIAkJICoKIAkJICogSS5lLiwgY2hlY2sgIiEobGlua1swXSAmIDB4MDQpIi4KIAkJICovCi0JCXMgPSBnZW5fbG9hZF9hKE9SX0xJTktIRFIsIDAsIEJQRl9CKTsKLQkJYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCXMgPSBnZW5fbG9hZF9hKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IpOworCQliMSA9IG5ld19ibG9jayhjc3RhdGUsIEpNUChCUEZfSlNFVCkpOwogCQliMS0+cy5rID0gMHgwNDsKIAkJYjEtPnN0bXRzID0gczsKIAkJZ2VuX25vdChiMSk7CkBAIC00MTAxLDIzICs0MjQ2LDIzIEBACiAJCSAqCiAJCSAqIEZpcnN0LCBjaGVjayBmb3IgVG8gRFMgc2V0LCBpLmUuICJsaW5rWzFdICYgMHgwMSIuCiAJCSAqLwotCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LSERSLCAxLCBCUEZfQik7Ci0JCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQlzID0gZ2VuX2xvYWRfYShjc3RhdGUsIE9SX0xJTktIRFIsIDEsIEJQRl9CKTsKKwkJYjEgPSBuZXdfYmxvY2soY3N0YXRlLCBKTVAoQlBGX0pTRVQpKTsKIAkJYjEtPnMuayA9IDB4MDE7CS8qIFRvIERTICovCiAJCWIxLT5zdG10cyA9IHM7CiAKIAkJLyoKIAkJICogSWYgVG8gRFMgaXMgc2V0LCB0aGUgREEgaXMgYXQgMTYuCiAJCSAqLwotCQliMCA9IGdlbl9iY21wKE9SX0xJTktIRFIsIDE2LCA2LCBlYWRkcik7CisJCWIwID0gZ2VuX2JjbXAoY3N0YXRlLCBPUl9MSU5LSERSLCAxNiwgNiwgZWFkZHIpOwogCQlnZW5fYW5kKGIxLCBiMCk7CiAKIAkJLyoKIAkJICogTm93LCBjaGVjayBmb3IgVG8gRFMgbm90IHNldCwgaS5lLiBjaGVjawogCQkgKiAiIShsaW5rWzFdICYgMHgwMSkiLgogCQkgKi8KLQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOS0hEUiwgMSwgQlBGX0IpOwotCQliMiA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LSERSLCAxLCBCUEZfQik7CisJCWIyID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJCWIyLT5zLmsgPSAweDAxOwkvKiBUbyBEUyAqLwogCQliMi0+c3RtdHMgPSBzOwogCQlnZW5fbm90KGIyKTsKQEAgLTQxMjUsNyArNDI3MCw3IEBACiAJCS8qCiAJCSAqIElmIFRvIERTIGlzIG5vdCBzZXQsIHRoZSBEQSBpcyBhdCA0LgogCQkgKi8KLQkJYjEgPSBnZW5fYmNtcChPUl9MSU5LSERSLCA0LCA2LCBlYWRkcik7CisJCWIxID0gZ2VuX2JjbXAoY3N0YXRlLCBPUl9MSU5LSERSLCA0LCA2LCBlYWRkcik7CiAJCWdlbl9hbmQoYjIsIGIxKTsKIAogCQkvKgpAQCAtNDEzOCw4ICs0MjgzLDggQEAKIAkJICogTm93IGNoZWNrIGZvciBhIGRhdGEgZnJhbWUuCiAJCSAqIEkuZSwgY2hlY2sgImxpbmtbMF0gJiAweDA4Ii4KIAkJICovCi0JCXMgPSBnZW5fbG9hZF9hKE9SX0xJTktIRFIsIDAsIEJQRl9CKTsKLQkJYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCXMgPSBnZW5fbG9hZF9hKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IpOworCQliMSA9IG5ld19ibG9jayhjc3RhdGUsIEpNUChCUEZfSlNFVCkpOwogCQliMS0+cy5rID0gMHgwODsKIAkJYjEtPnN0bXRzID0gczsKIApAQCAtNDE1Myw4ICs0Mjk4LDggQEAKIAkJICogaXMgYSBtYW5hZ2VtZW50IGZyYW1lLgogCQkgKiBJLmUsIGNoZWNrICIhKGxpbmtbMF0gJiAweDA4KSIuCiAJCSAqLwotCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LSERSLCAwLCBCUEZfQik7Ci0JCWIyID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQlzID0gZ2VuX2xvYWRfYShjc3RhdGUsIE9SX0xJTktIRFIsIDAsIEJQRl9CKTsKKwkJYjIgPSBuZXdfYmxvY2soY3N0YXRlLCBKTVAoQlBGX0pTRVQpKTsKIAkJYjItPnMuayA9IDB4MDg7CiAJCWIyLT5zdG10cyA9IHM7CiAJCWdlbl9ub3QoYjIpOwpAQCAtNDE2Miw3ICs0MzA3LDcgQEAKIAkJLyoKIAkJICogRm9yIG1hbmFnZW1lbnQgZnJhbWVzLCB0aGUgREEgaXMgYXQgNC4KIAkJICovCi0JCWIxID0gZ2VuX2JjbXAoT1JfTElOS0hEUiwgNCwgNiwgZWFkZHIpOworCQliMSA9IGdlbl9iY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgNCwgNiwgZWFkZHIpOwogCQlnZW5fYW5kKGIyLCBiMSk7CiAKIAkJLyoKQEAgLTQxODAsOCArNDMyNSw4IEBACiAJCSAqCiAJCSAqIEkuZS4sIGNoZWNrICIhKGxpbmtbMF0gJiAweDA0KSIuCiAJCSAqLwotCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LSERSLCAwLCBCUEZfQik7Ci0JCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQlzID0gZ2VuX2xvYWRfYShjc3RhdGUsIE9SX0xJTktIRFIsIDAsIEJQRl9CKTsKKwkJYjEgPSBuZXdfYmxvY2soY3N0YXRlLCBKTVAoQlBGX0pTRVQpKTsKIAkJYjEtPnMuayA9IDB4MDQ7CiAJCWIxLT5zdG10cyA9IHM7CiAJCWdlbl9ub3QoYjEpOwpAQCAtNDIwNCwxNSArNDM0OSwxNSBAQAogCQkgKiBpcyBhIG1hbmFnZW1lbnQgZnJhbWUuCiAJCSAqIEkuZSwgY2hlY2sgIihsaW5rWzBdICYgMHgwOCkiLgogCQkgKi8KLQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOS0hEUiwgMCwgQlBGX0IpOwotCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LSERSLCAwLCBCUEZfQik7CisJCWIxID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJCWIxLT5zLmsgPSAweDA4OwogCQliMS0+c3RtdHMgPSBzOwogCiAJCS8qCiAJCSAqIENoZWNrIGFkZHIxLgogCQkgKi8KLQkJYjAgPSBnZW5fYmNtcChPUl9MSU5LSERSLCA0LCA2LCBlYWRkcik7CisJCWIwID0gZ2VuX2JjbXAoY3N0YXRlLCBPUl9MSU5LSERSLCA0LCA2LCBlYWRkcik7CiAKIAkJLyoKIAkJICogQU5EIHRoYXQgd2l0aCB0aGUgY2hlY2sgb2YgYWRkcjEuCkBAIC00MjI5LDEzICs0Mzc0LDEzIEBACiAJCS8qCiAJCSAqIE5vdCBwcmVzZW50IGluIENUUyBvciBBQ0sgY29udHJvbCBmcmFtZXMuCiAJCSAqLwotCQliMCA9IGdlbl9tY21wKE9SX0xJTktIRFIsIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMLAorCQliMCA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IsIElFRUU4MDIxMV9GQzBfVFlQRV9DVEwsCiAJCQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyk7CiAJCWdlbl9ub3QoYjApOwotCQliMSA9IGdlbl9tY21wKE9SX0xJTktIRFIsIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ1RTLAorCQliMSA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IsIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DVFMsCiAJCQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSyk7CiAJCWdlbl9ub3QoYjEpOwotCQliMiA9IGdlbl9tY21wKE9SX0xJTktIRFIsIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQUNLLAorCQliMiA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IsIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9BQ0ssCiAJCQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSyk7CiAJCWdlbl9ub3QoYjIpOwogCQlnZW5fYW5kKGIxLCBiMik7CkBAIC00MjQ2LDggKzQzOTEsOCBAQAogCQkgKiBpcyBhIG1hbmFnZW1lbnQgZnJhbWUuCiAJCSAqIEkuZSwgY2hlY2sgIihsaW5rWzBdICYgMHgwOCkiLgogCQkgKi8KLQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOS0hEUiwgMCwgQlBGX0IpOwotCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LSERSLCAwLCBCUEZfQik7CisJCWIxID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJCWIxLT5zLmsgPSAweDA4OwogCQliMS0+c3RtdHMgPSBzOwogCkBAIC00MjYwLDcgKzQ0MDUsNyBAQAogCQkvKgogCQkgKiBDaGVjayBhZGRyMi4KIAkJICovCi0JCWIxID0gZ2VuX2JjbXAoT1JfTElOS0hEUiwgMTAsIDYsIGVhZGRyKTsKKwkJYjEgPSBnZW5fYmNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDEwLCA2LCBlYWRkcik7CiAJCWdlbl9hbmQoYjIsIGIxKTsKIAkJcmV0dXJuIGIxOwogCkBAIC00MjY4LDI0ICs0NDEzLDI0IEBACiAJICogWFhYIC0gYWRkIEJTU0lEIGtleXdvcmQ/CiAJICovCiAJY2FzZSBRX0FERFIxOgotCQlyZXR1cm4gKGdlbl9iY21wKE9SX0xJTktIRFIsIDQsIDYsIGVhZGRyKSk7CisJCXJldHVybiAoZ2VuX2JjbXAoY3N0YXRlLCBPUl9MSU5LSERSLCA0LCA2LCBlYWRkcikpOwogCiAJY2FzZSBRX0FERFIyOgogCQkvKgogCQkgKiBOb3QgcHJlc2VudCBpbiBDVFMgb3IgQUNLIGNvbnRyb2wgZnJhbWVzLgogCQkgKi8KLQkJYjAgPSBnZW5fbWNtcChPUl9MSU5LSERSLCAwLCBCUEZfQiwgSUVFRTgwMjExX0ZDMF9UWVBFX0NUTCwKKwkJYjAgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMLAogCQkJSUVFRTgwMjExX0ZDMF9UWVBFX01BU0spOwogCQlnZW5fbm90KGIwKTsKLQkJYjEgPSBnZW5fbWNtcChPUl9MSU5LSERSLCAwLCBCUEZfQiwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NUUywKKwkJYjEgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ1RTLAogCQkJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spOwogCQlnZW5fbm90KGIxKTsKLQkJYjIgPSBnZW5fbWNtcChPUl9MSU5LSERSLCAwLCBCUEZfQiwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FDSywKKwkJYjIgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQUNLLAogCQkJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spOwogCQlnZW5fbm90KGIyKTsKIAkJZ2VuX2FuZChiMSwgYjIpOwogCQlnZW5fb3IoYjAsIGIyKTsKLQkJYjEgPSBnZW5fYmNtcChPUl9MSU5LSERSLCAxMCwgNiwgZWFkZHIpOworCQliMSA9IGdlbl9iY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMTAsIDYsIGVhZGRyKTsKIAkJZ2VuX2FuZChiMiwgYjEpOwogCQlyZXR1cm4gYjE7CiAKQEAgLTQyOTMsMTAgKzQ0MzgsMTAgQEAKIAkJLyoKIAkJICogTm90IHByZXNlbnQgaW4gY29udHJvbCBmcmFtZXMuCiAJCSAqLwotCQliMCA9IGdlbl9tY21wKE9SX0xJTktIRFIsIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMLAorCQliMCA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IsIElFRUU4MDIxMV9GQzBfVFlQRV9DVEwsCiAJCQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyk7CiAJCWdlbl9ub3QoYjApOwotCQliMSA9IGdlbl9iY21wKE9SX0xJTktIRFIsIDE2LCA2LCBlYWRkcik7CisJCWIxID0gZ2VuX2JjbXAoY3N0YXRlLCBPUl9MSU5LSERSLCAxNiwgNiwgZWFkZHIpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIApAQCAtNDMwNywyMiArNDQ1MiwyMiBAQAogCQkgKiBmcmFtZXMgc2hvdWxkIGhhdmUgYm90aCBvZiB0aG9zZSBzZXQsIHNvIHdlIGRvbid0CiAJCSAqIGNoZWNrIHRoZSBmcmFtZSB0eXBlLgogCQkgKi8KLQkJYjAgPSBnZW5fbWNtcChPUl9MSU5LSERSLCAxLCBCUEZfQiwKKwkJYjAgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDEsIEJQRl9CLAogCQkJSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTLCBJRUVFODAyMTFfRkMxX0RJUl9NQVNLKTsKLQkJYjEgPSBnZW5fYmNtcChPUl9MSU5LSERSLCAyNCwgNiwgZWFkZHIpOworCQliMSA9IGdlbl9iY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMjQsIDYsIGVhZGRyKTsKIAkJZ2VuX2FuZChiMCwgYjEpOwogCQlyZXR1cm4gYjE7CiAKIAljYXNlIFFfQU5EOgotCQliMCA9IGdlbl93bGFuaG9zdG9wKGVhZGRyLCBRX1NSQyk7Ci0JCWIxID0gZ2VuX3dsYW5ob3N0b3AoZWFkZHIsIFFfRFNUKTsKKwkJYjAgPSBnZW5fd2xhbmhvc3RvcChjc3RhdGUsIGVhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX3dsYW5ob3N0b3AoY3N0YXRlLCBlYWRkciwgUV9EU1QpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIAogCWNhc2UgUV9ERUZBVUxUOgogCWNhc2UgUV9PUjoKLQkJYjAgPSBnZW5fd2xhbmhvc3RvcChlYWRkciwgUV9TUkMpOwotCQliMSA9IGdlbl93bGFuaG9zdG9wKGVhZGRyLCBRX0RTVCk7CisJCWIwID0gZ2VuX3dsYW5ob3N0b3AoY3N0YXRlLCBlYWRkciwgUV9TUkMpOworCQliMSA9IGdlbl93bGFuaG9zdG9wKGNzdGF0ZSwgZWFkZHIsIFFfRFNUKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIAl9CkBAIC00MzM2LDU0ICs0NDgxLDUyIEBACiAgKiBhcyB0aGUgUkZDIHN0YXRlcy4pCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2lwZmNob3N0b3AoZWFkZHIsIGRpcikKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVhZGRyOwotCXJlZ2lzdGVyIGludCBkaXI7CitnZW5faXBmY2hvc3RvcChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGNvbnN0IHVfY2hhciAqZWFkZHIsIGludCBkaXIpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiMCwgKmIxOwogCiAJc3dpdGNoIChkaXIpIHsKIAljYXNlIFFfU1JDOgotCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOS0hEUiwgMTAsIDYsIGVhZGRyKTsKKwkJcmV0dXJuIGdlbl9iY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMTAsIDYsIGVhZGRyKTsKIAogCWNhc2UgUV9EU1Q6Ci0JCXJldHVybiBnZW5fYmNtcChPUl9MSU5LSERSLCAyLCA2LCBlYWRkcik7CisJCXJldHVybiBnZW5fYmNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDIsIDYsIGVhZGRyKTsKIAogCWNhc2UgUV9BTkQ6Ci0JCWIwID0gZ2VuX2lwZmNob3N0b3AoZWFkZHIsIFFfU1JDKTsKLQkJYjEgPSBnZW5faXBmY2hvc3RvcChlYWRkciwgUV9EU1QpOworCQliMCA9IGdlbl9pcGZjaG9zdG9wKGNzdGF0ZSwgZWFkZHIsIFFfU1JDKTsKKwkJYjEgPSBnZW5faXBmY2hvc3RvcChjc3RhdGUsIGVhZGRyLCBRX0RTVCk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCiAJY2FzZSBRX0RFRkFVTFQ6CiAJY2FzZSBRX09SOgotCQliMCA9IGdlbl9pcGZjaG9zdG9wKGVhZGRyLCBRX1NSQyk7Ci0JCWIxID0gZ2VuX2lwZmNob3N0b3AoZWFkZHIsIFFfRFNUKTsKKwkJYjAgPSBnZW5faXBmY2hvc3RvcChjc3RhdGUsIGVhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX2lwZmNob3N0b3AoY3N0YXRlLCBlYWRkciwgUV9EU1QpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCiAJY2FzZSBRX0FERFIxOgotCQlicGZfZXJyb3IoIidhZGRyMScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYWRkcjEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOwogCQlicmVhazsKIAogCWNhc2UgUV9BRERSMjoKLQkJYnBmX2Vycm9yKCInYWRkcjInIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2FkZHIyJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfQUREUjM6Ci0JCWJwZl9lcnJvcigiJ2FkZHIzJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidhZGRyMycgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0FERFI0OgotCQlicGZfZXJyb3IoIidhZGRyNCcgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYWRkcjQnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOwogCQlicmVhazsKIAogCWNhc2UgUV9SQToKLQkJYnBmX2Vycm9yKCIncmEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3JhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfVEE6Ci0JCWJwZl9lcnJvcigiJ3RhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIid0YScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CiAJCWJyZWFrOwogCX0KIAlhYm9ydCgpOwpAQCAtNDQwOSw5ICs0NTUyLDcgQEAKICAqIGFuZCBub3QgZ2VuZXJhdGUgbWFza2luZyBpbnN0cnVjdGlvbnMgaWYgdGhlIG1hc2sgaXMgMHhGRkZGLgogICovCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9kbmhvc3RvcChhZGRyLCBkaXIpCi0JYnBmX3VfaW50MzIgYWRkcjsKLQlpbnQgZGlyOworZ2VuX2RuaG9zdG9wKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgYnBmX3VfaW50MzIgYWRkciwgaW50IGRpcikKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICpiMiwgKnRtcDsKIAl1X2ludCBvZmZzZXRfbGg7CS8qIG9mZnNldCBpZiBsb25nIGhlYWRlciBpcyByZWNlaXZlZCAqLwpAQCAtNDQzMSw1MCArNDU3Miw1MCBAQAogCiAJY2FzZSBRX0FORDoKIAkJLyogSW5lZmZpY2llbnQgYmVjYXVzZSB3ZSBkbyBvdXIgQ2FsdmluYmFsbCBkYW5jZSB0d2ljZSAqLwotCQliMCA9IGdlbl9kbmhvc3RvcChhZGRyLCBRX1NSQyk7Ci0JCWIxID0gZ2VuX2RuaG9zdG9wKGFkZHIsIFFfRFNUKTsKKwkJYjAgPSBnZW5fZG5ob3N0b3AoY3N0YXRlLCBhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX2RuaG9zdG9wKGNzdGF0ZSwgYWRkciwgUV9EU1QpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIAogCWNhc2UgUV9PUjoKIAljYXNlIFFfREVGQVVMVDoKIAkJLyogSW5lZmZpY2llbnQgYmVjYXVzZSB3ZSBkbyBvdXIgQ2FsdmluYmFsbCBkYW5jZSB0d2ljZSAqLwotCQliMCA9IGdlbl9kbmhvc3RvcChhZGRyLCBRX1NSQyk7Ci0JCWIxID0gZ2VuX2RuaG9zdG9wKGFkZHIsIFFfRFNUKTsKKwkJYjAgPSBnZW5fZG5ob3N0b3AoY3N0YXRlLCBhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX2RuaG9zdG9wKGNzdGF0ZSwgYWRkciwgUV9EU1QpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCiAJY2FzZSBRX0lTTzoKLQkJYnBmX2Vycm9yKCJJU08gaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJJU08gaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAlkZWZhdWx0OgogCQlhYm9ydCgpOwogCX0KLQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfRE4pOworCWIwID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgRVRIRVJUWVBFX0ROKTsKIAkvKiBDaGVjayBmb3IgcGFkID0gMSwgbG9uZyBoZWFkZXIgY2FzZSAqLwotCXRtcCA9IGdlbl9tY21wKE9SX0xJTktQTCwgMiwgQlBGX0gsCisJdG1wID0gZ2VuX21jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIDIsIEJQRl9ILAogCSAgICAoYnBmX2ludDMyKW50b2hzKDB4MDY4MSksIChicGZfaW50MzIpbnRvaHMoMHgwN0ZGKSk7Ci0JYjEgPSBnZW5fY21wKE9SX0xJTktQTCwgMiArIDEgKyBvZmZzZXRfbGgsCisJYjEgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1BMLCAyICsgMSArIG9mZnNldF9saCwKIAkgICAgQlBGX0gsIChicGZfaW50MzIpbnRvaHMoKHVfc2hvcnQpYWRkcikpOwogCWdlbl9hbmQodG1wLCBiMSk7CiAJLyogQ2hlY2sgZm9yIHBhZCA9IDAsIGxvbmcgaGVhZGVyIGNhc2UgKi8KLQl0bXAgPSBnZW5fbWNtcChPUl9MSU5LUEwsIDIsIEJQRl9CLCAoYnBmX2ludDMyKTB4MDYsIChicGZfaW50MzIpMHg3KTsKLQliMiA9IGdlbl9jbXAoT1JfTElOS1BMLCAyICsgb2Zmc2V0X2xoLCBCUEZfSCwgKGJwZl9pbnQzMiludG9ocygodV9zaG9ydClhZGRyKSk7CisJdG1wID0gZ2VuX21jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIDIsIEJQRl9CLCAoYnBmX2ludDMyKTB4MDYsIChicGZfaW50MzIpMHg3KTsKKwliMiA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIDIgKyBvZmZzZXRfbGgsIEJQRl9ILCAoYnBmX2ludDMyKW50b2hzKCh1X3Nob3J0KWFkZHIpKTsKIAlnZW5fYW5kKHRtcCwgYjIpOwogCWdlbl9vcihiMiwgYjEpOwogCS8qIENoZWNrIGZvciBwYWQgPSAxLCBzaG9ydCBoZWFkZXIgY2FzZSAqLwotCXRtcCA9IGdlbl9tY21wKE9SX0xJTktQTCwgMiwgQlBGX0gsCisJdG1wID0gZ2VuX21jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIDIsIEJQRl9ILAogCSAgICAoYnBmX2ludDMyKW50b2hzKDB4MDI4MSksIChicGZfaW50MzIpbnRvaHMoMHgwN0ZGKSk7Ci0JYjIgPSBnZW5fY21wKE9SX0xJTktQTCwgMiArIDEgKyBvZmZzZXRfc2gsIEJQRl9ILCAoYnBmX2ludDMyKW50b2hzKCh1X3Nob3J0KWFkZHIpKTsKKwliMiA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIDIgKyAxICsgb2Zmc2V0X3NoLCBCUEZfSCwgKGJwZl9pbnQzMiludG9ocygodV9zaG9ydClhZGRyKSk7CiAJZ2VuX2FuZCh0bXAsIGIyKTsKIAlnZW5fb3IoYjIsIGIxKTsKIAkvKiBDaGVjayBmb3IgcGFkID0gMCwgc2hvcnQgaGVhZGVyIGNhc2UgKi8KLQl0bXAgPSBnZW5fbWNtcChPUl9MSU5LUEwsIDIsIEJQRl9CLCAoYnBmX2ludDMyKTB4MDIsIChicGZfaW50MzIpMHg3KTsKLQliMiA9IGdlbl9jbXAoT1JfTElOS1BMLCAyICsgb2Zmc2V0X3NoLCBCUEZfSCwgKGJwZl9pbnQzMiludG9ocygodV9zaG9ydClhZGRyKSk7CisJdG1wID0gZ2VuX21jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIDIsIEJQRl9CLCAoYnBmX2ludDMyKTB4MDIsIChicGZfaW50MzIpMHg3KTsKKwliMiA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIDIgKyBvZmZzZXRfc2gsIEJQRl9ILCAoYnBmX2ludDMyKW50b2hzKCh1X3Nob3J0KWFkZHIpKTsKIAlnZW5fYW5kKHRtcCwgYjIpOwogCWdlbl9vcihiMiwgYjEpOwogCi0JLyogQ29tYmluZSB3aXRoIHRlc3QgZm9yIGxpbmt0eXBlICovCisJLyogQ29tYmluZSB3aXRoIHRlc3QgZm9yIGNzdGF0ZS0+bGlua3R5cGUgKi8KIAlnZW5fYW5kKGIwLCBiMSk7CiAJcmV0dXJuIGIxOwogfQpAQCAtNDQ4NSw4ICs0NjI2LDcgQEAKICAqIGZpZWxkIGluIHRoZSBJUCBoZWFkZXIuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX21wbHNfbGlua3R5cGUocHJvdG8pCi0JaW50IHByb3RvOworZ2VuX21wbHNfbGlua3R5cGUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgcHJvdG8pCiB7CiAJc3RydWN0IGJsb2NrICpiMCwgKmIxOwogCkBAIC00NDk0LDE3ICs0NjM0LDE3IEBACiAKICAgICAgICAgY2FzZSBRX0lQOgogICAgICAgICAgICAgICAgIC8qIG1hdGNoIHRoZSBib3R0b20tb2Ytc3RhY2sgYml0ICovCi0gICAgICAgICAgICAgICAgYjAgPSBnZW5fbWNtcChPUl9MSU5LUEwsIC0yLCBCUEZfQiwgMHgwMSwgMHgwMSk7CisgICAgICAgICAgICAgICAgYjAgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktQTCwgLTIsIEJQRl9CLCAweDAxLCAweDAxKTsKICAgICAgICAgICAgICAgICAvKiBtYXRjaCB0aGUgSVB2NCB2ZXJzaW9uIG51bWJlciAqLwotICAgICAgICAgICAgICAgIGIxID0gZ2VuX21jbXAoT1JfTElOS1BMLCAwLCBCUEZfQiwgMHg0MCwgMHhmMCk7CisgICAgICAgICAgICAgICAgYjEgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktQTCwgMCwgQlBGX0IsIDB4NDAsIDB4ZjApOwogICAgICAgICAgICAgICAgIGdlbl9hbmQoYjAsIGIxKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYjE7CiAKICAgICAgICBjYXNlIFFfSVBWNjoKICAgICAgICAgICAgICAgICAvKiBtYXRjaCB0aGUgYm90dG9tLW9mLXN0YWNrIGJpdCAqLwotICAgICAgICAgICAgICAgIGIwID0gZ2VuX21jbXAoT1JfTElOS1BMLCAtMiwgQlBGX0IsIDB4MDEsIDB4MDEpOworICAgICAgICAgICAgICAgIGIwID0gZ2VuX21jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIC0yLCBCUEZfQiwgMHgwMSwgMHgwMSk7CiAgICAgICAgICAgICAgICAgLyogbWF0Y2ggdGhlIElQdjQgdmVyc2lvbiBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICBiMSA9IGdlbl9tY21wKE9SX0xJTktQTCwgMCwgQlBGX0IsIDB4NjAsIDB4ZjApOworICAgICAgICAgICAgICAgIGIxID0gZ2VuX21jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIDAsIEJQRl9CLCAweDYwLCAweGYwKTsKICAgICAgICAgICAgICAgICBnZW5fYW5kKGIwLCBiMSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGIxOwogCkBAIC00NTE0LDEyICs0NjU0LDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5faG9zdChhZGRyLCBtYXNrLCBwcm90bywgZGlyLCB0eXBlKQotCWJwZl91X2ludDMyIGFkZHI7Ci0JYnBmX3VfaW50MzIgbWFzazsKLQlpbnQgcHJvdG87Ci0JaW50IGRpcjsKLQlpbnQgdHlwZTsKK2dlbl9ob3N0KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgYnBmX3VfaW50MzIgYWRkciwgYnBmX3VfaW50MzIgbWFzaywKKyAgICBpbnQgcHJvdG8sIGludCBkaXIsIGludCB0eXBlKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMTsKIAljb25zdCBjaGFyICp0eXBlc3RyOwpAQCAtNDUzMiwxMTEgKzQ2NjgsMTExIEBACiAJc3dpdGNoIChwcm90bykgewogCiAJY2FzZSBRX0RFRkFVTFQ6Ci0JCWIwID0gZ2VuX2hvc3QoYWRkciwgbWFzaywgUV9JUCwgZGlyLCB0eXBlKTsKKwkJYjAgPSBnZW5faG9zdChjc3RhdGUsIGFkZHIsIG1hc2ssIFFfSVAsIGRpciwgdHlwZSk7CiAJCS8qCiAJCSAqIE9ubHkgY2hlY2sgZm9yIG5vbi1JUHY0IGFkZHJlc3NlcyBpZiB3ZSdyZSBub3QKIAkJICogY2hlY2tpbmcgTVBMUy1lbmNhcHN1bGF0ZWQgcGFja2V0cy4KIAkJICovCi0JCWlmIChsYWJlbF9zdGFja19kZXB0aCA9PSAwKSB7Ci0JCQliMSA9IGdlbl9ob3N0KGFkZHIsIG1hc2ssIFFfQVJQLCBkaXIsIHR5cGUpOworCQlpZiAoY3N0YXRlLT5sYWJlbF9zdGFja19kZXB0aCA9PSAwKSB7CisJCQliMSA9IGdlbl9ob3N0KGNzdGF0ZSwgYWRkciwgbWFzaywgUV9BUlAsIGRpciwgdHlwZSk7CiAJCQlnZW5fb3IoYjAsIGIxKTsKLQkJCWIwID0gZ2VuX2hvc3QoYWRkciwgbWFzaywgUV9SQVJQLCBkaXIsIHR5cGUpOworCQkJYjAgPSBnZW5faG9zdChjc3RhdGUsIGFkZHIsIG1hc2ssIFFfUkFSUCwgZGlyLCB0eXBlKTsKIAkJCWdlbl9vcihiMSwgYjApOwogCQl9CiAJCXJldHVybiBiMDsKIAogCWNhc2UgUV9JUDoKLQkJcmV0dXJuIGdlbl9ob3N0b3AoYWRkciwgbWFzaywgZGlyLCBFVEhFUlRZUEVfSVAsIDEyLCAxNik7CisJCXJldHVybiBnZW5faG9zdG9wKGNzdGF0ZSwgYWRkciwgbWFzaywgZGlyLCBFVEhFUlRZUEVfSVAsIDEyLCAxNik7CiAKIAljYXNlIFFfUkFSUDoKLQkJcmV0dXJuIGdlbl9ob3N0b3AoYWRkciwgbWFzaywgZGlyLCBFVEhFUlRZUEVfUkVWQVJQLCAxNCwgMjQpOworCQlyZXR1cm4gZ2VuX2hvc3RvcChjc3RhdGUsIGFkZHIsIG1hc2ssIGRpciwgRVRIRVJUWVBFX1JFVkFSUCwgMTQsIDI0KTsKIAogCWNhc2UgUV9BUlA6Ci0JCXJldHVybiBnZW5faG9zdG9wKGFkZHIsIG1hc2ssIGRpciwgRVRIRVJUWVBFX0FSUCwgMTQsIDI0KTsKKwkJcmV0dXJuIGdlbl9ob3N0b3AoY3N0YXRlLCBhZGRyLCBtYXNrLCBkaXIsIEVUSEVSVFlQRV9BUlAsIDE0LCAyNCk7CiAKIAljYXNlIFFfVENQOgotCQlicGZfZXJyb3IoIid0Y3AnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIid0Y3AnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9TQ1RQOgotCQlicGZfZXJyb3IoIidzY3RwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInc2N0cCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX1VEUDoKLQkJYnBmX2Vycm9yKCIndWRwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICIndWRwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfSUNNUDoKLQkJYnBmX2Vycm9yKCInaWNtcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2ljbXAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9JR01QOgotCQlicGZfZXJyb3IoIidpZ21wJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInaWdtcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX0lHUlA6Ci0JCWJwZl9lcnJvcigiJ2lncnAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidpZ3JwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfUElNOgotCQlicGZfZXJyb3IoIidwaW0nIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidwaW0nIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9WUlJQOgotCQlicGZfZXJyb3IoIid2cnJwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICIndnJycCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX0NBUlA6Ci0JCWJwZl9lcnJvcigiJ2NhcnAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidjYXJwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfQVRBTEs6Ci0JCWJwZl9lcnJvcigiQVRBTEsgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJBVEFMSyBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAogCWNhc2UgUV9BQVJQOgotCQlicGZfZXJyb3IoIkFBUlAgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJBQVJQIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBRX0RFQ05FVDoKLQkJcmV0dXJuIGdlbl9kbmhvc3RvcChhZGRyLCBkaXIpOworCQlyZXR1cm4gZ2VuX2RuaG9zdG9wKGNzdGF0ZSwgYWRkciwgZGlyKTsKIAogCWNhc2UgUV9TQ0E6Ci0JCWJwZl9lcnJvcigiU0NBIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiU0NBIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBRX0xBVDoKLQkJYnBmX2Vycm9yKCJMQVQgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJMQVQgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIFFfTU9QREw6Ci0JCWJwZl9lcnJvcigiTU9QREwgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJNT1BETCBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAogCWNhc2UgUV9NT1BSQzoKLQkJYnBmX2Vycm9yKCJNT1BSQyBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIk1PUFJDIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBRX0lQVjY6Ci0JCWJwZl9lcnJvcigiJ2lwNicgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInaXA2JyBtb2RpZmllciBhcHBsaWVkIHRvIGlwIGhvc3QiKTsKIAogCWNhc2UgUV9JQ01QVjY6Ci0JCWJwZl9lcnJvcigiJ2ljbXA2JyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInaWNtcDYnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9BSDoKLQkJYnBmX2Vycm9yKCInYWgnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidhaCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX0VTUDoKLQkJYnBmX2Vycm9yKCInZXNwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInZXNwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfSVNPOgotCQlicGZfZXJyb3IoIklTTyBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIklTTyBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAogCWNhc2UgUV9FU0lTOgotCQlicGZfZXJyb3IoIidlc2lzJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInZXNpcycgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX0lTSVM6Ci0JCWJwZl9lcnJvcigiJ2lzaXMnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidpc2lzJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfQ0xOUDoKLQkJYnBmX2Vycm9yKCInY2xucCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2NsbnAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9TVFA6Ci0JCWJwZl9lcnJvcigiJ3N0cCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3N0cCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX0lQWDoKLQkJYnBmX2Vycm9yKCJJUFggaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJJUFggaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIFFfTkVUQkVVSToKLQkJYnBmX2Vycm9yKCInbmV0YmV1aScgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ25ldGJldWknIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9SQURJTzoKLQkJYnBmX2Vycm9yKCIncmFkaW8nIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidyYWRpbycgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJZGVmYXVsdDoKIAkJYWJvcnQoKTsKQEAgLTQ2NDYsMTIgKzQ3ODIsOCBAQAogCiAjaWZkZWYgSU5FVDYKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2hvc3Q2KGFkZHIsIG1hc2ssIHByb3RvLCBkaXIsIHR5cGUpCi0Jc3RydWN0IGluNl9hZGRyICphZGRyOwotCXN0cnVjdCBpbjZfYWRkciAqbWFzazsKLQlpbnQgcHJvdG87Ci0JaW50IGRpcjsKLQlpbnQgdHlwZTsKK2dlbl9ob3N0Nihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIHN0cnVjdCBpbjZfYWRkciAqYWRkciwKKyAgICBzdHJ1Y3QgaW42X2FkZHIgKm1hc2ssIGludCBwcm90bywgaW50IGRpciwgaW50IHR5cGUpCiB7CiAJY29uc3QgY2hhciAqdHlwZXN0cjsKIApAQCAtNDY2MywxMDMgKzQ3OTUsMTAzIEBACiAJc3dpdGNoIChwcm90bykgewogCiAJY2FzZSBRX0RFRkFVTFQ6Ci0JCXJldHVybiBnZW5faG9zdDYoYWRkciwgbWFzaywgUV9JUFY2LCBkaXIsIHR5cGUpOworCQlyZXR1cm4gZ2VuX2hvc3Q2KGNzdGF0ZSwgYWRkciwgbWFzaywgUV9JUFY2LCBkaXIsIHR5cGUpOwogCiAJY2FzZSBRX0xJTks6Ci0JCWJwZl9lcnJvcigibGluay1sYXllciBtb2RpZmllciBhcHBsaWVkIHRvIGlwNiAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAibGluay1sYXllciBtb2RpZmllciBhcHBsaWVkIHRvIGlwNiAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX0lQOgotCQlicGZfZXJyb3IoIidpcCcgbW9kaWZpZXIgYXBwbGllZCB0byBpcDYgJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidpcCcgbW9kaWZpZXIgYXBwbGllZCB0byBpcDYgJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9SQVJQOgotCQlicGZfZXJyb3IoIidyYXJwJyBtb2RpZmllciBhcHBsaWVkIHRvIGlwNiAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3JhcnAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXA2ICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfQVJQOgotCQlicGZfZXJyb3IoIidhcnAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXA2ICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYXJwJyBtb2RpZmllciBhcHBsaWVkIHRvIGlwNiAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX1NDVFA6Ci0JCWJwZl9lcnJvcigiJ3NjdHAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidzY3RwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfVENQOgotCQlicGZfZXJyb3IoIid0Y3AnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIid0Y3AnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9VRFA6Ci0JCWJwZl9lcnJvcigiJ3VkcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3VkcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX0lDTVA6Ci0JCWJwZl9lcnJvcigiJ2ljbXAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidpY21wJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfSUdNUDoKLQkJYnBmX2Vycm9yKCInaWdtcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2lnbXAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9JR1JQOgotCQlicGZfZXJyb3IoIidpZ3JwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInaWdycCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX1BJTToKLQkJYnBmX2Vycm9yKCIncGltJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICIncGltJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfVlJSUDoKLQkJYnBmX2Vycm9yKCIndnJycCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3ZycnAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9DQVJQOgotCQlicGZfZXJyb3IoIidjYXJwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInY2FycCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX0FUQUxLOgotCQlicGZfZXJyb3IoIkFUQUxLIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiQVRBTEsgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIFFfQUFSUDoKLQkJYnBmX2Vycm9yKCJBQVJQIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiQUFSUCBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAogCWNhc2UgUV9ERUNORVQ6Ci0JCWJwZl9lcnJvcigiJ2RlY25ldCcgbW9kaWZpZXIgYXBwbGllZCB0byBpcDYgJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidkZWNuZXQnIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXA2ICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfU0NBOgotCQlicGZfZXJyb3IoIlNDQSBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIlNDQSBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAogCWNhc2UgUV9MQVQ6Ci0JCWJwZl9lcnJvcigiTEFUIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiTEFUIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBRX01PUERMOgotCQlicGZfZXJyb3IoIk1PUERMIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiTU9QREwgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIFFfTU9QUkM6Ci0JCWJwZl9lcnJvcigiTU9QUkMgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJNT1BSQyBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKIAogCWNhc2UgUV9JUFY2OgotCQlyZXR1cm4gZ2VuX2hvc3RvcDYoYWRkciwgbWFzaywgZGlyLCBFVEhFUlRZUEVfSVBWNiwgOCwgMjQpOworCQlyZXR1cm4gZ2VuX2hvc3RvcDYoY3N0YXRlLCBhZGRyLCBtYXNrLCBkaXIsIEVUSEVSVFlQRV9JUFY2LCA4LCAyNCk7CiAKIAljYXNlIFFfSUNNUFY2OgotCQlicGZfZXJyb3IoIidpY21wNicgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2ljbXA2JyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfQUg6Ci0JCWJwZl9lcnJvcigiJ2FoJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYWgnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9FU1A6Ci0JCWJwZl9lcnJvcigiJ2VzcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2VzcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX0lTTzoKLQkJYnBmX2Vycm9yKCJJU08gaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJJU08gaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CiAKIAljYXNlIFFfRVNJUzoKLQkJYnBmX2Vycm9yKCInZXNpcycgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2VzaXMnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9JU0lTOgotCQlicGZfZXJyb3IoIidpc2lzJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInaXNpcycgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOwogCiAJY2FzZSBRX0NMTlA6Ci0JCWJwZl9lcnJvcigiJ2NsbnAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidjbG5wJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfU1RQOgotCQlicGZfZXJyb3IoIidzdHAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidzdHAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWNhc2UgUV9JUFg6Ci0JCWJwZl9lcnJvcigiSVBYIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiSVBYIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOwogCiAJY2FzZSBRX05FVEJFVUk6Ci0JCWJwZl9lcnJvcigiJ25ldGJldWknIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIiduZXRiZXVpJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CiAKIAljYXNlIFFfUkFESU86Ci0JCWJwZl9lcnJvcigiJ3JhZGlvJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisJCWJwZl9lcnJvcihjc3RhdGUsICIncmFkaW8nIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKIAogCWRlZmF1bHQ6CiAJCWFib3J0KCk7CkBAIC00Nzc5LDU0ICs0OTExLDU0IEBACiAJc3RydWN0IGJsb2NrICpiMCwgKmIxLCAqdG1wOwogCiAJaWYgKGRpciAhPSAwKQotCQlicGZfZXJyb3IoImRpcmVjdGlvbiBhcHBsaWVkIHRvICdnYXRld2F5JyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiZGlyZWN0aW9uIGFwcGxpZWQgdG8gJ2dhdGV3YXknIik7CiAKIAlzd2l0Y2ggKHByb3RvKSB7CiAJY2FzZSBRX0RFRkFVTFQ6CiAJY2FzZSBRX0lQOgogCWNhc2UgUV9BUlA6CiAJY2FzZSBRX1JBUlA6Ci0JCXN3aXRjaCAobGlua3R5cGUpIHsKKwkJc3dpdGNoIChjc3RhdGUtPmxpbmt0eXBlKSB7CiAJCWNhc2UgRExUX0VOMTBNQjoKIAkJY2FzZSBETFRfTkVUQU5BTFlaRVI6CiAJCWNhc2UgRExUX05FVEFOQUxZWkVSX1RSQU5TUEFSRU5UOgotCQkJYjEgPSBnZW5fcHJldmxpbmtoZHJfY2hlY2soKTsKLQkJCWIwID0gZ2VuX2Vob3N0b3AoZWFkZHIsIFFfT1IpOworCQkJYjEgPSBnZW5fcHJldmxpbmtoZHJfY2hlY2soY3N0YXRlKTsKKwkJCWIwID0gZ2VuX2Vob3N0b3AoY3N0YXRlLCBlYWRkciwgUV9PUik7CiAJCQlpZiAoYjEgIT0gTlVMTCkKIAkJCQlnZW5fYW5kKGIxLCBiMCk7CiAJCQlicmVhazsKIAkJY2FzZSBETFRfRkRESToKLQkJCWIwID0gZ2VuX2Zob3N0b3AoZWFkZHIsIFFfT1IpOworCQkJYjAgPSBnZW5fZmhvc3RvcChjc3RhdGUsIGVhZGRyLCBRX09SKTsKIAkJCWJyZWFrOwogCQljYXNlIERMVF9JRUVFODAyOgotCQkJYjAgPSBnZW5fdGhvc3RvcChlYWRkciwgUV9PUik7CisJCQliMCA9IGdlbl90aG9zdG9wKGNzdGF0ZSwgZWFkZHIsIFFfT1IpOwogCQkJYnJlYWs7CiAJCWNhc2UgRExUX0lFRUU4MDJfMTE6CiAJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKIAkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CiAJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CiAJCWNhc2UgRExUX1BQSToKLQkJCWIwID0gZ2VuX3dsYW5ob3N0b3AoZWFkZHIsIFFfT1IpOworCQkJYjAgPSBnZW5fd2xhbmhvc3RvcChjc3RhdGUsIGVhZGRyLCBRX09SKTsKIAkJCWJyZWFrOwogCQljYXNlIERMVF9TVU5BVE06CiAJCQkvKgogCQkJICogVGhpcyBpcyBMTEMtbXVsdGlwbGV4ZWQgdHJhZmZpYzsgaWYgaXQgd2VyZQotCQkJICogTEFORSwgbGlua3R5cGUgd291bGQgaGF2ZSBiZWVuIHNldCB0bworCQkJICogTEFORSwgY3N0YXRlLT5saW5rdHlwZSB3b3VsZCBoYXZlIGJlZW4gc2V0IHRvCiAJCQkgKiBETFRfRU4xME1CLgogCQkJICovCi0JCQlicGZfZXJyb3IoCisJCQlicGZfZXJyb3IoY3N0YXRlLAogCQkJICAgICInZ2F0ZXdheScgc3VwcG9ydGVkIG9ubHkgb24gZXRoZXJuZXQvRkRESS90b2tlbiByaW5nLzgwMi4xMS9BVE0gTEFORS9GaWJyZSBDaGFubmVsIik7CiAJCQlicmVhazsKIAkJY2FzZSBETFRfSVBfT1ZFUl9GQzoKLQkJCWIwID0gZ2VuX2lwZmNob3N0b3AoZWFkZHIsIFFfT1IpOworCQkJYjAgPSBnZW5faXBmY2hvc3RvcChjc3RhdGUsIGVhZGRyLCBRX09SKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJYnBmX2Vycm9yKAorCQkJYnBmX2Vycm9yKGNzdGF0ZSwKIAkJCSAgICAiJ2dhdGV3YXknIHN1cHBvcnRlZCBvbmx5IG9uIGV0aGVybmV0L0ZEREkvdG9rZW4gcmluZy84MDIuMTEvQVRNIExBTkUvRmlicmUgQ2hhbm5lbCIpOwogCQl9Ci0JCWIxID0gZ2VuX2hvc3QoKiphbGlzdCsrLCAweGZmZmZmZmZmLCBwcm90bywgUV9PUiwgUV9IT1NUKTsKKwkJYjEgPSBnZW5faG9zdChjc3RhdGUsICoqYWxpc3QrKywgMHhmZmZmZmZmZiwgcHJvdG8sIFFfT1IsIFFfSE9TVCk7CiAJCXdoaWxlICgqYWxpc3QpIHsKLQkJCXRtcCA9IGdlbl9ob3N0KCoqYWxpc3QrKywgMHhmZmZmZmZmZiwgcHJvdG8sIFFfT1IsCisJCQl0bXAgPSBnZW5faG9zdChjc3RhdGUsICoqYWxpc3QrKywgMHhmZmZmZmZmZiwgcHJvdG8sIFFfT1IsCiAJCQkgICAgUV9IT1NUKTsKIAkJCWdlbl9vcihiMSwgdG1wKTsKIAkJCWIxID0gdG1wOwpAQCAtNDgzNSwxNCArNDk2NywxMyBAQAogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIAl9Ci0JYnBmX2Vycm9yKCJpbGxlZ2FsIG1vZGlmaWVyIG9mICdnYXRld2F5JyIpOworCWJwZl9lcnJvcihjc3RhdGUsICJpbGxlZ2FsIG1vZGlmaWVyIG9mICdnYXRld2F5JyIpOwogCS8qIE5PVFJFQUNIRUQgKi8KIH0KICNlbmRpZgogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3Byb3RvX2FiYnJldihwcm90bykKLQlpbnQgcHJvdG87CitnZW5fcHJvdG9fYWJicmV2KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHByb3RvKQogewogCXN0cnVjdCBibG9jayAqYjA7CiAJc3RydWN0IGJsb2NrICpiMTsKQEAgLTQ4NTAsMjUgKzQ5ODEsMjUgQEAKIAlzd2l0Y2ggKHByb3RvKSB7CiAKIAljYXNlIFFfU0NUUDoKLQkJYjEgPSBnZW5fcHJvdG8oSVBQUk9UT19TQ1RQLCBRX0lQLCBRX0RFRkFVTFQpOwotCQliMCA9IGdlbl9wcm90byhJUFBST1RPX1NDVFAsIFFfSVBWNiwgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCBJUFBST1RPX1NDVFAsIFFfSVAsIFFfREVGQVVMVCk7CisJCWIwID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVBQUk9UT19TQ1RQLCBRX0lQVjYsIFFfREVGQVVMVCk7CiAJCWdlbl9vcihiMCwgYjEpOwogCQlicmVhazsKIAogCWNhc2UgUV9UQ1A6Ci0JCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fVENQLCBRX0lQLCBRX0RFRkFVTFQpOwotCQliMCA9IGdlbl9wcm90byhJUFBST1RPX1RDUCwgUV9JUFY2LCBRX0RFRkFVTFQpOworCQliMSA9IGdlbl9wcm90byhjc3RhdGUsIElQUFJPVE9fVENQLCBRX0lQLCBRX0RFRkFVTFQpOworCQliMCA9IGdlbl9wcm90byhjc3RhdGUsIElQUFJPVE9fVENQLCBRX0lQVjYsIFFfREVGQVVMVCk7CiAJCWdlbl9vcihiMCwgYjEpOwogCQlicmVhazsKIAogCWNhc2UgUV9VRFA6Ci0JCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fVURQLCBRX0lQLCBRX0RFRkFVTFQpOwotCQliMCA9IGdlbl9wcm90byhJUFBST1RPX1VEUCwgUV9JUFY2LCBRX0RFRkFVTFQpOworCQliMSA9IGdlbl9wcm90byhjc3RhdGUsIElQUFJPVE9fVURQLCBRX0lQLCBRX0RFRkFVTFQpOworCQliMCA9IGdlbl9wcm90byhjc3RhdGUsIElQUFJPVE9fVURQLCBRX0lQVjYsIFFfREVGQVVMVCk7CiAJCWdlbl9vcihiMCwgYjEpOwogCQlicmVhazsKIAogCWNhc2UgUV9JQ01QOgotCQliMSA9IGdlbl9wcm90byhJUFBST1RPX0lDTVAsIFFfSVAsIFFfREVGQVVMVCk7CisJCWIxID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVBQUk9UT19JQ01QLCBRX0lQLCBRX0RFRkFVTFQpOwogCQlicmVhazsKIAogI2lmbmRlZglJUFBST1RPX0lHTVAKQEAgLTQ4NzYsMTQgKzUwMDcsMTQgQEAKICNlbmRpZgogCiAJY2FzZSBRX0lHTVA6Ci0JCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fSUdNUCwgUV9JUCwgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCBJUFBST1RPX0lHTVAsIFFfSVAsIFFfREVGQVVMVCk7CiAJCWJyZWFrOwogCiAjaWZuZGVmCUlQUFJPVE9fSUdSUAogI2RlZmluZQlJUFBST1RPX0lHUlAJOQogI2VuZGlmCiAJY2FzZSBRX0lHUlA6Ci0JCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fSUdSUCwgUV9JUCwgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCBJUFBST1RPX0lHUlAsIFFfSVAsIFFfREVGQVVMVCk7CiAJCWJyZWFrOwogCiAjaWZuZGVmIElQUFJPVE9fUElNCkBAIC00ODkxLDggKzUwMjIsOCBAQAogI2VuZGlmCiAKIAljYXNlIFFfUElNOgotCQliMSA9IGdlbl9wcm90byhJUFBST1RPX1BJTSwgUV9JUCwgUV9ERUZBVUxUKTsKLQkJYjAgPSBnZW5fcHJvdG8oSVBQUk9UT19QSU0sIFFfSVBWNiwgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCBJUFBST1RPX1BJTSwgUV9JUCwgUV9ERUZBVUxUKTsKKwkJYjAgPSBnZW5fcHJvdG8oY3N0YXRlLCBJUFBST1RPX1BJTSwgUV9JUFY2LCBRX0RFRkFVTFQpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAkJYnJlYWs7CiAKQEAgLTQ5MDEsNyArNTAzMiw3IEBACiAjZW5kaWYKIAogCWNhc2UgUV9WUlJQOgotCQliMSA9IGdlbl9wcm90byhJUFBST1RPX1ZSUlAsIFFfSVAsIFFfREVGQVVMVCk7CisJCWIxID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVBQUk9UT19WUlJQLCBRX0lQLCBRX0RFRkFVTFQpOwogCQlicmVhazsKIAogI2lmbmRlZiBJUFBST1RPX0NBUlAKQEAgLTQ5MDksNjkgKzUwNDAsNjkgQEAKICNlbmRpZgogCiAJY2FzZSBRX0NBUlA6Ci0JCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fQ0FSUCwgUV9JUCwgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCBJUFBST1RPX0NBUlAsIFFfSVAsIFFfREVGQVVMVCk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0lQOgotCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0lQKTsKKwkJYjEgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfSVApOwogCQlicmVhazsKIAogCWNhc2UgUV9BUlA6Ci0JCWIxID0gIGdlbl9saW5rdHlwZShFVEhFUlRZUEVfQVJQKTsKKwkJYjEgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfQVJQKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfUkFSUDoKLQkJYjEgPSAgZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9SRVZBUlApOworCQliMSA9IGdlbl9saW5rdHlwZShjc3RhdGUsIEVUSEVSVFlQRV9SRVZBUlApOwogCQlicmVhazsKIAogCWNhc2UgUV9MSU5LOgotCQlicGZfZXJyb3IoImxpbmsgbGF5ZXIgYXBwbGllZCBpbiB3cm9uZyBjb250ZXh0Iik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJsaW5rIGxheWVyIGFwcGxpZWQgaW4gd3JvbmcgY29udGV4dCIpOwogCiAJY2FzZSBRX0FUQUxLOgotCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0FUQUxLKTsKKwkJYjEgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfQVRBTEspOwogCQlicmVhazsKIAogCWNhc2UgUV9BQVJQOgotCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0FBUlApOworCQliMSA9IGdlbl9saW5rdHlwZShjc3RhdGUsIEVUSEVSVFlQRV9BQVJQKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfREVDTkVUOgotCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0ROKTsKKwkJYjEgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfRE4pOwogCQlicmVhazsKIAogCWNhc2UgUV9TQ0E6Ci0JCWIxID0gIGdlbl9saW5rdHlwZShFVEhFUlRZUEVfU0NBKTsKKwkJYjEgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfU0NBKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfTEFUOgotCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0xBVCk7CisJCWIxID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgRVRIRVJUWVBFX0xBVCk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX01PUERMOgotCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX01PUERMKTsKKwkJYjEgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfTU9QREwpOwogCQlicmVhazsKIAogCWNhc2UgUV9NT1BSQzoKLQkJYjEgPSAgZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9NT1BSQyk7CisJCWIxID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgRVRIRVJUWVBFX01PUFJDKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfSVBWNjoKLQkJYjEgPSBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0lQVjYpOworCQliMSA9IGdlbl9saW5rdHlwZShjc3RhdGUsIEVUSEVSVFlQRV9JUFY2KTsKIAkJYnJlYWs7CiAKICNpZm5kZWYgSVBQUk9UT19JQ01QVjYKICNkZWZpbmUgSVBQUk9UT19JQ01QVjYJNTgKICNlbmRpZgogCWNhc2UgUV9JQ01QVjY6Ci0JCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fSUNNUFY2LCBRX0lQVjYsIFFfREVGQVVMVCk7CisJCWIxID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVBQUk9UT19JQ01QVjYsIFFfSVBWNiwgUV9ERUZBVUxUKTsKIAkJYnJlYWs7CiAKICNpZm5kZWYgSVBQUk9UT19BSAogI2RlZmluZSBJUFBST1RPX0FICTUxCiAjZW5kaWYKIAljYXNlIFFfQUg6Ci0JCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fQUgsIFFfSVAsIFFfREVGQVVMVCk7Ci0JCWIwID0gZ2VuX3Byb3RvKElQUFJPVE9fQUgsIFFfSVBWNiwgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCBJUFBST1RPX0FILCBRX0lQLCBRX0RFRkFVTFQpOworCQliMCA9IGdlbl9wcm90byhjc3RhdGUsIElQUFJPVE9fQUgsIFFfSVBWNiwgUV9ERUZBVUxUKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCWJyZWFrOwogCkBAIC00OTc5LDEwMSArNTExMCwxMDEgQEAKICNkZWZpbmUgSVBQUk9UT19FU1AJNTAKICNlbmRpZgogCWNhc2UgUV9FU1A6Ci0JCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fRVNQLCBRX0lQLCBRX0RFRkFVTFQpOwotCQliMCA9IGdlbl9wcm90byhJUFBST1RPX0VTUCwgUV9JUFY2LCBRX0RFRkFVTFQpOworCQliMSA9IGdlbl9wcm90byhjc3RhdGUsIElQUFJPVE9fRVNQLCBRX0lQLCBRX0RFRkFVTFQpOworCQliMCA9IGdlbl9wcm90byhjc3RhdGUsIElQUFJPVE9fRVNQLCBRX0lQVjYsIFFfREVGQVVMVCk7CiAJCWdlbl9vcihiMCwgYjEpOwogCQlicmVhazsKIAogCWNhc2UgUV9JU086Ci0JCWIxID0gZ2VuX2xpbmt0eXBlKExMQ1NBUF9JU09OUyk7CisJCWIxID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgTExDU0FQX0lTT05TKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfRVNJUzoKLQkJYjEgPSBnZW5fcHJvdG8oSVNPOTU0Ml9FU0lTLCBRX0lTTywgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU085NTQyX0VTSVMsIFFfSVNPLCBRX0RFRkFVTFQpOwogCQlicmVhazsKIAogCWNhc2UgUV9JU0lTOgotCQliMSA9IGdlbl9wcm90byhJU08xMDU4OV9JU0lTLCBRX0lTTywgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU08xMDU4OV9JU0lTLCBRX0lTTywgUV9ERUZBVUxUKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfSVNJU19MMTogLyogYWxsIElTLUlTIExldmVsMSBQRFUtVHlwZXMgKi8KLQkJYjAgPSBnZW5fcHJvdG8oSVNJU19MMV9MQU5fSUlILCBRX0lTSVMsIFFfREVGQVVMVCk7Ci0JCWIxID0gZ2VuX3Byb3RvKElTSVNfUFRQX0lJSCwgUV9JU0lTLCBRX0RFRkFVTFQpOyAvKiBGSVhNRSBleHRyYWN0IHRoZSBjaXJjdWl0LXR5cGUgYml0cyAqLworCQliMCA9IGdlbl9wcm90byhjc3RhdGUsIElTSVNfTDFfTEFOX0lJSCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQliMSA9IGdlbl9wcm90byhjc3RhdGUsIElTSVNfUFRQX0lJSCwgUV9JU0lTLCBRX0RFRkFVTFQpOyAvKiBGSVhNRSBleHRyYWN0IHRoZSBjaXJjdWl0LXR5cGUgYml0cyAqLwogCQlnZW5fb3IoYjAsIGIxKTsKLQkJYjAgPSBnZW5fcHJvdG8oSVNJU19MMV9MU1AsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJYjAgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU0lTX0wxX0xTUCwgUV9JU0lTLCBRX0RFRkFVTFQpOwogCQlnZW5fb3IoYjAsIGIxKTsKLQkJYjAgPSBnZW5fcHJvdG8oSVNJU19MMV9DU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIwID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNJU19MMV9DU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CiAJCWdlbl9vcihiMCwgYjEpOwotCQliMCA9IGdlbl9wcm90byhJU0lTX0wxX1BTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJYjAgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU0lTX0wxX1BTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0lTSVNfTDI6IC8qIGFsbCBJUy1JUyBMZXZlbDIgUERVLVR5cGVzICovCi0JCWIwID0gZ2VuX3Byb3RvKElTSVNfTDJfTEFOX0lJSCwgUV9JU0lTLCBRX0RFRkFVTFQpOwotCQliMSA9IGdlbl9wcm90byhJU0lTX1BUUF9JSUgsIFFfSVNJUywgUV9ERUZBVUxUKTsgLyogRklYTUUgZXh0cmFjdCB0aGUgY2lyY3VpdC10eXBlIGJpdHMgKi8KKwkJYjAgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU0lTX0wyX0xBTl9JSUgsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU0lTX1BUUF9JSUgsIFFfSVNJUywgUV9ERUZBVUxUKTsgLyogRklYTUUgZXh0cmFjdCB0aGUgY2lyY3VpdC10eXBlIGJpdHMgKi8KIAkJZ2VuX29yKGIwLCBiMSk7Ci0JCWIwID0gZ2VuX3Byb3RvKElTSVNfTDJfTFNQLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIwID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNJU19MMl9MU1AsIFFfSVNJUywgUV9ERUZBVUxUKTsKIAkJZ2VuX29yKGIwLCBiMSk7Ci0JCWIwID0gZ2VuX3Byb3RvKElTSVNfTDJfQ1NOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQliMCA9IGdlbl9wcm90byhjc3RhdGUsIElTSVNfTDJfQ1NOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOwogCQlnZW5fb3IoYjAsIGIxKTsKLQkJYjAgPSBnZW5fcHJvdG8oSVNJU19MMl9QU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIwID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNJU19MMl9QU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CiAJCWdlbl9vcihiMCwgYjEpOwogCQlicmVhazsKIAogCWNhc2UgUV9JU0lTX0lJSDogLyogYWxsIElTLUlTIEhlbGxvIFBEVS1UeXBlcyAqLwotCQliMCA9IGdlbl9wcm90byhJU0lTX0wxX0xBTl9JSUgsIFFfSVNJUywgUV9ERUZBVUxUKTsKLQkJYjEgPSBnZW5fcHJvdG8oSVNJU19MMl9MQU5fSUlILCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIwID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNJU19MMV9MQU5fSUlILCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIxID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNJU19MMl9MQU5fSUlILCBRX0lTSVMsIFFfREVGQVVMVCk7CiAJCWdlbl9vcihiMCwgYjEpOwotCQliMCA9IGdlbl9wcm90byhJU0lTX1BUUF9JSUgsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJYjAgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU0lTX1BUUF9JSUgsIFFfSVNJUywgUV9ERUZBVUxUKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0lTSVNfTFNQOgotCQliMCA9IGdlbl9wcm90byhJU0lTX0wxX0xTUCwgUV9JU0lTLCBRX0RFRkFVTFQpOwotCQliMSA9IGdlbl9wcm90byhJU0lTX0wyX0xTUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQliMCA9IGdlbl9wcm90byhjc3RhdGUsIElTSVNfTDFfTFNQLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIxID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNJU19MMl9MU1AsIFFfSVNJUywgUV9ERUZBVUxUKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0lTSVNfU05QOgotCQliMCA9IGdlbl9wcm90byhJU0lTX0wxX0NTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKLQkJYjEgPSBnZW5fcHJvdG8oSVNJU19MMl9DU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIwID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNJU19MMV9DU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIxID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNJU19MMl9DU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CiAJCWdlbl9vcihiMCwgYjEpOwotCQliMCA9IGdlbl9wcm90byhJU0lTX0wxX1BTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJYjAgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU0lTX0wxX1BTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKIAkJZ2VuX29yKGIwLCBiMSk7Ci0JCWIwID0gZ2VuX3Byb3RvKElTSVNfTDJfUFNOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQliMCA9IGdlbl9wcm90byhjc3RhdGUsIElTSVNfTDJfUFNOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOwogCQlnZW5fb3IoYjAsIGIxKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfSVNJU19DU05QOgotCQliMCA9IGdlbl9wcm90byhJU0lTX0wxX0NTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKLQkJYjEgPSBnZW5fcHJvdG8oSVNJU19MMl9DU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIwID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNJU19MMV9DU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIxID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNJU19MMl9DU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CiAJCWdlbl9vcihiMCwgYjEpOwogCQlicmVhazsKIAogCWNhc2UgUV9JU0lTX1BTTlA6Ci0JCWIwID0gZ2VuX3Byb3RvKElTSVNfTDFfUFNOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOwotCQliMSA9IGdlbl9wcm90byhJU0lTX0wyX1BTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJYjAgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU0lTX0wxX1BTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU0lTX0wyX1BTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0NMTlA6Ci0JCWIxID0gZ2VuX3Byb3RvKElTTzg0NzNfQ0xOUCwgUV9JU08sIFFfREVGQVVMVCk7CisJCWIxID0gZ2VuX3Byb3RvKGNzdGF0ZSwgSVNPODQ3M19DTE5QLCBRX0lTTywgUV9ERUZBVUxUKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfU1RQOgotCQliMSA9IGdlbl9saW5rdHlwZShMTENTQVBfODAyMUQpOworCQliMSA9IGdlbl9saW5rdHlwZShjc3RhdGUsIExMQ1NBUF84MDIxRCk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0lQWDoKLQkJYjEgPSBnZW5fbGlua3R5cGUoTExDU0FQX0lQWCk7CisJCWIxID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgTExDU0FQX0lQWCk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX05FVEJFVUk6Ci0JCWIxID0gZ2VuX2xpbmt0eXBlKExMQ1NBUF9ORVRCRVVJKTsKKwkJYjEgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBMTENTQVBfTkVUQkVVSSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX1JBRElPOgotCQlicGZfZXJyb3IoIidyYWRpbycgaXMgbm90IGEgdmFsaWQgcHJvdG9jb2wgdHlwZSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3JhZGlvJyBpcyBub3QgYSB2YWxpZCBwcm90b2NvbCB0eXBlIik7CiAKIAlkZWZhdWx0OgogCQlhYm9ydCgpOwpAQCAtNTA4MiwxNCArNTIxMywxNCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9pcGZyYWcoKQorZ2VuX2lwZnJhZyhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJc3RydWN0IHNsaXN0ICpzOwogCXN0cnVjdCBibG9jayAqYjsKIAogCS8qIG5vdCBJUHY0IGZyYWcgb3RoZXIgdGhhbiB0aGUgZmlyc3QgZnJhZyAqLwotCXMgPSBnZW5fbG9hZF9hKE9SX0xJTktQTCwgNiwgQlBGX0gpOwotCWIgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LUEwsIDYsIEJQRl9IKTsKKwliID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJYi0+cy5rID0gMHgxZmZmOwogCWItPnN0bXRzID0gczsKIAlnZW5fbm90KGIpOwpAQCAtNTEwNyw1MSArNTIzOCw0NiBAQAogICogaGVhZGVycykuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BvcnRhdG9tKG9mZiwgdikKLQlpbnQgb2ZmOwotCWJwZl9pbnQzMiB2OworZ2VuX3BvcnRhdG9tKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IG9mZiwgYnBmX2ludDMyIHYpCiB7Ci0JcmV0dXJuIGdlbl9jbXAoT1JfVFJBTl9JUFY0LCBvZmYsIEJQRl9ILCB2KTsKKwlyZXR1cm4gZ2VuX2NtcChjc3RhdGUsIE9SX1RSQU5fSVBWNCwgb2ZmLCBCUEZfSCwgdik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BvcnRhdG9tNihvZmYsIHYpCi0JaW50IG9mZjsKLQlicGZfaW50MzIgdjsKK2dlbl9wb3J0YXRvbTYoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgb2ZmLCBicGZfaW50MzIgdikKIHsKLQlyZXR1cm4gZ2VuX2NtcChPUl9UUkFOX0lQVjYsIG9mZiwgQlBGX0gsIHYpOworCXJldHVybiBnZW5fY21wKGNzdGF0ZSwgT1JfVFJBTl9JUFY2LCBvZmYsIEJQRl9ILCB2KTsKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9wb3J0b3AocG9ydCwgcHJvdG8sIGRpcikKLQlpbnQgcG9ydCwgcHJvdG8sIGRpcjsKK2dlbl9wb3J0b3AoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgcG9ydCwgaW50IHByb3RvLCBpbnQgZGlyKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMSwgKnRtcDsKIAogCS8qIGlwIHByb3RvICdwcm90bycgYW5kIG5vdCBhIGZyYWdtZW50IG90aGVyIHRoYW4gdGhlIGZpcnN0IGZyYWdtZW50ICovCi0JdG1wID0gZ2VuX2NtcChPUl9MSU5LUEwsIDksIEJQRl9CLCAoYnBmX2ludDMyKXByb3RvKTsKLQliMCA9IGdlbl9pcGZyYWcoKTsKKwl0bXAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1BMLCA5LCBCUEZfQiwgKGJwZl9pbnQzMilwcm90byk7CisJYjAgPSBnZW5faXBmcmFnKGNzdGF0ZSk7CiAJZ2VuX2FuZCh0bXAsIGIwKTsKIAogCXN3aXRjaCAoZGlyKSB7CiAJY2FzZSBRX1NSQzoKLQkJYjEgPSBnZW5fcG9ydGF0b20oMCwgKGJwZl9pbnQzMilwb3J0KTsKKwkJYjEgPSBnZW5fcG9ydGF0b20oY3N0YXRlLCAwLCAoYnBmX2ludDMyKXBvcnQpOwogCQlicmVhazsKIAogCWNhc2UgUV9EU1Q6Ci0JCWIxID0gZ2VuX3BvcnRhdG9tKDIsIChicGZfaW50MzIpcG9ydCk7CisJCWIxID0gZ2VuX3BvcnRhdG9tKGNzdGF0ZSwgMiwgKGJwZl9pbnQzMilwb3J0KTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfT1I6CiAJY2FzZSBRX0RFRkFVTFQ6Ci0JCXRtcCA9IGdlbl9wb3J0YXRvbSgwLCAoYnBmX2ludDMyKXBvcnQpOwotCQliMSA9IGdlbl9wb3J0YXRvbSgyLCAoYnBmX2ludDMyKXBvcnQpOworCQl0bXAgPSBnZW5fcG9ydGF0b20oY3N0YXRlLCAwLCAoYnBmX2ludDMyKXBvcnQpOworCQliMSA9IGdlbl9wb3J0YXRvbShjc3RhdGUsIDIsIChicGZfaW50MzIpcG9ydCk7CiAJCWdlbl9vcih0bXAsIGIxKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfQU5EOgotCQl0bXAgPSBnZW5fcG9ydGF0b20oMCwgKGJwZl9pbnQzMilwb3J0KTsKLQkJYjEgPSBnZW5fcG9ydGF0b20oMiwgKGJwZl9pbnQzMilwb3J0KTsKKwkJdG1wID0gZ2VuX3BvcnRhdG9tKGNzdGF0ZSwgMCwgKGJwZl9pbnQzMilwb3J0KTsKKwkJYjEgPSBnZW5fcG9ydGF0b20oY3N0YXRlLCAyLCAoYnBmX2ludDMyKXBvcnQpOwogCQlnZW5fYW5kKHRtcCwgYjEpOwogCQlicmVhazsKIApAQCAtNTE2NCwxMCArNTI5MCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BvcnQocG9ydCwgaXBfcHJvdG8sIGRpcikKLQlpbnQgcG9ydDsKLQlpbnQgaXBfcHJvdG87Ci0JaW50IGRpcjsKK2dlbl9wb3J0KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHBvcnQsIGludCBpcF9wcm90bywgaW50IGRpcikKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICp0bXA7CiAKQEAgLTUxODgsMjAgKzUzMTEsMjAgQEAKIAkgKgogCSAqIFNvIHdlIGFsd2F5cyBjaGVjayBmb3IgRVRIRVJUWVBFX0lQLgogCSAqLwotCWIwID0gIGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVApOworCWIwID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgRVRIRVJUWVBFX0lQKTsKIAogCXN3aXRjaCAoaXBfcHJvdG8pIHsKIAljYXNlIElQUFJPVE9fVURQOgogCWNhc2UgSVBQUk9UT19UQ1A6CiAJY2FzZSBJUFBST1RPX1NDVFA6Ci0JCWIxID0gZ2VuX3BvcnRvcChwb3J0LCBpcF9wcm90bywgZGlyKTsKKwkJYjEgPSBnZW5fcG9ydG9wKGNzdGF0ZSwgcG9ydCwgaXBfcHJvdG8sIGRpcik7CiAJCWJyZWFrOwogCiAJY2FzZSBQUk9UT19VTkRFRjoKLQkJdG1wID0gZ2VuX3BvcnRvcChwb3J0LCBJUFBST1RPX1RDUCwgZGlyKTsKLQkJYjEgPSBnZW5fcG9ydG9wKHBvcnQsIElQUFJPVE9fVURQLCBkaXIpOworCQl0bXAgPSBnZW5fcG9ydG9wKGNzdGF0ZSwgcG9ydCwgSVBQUk9UT19UQ1AsIGRpcik7CisJCWIxID0gZ2VuX3BvcnRvcChjc3RhdGUsIHBvcnQsIElQUFJPVE9fVURQLCBkaXIpOwogCQlnZW5fb3IodG1wLCBiMSk7Ci0JCXRtcCA9IGdlbl9wb3J0b3AocG9ydCwgSVBQUk9UT19TQ1RQLCBkaXIpOworCQl0bXAgPSBnZW5fcG9ydG9wKGNzdGF0ZSwgcG9ydCwgSVBQUk9UT19TQ1RQLCBkaXIpOwogCQlnZW5fb3IodG1wLCBiMSk7CiAJCWJyZWFrOwogCkBAIC01MjEzLDM0ICs1MzM2LDMzIEBACiB9CiAKIHN0cnVjdCBibG9jayAqCi1nZW5fcG9ydG9wNihwb3J0LCBwcm90bywgZGlyKQotCWludCBwb3J0LCBwcm90bywgZGlyOworZ2VuX3BvcnRvcDYoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgcG9ydCwgaW50IHByb3RvLCBpbnQgZGlyKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMSwgKnRtcDsKIAogCS8qIGlwNiBwcm90byAncHJvdG8nICovCiAJLyogWFhYIC0gY2F0Y2ggdGhlIGZpcnN0IGZyYWdtZW50IG9mIGEgZnJhZ21lbnRlZCBwYWNrZXQ/ICovCi0JYjAgPSBnZW5fY21wKE9SX0xJTktQTCwgNiwgQlBGX0IsIChicGZfaW50MzIpcHJvdG8pOworCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktQTCwgNiwgQlBGX0IsIChicGZfaW50MzIpcHJvdG8pOwogCiAJc3dpdGNoIChkaXIpIHsKIAljYXNlIFFfU1JDOgotCQliMSA9IGdlbl9wb3J0YXRvbTYoMCwgKGJwZl9pbnQzMilwb3J0KTsKKwkJYjEgPSBnZW5fcG9ydGF0b202KGNzdGF0ZSwgMCwgKGJwZl9pbnQzMilwb3J0KTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfRFNUOgotCQliMSA9IGdlbl9wb3J0YXRvbTYoMiwgKGJwZl9pbnQzMilwb3J0KTsKKwkJYjEgPSBnZW5fcG9ydGF0b202KGNzdGF0ZSwgMiwgKGJwZl9pbnQzMilwb3J0KTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfT1I6CiAJY2FzZSBRX0RFRkFVTFQ6Ci0JCXRtcCA9IGdlbl9wb3J0YXRvbTYoMCwgKGJwZl9pbnQzMilwb3J0KTsKLQkJYjEgPSBnZW5fcG9ydGF0b202KDIsIChicGZfaW50MzIpcG9ydCk7CisJCXRtcCA9IGdlbl9wb3J0YXRvbTYoY3N0YXRlLCAwLCAoYnBmX2ludDMyKXBvcnQpOworCQliMSA9IGdlbl9wb3J0YXRvbTYoY3N0YXRlLCAyLCAoYnBmX2ludDMyKXBvcnQpOwogCQlnZW5fb3IodG1wLCBiMSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0FORDoKLQkJdG1wID0gZ2VuX3BvcnRhdG9tNigwLCAoYnBmX2ludDMyKXBvcnQpOwotCQliMSA9IGdlbl9wb3J0YXRvbTYoMiwgKGJwZl9pbnQzMilwb3J0KTsKKwkJdG1wID0gZ2VuX3BvcnRhdG9tNihjc3RhdGUsIDAsIChicGZfaW50MzIpcG9ydCk7CisJCWIxID0gZ2VuX3BvcnRhdG9tNihjc3RhdGUsIDIsIChicGZfaW50MzIpcG9ydCk7CiAJCWdlbl9hbmQodG1wLCBiMSk7CiAJCWJyZWFrOwogCkBAIC01MjUzLDI4ICs1Mzc1LDI1IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BvcnQ2KHBvcnQsIGlwX3Byb3RvLCBkaXIpCi0JaW50IHBvcnQ7Ci0JaW50IGlwX3Byb3RvOwotCWludCBkaXI7CitnZW5fcG9ydDYoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgcG9ydCwgaW50IGlwX3Byb3RvLCBpbnQgZGlyKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMSwgKnRtcDsKIAogCS8qIGxpbmsgcHJvdG8gaXA2ICovCi0JYjAgPSAgZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUFY2KTsKKwliMCA9IGdlbl9saW5rdHlwZShjc3RhdGUsIEVUSEVSVFlQRV9JUFY2KTsKIAogCXN3aXRjaCAoaXBfcHJvdG8pIHsKIAljYXNlIElQUFJPVE9fVURQOgogCWNhc2UgSVBQUk9UT19UQ1A6CiAJY2FzZSBJUFBST1RPX1NDVFA6Ci0JCWIxID0gZ2VuX3BvcnRvcDYocG9ydCwgaXBfcHJvdG8sIGRpcik7CisJCWIxID0gZ2VuX3BvcnRvcDYoY3N0YXRlLCBwb3J0LCBpcF9wcm90bywgZGlyKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBST1RPX1VOREVGOgotCQl0bXAgPSBnZW5fcG9ydG9wNihwb3J0LCBJUFBST1RPX1RDUCwgZGlyKTsKLQkJYjEgPSBnZW5fcG9ydG9wNihwb3J0LCBJUFBST1RPX1VEUCwgZGlyKTsKKwkJdG1wID0gZ2VuX3BvcnRvcDYoY3N0YXRlLCBwb3J0LCBJUFBST1RPX1RDUCwgZGlyKTsKKwkJYjEgPSBnZW5fcG9ydG9wNihjc3RhdGUsIHBvcnQsIElQUFJPVE9fVURQLCBkaXIpOwogCQlnZW5fb3IodG1wLCBiMSk7Ci0JCXRtcCA9IGdlbl9wb3J0b3A2KHBvcnQsIElQUFJPVE9fU0NUUCwgZGlyKTsKKwkJdG1wID0gZ2VuX3BvcnRvcDYoY3N0YXRlLCBwb3J0LCBJUFBST1RPX1NDVFAsIGRpcik7CiAJCWdlbl9vcih0bXAsIGIxKTsKIAkJYnJlYWs7CiAKQEAgLTUyODcsOSArNTQwNiw4IEBACiAKIC8qIGdlbl9wb3J0cmFuZ2UgY29kZSAqLwogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fcG9ydHJhbmdlYXRvbShvZmYsIHYxLCB2MikKLQlpbnQgb2ZmOwotCWJwZl9pbnQzMiB2MSwgdjI7CitnZW5fcG9ydHJhbmdlYXRvbShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBvZmYsIGJwZl9pbnQzMiB2MSwKKyAgICBicGZfaW50MzIgdjIpCiB7CiAJc3RydWN0IGJsb2NrICpiMSwgKmIyOwogCkBAIC01MzA0LDggKzU0MjIsOCBAQAogCQl2MiA9IHZ0ZW1wOwogCX0KIAotCWIxID0gZ2VuX2NtcF9nZShPUl9UUkFOX0lQVjQsIG9mZiwgQlBGX0gsIHYxKTsKLQliMiA9IGdlbl9jbXBfbGUoT1JfVFJBTl9JUFY0LCBvZmYsIEJQRl9ILCB2Mik7CisJYjEgPSBnZW5fY21wX2dlKGNzdGF0ZSwgT1JfVFJBTl9JUFY0LCBvZmYsIEJQRl9ILCB2MSk7CisJYjIgPSBnZW5fY21wX2xlKGNzdGF0ZSwgT1JfVFJBTl9JUFY0LCBvZmYsIEJQRl9ILCB2Mik7CiAKIAlnZW5fYW5kKGIxLCBiMik7CiAKQEAgLTUzMTMsMzcgKzU0MzEsMzUgQEAKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9wb3J0cmFuZ2VvcChwb3J0MSwgcG9ydDIsIHByb3RvLCBkaXIpCi0JaW50IHBvcnQxLCBwb3J0MjsKLQlpbnQgcHJvdG87Ci0JaW50IGRpcjsKK2dlbl9wb3J0cmFuZ2VvcChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBwb3J0MSwgaW50IHBvcnQyLCBpbnQgcHJvdG8sCisgICAgaW50IGRpcikKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICp0bXA7CiAKIAkvKiBpcCBwcm90byAncHJvdG8nIGFuZCBub3QgYSBmcmFnbWVudCBvdGhlciB0aGFuIHRoZSBmaXJzdCBmcmFnbWVudCAqLwotCXRtcCA9IGdlbl9jbXAoT1JfTElOS1BMLCA5LCBCUEZfQiwgKGJwZl9pbnQzMilwcm90byk7Ci0JYjAgPSBnZW5faXBmcmFnKCk7CisJdG1wID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktQTCwgOSwgQlBGX0IsIChicGZfaW50MzIpcHJvdG8pOworCWIwID0gZ2VuX2lwZnJhZyhjc3RhdGUpOwogCWdlbl9hbmQodG1wLCBiMCk7CiAKIAlzd2l0Y2ggKGRpcikgewogCWNhc2UgUV9TUkM6Ci0JCWIxID0gZ2VuX3BvcnRyYW5nZWF0b20oMCwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7CisJCWIxID0gZ2VuX3BvcnRyYW5nZWF0b20oY3N0YXRlLCAwLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfRFNUOgotCQliMSA9IGdlbl9wb3J0cmFuZ2VhdG9tKDIsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOworCQliMSA9IGdlbl9wb3J0cmFuZ2VhdG9tKGNzdGF0ZSwgMiwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7CiAJCWJyZWFrOwogCiAJY2FzZSBRX09SOgogCWNhc2UgUV9ERUZBVUxUOgotCQl0bXAgPSBnZW5fcG9ydHJhbmdlYXRvbSgwLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKLQkJYjEgPSBnZW5fcG9ydHJhbmdlYXRvbSgyLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKKwkJdG1wID0gZ2VuX3BvcnRyYW5nZWF0b20oY3N0YXRlLCAwLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKKwkJYjEgPSBnZW5fcG9ydHJhbmdlYXRvbShjc3RhdGUsIDIsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOwogCQlnZW5fb3IodG1wLCBiMSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0FORDoKLQkJdG1wID0gZ2VuX3BvcnRyYW5nZWF0b20oMCwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7Ci0JCWIxID0gZ2VuX3BvcnRyYW5nZWF0b20oMiwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7CisJCXRtcCA9IGdlbl9wb3J0cmFuZ2VhdG9tKGNzdGF0ZSwgMCwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7CisJCWIxID0gZ2VuX3BvcnRyYW5nZWF0b20oY3N0YXRlLCAyLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKIAkJZ2VuX2FuZCh0bXAsIGIxKTsKIAkJYnJlYWs7CiAKQEAgLTUzNTYsMjggKzU0NzIsMjYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fcG9ydHJhbmdlKHBvcnQxLCBwb3J0MiwgaXBfcHJvdG8sIGRpcikKLQlpbnQgcG9ydDEsIHBvcnQyOwotCWludCBpcF9wcm90bzsKLQlpbnQgZGlyOworZ2VuX3BvcnRyYW5nZShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBwb3J0MSwgaW50IHBvcnQyLCBpbnQgaXBfcHJvdG8sCisgICAgaW50IGRpcikKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICp0bXA7CiAKIAkvKiBsaW5rIHByb3RvIGlwICovCi0JYjAgPSAgZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUCk7CisJYjAgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfSVApOwogCiAJc3dpdGNoIChpcF9wcm90bykgewogCWNhc2UgSVBQUk9UT19VRFA6CiAJY2FzZSBJUFBST1RPX1RDUDoKIAljYXNlIElQUFJPVE9fU0NUUDoKLQkJYjEgPSBnZW5fcG9ydHJhbmdlb3AocG9ydDEsIHBvcnQyLCBpcF9wcm90bywgZGlyKTsKKwkJYjEgPSBnZW5fcG9ydHJhbmdlb3AoY3N0YXRlLCBwb3J0MSwgcG9ydDIsIGlwX3Byb3RvLCBkaXIpOwogCQlicmVhazsKIAogCWNhc2UgUFJPVE9fVU5ERUY6Ci0JCXRtcCA9IGdlbl9wb3J0cmFuZ2VvcChwb3J0MSwgcG9ydDIsIElQUFJPVE9fVENQLCBkaXIpOwotCQliMSA9IGdlbl9wb3J0cmFuZ2VvcChwb3J0MSwgcG9ydDIsIElQUFJPVE9fVURQLCBkaXIpOworCQl0bXAgPSBnZW5fcG9ydHJhbmdlb3AoY3N0YXRlLCBwb3J0MSwgcG9ydDIsIElQUFJPVE9fVENQLCBkaXIpOworCQliMSA9IGdlbl9wb3J0cmFuZ2VvcChjc3RhdGUsIHBvcnQxLCBwb3J0MiwgSVBQUk9UT19VRFAsIGRpcik7CiAJCWdlbl9vcih0bXAsIGIxKTsKLQkJdG1wID0gZ2VuX3BvcnRyYW5nZW9wKHBvcnQxLCBwb3J0MiwgSVBQUk9UT19TQ1RQLCBkaXIpOworCQl0bXAgPSBnZW5fcG9ydHJhbmdlb3AoY3N0YXRlLCBwb3J0MSwgcG9ydDIsIElQUFJPVE9fU0NUUCwgZGlyKTsKIAkJZ2VuX29yKHRtcCwgYjEpOwogCQlicmVhazsKIApAQCAtNTM4OSw5ICs1NTAzLDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fcG9ydHJhbmdlYXRvbTYob2ZmLCB2MSwgdjIpCi0JaW50IG9mZjsKLQlicGZfaW50MzIgdjEsIHYyOworZ2VuX3BvcnRyYW5nZWF0b202KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IG9mZiwgYnBmX2ludDMyIHYxLAorICAgIGJwZl9pbnQzMiB2MikKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIxLCAqYjI7CiAKQEAgLTU0MDYsOCArNTUxOSw4IEBACiAJCXYyID0gdnRlbXA7CiAJfQogCi0JYjEgPSBnZW5fY21wX2dlKE9SX1RSQU5fSVBWNiwgb2ZmLCBCUEZfSCwgdjEpOwotCWIyID0gZ2VuX2NtcF9sZShPUl9UUkFOX0lQVjYsIG9mZiwgQlBGX0gsIHYyKTsKKwliMSA9IGdlbl9jbXBfZ2UoY3N0YXRlLCBPUl9UUkFOX0lQVjYsIG9mZiwgQlBGX0gsIHYxKTsKKwliMiA9IGdlbl9jbXBfbGUoY3N0YXRlLCBPUl9UUkFOX0lQVjYsIG9mZiwgQlBGX0gsIHYyKTsKIAogCWdlbl9hbmQoYjEsIGIyKTsKIApAQCAtNTQxNSwzNiArNTUyOCwzNCBAQAogfQogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BvcnRyYW5nZW9wNihwb3J0MSwgcG9ydDIsIHByb3RvLCBkaXIpCi0JaW50IHBvcnQxLCBwb3J0MjsKLQlpbnQgcHJvdG87Ci0JaW50IGRpcjsKK2dlbl9wb3J0cmFuZ2VvcDYoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgcG9ydDEsIGludCBwb3J0MiwgaW50IHByb3RvLAorICAgIGludCBkaXIpCiB7CiAJc3RydWN0IGJsb2NrICpiMCwgKmIxLCAqdG1wOwogCiAJLyogaXA2IHByb3RvICdwcm90bycgKi8KIAkvKiBYWFggLSBjYXRjaCB0aGUgZmlyc3QgZnJhZ21lbnQgb2YgYSBmcmFnbWVudGVkIHBhY2tldD8gKi8KLQliMCA9IGdlbl9jbXAoT1JfTElOS1BMLCA2LCBCUEZfQiwgKGJwZl9pbnQzMilwcm90byk7CisJYjAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1BMLCA2LCBCUEZfQiwgKGJwZl9pbnQzMilwcm90byk7CiAKIAlzd2l0Y2ggKGRpcikgewogCWNhc2UgUV9TUkM6Ci0JCWIxID0gZ2VuX3BvcnRyYW5nZWF0b202KDAsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOworCQliMSA9IGdlbl9wb3J0cmFuZ2VhdG9tNihjc3RhdGUsIDAsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOwogCQlicmVhazsKIAogCWNhc2UgUV9EU1Q6Ci0JCWIxID0gZ2VuX3BvcnRyYW5nZWF0b202KDIsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOworCQliMSA9IGdlbl9wb3J0cmFuZ2VhdG9tNihjc3RhdGUsIDIsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOwogCQlicmVhazsKIAogCWNhc2UgUV9PUjoKIAljYXNlIFFfREVGQVVMVDoKLQkJdG1wID0gZ2VuX3BvcnRyYW5nZWF0b202KDAsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOwotCQliMSA9IGdlbl9wb3J0cmFuZ2VhdG9tNigyLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKKwkJdG1wID0gZ2VuX3BvcnRyYW5nZWF0b202KGNzdGF0ZSwgMCwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7CisJCWIxID0gZ2VuX3BvcnRyYW5nZWF0b202KGNzdGF0ZSwgMiwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7CiAJCWdlbl9vcih0bXAsIGIxKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfQU5EOgotCQl0bXAgPSBnZW5fcG9ydHJhbmdlYXRvbTYoMCwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7Ci0JCWIxID0gZ2VuX3BvcnRyYW5nZWF0b202KDIsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOworCQl0bXAgPSBnZW5fcG9ydHJhbmdlYXRvbTYoY3N0YXRlLCAwLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKKwkJYjEgPSBnZW5fcG9ydHJhbmdlYXRvbTYoY3N0YXRlLCAyLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKIAkJZ2VuX2FuZCh0bXAsIGIxKTsKIAkJYnJlYWs7CiAKQEAgLTU0NTcsMjggKzU1NjgsMjYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fcG9ydHJhbmdlNihwb3J0MSwgcG9ydDIsIGlwX3Byb3RvLCBkaXIpCi0JaW50IHBvcnQxLCBwb3J0MjsKLQlpbnQgaXBfcHJvdG87Ci0JaW50IGRpcjsKK2dlbl9wb3J0cmFuZ2U2KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHBvcnQxLCBpbnQgcG9ydDIsIGludCBpcF9wcm90bywKKyAgICBpbnQgZGlyKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMSwgKnRtcDsKIAogCS8qIGxpbmsgcHJvdG8gaXA2ICovCi0JYjAgPSAgZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUFY2KTsKKwliMCA9IGdlbl9saW5rdHlwZShjc3RhdGUsIEVUSEVSVFlQRV9JUFY2KTsKIAogCXN3aXRjaCAoaXBfcHJvdG8pIHsKIAljYXNlIElQUFJPVE9fVURQOgogCWNhc2UgSVBQUk9UT19UQ1A6CiAJY2FzZSBJUFBST1RPX1NDVFA6Ci0JCWIxID0gZ2VuX3BvcnRyYW5nZW9wNihwb3J0MSwgcG9ydDIsIGlwX3Byb3RvLCBkaXIpOworCQliMSA9IGdlbl9wb3J0cmFuZ2VvcDYoY3N0YXRlLCBwb3J0MSwgcG9ydDIsIGlwX3Byb3RvLCBkaXIpOwogCQlicmVhazsKIAogCWNhc2UgUFJPVE9fVU5ERUY6Ci0JCXRtcCA9IGdlbl9wb3J0cmFuZ2VvcDYocG9ydDEsIHBvcnQyLCBJUFBST1RPX1RDUCwgZGlyKTsKLQkJYjEgPSBnZW5fcG9ydHJhbmdlb3A2KHBvcnQxLCBwb3J0MiwgSVBQUk9UT19VRFAsIGRpcik7CisJCXRtcCA9IGdlbl9wb3J0cmFuZ2VvcDYoY3N0YXRlLCBwb3J0MSwgcG9ydDIsIElQUFJPVE9fVENQLCBkaXIpOworCQliMSA9IGdlbl9wb3J0cmFuZ2VvcDYoY3N0YXRlLCBwb3J0MSwgcG9ydDIsIElQUFJPVE9fVURQLCBkaXIpOwogCQlnZW5fb3IodG1wLCBiMSk7Ci0JCXRtcCA9IGdlbl9wb3J0cmFuZ2VvcDYocG9ydDEsIHBvcnQyLCBJUFBST1RPX1NDVFAsIGRpcik7CisJCXRtcCA9IGdlbl9wb3J0cmFuZ2VvcDYoY3N0YXRlLCBwb3J0MSwgcG9ydDIsIElQUFJPVE9fU0NUUCwgZGlyKTsKIAkJZ2VuX29yKHRtcCwgYjEpOwogCQlicmVhazsKIApAQCAtNTQ5MCw5ICs1NTk5LDcgQEAKIH0KIAogc3RhdGljIGludAotbG9va3VwX3Byb3RvKG5hbWUsIHByb3RvKQotCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWU7Ci0JcmVnaXN0ZXIgaW50IHByb3RvOworbG9va3VwX3Byb3RvKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHByb3RvKQogewogCXJlZ2lzdGVyIGludCB2OwogCkBAIC01NTAzLDE2ICs1NjEwLDE2IEBACiAJY2FzZSBRX0lQVjY6CiAJCXYgPSBwY2FwX25hbWV0b3Byb3RvKG5hbWUpOwogCQlpZiAodiA9PSBQUk9UT19VTkRFRikKLQkJCWJwZl9lcnJvcigidW5rbm93biBpcCBwcm90byAnJXMnIiwgbmFtZSk7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biBpcCBwcm90byAnJXMnIiwgbmFtZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0xJTks6Ci0JCS8qIFhYWCBzaG91bGQgbG9vayB1cCBoL3cgcHJvdG9jb2wgdHlwZSBiYXNlZCBvbiBsaW5rdHlwZSAqLworCQkvKiBYWFggc2hvdWxkIGxvb2sgdXAgaC93IHByb3RvY29sIHR5cGUgYmFzZWQgb24gY3N0YXRlLT5saW5rdHlwZSAqLwogCQl2ID0gcGNhcF9uYW1ldG9lcHJvdG8obmFtZSk7CiAJCWlmICh2ID09IFBST1RPX1VOREVGKSB7CiAJCQl2ID0gcGNhcF9uYW1ldG9sbGMobmFtZSk7CiAJCQlpZiAodiA9PSBQUk9UT19VTkRFRikKLQkJCQlicGZfZXJyb3IoInVua25vd24gZXRoZXIgcHJvdG8gJyVzJyIsIG5hbWUpOworCQkJCWJwZl9lcnJvcihjc3RhdGUsICJ1bmtub3duIGV0aGVyIHByb3RvICclcyciLCBuYW1lKTsKIAkJfQogCQlicmVhazsKIApAQCAtNTUyNCw3ICs1NjMxLDcgQEAKIAkJZWxzZSBpZiAoc3RyY21wKG5hbWUsICJjbG5wIikgPT0gMCkKIAkJCXYgPSBJU084NDczX0NMTlA7CiAJCWVsc2UKLQkJCWJwZl9lcnJvcigidW5rbm93biBvc2kgcHJvdG8gJyVzJyIsIG5hbWUpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gb3NpIHByb3RvICclcyciLCBuYW1lKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNTU0NSwzNSArNTY1MiwzMiBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3Byb3RvY2hhaW4odiwgcHJvdG8sIGRpcikKLQlpbnQgdjsKLQlpbnQgcHJvdG87Ci0JaW50IGRpcjsKK2dlbl9wcm90b2NoYWluKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHYsIGludCBwcm90bywgaW50IGRpcikKIHsKICNpZmRlZiBOT19QUk9UT0NIQUlOCi0JcmV0dXJuIGdlbl9wcm90byh2LCBwcm90bywgZGlyKTsKKwlyZXR1cm4gZ2VuX3Byb3RvKGNzdGF0ZSwgdiwgcHJvdG8sIGRpcik7CiAjZWxzZQogCXN0cnVjdCBibG9jayAqYjAsICpiOwogCXN0cnVjdCBzbGlzdCAqc1sxMDBdOwogCWludCBmaXgyLCBmaXgzLCBmaXg0LCBmaXg1OwogCWludCBhaGNoZWNrLCBhZ2FpbiwgZW5kOwogCWludCBpLCBtYXg7Ci0JaW50IHJlZzIgPSBhbGxvY19yZWcoKTsKKwlpbnQgcmVnMiA9IGFsbG9jX3JlZyhjc3RhdGUpOwogCiAJbWVtc2V0KHMsIDAsIHNpemVvZihzKSk7Ci0JZml4MiA9IGZpeDMgPSBmaXg0ID0gZml4NSA9IDA7CisJZml4MyA9IGZpeDQgPSBmaXg1ID0gMDsKIAogCXN3aXRjaCAocHJvdG8pIHsKIAljYXNlIFFfSVA6CiAJY2FzZSBRX0lQVjY6CiAJCWJyZWFrOwogCWNhc2UgUV9ERUZBVUxUOgotCQliMCA9IGdlbl9wcm90b2NoYWluKHYsIFFfSVAsIGRpcik7Ci0JCWIgPSBnZW5fcHJvdG9jaGFpbih2LCBRX0lQVjYsIGRpcik7CisJCWIwID0gZ2VuX3Byb3RvY2hhaW4oY3N0YXRlLCB2LCBRX0lQLCBkaXIpOworCQliID0gZ2VuX3Byb3RvY2hhaW4oY3N0YXRlLCB2LCBRX0lQVjYsIGRpcik7CiAJCWdlbl9vcihiMCwgYik7CiAJCXJldHVybiBiOwogCWRlZmF1bHQ6Ci0JCWJwZl9lcnJvcigiYmFkIHByb3RvY29sIGFwcGxpZWQgZm9yICdwcm90b2NoYWluJyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiYmFkIHByb3RvY29sIGFwcGxpZWQgZm9yICdwcm90b2NoYWluJyIpOwogCQkvKk5PVFJFQUNIRUQqLwogCX0KIApAQCAtNTU4OCwxMCArNTY5MiwxMCBAQAogCSAqIGJyYW5jaGVzLCBhbmQgYmFja3dhcmQgYnJhbmNoIHN1cHBvcnQgaXMgdW5saWtlbHkgdG8gYXBwZWFyCiAJICogaW4ga2VybmVsIEJQRiBlbmdpbmVzLikKIAkgKi8KLQlpZiAob2ZmX2xpbmtwbC5pc192YXJpYWJsZSkKLQkJYnBmX2Vycm9yKCIncHJvdG9jaGFpbicgbm90IHN1cHBvcnRlZCB3aXRoIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXJzIik7CisJaWYgKGNzdGF0ZS0+b2ZmX2xpbmtwbC5pc192YXJpYWJsZSkKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidwcm90b2NoYWluJyBub3Qgc3VwcG9ydGVkIHdpdGggdmFyaWFibGUgbGVuZ3RoIGhlYWRlcnMiKTsKIAotCW5vX29wdGltaXplID0gMTsgLyp0aGlzIGNvZGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvcHRpbXplciB5ZXQgKi8KKwljc3RhdGUtPm5vX29wdGltaXplID0gMTsgLyp0aGlzIGNvZGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvcHRpbXplciB5ZXQgKi8KIAogCS8qCiAJICogc1swXSBpcyBhIGR1bW15IGVudHJ5IHRvIHByb3RlY3Qgb3RoZXIgQlBGIGluc24gZnJvbSBkYW1hZ2UKQEAgLTU1OTksNDQgKzU3MDMsNDQgQEAKIAkgKiBoYXJkIHRvIGZpbmQgaW50ZXJkZXBlbmRlbmN5IG1hZGUgYnkganVtcCB0YWJsZSBmaXh1cC4KIAkgKi8KIAlpID0gMDsKLQlzW2ldID0gbmV3X3N0bXQoMCk7CS8qZHVtbXkqLworCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIDApOwkvKmR1bW15Ki8KIAlpKys7CiAKIAlzd2l0Y2ggKHByb3RvKSB7CiAJY2FzZSBRX0lQOgotCQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVApOworCQliMCA9IGdlbl9saW5rdHlwZShjc3RhdGUsIEVUSEVSVFlQRV9JUCk7CiAKIAkJLyogQSA9IGlwLT5pcF9wICovCi0JCXNbaV0gPSBuZXdfc3RtdChCUEZfTER8QlBGX0FCU3xCUEZfQik7Ci0JCXNbaV0tPnMuayA9IG9mZl9saW5rcGwuY29uc3RhbnRfcGFydCArIG9mZl9ubCArIDk7CisJCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfQUJTfEJQRl9CKTsKKwkJc1tpXS0+cy5rID0gY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBjc3RhdGUtPm9mZl9ubCArIDk7CiAJCWkrKzsKIAkJLyogWCA9IGlwLT5pcF9obCA8PCAyICovCi0JCXNbaV0gPSBuZXdfc3RtdChCUEZfTERYfEJQRl9NU0h8QlBGX0IpOwotCQlzW2ldLT5zLmsgPSBvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBvZmZfbmw7CisJCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRFh8QlBGX01TSHxCUEZfQik7CisJCXNbaV0tPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgY3N0YXRlLT5vZmZfbmw7CiAJCWkrKzsKIAkJYnJlYWs7CiAKIAljYXNlIFFfSVBWNjoKLQkJYjAgPSBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0lQVjYpOworCQliMCA9IGdlbl9saW5rdHlwZShjc3RhdGUsIEVUSEVSVFlQRV9JUFY2KTsKIAogCQkvKiBBID0gaXA2LT5pcF9ueHQgKi8KLQkJc1tpXSA9IG5ld19zdG10KEJQRl9MRHxCUEZfQUJTfEJQRl9CKTsKLQkJc1tpXS0+cy5rID0gb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgb2ZmX25sICsgNjsKKwkJc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9BQlN8QlBGX0IpOworCQlzW2ldLT5zLmsgPSBjc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCArIGNzdGF0ZS0+b2ZmX25sICsgNjsKIAkJaSsrOwogCQkvKiBYID0gc2l6ZW9mKHN0cnVjdCBpcDZfaGRyKSAqLwotCQlzW2ldID0gbmV3X3N0bXQoQlBGX0xEWHxCUEZfSU1NKTsKKwkJc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEWHxCUEZfSU1NKTsKIAkJc1tpXS0+cy5rID0gNDA7CiAJCWkrKzsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlicGZfZXJyb3IoInVuc3VwcG9ydGVkIHByb3RvIHRvIGdlbl9wcm90b2NoYWluIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJ1bnN1cHBvcnRlZCBwcm90byB0byBnZW5fcHJvdG9jaGFpbiIpOwogCQkvKk5PVFJFQUNIRUQqLwogCX0KIAogCS8qIGFnYWluOiBpZiAoQSA9PSB2KSBnb3RvIGVuZDsgZWxzZSBmYWxsIHRocm91Z2g7ICovCiAJYWdhaW4gPSBpOwotCXNbaV0gPSBuZXdfc3RtdChCUEZfSk1QfEJQRl9KRVF8QlBGX0spOworCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9KTVB8QlBGX0pFUXxCUEZfSyk7CiAJc1tpXS0+cy5rID0gdjsKIAlzW2ldLT5zLmp0ID0gTlVMTDsJCS8qbGF0ZXIqLwogCXNbaV0tPnMuamYgPSBOVUxMOwkJLyp1cGRhdGUgaW4gbmV4dCBzdG10Ki8KQEAgLTU2NDcsNyArNTc1MSw3IEBACiAjZGVmaW5lIElQUFJPVE9fTk9ORQk1OQogI2VuZGlmCiAJLyogaWYgKEEgPT0gSVBQUk9UT19OT05FKSBnb3RvIGVuZCAqLwotCXNbaV0gPSBuZXdfc3RtdChCUEZfSk1QfEJQRl9KRVF8QlBGX0spOworCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9KTVB8QlBGX0pFUXxCUEZfSyk7CiAJc1tpXS0+cy5qdCA9IE5VTEw7CS8qbGF0ZXIqLwogCXNbaV0tPnMuamYgPSBOVUxMOwkvKnVwZGF0ZSBpbiBuZXh0IHN0bXQqLwogCXNbaV0tPnMuayA9IElQUFJPVE9fTk9ORTsKQEAgLTU2NjAsMjYgKzU3NjQsMjYgQEAKIAogCQl2NnN0YXJ0ID0gaTsKIAkJLyogaWYgKEEgPT0gSVBQUk9UT19IT1BPUFRTKSBnb3RvIHY2YWR2YW5jZSAqLwotCQlzW2ldID0gbmV3X3N0bXQoQlBGX0pNUHxCUEZfSkVRfEJQRl9LKTsKKwkJc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0pNUHxCUEZfSkVRfEJQRl9LKTsKIAkJc1tpXS0+cy5qdCA9IE5VTEw7CS8qbGF0ZXIqLwogCQlzW2ldLT5zLmpmID0gTlVMTDsJLyp1cGRhdGUgaW4gbmV4dCBzdG10Ki8KIAkJc1tpXS0+cy5rID0gSVBQUk9UT19IT1BPUFRTOwogCQlzW2ZpeDJdLT5zLmpmID0gc1tpXTsKIAkJaSsrOwogCQkvKiBpZiAoQSA9PSBJUFBST1RPX0RTVE9QVFMpIGdvdG8gdjZhZHZhbmNlICovCi0JCXNbaSAtIDFdLT5zLmpmID0gc1tpXSA9IG5ld19zdG10KEJQRl9KTVB8QlBGX0pFUXxCUEZfSyk7CisJCXNbaSAtIDFdLT5zLmpmID0gc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0pNUHxCUEZfSkVRfEJQRl9LKTsKIAkJc1tpXS0+cy5qdCA9IE5VTEw7CS8qbGF0ZXIqLwogCQlzW2ldLT5zLmpmID0gTlVMTDsJLyp1cGRhdGUgaW4gbmV4dCBzdG10Ki8KIAkJc1tpXS0+cy5rID0gSVBQUk9UT19EU1RPUFRTOwogCQlpKys7CiAJCS8qIGlmIChBID09IElQUFJPVE9fUk9VVElORykgZ290byB2NmFkdmFuY2UgKi8KLQkJc1tpIC0gMV0tPnMuamYgPSBzW2ldID0gbmV3X3N0bXQoQlBGX0pNUHxCUEZfSkVRfEJQRl9LKTsKKwkJc1tpIC0gMV0tPnMuamYgPSBzW2ldID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfSk1QfEJQRl9KRVF8QlBGX0spOwogCQlzW2ldLT5zLmp0ID0gTlVMTDsJLypsYXRlciovCiAJCXNbaV0tPnMuamYgPSBOVUxMOwkvKnVwZGF0ZSBpbiBuZXh0IHN0bXQqLwogCQlzW2ldLT5zLmsgPSBJUFBST1RPX1JPVVRJTkc7CiAJCWkrKzsKIAkJLyogaWYgKEEgPT0gSVBQUk9UT19GUkFHTUVOVCkgZ290byB2NmFkdmFuY2U7IGVsc2UgZ290byBhaGNoZWNrOyAqLwotCQlzW2kgLSAxXS0+cy5qZiA9IHNbaV0gPSBuZXdfc3RtdChCUEZfSk1QfEJQRl9KRVF8QlBGX0spOworCQlzW2kgLSAxXS0+cy5qZiA9IHNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9KTVB8QlBGX0pFUXxCUEZfSyk7CiAJCXNbaV0tPnMuanQgPSBOVUxMOwkvKmxhdGVyKi8KIAkJc1tpXS0+cy5qZiA9IE5VTEw7CS8qbGF0ZXIqLwogCQlzW2ldLT5zLmsgPSBJUFBST1RPX0ZSQUdNRU5UOwpAQCAtNTY5NiwzOSArNTgwMCwzOSBAQAogCQkgKiBYID0gWCArIChQW1ggKyBwYWNrZXQgaGVhZCArIDFdICsgMSkgKiA4OwogCQkgKi8KIAkJLyogQSA9IFBbWCArIHBhY2tldCBoZWFkXSAqLwotCQlzW2ldID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8QlBGX0IpOwotCQlzW2ldLT5zLmsgPSBvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBvZmZfbmw7CisJCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfSU5EfEJQRl9CKTsKKwkJc1tpXS0+cy5rID0gY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBjc3RhdGUtPm9mZl9ubDsKIAkJaSsrOwogCQkvKiBNRU1bcmVnMl0gPSBBICovCi0JCXNbaV0gPSBuZXdfc3RtdChCUEZfU1QpOworCQlzW2ldID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfU1QpOwogCQlzW2ldLT5zLmsgPSByZWcyOwogCQlpKys7CiAJCS8qIEEgPSBQW1ggKyBwYWNrZXQgaGVhZCArIDFdOyAqLwotCQlzW2ldID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8QlBGX0IpOwotCQlzW2ldLT5zLmsgPSBvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBvZmZfbmwgKyAxOworCQlzW2ldID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX0lORHxCUEZfQik7CisJCXNbaV0tPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgY3N0YXRlLT5vZmZfbmwgKyAxOwogCQlpKys7CiAJCS8qIEEgKz0gMSAqLwotCQlzW2ldID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKKwkJc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKIAkJc1tpXS0+cy5rID0gMTsKIAkJaSsrOwogCQkvKiBBICo9IDggKi8KLQkJc1tpXSA9IG5ld19zdG10KEJQRl9BTFV8QlBGX01VTHxCUEZfSyk7CisJCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX01VTHxCUEZfSyk7CiAJCXNbaV0tPnMuayA9IDg7CiAJCWkrKzsKIAkJLyogQSArPSBYICovCi0JCXNbaV0gPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX1gpOworCQlzW2ldID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfQUxVfEJQRl9BRER8QlBGX1gpOwogCQlzW2ldLT5zLmsgPSAwOwogCQlpKys7CiAJCS8qIFggPSBBOyAqLwotCQlzW2ldID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CisJCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9NSVNDfEJQRl9UQVgpOwogCQlpKys7CiAJCS8qIEEgPSBNRU1bcmVnMl0gKi8KLQkJc1tpXSA9IG5ld19zdG10KEJQRl9MRHxCUEZfTUVNKTsKKwkJc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9NRU0pOwogCQlzW2ldLT5zLmsgPSByZWcyOwogCQlpKys7CiAKIAkJLyogZ290byBhZ2FpbjsgKG11c3QgdXNlIEJQRl9KQSBmb3IgYmFja3dhcmQganVtcCkgKi8KLQkJc1tpXSA9IG5ld19zdG10KEJQRl9KTVB8QlBGX0pBKTsKKwkJc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0pNUHxCUEZfSkEpOwogCQlzW2ldLT5zLmsgPSBhZ2FpbiAtIGkgLSAxOwogCQlzW2kgLSAxXS0+cy5qZiA9IHNbaV07CiAJCWkrKzsKQEAgLTU3MzgsNyArNTg0Miw3IEBACiAJCQlzW2pdLT5zLmp0ID0gc1t2NmFkdmFuY2VdOwogCX0gZWxzZSB7CiAJCS8qIG5vcCAqLwotCQlzW2ldID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKKwkJc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKIAkJc1tpXS0+cy5rID0gMDsKIAkJc1tmaXgyXS0+cy5qZiA9IHNbaV07CiAJCWkrKzsKQEAgLTU3NDcsNyArNTg1MSw3IEBACiAJLyogYWhjaGVjazogKi8KIAlhaGNoZWNrID0gaTsKIAkvKiBpZiAoQSA9PSBJUFBST1RPX0FIKSB0aGVuIGZhbGwgdGhyb3VnaDsgZWxzZSBnb3RvIGVuZDsgKi8KLQlzW2ldID0gbmV3X3N0bXQoQlBGX0pNUHxCUEZfSkVRfEJQRl9LKTsKKwlzW2ldID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfSk1QfEJQRl9KRVF8QlBGX0spOwogCXNbaV0tPnMuanQgPSBOVUxMOwkvKmxhdGVyKi8KIAlzW2ldLT5zLmpmID0gTlVMTDsJLypsYXRlciovCiAJc1tpXS0+cy5rID0gSVBQUk9UT19BSDsKQEAgLTU3NjIsNTQgKzU4NjYsNTQgQEAKIAkgKiBYID0gWCArIChQW1ggKyAxXSArIDIpICogNDsKIAkgKi8KIAkvKiBBID0gWCAqLwotCXNbaSAtIDFdLT5zLmp0ID0gc1tpXSA9IG5ld19zdG10KEJQRl9NSVNDfEJQRl9UWEEpOworCXNbaSAtIDFdLT5zLmp0ID0gc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX01JU0N8QlBGX1RYQSk7CiAJaSsrOwogCS8qIEEgPSBQW1ggKyBwYWNrZXQgaGVhZF07ICovCi0Jc1tpXSA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfEJQRl9CKTsKLQlzW2ldLT5zLmsgPSBvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBvZmZfbmw7CisJc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9JTkR8QlBGX0IpOworCXNbaV0tPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgY3N0YXRlLT5vZmZfbmw7CiAJaSsrOwogCS8qIE1FTVtyZWcyXSA9IEEgKi8KLQlzW2ldID0gbmV3X3N0bXQoQlBGX1NUKTsKKwlzW2ldID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfU1QpOwogCXNbaV0tPnMuayA9IHJlZzI7CiAJaSsrOwogCS8qIEEgPSBYICovCi0Jc1tpIC0gMV0tPnMuanQgPSBzW2ldID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RYQSk7CisJc1tpIC0gMV0tPnMuanQgPSBzW2ldID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTUlTQ3xCUEZfVFhBKTsKIAlpKys7CiAJLyogQSArPSAxICovCi0Jc1tpXSA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfSyk7CisJc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKIAlzW2ldLT5zLmsgPSAxOwogCWkrKzsKIAkvKiBYID0gQSAqLwotCXNbaV0gPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKKwlzW2ldID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTUlTQ3xCUEZfVEFYKTsKIAlpKys7CiAJLyogQSA9IFBbWCArIHBhY2tldCBoZWFkXSAqLwotCXNbaV0gPSBuZXdfc3RtdChCUEZfTER8QlBGX0lORHxCUEZfQik7Ci0Jc1tpXS0+cy5rID0gb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgb2ZmX25sOworCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfSU5EfEJQRl9CKTsKKwlzW2ldLT5zLmsgPSBjc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCArIGNzdGF0ZS0+b2ZmX25sOwogCWkrKzsKIAkvKiBBICs9IDIgKi8KLQlzW2ldID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKKwlzW2ldID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfQUxVfEJQRl9BRER8QlBGX0spOwogCXNbaV0tPnMuayA9IDI7CiAJaSsrOwogCS8qIEEgKj0gNCAqLwotCXNbaV0gPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9NVUx8QlBGX0spOworCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX01VTHxCUEZfSyk7CiAJc1tpXS0+cy5rID0gNDsKIAlpKys7CiAJLyogWCA9IEE7ICovCi0Jc1tpXSA9IG5ld19zdG10KEJQRl9NSVNDfEJQRl9UQVgpOworCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9NSVNDfEJQRl9UQVgpOwogCWkrKzsKIAkvKiBBID0gTUVNW3JlZzJdICovCi0Jc1tpXSA9IG5ld19zdG10KEJQRl9MRHxCUEZfTUVNKTsKKwlzW2ldID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX01FTSk7CiAJc1tpXS0+cy5rID0gcmVnMjsKIAlpKys7CiAKIAkvKiBnb3RvIGFnYWluOyAobXVzdCB1c2UgQlBGX0pBIGZvciBiYWNrd2FyZCBqdW1wKSAqLwotCXNbaV0gPSBuZXdfc3RtdChCUEZfSk1QfEJQRl9KQSk7CisJc1tpXSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0pNUHxCUEZfSkEpOwogCXNbaV0tPnMuayA9IGFnYWluIC0gaSAtIDE7CiAJaSsrOwogCiAJLyogZW5kOiBub3AgKi8KIAllbmQgPSBpOwotCXNbaV0gPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX0spOworCXNbaV0gPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX0FERHxCUEZfSyk7CiAJc1tpXS0+cy5rID0gMDsKIAlzW2ZpeDJdLT5zLmp0ID0gc1tlbmRdOwogCXNbZml4NF0tPnMuamYgPSBzW2VuZF07CkBAIC01ODI3LDExICs1OTMxLDExIEBACiAJLyoKIAkgKiBlbWl0IGZpbmFsIGNoZWNrCiAJICovCi0JYiA9IG5ld19ibG9jayhKTVAoQlBGX0pFUSkpOworCWIgPSBuZXdfYmxvY2soY3N0YXRlLCBKTVAoQlBGX0pFUSkpOwogCWItPnN0bXRzID0gc1sxXTsJLypyZW1lbWJlciwgc1swXSBpcyBkdW1teSovCiAJYi0+cy5rID0gdjsKIAotCWZyZWVfcmVnKHJlZzIpOworCWZyZWVfcmVnKGNzdGF0ZSwgcmVnMik7CiAKIAlnZW5fYW5kKGIwLCBiKTsKIAlyZXR1cm4gYjsKQEAgLTU4MzksNyArNTk0Myw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2NoZWNrXzgwMl8xMV9kYXRhX2ZyYW1lKCkKK2dlbl9jaGVja184MDJfMTFfZGF0YV9mcmFtZShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJc3RydWN0IHNsaXN0ICpzOwogCXN0cnVjdCBibG9jayAqYjAsICpiMTsKQEAgLTU4NDgsMTMgKzU5NTIsMTMgQEAKIAkgKiBBIGRhdGEgZnJhbWUgaGFzIHRoZSAweDA4IGJpdCAoYjMpIGluIHRoZSBmcmFtZSBjb250cm9sIGZpZWxkIHNldAogCSAqIGFuZCB0aGUgMHgwNCBiaXQgKGIyKSBjbGVhci4KIAkgKi8KLQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LSERSLCAwLCBCUEZfQik7Ci0JYjAgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LSERSLCAwLCBCUEZfQik7CisJYjAgPSBuZXdfYmxvY2soY3N0YXRlLCBKTVAoQlBGX0pTRVQpKTsKIAliMC0+cy5rID0gMHgwODsKIAliMC0+c3RtdHMgPSBzOwogCi0JcyA9IGdlbl9sb2FkX2EoT1JfTElOS0hEUiwgMCwgQlBGX0IpOwotCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCXMgPSBnZW5fbG9hZF9hKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IpOworCWIxID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJYjEtPnMuayA9IDB4MDQ7CiAJYjEtPnN0bXRzID0gczsKIAlnZW5fbm90KGIxKTsKQEAgLTU4NzQsMTAgKzU5NzgsNyBAQAogICogYWdhaW5zdCBRX0lQIGFuZCBRX0lQVjYuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3Byb3RvKHYsIHByb3RvLCBkaXIpCi0JaW50IHY7Ci0JaW50IHByb3RvOwotCWludCBkaXI7CitnZW5fcHJvdG8oY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgdiwgaW50IHByb3RvLCBpbnQgZGlyKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMTsKICNpZm5kZWYgQ0hBU0VfQ0hBSU4KQEAgLTU4ODUsMTIgKzU5ODYsMTIgQEAKICNlbmRpZgogCiAJaWYgKGRpciAhPSBRX0RFRkFVTFQpCi0JCWJwZl9lcnJvcigiZGlyZWN0aW9uIGFwcGxpZWQgdG8gJ3Byb3RvJyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiZGlyZWN0aW9uIGFwcGxpZWQgdG8gJ3Byb3RvJyIpOwogCiAJc3dpdGNoIChwcm90bykgewogCWNhc2UgUV9ERUZBVUxUOgotCQliMCA9IGdlbl9wcm90byh2LCBRX0lQLCBkaXIpOwotCQliMSA9IGdlbl9wcm90byh2LCBRX0lQVjYsIGRpcik7CisJCWIwID0gZ2VuX3Byb3RvKGNzdGF0ZSwgdiwgUV9JUCwgZGlyKTsKKwkJYjEgPSBnZW5fcHJvdG8oY3N0YXRlLCB2LCBRX0lQVjYsIGRpcik7CiAJCWdlbl9vcihiMCwgYjEpOwogCQlyZXR1cm4gYjE7CiAKQEAgLTU5MTAsMjIgKzYwMTEsMjIgQEAKIAkJICoKIAkJICogU28gd2UgYWx3YXlzIGNoZWNrIGZvciBFVEhFUlRZUEVfSVAuCiAJCSAqLwotCQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVApOworCQliMCA9IGdlbl9saW5rdHlwZShjc3RhdGUsIEVUSEVSVFlQRV9JUCk7CiAjaWZuZGVmIENIQVNFX0NIQUlOCi0JCWIxID0gZ2VuX2NtcChPUl9MSU5LUEwsIDksIEJQRl9CLCAoYnBmX2ludDMyKXYpOworCQliMSA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIDksIEJQRl9CLCAoYnBmX2ludDMyKXYpOwogI2Vsc2UKLQkJYjEgPSBnZW5fcHJvdG9jaGFpbih2LCBRX0lQKTsKKwkJYjEgPSBnZW5fcHJvdG9jaGFpbihjc3RhdGUsIHYsIFFfSVApOwogI2VuZGlmCiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCiAJY2FzZSBRX0lTTzoKLQkJc3dpdGNoIChsaW5rdHlwZSkgeworCQlzd2l0Y2ggKGNzdGF0ZS0+bGlua3R5cGUpIHsKIAogCQljYXNlIERMVF9GUkVMQVk6CiAJCQkvKgogCQkJICogRnJhbWUgUmVsYXkgcGFja2V0cyB0eXBpY2FsbHkgaGF2ZSBhbiBPU0kKLQkJCSAqIE5MUElEIGF0IHRoZSBiZWdpbm5pbmc7ICJnZW5fbGlua3R5cGUoTExDU0FQX0lTT05TKSIKKwkJCSAqIE5MUElEIGF0IHRoZSBiZWdpbm5pbmc7ICJnZW5fbGlua3R5cGUoY3N0YXRlLCBMTENTQVBfSVNPTlMpIgogCQkJICogZ2VuZXJhdGVzIGNvZGUgdG8gY2hlY2sgZm9yIGFsbCB0aGUgT1NJCiAJCQkgKiBOTFBJRHMsIHNvIGNhbGxpbmcgaXQgYW5kIHRoZW4gYWRkaW5nIGEgY2hlY2sKIAkJCSAqIGZvciB0aGUgcGFydGljdWxhciBOTFBJRCBmb3Igd2hpY2ggd2UncmUKQEAgLTU5NDEsNyArNjA0Miw3IEBACiAJCQkgKgogCQkJICogWFhYIC0gd2hhdCBhYm91dCBTTkFQLWVuY2Fwc3VsYXRlZCBmcmFtZXM/CiAJCQkgKi8KLQkJCXJldHVybiBnZW5fY21wKE9SX0xJTktIRFIsIDIsIEJQRl9ILCAoMHgwMzw8OCkgfCB2KTsKKwkJCXJldHVybiBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMiwgQlBGX0gsICgweDAzPDw4KSB8IHYpOwogCQkJLypOT1RSRUFDSEVEKi8KIAkJCWJyZWFrOwogCkBAIC01OTUwLDEzOCArNjA1MSwxMzggQEAKIAkJCSAqIENpc2NvIHVzZXMgYW4gRXRoZXJ0eXBlIGxvb2thbGlrZSAtIGZvciBPU0ksCiAJCQkgKiBpdCdzIDB4ZmVmZS4KIAkJCSAqLwotCQkJYjAgPSBnZW5fbGlua3R5cGUoTExDU0FQX0lTT05TPDw4IHwgTExDU0FQX0lTT05TKTsKKwkJCWIwID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgTExDU0FQX0lTT05TPDw4IHwgTExDU0FQX0lTT05TKTsKIAkJCS8qIE9TSSBpbiBDLUhETEMgaXMgc3R1ZmZlZCB3aXRoIGEgZnVkZ2UgYnl0ZSAqLwotCQkJYjEgPSBnZW5fY21wKE9SX0xJTktQTF9OT1NOQVAsIDEsIEJQRl9CLCAobG9uZyl2KTsKKwkJCWIxID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktQTF9OT1NOQVAsIDEsIEJQRl9CLCAobG9uZyl2KTsKIAkJCWdlbl9hbmQoYjAsIGIxKTsKIAkJCXJldHVybiBiMTsKIAogCQlkZWZhdWx0OgotCQkJYjAgPSBnZW5fbGlua3R5cGUoTExDU0FQX0lTT05TKTsKLQkJCWIxID0gZ2VuX2NtcChPUl9MSU5LUExfTk9TTkFQLCAwLCBCUEZfQiwgKGxvbmcpdik7CisJCQliMCA9IGdlbl9saW5rdHlwZShjc3RhdGUsIExMQ1NBUF9JU09OUyk7CisJCQliMSA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LUExfTk9TTkFQLCAwLCBCUEZfQiwgKGxvbmcpdik7CiAJCQlnZW5fYW5kKGIwLCBiMSk7CiAJCQlyZXR1cm4gYjE7CiAJCX0KIAogCWNhc2UgUV9JU0lTOgotCQliMCA9IGdlbl9wcm90byhJU08xMDU4OV9JU0lTLCBRX0lTTywgUV9ERUZBVUxUKTsKKwkJYjAgPSBnZW5fcHJvdG8oY3N0YXRlLCBJU08xMDU4OV9JU0lTLCBRX0lTTywgUV9ERUZBVUxUKTsKIAkJLyoKIAkJICogNCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBQRFUgdHlwZSByZWxhdGl2ZSB0byB0aGUgSVMtSVMKIAkJICogaGVhZGVyLgogCQkgKi8KLQkJYjEgPSBnZW5fY21wKE9SX0xJTktQTF9OT1NOQVAsIDQsIEJQRl9CLCAobG9uZyl2KTsKKwkJYjEgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1BMX05PU05BUCwgNCwgQlBGX0IsIChsb25nKXYpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIAogCWNhc2UgUV9BUlA6Ci0JCWJwZl9lcnJvcigiYXJwIGRvZXMgbm90IGVuY2Fwc3VsYXRlIGFub3RoZXIgcHJvdG9jb2wiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgImFycCBkb2VzIG5vdCBlbmNhcHN1bGF0ZSBhbm90aGVyIHByb3RvY29sIik7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAogCWNhc2UgUV9SQVJQOgotCQlicGZfZXJyb3IoInJhcnAgZG9lcyBub3QgZW5jYXBzdWxhdGUgYW5vdGhlciBwcm90b2NvbCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAicmFycCBkb2VzIG5vdCBlbmNhcHN1bGF0ZSBhbm90aGVyIHByb3RvY29sIik7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAogCWNhc2UgUV9BVEFMSzoKLQkJYnBmX2Vycm9yKCJhdGFsayBlbmNhcHN1bGF0aW9uIGlzIG5vdCBzcGVjaWZpYWJsZSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiYXRhbGsgZW5jYXBzdWxhdGlvbiBpcyBub3Qgc3BlY2lmaWFibGUiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX0RFQ05FVDoKLQkJYnBmX2Vycm9yKCJkZWNuZXQgZW5jYXBzdWxhdGlvbiBpcyBub3Qgc3BlY2lmaWFibGUiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgImRlY25ldCBlbmNhcHN1bGF0aW9uIGlzIG5vdCBzcGVjaWZpYWJsZSIpOwogCQkvKiBOT1RSRUFDSEVEICovCiAKIAljYXNlIFFfU0NBOgotCQlicGZfZXJyb3IoInNjYSBkb2VzIG5vdCBlbmNhcHN1bGF0ZSBhbm90aGVyIHByb3RvY29sIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJzY2EgZG9lcyBub3QgZW5jYXBzdWxhdGUgYW5vdGhlciBwcm90b2NvbCIpOwogCQkvKiBOT1RSRUFDSEVEICovCiAKIAljYXNlIFFfTEFUOgotCQlicGZfZXJyb3IoImxhdCBkb2VzIG5vdCBlbmNhcHN1bGF0ZSBhbm90aGVyIHByb3RvY29sIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJsYXQgZG9lcyBub3QgZW5jYXBzdWxhdGUgYW5vdGhlciBwcm90b2NvbCIpOwogCQkvKiBOT1RSRUFDSEVEICovCiAKIAljYXNlIFFfTU9QUkM6Ci0JCWJwZl9lcnJvcigibW9wcmMgZG9lcyBub3QgZW5jYXBzdWxhdGUgYW5vdGhlciBwcm90b2NvbCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAibW9wcmMgZG9lcyBub3QgZW5jYXBzdWxhdGUgYW5vdGhlciBwcm90b2NvbCIpOwogCQkvKiBOT1RSRUFDSEVEICovCiAKIAljYXNlIFFfTU9QREw6Ci0JCWJwZl9lcnJvcigibW9wZGwgZG9lcyBub3QgZW5jYXBzdWxhdGUgYW5vdGhlciBwcm90b2NvbCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAibW9wZGwgZG9lcyBub3QgZW5jYXBzdWxhdGUgYW5vdGhlciBwcm90b2NvbCIpOwogCQkvKiBOT1RSRUFDSEVEICovCiAKIAljYXNlIFFfTElOSzoKLQkJcmV0dXJuIGdlbl9saW5rdHlwZSh2KTsKKwkJcmV0dXJuIGdlbl9saW5rdHlwZShjc3RhdGUsIHYpOwogCiAJY2FzZSBRX1VEUDoKLQkJYnBmX2Vycm9yKCIndWRwIHByb3RvJyBpcyBib2d1cyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3VkcCBwcm90bycgaXMgYm9ndXMiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX1RDUDoKLQkJYnBmX2Vycm9yKCIndGNwIHByb3RvJyBpcyBib2d1cyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3RjcCBwcm90bycgaXMgYm9ndXMiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX1NDVFA6Ci0JCWJwZl9lcnJvcigiJ3NjdHAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInc2N0cCBwcm90bycgaXMgYm9ndXMiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX0lDTVA6Ci0JCWJwZl9lcnJvcigiJ2ljbXAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInaWNtcCBwcm90bycgaXMgYm9ndXMiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX0lHTVA6Ci0JCWJwZl9lcnJvcigiJ2lnbXAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInaWdtcCBwcm90bycgaXMgYm9ndXMiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX0lHUlA6Ci0JCWJwZl9lcnJvcigiJ2lncnAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInaWdycCBwcm90bycgaXMgYm9ndXMiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX1BJTToKLQkJYnBmX2Vycm9yKCIncGltIHByb3RvJyBpcyBib2d1cyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3BpbSBwcm90bycgaXMgYm9ndXMiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX1ZSUlA6Ci0JCWJwZl9lcnJvcigiJ3ZycnAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICIndnJycCBwcm90bycgaXMgYm9ndXMiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX0NBUlA6Ci0JCWJwZl9lcnJvcigiJ2NhcnAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInY2FycCBwcm90bycgaXMgYm9ndXMiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX0lQVjY6Ci0JCWIwID0gZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUFY2KTsKKwkJYjAgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfSVBWNik7CiAjaWZuZGVmIENIQVNFX0NIQUlOCiAJCS8qCiAJCSAqIEFsc28gY2hlY2sgZm9yIGEgZnJhZ21lbnQgaGVhZGVyIGJlZm9yZSB0aGUgZmluYWwKIAkJICogaGVhZGVyLgogCQkgKi8KLQkJYjIgPSBnZW5fY21wKE9SX0xJTktQTCwgNiwgQlBGX0IsIElQUFJPVE9fRlJBR01FTlQpOwotCQliMSA9IGdlbl9jbXAoT1JfTElOS1BMLCA0MCwgQlBGX0IsIChicGZfaW50MzIpdik7CisJCWIyID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktQTCwgNiwgQlBGX0IsIElQUFJPVE9fRlJBR01FTlQpOworCQliMSA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LUEwsIDQwLCBCUEZfQiwgKGJwZl9pbnQzMil2KTsKIAkJZ2VuX2FuZChiMiwgYjEpOwotCQliMiA9IGdlbl9jbXAoT1JfTElOS1BMLCA2LCBCUEZfQiwgKGJwZl9pbnQzMil2KTsKKwkJYjIgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1BMLCA2LCBCUEZfQiwgKGJwZl9pbnQzMil2KTsKIAkJZ2VuX29yKGIyLCBiMSk7CiAjZWxzZQotCQliMSA9IGdlbl9wcm90b2NoYWluKHYsIFFfSVBWNik7CisJCWIxID0gZ2VuX3Byb3RvY2hhaW4oY3N0YXRlLCB2LCBRX0lQVjYpOwogI2VuZGlmCiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJcmV0dXJuIGIxOwogCiAJY2FzZSBRX0lDTVBWNjoKLQkJYnBmX2Vycm9yKCInaWNtcDYgcHJvdG8nIGlzIGJvZ3VzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInaWNtcDYgcHJvdG8nIGlzIGJvZ3VzIik7CiAKIAljYXNlIFFfQUg6Ci0JCWJwZl9lcnJvcigiJ2FoIHByb3RvJyBpcyBib2d1cyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2FoIHByb3RvJyBpcyBib2d1cyIpOwogCiAJY2FzZSBRX0VTUDoKLQkJYnBmX2Vycm9yKCInYWggcHJvdG8nIGlzIGJvZ3VzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYWggcHJvdG8nIGlzIGJvZ3VzIik7CiAKIAljYXNlIFFfU1RQOgotCQlicGZfZXJyb3IoIidzdHAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInc3RwIHByb3RvJyBpcyBib2d1cyIpOwogCiAJY2FzZSBRX0lQWDoKLQkJYnBmX2Vycm9yKCInaXB4IHByb3RvJyBpcyBib2d1cyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2lweCBwcm90bycgaXMgYm9ndXMiKTsKIAogCWNhc2UgUV9ORVRCRVVJOgotCQlicGZfZXJyb3IoIiduZXRiZXVpIHByb3RvJyBpcyBib2d1cyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ25ldGJldWkgcHJvdG8nIGlzIGJvZ3VzIik7CiAKIAljYXNlIFFfUkFESU86Ci0JCWJwZl9lcnJvcigiJ3JhZGlvIHByb3RvJyBpcyBib2d1cyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3JhZGlvIHByb3RvJyBpcyBib2d1cyIpOwogCiAJZGVmYXVsdDoKIAkJYWJvcnQoKTsKQEAgLTYwOTEsOSArNjE5Miw3IEBACiB9CiAKIHN0cnVjdCBibG9jayAqCi1nZW5fc2NvZGUobmFtZSwgcSkKLQlyZWdpc3RlciBjb25zdCBjaGFyICpuYW1lOwotCXN0cnVjdCBxdWFsIHE7CitnZW5fc2NvZGUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcXVhbCBxKQogewogCWludCBwcm90byA9IHEucHJvdG87CiAJaW50IGRpciA9IHEuZGlyOwpAQCAtNjExOCwyOSArNjIxNywyOSBAQAogCWNhc2UgUV9ORVQ6CiAJCWFkZHIgPSBwY2FwX25hbWV0b25ldGFkZHIobmFtZSk7CiAJCWlmIChhZGRyID09IDApCi0JCQlicGZfZXJyb3IoInVua25vd24gbmV0d29yayAnJXMnIiwgbmFtZSk7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biBuZXR3b3JrICclcyciLCBuYW1lKTsKIAkJLyogTGVmdCBqdXN0aWZ5IG5ldHdvcmsgYWRkciBhbmQgY2FsY3VsYXRlIGl0cyBuZXR3b3JrIG1hc2sgKi8KIAkJbWFzayA9IDB4ZmZmZmZmZmY7CiAJCXdoaWxlIChhZGRyICYmIChhZGRyICYgMHhmZjAwMDAwMCkgPT0gMCkgewogCQkJYWRkciA8PD0gODsKIAkJCW1hc2sgPDw9IDg7CiAJCX0KLQkJcmV0dXJuIGdlbl9ob3N0KGFkZHIsIG1hc2ssIHByb3RvLCBkaXIsIHEuYWRkcik7CisJCXJldHVybiBnZW5faG9zdChjc3RhdGUsIGFkZHIsIG1hc2ssIHByb3RvLCBkaXIsIHEuYWRkcik7CiAKIAljYXNlIFFfREVGQVVMVDoKIAljYXNlIFFfSE9TVDoKIAkJaWYgKHByb3RvID09IFFfTElOSykgewotCQkJc3dpdGNoIChsaW5rdHlwZSkgeworCQkJc3dpdGNoIChjc3RhdGUtPmxpbmt0eXBlKSB7CiAKIAkJCWNhc2UgRExUX0VOMTBNQjoKIAkJCWNhc2UgRExUX05FVEFOQUxZWkVSOgogCQkJY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CiAJCQkJZWFkZHIgPSBwY2FwX2V0aGVyX2hvc3R0b24obmFtZSk7CiAJCQkJaWYgKGVhZGRyID09IE5VTEwpCi0JCQkJCWJwZl9lcnJvcigKKwkJCQkJYnBmX2Vycm9yKGNzdGF0ZSwKIAkJCQkJICAgICJ1bmtub3duIGV0aGVyIGhvc3QgJyVzJyIsIG5hbWUpOwotCQkJCXRtcCA9IGdlbl9wcmV2bGlua2hkcl9jaGVjaygpOwotCQkJCWIgPSBnZW5fZWhvc3RvcChlYWRkciwgZGlyKTsKKwkJCQl0bXAgPSBnZW5fcHJldmxpbmtoZHJfY2hlY2soY3N0YXRlKTsKKwkJCQliID0gZ2VuX2Vob3N0b3AoY3N0YXRlLCBlYWRkciwgZGlyKTsKIAkJCQlpZiAodG1wICE9IE5VTEwpCiAJCQkJCWdlbl9hbmQodG1wLCBiKTsKIAkJCQlmcmVlKGVhZGRyKTsKQEAgLTYxNDksMTggKzYyNDgsMTggQEAKIAkJCWNhc2UgRExUX0ZEREk6CiAJCQkJZWFkZHIgPSBwY2FwX2V0aGVyX2hvc3R0b24obmFtZSk7CiAJCQkJaWYgKGVhZGRyID09IE5VTEwpCi0JCQkJCWJwZl9lcnJvcigKKwkJCQkJYnBmX2Vycm9yKGNzdGF0ZSwKIAkJCQkJICAgICJ1bmtub3duIEZEREkgaG9zdCAnJXMnIiwgbmFtZSk7Ci0JCQkJYiA9IGdlbl9maG9zdG9wKGVhZGRyLCBkaXIpOworCQkJCWIgPSBnZW5fZmhvc3RvcChjc3RhdGUsIGVhZGRyLCBkaXIpOwogCQkJCWZyZWUoZWFkZHIpOwogCQkJCXJldHVybiBiOwogCiAJCQljYXNlIERMVF9JRUVFODAyOgogCQkJCWVhZGRyID0gcGNhcF9ldGhlcl9ob3N0dG9uKG5hbWUpOwogCQkJCWlmIChlYWRkciA9PSBOVUxMKQotCQkJCQlicGZfZXJyb3IoCisJCQkJCWJwZl9lcnJvcihjc3RhdGUsCiAJCQkJCSAgICAidW5rbm93biB0b2tlbiByaW5nIGhvc3QgJyVzJyIsIG5hbWUpOwotCQkJCWIgPSBnZW5fdGhvc3RvcChlYWRkciwgZGlyKTsKKwkJCQliID0gZ2VuX3Rob3N0b3AoY3N0YXRlLCBlYWRkciwgZGlyKTsKIAkJCQlmcmVlKGVhZGRyKTsKIAkJCQlyZXR1cm4gYjsKIApAQCAtNjE3MSw0MiArNjI3MCw1MSBAQAogCQkJY2FzZSBETFRfUFBJOgogCQkJCWVhZGRyID0gcGNhcF9ldGhlcl9ob3N0dG9uKG5hbWUpOwogCQkJCWlmIChlYWRkciA9PSBOVUxMKQotCQkJCQlicGZfZXJyb3IoCisJCQkJCWJwZl9lcnJvcihjc3RhdGUsCiAJCQkJCSAgICAidW5rbm93biA4MDIuMTEgaG9zdCAnJXMnIiwgbmFtZSk7Ci0JCQkJYiA9IGdlbl93bGFuaG9zdG9wKGVhZGRyLCBkaXIpOworCQkJCWIgPSBnZW5fd2xhbmhvc3RvcChjc3RhdGUsIGVhZGRyLCBkaXIpOwogCQkJCWZyZWUoZWFkZHIpOwogCQkJCXJldHVybiBiOwogCiAJCQljYXNlIERMVF9JUF9PVkVSX0ZDOgogCQkJCWVhZGRyID0gcGNhcF9ldGhlcl9ob3N0dG9uKG5hbWUpOwogCQkJCWlmIChlYWRkciA9PSBOVUxMKQotCQkJCQlicGZfZXJyb3IoCisJCQkJCWJwZl9lcnJvcihjc3RhdGUsCiAJCQkJCSAgICAidW5rbm93biBGaWJyZSBDaGFubmVsIGhvc3QgJyVzJyIsIG5hbWUpOwotCQkJCWIgPSBnZW5faXBmY2hvc3RvcChlYWRkciwgZGlyKTsKKwkJCQliID0gZ2VuX2lwZmNob3N0b3AoY3N0YXRlLCBlYWRkciwgZGlyKTsKIAkJCQlmcmVlKGVhZGRyKTsKIAkJCQlyZXR1cm4gYjsKIAkJCX0KIAotCQkJYnBmX2Vycm9yKCJvbmx5IGV0aGVybmV0L0ZEREkvdG9rZW4gcmluZy84MDIuMTEvQVRNIExBTkUvRmlicmUgQ2hhbm5lbCBzdXBwb3J0cyBsaW5rLWxldmVsIGhvc3QgbmFtZSIpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIm9ubHkgZXRoZXJuZXQvRkRESS90b2tlbiByaW5nLzgwMi4xMS9BVE0gTEFORS9GaWJyZSBDaGFubmVsIHN1cHBvcnRzIGxpbmstbGV2ZWwgaG9zdCBuYW1lIik7CiAJCX0gZWxzZSBpZiAocHJvdG8gPT0gUV9ERUNORVQpIHsKLQkJCXVuc2lnbmVkIHNob3J0IGRuX2FkZHIgPSBfX3BjYXBfbmFtZXRvZG5hZGRyKG5hbWUpOworCQkJdW5zaWduZWQgc2hvcnQgZG5fYWRkcjsKKworCQkJaWYgKCFfX3BjYXBfbmFtZXRvZG5hZGRyKG5hbWUsICZkbl9hZGRyKSkgeworI2lmZGVmCURFQ05FVExJQgorCQkJCWJwZl9lcnJvcihjc3RhdGUsICJ1bmtub3duIGRlY25ldCBob3N0IG5hbWUgJyVzJ1xuIiwgbmFtZSk7CisjZWxzZQorCQkJCWJwZl9lcnJvcihjc3RhdGUsICJkZWNuZXQgbmFtZSBzdXBwb3J0IG5vdCBpbmNsdWRlZCwgJyVzJyBjYW5ub3QgYmUgdHJhbnNsYXRlZFxuIiwKKwkJCQkJbmFtZSk7CisjZW5kaWYKKwkJCX0KIAkJCS8qCiAJCQkgKiBJIGRvbid0IHRoaW5rIERFQ05FVCBob3N0cyBjYW4gYmUgbXVsdGlob21lZCwgc28KIAkJCSAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIGFkZHJlc3NlcwogCQkJICovCi0JCQlyZXR1cm4gKGdlbl9ob3N0KGRuX2FkZHIsIDAsIHByb3RvLCBkaXIsIHEuYWRkcikpOworCQkJcmV0dXJuIChnZW5faG9zdChjc3RhdGUsIGRuX2FkZHIsIDAsIHByb3RvLCBkaXIsIHEuYWRkcikpOwogCQl9IGVsc2UgewogI2lmbmRlZiBJTkVUNgogCQkJYWxpc3QgPSBwY2FwX25hbWV0b2FkZHIobmFtZSk7CiAJCQlpZiAoYWxpc3QgPT0gTlVMTCB8fCAqYWxpc3QgPT0gTlVMTCkKLQkJCQlicGZfZXJyb3IoInVua25vd24gaG9zdCAnJXMnIiwgbmFtZSk7CisJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gaG9zdCAnJXMnIiwgbmFtZSk7CiAJCQl0cHJvdG8gPSBwcm90bzsKLQkJCWlmIChvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9PSAodV9pbnQpLTEgJiYKKwkJCWlmIChjc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ID09IE9GRlNFVF9OT1RfU0VUICYmCiAJCQkgICAgdHByb3RvID09IFFfREVGQVVMVCkKIAkJCQl0cHJvdG8gPSBRX0lQOwotCQkJYiA9IGdlbl9ob3N0KCoqYWxpc3QrKywgMHhmZmZmZmZmZiwgdHByb3RvLCBkaXIsIHEuYWRkcik7CisJCQliID0gZ2VuX2hvc3QoY3N0YXRlLCAqKmFsaXN0KyssIDB4ZmZmZmZmZmYsIHRwcm90bywgZGlyLCBxLmFkZHIpOwogCQkJd2hpbGUgKCphbGlzdCkgewotCQkJCXRtcCA9IGdlbl9ob3N0KCoqYWxpc3QrKywgMHhmZmZmZmZmZiwKKwkJCQl0bXAgPSBnZW5faG9zdChjc3RhdGUsICoqYWxpc3QrKywgMHhmZmZmZmZmZiwKIAkJCQkJICAgICAgIHRwcm90bywgZGlyLCBxLmFkZHIpOwogCQkJCWdlbl9vcihiLCB0bXApOwogCQkJCWIgPSB0bXA7CkBAIC02MjE2LDExICs2MzI0LDExIEBACiAJCQltZW1zZXQoJm1hc2sxMjgsIDB4ZmYsIHNpemVvZihtYXNrMTI4KSk7CiAJCQlyZXMwID0gcmVzID0gcGNhcF9uYW1ldG9hZGRyaW5mbyhuYW1lKTsKIAkJCWlmIChyZXMgPT0gTlVMTCkKLQkJCQlicGZfZXJyb3IoInVua25vd24gaG9zdCAnJXMnIiwgbmFtZSk7Ci0JCQlhaSA9IHJlczsKKwkJCQlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biBob3N0ICclcyciLCBuYW1lKTsKKwkJCWNzdGF0ZS0+YWkgPSByZXM7CiAJCQliID0gdG1wID0gTlVMTDsKIAkJCXRwcm90byA9IHRwcm90bzYgPSBwcm90bzsKLQkJCWlmIChvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9PSAtMSAmJgorCQkJaWYgKGNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPT0gT0ZGU0VUX05PVF9TRVQgJiYKIAkJCSAgICB0cHJvdG8gPT0gUV9ERUZBVUxUKSB7CiAJCQkJdHByb3RvID0gUV9JUDsKIAkJCQl0cHJvdG82ID0gUV9JUFY2OwpAQCAtNjIzMyw3ICs2MzQxLDcgQEAKIAogCQkJCQlzaW40ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKQogCQkJCQkJcmVzLT5haV9hZGRyOwotCQkJCQl0bXAgPSBnZW5faG9zdChudG9obChzaW40LT5zaW5fYWRkci5zX2FkZHIpLAorCQkJCQl0bXAgPSBnZW5faG9zdChjc3RhdGUsIG50b2hsKHNpbjQtPnNpbl9hZGRyLnNfYWRkciksCiAJCQkJCQkweGZmZmZmZmZmLCB0cHJvdG8sIGRpciwgcS5hZGRyKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBBRl9JTkVUNjoKQEAgLTYyNDIsNyArNjM1MCw3IEBACiAKIAkJCQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopCiAJCQkJCQlyZXMtPmFpX2FkZHI7Ci0JCQkJCXRtcCA9IGdlbl9ob3N0Nigmc2luNi0+c2luNl9hZGRyLAorCQkJCQl0bXAgPSBnZW5faG9zdDYoY3N0YXRlLCAmc2luNi0+c2luNl9hZGRyLAogCQkJCQkJJm1hc2sxMjgsIHRwcm90bzYsIGRpciwgcS5hZGRyKTsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKQEAgLTYyNTIsMTAgKzYzNjAsMTAgQEAKIAkJCQkJZ2VuX29yKGIsIHRtcCk7CiAJCQkJYiA9IHRtcDsKIAkJCX0KLQkJCWFpID0gTlVMTDsKKwkJCWNzdGF0ZS0+YWkgPSBOVUxMOwogCQkJZnJlZWFkZHJpbmZvKHJlczApOwogCQkJaWYgKGIgPT0gTlVMTCkgewotCQkJCWJwZl9lcnJvcigidW5rbm93biBob3N0ICclcyclcyIsIG5hbWUsCisJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gaG9zdCAnJXMnJXMiLCBuYW1lLAogCQkJCSAgICAocHJvdG8gPT0gUV9ERUZBVUxUKQogCQkJCQk/ICIiCiAJCQkJCTogIiBmb3Igc3BlY2lmaWVkIGFkZHJlc3MgZmFtaWx5Iik7CkBAIC02MjY3LDEyNCArNjM3NSwxMjQgQEAKIAljYXNlIFFfUE9SVDoKIAkJaWYgKHByb3RvICE9IFFfREVGQVVMVCAmJgogCQkgICAgcHJvdG8gIT0gUV9VRFAgJiYgcHJvdG8gIT0gUV9UQ1AgJiYgcHJvdG8gIT0gUV9TQ1RQKQotCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHF1YWxpZmllciBvZiAncG9ydCciKTsKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJpbGxlZ2FsIHF1YWxpZmllciBvZiAncG9ydCciKTsKIAkJaWYgKHBjYXBfbmFtZXRvcG9ydChuYW1lLCAmcG9ydCwgJnJlYWxfcHJvdG8pID09IDApCi0JCQlicGZfZXJyb3IoInVua25vd24gcG9ydCAnJXMnIiwgbmFtZSk7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biBwb3J0ICclcyciLCBuYW1lKTsKIAkJaWYgKHByb3RvID09IFFfVURQKSB7CiAJCQlpZiAocmVhbF9wcm90byA9PSBJUFBST1RPX1RDUCkKLQkJCQlicGZfZXJyb3IoInBvcnQgJyVzJyBpcyB0Y3AiLCBuYW1lKTsKKwkJCQlicGZfZXJyb3IoY3N0YXRlLCAicG9ydCAnJXMnIGlzIHRjcCIsIG5hbWUpOwogCQkJZWxzZSBpZiAocmVhbF9wcm90byA9PSBJUFBST1RPX1NDVFApCi0JCQkJYnBmX2Vycm9yKCJwb3J0ICclcycgaXMgc2N0cCIsIG5hbWUpOworCQkJCWJwZl9lcnJvcihjc3RhdGUsICJwb3J0ICclcycgaXMgc2N0cCIsIG5hbWUpOwogCQkJZWxzZQogCQkJCS8qIG92ZXJyaWRlIFBST1RPX1VOREVGICovCiAJCQkJcmVhbF9wcm90byA9IElQUFJPVE9fVURQOwogCQl9CiAJCWlmIChwcm90byA9PSBRX1RDUCkgewogCQkJaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19VRFApCi0JCQkJYnBmX2Vycm9yKCJwb3J0ICclcycgaXMgdWRwIiwgbmFtZSk7CisJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInBvcnQgJyVzJyBpcyB1ZHAiLCBuYW1lKTsKIAogCQkJZWxzZSBpZiAocmVhbF9wcm90byA9PSBJUFBST1RPX1NDVFApCi0JCQkJYnBmX2Vycm9yKCJwb3J0ICclcycgaXMgc2N0cCIsIG5hbWUpOworCQkJCWJwZl9lcnJvcihjc3RhdGUsICJwb3J0ICclcycgaXMgc2N0cCIsIG5hbWUpOwogCQkJZWxzZQogCQkJCS8qIG92ZXJyaWRlIFBST1RPX1VOREVGICovCiAJCQkJcmVhbF9wcm90byA9IElQUFJPVE9fVENQOwogCQl9CiAJCWlmIChwcm90byA9PSBRX1NDVFApIHsKIAkJCWlmIChyZWFsX3Byb3RvID09IElQUFJPVE9fVURQKQotCQkJCWJwZl9lcnJvcigicG9ydCAnJXMnIGlzIHVkcCIsIG5hbWUpOworCQkJCWJwZl9lcnJvcihjc3RhdGUsICJwb3J0ICclcycgaXMgdWRwIiwgbmFtZSk7CiAKIAkJCWVsc2UgaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19UQ1ApCi0JCQkJYnBmX2Vycm9yKCJwb3J0ICclcycgaXMgdGNwIiwgbmFtZSk7CisJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInBvcnQgJyVzJyBpcyB0Y3AiLCBuYW1lKTsKIAkJCWVsc2UKIAkJCQkvKiBvdmVycmlkZSBQUk9UT19VTkRFRiAqLwogCQkJCXJlYWxfcHJvdG8gPSBJUFBST1RPX1NDVFA7CiAJCX0KIAkJaWYgKHBvcnQgPCAwKQotCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkIDwgMCIsIHBvcnQpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgImlsbGVnYWwgcG9ydCBudW1iZXIgJWQgPCAwIiwgcG9ydCk7CiAJCWlmIChwb3J0ID4gNjU1MzUpCi0JCQlicGZfZXJyb3IoImlsbGVnYWwgcG9ydCBudW1iZXIgJWQgPiA2NTUzNSIsIHBvcnQpOwotCQliID0gZ2VuX3BvcnQocG9ydCwgcmVhbF9wcm90bywgZGlyKTsKLQkJZ2VuX29yKGdlbl9wb3J0Nihwb3J0LCByZWFsX3Byb3RvLCBkaXIpLCBiKTsKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkID4gNjU1MzUiLCBwb3J0KTsKKwkJYiA9IGdlbl9wb3J0KGNzdGF0ZSwgcG9ydCwgcmVhbF9wcm90bywgZGlyKTsKKwkJZ2VuX29yKGdlbl9wb3J0Nihjc3RhdGUsIHBvcnQsIHJlYWxfcHJvdG8sIGRpciksIGIpOwogCQlyZXR1cm4gYjsKIAogCWNhc2UgUV9QT1JUUkFOR0U6CiAJCWlmIChwcm90byAhPSBRX0RFRkFVTFQgJiYKIAkJICAgIHByb3RvICE9IFFfVURQICYmIHByb3RvICE9IFFfVENQICYmIHByb3RvICE9IFFfU0NUUCkKLQkJCWJwZl9lcnJvcigiaWxsZWdhbCBxdWFsaWZpZXIgb2YgJ3BvcnRyYW5nZSciKTsKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJpbGxlZ2FsIHF1YWxpZmllciBvZiAncG9ydHJhbmdlJyIpOwogCQlpZiAocGNhcF9uYW1ldG9wb3J0cmFuZ2UobmFtZSwgJnBvcnQxLCAmcG9ydDIsICZyZWFsX3Byb3RvKSA9PSAwKQotCQkJYnBmX2Vycm9yKCJ1bmtub3duIHBvcnQgaW4gcmFuZ2UgJyVzJyIsIG5hbWUpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gcG9ydCBpbiByYW5nZSAnJXMnIiwgbmFtZSk7CiAJCWlmIChwcm90byA9PSBRX1VEUCkgewogCQkJaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19UQ1ApCi0JCQkJYnBmX2Vycm9yKCJwb3J0IGluIHJhbmdlICclcycgaXMgdGNwIiwgbmFtZSk7CisJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInBvcnQgaW4gcmFuZ2UgJyVzJyBpcyB0Y3AiLCBuYW1lKTsKIAkJCWVsc2UgaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19TQ1RQKQotCQkJCWJwZl9lcnJvcigicG9ydCBpbiByYW5nZSAnJXMnIGlzIHNjdHAiLCBuYW1lKTsKKwkJCQlicGZfZXJyb3IoY3N0YXRlLCAicG9ydCBpbiByYW5nZSAnJXMnIGlzIHNjdHAiLCBuYW1lKTsKIAkJCWVsc2UKIAkJCQkvKiBvdmVycmlkZSBQUk9UT19VTkRFRiAqLwogCQkJCXJlYWxfcHJvdG8gPSBJUFBST1RPX1VEUDsKIAkJfQogCQlpZiAocHJvdG8gPT0gUV9UQ1ApIHsKIAkJCWlmIChyZWFsX3Byb3RvID09IElQUFJPVE9fVURQKQotCQkJCWJwZl9lcnJvcigicG9ydCBpbiByYW5nZSAnJXMnIGlzIHVkcCIsIG5hbWUpOworCQkJCWJwZl9lcnJvcihjc3RhdGUsICJwb3J0IGluIHJhbmdlICclcycgaXMgdWRwIiwgbmFtZSk7CiAJCQllbHNlIGlmIChyZWFsX3Byb3RvID09IElQUFJPVE9fU0NUUCkKLQkJCQlicGZfZXJyb3IoInBvcnQgaW4gcmFuZ2UgJyVzJyBpcyBzY3RwIiwgbmFtZSk7CisJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInBvcnQgaW4gcmFuZ2UgJyVzJyBpcyBzY3RwIiwgbmFtZSk7CiAJCQllbHNlCiAJCQkJLyogb3ZlcnJpZGUgUFJPVE9fVU5ERUYgKi8KIAkJCQlyZWFsX3Byb3RvID0gSVBQUk9UT19UQ1A7CiAJCX0KIAkJaWYgKHByb3RvID09IFFfU0NUUCkgewogCQkJaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19VRFApCi0JCQkJYnBmX2Vycm9yKCJwb3J0IGluIHJhbmdlICclcycgaXMgdWRwIiwgbmFtZSk7CisJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInBvcnQgaW4gcmFuZ2UgJyVzJyBpcyB1ZHAiLCBuYW1lKTsKIAkJCWVsc2UgaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19UQ1ApCi0JCQkJYnBmX2Vycm9yKCJwb3J0IGluIHJhbmdlICclcycgaXMgdGNwIiwgbmFtZSk7CisJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInBvcnQgaW4gcmFuZ2UgJyVzJyBpcyB0Y3AiLCBuYW1lKTsKIAkJCWVsc2UKIAkJCQkvKiBvdmVycmlkZSBQUk9UT19VTkRFRiAqLwogCQkJCXJlYWxfcHJvdG8gPSBJUFBST1RPX1NDVFA7CiAJCX0KIAkJaWYgKHBvcnQxIDwgMCkKLQkJCWJwZl9lcnJvcigiaWxsZWdhbCBwb3J0IG51bWJlciAlZCA8IDAiLCBwb3J0MSk7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAiaWxsZWdhbCBwb3J0IG51bWJlciAlZCA8IDAiLCBwb3J0MSk7CiAJCWlmIChwb3J0MSA+IDY1NTM1KQotCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkID4gNjU1MzUiLCBwb3J0MSk7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAiaWxsZWdhbCBwb3J0IG51bWJlciAlZCA+IDY1NTM1IiwgcG9ydDEpOwogCQlpZiAocG9ydDIgPCAwKQotCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkIDwgMCIsIHBvcnQyKTsKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkIDwgMCIsIHBvcnQyKTsKIAkJaWYgKHBvcnQyID4gNjU1MzUpCi0JCQlicGZfZXJyb3IoImlsbGVnYWwgcG9ydCBudW1iZXIgJWQgPiA2NTUzNSIsIHBvcnQyKTsKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkID4gNjU1MzUiLCBwb3J0Mik7CiAKLQkJYiA9IGdlbl9wb3J0cmFuZ2UocG9ydDEsIHBvcnQyLCByZWFsX3Byb3RvLCBkaXIpOwotCQlnZW5fb3IoZ2VuX3BvcnRyYW5nZTYocG9ydDEsIHBvcnQyLCByZWFsX3Byb3RvLCBkaXIpLCBiKTsKKwkJYiA9IGdlbl9wb3J0cmFuZ2UoY3N0YXRlLCBwb3J0MSwgcG9ydDIsIHJlYWxfcHJvdG8sIGRpcik7CisJCWdlbl9vcihnZW5fcG9ydHJhbmdlNihjc3RhdGUsIHBvcnQxLCBwb3J0MiwgcmVhbF9wcm90bywgZGlyKSwgYik7CiAJCXJldHVybiBiOwogCiAJY2FzZSBRX0dBVEVXQVk6CiAjaWZuZGVmIElORVQ2CiAJCWVhZGRyID0gcGNhcF9ldGhlcl9ob3N0dG9uKG5hbWUpOwogCQlpZiAoZWFkZHIgPT0gTlVMTCkKLQkJCWJwZl9lcnJvcigidW5rbm93biBldGhlciBob3N0OiAlcyIsIG5hbWUpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gZXRoZXIgaG9zdDogJXMiLCBuYW1lKTsKIAogCQlhbGlzdCA9IHBjYXBfbmFtZXRvYWRkcihuYW1lKTsKIAkJaWYgKGFsaXN0ID09IE5VTEwgfHwgKmFsaXN0ID09IE5VTEwpCi0JCQlicGZfZXJyb3IoInVua25vd24gaG9zdCAnJXMnIiwgbmFtZSk7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biBob3N0ICclcyciLCBuYW1lKTsKIAkJYiA9IGdlbl9nYXRld2F5KGVhZGRyLCBhbGlzdCwgcHJvdG8sIGRpcik7CiAJCWZyZWUoZWFkZHIpOwogCQlyZXR1cm4gYjsKICNlbHNlCi0JCWJwZl9lcnJvcigiJ2dhdGV3YXknIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInZ2F0ZXdheScgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iKTsKICNlbmRpZiAvKklORVQ2Ki8KIAogCWNhc2UgUV9QUk9UTzoKLQkJcmVhbF9wcm90byA9IGxvb2t1cF9wcm90byhuYW1lLCBwcm90byk7CisJCXJlYWxfcHJvdG8gPSBsb29rdXBfcHJvdG8oY3N0YXRlLCBuYW1lLCBwcm90byk7CiAJCWlmIChyZWFsX3Byb3RvID49IDApCi0JCQlyZXR1cm4gZ2VuX3Byb3RvKHJlYWxfcHJvdG8sIHByb3RvLCBkaXIpOworCQkJcmV0dXJuIGdlbl9wcm90byhjc3RhdGUsIHJlYWxfcHJvdG8sIHByb3RvLCBkaXIpOwogCQllbHNlCi0JCQlicGZfZXJyb3IoInVua25vd24gcHJvdG9jb2w6ICVzIiwgbmFtZSk7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biBwcm90b2NvbDogJXMiLCBuYW1lKTsKIAogCWNhc2UgUV9QUk9UT0NIQUlOOgotCQlyZWFsX3Byb3RvID0gbG9va3VwX3Byb3RvKG5hbWUsIHByb3RvKTsKKwkJcmVhbF9wcm90byA9IGxvb2t1cF9wcm90byhjc3RhdGUsIG5hbWUsIHByb3RvKTsKIAkJaWYgKHJlYWxfcHJvdG8gPj0gMCkKLQkJCXJldHVybiBnZW5fcHJvdG9jaGFpbihyZWFsX3Byb3RvLCBwcm90bywgZGlyKTsKKwkJCXJldHVybiBnZW5fcHJvdG9jaGFpbihjc3RhdGUsIHJlYWxfcHJvdG8sIHByb3RvLCBkaXIpOwogCQllbHNlCi0JCQlicGZfZXJyb3IoInVua25vd24gcHJvdG9jb2w6ICVzIiwgbmFtZSk7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biBwcm90b2NvbDogJXMiLCBuYW1lKTsKIAogCWNhc2UgUV9VTkRFRjoKLQkJc3ludGF4KCk7CisJCXN5bnRheChjc3RhdGUpOwogCQkvKiBOT1RSRUFDSEVEICovCiAJfQogCWFib3J0KCk7CkBAIC02MzkyLDEwICs2NTAwLDggQEAKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9tY29kZShzMSwgczIsIG1hc2tsZW4sIHEpCi0JcmVnaXN0ZXIgY29uc3QgY2hhciAqczEsICpzMjsKLQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgbWFza2xlbjsKLQlzdHJ1Y3QgcXVhbCBxOworZ2VuX21jb2RlKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLAorICAgIHVuc2lnbmVkIGludCBtYXNrbGVuLCBzdHJ1Y3QgcXVhbCBxKQogewogCXJlZ2lzdGVyIGludCBubGVuLCBtbGVuOwogCWJwZl91X2ludDMyIG4sIG07CkBAIC02NDA5LDEyICs2NTE1LDEyIEBACiAJCS8qIFByb21vdGUgc2hvcnQgaXBhZGRyICovCiAJCW0gPDw9IDMyIC0gbWxlbjsKIAkJaWYgKChuICYgfm0pICE9IDApCi0JCQlicGZfZXJyb3IoIm5vbi1uZXR3b3JrIGJpdHMgc2V0IGluIFwiJXMgbWFzayAlc1wiIiwKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJub24tbmV0d29yayBiaXRzIHNldCBpbiBcIiVzIG1hc2sgJXNcIiIsCiAJCQkgICAgczEsIHMyKTsKIAl9IGVsc2UgewogCQkvKiBDb252ZXJ0IG1hc2sgbGVuIHRvIG1hc2sgKi8KIAkJaWYgKG1hc2tsZW4gPiAzMikKLQkJCWJwZl9lcnJvcigibWFzayBsZW5ndGggbXVzdCBiZSA8PSAzMiIpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIm1hc2sgbGVuZ3RoIG11c3QgYmUgPD0gMzIiKTsKIAkJaWYgKG1hc2tsZW4gPT0gMCkgewogCQkJLyoKIAkJCSAqIFggPDwgMzIgaXMgbm90IGd1YXJhbnRlZWQgYnkgQyB0byBiZSAwOyBpdCdzCkBAIC02NDI0LDE3ICs2NTMwLDE3IEBACiAJCX0gZWxzZQogCQkJbSA9IDB4ZmZmZmZmZmYgPDwgKDMyIC0gbWFza2xlbik7CiAJCWlmICgobiAmIH5tKSAhPSAwKQotCQkJYnBmX2Vycm9yKCJub24tbmV0d29yayBiaXRzIHNldCBpbiBcIiVzLyVkXCIiLAorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIm5vbi1uZXR3b3JrIGJpdHMgc2V0IGluIFwiJXMvJWRcIiIsCiAJCQkgICAgczEsIG1hc2tsZW4pOwogCX0KIAogCXN3aXRjaCAocS5hZGRyKSB7CiAKIAljYXNlIFFfTkVUOgotCQlyZXR1cm4gZ2VuX2hvc3QobiwgbSwgcS5wcm90bywgcS5kaXIsIHEuYWRkcik7CisJCXJldHVybiBnZW5faG9zdChjc3RhdGUsIG4sIG0sIHEucHJvdG8sIHEuZGlyLCBxLmFkZHIpOwogCiAJZGVmYXVsdDoKLQkJYnBmX2Vycm9yKCJNYXNrIHN5bnRheCBmb3IgbmV0d29ya3Mgb25seSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiTWFzayBzeW50YXggZm9yIG5ldHdvcmtzIG9ubHkiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCX0KIAkvKiBOT1RSRUFDSEVEICovCkBAIC02NDQyLDEwICs2NTQ4LDcgQEAKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9uY29kZShzLCB2LCBxKQotCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7Ci0JYnBmX3VfaW50MzIgdjsKLQlzdHJ1Y3QgcXVhbCBxOworZ2VuX25jb2RlKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgY2hhciAqcywgYnBmX3VfaW50MzIgdiwgc3RydWN0IHF1YWwgcSkKIHsKIAlicGZfdV9pbnQzMiBtYXNrOwogCWludCBwcm90byA9IHEucHJvdG87CkBAIC02NDU0LDkgKzY1NTcsMTEgQEAKIAogCWlmIChzID09IE5VTEwpCiAJCXZsZW4gPSAzMjsKLQllbHNlIGlmIChxLnByb3RvID09IFFfREVDTkVUKQorCWVsc2UgaWYgKHEucHJvdG8gPT0gUV9ERUNORVQpIHsKIAkJdmxlbiA9IF9fcGNhcF9hdG9kbihzLCAmdik7Ci0JZWxzZQorCQlpZiAodmxlbiA9PSAwKQorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIm1hbGZvcm1lZCBkZWNuZXQgYWRkcmVzcyAnJXMnIiwgcyk7CisJfSBlbHNlCiAJCXZsZW4gPSBfX3BjYXBfYXRvaW4ocywgJnYpOwogCiAJc3dpdGNoIChxLmFkZHIpIHsKQEAgLTY0NjUsOSArNjU3MCw5IEBACiAJY2FzZSBRX0hPU1Q6CiAJY2FzZSBRX05FVDoKIAkJaWYgKHByb3RvID09IFFfREVDTkVUKQotCQkJcmV0dXJuIGdlbl9ob3N0KHYsIDAsIHByb3RvLCBkaXIsIHEuYWRkcik7CisJCQlyZXR1cm4gZ2VuX2hvc3QoY3N0YXRlLCB2LCAwLCBwcm90bywgZGlyLCBxLmFkZHIpOwogCQllbHNlIGlmIChwcm90byA9PSBRX0xJTkspIHsKLQkJCWJwZl9lcnJvcigiaWxsZWdhbCBsaW5rIGxheWVyIGFkZHJlc3MiKTsKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJpbGxlZ2FsIGxpbmsgbGF5ZXIgYWRkcmVzcyIpOwogCQl9IGVsc2UgewogCQkJbWFzayA9IDB4ZmZmZmZmZmY7CiAJCQlpZiAocyA9PSBOVUxMICYmIHEuYWRkciA9PSBRX05FVCkgewpAQCAtNjQ3OSw5ICs2NTg0LDkgQEAKIAkJCX0gZWxzZSB7CiAJCQkJLyogUHJvbW90ZSBzaG9ydCBpcGFkZHIgKi8KIAkJCQl2IDw8PSAzMiAtIHZsZW47Ci0JCQkJbWFzayA8PD0gMzIgLSB2bGVuOworCQkJCW1hc2sgPDw9IDMyIC0gdmxlbiA7CiAJCQl9Ci0JCQlyZXR1cm4gZ2VuX2hvc3QodiwgbWFzaywgcHJvdG8sIGRpciwgcS5hZGRyKTsKKwkJCXJldHVybiBnZW5faG9zdChjc3RhdGUsIHYsIG1hc2ssIHByb3RvLCBkaXIsIHEuYWRkcik7CiAJCX0KIAogCWNhc2UgUV9QT1JUOgpAQCAtNjQ5NCwxNSArNjU5OSwxNSBAQAogCQllbHNlIGlmIChwcm90byA9PSBRX0RFRkFVTFQpCiAJCQlwcm90byA9IFBST1RPX1VOREVGOwogCQllbHNlCi0JCQlicGZfZXJyb3IoImlsbGVnYWwgcXVhbGlmaWVyIG9mICdwb3J0JyIpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgImlsbGVnYWwgcXVhbGlmaWVyIG9mICdwb3J0JyIpOwogCiAJCWlmICh2ID4gNjU1MzUpCi0JCQlicGZfZXJyb3IoImlsbGVnYWwgcG9ydCBudW1iZXIgJXUgPiA2NTUzNSIsIHYpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgImlsbGVnYWwgcG9ydCBudW1iZXIgJXUgPiA2NTUzNSIsIHYpOwogCiAJICAgIHsKIAkJc3RydWN0IGJsb2NrICpiOwotCQliID0gZ2VuX3BvcnQoKGludCl2LCBwcm90bywgZGlyKTsKLQkJZ2VuX29yKGdlbl9wb3J0NigoaW50KXYsIHByb3RvLCBkaXIpLCBiKTsKKwkJYiA9IGdlbl9wb3J0KGNzdGF0ZSwgKGludCl2LCBwcm90bywgZGlyKTsKKwkJZ2VuX29yKGdlbl9wb3J0Nihjc3RhdGUsIChpbnQpdiwgcHJvdG8sIGRpciksIGIpOwogCQlyZXR1cm4gYjsKIAkgICAgfQogCkBAIC02NTE2LDMwICs2NjIxLDMwIEBACiAJCWVsc2UgaWYgKHByb3RvID09IFFfREVGQVVMVCkKIAkJCXByb3RvID0gUFJPVE9fVU5ERUY7CiAJCWVsc2UKLQkJCWJwZl9lcnJvcigiaWxsZWdhbCBxdWFsaWZpZXIgb2YgJ3BvcnRyYW5nZSciKTsKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJpbGxlZ2FsIHF1YWxpZmllciBvZiAncG9ydHJhbmdlJyIpOwogCiAJCWlmICh2ID4gNjU1MzUpCi0JCQlicGZfZXJyb3IoImlsbGVnYWwgcG9ydCBudW1iZXIgJXUgPiA2NTUzNSIsIHYpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgImlsbGVnYWwgcG9ydCBudW1iZXIgJXUgPiA2NTUzNSIsIHYpOwogCiAJICAgIHsKIAkJc3RydWN0IGJsb2NrICpiOwotCQliID0gZ2VuX3BvcnRyYW5nZSgoaW50KXYsIChpbnQpdiwgcHJvdG8sIGRpcik7Ci0JCWdlbl9vcihnZW5fcG9ydHJhbmdlNigoaW50KXYsIChpbnQpdiwgcHJvdG8sIGRpciksIGIpOworCQliID0gZ2VuX3BvcnRyYW5nZShjc3RhdGUsIChpbnQpdiwgKGludCl2LCBwcm90bywgZGlyKTsKKwkJZ2VuX29yKGdlbl9wb3J0cmFuZ2U2KGNzdGF0ZSwgKGludCl2LCAoaW50KXYsIHByb3RvLCBkaXIpLCBiKTsKIAkJcmV0dXJuIGI7CiAJICAgIH0KIAogCWNhc2UgUV9HQVRFV0FZOgotCQlicGZfZXJyb3IoIidnYXRld2F5JyByZXF1aXJlcyBhIG5hbWUiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidnYXRld2F5JyByZXF1aXJlcyBhIG5hbWUiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCiAJY2FzZSBRX1BST1RPOgotCQlyZXR1cm4gZ2VuX3Byb3RvKChpbnQpdiwgcHJvdG8sIGRpcik7CisJCXJldHVybiBnZW5fcHJvdG8oY3N0YXRlLCAoaW50KXYsIHByb3RvLCBkaXIpOwogCiAJY2FzZSBRX1BST1RPQ0hBSU46Ci0JCXJldHVybiBnZW5fcHJvdG9jaGFpbigoaW50KXYsIHByb3RvLCBkaXIpOworCQlyZXR1cm4gZ2VuX3Byb3RvY2hhaW4oY3N0YXRlLCAoaW50KXYsIHByb3RvLCBkaXIpOwogCiAJY2FzZSBRX1VOREVGOgotCQlzeW50YXgoKTsKKwkJc3ludGF4KGNzdGF0ZSk7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAogCWRlZmF1bHQ6CkBAIC02NTUxLDEwICs2NjU2LDggQEAKIAogI2lmZGVmIElORVQ2CiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX21jb2RlNihzMSwgczIsIG1hc2tsZW4sIHEpCi0JcmVnaXN0ZXIgY29uc3QgY2hhciAqczEsICpzMjsKLQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgbWFza2xlbjsKLQlzdHJ1Y3QgcXVhbCBxOworZ2VuX21jb2RlNihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwKKyAgICB1bnNpZ25lZCBpbnQgbWFza2xlbiwgc3RydWN0IHF1YWwgcSkKIHsKIAlzdHJ1Y3QgYWRkcmluZm8gKnJlczsKIAlzdHJ1Y3QgaW42X2FkZHIgKmFkZHI7CkBAIC02NTYzLDE4ICs2NjY2LDE4IEBACiAJdV9pbnQzMl90ICphLCAqbTsKIAogCWlmIChzMikKLQkJYnBmX2Vycm9yKCJubyBtYXNrICVzIHN1cHBvcnRlZCIsIHMyKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIm5vIG1hc2sgJXMgc3VwcG9ydGVkIiwgczIpOwogCiAJcmVzID0gcGNhcF9uYW1ldG9hZGRyaW5mbyhzMSk7CiAJaWYgKCFyZXMpCi0JCWJwZl9lcnJvcigiaW52YWxpZCBpcDYgYWRkcmVzcyAlcyIsIHMxKTsKLQlhaSA9IHJlczsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgImludmFsaWQgaXA2IGFkZHJlc3MgJXMiLCBzMSk7CisJY3N0YXRlLT5haSA9IHJlczsKIAlpZiAocmVzLT5haV9uZXh0KQotCQlicGZfZXJyb3IoIiVzIHJlc29sdmVkIHRvIG11bHRpcGxlIGFkZHJlc3MiLCBzMSk7CisJCWJwZl9lcnJvcihjc3RhdGUsICIlcyByZXNvbHZlZCB0byBtdWx0aXBsZSBhZGRyZXNzIiwgczEpOwogCWFkZHIgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopcmVzLT5haV9hZGRyKS0+c2luNl9hZGRyOwogCiAJaWYgKHNpemVvZihtYXNrKSAqIDggPCBtYXNrbGVuKQotCQlicGZfZXJyb3IoIm1hc2sgbGVuZ3RoIG11c3QgYmUgPD0gJXUiLCAodW5zaWduZWQgaW50KShzaXplb2YobWFzaykgKiA4KSk7CisJCWJwZl9lcnJvcihjc3RhdGUsICJtYXNrIGxlbmd0aCBtdXN0IGJlIDw9ICV1IiwgKHVuc2lnbmVkIGludCkoc2l6ZW9mKG1hc2spICogOCkpOwogCW1lbXNldCgmbWFzaywgMCwgc2l6ZW9mKG1hc2spKTsKIAltZW1zZXQoJm1hc2ssIDB4ZmYsIG1hc2tsZW4gLyA4KTsKIAlpZiAobWFza2xlbiAlIDgpIHsKQEAgLTY1ODYsNyArNjY4OSw3IEBACiAJbSA9ICh1X2ludDMyX3QgKikmbWFzazsKIAlpZiAoKGFbMF0gJiB+bVswXSkgfHwgKGFbMV0gJiB+bVsxXSkKIAkgfHwgKGFbMl0gJiB+bVsyXSkgfHwgKGFbM10gJiB+bVszXSkpIHsKLQkJYnBmX2Vycm9yKCJub24tbmV0d29yayBiaXRzIHNldCBpbiBcIiVzLyVkXCIiLCBzMSwgbWFza2xlbik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJub24tbmV0d29yayBiaXRzIHNldCBpbiBcIiVzLyVkXCIiLCBzMSwgbWFza2xlbik7CiAJfQogCiAJc3dpdGNoIChxLmFkZHIpIHsKQEAgLTY1OTQsMTcgKzY2OTcsMTcgQEAKIAljYXNlIFFfREVGQVVMVDoKIAljYXNlIFFfSE9TVDoKIAkJaWYgKG1hc2tsZW4gIT0gMTI4KQotCQkJYnBmX2Vycm9yKCJNYXNrIHN5bnRheCBmb3IgbmV0d29ya3Mgb25seSIpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIk1hc2sgc3ludGF4IGZvciBuZXR3b3JrcyBvbmx5Iik7CiAJCS8qIEZBTExUSFJPVUdIICovCiAKIAljYXNlIFFfTkVUOgotCQliID0gZ2VuX2hvc3Q2KGFkZHIsICZtYXNrLCBxLnByb3RvLCBxLmRpciwgcS5hZGRyKTsKLQkJYWkgPSBOVUxMOworCQliID0gZ2VuX2hvc3Q2KGNzdGF0ZSwgYWRkciwgJm1hc2ssIHEucHJvdG8sIHEuZGlyLCBxLmFkZHIpOworCQljc3RhdGUtPmFpID0gTlVMTDsKIAkJZnJlZWFkZHJpbmZvKHJlcyk7CiAJCXJldHVybiBiOwogCiAJZGVmYXVsdDoKLQkJYnBmX2Vycm9yKCJpbnZhbGlkIHF1YWxpZmllciBhZ2FpbnN0IElQdjYgYWRkcmVzcyIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiaW52YWxpZCBxdWFsaWZpZXIgYWdhaW5zdCBJUHY2IGFkZHJlc3MiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCX0KIAlyZXR1cm4gTlVMTDsKQEAgLTY2MTIsNDAgKzY3MTUsMzggQEAKICNlbmRpZiAvKklORVQ2Ki8KIAogc3RydWN0IGJsb2NrICoKLWdlbl9lY29kZShlYWRkciwgcSkKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVhZGRyOwotCXN0cnVjdCBxdWFsIHE7CitnZW5fZWNvZGUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBjb25zdCB1X2NoYXIgKmVhZGRyLCBzdHJ1Y3QgcXVhbCBxKQogewogCXN0cnVjdCBibG9jayAqYiwgKnRtcDsKIAogCWlmICgocS5hZGRyID09IFFfSE9TVCB8fCBxLmFkZHIgPT0gUV9ERUZBVUxUKSAmJiBxLnByb3RvID09IFFfTElOSykgewotCQlzd2l0Y2ggKGxpbmt0eXBlKSB7CisJCXN3aXRjaCAoY3N0YXRlLT5saW5rdHlwZSkgewogCQljYXNlIERMVF9FTjEwTUI6CiAJCWNhc2UgRExUX05FVEFOQUxZWkVSOgogCQljYXNlIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVDoKLQkJCXRtcCA9IGdlbl9wcmV2bGlua2hkcl9jaGVjaygpOwotCQkJYiA9IGdlbl9laG9zdG9wKGVhZGRyLCAoaW50KXEuZGlyKTsKKwkJCXRtcCA9IGdlbl9wcmV2bGlua2hkcl9jaGVjayhjc3RhdGUpOworCQkJYiA9IGdlbl9laG9zdG9wKGNzdGF0ZSwgZWFkZHIsIChpbnQpcS5kaXIpOwogCQkJaWYgKHRtcCAhPSBOVUxMKQogCQkJCWdlbl9hbmQodG1wLCBiKTsKIAkJCXJldHVybiBiOwogCQljYXNlIERMVF9GRERJOgotCQkJcmV0dXJuIGdlbl9maG9zdG9wKGVhZGRyLCAoaW50KXEuZGlyKTsKKwkJCXJldHVybiBnZW5fZmhvc3RvcChjc3RhdGUsIGVhZGRyLCAoaW50KXEuZGlyKTsKIAkJY2FzZSBETFRfSUVFRTgwMjoKLQkJCXJldHVybiBnZW5fdGhvc3RvcChlYWRkciwgKGludClxLmRpcik7CisJCQlyZXR1cm4gZ2VuX3Rob3N0b3AoY3N0YXRlLCBlYWRkciwgKGludClxLmRpcik7CiAJCWNhc2UgRExUX0lFRUU4MDJfMTE6CiAJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKIAkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CiAJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CiAJCWNhc2UgRExUX1BQSToKLQkJCXJldHVybiBnZW5fd2xhbmhvc3RvcChlYWRkciwgKGludClxLmRpcik7CisJCQlyZXR1cm4gZ2VuX3dsYW5ob3N0b3AoY3N0YXRlLCBlYWRkciwgKGludClxLmRpcik7CiAJCWNhc2UgRExUX0lQX09WRVJfRkM6Ci0JCQlyZXR1cm4gZ2VuX2lwZmNob3N0b3AoZWFkZHIsIChpbnQpcS5kaXIpOworCQkJcmV0dXJuIGdlbl9pcGZjaG9zdG9wKGNzdGF0ZSwgZWFkZHIsIChpbnQpcS5kaXIpOwogCQlkZWZhdWx0OgotCQkJYnBmX2Vycm9yKCJldGhlcm5ldCBhZGRyZXNzZXMgc3VwcG9ydGVkIG9ubHkgb24gZXRoZXJuZXQvRkRESS90b2tlbiByaW5nLzgwMi4xMS9BVE0gTEFORS9GaWJyZSBDaGFubmVsIik7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAiZXRoZXJuZXQgYWRkcmVzc2VzIHN1cHBvcnRlZCBvbmx5IG9uIGV0aGVybmV0L0ZEREkvdG9rZW4gcmluZy84MDIuMTEvQVRNIExBTkUvRmlicmUgQ2hhbm5lbCIpOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JYnBmX2Vycm9yKCJldGhlcm5ldCBhZGRyZXNzIHVzZWQgaW4gbm9uLWV0aGVyIGV4cHJlc3Npb24iKTsKKwlicGZfZXJyb3IoY3N0YXRlLCAiZXRoZXJuZXQgYWRkcmVzcyB1c2VkIGluIG5vbi1ldGhlciBleHByZXNzaW9uIik7CiAJLyogTk9UUkVBQ0hFRCAqLwogCXJldHVybiBOVUxMOwogfQpAQCAtNjY2NCwyMyArNjc2NSwyMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNsaXN0ICoKLXhmZXJfdG9feChhKQotCXN0cnVjdCBhcnRoICphOworeGZlcl90b194KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgc3RydWN0IGFydGggKmEpCiB7CiAJc3RydWN0IHNsaXN0ICpzOwogCi0JcyA9IG5ld19zdG10KEJQRl9MRFh8QlBGX01FTSk7CisJcyA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEWHxCUEZfTUVNKTsKIAlzLT5zLmsgPSBhLT5yZWdubzsKIAlyZXR1cm4gczsKIH0KIAogc3RhdGljIHN0cnVjdCBzbGlzdCAqCi14ZmVyX3RvX2EoYSkKLQlzdHJ1Y3QgYXJ0aCAqYTsKK3hmZXJfdG9fYShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIHN0cnVjdCBhcnRoICphKQogewogCXN0cnVjdCBzbGlzdCAqczsKIAotCXMgPSBuZXdfc3RtdChCUEZfTER8QlBGX01FTSk7CisJcyA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9NRU0pOwogCXMtPnMuayA9IGEtPnJlZ25vOwogCXJldHVybiBzOwogfQpAQCAtNjY5MywyMCArNjc5MiwxNyBAQAogICogZm9yICJpbmRleCIuCiAgKi8KIHN0cnVjdCBhcnRoICoKLWdlbl9sb2FkKHByb3RvLCBpbnN0LCBzaXplKQotCWludCBwcm90bzsKLQlzdHJ1Y3QgYXJ0aCAqaW5zdDsKLQlpbnQgc2l6ZTsKK2dlbl9sb2FkKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHByb3RvLCBzdHJ1Y3QgYXJ0aCAqaW5zdCwgaW50IHNpemUpCiB7CiAJc3RydWN0IHNsaXN0ICpzLCAqdG1wOwogCXN0cnVjdCBibG9jayAqYjsKLQlpbnQgcmVnbm8gPSBhbGxvY19yZWcoKTsKKwlpbnQgcmVnbm8gPSBhbGxvY19yZWcoY3N0YXRlKTsKIAotCWZyZWVfcmVnKGluc3QtPnJlZ25vKTsKKwlmcmVlX3JlZyhjc3RhdGUsIGluc3QtPnJlZ25vKTsKIAlzd2l0Y2ggKHNpemUpIHsKIAogCWRlZmF1bHQ6Ci0JCWJwZl9lcnJvcigiZGF0YSBzaXplIG11c3QgYmUgMSwgMiwgb3IgNCIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiZGF0YSBzaXplIG11c3QgYmUgMSwgMiwgb3IgNCIpOwogCiAJY2FzZSAxOgogCQlzaXplID0gQlBGX0I7CkBAIC02NzIyLDcgKzY4MTgsNyBAQAogCX0KIAlzd2l0Y2ggKHByb3RvKSB7CiAJZGVmYXVsdDoKLQkJYnBmX2Vycm9yKCJ1bnN1cHBvcnRlZCBpbmRleCBvcGVyYXRpb24iKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgInVuc3VwcG9ydGVkIGluZGV4IG9wZXJhdGlvbiIpOwogCiAJY2FzZSBRX1JBRElPOgogCQkvKgpAQCAtNjczMCwyMSArNjgyNiwyMSBAQAogCQkgKiBkYXRhLCBpZiB3ZSBoYXZlIGEgcmFkaW8gaGVhZGVyLiAgKElmIHdlIGRvbid0LCB0aGlzCiAJCSAqIGlzIGFuIGVycm9yLikKIAkJICovCi0JCWlmIChsaW5rdHlwZSAhPSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlMgJiYKLQkJICAgIGxpbmt0eXBlICE9IERMVF9JRUVFODAyXzExX1JBRElPICYmCi0JCSAgICBsaW5rdHlwZSAhPSBETFRfUFJJU01fSEVBREVSKQotCQkJYnBmX2Vycm9yKCJyYWRpbyBpbmZvcm1hdGlvbiBub3QgcHJlc2VudCBpbiBjYXB0dXJlIik7CisJCWlmIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9JRUVFODAyXzExX1JBRElPX0FWUyAmJgorCQkgICAgY3N0YXRlLT5saW5rdHlwZSAhPSBETFRfSUVFRTgwMl8xMV9SQURJTyAmJgorCQkgICAgY3N0YXRlLT5saW5rdHlwZSAhPSBETFRfUFJJU01fSEVBREVSKQorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInJhZGlvIGluZm9ybWF0aW9uIG5vdCBwcmVzZW50IGluIGNhcHR1cmUiKTsKIAogCQkvKgogCQkgKiBMb2FkIGludG8gdGhlIFggcmVnaXN0ZXIgdGhlIG9mZnNldCBjb21wdXRlZCBpbnRvIHRoZQogCQkgKiByZWdpc3RlciBzcGVjaWZpZWQgYnkgImluZGV4Ii4KIAkJICovCi0JCXMgPSB4ZmVyX3RvX3goaW5zdCk7CisJCXMgPSB4ZmVyX3RvX3goY3N0YXRlLCBpbnN0KTsKIAogCQkvKgogCQkgKiBMb2FkIHRoZSBpdGVtIGF0IHRoYXQgb2Zmc2V0LgogCQkgKi8KLQkJdG1wID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8c2l6ZSk7CisJCXRtcCA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9JTkR8c2l6ZSk7CiAJCXNhcHBlbmQocywgdG1wKTsKIAkJc2FwcGVuZChpbnN0LT5zLCBzKTsKIAkJYnJlYWs7CkBAIC02NzYxLDcgKzY4NTcsNyBAQAogCQkgKiBmcmFtZSwgc28gdGhhdCAwIHJlZmVycywgZm9yIEV0aGVybmV0IExBTkUsIHRvCiAJCSAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3M/CiAJCSAqLwotCQlzID0gZ2VuX2Fic19vZmZzZXRfdmFycGFydCgmb2ZmX2xpbmtoZHIpOworCQlzID0gZ2VuX2Fic19vZmZzZXRfdmFycGFydChjc3RhdGUsICZjc3RhdGUtPm9mZl9saW5raGRyKTsKIAogCQkvKgogCQkgKiBJZiAicyIgaXMgbm9uLW51bGwsIGl0IGhhcyBjb2RlIHRvIGFycmFuZ2UgdGhhdCB0aGUKQEAgLTY3NzMsMTEgKzY4NjksMTEgQEAKIAkJICogYnkgImluZGV4Ii4KIAkJICovCiAJCWlmIChzICE9IE5VTEwpIHsKLQkJCXNhcHBlbmQocywgeGZlcl90b19hKGluc3QpKTsKLQkJCXNhcHBlbmQocywgbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9YKSk7Ci0JCQlzYXBwZW5kKHMsIG5ld19zdG10KEJQRl9NSVNDfEJQRl9UQVgpKTsKKwkJCXNhcHBlbmQocywgeGZlcl90b19hKGNzdGF0ZSwgaW5zdCkpOworCQkJc2FwcGVuZChzLCBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX0FERHxCUEZfWCkpOworCQkJc2FwcGVuZChzLCBuZXdfc3RtdChjc3RhdGUsIEJQRl9NSVNDfEJQRl9UQVgpKTsKIAkJfSBlbHNlCi0JCQlzID0geGZlcl90b194KGluc3QpOworCQkJcyA9IHhmZXJfdG9feChjc3RhdGUsIGluc3QpOwogCiAJCS8qCiAJCSAqIExvYWQgdGhlIGl0ZW0gYXQgdGhlIHN1bSBvZiB0aGUgb2Zmc2V0IHdlJ3ZlIHB1dCBpbiB0aGUKQEAgLTY3ODYsOCArNjg4Miw4IEBACiAJCSAqIHZhcmlhYmxlLWxlbmd0aDsgdGhhdCBoZWFkZXIgbGVuZ3RoIGlzIHdoYXQgd2UgcHV0CiAJCSAqIGludG8gdGhlIFggcmVnaXN0ZXIgYW5kIHRoZW4gYWRkZWQgdG8gdGhlIGluZGV4KS4KIAkJICovCi0JCXRtcCA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfHNpemUpOwotCQl0bXAtPnMuayA9IG9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQ7CisJCXRtcCA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9JTkR8c2l6ZSk7CisJCXRtcC0+cy5rID0gY3N0YXRlLT5vZmZfbGlua2hkci5jb25zdGFudF9wYXJ0OwogCQlzYXBwZW5kKHMsIHRtcCk7CiAJCXNhcHBlbmQoaW5zdC0+cywgcyk7CiAJCWJyZWFrOwpAQCAtNjgwNiw5ICs2OTAyLDkgQEAKIAkJICogVGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCiAJCSAqIHRoZSBuZXR3b3JrLWxheWVyIGhlYWRlci4KIAkJICogWFhYIC0gYXJlIHRoZXJlIGFueSBjYXNlcyB3aGVyZSB3ZSB3YW50Ci0JCSAqIG9mZl9ubF9ub3NuYXA/CisJCSAqIGNzdGF0ZS0+b2ZmX25sX25vc25hcD8KIAkJICovCi0JCXMgPSBnZW5fYWJzX29mZnNldF92YXJwYXJ0KCZvZmZfbGlua3BsKTsKKwkJcyA9IGdlbl9hYnNfb2Zmc2V0X3ZhcnBhcnQoY3N0YXRlLCAmY3N0YXRlLT5vZmZfbGlua3BsKTsKIAogCQkvKgogCQkgKiBJZiAicyIgaXMgbm9uLW51bGwsIGl0IGhhcyBjb2RlIHRvIGFycmFuZ2UgdGhhdCB0aGUKQEAgLTY4MjAsMTEgKzY5MTYsMTEgQEAKIAkJICogdGhlIHJlZ2lzdGVyIHNwZWNpZmllZCBieSAiaW5kZXgiLgogCQkgKi8KIAkJaWYgKHMgIT0gTlVMTCkgewotCQkJc2FwcGVuZChzLCB4ZmVyX3RvX2EoaW5zdCkpOwotCQkJc2FwcGVuZChzLCBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX1gpKTsKLQkJCXNhcHBlbmQocywgbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCkpOworCQkJc2FwcGVuZChzLCB4ZmVyX3RvX2EoY3N0YXRlLCBpbnN0KSk7CisJCQlzYXBwZW5kKHMsIG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQUREfEJQRl9YKSk7CisJCQlzYXBwZW5kKHMsIG5ld19zdG10KGNzdGF0ZSwgQlBGX01JU0N8QlBGX1RBWCkpOwogCQl9IGVsc2UKLQkJCXMgPSB4ZmVyX3RvX3goaW5zdCk7CisJCQlzID0geGZlcl90b194KGNzdGF0ZSwgaW5zdCk7CiAKIAkJLyoKIAkJICogTG9hZCB0aGUgaXRlbSBhdCB0aGUgc3VtIG9mIHRoZSBvZmZzZXQgd2UndmUgcHV0IGluIHRoZQpAQCAtNjgzMyw4ICs2OTI5LDggQEAKIAkJICogcGF5bG9hZCwgYW5kIHRoZSBjb25zdGFudCBwYXJ0IG9mIHRoZSBvZmZzZXQgb2YgdGhlCiAJCSAqIHN0YXJ0IG9mIHRoZSBsaW5rLWxheWVyIHBheWxvYWQuCiAJCSAqLwotCQl0bXAgPSBuZXdfc3RtdChCUEZfTER8QlBGX0lORHxzaXplKTsKLQkJdG1wLT5zLmsgPSBvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBvZmZfbmw7CisJCXRtcCA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9JTkR8c2l6ZSk7CisJCXRtcC0+cy5rID0gY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBjc3RhdGUtPm9mZl9ubDsKIAkJc2FwcGVuZChzLCB0bXApOwogCQlzYXBwZW5kKGluc3QtPnMsIHMpOwogCkBAIC02ODQyLDcgKzY5MzgsNyBAQAogCQkgKiBEbyB0aGUgY29tcHV0YXRpb24gb25seSBpZiB0aGUgcGFja2V0IGNvbnRhaW5zCiAJCSAqIHRoZSBwcm90b2NvbCBpbiBxdWVzdGlvbi4KIAkJICovCi0JCWIgPSBnZW5fcHJvdG9fYWJicmV2KHByb3RvKTsKKwkJYiA9IGdlbl9wcm90b19hYmJyZXYoY3N0YXRlLCBwcm90byk7CiAJCWlmIChpbnN0LT5iKQogCQkJZ2VuX2FuZChpbnN0LT5iLCBiKTsKIAkJaW5zdC0+YiA9IGI7CkBAIC02ODY2LDEyICs2OTYyLDEyIEBACiAJCSAqIGEgdmFyaWFibGUtbGVuZ3RoIGhlYWRlciksIGluIGJ5dGVzLgogCQkgKgogCQkgKiBYWFggLSBhcmUgdGhlcmUgYW55IGNhc2VzIHdoZXJlIHdlIHdhbnQKLQkJICogb2ZmX25sX25vc25hcD8KKwkJICogY3N0YXRlLT5vZmZfbmxfbm9zbmFwPwogCQkgKiBYWFggLSB3ZSBzaG91bGQsIGlmIHdlJ3JlIGJ1aWx0IHdpdGgKIAkJICogSVB2NiBzdXBwb3J0LCBnZW5lcmF0ZSBjb2RlIHRvIGxvYWQgZWl0aGVyCiAJCSAqIElQdjQsIElQdjYsIG9yIGJvdGgsIGFzIGFwcHJvcHJpYXRlLgogCQkgKi8KLQkJcyA9IGdlbl9sb2FkeF9pcGhkcmxlbigpOworCQlzID0gZ2VuX2xvYWR4X2lwaGRybGVuKGNzdGF0ZSk7CiAKIAkJLyoKIAkJICogVGhlIFggcmVnaXN0ZXIgbm93IGNvbnRhaW5zIHRoZSBzdW0gb2YgdGhlIHZhcmlhYmxlCkBAIC02ODg3LDExICs2OTgzLDExIEBACiAJCSAqIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgcGF5bG9hZCwKIAkJICogb2YgdGhlIG5ldHdvcmstbGF5ZXIgaGVhZGVyLgogCQkgKi8KLQkJc2FwcGVuZChzLCB4ZmVyX3RvX2EoaW5zdCkpOwotCQlzYXBwZW5kKHMsIG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfWCkpOwotCQlzYXBwZW5kKHMsIG5ld19zdG10KEJQRl9NSVNDfEJQRl9UQVgpKTsKLQkJc2FwcGVuZChzLCB0bXAgPSBuZXdfc3RtdChCUEZfTER8QlBGX0lORHxzaXplKSk7Ci0JCXRtcC0+cy5rID0gb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgb2ZmX25sOworCQlzYXBwZW5kKHMsIHhmZXJfdG9fYShjc3RhdGUsIGluc3QpKTsKKwkJc2FwcGVuZChzLCBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX0FERHxCUEZfWCkpOworCQlzYXBwZW5kKHMsIG5ld19zdG10KGNzdGF0ZSwgQlBGX01JU0N8QlBGX1RBWCkpOworCQlzYXBwZW5kKHMsIHRtcCA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0xEfEJQRl9JTkR8c2l6ZSkpOworCQl0bXAtPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgY3N0YXRlLT5vZmZfbmw7CiAJCXNhcHBlbmQoaW5zdC0+cywgcyk7CiAKIAkJLyoKQEAgLTY5MDAsMTggKzY5OTYsMTggQEAKIAkJICogaWYgdGhpcyBpcyBhbiBJUCBkYXRhZ3JhbSBhbmQgaXMgdGhlIGZpcnN0IG9yCiAJCSAqIG9ubHkgZnJhZ21lbnQgb2YgdGhhdCBkYXRhZ3JhbS4KIAkJICovCi0JCWdlbl9hbmQoZ2VuX3Byb3RvX2FiYnJldihwcm90byksIGIgPSBnZW5faXBmcmFnKCkpOworCQlnZW5fYW5kKGdlbl9wcm90b19hYmJyZXYoY3N0YXRlLCBwcm90byksIGIgPSBnZW5faXBmcmFnKGNzdGF0ZSkpOwogCQlpZiAoaW5zdC0+YikKIAkJCWdlbl9hbmQoaW5zdC0+YiwgYik7Ci0JCWdlbl9hbmQoZ2VuX3Byb3RvX2FiYnJldihRX0lQKSwgYik7CisJCWdlbl9hbmQoZ2VuX3Byb3RvX2FiYnJldihjc3RhdGUsIFFfSVApLCBiKTsKIAkJaW5zdC0+YiA9IGI7CiAJCWJyZWFrOwogCWNhc2UgUV9JQ01QVjY6Ci0JCWJwZl9lcnJvcigiSVB2NiB1cHBlci1sYXllciBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvW3hdIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJJUHY2IHVwcGVyLWxheWVyIHByb3RvY29sIGlzIG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9beF0iKTsKIAkJLypOT1RSRUFDSEVEKi8KIAl9CiAJaW5zdC0+cmVnbm8gPSByZWdubzsKLQlzID0gbmV3X3N0bXQoQlBGX1NUKTsKKwlzID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfU1QpOwogCXMtPnMuayA9IHJlZ25vOwogCXNhcHBlbmQoaW5zdC0+cywgcyk7CiAKQEAgLTY5MTksMjMgKzcwMTUsMjEgQEAKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9yZWxhdGlvbihjb2RlLCBhMCwgYTEsIHJldmVyc2VkKQotCWludCBjb2RlOwotCXN0cnVjdCBhcnRoICphMCwgKmExOwotCWludCByZXZlcnNlZDsKK2dlbl9yZWxhdGlvbihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBjb2RlLCBzdHJ1Y3QgYXJ0aCAqYTAsCisgICAgc3RydWN0IGFydGggKmExLCBpbnQgcmV2ZXJzZWQpCiB7CiAJc3RydWN0IHNsaXN0ICpzMCwgKnMxLCAqczI7CiAJc3RydWN0IGJsb2NrICpiLCAqdG1wOwogCi0JczAgPSB4ZmVyX3RvX3goYTEpOwotCXMxID0geGZlcl90b19hKGEwKTsKKwlzMCA9IHhmZXJfdG9feChjc3RhdGUsIGExKTsKKwlzMSA9IHhmZXJfdG9fYShjc3RhdGUsIGEwKTsKIAlpZiAoY29kZSA9PSBCUEZfSkVRKSB7Ci0JCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfU1VCfEJQRl9YKTsKLQkJYiA9IG5ld19ibG9jayhKTVAoY29kZSkpOworCQlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfU1VCfEJQRl9YKTsKKwkJYiA9IG5ld19ibG9jayhjc3RhdGUsIEpNUChjb2RlKSk7CiAJCXNhcHBlbmQoczEsIHMyKTsKIAl9CiAJZWxzZQotCQliID0gbmV3X2Jsb2NrKEJQRl9KTVB8Y29kZXxCUEZfWCk7CisJCWIgPSBuZXdfYmxvY2soY3N0YXRlLCBCUEZfSk1QfGNvZGV8QlBGX1gpOwogCWlmIChyZXZlcnNlZCkKIAkJZ2VuX25vdChiKTsKIApAQCAtNjk0NSw4ICs3MDM5LDggQEAKIAogCWItPnN0bXRzID0gYTAtPnM7CiAKLQlmcmVlX3JlZyhhMC0+cmVnbm8pOwotCWZyZWVfcmVnKGExLT5yZWdubyk7CisJZnJlZV9yZWcoY3N0YXRlLCBhMC0+cmVnbm8pOworCWZyZWVfcmVnKGNzdGF0ZSwgYTEtPnJlZ25vKTsKIAogCS8qICdhbmQnIHRvZ2V0aGVyIHByb3RvY29sIGNoZWNrcyAqLwogCWlmIChhMC0+YikgewpAQCAtNjk2NSwxNCArNzA1OSwxNCBAQAogfQogCiBzdHJ1Y3QgYXJ0aCAqCi1nZW5fbG9hZGxlbigpCitnZW5fbG9hZGxlbihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7Ci0JaW50IHJlZ25vID0gYWxsb2NfcmVnKCk7Ci0Jc3RydWN0IGFydGggKmEgPSAoc3RydWN0IGFydGggKiluZXdjaHVuayhzaXplb2YoKmEpKTsKKwlpbnQgcmVnbm8gPSBhbGxvY19yZWcoY3N0YXRlKTsKKwlzdHJ1Y3QgYXJ0aCAqYSA9IChzdHJ1Y3QgYXJ0aCAqKW5ld2NodW5rKGNzdGF0ZSwgc2l6ZW9mKCphKSk7CiAJc3RydWN0IHNsaXN0ICpzOwogCi0JcyA9IG5ld19zdG10KEJQRl9MRHxCUEZfTEVOKTsKLQlzLT5uZXh0ID0gbmV3X3N0bXQoQlBGX1NUKTsKKwlzID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX0xFTik7CisJcy0+bmV4dCA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX1NUKTsKIAlzLT5uZXh0LT5zLmsgPSByZWdubzsKIAlhLT5zID0gczsKIAlhLT5yZWdubyA9IHJlZ25vOwpAQCAtNjk4MSwyMCArNzA3NSwxOSBAQAogfQogCiBzdHJ1Y3QgYXJ0aCAqCi1nZW5fbG9hZGkodmFsKQotCWludCB2YWw7CitnZW5fbG9hZGkoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgdmFsKQogewogCXN0cnVjdCBhcnRoICphOwogCXN0cnVjdCBzbGlzdCAqczsKIAlpbnQgcmVnOwogCi0JYSA9IChzdHJ1Y3QgYXJ0aCAqKW5ld2NodW5rKHNpemVvZigqYSkpOworCWEgPSAoc3RydWN0IGFydGggKiluZXdjaHVuayhjc3RhdGUsIHNpemVvZigqYSkpOwogCi0JcmVnID0gYWxsb2NfcmVnKCk7CisJcmVnID0gYWxsb2NfcmVnKGNzdGF0ZSk7CiAKLQlzID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTU0pOworCXMgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfSU1NKTsKIAlzLT5zLmsgPSB2YWw7Ci0Jcy0+bmV4dCA9IG5ld19zdG10KEJQRl9TVCk7CisJcy0+bmV4dCA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX1NUKTsKIAlzLT5uZXh0LT5zLmsgPSByZWc7CiAJYS0+cyA9IHM7CiAJYS0+cmVnbm8gPSByZWc7CkBAIC03MDAzLDE3ICs3MDk2LDE2IEBACiB9CiAKIHN0cnVjdCBhcnRoICoKLWdlbl9uZWcoYSkKLQlzdHJ1Y3QgYXJ0aCAqYTsKK2dlbl9uZWcoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBzdHJ1Y3QgYXJ0aCAqYSkKIHsKIAlzdHJ1Y3Qgc2xpc3QgKnM7CiAKLQlzID0geGZlcl90b19hKGEpOworCXMgPSB4ZmVyX3RvX2EoY3N0YXRlLCBhKTsKIAlzYXBwZW5kKGEtPnMsIHMpOwotCXMgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9ORUcpOworCXMgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX05FRyk7CiAJcy0+cy5rID0gMDsKIAlzYXBwZW5kKGEtPnMsIHMpOwotCXMgPSBuZXdfc3RtdChCUEZfU1QpOworCXMgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9TVCk7CiAJcy0+cy5rID0gYS0+cmVnbm87CiAJc2FwcGVuZChhLT5zLCBzKTsKIApAQCAtNzAyMSw2NSArNzExMyw2OCBAQAogfQogCiBzdHJ1Y3QgYXJ0aCAqCi1nZW5fYXJ0aChjb2RlLCBhMCwgYTEpCi0JaW50IGNvZGU7Ci0Jc3RydWN0IGFydGggKmEwLCAqYTE7CitnZW5fYXJ0aChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBjb2RlLCBzdHJ1Y3QgYXJ0aCAqYTAsCisgICAgc3RydWN0IGFydGggKmExKQogewogCXN0cnVjdCBzbGlzdCAqczAsICpzMSwgKnMyOwogCi0JczAgPSB4ZmVyX3RvX3goYTEpOwotCXMxID0geGZlcl90b19hKGEwKTsKLQlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX1h8Y29kZSk7CisJLyoKKwkgKiBEaXNhbGxvdyBkaXZpc2lvbiBieSwgb3IgbW9kdWx1cyBieSwgemVybzsgd2UgZG8gdGhpcyBoZXJlCisJICogc28gdGhhdCBpdCBnZXRzIGRvbmUgZXZlbiBpZiB0aGUgb3B0aW1pemVyIGlzIGRpc2FibGVkLgorCSAqLworCWlmIChjb2RlID09IEJQRl9ESVYpIHsKKwkJaWYgKGExLT5zLT5zLmNvZGUgPT0gKEJQRl9MRHxCUEZfSU1NKSAmJiBhMS0+cy0+cy5rID09IDApCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiZGl2aXNpb24gYnkgemVybyIpOworCX0gZWxzZSBpZiAoY29kZSA9PSBCUEZfTU9EKSB7CisJCWlmIChhMS0+cy0+cy5jb2RlID09IChCUEZfTER8QlBGX0lNTSkgJiYgYTEtPnMtPnMuayA9PSAwKQorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIm1vZHVsdXMgYnkgemVybyIpOworCX0KKwlzMCA9IHhmZXJfdG9feChjc3RhdGUsIGExKTsKKwlzMSA9IHhmZXJfdG9fYShjc3RhdGUsIGEwKTsKKwlzMiA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfWHxjb2RlKTsKIAogCXNhcHBlbmQoczEsIHMyKTsKIAlzYXBwZW5kKHMwLCBzMSk7CiAJc2FwcGVuZChhMS0+cywgczApOwogCXNhcHBlbmQoYTAtPnMsIGExLT5zKTsKIAotCWZyZWVfcmVnKGEwLT5yZWdubyk7Ci0JZnJlZV9yZWcoYTEtPnJlZ25vKTsKKwlmcmVlX3JlZyhjc3RhdGUsIGEwLT5yZWdubyk7CisJZnJlZV9yZWcoY3N0YXRlLCBhMS0+cmVnbm8pOwogCi0JczAgPSBuZXdfc3RtdChCUEZfU1QpOwotCWEwLT5yZWdubyA9IHMwLT5zLmsgPSBhbGxvY19yZWcoKTsKKwlzMCA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX1NUKTsKKwlhMC0+cmVnbm8gPSBzMC0+cy5rID0gYWxsb2NfcmVnKGNzdGF0ZSk7CiAJc2FwcGVuZChhMC0+cywgczApOwogCiAJcmV0dXJuIGEwOwogfQogCiAvKgotICogSGVyZSB3ZSBoYW5kbGUgc2ltcGxlIGFsbG9jYXRpb24gb2YgdGhlIHNjcmF0Y2ggcmVnaXN0ZXJzLgotICogSWYgdG9vIG1hbnkgcmVnaXN0ZXJzIGFyZSBhbGxvYydkLCB0aGUgYWxsb2NhdG9yIHB1bnRzLgotICovCi1zdGF0aWMgaW50IHJlZ3VzZWRbQlBGX01FTVdPUkRTXTsKLXN0YXRpYyBpbnQgY3VycmVnOwotCi0vKgogICogSW5pdGlhbGl6ZSB0aGUgdGFibGUgb2YgdXNlZCByZWdpc3RlcnMgYW5kIHRoZSBjdXJyZW50IHJlZ2lzdGVyLgogICovCiBzdGF0aWMgdm9pZAotaW5pdF9yZWdzKCkKK2luaXRfcmVncyhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7Ci0JY3VycmVnID0gMDsKLQltZW1zZXQocmVndXNlZCwgMCwgc2l6ZW9mIHJlZ3VzZWQpOworCWNzdGF0ZS0+Y3VycmVnID0gMDsKKwltZW1zZXQoY3N0YXRlLT5yZWd1c2VkLCAwLCBzaXplb2YgY3N0YXRlLT5yZWd1c2VkKTsKIH0KIAogLyoKICAqIFJldHVybiB0aGUgbmV4dCBmcmVlIHJlZ2lzdGVyLgogICovCiBzdGF0aWMgaW50Ci1hbGxvY19yZWcoKQorYWxsb2NfcmVnKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSkKIHsKIAlpbnQgbiA9IEJQRl9NRU1XT1JEUzsKIAogCXdoaWxlICgtLW4gPj0gMCkgewotCQlpZiAocmVndXNlZFtjdXJyZWddKQotCQkJY3VycmVnID0gKGN1cnJlZyArIDEpICUgQlBGX01FTVdPUkRTOworCQlpZiAoY3N0YXRlLT5yZWd1c2VkW2NzdGF0ZS0+Y3VycmVnXSkKKwkJCWNzdGF0ZS0+Y3VycmVnID0gKGNzdGF0ZS0+Y3VycmVnICsgMSkgJSBCUEZfTUVNV09SRFM7CiAJCWVsc2UgewotCQkJcmVndXNlZFtjdXJyZWddID0gMTsKLQkJCXJldHVybiBjdXJyZWc7CisJCQljc3RhdGUtPnJlZ3VzZWRbY3N0YXRlLT5jdXJyZWddID0gMTsKKwkJCXJldHVybiBjc3RhdGUtPmN1cnJlZzsKIAkJfQogCX0KLQlicGZfZXJyb3IoInRvbyBtYW55IHJlZ2lzdGVycyBuZWVkZWQgdG8gZXZhbHVhdGUgZXhwcmVzc2lvbiIpOworCWJwZl9lcnJvcihjc3RhdGUsICJ0b28gbWFueSByZWdpc3RlcnMgbmVlZGVkIHRvIGV2YWx1YXRlIGV4cHJlc3Npb24iKTsKIAkvKiBOT1RSRUFDSEVEICovCiAJcmV0dXJuIDA7CiB9CkBAIC03MDg5LDIxICs3MTg0LDE5IEBACiAgKiBiZSB1c2VkIGxhdGVyLgogICovCiBzdGF0aWMgdm9pZAotZnJlZV9yZWcobikKLQlpbnQgbjsKK2ZyZWVfcmVnKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IG4pCiB7Ci0JcmVndXNlZFtuXSA9IDA7CisJY3N0YXRlLT5yZWd1c2VkW25dID0gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fbGVuKGptcCwgbikKLQlpbnQgam1wLCBuOworZ2VuX2xlbihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBqbXAsIGludCBuKQogewogCXN0cnVjdCBzbGlzdCAqczsKIAlzdHJ1Y3QgYmxvY2sgKmI7CiAKLQlzID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9MRU4pOwotCWIgPSBuZXdfYmxvY2soSk1QKGptcCkpOworCXMgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfTEVOKTsKKwliID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKGptcCkpOwogCWItPnN0bXRzID0gczsKIAliLT5zLmsgPSBuOwogCkBAIC03MTExLDIyICs3MjA0LDIwIEBACiB9CiAKIHN0cnVjdCBibG9jayAqCi1nZW5fZ3JlYXRlcihuKQotCWludCBuOworZ2VuX2dyZWF0ZXIoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgbikKIHsKLQlyZXR1cm4gZ2VuX2xlbihCUEZfSkdFLCBuKTsKKwlyZXR1cm4gZ2VuX2xlbihjc3RhdGUsIEJQRl9KR0UsIG4pOwogfQogCiAvKgogICogQWN0dWFsbHksIHRoaXMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsLgogICovCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2xlc3MobikKLQlpbnQgbjsKK2dlbl9sZXNzKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IG4pCiB7CiAJc3RydWN0IGJsb2NrICpiOwogCi0JYiA9IGdlbl9sZW4oQlBGX0pHVCwgbik7CisJYiA9IGdlbl9sZW4oY3N0YXRlLCBCUEZfSkdULCBuKTsKIAlnZW5fbm90KGIpOwogCiAJcmV0dXJuIGI7CkBAIC03MTQzLDggKzcyMzQsNyBAQAogICogd291bGQgZ2VuZXJhdGUgY29kZSBhcHByb3ByaWF0ZSB0byB0aGUgcmFkaW8gaGVhZGVyIGluIHF1ZXN0aW9uLgogICovCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2J5dGVvcChvcCwgaWR4LCB2YWwpCi0JaW50IG9wLCBpZHgsIHZhbDsKK2dlbl9ieXRlb3AoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgb3AsIGludCBpZHgsIGludCB2YWwpCiB7CiAJc3RydWN0IGJsb2NrICpiOwogCXN0cnVjdCBzbGlzdCAqczsKQEAgLTcxNTQsNzIgKzcyNDQsNzEgQEAKIAkJYWJvcnQoKTsKIAogCWNhc2UgJz0nOgotCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LSERSLCAodV9pbnQpaWR4LCBCUEZfQiwgKGJwZl9pbnQzMil2YWwpOworCQlyZXR1cm4gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktIRFIsICh1X2ludClpZHgsIEJQRl9CLCAoYnBmX2ludDMyKXZhbCk7CiAKIAljYXNlICc8JzoKLQkJYiA9IGdlbl9jbXBfbHQoT1JfTElOS0hEUiwgKHVfaW50KWlkeCwgQlBGX0IsIChicGZfaW50MzIpdmFsKTsKKwkJYiA9IGdlbl9jbXBfbHQoY3N0YXRlLCBPUl9MSU5LSERSLCAodV9pbnQpaWR4LCBCUEZfQiwgKGJwZl9pbnQzMil2YWwpOwogCQlyZXR1cm4gYjsKIAogCWNhc2UgJz4nOgotCQliID0gZ2VuX2NtcF9ndChPUl9MSU5LSERSLCAodV9pbnQpaWR4LCBCUEZfQiwgKGJwZl9pbnQzMil2YWwpOworCQliID0gZ2VuX2NtcF9ndChjc3RhdGUsIE9SX0xJTktIRFIsICh1X2ludClpZHgsIEJQRl9CLCAoYnBmX2ludDMyKXZhbCk7CiAJCXJldHVybiBiOwogCiAJY2FzZSAnfCc6Ci0JCXMgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9PUnxCUEZfSyk7CisJCXMgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX09SfEJQRl9LKTsKIAkJYnJlYWs7CiAKIAljYXNlICcmJzoKLQkJcyA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FORHxCUEZfSyk7CisJCXMgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX0FORHxCUEZfSyk7CiAJCWJyZWFrOwogCX0KIAlzLT5zLmsgPSB2YWw7Ci0JYiA9IG5ld19ibG9jayhKTVAoQlBGX0pFUSkpOworCWIgPSBuZXdfYmxvY2soY3N0YXRlLCBKTVAoQlBGX0pFUSkpOwogCWItPnN0bXRzID0gczsKIAlnZW5fbm90KGIpOwogCiAJcmV0dXJuIGI7CiB9CiAKLXN0YXRpYyB1X2NoYXIgYWJyb2FkY2FzdFtdID0geyAweDAgfTsKK3N0YXRpYyBjb25zdCB1X2NoYXIgYWJyb2FkY2FzdFtdID0geyAweDAgfTsKIAogc3RydWN0IGJsb2NrICoKLWdlbl9icm9hZGNhc3QocHJvdG8pCi0JaW50IHByb3RvOworZ2VuX2Jyb2FkY2FzdChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBwcm90bykKIHsKIAlicGZfdV9pbnQzMiBob3N0bWFzazsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICpiMjsKLQlzdGF0aWMgdV9jaGFyIGVicm9hZGNhc3RbXSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OworCXN0YXRpYyBjb25zdCB1X2NoYXIgZWJyb2FkY2FzdFtdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CiAKIAlzd2l0Y2ggKHByb3RvKSB7CiAKIAljYXNlIFFfREVGQVVMVDoKIAljYXNlIFFfTElOSzoKLQkJc3dpdGNoIChsaW5rdHlwZSkgeworCQlzd2l0Y2ggKGNzdGF0ZS0+bGlua3R5cGUpIHsKIAkJY2FzZSBETFRfQVJDTkVUOgogCQljYXNlIERMVF9BUkNORVRfTElOVVg6Ci0JCQlyZXR1cm4gZ2VuX2Fob3N0b3AoYWJyb2FkY2FzdCwgUV9EU1QpOworCQkJcmV0dXJuIGdlbl9haG9zdG9wKGNzdGF0ZSwgYWJyb2FkY2FzdCwgUV9EU1QpOwogCQljYXNlIERMVF9FTjEwTUI6CiAJCWNhc2UgRExUX05FVEFOQUxZWkVSOgogCQljYXNlIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVDoKLQkJCWIxID0gZ2VuX3ByZXZsaW5raGRyX2NoZWNrKCk7Ci0JCQliMCA9IGdlbl9laG9zdG9wKGVicm9hZGNhc3QsIFFfRFNUKTsKKwkJCWIxID0gZ2VuX3ByZXZsaW5raGRyX2NoZWNrKGNzdGF0ZSk7CisJCQliMCA9IGdlbl9laG9zdG9wKGNzdGF0ZSwgZWJyb2FkY2FzdCwgUV9EU1QpOwogCQkJaWYgKGIxICE9IE5VTEwpCiAJCQkJZ2VuX2FuZChiMSwgYjApOwogCQkJcmV0dXJuIGIwOwogCQljYXNlIERMVF9GRERJOgotCQkJcmV0dXJuIGdlbl9maG9zdG9wKGVicm9hZGNhc3QsIFFfRFNUKTsKKwkJCXJldHVybiBnZW5fZmhvc3RvcChjc3RhdGUsIGVicm9hZGNhc3QsIFFfRFNUKTsKIAkJY2FzZSBETFRfSUVFRTgwMjoKLQkJCXJldHVybiBnZW5fdGhvc3RvcChlYnJvYWRjYXN0LCBRX0RTVCk7CisJCQlyZXR1cm4gZ2VuX3Rob3N0b3AoY3N0YXRlLCBlYnJvYWRjYXN0LCBRX0RTVCk7CiAJCWNhc2UgRExUX0lFRUU4MDJfMTE6CiAJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKIAkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CiAJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CiAJCWNhc2UgRExUX1BQSToKLQkJCXJldHVybiBnZW5fd2xhbmhvc3RvcChlYnJvYWRjYXN0LCBRX0RTVCk7CisJCQlyZXR1cm4gZ2VuX3dsYW5ob3N0b3AoY3N0YXRlLCBlYnJvYWRjYXN0LCBRX0RTVCk7CiAJCWNhc2UgRExUX0lQX09WRVJfRkM6Ci0JCQlyZXR1cm4gZ2VuX2lwZmNob3N0b3AoZWJyb2FkY2FzdCwgUV9EU1QpOworCQkJcmV0dXJuIGdlbl9pcGZjaG9zdG9wKGNzdGF0ZSwgZWJyb2FkY2FzdCwgUV9EU1QpOwogCQlkZWZhdWx0OgotCQkJYnBmX2Vycm9yKCJub3QgYSBicm9hZGNhc3QgbGluayIpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIm5vdCBhIGJyb2FkY2FzdCBsaW5rIik7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTcyMjksMTggKzczMTgsMTggQEAKIAkJICogYXMgYW4gaW5kaWNhdGlvbiB0aGF0IHdlIGRvbid0IGtub3cgdGhlIG5ldG1hc2ssIGFuZCBmYWlsCiAJCSAqIGluIHRoYXQgY2FzZS4KIAkJICovCi0JCWlmIChuZXRtYXNrID09IFBDQVBfTkVUTUFTS19VTktOT1dOKQotCQkJYnBmX2Vycm9yKCJuZXRtYXNrIG5vdCBrbm93biwgc28gJ2lwIGJyb2FkY2FzdCcgbm90IHN1cHBvcnRlZCIpOwotCQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVApOwotCQlob3N0bWFzayA9IH5uZXRtYXNrOwotCQliMSA9IGdlbl9tY21wKE9SX0xJTktQTCwgMTYsIEJQRl9XLCAoYnBmX2ludDMyKTAsIGhvc3RtYXNrKTsKLQkJYjIgPSBnZW5fbWNtcChPUl9MSU5LUEwsIDE2LCBCUEZfVywKKwkJaWYgKGNzdGF0ZS0+bmV0bWFzayA9PSBQQ0FQX05FVE1BU0tfVU5LTk9XTikKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJuZXRtYXNrIG5vdCBrbm93biwgc28gJ2lwIGJyb2FkY2FzdCcgbm90IHN1cHBvcnRlZCIpOworCQliMCA9IGdlbl9saW5rdHlwZShjc3RhdGUsIEVUSEVSVFlQRV9JUCk7CisJCWhvc3RtYXNrID0gfmNzdGF0ZS0+bmV0bWFzazsKKwkJYjEgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktQTCwgMTYsIEJQRl9XLCAoYnBmX2ludDMyKTAsIGhvc3RtYXNrKTsKKwkJYjIgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktQTCwgMTYsIEJQRl9XLAogCQkJICAgICAgKGJwZl9pbnQzMikofjAgJiBob3N0bWFzayksIGhvc3RtYXNrKTsKIAkJZ2VuX29yKGIxLCBiMik7CiAJCWdlbl9hbmQoYjAsIGIyKTsKIAkJcmV0dXJuIGIyOwogCX0KLQlicGZfZXJyb3IoIm9ubHkgbGluay1sYXllci9JUCBicm9hZGNhc3QgZmlsdGVycyBzdXBwb3J0ZWQiKTsKKwlicGZfZXJyb3IoY3N0YXRlLCAib25seSBsaW5rLWxheWVyL0lQIGJyb2FkY2FzdCBmaWx0ZXJzIHN1cHBvcnRlZCIpOwogCS8qIE5PVFJFQUNIRUQgKi8KIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTcyNTAsMjMgKzczMzksMjEgQEAKICAqIHRoZSBib3R0b20gYml0IG9mIHRoZSAqZmlyc3QqIGJ5dGUpLgogICovCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9tYWNfbXVsdGljYXN0KG9mZnNldCkKLQlpbnQgb2Zmc2V0OworZ2VuX21hY19tdWx0aWNhc3QoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgb2Zmc2V0KQogewogCXJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjA7CiAJcmVnaXN0ZXIgc3RydWN0IHNsaXN0ICpzOwogCiAJLyogbGlua1tvZmZzZXRdICYgMSAhPSAwICovCi0JcyA9IGdlbl9sb2FkX2EoT1JfTElOS0hEUiwgb2Zmc2V0LCBCUEZfQik7Ci0JYjAgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LSERSLCBvZmZzZXQsIEJQRl9CKTsKKwliMCA9IG5ld19ibG9jayhjc3RhdGUsIEpNUChCUEZfSlNFVCkpOwogCWIwLT5zLmsgPSAxOwogCWIwLT5zdG10cyA9IHM7CiAJcmV0dXJuIGIwOwogfQogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX211bHRpY2FzdChwcm90bykKLQlpbnQgcHJvdG87CitnZW5fbXVsdGljYXN0KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHByb3RvKQogewogCXJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjAsICpiMSwgKmIyOwogCXJlZ2lzdGVyIHN0cnVjdCBzbGlzdCAqczsKQEAgLTcyNzUsMTcgKzczNjIsMTcgQEAKIAogCWNhc2UgUV9ERUZBVUxUOgogCWNhc2UgUV9MSU5LOgotCQlzd2l0Y2ggKGxpbmt0eXBlKSB7CisJCXN3aXRjaCAoY3N0YXRlLT5saW5rdHlwZSkgewogCQljYXNlIERMVF9BUkNORVQ6CiAJCWNhc2UgRExUX0FSQ05FVF9MSU5VWDoKIAkJCS8qIGFsbCBBUkNuZXQgbXVsdGljYXN0cyB1c2UgdGhlIHNhbWUgYWRkcmVzcyAqLwotCQkJcmV0dXJuIGdlbl9haG9zdG9wKGFicm9hZGNhc3QsIFFfRFNUKTsKKwkJCXJldHVybiBnZW5fYWhvc3RvcChjc3RhdGUsIGFicm9hZGNhc3QsIFFfRFNUKTsKIAkJY2FzZSBETFRfRU4xME1COgogCQljYXNlIERMVF9ORVRBTkFMWVpFUjoKIAkJY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6Ci0JCQliMSA9IGdlbl9wcmV2bGlua2hkcl9jaGVjaygpOworCQkJYjEgPSBnZW5fcHJldmxpbmtoZHJfY2hlY2soY3N0YXRlKTsKIAkJCS8qIGV0aGVyWzBdICYgMSAhPSAwICovCi0JCQliMCA9IGdlbl9tYWNfbXVsdGljYXN0KDApOworCQkJYjAgPSBnZW5fbWFjX211bHRpY2FzdChjc3RhdGUsIDApOwogCQkJaWYgKGIxICE9IE5VTEwpCiAJCQkJZ2VuX2FuZChiMSwgYjApOwogCQkJcmV0dXJuIGIwOwpAQCAtNzI5NiwxMCArNzM4MywxMCBAQAogCQkJICogWFhYIC0gd2FzIHRoYXQgcmVmZXJyaW5nIHRvIGJpdC1vcmRlciBpc3N1ZXM/CiAJCQkgKi8KIAkJCS8qIGZkZGlbMV0gJiAxICE9IDAgKi8KLQkJCXJldHVybiBnZW5fbWFjX211bHRpY2FzdCgxKTsKKwkJCXJldHVybiBnZW5fbWFjX211bHRpY2FzdChjc3RhdGUsIDEpOwogCQljYXNlIERMVF9JRUVFODAyOgogCQkJLyogdHJbMl0gJiAxICE9IDAgKi8KLQkJCXJldHVybiBnZW5fbWFjX211bHRpY2FzdCgyKTsKKwkJCXJldHVybiBnZW5fbWFjX211bHRpY2FzdChjc3RhdGUsIDIpOwogCQljYXNlIERMVF9JRUVFODAyXzExOgogCQljYXNlIERMVF9QUklTTV9IRUFERVI6CiAJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgpAQCAtNzMyNiwyMyArNzQxMywyMyBAQAogCQkJICoKIAkJCSAqIEZpcnN0LCBjaGVjayBmb3IgVG8gRFMgc2V0LCBpLmUuICJsaW5rWzFdICYgMHgwMSIuCiAJCQkgKi8KLQkJCXMgPSBnZW5fbG9hZF9hKE9SX0xJTktIRFIsIDEsIEJQRl9CKTsKLQkJCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQkJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LSERSLCAxLCBCUEZfQik7CisJCQliMSA9IG5ld19ibG9jayhjc3RhdGUsIEpNUChCUEZfSlNFVCkpOwogCQkJYjEtPnMuayA9IDB4MDE7CS8qIFRvIERTICovCiAJCQliMS0+c3RtdHMgPSBzOwogCiAJCQkvKgogCQkJICogSWYgVG8gRFMgaXMgc2V0LCB0aGUgREEgaXMgYXQgMTYuCiAJCQkgKi8KLQkJCWIwID0gZ2VuX21hY19tdWx0aWNhc3QoMTYpOworCQkJYjAgPSBnZW5fbWFjX211bHRpY2FzdChjc3RhdGUsIDE2KTsKIAkJCWdlbl9hbmQoYjEsIGIwKTsKIAogCQkJLyoKIAkJCSAqIE5vdywgY2hlY2sgZm9yIFRvIERTIG5vdCBzZXQsIGkuZS4gY2hlY2sKIAkJCSAqICIhKGxpbmtbMV0gJiAweDAxKSIuCiAJCQkgKi8KLQkJCXMgPSBnZW5fbG9hZF9hKE9SX0xJTktIRFIsIDEsIEJQRl9CKTsKLQkJCWIyID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQkJcyA9IGdlbl9sb2FkX2EoY3N0YXRlLCBPUl9MSU5LSERSLCAxLCBCUEZfQik7CisJCQliMiA9IG5ld19ibG9jayhjc3RhdGUsIEpNUChCUEZfSlNFVCkpOwogCQkJYjItPnMuayA9IDB4MDE7CS8qIFRvIERTICovCiAJCQliMi0+c3RtdHMgPSBzOwogCQkJZ2VuX25vdChiMik7CkBAIC03MzUwLDcgKzc0MzcsNyBAQAogCQkJLyoKIAkJCSAqIElmIFRvIERTIGlzIG5vdCBzZXQsIHRoZSBEQSBpcyBhdCA0LgogCQkJICovCi0JCQliMSA9IGdlbl9tYWNfbXVsdGljYXN0KDQpOworCQkJYjEgPSBnZW5fbWFjX211bHRpY2FzdChjc3RhdGUsIDQpOwogCQkJZ2VuX2FuZChiMiwgYjEpOwogCiAJCQkvKgpAQCAtNzM2Myw4ICs3NDUwLDggQEAKIAkJCSAqIE5vdyBjaGVjayBmb3IgYSBkYXRhIGZyYW1lLgogCQkJICogSS5lLCBjaGVjayAibGlua1swXSAmIDB4MDgiLgogCQkJICovCi0JCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LSERSLCAwLCBCUEZfQik7Ci0JCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJCXMgPSBnZW5fbG9hZF9hKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IpOworCQkJYjEgPSBuZXdfYmxvY2soY3N0YXRlLCBKTVAoQlBGX0pTRVQpKTsKIAkJCWIxLT5zLmsgPSAweDA4OwogCQkJYjEtPnN0bXRzID0gczsKIApAQCAtNzM3OCw4ICs3NDY1LDggQEAKIAkJCSAqIGlzIGEgbWFuYWdlbWVudCBmcmFtZS4KIAkJCSAqIEkuZSwgY2hlY2sgIiEobGlua1swXSAmIDB4MDgpIi4KIAkJCSAqLwotCQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOS0hEUiwgMCwgQlBGX0IpOwotCQkJYjIgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCQlzID0gZ2VuX2xvYWRfYShjc3RhdGUsIE9SX0xJTktIRFIsIDAsIEJQRl9CKTsKKwkJCWIyID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJCQliMi0+cy5rID0gMHgwODsKIAkJCWIyLT5zdG10cyA9IHM7CiAJCQlnZW5fbm90KGIyKTsKQEAgLTczODcsNyArNzQ3NCw3IEBACiAJCQkvKgogCQkJICogRm9yIG1hbmFnZW1lbnQgZnJhbWVzLCB0aGUgREEgaXMgYXQgNC4KIAkJCSAqLwotCQkJYjEgPSBnZW5fbWFjX211bHRpY2FzdCg0KTsKKwkJCWIxID0gZ2VuX21hY19tdWx0aWNhc3QoY3N0YXRlLCA0KTsKIAkJCWdlbl9hbmQoYjIsIGIxKTsKIAogCQkJLyoKQEAgLTc0MDUsOCArNzQ5Miw4IEBACiAJCQkgKgogCQkJICogSS5lLiwgY2hlY2sgIiEobGlua1swXSAmIDB4MDQpIi4KIAkJCSAqLwotCQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOS0hEUiwgMCwgQlBGX0IpOwotCQkJYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCQlzID0gZ2VuX2xvYWRfYShjc3RhdGUsIE9SX0xJTktIRFIsIDAsIEJQRl9CKTsKKwkJCWIxID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KU0VUKSk7CiAJCQliMS0+cy5rID0gMHgwNDsKIAkJCWIxLT5zdG10cyA9IHM7CiAJCQlnZW5fbm90KGIxKTsKQEAgLTc0MTgsNyArNzUwNSw3IEBACiAJCQlnZW5fYW5kKGIxLCBiMCk7CiAJCQlyZXR1cm4gYjA7CiAJCWNhc2UgRExUX0lQX09WRVJfRkM6Ci0JCQliMCA9IGdlbl9tYWNfbXVsdGljYXN0KDIpOworCQkJYjAgPSBnZW5fbWFjX211bHRpY2FzdChjc3RhdGUsIDIpOwogCQkJcmV0dXJuIGIwOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CkBAIC03NDI3LDE4ICs3NTE0LDE4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBRX0lQOgotCQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVApOwotCQliMSA9IGdlbl9jbXBfZ2UoT1JfTElOS1BMLCAxNiwgQlBGX0IsIChicGZfaW50MzIpMjI0KTsKKwkJYjAgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfSVApOworCQliMSA9IGdlbl9jbXBfZ2UoY3N0YXRlLCBPUl9MSU5LUEwsIDE2LCBCUEZfQiwgKGJwZl9pbnQzMikyMjQpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIAogCWNhc2UgUV9JUFY2OgotCQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVBWNik7Ci0JCWIxID0gZ2VuX2NtcChPUl9MSU5LUEwsIDI0LCBCUEZfQiwgKGJwZl9pbnQzMikyNTUpOworCQliMCA9IGdlbl9saW5rdHlwZShjc3RhdGUsIEVUSEVSVFlQRV9JUFY2KTsKKwkJYjEgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS1BMLCAyNCwgQlBGX0IsIChicGZfaW50MzIpMjU1KTsKIAkJZ2VuX2FuZChiMCwgYjEpOwogCQlyZXR1cm4gYjE7CiAJfQotCWJwZl9lcnJvcigibGluay1sYXllciBtdWx0aWNhc3QgZmlsdGVycyBzdXBwb3J0ZWQgb25seSBvbiBldGhlcm5ldC9GRERJL3Rva2VuIHJpbmcvQVJDTkVULzgwMi4xMS9BVE0gTEFORS9GaWJyZSBDaGFubmVsIik7CisJYnBmX2Vycm9yKGNzdGF0ZSwgImxpbmstbGF5ZXIgbXVsdGljYXN0IGZpbHRlcnMgc3VwcG9ydGVkIG9ubHkgb24gZXRoZXJuZXQvRkRESS90b2tlbiByaW5nL0FSQ05FVC84MDIuMTEvQVRNIExBTkUvRmlicmUgQ2hhbm5lbCIpOwogCS8qIE5PVFJFQUNIRUQgKi8KIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTc0NTMsMzUgKzc1NDAsMzQgQEAKICAqIGJldHRlciBhY2NvbXBsaXNoZWQgdXNpbmcgYSBoaWdoZXItbGF5ZXIgZmlsdGVyLgogICovCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2luYm91bmQoZGlyKQotCWludCBkaXI7CitnZW5faW5ib3VuZChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBkaXIpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiMDsKIAogCS8qCiAJICogT25seSBzb21lIGRhdGEgbGluayB0eXBlcyBzdXBwb3J0IGluYm91bmQvb3V0Ym91bmQgcXVhbGlmaWVycy4KIAkgKi8KLQlzd2l0Y2ggKGxpbmt0eXBlKSB7CisJc3dpdGNoIChjc3RhdGUtPmxpbmt0eXBlKSB7CiAJY2FzZSBETFRfU0xJUDoKLQkJYjAgPSBnZW5fcmVsYXRpb24oQlBGX0pFUSwKLQkJCSAgZ2VuX2xvYWQoUV9MSU5LLCBnZW5fbG9hZGkoMCksIDEpLAotCQkJICBnZW5fbG9hZGkoMCksCisJCWIwID0gZ2VuX3JlbGF0aW9uKGNzdGF0ZSwgQlBGX0pFUSwKKwkJCSAgZ2VuX2xvYWQoY3N0YXRlLCBRX0xJTkssIGdlbl9sb2FkaShjc3RhdGUsIDApLCAxKSwKKwkJCSAgZ2VuX2xvYWRpKGNzdGF0ZSwgMCksCiAJCQkgIGRpcik7CiAJCWJyZWFrOwogCiAJY2FzZSBETFRfSVBORVQ6CiAJCWlmIChkaXIpIHsKIAkJCS8qIG1hdGNoIG91dGdvaW5nIHBhY2tldHMgKi8KLQkJCWIwID0gZ2VuX2NtcChPUl9MSU5LSERSLCAyLCBCUEZfSCwgSVBORVRfT1VUQk9VTkQpOworCQkJYjAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMiwgQlBGX0gsIElQTkVUX09VVEJPVU5EKTsKIAkJfSBlbHNlIHsKIAkJCS8qIG1hdGNoIGluY29taW5nIHBhY2tldHMgKi8KLQkJCWIwID0gZ2VuX2NtcChPUl9MSU5LSERSLCAyLCBCUEZfSCwgSVBORVRfSU5CT1VORCk7CisJCQliMCA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LSERSLCAyLCBCUEZfSCwgSVBORVRfSU5CT1VORCk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIERMVF9MSU5VWF9TTEw6CiAJCS8qIG1hdGNoIG91dGdvaW5nIHBhY2tldHMgKi8KLQkJYjAgPSBnZW5fY21wKE9SX0xJTktIRFIsIDAsIEJQRl9ILCBMSU5VWF9TTExfT1VUR09JTkcpOworCQliMCA9IGdlbl9jbXAoY3N0YXRlLCBPUl9MSU5LSERSLCAwLCBCUEZfSCwgTElOVVhfU0xMX09VVEdPSU5HKTsKIAkJaWYgKCFkaXIpIHsKIAkJCS8qIHRvIGZpbHRlciBvbiBpbmJvdW5kIHRyYWZmaWMsIGludmVydCB0aGUgbWF0Y2ggKi8KIAkJCWdlbl9ub3QoYjApOwpAQCAtNzQ5MCw3ICs3NTc2LDcgQEAKIAogI2lmZGVmIEhBVkVfTkVUX1BGVkFSX0gKIAljYXNlIERMVF9QRkxPRzoKLQkJYjAgPSBnZW5fY21wKE9SX0xJTktIRFIsIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgZGlyKSwgQlBGX0IsCisJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktIRFIsIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgZGlyKSwgQlBGX0IsCiAJCSAgICAoYnBmX2ludDMyKSgoZGlyID09IDApID8gUEZfSU4gOiBQRl9PVVQpKTsKIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTc0OTgsMTAgKzc1ODQsMTAgQEAKIAljYXNlIERMVF9QUFBfUFBQRDoKIAkJaWYgKGRpcikgewogCQkJLyogbWF0Y2ggb3V0Z29pbmcgcGFja2V0cyAqLwotCQkJYjAgPSBnZW5fY21wKE9SX0xJTktIRFIsIDAsIEJQRl9CLCBQUFBfUFBQRF9PVVQpOworCQkJYjAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMCwgQlBGX0IsIFBQUF9QUFBEX09VVCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBtYXRjaCBpbmNvbWluZyBwYWNrZXRzICovCi0JCQliMCA9IGdlbl9jbXAoT1JfTElOS0hEUiwgMCwgQlBGX0IsIFBQUF9QUFBEX0lOKTsKKwkJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktIRFIsIDAsIEJQRl9CLCBQUFBfUFBQRF9JTik7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTc1MzIsMTAgKzc2MTgsMTAgQEAKIAkJICogdGhlIGJ5dGUgYWZ0ZXIgdGhlIDMtYnl0ZSBtYWdpYyBudW1iZXIgKi8KIAkJaWYgKGRpcikgewogCQkJLyogbWF0Y2ggb3V0Z29pbmcgcGFja2V0cyAqLwotCQkJYjAgPSBnZW5fbWNtcChPUl9MSU5LSERSLCAzLCBCUEZfQiwgMCwgMHgwMSk7CisJCQliMCA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMywgQlBGX0IsIDAsIDB4MDEpOwogCQl9IGVsc2UgewogCQkJLyogbWF0Y2ggaW5jb21pbmcgcGFja2V0cyAqLwotCQkJYjAgPSBnZW5fbWNtcChPUl9MSU5LSERSLCAzLCBCUEZfQiwgMSwgMHgwMSk7CisJCQliMCA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMywgQlBGX0IsIDEsIDB4MDEpOwogCQl9CiAJCWJyZWFrOwogCkBAIC03NTUyLDIzICs3NjM4LDIzIEBACiAJCSAqIHNwZWNpYWwgbWV0YS1kYXRhIGluIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbjsKIAkJICogaWYgaXQncyBhIHNhdmVmaWxlLCB3ZSBjYW4ndC4KIAkJICovCi0JCWlmIChicGZfcGNhcC0+cmZpbGUgIT0gTlVMTCkgeworCQlpZiAoY3N0YXRlLT5icGZfcGNhcC0+cmZpbGUgIT0gTlVMTCkgewogCQkJLyogV2UgaGF2ZSBhIEZJTEUgKiwgc28gdGhpcyBpcyBhIHNhdmVmaWxlICovCi0JCQlicGZfZXJyb3IoImluYm91bmQvb3V0Ym91bmQgbm90IHN1cHBvcnRlZCBvbiBsaW5rdHlwZSAlZCB3aGVuIHJlYWRpbmcgc2F2ZWZpbGVzIiwKLQkJCSAgICBsaW5rdHlwZSk7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAiaW5ib3VuZC9vdXRib3VuZCBub3Qgc3VwcG9ydGVkIG9uIGxpbmt0eXBlICVkIHdoZW4gcmVhZGluZyBzYXZlZmlsZXMiLAorCQkJICAgIGNzdGF0ZS0+bGlua3R5cGUpOwogCQkJYjAgPSBOVUxMOwogCQkJLyogTk9UUkVBQ0hFRCAqLwogCQl9CiAJCS8qIG1hdGNoIG91dGdvaW5nIHBhY2tldHMgKi8KLQkJYjAgPSBnZW5fY21wKE9SX0xJTktIRFIsIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEtUVFlQRSwgQlBGX0gsCisJCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktIRFIsIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEtUVFlQRSwgQlBGX0gsCiAJCSAgICAgICAgICAgICBQQUNLRVRfT1VUR09JTkcpOwogCQlpZiAoIWRpcikgewogCQkJLyogdG8gZmlsdGVyIG9uIGluYm91bmQgdHJhZmZpYywgaW52ZXJ0IHRoZSBtYXRjaCAqLwogCQkJZ2VuX25vdChiMCk7CiAJCX0KICNlbHNlIC8qIGRlZmluZWQobGludXgpICYmIGRlZmluZWQoUEZfUEFDS0VUKSAmJiBkZWZpbmVkKFNPX0FUVEFDSF9GSUxURVIpICovCi0JCWJwZl9lcnJvcigiaW5ib3VuZC9vdXRib3VuZCBub3Qgc3VwcG9ydGVkIG9uIGxpbmt0eXBlICVkIiwKLQkJICAgIGxpbmt0eXBlKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgImluYm91bmQvb3V0Ym91bmQgbm90IHN1cHBvcnRlZCBvbiBsaW5rdHlwZSAlZCIsCisJCSAgICBjc3RhdGUtPmxpbmt0eXBlKTsKIAkJYjAgPSBOVUxMOwogCQkvKiBOT1RSRUFDSEVEICovCiAjZW5kaWYgLyogZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChQRl9QQUNLRVQpICYmIGRlZmluZWQoU09fQVRUQUNIX0ZJTFRFUikgKi8KQEAgLTc1NzksMTU2ICs3NjY1LDE1NiBAQAogI2lmZGVmIEhBVkVfTkVUX1BGVkFSX0gKIC8qIFBGIGZpcmV3YWxsIGxvZyBtYXRjaGVkIGludGVyZmFjZSAqLwogc3RydWN0IGJsb2NrICoKLWdlbl9wZl9pZm5hbWUoY29uc3QgY2hhciAqaWZuYW1lKQorZ2VuX3BmX2lmbmFtZShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGNvbnN0IGNoYXIgKmlmbmFtZSkKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwOwogCXVfaW50IGxlbiwgb2ZmOwogCi0JaWYgKGxpbmt0eXBlICE9IERMVF9QRkxPRykgewotCQlicGZfZXJyb3IoImlmbmFtZSBzdXBwb3J0ZWQgb25seSBvbiBQRiBsaW5rdHlwZSIpOworCWlmIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9QRkxPRykgeworCQlicGZfZXJyb3IoY3N0YXRlLCAiaWZuYW1lIHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAl9CiAJbGVuID0gc2l6ZW9mKCgoc3RydWN0IHBmbG9naGRyICopMCktPmlmbmFtZSk7CiAJb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBpZm5hbWUpOwogCWlmIChzdHJsZW4oaWZuYW1lKSA+PSBsZW4pIHsKLQkJYnBmX2Vycm9yKCJpZm5hbWUgaW50ZXJmYWNlIG5hbWVzIGNhbiBvbmx5IGJlICVkIGNoYXJhY3RlcnMiLAorCQlicGZfZXJyb3IoY3N0YXRlLCAiaWZuYW1lIGludGVyZmFjZSBuYW1lcyBjYW4gb25seSBiZSAlZCBjaGFyYWN0ZXJzIiwKIAkJICAgIGxlbi0xKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCX0KLQliMCA9IGdlbl9iY21wKE9SX0xJTktIRFIsIG9mZiwgc3RybGVuKGlmbmFtZSksIChjb25zdCB1X2NoYXIgKilpZm5hbWUpOworCWIwID0gZ2VuX2JjbXAoY3N0YXRlLCBPUl9MSU5LSERSLCBvZmYsIHN0cmxlbihpZm5hbWUpLCAoY29uc3QgdV9jaGFyICopaWZuYW1lKTsKIAlyZXR1cm4gKGIwKTsKIH0KIAogLyogUEYgZmlyZXdhbGwgbG9nIHJ1bGVzZXQgbmFtZSAqLwogc3RydWN0IGJsb2NrICoKLWdlbl9wZl9ydWxlc2V0KGNoYXIgKnJ1bGVzZXQpCitnZW5fcGZfcnVsZXNldChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGNoYXIgKnJ1bGVzZXQpCiB7CiAJc3RydWN0IGJsb2NrICpiMDsKIAotCWlmIChsaW5rdHlwZSAhPSBETFRfUEZMT0cpIHsKLQkJYnBmX2Vycm9yKCJydWxlc2V0IHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CisJaWYgKGNzdGF0ZS0+bGlua3R5cGUgIT0gRExUX1BGTE9HKSB7CisJCWJwZl9lcnJvcihjc3RhdGUsICJydWxlc2V0IHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAl9CiAKIAlpZiAoc3RybGVuKHJ1bGVzZXQpID49IHNpemVvZigoKHN0cnVjdCBwZmxvZ2hkciAqKTApLT5ydWxlc2V0KSkgewotCQlicGZfZXJyb3IoInJ1bGVzZXQgbmFtZXMgY2FuIG9ubHkgYmUgJWxkIGNoYXJhY3RlcnMiLAorCQlicGZfZXJyb3IoY3N0YXRlLCAicnVsZXNldCBuYW1lcyBjYW4gb25seSBiZSAlbGQgY2hhcmFjdGVycyIsCiAJCSAgICAobG9uZykoc2l6ZW9mKCgoc3RydWN0IHBmbG9naGRyICopMCktPnJ1bGVzZXQpIC0gMSkpOwogCQkvKiBOT1RSRUFDSEVEICovCiAJfQogCi0JYjAgPSBnZW5fYmNtcChPUl9MSU5LSERSLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIHJ1bGVzZXQpLAorCWIwID0gZ2VuX2JjbXAoY3N0YXRlLCBPUl9MSU5LSERSLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIHJ1bGVzZXQpLAogCSAgICBzdHJsZW4ocnVsZXNldCksIChjb25zdCB1X2NoYXIgKilydWxlc2V0KTsKIAlyZXR1cm4gKGIwKTsKIH0KIAogLyogUEYgZmlyZXdhbGwgbG9nIHJ1bGUgbnVtYmVyICovCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BmX3JucihpbnQgcm5yKQorZ2VuX3BmX3Jucihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBybnIpCiB7CiAJc3RydWN0IGJsb2NrICpiMDsKIAotCWlmIChsaW5rdHlwZSAhPSBETFRfUEZMT0cpIHsKLQkJYnBmX2Vycm9yKCJybnIgc3VwcG9ydGVkIG9ubHkgb24gUEYgbGlua3R5cGUiKTsKKwlpZiAoY3N0YXRlLT5saW5rdHlwZSAhPSBETFRfUEZMT0cpIHsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgInJuciBzdXBwb3J0ZWQgb25seSBvbiBQRiBsaW5rdHlwZSIpOwogCQkvKiBOT1RSRUFDSEVEICovCiAJfQogCi0JYjAgPSBnZW5fY21wKE9SX0xJTktIRFIsIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgcnVsZW5yKSwgQlBGX1csCisJYjAgPSBnZW5fY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBydWxlbnIpLCBCUEZfVywKIAkJIChicGZfaW50MzIpcm5yKTsKIAlyZXR1cm4gKGIwKTsKIH0KIAogLyogUEYgZmlyZXdhbGwgbG9nIHN1Yi1ydWxlIG51bWJlciAqLwogc3RydWN0IGJsb2NrICoKLWdlbl9wZl9zcm5yKGludCBzcm5yKQorZ2VuX3BmX3NybnIoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgc3JucikKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwOwogCi0JaWYgKGxpbmt0eXBlICE9IERMVF9QRkxPRykgewotCQlicGZfZXJyb3IoInNybnIgc3VwcG9ydGVkIG9ubHkgb24gUEYgbGlua3R5cGUiKTsKKwlpZiAoY3N0YXRlLT5saW5rdHlwZSAhPSBETFRfUEZMT0cpIHsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgInNybnIgc3VwcG9ydGVkIG9ubHkgb24gUEYgbGlua3R5cGUiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCX0KIAotCWIwID0gZ2VuX2NtcChPUl9MSU5LSERSLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIHN1YnJ1bGVuciksIEJQRl9XLAorCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktIRFIsIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgc3VicnVsZW5yKSwgQlBGX1csCiAJICAgIChicGZfaW50MzIpc3Jucik7CiAJcmV0dXJuIChiMCk7CiB9CiAKIC8qIFBGIGZpcmV3YWxsIGxvZyByZWFzb24gY29kZSAqLwogc3RydWN0IGJsb2NrICoKLWdlbl9wZl9yZWFzb24oaW50IHJlYXNvbikKK2dlbl9wZl9yZWFzb24oY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgcmVhc29uKQogewogCXN0cnVjdCBibG9jayAqYjA7CiAKLQlpZiAobGlua3R5cGUgIT0gRExUX1BGTE9HKSB7Ci0JCWJwZl9lcnJvcigicmVhc29uIHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CisJaWYgKGNzdGF0ZS0+bGlua3R5cGUgIT0gRExUX1BGTE9HKSB7CisJCWJwZl9lcnJvcihjc3RhdGUsICJyZWFzb24gc3VwcG9ydGVkIG9ubHkgb24gUEYgbGlua3R5cGUiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCX0KIAotCWIwID0gZ2VuX2NtcChPUl9MSU5LSERSLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIHJlYXNvbiksIEJQRl9CLAorCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktIRFIsIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgcmVhc29uKSwgQlBGX0IsCiAJICAgIChicGZfaW50MzIpcmVhc29uKTsKIAlyZXR1cm4gKGIwKTsKIH0KIAogLyogUEYgZmlyZXdhbGwgbG9nIGFjdGlvbiAqLwogc3RydWN0IGJsb2NrICoKLWdlbl9wZl9hY3Rpb24oaW50IGFjdGlvbikKK2dlbl9wZl9hY3Rpb24oY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgYWN0aW9uKQogewogCXN0cnVjdCBibG9jayAqYjA7CiAKLQlpZiAobGlua3R5cGUgIT0gRExUX1BGTE9HKSB7Ci0JCWJwZl9lcnJvcigiYWN0aW9uIHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CisJaWYgKGNzdGF0ZS0+bGlua3R5cGUgIT0gRExUX1BGTE9HKSB7CisJCWJwZl9lcnJvcihjc3RhdGUsICJhY3Rpb24gc3VwcG9ydGVkIG9ubHkgb24gUEYgbGlua3R5cGUiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCX0KIAotCWIwID0gZ2VuX2NtcChPUl9MSU5LSERSLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIGFjdGlvbiksIEJQRl9CLAorCWIwID0gZ2VuX2NtcChjc3RhdGUsIE9SX0xJTktIRFIsIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgYWN0aW9uKSwgQlBGX0IsCiAJICAgIChicGZfaW50MzIpYWN0aW9uKTsKIAlyZXR1cm4gKGIwKTsKIH0KICNlbHNlIC8qICFIQVZFX05FVF9QRlZBUl9IICovCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BmX2lmbmFtZShjb25zdCBjaGFyICppZm5hbWUpCitnZW5fcGZfaWZuYW1lKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgY2hhciAqaWZuYW1lKQogewotCWJwZl9lcnJvcigibGlicGNhcCB3YXMgY29tcGlsZWQgd2l0aG91dCBwZiBzdXBwb3J0Iik7CisJYnBmX2Vycm9yKGNzdGF0ZSwgImxpYnBjYXAgd2FzIGNvbXBpbGVkIHdpdGhvdXQgcGYgc3VwcG9ydCIpOwogCS8qIE5PVFJFQUNIRUQgKi8KIAlyZXR1cm4gKE5VTEwpOwogfQogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BmX3J1bGVzZXQoY2hhciAqcnVsZXNldCkKK2dlbl9wZl9ydWxlc2V0KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY2hhciAqcnVsZXNldCkKIHsKLQlicGZfZXJyb3IoImxpYnBjYXAgd2FzIGNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRob3V0IHBmIHN1cHBvcnQiKTsKKwlicGZfZXJyb3IoY3N0YXRlLCAibGlicGNhcCB3YXMgY29tcGlsZWQgb24gYSBtYWNoaW5lIHdpdGhvdXQgcGYgc3VwcG9ydCIpOwogCS8qIE5PVFJFQUNIRUQgKi8KIAlyZXR1cm4gKE5VTEwpOwogfQogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BmX3JucihpbnQgcm5yKQorZ2VuX3BmX3Jucihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBybnIpCiB7Ci0JYnBmX2Vycm9yKCJsaWJwY2FwIHdhcyBjb21waWxlZCBvbiBhIG1hY2hpbmUgd2l0aG91dCBwZiBzdXBwb3J0Iik7CisJYnBmX2Vycm9yKGNzdGF0ZSwgImxpYnBjYXAgd2FzIGNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRob3V0IHBmIHN1cHBvcnQiKTsKIAkvKiBOT1RSRUFDSEVEICovCiAJcmV0dXJuIChOVUxMKTsKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9wZl9zcm5yKGludCBzcm5yKQorZ2VuX3BmX3NybnIoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgc3JucikKIHsKLQlicGZfZXJyb3IoImxpYnBjYXAgd2FzIGNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRob3V0IHBmIHN1cHBvcnQiKTsKKwlicGZfZXJyb3IoY3N0YXRlLCAibGlicGNhcCB3YXMgY29tcGlsZWQgb24gYSBtYWNoaW5lIHdpdGhvdXQgcGYgc3VwcG9ydCIpOwogCS8qIE5PVFJFQUNIRUQgKi8KIAlyZXR1cm4gKE5VTEwpOwogfQogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3BmX3JlYXNvbihpbnQgcmVhc29uKQorZ2VuX3BmX3JlYXNvbihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCByZWFzb24pCiB7Ci0JYnBmX2Vycm9yKCJsaWJwY2FwIHdhcyBjb21waWxlZCBvbiBhIG1hY2hpbmUgd2l0aG91dCBwZiBzdXBwb3J0Iik7CisJYnBmX2Vycm9yKGNzdGF0ZSwgImxpYnBjYXAgd2FzIGNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRob3V0IHBmIHN1cHBvcnQiKTsKIAkvKiBOT1RSRUFDSEVEICovCiAJcmV0dXJuIChOVUxMKTsKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9wZl9hY3Rpb24oaW50IGFjdGlvbikKK2dlbl9wZl9hY3Rpb24oY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgYWN0aW9uKQogewotCWJwZl9lcnJvcigibGlicGNhcCB3YXMgY29tcGlsZWQgb24gYSBtYWNoaW5lIHdpdGhvdXQgcGYgc3VwcG9ydCIpOworCWJwZl9lcnJvcihjc3RhdGUsICJsaWJwY2FwIHdhcyBjb21waWxlZCBvbiBhIG1hY2hpbmUgd2l0aG91dCBwZiBzdXBwb3J0Iik7CiAJLyogTk9UUkVBQ0hFRCAqLwogCXJldHVybiAoTlVMTCk7CiB9CkBAIC03NzM2LDIyICs3ODIyLDIyIEBACiAKIC8qIElFRUUgODAyLjExIHdpcmVsZXNzIGhlYWRlciAqLwogc3RydWN0IGJsb2NrICoKLWdlbl9wODAyMTFfdHlwZShpbnQgdHlwZSwgaW50IG1hc2spCitnZW5fcDgwMjExX3R5cGUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgdHlwZSwgaW50IG1hc2spCiB7CiAJc3RydWN0IGJsb2NrICpiMDsKIAotCXN3aXRjaCAobGlua3R5cGUpIHsKKwlzd2l0Y2ggKGNzdGF0ZS0+bGlua3R5cGUpIHsKIAogCWNhc2UgRExUX0lFRUU4MDJfMTE6CiAJY2FzZSBETFRfUFJJU01fSEVBREVSOgogCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgogCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86Ci0JCWIwID0gZ2VuX21jbXAoT1JfTElOS0hEUiwgMCwgQlBGX0IsIChicGZfaW50MzIpdHlwZSwKKwkJYjAgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktIRFIsIDAsIEJQRl9CLCAoYnBmX2ludDMyKXR5cGUsCiAJCSAgICAoYnBmX2ludDMyKW1hc2spOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJwZl9lcnJvcigiODAyLjExIGxpbmstbGF5ZXIgdHlwZXMgc3VwcG9ydGVkIG9ubHkgb24gODAyLjExIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICI4MDIuMTEgbGluay1sYXllciB0eXBlcyBzdXBwb3J0ZWQgb25seSBvbiA4MDIuMTEiKTsKIAkJLyogTk9UUkVBQ0hFRCAqLwogCX0KIApAQCAtNzc1OSwxMSArNzg0NSwxMSBAQAogfQogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX3A4MDIxMV9mY2RpcihpbnQgZmNkaXIpCitnZW5fcDgwMjExX2ZjZGlyKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IGZjZGlyKQogewogCXN0cnVjdCBibG9jayAqYjA7CiAKLQlzd2l0Y2ggKGxpbmt0eXBlKSB7CisJc3dpdGNoIChjc3RhdGUtPmxpbmt0eXBlKSB7CiAKIAljYXNlIERMVF9JRUVFODAyXzExOgogCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKQEAgLTc3NzIsOTMgKzc4NTgsODkgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlicGZfZXJyb3IoImZyYW1lIGRpcmVjdGlvbiBzdXBwb3J0ZWQgb25seSB3aXRoIDgwMi4xMSBoZWFkZXJzIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJmcmFtZSBkaXJlY3Rpb24gc3VwcG9ydGVkIG9ubHkgd2l0aCA4MDIuMTEgaGVhZGVycyIpOwogCQkvKiBOT1RSRUFDSEVEICovCiAJfQogCi0JYjAgPSBnZW5fbWNtcChPUl9MSU5LSERSLCAxLCBCUEZfQiwgKGJwZl9pbnQzMilmY2RpciwKKwliMCA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgMSwgQlBGX0IsIChicGZfaW50MzIpZmNkaXIsCiAJCShicGZfdV9pbnQzMilJRUVFODAyMTFfRkMxX0RJUl9NQVNLKTsKIAogCXJldHVybiAoYjApOwogfQogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2Fjb2RlKGVhZGRyLCBxKQotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZWFkZHI7Ci0Jc3RydWN0IHF1YWwgcTsKK2dlbl9hY29kZShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGNvbnN0IHVfY2hhciAqZWFkZHIsIHN0cnVjdCBxdWFsIHEpCiB7Ci0Jc3dpdGNoIChsaW5rdHlwZSkgeworCXN3aXRjaCAoY3N0YXRlLT5saW5rdHlwZSkgewogCiAJY2FzZSBETFRfQVJDTkVUOgogCWNhc2UgRExUX0FSQ05FVF9MSU5VWDoKIAkJaWYgKChxLmFkZHIgPT0gUV9IT1NUIHx8IHEuYWRkciA9PSBRX0RFRkFVTFQpICYmCiAJCSAgICBxLnByb3RvID09IFFfTElOSykKLQkJCXJldHVybiAoZ2VuX2Fob3N0b3AoZWFkZHIsIChpbnQpcS5kaXIpKTsKKwkJCXJldHVybiAoZ2VuX2Fob3N0b3AoY3N0YXRlLCBlYWRkciwgKGludClxLmRpcikpOwogCQllbHNlIHsKLQkJCWJwZl9lcnJvcigiQVJDbmV0IGFkZHJlc3MgdXNlZCBpbiBub24tYXJjIGV4cHJlc3Npb24iKTsKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJBUkNuZXQgYWRkcmVzcyB1c2VkIGluIG5vbi1hcmMgZXhwcmVzc2lvbiIpOwogCQkJLyogTk9UUkVBQ0hFRCAqLwogCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJYnBmX2Vycm9yKCJhaWQgc3VwcG9ydGVkIG9ubHkgb24gQVJDbmV0Iik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJhaWQgc3VwcG9ydGVkIG9ubHkgb24gQVJDbmV0Iik7CiAJCS8qIE5PVFJFQUNIRUQgKi8KIAl9Ci0JYnBmX2Vycm9yKCJBUkNuZXQgYWRkcmVzcyB1c2VkIGluIG5vbi1hcmMgZXhwcmVzc2lvbiIpOworCWJwZl9lcnJvcihjc3RhdGUsICJBUkNuZXQgYWRkcmVzcyB1c2VkIGluIG5vbi1hcmMgZXhwcmVzc2lvbiIpOwogCS8qIE5PVFJFQUNIRUQgKi8KIAlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fYWhvc3RvcChlYWRkciwgZGlyKQotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZWFkZHI7Ci0JcmVnaXN0ZXIgaW50IGRpcjsKK2dlbl9haG9zdG9wKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgdV9jaGFyICplYWRkciwgaW50IGRpcikKIHsKIAlyZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CiAKIAlzd2l0Y2ggKGRpcikgewogCS8qIHNyYyBjb21lcyBmaXJzdCwgZGlmZmVyZW50IGZyb20gRXRoZXJuZXQgKi8KIAljYXNlIFFfU1JDOgotCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOS0hEUiwgMCwgMSwgZWFkZHIpOworCQlyZXR1cm4gZ2VuX2JjbXAoY3N0YXRlLCBPUl9MSU5LSERSLCAwLCAxLCBlYWRkcik7CiAKIAljYXNlIFFfRFNUOgotCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOS0hEUiwgMSwgMSwgZWFkZHIpOworCQlyZXR1cm4gZ2VuX2JjbXAoY3N0YXRlLCBPUl9MSU5LSERSLCAxLCAxLCBlYWRkcik7CiAKIAljYXNlIFFfQU5EOgotCQliMCA9IGdlbl9haG9zdG9wKGVhZGRyLCBRX1NSQyk7Ci0JCWIxID0gZ2VuX2Fob3N0b3AoZWFkZHIsIFFfRFNUKTsKKwkJYjAgPSBnZW5fYWhvc3RvcChjc3RhdGUsIGVhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX2Fob3N0b3AoY3N0YXRlLCBlYWRkciwgUV9EU1QpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIAogCWNhc2UgUV9ERUZBVUxUOgogCWNhc2UgUV9PUjoKLQkJYjAgPSBnZW5fYWhvc3RvcChlYWRkciwgUV9TUkMpOwotCQliMSA9IGdlbl9haG9zdG9wKGVhZGRyLCBRX0RTVCk7CisJCWIwID0gZ2VuX2Fob3N0b3AoY3N0YXRlLCBlYWRkciwgUV9TUkMpOworCQliMSA9IGdlbl9haG9zdG9wKGNzdGF0ZSwgZWFkZHIsIFFfRFNUKTsKIAkJZ2VuX29yKGIwLCBiMSk7CiAJCXJldHVybiBiMTsKIAogCWNhc2UgUV9BRERSMToKLQkJYnBmX2Vycm9yKCInYWRkcjEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2FkZHIxJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfQUREUjI6Ci0JCWJwZl9lcnJvcigiJ2FkZHIyJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidhZGRyMicgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CiAJCWJyZWFrOwogCiAJY2FzZSBRX0FERFIzOgotCQlicGZfZXJyb3IoIidhZGRyMycgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICInYWRkcjMnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOwogCQlicmVhazsKIAogCWNhc2UgUV9BRERSNDoKLQkJYnBmX2Vycm9yKCInYWRkcjQnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2FkZHI0JyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKIAkJYnJlYWs7CiAKIAljYXNlIFFfUkE6Ci0JCWJwZl9lcnJvcigiJ3JhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIidyYScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CiAJCWJyZWFrOwogCiAJY2FzZSBRX1RBOgotCQlicGZfZXJyb3IoIid0YScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICIndGEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOwogCQlicmVhazsKIAl9CiAJYWJvcnQoKTsKQEAgLTc4NjcsMjUgKzc5NDksMjUgQEAKIAogI2lmIGRlZmluZWQoU0tGX0FEX1ZMQU5fVEFHKSAmJiBkZWZpbmVkKFNLRl9BRF9WTEFOX1RBR19QUkVTRU5UKQogc3RhdGljIHN0cnVjdCBibG9jayAqCi1nZW5fdmxhbl9icGZfZXh0ZW5zaW9ucyhpbnQgdmxhbl9udW0pCitnZW5fdmxhbl9icGZfZXh0ZW5zaW9ucyhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCB2bGFuX251bSkKIHsKICAgICAgICAgc3RydWN0IGJsb2NrICpiMCwgKmIxOwogICAgICAgICBzdHJ1Y3Qgc2xpc3QgKnM7CiAKICAgICAgICAgLyogZ2VuZXJhdGUgbmV3IGZpbHRlciBjb2RlIGJhc2VkIG9uIGV4dHJhY3RpbmcgcGFja2V0CiAgICAgICAgICAqIG1ldGFkYXRhICovCi0gICAgICAgIHMgPSBuZXdfc3RtdChCUEZfTER8QlBGX0J8QlBGX0FCUyk7CisgICAgICAgIHMgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfQnxCUEZfQUJTKTsKICAgICAgICAgcy0+cy5rID0gU0tGX0FEX09GRiArIFNLRl9BRF9WTEFOX1RBR19QUkVTRU5UOwogCi0gICAgICAgIGIwID0gbmV3X2Jsb2NrKEpNUChCUEZfSkVRKSk7CisgICAgICAgIGIwID0gbmV3X2Jsb2NrKGNzdGF0ZSwgSk1QKEJQRl9KRVEpKTsKICAgICAgICAgYjAtPnN0bXRzID0gczsKICAgICAgICAgYjAtPnMuayA9IDE7CiAKICAgICAgICAgaWYgKHZsYW5fbnVtID49IDApIHsKLSAgICAgICAgICAgICAgICBzID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9CfEJQRl9BQlMpOworICAgICAgICAgICAgICAgIHMgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfQnxCUEZfQUJTKTsKICAgICAgICAgICAgICAgICBzLT5zLmsgPSBTS0ZfQURfT0ZGICsgU0tGX0FEX1ZMQU5fVEFHOwogCi0gICAgICAgICAgICAgICAgYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KRVEpKTsKKyAgICAgICAgICAgICAgICBiMSA9IG5ld19ibG9jayhjc3RhdGUsIEpNUChCUEZfSkVRKSk7CiAgICAgICAgICAgICAgICAgYjEtPnN0bXRzID0gczsKICAgICAgICAgICAgICAgICBiMS0+cy5rID0gKGJwZl9pbnQzMikgdmxhbl9udW07CiAKQEAgLTc4OTgsMTkgKzc5ODAsMjIgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl92bGFuX25vX2JwZl9leHRlbnNpb25zKGludCB2bGFuX251bSkKK2dlbl92bGFuX25vX2JwZl9leHRlbnNpb25zKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHZsYW5fbnVtKQogewogICAgICAgICBzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CiAKICAgICAgICAgLyogY2hlY2sgZm9yIFZMQU4sIGluY2x1ZGluZyBRaW5RICovCi0gICAgICAgIGIwID0gZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV84MDIxUSk7Ci0gICAgICAgIGIxID0gZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV84MDIxUUlOUSk7CisgICAgICAgIGIwID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgRVRIRVJUWVBFXzgwMjFRKTsKKyAgICAgICAgYjEgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfODAyMUFEKTsKKyAgICAgICAgZ2VuX29yKGIwLGIxKTsKKyAgICAgICAgYjAgPSBiMTsKKyAgICAgICAgYjEgPSBnZW5fbGlua3R5cGUoY3N0YXRlLCBFVEhFUlRZUEVfODAyMVFJTlEpOwogICAgICAgICBnZW5fb3IoYjAsYjEpOwogICAgICAgICBiMCA9IGIxOwogCiAgICAgICAgIC8qIElmIGEgc3BlY2lmaWMgVkxBTiBpcyByZXF1ZXN0ZWQsIGNoZWNrIFZMQU4gaWQgKi8KICAgICAgICAgaWYgKHZsYW5fbnVtID49IDApIHsKLSAgICAgICAgICAgICAgICBiMSA9IGdlbl9tY21wKE9SX0xJTktQTCwgMCwgQlBGX0gsCisgICAgICAgICAgICAgICAgYjEgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktQTCwgMCwgQlBGX0gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnBmX2ludDMyKXZsYW5fbnVtLCAweDBmZmYpOwogICAgICAgICAgICAgICAgIGdlbl9hbmQoYjAsIGIxKTsKICAgICAgICAgICAgICAgICBiMCA9IGIxOwpAQCAtNzkyMCwxMyArODAwNSwxMyBAQAogCSAqIFRoZSBwYXlsb2FkIGZvbGxvd3MgdGhlIGZ1bGwgaGVhZGVyLCBpbmNsdWRpbmcgdGhlCiAJICogVkxBTiB0YWdzLCBzbyBza2lwIHBhc3QgdGhpcyBWTEFOIHRhZy4KIAkgKi8KLSAgICAgICAgb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICs9IDQ7CisgICAgICAgIGNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICs9IDQ7CiAKIAkvKgogCSAqIFRoZSBsaW5rLWxheWVyIHR5cGUgaW5mb3JtYXRpb24gZm9sbG93cyB0aGUgVkxBTiB0YWdzLCBzbwogCSAqIHNraXAgcGFzdCB0aGlzIFZMQU4gdGFnLgogCSAqLwotICAgICAgICBvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCArPSA0OworICAgICAgICBjc3RhdGUtPm9mZl9saW5rdHlwZS5jb25zdGFudF9wYXJ0ICs9IDQ7CiAKICAgICAgICAgcmV0dXJuIGIwOwogfQpAQCAtNzkzNSwxNCArODAyMCwxMyBAQAogICogc3VwcG9ydCBJRUVFIDgwMi4xUSBWTEFOIHRydW5rIG92ZXIgZXRoZXJuZXQKICAqLwogc3RydWN0IGJsb2NrICoKLWdlbl92bGFuKHZsYW5fbnVtKQotCWludCB2bGFuX251bTsKK2dlbl92bGFuKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHZsYW5fbnVtKQogewogCXN0cnVjdAlibG9jawkqYjA7CiAKIAkvKiBjYW4ndCBjaGVjayBmb3IgVkxBTi1lbmNhcHN1bGF0ZWQgcGFja2V0cyBpbnNpZGUgTVBMUyAqLwotCWlmIChsYWJlbF9zdGFja19kZXB0aCA+IDApCi0JCWJwZl9lcnJvcigibm8gVkxBTiBtYXRjaCBhZnRlciBNUExTIik7CisJaWYgKGNzdGF0ZS0+bGFiZWxfc3RhY2tfZGVwdGggPiAwKQorCQlicGZfZXJyb3IoY3N0YXRlLCAibm8gVkxBTiBtYXRjaCBhZnRlciBNUExTIik7CiAKIAkvKgogCSAqIENoZWNrIGZvciBhIFZMQU4gcGFja2V0LCBhbmQgdGhlbiBjaGFuZ2UgdGhlIG9mZnNldHMgdG8gcG9pbnQKQEAgLTc5NzUsNyArODA1OSw3IEBACiAJICogYmUgZG9uZSBhc3N1bWluZyBhIFZMQU4sIGV2ZW4gdGhvdWdoIHRoZSAib3IiIGNvdWxkIGJlIHZpZXdlZAogCSAqIGFzIG1lYW5pbmcgIm9yLCBpZiB0aGlzIGlzbid0IGEgVkxBTiBwYWNrZXQuLi4iLgogCSAqLwotCXN3aXRjaCAobGlua3R5cGUpIHsKKwlzd2l0Y2ggKGNzdGF0ZS0+bGlua3R5cGUpIHsKIAogCWNhc2UgRExUX0VOMTBNQjoKIAljYXNlIERMVF9ORVRBTkFMWVpFUjoKQEAgLTc5ODMsMzUgKzgwNjcsMzUgQEAKICNpZiBkZWZpbmVkKFNLRl9BRF9WTEFOX1RBRykgJiYgZGVmaW5lZChTS0ZfQURfVkxBTl9UQUdfUFJFU0VOVCkKIAkJLyogVmVyaWZ5IHRoYXQgdGhpcyBpcyB0aGUgb3V0ZXIgcGFydCBvZiB0aGUgcGFja2V0IGFuZAogCQkgKiBub3QgZW5jYXBzdWxhdGVkIHNvbWVob3cuICovCi0JCWlmICh2bGFuX3N0YWNrX2RlcHRoID09IDAgJiYgIW9mZl9saW5raGRyLmlzX3ZhcmlhYmxlICYmCi0JCSAgICBvZmZfbGlua2hkci5jb25zdGFudF9wYXJ0ID09Ci0JCSAgICBvZmZfb3V0ZXJtb3N0bGlua2hkci5jb25zdGFudF9wYXJ0KSB7CisJCWlmIChjc3RhdGUtPnZsYW5fc3RhY2tfZGVwdGggPT0gMCAmJiAhY3N0YXRlLT5vZmZfbGlua2hkci5pc192YXJpYWJsZSAmJgorCQkgICAgY3N0YXRlLT5vZmZfbGlua2hkci5jb25zdGFudF9wYXJ0ID09CisJCSAgICBjc3RhdGUtPm9mZl9vdXRlcm1vc3RsaW5raGRyLmNvbnN0YW50X3BhcnQpIHsKIAkJCS8qCiAJCQkgKiBEbyB3ZSBuZWVkIHNwZWNpYWwgVkxBTiBoYW5kbGluZz8KIAkJCSAqLwotCQkJaWYgKGJwZl9wY2FwLT5icGZfY29kZWdlbl9mbGFncyAmIEJQRl9TUEVDSUFMX1ZMQU5fSEFORExJTkcpCi0JCQkJYjAgPSBnZW5fdmxhbl9icGZfZXh0ZW5zaW9ucyh2bGFuX251bSk7CisJCQlpZiAoY3N0YXRlLT5icGZfcGNhcC0+YnBmX2NvZGVnZW5fZmxhZ3MgJiBCUEZfU1BFQ0lBTF9WTEFOX0hBTkRMSU5HKQorCQkJCWIwID0gZ2VuX3ZsYW5fYnBmX2V4dGVuc2lvbnMoY3N0YXRlLCB2bGFuX251bSk7CiAJCQllbHNlCi0JCQkJYjAgPSBnZW5fdmxhbl9ub19icGZfZXh0ZW5zaW9ucyh2bGFuX251bSk7CisJCQkJYjAgPSBnZW5fdmxhbl9ub19icGZfZXh0ZW5zaW9ucyhjc3RhdGUsIHZsYW5fbnVtKTsKIAkJfSBlbHNlCiAjZW5kaWYKLQkJCWIwID0gZ2VuX3ZsYW5fbm9fYnBmX2V4dGVuc2lvbnModmxhbl9udW0pOworCQkJYjAgPSBnZW5fdmxhbl9ub19icGZfZXh0ZW5zaW9ucyhjc3RhdGUsIHZsYW5fbnVtKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogCWNhc2UgRExUX0lFRUU4MDJfMTE6CiAJY2FzZSBETFRfUFJJU01fSEVBREVSOgogCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgogCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86Ci0JCWIwID0gZ2VuX3ZsYW5fbm9fYnBmX2V4dGVuc2lvbnModmxhbl9udW0pOworCQliMCA9IGdlbl92bGFuX25vX2JwZl9leHRlbnNpb25zKGNzdGF0ZSwgdmxhbl9udW0pOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWJwZl9lcnJvcigibm8gVkxBTiBzdXBwb3J0IGZvciBkYXRhIGxpbmsgdHlwZSAlZCIsCi0JCSAgICAgIGxpbmt0eXBlKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIm5vIFZMQU4gc3VwcG9ydCBmb3IgZGF0YSBsaW5rIHR5cGUgJWQiLAorCQkgICAgICBjc3RhdGUtPmxpbmt0eXBlKTsKIAkJLypOT1RSRUFDSEVEKi8KIAl9CiAKLSAgICAgICAgdmxhbl9zdGFja19kZXB0aCsrOworICAgICAgICBjc3RhdGUtPnZsYW5fc3RhY2tfZGVwdGgrKzsKIAogCXJldHVybiAoYjApOwogfQpAQCAtODAyMCwzMCArODEwNCwyOSBAQAogICogc3VwcG9ydCBmb3IgTVBMUwogICovCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX21wbHMobGFiZWxfbnVtKQotCWludCBsYWJlbF9udW07CitnZW5fbXBscyhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBsYWJlbF9udW0pCiB7CiAJc3RydWN0CWJsb2NrCSpiMCwgKmIxOwogCi0gICAgICAgIGlmIChsYWJlbF9zdGFja19kZXB0aCA+IDApIHsKKyAgICAgICAgaWYgKGNzdGF0ZS0+bGFiZWxfc3RhY2tfZGVwdGggPiAwKSB7CiAgICAgICAgICAgICAvKiBqdXN0IG1hdGNoIHRoZSBib3R0b20tb2Ytc3RhY2sgYml0IGNsZWFyICovCi0gICAgICAgICAgICBiMCA9IGdlbl9tY21wKE9SX1BSRVZNUExTSERSLCAyLCBCUEZfQiwgMCwgMHgwMSk7CisgICAgICAgICAgICBiMCA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfUFJFVk1QTFNIRFIsIDIsIEJQRl9CLCAwLCAweDAxKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBXZSdyZSBub3QgaW4gYW4gTVBMUyBzdGFjayB5ZXQsIHNvIGNoZWNrIHRoZSBsaW5rLWxheWVyCiAgICAgICAgICAgICAgKiB0eXBlIGFnYWluc3QgTVBMUy4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc3dpdGNoIChsaW5rdHlwZSkgeworICAgICAgICAgICAgc3dpdGNoIChjc3RhdGUtPmxpbmt0eXBlKSB7CiAKICAgICAgICAgICAgIGNhc2UgRExUX0NfSERMQzogLyogZmFsbCB0aHJvdWdoICovCiAgICAgICAgICAgICBjYXNlIERMVF9FTjEwTUI6CiAgICAgICAgICAgICBjYXNlIERMVF9ORVRBTkFMWVpFUjoKICAgICAgICAgICAgIGNhc2UgRExUX05FVEFOQUxZWkVSX1RSQU5TUEFSRU5UOgotICAgICAgICAgICAgICAgICAgICBiMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfTVBMUyk7CisgICAgICAgICAgICAgICAgICAgIGIwID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgRVRIRVJUWVBFX01QTFMpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBETFRfUFBQOgotICAgICAgICAgICAgICAgICAgICBiMCA9IGdlbl9saW5rdHlwZShQUFBfTVBMU19VQ0FTVCk7CisgICAgICAgICAgICAgICAgICAgIGIwID0gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgUFBQX01QTFNfVUNBU1QpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRSBhZGQgb3RoZXIgRExUX3MgLi4uCkBAIC04MDUxLDggKzgxMzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgKiBsZWF2ZSBpdCBmb3Igbm93ICovCiAKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJwZl9lcnJvcigibm8gTVBMUyBzdXBwb3J0IGZvciBkYXRhIGxpbmsgdHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYnBmX2Vycm9yKGNzdGF0ZSwgIm5vIE1QTFMgc3VwcG9ydCBmb3IgZGF0YSBsaW5rIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RhdGUtPmxpbmt0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgYjAgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgICAvKk5PVFJFQUNIRUQqLwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTgwNjIsNyArODE0NSw3IEBACiAJLyogSWYgYSBzcGVjaWZpYyBNUExTIGxhYmVsIGlzIHJlcXVlc3RlZCwgY2hlY2sgaXQgKi8KIAlpZiAobGFiZWxfbnVtID49IDApIHsKIAkJbGFiZWxfbnVtID0gbGFiZWxfbnVtIDw8IDEyOyAvKiBsYWJlbCBpcyBzaGlmdGVkIDEyIGJpdHMgb24gdGhlIHdpcmUgKi8KLQkJYjEgPSBnZW5fbWNtcChPUl9MSU5LUEwsIDAsIEJQRl9XLCAoYnBmX2ludDMyKWxhYmVsX251bSwKKwkJYjEgPSBnZW5fbWNtcChjc3RhdGUsIE9SX0xJTktQTCwgMCwgQlBGX1csIChicGZfaW50MzIpbGFiZWxfbnVtLAogCQkgICAgMHhmZmZmZjAwMCk7IC8qIG9ubHkgY29tcGFyZSB0aGUgZmlyc3QgMjAgYml0cyAqLwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCWIwID0gYjE7CkBAIC04MDgyLDkgKzgxNjUsOSBAQAogICAgICAgICAgKgogICAgICAgICAgKiBYWFggLSB0aGlzIGlzIGEgYml0IG9mIGEga2x1ZGdlLiAgU2VlIGNvbW1lbnRzIGluIGdlbl92bGFuKCkuCiAgICAgICAgICAqLwotICAgICAgICBvZmZfbmxfbm9zbmFwICs9IDQ7Ci0gICAgICAgIG9mZl9ubCArPSA0OwotICAgICAgICBsYWJlbF9zdGFja19kZXB0aCsrOworICAgICAgICBjc3RhdGUtPm9mZl9ubF9ub3NuYXAgKz0gNDsKKyAgICAgICAgY3N0YXRlLT5vZmZfbmwgKz0gNDsKKyAgICAgICAgY3N0YXRlLT5sYWJlbF9zdGFja19kZXB0aCsrOwogCXJldHVybiAoYjApOwogfQogCkBAIC04MDkyLDI2ICs4MTc1LDI1IEBACiAgKiBTdXBwb3J0IFBQUE9FIGRpc2NvdmVyeSBhbmQgc2Vzc2lvbi4KICAqLwogc3RydWN0IGJsb2NrICoKLWdlbl9wcHBvZWQoKQorZ2VuX3BwcG9lZChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJLyogY2hlY2sgZm9yIFBQUG9FIGRpc2NvdmVyeSAqLwotCXJldHVybiBnZW5fbGlua3R5cGUoKGJwZl9pbnQzMilFVEhFUlRZUEVfUFBQT0VEKTsKKwlyZXR1cm4gZ2VuX2xpbmt0eXBlKGNzdGF0ZSwgKGJwZl9pbnQzMilFVEhFUlRZUEVfUFBQT0VEKTsKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9wcHBvZXMoc2Vzc19udW0pCi0JaW50IHNlc3NfbnVtOworZ2VuX3BwcG9lcyhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBzZXNzX251bSkKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CiAKIAkvKgogCSAqIFRlc3QgYWdhaW5zdCB0aGUgUFBQb0Ugc2Vzc2lvbiBsaW5rLWxheWVyIHR5cGUuCiAJICovCi0JYjAgPSBnZW5fbGlua3R5cGUoKGJwZl9pbnQzMilFVEhFUlRZUEVfUFBQT0VTKTsKKwliMCA9IGdlbl9saW5rdHlwZShjc3RhdGUsIChicGZfaW50MzIpRVRIRVJUWVBFX1BQUE9FUyk7CiAKIAkvKiBJZiBhIHNwZWNpZmljIHNlc3Npb24gaXMgcmVxdWVzdGVkLCBjaGVjayBQUFBvRSBzZXNzaW9uIGlkICovCiAJaWYgKHNlc3NfbnVtID49IDApIHsKLQkJYjEgPSBnZW5fbWNtcChPUl9MSU5LUEwsIDAsIEJQRl9XLAorCQliMSA9IGdlbl9tY21wKGNzdGF0ZSwgT1JfTElOS1BMLCAwLCBCUEZfVywKIAkJICAgIChicGZfaW50MzIpc2Vzc19udW0sIDB4MDAwMGZmZmYpOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCWIwID0gYjE7CkBAIC04MTU0LDE3ICs4MjM2LDE3IEBACiAJICogc3RhcnRzIGF0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBQUFAgcGFja2V0LiAgRm9yIFBQUG9FLAogCSAqIHRoYXQgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRvdGFsCiAJICogbGluay1sYXllciBwYXlsb2FkLCBpbmNsdWRpbmcgYW55IDgwMi4yIExMQyBoZWFkZXIsIHNvCi0JICogaXQncyA2IGJ5dGVzIHBhc3Qgb2ZmX25sLgorCSAqIGl0J3MgNiBieXRlcyBwYXN0IGNzdGF0ZS0+b2ZmX25sLgogCSAqLwotCVBVU0hfTElOS0hEUihETFRfUFBQLCBvZmZfbGlua3BsLmlzX3ZhcmlhYmxlLAotCSAgICBvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgKyBvZmZfbmwgKyA2LCAvKiA2IGJ5dGVzIHBhc3QgdGhlIFBQUG9FIGhlYWRlciAqLwotCSAgICBvZmZfbGlua3BsLnJlZyk7CisJUFVTSF9MSU5LSERSKGNzdGF0ZSwgRExUX1BQUCwgY3N0YXRlLT5vZmZfbGlua3BsLmlzX3ZhcmlhYmxlLAorCSAgICBjc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCArIGNzdGF0ZS0+b2ZmX25sICsgNiwgLyogNiBieXRlcyBwYXN0IHRoZSBQUFBvRSBoZWFkZXIgKi8KKwkgICAgY3N0YXRlLT5vZmZfbGlua3BsLnJlZyk7CiAKLQlvZmZfbGlua3R5cGUgPSBvZmZfbGlua2hkcjsKLQlvZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBvZmZfbGlua2hkci5jb25zdGFudF9wYXJ0ICsgMjsKKwljc3RhdGUtPm9mZl9saW5rdHlwZSA9IGNzdGF0ZS0+b2ZmX2xpbmtoZHI7CisJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBjc3RhdGUtPm9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgKyAyOwogCi0Jb2ZmX25sID0gMDsKLQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJY3N0YXRlLT5vZmZfbmwgPSAwOworCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLwogCiAJcmV0dXJuIGIwOwogfQpAQCAtODE3MiwyMyArODI1NCwyNCBAQAogLyogQ2hlY2sgdGhhdCB0aGlzIGlzIEdlbmV2ZSBhbmQgdGhlIFZOSSBpcyBjb3JyZWN0IGlmCiAgKiBzcGVjaWZpZWQuIFBhcmFtZXRlcml6ZWQgdG8gaGFuZGxlIGJvdGggSVB2NCBhbmQgSVB2Ni4gKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2dlbmV2ZV9jaGVjayhzdHJ1Y3QgYmxvY2sgKigqZ2VuX3BvcnRmbikoaW50LCBpbnQsIGludCksCi0JCSBlbnVtIGVfb2ZmcmVsIG9mZnJlbCwgaW50IHZuaSkKK2dlbl9nZW5ldmVfY2hlY2soY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLAorICAgIHN0cnVjdCBibG9jayAqKCpnZW5fcG9ydGZuKShjb21waWxlcl9zdGF0ZV90ICosIGludCwgaW50LCBpbnQpLAorICAgIGVudW0gZV9vZmZyZWwgb2ZmcmVsLCBpbnQgdm5pKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMTsKIAotCWIwID0gZ2VuX3BvcnRmbihHRU5FVkVfUE9SVCwgSVBQUk9UT19VRFAsIFFfRFNUKTsKKwliMCA9IGdlbl9wb3J0Zm4oY3N0YXRlLCBHRU5FVkVfUE9SVCwgSVBQUk9UT19VRFAsIFFfRFNUKTsKIAogCS8qIENoZWNrIHRoYXQgd2UgYXJlIG9wZXJhdGluZyBvbiB2ZXJzaW9uIDAuIE90aGVyd2lzZSwgd2UKIAkgKiBjYW4ndCBkZWNvZGUgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcy4gVGhlIHZlcnNpb24gaXMgMiBiaXRzCiAJICogaW4gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIEdlbmV2ZSBoZWFkZXIuICovCi0JYjEgPSBnZW5fbWNtcChvZmZyZWwsIDgsIEJQRl9CLCAoYnBmX2ludDMyKTAsIDB4YzApOworCWIxID0gZ2VuX21jbXAoY3N0YXRlLCBvZmZyZWwsIDgsIEJQRl9CLCAoYnBmX2ludDMyKTAsIDB4YzApOwogCWdlbl9hbmQoYjAsIGIxKTsKIAliMCA9IGIxOwogCiAJaWYgKHZuaSA+PSAwKSB7CiAJCXZuaSA8PD0gODsgLyogVk5JIGlzIGluIHRoZSB1cHBlciAzIGJ5dGVzICovCi0JCWIxID0gZ2VuX21jbXAob2ZmcmVsLCAxMiwgQlBGX1csIChicGZfaW50MzIpdm5pLAorCQliMSA9IGdlbl9tY21wKGNzdGF0ZSwgb2ZmcmVsLCAxMiwgQlBGX1csIChicGZfaW50MzIpdm5pLAogCQkJICAgICAgMHhmZmZmZmYwMCk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJYjAgPSBiMTsKQEAgLTgyMDMsMjMgKzgyODYsMjMgQEAKICAqICAgbmVlZGVkKSBpbnRvIHJlZ2lzdGVyIEEgdG8gYmUgdXNlZCBsYXRlciB0byBjb21wdXRlCiAgKiAgIHRoZSBpbm5lciBwYWNrZXQgb2Zmc2V0cy4gKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2dlbmV2ZTQoaW50IHZuaSkKK2dlbl9nZW5ldmU0KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHZuaSkKIHsKIAlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CiAJc3RydWN0IHNsaXN0ICpzLCAqczE7CiAKLQliMCA9IGdlbl9nZW5ldmVfY2hlY2soZ2VuX3BvcnQsIE9SX1RSQU5fSVBWNCwgdm5pKTsKKwliMCA9IGdlbl9nZW5ldmVfY2hlY2soY3N0YXRlLCBnZW5fcG9ydCwgT1JfVFJBTl9JUFY0LCB2bmkpOwogCiAJLyogTG9hZCB0aGUgSVAgaGVhZGVyIGxlbmd0aCBpbnRvIEEuICovCi0JcyA9IGdlbl9sb2FkeF9pcGhkcmxlbigpOworCXMgPSBnZW5fbG9hZHhfaXBoZHJsZW4oY3N0YXRlKTsKIAotCXMxID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RYQSk7CisJczEgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9NSVNDfEJQRl9UWEEpOwogCXNhcHBlbmQocywgczEpOwogCiAJLyogRm9yY2libHkgYXBwZW5kIHRoZXNlIHN0YXRlbWVudHMgdG8gdGhlIHRydWUgY29uZGl0aW9uCiAJICogb2YgdGhlIHByb3RvY29sIGNoZWNrIGJ5IGNyZWF0aW5nIGEgbmV3IGJsb2NrIHRoYXQgaXMKIAkgKiBhbHdheXMgdHJ1ZSBhbmQgQU5EaW5nIHRoZW0uICovCi0JYjEgPSBuZXdfYmxvY2soQlBGX0pNUHxCUEZfSkVRfEJQRl9YKTsKKwliMSA9IG5ld19ibG9jayhjc3RhdGUsIEJQRl9KTVB8QlBGX0pFUXxCUEZfWCk7CiAJYjEtPnN0bXRzID0gczsKIAliMS0+cy5rID0gMDsKIApAQCAtODIyOSwzNiArODMxMiwzNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9nZW5ldmU2KGludCB2bmkpCitnZW5fZ2VuZXZlNihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCB2bmkpCiB7CiAJc3RydWN0IGJsb2NrICpiMCwgKmIxOwogCXN0cnVjdCBzbGlzdCAqcywgKnMxOwogCi0JYjAgPSBnZW5fZ2VuZXZlX2NoZWNrKGdlbl9wb3J0NiwgT1JfVFJBTl9JUFY2LCB2bmkpOworCWIwID0gZ2VuX2dlbmV2ZV9jaGVjayhjc3RhdGUsIGdlbl9wb3J0NiwgT1JfVFJBTl9JUFY2LCB2bmkpOwogCiAJLyogTG9hZCB0aGUgSVAgaGVhZGVyIGxlbmd0aC4gV2UgbmVlZCB0byBhY2NvdW50IGZvciBhCiAJICogdmFyaWFibGUgbGVuZ3RoIGxpbmsgcHJlZml4IGlmIHRoZXJlIGlzIG9uZS4gKi8KLQlzID0gZ2VuX2Fic19vZmZzZXRfdmFycGFydCgmb2ZmX2xpbmtwbCk7CisJcyA9IGdlbl9hYnNfb2Zmc2V0X3ZhcnBhcnQoY3N0YXRlLCAmY3N0YXRlLT5vZmZfbGlua3BsKTsKIAlpZiAocykgewotCQlzMSA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU1NKTsKKwkJczEgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfSU1NKTsKIAkJczEtPnMuayA9IDQwOwogCQlzYXBwZW5kKHMsIHMxKTsKIAotCQlzMSA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfWCk7CisJCXMxID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfQUxVfEJQRl9BRER8QlBGX1gpOwogCQlzMS0+cy5rID0gMDsKIAkJc2FwcGVuZChzLCBzMSk7CiAJfSBlbHNlIHsKLQkJcyA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU1NKTsKLQkJcy0+cy5rID0gNDA7OworCQlzID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX0lNTSk7CisJCXMtPnMuayA9IDQwOwogCX0KIAogCS8qIEZvcmNpYmx5IGFwcGVuZCB0aGVzZSBzdGF0ZW1lbnRzIHRvIHRoZSB0cnVlIGNvbmRpdGlvbgogCSAqIG9mIHRoZSBwcm90b2NvbCBjaGVjayBieSBjcmVhdGluZyBhIG5ldyBibG9jayB0aGF0IGlzCiAJICogYWx3YXlzIHRydWUgYW5kIEFORGluZyB0aGVtLiAqLwotCXMxID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CisJczEgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9NSVNDfEJQRl9UQVgpOwogCXNhcHBlbmQocywgczEpOwogCi0JYjEgPSBuZXdfYmxvY2soQlBGX0pNUHxCUEZfSkVRfEJQRl9YKTsKKwliMSA9IG5ld19ibG9jayhjc3RhdGUsIEJQRl9KTVB8QlBGX0pFUXxCUEZfWCk7CiAJYjEtPnN0bXRzID0gczsKIAliMS0+cy5rID0gMDsKIApAQCAtODI3Miw3ICs4MzU1LDcgQEAKICAqIC0gVGhlIG9mZnNldCBvZiB0aGUgZW5kIG9mIHRoZSBHZW5ldmUgaGVhZGVyLgogICogLSBUaGUgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgdGhlIGVuY2Fwc3VsYXRlZCBNQUMgaGVhZGVyLiAqLwogc3RhdGljIHN0cnVjdCBzbGlzdCAqCi1nZW5fZ2VuZXZlX29mZnNldHModm9pZCkKK2dlbl9nZW5ldmVfb2Zmc2V0cyhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJc3RydWN0IHNsaXN0ICpzLCAqczEsICpzX3Byb3RvOwogCkBAIC04MjgxLDQ5ICs4MzY0LDQ5IEBACiAJICogKGluY2x1ZGUgYW55IHZhcmlhYmxlIGxpbmsgcHJlZml4KSBhbmQgc3RvcmVkIGluIEEgcGx1cyB0aGUKIAkgKiBmaXhlZCBzaXplZCBoZWFkZXJzIChmaXhlZCBsaW5rIHByZWZpeCwgTUFDIGxlbmd0aCwgYW5kIFVEUAogCSAqIGhlYWRlcikuICovCi0JcyA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfSyk7Ci0Jcy0+cy5rID0gb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgb2ZmX25sICsgODsKKwlzID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfQUxVfEJQRl9BRER8QlBGX0spOworCXMtPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ICsgY3N0YXRlLT5vZmZfbmwgKyA4OwogCiAJLyogU3Rhc2ggdGhpcyBpbiBYIHNpbmNlIHdlJ2xsIG5lZWQgaXQgbGF0ZXIuICovCi0JczEgPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKKwlzMSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX01JU0N8QlBGX1RBWCk7CiAJc2FwcGVuZChzLCBzMSk7CiAKIAkvKiBUaGUgRXRoZXJUeXBlIGluIEdlbmV2ZSBpcyAyIGJ5dGVzIGluLiBDYWxjdWxhdGUgdGhpcyBhbmQKIAkgKiBzdG9yZSBpdC4gKi8KLQlzMSA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfSyk7CisJczEgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9BTFV8QlBGX0FERHxCUEZfSyk7CiAJczEtPnMuayA9IDI7CiAJc2FwcGVuZChzLCBzMSk7CiAKLQlvZmZfbGlua3R5cGUucmVnID0gYWxsb2NfcmVnKCk7Ci0Jb2ZmX2xpbmt0eXBlLmlzX3ZhcmlhYmxlID0gMTsKLQlvZmZfbGlua3R5cGUuY29uc3RhbnRfcGFydCA9IDA7CisJY3N0YXRlLT5vZmZfbGlua3R5cGUucmVnID0gYWxsb2NfcmVnKGNzdGF0ZSk7CisJY3N0YXRlLT5vZmZfbGlua3R5cGUuaXNfdmFyaWFibGUgPSAxOworCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSAwOwogCi0JczEgPSBuZXdfc3RtdChCUEZfU1QpOwotCXMxLT5zLmsgPSBvZmZfbGlua3R5cGUucmVnOworCXMxID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfU1QpOworCXMxLT5zLmsgPSBjc3RhdGUtPm9mZl9saW5rdHlwZS5yZWc7CiAJc2FwcGVuZChzLCBzMSk7CiAKIAkvKiBMb2FkIHRoZSBHZW5ldmUgb3B0aW9uIGxlbmd0aCBhbmQgbWFzayBhbmQgc2hpZnQgdG8gZ2V0IHRoZQogCSAqIG51bWJlciBvZiBieXRlcy4gSXQgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBHZW5ldmUKIAkgKiBoZWFkZXIuICovCi0JczEgPSBuZXdfc3RtdChCUEZfTER8QlBGX0lORHxCUEZfQik7CisJczEgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9MRHxCUEZfSU5EfEJQRl9CKTsKIAlzMS0+cy5rID0gMDsKIAlzYXBwZW5kKHMsIHMxKTsKIAotCXMxID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQU5EfEJQRl9LKTsKKwlzMSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQU5EfEJQRl9LKTsKIAlzMS0+cy5rID0gMHgzZjsKIAlzYXBwZW5kKHMsIHMxKTsKIAotCXMxID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfTVVMfEJQRl9LKTsKKwlzMSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfTVVMfEJQRl9LKTsKIAlzMS0+cy5rID0gNDsKIAlzYXBwZW5kKHMsIHMxKTsKIAogCS8qIEFkZCBpbiB0aGUgcmVzdCBvZiB0aGUgR2VuZXZlIGJhc2UgaGVhZGVyLiAqLwotCXMxID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKKwlzMSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKIAlzMS0+cy5rID0gODsKIAlzYXBwZW5kKHMsIHMxKTsKIAogCS8qIEFkZCB0aGUgR2VuZXZlIGhlYWRlciBsZW5ndGggdG8gaXRzIG9mZnNldCBhbmQgc3RvcmUuICovCi0JczEgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX1gpOworCXMxID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfQUxVfEJQRl9BRER8QlBGX1gpOwogCXMxLT5zLmsgPSAwOwogCXNhcHBlbmQocywgczEpOwogCkBAIC04MzM1LDEwICs4NDE4LDEwIEBACiAJICogLSBUaGUgb25seSBsaW5rIGxheWVyIHRoYXQgd2UgaGF2ZSBzcGVjaWZpYyBzdXBwb3J0IGZvciBpcwogCSAqICAgRXRoZXJuZXQuIFdlIHdpbGwgY29uZmlybSB0aGF0IHRoZSBwYWNrZXQgYWN0dWFsbHkgaXMKIAkgKiAgIEV0aGVybmV0IGF0IHJ1bnRpbWUgYmVmb3JlIGV4ZWN1dGluZyB0aGVzZSBjaGVja3MuICovCi0JUFVTSF9MSU5LSERSKERMVF9FTjEwTUIsIDEsIDAsIGFsbG9jX3JlZygpKTsKKwlQVVNIX0xJTktIRFIoY3N0YXRlLCBETFRfRU4xME1CLCAxLCAwLCBhbGxvY19yZWcoY3N0YXRlKSk7CiAKLQlzMSA9IG5ld19zdG10KEJQRl9TVCk7Ci0JczEtPnMuayA9IG9mZl9saW5raGRyLnJlZzsKKwlzMSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX1NUKTsKKwlzMS0+cy5rID0gY3N0YXRlLT5vZmZfbGlua2hkci5yZWc7CiAJc2FwcGVuZChzLCBzMSk7CiAKIAkvKiBDYWxjdWxhdGUgd2hldGhlciB3ZSBoYXZlIGFuIEV0aGVybmV0IGhlYWRlciBvciBqdXN0IHJhdyBJUC8KQEAgLTgzNDcsNzMgKzg0MzAsNzMgQEAKIAkgKiBzZWFtbGVzc2x5LiBPdGhlcndpc2UsIGtlZXAgd2hhdCB3ZSd2ZSBjYWxjdWxhdGVkIGFscmVhZHkuICovCiAKIAkvKiBXZSBoYXZlIGEgYmFyZSBqbXAgc28gd2UgY2FuJ3QgdXNlIHRoZSBvcHRpbWl6ZXIuICovCi0Jbm9fb3B0aW1pemUgPSAxOworCWNzdGF0ZS0+bm9fb3B0aW1pemUgPSAxOwogCiAJLyogTG9hZCB0aGUgRXRoZXJUeXBlIGluIHRoZSBHZW5ldmUgaGVhZGVyLCAyIGJ5dGVzIGluLiAqLwotCXMxID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8QlBGX0gpOworCXMxID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX0lORHxCUEZfSCk7CiAJczEtPnMuayA9IDI7CiAJc2FwcGVuZChzLCBzMSk7CiAKIAkvKiBMb2FkIFggd2l0aCB0aGUgZW5kIG9mIHRoZSBHZW5ldmUgaGVhZGVyLiAqLwotCXMxID0gbmV3X3N0bXQoQlBGX0xEWHxCUEZfTUVNKTsKLQlzMS0+cy5rID0gb2ZmX2xpbmtoZHIucmVnOworCXMxID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTERYfEJQRl9NRU0pOworCXMxLT5zLmsgPSBjc3RhdGUtPm9mZl9saW5raGRyLnJlZzsKIAlzYXBwZW5kKHMsIHMxKTsKIAogCS8qIENoZWNrIGlmIHRoZSBFdGhlclR5cGUgaXMgVHJhbnNwYXJlbnQgRXRoZXJuZXQgQnJpZGdpbmcuIEF0IHRoZQogCSAqIGVuZCBvZiB0aGlzIGNoZWNrLCB3ZSBzaG91bGQgaGF2ZSB0aGUgdG90YWwgbGVuZ3RoIGluIFguIEluCiAJICogdGhlIG5vbi1FdGhlcm5ldCBjYXNlLCBpdCdzIGFscmVhZHkgdGhlcmUuICovCi0Jc19wcm90byA9IG5ld19zdG10KEpNUChCUEZfSkVRKSk7CisJc19wcm90byA9IG5ld19zdG10KGNzdGF0ZSwgSk1QKEJQRl9KRVEpKTsKIAlzX3Byb3RvLT5zLmsgPSBFVEhFUlRZUEVfVEVCOwogCXNhcHBlbmQocywgc19wcm90byk7CiAKLQlzMSA9IG5ld19zdG10KEJQRl9NSVNDfEJQRl9UWEEpOworCXMxID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTUlTQ3xCUEZfVFhBKTsKIAlzYXBwZW5kKHMsIHMxKTsKIAlzX3Byb3RvLT5zLmp0ID0gczE7CiAKIAkvKiBTaW5jZSB0aGlzIGlzIEV0aGVybmV0LCB1c2UgdGhlIEV0aGVyVHlwZSBvZiB0aGUgcGF5bG9hZAogCSAqIGRpcmVjdGx5IGFzIHRoZSBsaW5rdHlwZS4gT3ZlcndyaXRlIHdoYXQgd2UgYWxyZWFkeSBoYXZlLiAqLwotCXMxID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKKwlzMSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKIAlzMS0+cy5rID0gMTI7CiAJc2FwcGVuZChzLCBzMSk7CiAKLQlzMSA9IG5ld19zdG10KEJQRl9TVCk7Ci0JczEtPnMuayA9IG9mZl9saW5rdHlwZS5yZWc7CisJczEgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9TVCk7CisJczEtPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmt0eXBlLnJlZzsKIAlzYXBwZW5kKHMsIHMxKTsKIAogCS8qIEFkdmFuY2UgdHdvIGJ5dGVzIGZ1cnRoZXIgdG8gZ2V0IHRoZSBlbmQgb2YgdGhlIEV0aGVybmV0CiAJICogaGVhZGVyLiAqLwotCXMxID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKKwlzMSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKIAlzMS0+cy5rID0gMjsKIAlzYXBwZW5kKHMsIHMxKTsKIAogCS8qIE1vdmUgdGhlIHJlc3VsdCB0byBYLiAqLwotCXMxID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CisJczEgPSBuZXdfc3RtdChjc3RhdGUsIEJQRl9NSVNDfEJQRl9UQVgpOwogCXNhcHBlbmQocywgczEpOwogCiAJLyogU3RvcmUgdGhlIGZpbmFsIHJlc3VsdCBvZiBvdXIgbGlua3BsIGNhbGN1bGF0aW9uLiAqLwotCW9mZl9saW5rcGwucmVnID0gYWxsb2NfcmVnKCk7Ci0Jb2ZmX2xpbmtwbC5pc192YXJpYWJsZSA9IDE7Ci0Jb2ZmX2xpbmtwbC5jb25zdGFudF9wYXJ0ID0gMDsKKwljc3RhdGUtPm9mZl9saW5rcGwucmVnID0gYWxsb2NfcmVnKGNzdGF0ZSk7CisJY3N0YXRlLT5vZmZfbGlua3BsLmlzX3ZhcmlhYmxlID0gMTsKKwljc3RhdGUtPm9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IDA7CiAKLQlzMSA9IG5ld19zdG10KEJQRl9TVFgpOwotCXMxLT5zLmsgPSBvZmZfbGlua3BsLnJlZzsKKwlzMSA9IG5ld19zdG10KGNzdGF0ZSwgQlBGX1NUWCk7CisJczEtPnMuayA9IGNzdGF0ZS0+b2ZmX2xpbmtwbC5yZWc7CiAJc2FwcGVuZChzLCBzMSk7CiAJc19wcm90by0+cy5qZiA9IHMxOwogCi0Jb2ZmX25sID0gMDsKKwljc3RhdGUtPm9mZl9ubCA9IDA7CiAKIAlyZXR1cm4gczsKIH0KIAogLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBHZW5ldmUgcGFja2V0LiAqLwogc3RydWN0IGJsb2NrICoKLWdlbl9nZW5ldmUoaW50IHZuaSkKK2dlbl9nZW5ldmUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgdm5pKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMTsKIAlzdHJ1Y3Qgc2xpc3QgKnM7CiAKLQliMCA9IGdlbl9nZW5ldmU0KHZuaSk7Ci0JYjEgPSBnZW5fZ2VuZXZlNih2bmkpOworCWIwID0gZ2VuX2dlbmV2ZTQoY3N0YXRlLCB2bmkpOworCWIxID0gZ2VuX2dlbmV2ZTYoY3N0YXRlLCB2bmkpOwogCiAJZ2VuX29yKGIwLCBiMSk7CiAJYjAgPSBiMTsKQEAgLTg0MjEsMTUgKzg1MDQsMTUgQEAKIAkvKiBMYXRlciBmaWx0ZXJzIHNob3VsZCBhY3Qgb24gdGhlIHBheWxvYWQgb2YgdGhlIEdlbmV2ZSBmcmFtZSwKIAkgKiB1cGRhdGUgYWxsIG9mIHRoZSBoZWFkZXIgcG9pbnRlcnMuIEF0dGFjaCB0aGlzIGNvZGUgc28gdGhhdAogCSAqIGl0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGV2ZW50IHRoYXQgdGhlIEdlbmV2ZSBmaWx0ZXIgbWF0Y2hlcy4gKi8KLQlzID0gZ2VuX2dlbmV2ZV9vZmZzZXRzKCk7CisJcyA9IGdlbl9nZW5ldmVfb2Zmc2V0cyhjc3RhdGUpOwogCi0JYjEgPSBnZW5fdHJ1ZSgpOworCWIxID0gZ2VuX3RydWUoY3N0YXRlKTsKIAlzYXBwZW5kKHMsIGIxLT5zdG10cyk7CiAJYjEtPnN0bXRzID0gczsKIAogCWdlbl9hbmQoYjAsIGIxKTsKIAotCWlzX2dlbmV2ZSA9IDE7CisJY3N0YXRlLT5pc19nZW5ldmUgPSAxOwogCiAJcmV0dXJuIGIxOwogfQpAQCAtODQzNyw3ICs4NTIwLDcgQEAKIC8qIENoZWNrIHRoYXQgdGhlIGVuY2Fwc3VsYXRlZCBmcmFtZSBoYXMgYSBsaW5rIGxheWVyIGhlYWRlcgogICogZm9yIEV0aGVybmV0IGZpbHRlcnMuICovCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9nZW5ldmVfbGxfY2hlY2soKQorZ2VuX2dlbmV2ZV9sbF9jaGVjayhjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAJc3RydWN0IGJsb2NrICpiMDsKIAlzdHJ1Y3Qgc2xpc3QgKnMsICpzMTsKQEAgLTg0NDgsMTQgKzg1MzEsMTQgQEAKIAogCS8qIEdlbmV2ZSBhbHdheXMgZ2VuZXJhdGVzIHB1cmUgdmFyaWFibGUgb2Zmc2V0cyBzbyB3ZSBjYW4KIAkgKiBjb21wYXJlIG9ubHkgdGhlIHJlZ2lzdGVycy4gKi8KLQlzID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9NRU0pOwotCXMtPnMuayA9IG9mZl9saW5raGRyLnJlZzsKKwlzID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTER8QlBGX01FTSk7CisJcy0+cy5rID0gY3N0YXRlLT5vZmZfbGlua2hkci5yZWc7CiAKLQlzMSA9IG5ld19zdG10KEJQRl9MRFh8QlBGX01FTSk7Ci0JczEtPnMuayA9IG9mZl9saW5rcGwucmVnOworCXMxID0gbmV3X3N0bXQoY3N0YXRlLCBCUEZfTERYfEJQRl9NRU0pOworCXMxLT5zLmsgPSBjc3RhdGUtPm9mZl9saW5rcGwucmVnOwogCXNhcHBlbmQocywgczEpOwogCi0JYjAgPSBuZXdfYmxvY2soQlBGX0pNUHxCUEZfSkVRfEJQRl9YKTsKKwliMCA9IG5ld19ibG9jayhjc3RhdGUsIEJQRl9KTVB8QlBGX0pFUXxCUEZfWCk7CiAJYjAtPnN0bXRzID0gczsKIAliMC0+cy5rID0gMDsKIAlnZW5fbm90KGIwKTsKQEAgLTg0NjQsNTQgKzg1NDcsNTEgQEAKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9hdG1maWVsZF9jb2RlKGF0bWZpZWxkLCBqdmFsdWUsIGp0eXBlLCByZXZlcnNlKQotCWludCBhdG1maWVsZDsKLQlicGZfaW50MzIganZhbHVlOwotCWJwZl91X2ludDMyIGp0eXBlOwotCWludCByZXZlcnNlOworZ2VuX2F0bWZpZWxkX2NvZGUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBpbnQgYXRtZmllbGQsIGJwZl9pbnQzMiBqdmFsdWUsCisgICAgYnBmX3VfaW50MzIganR5cGUsIGludCByZXZlcnNlKQogewogCXN0cnVjdCBibG9jayAqYjA7CiAKIAlzd2l0Y2ggKGF0bWZpZWxkKSB7CiAKIAljYXNlIEFfVlBJOgotCQlpZiAoIWlzX2F0bSkKLQkJCWJwZl9lcnJvcigiJ3ZwaScgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOwotCQlpZiAob2ZmX3ZwaSA9PSAodV9pbnQpLTEpCisJCWlmICghY3N0YXRlLT5pc19hdG0pCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiJ3ZwaScgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOworCQlpZiAoY3N0YXRlLT5vZmZfdnBpID09ICh1X2ludCktMSkKIAkJCWFib3J0KCk7Ci0JCWIwID0gZ2VuX25jbXAoT1JfTElOS0hEUiwgb2ZmX3ZwaSwgQlBGX0IsIDB4ZmZmZmZmZmYsIGp0eXBlLAorCQliMCA9IGdlbl9uY21wKGNzdGF0ZSwgT1JfTElOS0hEUiwgY3N0YXRlLT5vZmZfdnBpLCBCUEZfQiwgMHhmZmZmZmZmZiwganR5cGUsCiAJCSAgICByZXZlcnNlLCBqdmFsdWUpOwogCQlicmVhazsKIAogCWNhc2UgQV9WQ0k6Ci0JCWlmICghaXNfYXRtKQotCQkJYnBmX2Vycm9yKCIndmNpJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7Ci0JCWlmIChvZmZfdmNpID09ICh1X2ludCktMSkKKwkJaWYgKCFjc3RhdGUtPmlzX2F0bSkKKwkJCWJwZl9lcnJvcihjc3RhdGUsICIndmNpJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CisJCWlmIChjc3RhdGUtPm9mZl92Y2kgPT0gKHVfaW50KS0xKQogCQkJYWJvcnQoKTsKLQkJYjAgPSBnZW5fbmNtcChPUl9MSU5LSERSLCBvZmZfdmNpLCBCUEZfSCwgMHhmZmZmZmZmZiwganR5cGUsCisJCWIwID0gZ2VuX25jbXAoY3N0YXRlLCBPUl9MSU5LSERSLCBjc3RhdGUtPm9mZl92Y2ksIEJQRl9ILCAweGZmZmZmZmZmLCBqdHlwZSwKIAkJICAgIHJldmVyc2UsIGp2YWx1ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBX1BST1RPVFlQRToKLQkJaWYgKG9mZl9wcm90byA9PSAodV9pbnQpLTEpCisJCWlmIChjc3RhdGUtPm9mZl9wcm90byA9PSAodV9pbnQpLTEpCiAJCQlhYm9ydCgpOwkvKiBYWFggLSB0aGlzIGlzbid0IG9uIEZyZWVCU0QgKi8KLQkJYjAgPSBnZW5fbmNtcChPUl9MSU5LSERSLCBvZmZfcHJvdG8sIEJQRl9CLCAweDBmLCBqdHlwZSwKKwkJYjAgPSBnZW5fbmNtcChjc3RhdGUsIE9SX0xJTktIRFIsIGNzdGF0ZS0+b2ZmX3Byb3RvLCBCUEZfQiwgMHgwZiwganR5cGUsCiAJCSAgICByZXZlcnNlLCBqdmFsdWUpOwogCQlicmVhazsKIAogCWNhc2UgQV9NU0dUWVBFOgotCQlpZiAob2ZmX3BheWxvYWQgPT0gKHVfaW50KS0xKQorCQlpZiAoY3N0YXRlLT5vZmZfcGF5bG9hZCA9PSAodV9pbnQpLTEpCiAJCQlhYm9ydCgpOwotCQliMCA9IGdlbl9uY21wKE9SX0xJTktIRFIsIG9mZl9wYXlsb2FkICsgTVNHX1RZUEVfUE9TLCBCUEZfQiwKKwkJYjAgPSBnZW5fbmNtcChjc3RhdGUsIE9SX0xJTktIRFIsIGNzdGF0ZS0+b2ZmX3BheWxvYWQgKyBNU0dfVFlQRV9QT1MsIEJQRl9CLAogCQkgICAgMHhmZmZmZmZmZiwganR5cGUsIHJldmVyc2UsIGp2YWx1ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBX0NBTExSRUZUWVBFOgotCQlpZiAoIWlzX2F0bSkKLQkJCWJwZl9lcnJvcigiJ2NhbGxyZWYnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKLQkJaWYgKG9mZl9wcm90byA9PSAodV9pbnQpLTEpCisJCWlmICghY3N0YXRlLT5pc19hdG0pCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2NhbGxyZWYnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKKwkJaWYgKGNzdGF0ZS0+b2ZmX3Byb3RvID09ICh1X2ludCktMSkKIAkJCWFib3J0KCk7Ci0JCWIwID0gZ2VuX25jbXAoT1JfTElOS0hEUiwgb2ZmX3Byb3RvLCBCUEZfQiwgMHhmZmZmZmZmZiwKKwkJYjAgPSBnZW5fbmNtcChjc3RhdGUsIE9SX0xJTktIRFIsIGNzdGF0ZS0+b2ZmX3Byb3RvLCBCUEZfQiwgMHhmZmZmZmZmZiwKIAkJICAgIGp0eXBlLCByZXZlcnNlLCBqdmFsdWUpOwogCQlicmVhazsKIApAQCAtODUyMiw4ICs4NjAyLDcgQEAKIH0KIAogc3RydWN0IGJsb2NrICoKLWdlbl9hdG10eXBlX2FiYnJldih0eXBlKQotCWludCB0eXBlOworZ2VuX2F0bXR5cGVfYWJicmV2KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgaW50IHR5cGUpCiB7CiAJc3RydWN0IGJsb2NrICpiMCwgKmIxOwogCkBAIC04NTMxLDYzICs4NjEwLDYzIEBACiAKIAljYXNlIEFfTUVUQUM6CiAJCS8qIEdldCBhbGwgcGFja2V0cyBpbiBNZXRhIHNpZ25hbGxpbmcgQ2lyY3VpdCAqLwotCQlpZiAoIWlzX2F0bSkKLQkJCWJwZl9lcnJvcigiJ21ldGFjJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7Ci0JCWIwID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WUEksIDAsIEJQRl9KRVEsIDApOwotCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVkNJLCAxLCBCUEZfSkVRLCAwKTsKKwkJaWYgKCFjc3RhdGUtPmlzX2F0bSkKKwkJCWJwZl9lcnJvcihjc3RhdGUsICInbWV0YWMnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKKwkJYjAgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfVlBJLCAwLCBCUEZfSkVRLCAwKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfVkNJLCAxLCBCUEZfSkVRLCAwKTsKIAkJZ2VuX2FuZChiMCwgYjEpOwogCQlicmVhazsKIAogCWNhc2UgQV9CQ0M6CiAJCS8qIEdldCBhbGwgcGFja2V0cyBpbiBCcm9hZGNhc3QgQ2lyY3VpdCovCi0JCWlmICghaXNfYXRtKQotCQkJYnBmX2Vycm9yKCInYmNjJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7Ci0JCWIwID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WUEksIDAsIEJQRl9KRVEsIDApOwotCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVkNJLCAyLCBCUEZfSkVRLCAwKTsKKwkJaWYgKCFjc3RhdGUtPmlzX2F0bSkKKwkJCWJwZl9lcnJvcihjc3RhdGUsICInYmNjJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CisJCWIwID0gZ2VuX2F0bWZpZWxkX2NvZGUoY3N0YXRlLCBBX1ZQSSwgMCwgQlBGX0pFUSwgMCk7CisJCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoY3N0YXRlLCBBX1ZDSSwgMiwgQlBGX0pFUSwgMCk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFfT0FNRjRTQzoKIAkJLyogR2V0IGFsbCBjZWxscyBpbiBTZWdtZW50IE9BTSBGNCBjaXJjdWl0Ki8KLQkJaWYgKCFpc19hdG0pCi0JCQlicGZfZXJyb3IoIidvYW00c2MnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKLQkJYjAgPSBnZW5fYXRtZmllbGRfY29kZShBX1ZQSSwgMCwgQlBGX0pFUSwgMCk7Ci0JCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WQ0ksIDMsIEJQRl9KRVEsIDApOworCQlpZiAoIWNzdGF0ZS0+aXNfYXRtKQorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIidvYW00c2MnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKKwkJYjAgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfVlBJLCAwLCBCUEZfSkVRLCAwKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfVkNJLCAzLCBCUEZfSkVRLCAwKTsKIAkJZ2VuX2FuZChiMCwgYjEpOwogCQlicmVhazsKIAogCWNhc2UgQV9PQU1GNEVDOgogCQkvKiBHZXQgYWxsIGNlbGxzIGluIEVuZC10by1FbmQgT0FNIEY0IENpcmN1aXQqLwotCQlpZiAoIWlzX2F0bSkKLQkJCWJwZl9lcnJvcigiJ29hbTRlYycgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOwotCQliMCA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVlBJLCAwLCBCUEZfSkVRLCAwKTsKLQkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShBX1ZDSSwgNCwgQlBGX0pFUSwgMCk7CisJCWlmICghY3N0YXRlLT5pc19hdG0pCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiJ29hbTRlYycgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOworCQliMCA9IGdlbl9hdG1maWVsZF9jb2RlKGNzdGF0ZSwgQV9WUEksIDAsIEJQRl9KRVEsIDApOworCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKGNzdGF0ZSwgQV9WQ0ksIDQsIEJQRl9KRVEsIDApOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBX1NDOgogCQkvKiAgR2V0IGFsbCBwYWNrZXRzIGluIGNvbm5lY3Rpb24gU2lnbmFsbGluZyBDaXJjdWl0ICovCi0JCWlmICghaXNfYXRtKQotCQkJYnBmX2Vycm9yKCInc2MnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKLQkJYjAgPSBnZW5fYXRtZmllbGRfY29kZShBX1ZQSSwgMCwgQlBGX0pFUSwgMCk7Ci0JCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WQ0ksIDUsIEJQRl9KRVEsIDApOworCQlpZiAoIWNzdGF0ZS0+aXNfYXRtKQorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIidzYycgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOworCQliMCA9IGdlbl9hdG1maWVsZF9jb2RlKGNzdGF0ZSwgQV9WUEksIDAsIEJQRl9KRVEsIDApOworCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKGNzdGF0ZSwgQV9WQ0ksIDUsIEJQRl9KRVEsIDApOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBX0lMTUlDOgogCQkvKiBHZXQgYWxsIHBhY2tldHMgaW4gSUxNSSBDaXJjdWl0ICovCi0JCWlmICghaXNfYXRtKQotCQkJYnBmX2Vycm9yKCInaWxtaWMnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKLQkJYjAgPSBnZW5fYXRtZmllbGRfY29kZShBX1ZQSSwgMCwgQlBGX0pFUSwgMCk7Ci0JCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WQ0ksIDE2LCBCUEZfSkVRLCAwKTsKKwkJaWYgKCFjc3RhdGUtPmlzX2F0bSkKKwkJCWJwZl9lcnJvcihjc3RhdGUsICInaWxtaWMnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKKwkJYjAgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfVlBJLCAwLCBCUEZfSkVRLCAwKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfVkNJLCAxNiwgQlBGX0pFUSwgMCk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFfTEFORToKIAkJLyogR2V0IGFsbCBMQU5FIHBhY2tldHMgKi8KLQkJaWYgKCFpc19hdG0pCi0JCQlicGZfZXJyb3IoIidsYW5lJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7Ci0JCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9QUk9UT1RZUEUsIFBUX0xBTkUsIEJQRl9KRVEsIDApOworCQlpZiAoIWNzdGF0ZS0+aXNfYXRtKQorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIidsYW5lJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CisJCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoY3N0YXRlLCBBX1BST1RPVFlQRSwgUFRfTEFORSwgQlBGX0pFUSwgMCk7CiAKIAkJLyoKIAkJICogQXJyYW5nZSB0aGF0IGFsbCBzdWJzZXF1ZW50IHRlc3RzIGFzc3VtZSBMQU5FCkBAIC04NTk3LDIxICs4Njc2LDIxIEBACiAJCSAqCiAJCSAqIFdlIGFzc3VtZSBMQU5FIG1lYW5zIEV0aGVybmV0LCBub3QgVG9rZW4gUmluZy4KIAkJICovCi0JCVBVU0hfTElOS0hEUihETFRfRU4xME1CLCAwLAotCQkgICAgb2ZmX3BheWxvYWQgKyAyLAkvKiBFdGhlcm5ldCBoZWFkZXIgKi8KKwkJUFVTSF9MSU5LSERSKGNzdGF0ZSwgRExUX0VOMTBNQiwgMCwKKwkJICAgIGNzdGF0ZS0+b2ZmX3BheWxvYWQgKyAyLAkvKiBFdGhlcm5ldCBoZWFkZXIgKi8KIAkJICAgIC0xKTsKLQkJb2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBvZmZfbGlua2hkci5jb25zdGFudF9wYXJ0ICsgMTI7Ci0JCW9mZl9saW5rcGwuY29uc3RhbnRfcGFydCA9IG9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgKyAxNDsJLyogRXRoZXJuZXQgKi8KLQkJb2ZmX25sID0gMDsJCQkvKiBFdGhlcm5ldCBJSSAqLwotCQlvZmZfbmxfbm9zbmFwID0gMzsJCS8qIDgwMi4zKzgwMi4yICovCisJCWNzdGF0ZS0+b2ZmX2xpbmt0eXBlLmNvbnN0YW50X3BhcnQgPSBjc3RhdGUtPm9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgKyAxMjsKKwkJY3N0YXRlLT5vZmZfbGlua3BsLmNvbnN0YW50X3BhcnQgPSBjc3RhdGUtPm9mZl9saW5raGRyLmNvbnN0YW50X3BhcnQgKyAxNDsJLyogRXRoZXJuZXQgKi8KKwkJY3N0YXRlLT5vZmZfbmwgPSAwOwkJCS8qIEV0aGVybmV0IElJICovCisJCWNzdGF0ZS0+b2ZmX25sX25vc25hcCA9IDM7CQkvKiA4MDIuMys4MDIuMiAqLwogCQlicmVhazsKIAogCWNhc2UgQV9MTEM6CiAJCS8qIEdldCBhbGwgTExDLWVuY2Fwc3VsYXRlZCBwYWNrZXRzICovCi0JCWlmICghaXNfYXRtKQotCQkJYnBmX2Vycm9yKCInbGxjJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7Ci0JCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9QUk9UT1RZUEUsIFBUX0xMQywgQlBGX0pFUSwgMCk7Ci0JCWxpbmt0eXBlID0gcHJldmxpbmt0eXBlOworCQlpZiAoIWNzdGF0ZS0+aXNfYXRtKQorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIidsbGMnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfUFJPVE9UWVBFLCBQVF9MTEMsIEJQRl9KRVEsIDApOworCQljc3RhdGUtPmxpbmt0eXBlID0gY3N0YXRlLT5wcmV2bGlua3R5cGU7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTg2MjgsNjUgKzg3MDcsNjQgQEAKICAqIEZvciBNVFAyX0hTTCwgc2VxdWVuY2VzIGFyZSBvbiAyIGJ5dGVzLCBhbmQgbGVuZ3RoIG9uIDkgYml0cwogICovCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX210cDJ0eXBlX2FiYnJldih0eXBlKQotCWludCB0eXBlOworZ2VuX210cDJ0eXBlX2FiYnJldihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCB0eXBlKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMTsKIAogCXN3aXRjaCAodHlwZSkgewogCiAJY2FzZSBNX0ZJU1U6Ci0JCWlmICggKGxpbmt0eXBlICE9IERMVF9NVFAyKSAmJgotCQkgICAgIChsaW5rdHlwZSAhPSBETFRfRVJGKSAmJgotCQkgICAgIChsaW5rdHlwZSAhPSBETFRfTVRQMl9XSVRIX1BIRFIpICkKLQkJCWJwZl9lcnJvcigiJ2Zpc3UnIHN1cHBvcnRlZCBvbmx5IG9uIE1UUDIiKTsKLQkJLyogZ2VuX25jbXAob2ZmcmVsLCBvZmZzZXQsIHNpemUsIG1hc2ssIGp0eXBlLCByZXZlcnNlLCB2YWx1ZSkgKi8KLQkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9saSwgQlBGX0IsIDB4M2YsIEJQRl9KRVEsIDAsIDApOworCQlpZiAoIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9NVFAyKSAmJgorCQkgICAgIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9FUkYpICYmCisJCSAgICAgKGNzdGF0ZS0+bGlua3R5cGUgIT0gRExUX01UUDJfV0lUSF9QSERSKSApCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2Zpc3UnIHN1cHBvcnRlZCBvbmx5IG9uIE1UUDIiKTsKKwkJLyogZ2VuX25jbXAoY3N0YXRlLCBvZmZyZWwsIG9mZnNldCwgc2l6ZSwgbWFzaywganR5cGUsIHJldmVyc2UsIHZhbHVlKSAqLworCQliMCA9IGdlbl9uY21wKGNzdGF0ZSwgT1JfUEFDS0VULCBjc3RhdGUtPm9mZl9saSwgQlBGX0IsIDB4M2YsIEJQRl9KRVEsIDAsIDApOwogCQlicmVhazsKIAogCWNhc2UgTV9MU1NVOgotCQlpZiAoIChsaW5rdHlwZSAhPSBETFRfTVRQMikgJiYKLQkJICAgICAobGlua3R5cGUgIT0gRExUX0VSRikgJiYKLQkJICAgICAobGlua3R5cGUgIT0gRExUX01UUDJfV0lUSF9QSERSKSApCi0JCQlicGZfZXJyb3IoIidsc3N1JyBzdXBwb3J0ZWQgb25seSBvbiBNVFAyIik7Ci0JCWIwID0gZ2VuX25jbXAoT1JfUEFDS0VULCBvZmZfbGksIEJQRl9CLCAweDNmLCBCUEZfSkdULCAxLCAyKTsKLQkJYjEgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9saSwgQlBGX0IsIDB4M2YsIEJQRl9KR1QsIDAsIDApOworCQlpZiAoIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9NVFAyKSAmJgorCQkgICAgIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9FUkYpICYmCisJCSAgICAgKGNzdGF0ZS0+bGlua3R5cGUgIT0gRExUX01UUDJfV0lUSF9QSERSKSApCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2xzc3UnIHN1cHBvcnRlZCBvbmx5IG9uIE1UUDIiKTsKKwkJYjAgPSBnZW5fbmNtcChjc3RhdGUsIE9SX1BBQ0tFVCwgY3N0YXRlLT5vZmZfbGksIEJQRl9CLCAweDNmLCBCUEZfSkdULCAxLCAyKTsKKwkJYjEgPSBnZW5fbmNtcChjc3RhdGUsIE9SX1BBQ0tFVCwgY3N0YXRlLT5vZmZfbGksIEJQRl9CLCAweDNmLCBCUEZfSkdULCAwLCAwKTsKIAkJZ2VuX2FuZChiMSwgYjApOwogCQlicmVhazsKIAogCWNhc2UgTV9NU1U6Ci0JCWlmICggKGxpbmt0eXBlICE9IERMVF9NVFAyKSAmJgotCQkgICAgIChsaW5rdHlwZSAhPSBETFRfRVJGKSAmJgotCQkgICAgIChsaW5rdHlwZSAhPSBETFRfTVRQMl9XSVRIX1BIRFIpICkKLQkJCWJwZl9lcnJvcigiJ21zdScgc3VwcG9ydGVkIG9ubHkgb24gTVRQMiIpOwotCQliMCA9IGdlbl9uY21wKE9SX1BBQ0tFVCwgb2ZmX2xpLCBCUEZfQiwgMHgzZiwgQlBGX0pHVCwgMCwgMik7CisJCWlmICggKGNzdGF0ZS0+bGlua3R5cGUgIT0gRExUX01UUDIpICYmCisJCSAgICAgKGNzdGF0ZS0+bGlua3R5cGUgIT0gRExUX0VSRikgJiYKKwkJICAgICAoY3N0YXRlLT5saW5rdHlwZSAhPSBETFRfTVRQMl9XSVRIX1BIRFIpICkKKwkJCWJwZl9lcnJvcihjc3RhdGUsICInbXN1JyBzdXBwb3J0ZWQgb25seSBvbiBNVFAyIik7CisJCWIwID0gZ2VuX25jbXAoY3N0YXRlLCBPUl9QQUNLRVQsIGNzdGF0ZS0+b2ZmX2xpLCBCUEZfQiwgMHgzZiwgQlBGX0pHVCwgMCwgMik7CiAJCWJyZWFrOwogCiAJY2FzZSBNSF9GSVNVOgotCQlpZiAoIChsaW5rdHlwZSAhPSBETFRfTVRQMikgJiYKLQkJICAgICAobGlua3R5cGUgIT0gRExUX0VSRikgJiYKLQkJICAgICAobGlua3R5cGUgIT0gRExUX01UUDJfV0lUSF9QSERSKSApCi0JCQlicGZfZXJyb3IoIidoZmlzdScgc3VwcG9ydGVkIG9ubHkgb24gTVRQMl9IU0wiKTsKLQkJLyogZ2VuX25jbXAob2ZmcmVsLCBvZmZzZXQsIHNpemUsIG1hc2ssIGp0eXBlLCByZXZlcnNlLCB2YWx1ZSkgKi8KLQkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9saV9oc2wsIEJQRl9ILCAweGZmODAsIEJQRl9KRVEsIDAsIDApOworCQlpZiAoIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9NVFAyKSAmJgorCQkgICAgIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9FUkYpICYmCisJCSAgICAgKGNzdGF0ZS0+bGlua3R5cGUgIT0gRExUX01UUDJfV0lUSF9QSERSKSApCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2hmaXN1JyBzdXBwb3J0ZWQgb25seSBvbiBNVFAyX0hTTCIpOworCQkvKiBnZW5fbmNtcChjc3RhdGUsIG9mZnJlbCwgb2Zmc2V0LCBzaXplLCBtYXNrLCBqdHlwZSwgcmV2ZXJzZSwgdmFsdWUpICovCisJCWIwID0gZ2VuX25jbXAoY3N0YXRlLCBPUl9QQUNLRVQsIGNzdGF0ZS0+b2ZmX2xpX2hzbCwgQlBGX0gsIDB4ZmY4MCwgQlBGX0pFUSwgMCwgMCk7CiAJCWJyZWFrOwogCiAJY2FzZSBNSF9MU1NVOgotCQlpZiAoIChsaW5rdHlwZSAhPSBETFRfTVRQMikgJiYKLQkJICAgICAobGlua3R5cGUgIT0gRExUX0VSRikgJiYKLQkJICAgICAobGlua3R5cGUgIT0gRExUX01UUDJfV0lUSF9QSERSKSApCi0JCQlicGZfZXJyb3IoIidobHNzdScgc3VwcG9ydGVkIG9ubHkgb24gTVRQMl9IU0wiKTsKLQkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9saV9oc2wsIEJQRl9ILCAweGZmODAsIEJQRl9KR1QsIDEsIDB4MDEwMCk7Ci0JCWIxID0gZ2VuX25jbXAoT1JfUEFDS0VULCBvZmZfbGlfaHNsLCBCUEZfSCwgMHhmZjgwLCBCUEZfSkdULCAwLCAwKTsKKwkJaWYgKCAoY3N0YXRlLT5saW5rdHlwZSAhPSBETFRfTVRQMikgJiYKKwkJICAgICAoY3N0YXRlLT5saW5rdHlwZSAhPSBETFRfRVJGKSAmJgorCQkgICAgIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9NVFAyX1dJVEhfUEhEUikgKQorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIidobHNzdScgc3VwcG9ydGVkIG9ubHkgb24gTVRQMl9IU0wiKTsKKwkJYjAgPSBnZW5fbmNtcChjc3RhdGUsIE9SX1BBQ0tFVCwgY3N0YXRlLT5vZmZfbGlfaHNsLCBCUEZfSCwgMHhmZjgwLCBCUEZfSkdULCAxLCAweDAxMDApOworCQliMSA9IGdlbl9uY21wKGNzdGF0ZSwgT1JfUEFDS0VULCBjc3RhdGUtPm9mZl9saV9oc2wsIEJQRl9ILCAweGZmODAsIEJQRl9KR1QsIDAsIDApOwogCQlnZW5fYW5kKGIxLCBiMCk7CiAJCWJyZWFrOwogCiAJY2FzZSBNSF9NU1U6Ci0JCWlmICggKGxpbmt0eXBlICE9IERMVF9NVFAyKSAmJgotCQkgICAgIChsaW5rdHlwZSAhPSBETFRfRVJGKSAmJgotCQkgICAgIChsaW5rdHlwZSAhPSBETFRfTVRQMl9XSVRIX1BIRFIpICkKLQkJCWJwZl9lcnJvcigiJ2htc3UnIHN1cHBvcnRlZCBvbmx5IG9uIE1UUDJfSFNMIik7Ci0JCWIwID0gZ2VuX25jbXAoT1JfUEFDS0VULCBvZmZfbGlfaHNsLCBCUEZfSCwgMHhmZjgwLCBCUEZfSkdULCAwLCAweDAxMDApOworCQlpZiAoIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9NVFAyKSAmJgorCQkgICAgIChjc3RhdGUtPmxpbmt0eXBlICE9IERMVF9FUkYpICYmCisJCSAgICAgKGNzdGF0ZS0+bGlua3R5cGUgIT0gRExUX01UUDJfV0lUSF9QSERSKSApCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2htc3UnIHN1cHBvcnRlZCBvbmx5IG9uIE1UUDJfSFNMIik7CisJCWIwID0gZ2VuX25jbXAoY3N0YXRlLCBPUl9QQUNLRVQsIGNzdGF0ZS0+b2ZmX2xpX2hzbCwgQlBGX0gsIDB4ZmY4MCwgQlBGX0pHVCwgMCwgMHgwMTAwKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtODY5NiwxOCArODc3NCwxNSBAQAogfQogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX210cDNmaWVsZF9jb2RlKG10cDNmaWVsZCwganZhbHVlLCBqdHlwZSwgcmV2ZXJzZSkKLQlpbnQgbXRwM2ZpZWxkOwotCWJwZl91X2ludDMyIGp2YWx1ZTsKLQlicGZfdV9pbnQzMiBqdHlwZTsKLQlpbnQgcmV2ZXJzZTsKK2dlbl9tdHAzZmllbGRfY29kZShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCBtdHAzZmllbGQsIGJwZl91X2ludDMyIGp2YWx1ZSwKKyAgICBicGZfdV9pbnQzMiBqdHlwZSwgaW50IHJldmVyc2UpCiB7CiAJc3RydWN0IGJsb2NrICpiMDsKIAlicGZfdV9pbnQzMiB2YWwxICwgdmFsMiAsIHZhbDM7Ci0JdV9pbnQgbmV3b2ZmX3Npbz1vZmZfc2lvOwotCXVfaW50IG5ld29mZl9vcGM9b2ZmX29wYzsKLQl1X2ludCBuZXdvZmZfZHBjPW9mZl9kcGM7Ci0JdV9pbnQgbmV3b2ZmX3Nscz1vZmZfc2xzOworCXVfaW50IG5ld29mZl9zaW8gPSBjc3RhdGUtPm9mZl9zaW87CisJdV9pbnQgbmV3b2ZmX29wYyA9IGNzdGF0ZS0+b2ZmX29wYzsKKwl1X2ludCBuZXdvZmZfZHBjID0gY3N0YXRlLT5vZmZfZHBjOworCXVfaW50IG5ld29mZl9zbHMgPSBjc3RhdGUtPm9mZl9zbHM7CiAKIAlzd2l0Y2ggKG10cDNmaWVsZCkgewogCkBAIC04NzE2LDI0ICs4NzkxLDI0IEBACiAJCS8qIEZBTExUSFJPVUdIICovCiAKIAljYXNlIE1fU0lPOgotCQlpZiAob2ZmX3NpbyA9PSAodV9pbnQpLTEpCi0JCQlicGZfZXJyb3IoIidzaW8nIHN1cHBvcnRlZCBvbmx5IG9uIFNTNyIpOworCQlpZiAoY3N0YXRlLT5vZmZfc2lvID09ICh1X2ludCktMSkKKwkJCWJwZl9lcnJvcihjc3RhdGUsICInc2lvJyBzdXBwb3J0ZWQgb25seSBvbiBTUzciKTsKIAkJLyogc2lvIGNvZGVkIG9uIDEgYnl0ZSBzbyBtYXggdmFsdWUgMjU1ICovCiAJCWlmKGp2YWx1ZSA+IDI1NSkKLQkJICAgICAgICBicGZfZXJyb3IoInNpbyB2YWx1ZSAldSB0b28gYmlnOyBtYXggdmFsdWUgPSAyNTUiLAorCQkgICAgICAgIGJwZl9lcnJvcihjc3RhdGUsICJzaW8gdmFsdWUgJXUgdG9vIGJpZzsgbWF4IHZhbHVlID0gMjU1IiwKIAkJICAgICAgICAgICAganZhbHVlKTsKLQkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG5ld29mZl9zaW8sIEJQRl9CLCAweGZmZmZmZmZmLAorCQliMCA9IGdlbl9uY21wKGNzdGF0ZSwgT1JfUEFDS0VULCBuZXdvZmZfc2lvLCBCUEZfQiwgMHhmZmZmZmZmZiwKIAkJICAgICh1X2ludClqdHlwZSwgcmV2ZXJzZSwgKHVfaW50KWp2YWx1ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBNSF9PUEM6CiAJCW5ld29mZl9vcGMrPTM7CiAgICAgICAgIGNhc2UgTV9PUEM6Ci0JICAgICAgICBpZiAob2ZmX29wYyA9PSAodV9pbnQpLTEpCi0JCQlicGZfZXJyb3IoIidvcGMnIHN1cHBvcnRlZCBvbmx5IG9uIFNTNyIpOworCSAgICAgICAgaWYgKGNzdGF0ZS0+b2ZmX29wYyA9PSAodV9pbnQpLTEpCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiJ29wYycgc3VwcG9ydGVkIG9ubHkgb24gU1M3Iik7CiAJCS8qIG9wYyBjb2RlZCBvbiAxNCBiaXRzIHNvIG1heCB2YWx1ZSAxNjM4MyAqLwogCQlpZiAoanZhbHVlID4gMTYzODMpCi0JCSAgICAgICAgYnBmX2Vycm9yKCJvcGMgdmFsdWUgJXUgdG9vIGJpZzsgbWF4IHZhbHVlID0gMTYzODMiLAorCQkgICAgICAgIGJwZl9lcnJvcihjc3RhdGUsICJvcGMgdmFsdWUgJXUgdG9vIGJpZzsgbWF4IHZhbHVlID0gMTYzODMiLAogCQkgICAgICAgICAgICBqdmFsdWUpOwogCQkvKiB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyBhcmUgbWFkZSB0byBjb252ZXJ0IGp2YWx1ZQogCQkgKiB0byB0aGUgZm9ybSB1c2VkIHRvIHdyaXRlIG9wYyBpbiBhbiBzczcgbWVzc2FnZSovCkBAIC04NzQ0LDcgKzg4MTksNyBAQAogCQl2YWwzID0ganZhbHVlICYgMHgwMDAwMDAwMzsKIAkJdmFsMyA9IHZhbDMgPDwyMjsKIAkJanZhbHVlID0gdmFsMSArIHZhbDIgKyB2YWwzOwotCQliMCA9IGdlbl9uY21wKE9SX1BBQ0tFVCwgbmV3b2ZmX29wYywgQlBGX1csIDB4MDBjMGZmMGYsCisJCWIwID0gZ2VuX25jbXAoY3N0YXRlLCBPUl9QQUNLRVQsIG5ld29mZl9vcGMsIEJQRl9XLCAweDAwYzBmZjBmLAogCQkgICAgKHVfaW50KWp0eXBlLCByZXZlcnNlLCAodV9pbnQpanZhbHVlKTsKIAkJYnJlYWs7CiAKQEAgLTg3NTMsMTEgKzg4MjgsMTEgQEAKIAkJLyogRkFMTFRIUk9VR0ggKi8KIAogCWNhc2UgTV9EUEM6Ci0JICAgICAgICBpZiAob2ZmX2RwYyA9PSAodV9pbnQpLTEpCi0JCQlicGZfZXJyb3IoIidkcGMnIHN1cHBvcnRlZCBvbmx5IG9uIFNTNyIpOworCSAgICAgICAgaWYgKGNzdGF0ZS0+b2ZmX2RwYyA9PSAodV9pbnQpLTEpCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiJ2RwYycgc3VwcG9ydGVkIG9ubHkgb24gU1M3Iik7CiAJCS8qIGRwYyBjb2RlZCBvbiAxNCBiaXRzIHNvIG1heCB2YWx1ZSAxNjM4MyAqLwogCQlpZiAoanZhbHVlID4gMTYzODMpCi0JCSAgICAgICAgYnBmX2Vycm9yKCJkcGMgdmFsdWUgJXUgdG9vIGJpZzsgbWF4IHZhbHVlID0gMTYzODMiLAorCQkgICAgICAgIGJwZl9lcnJvcihjc3RhdGUsICJkcGMgdmFsdWUgJXUgdG9vIGJpZzsgbWF4IHZhbHVlID0gMTYzODMiLAogCQkgICAgICAgICAgICBqdmFsdWUpOwogCQkvKiB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyBhcmUgbWFkZSB0byBjb252ZXJ0IGp2YWx1ZQogCQkgKiB0byB0aGUgZm9ybWUgdXNlZCB0byB3cml0ZSBkcGMgaW4gYW4gc3M3IG1lc3NhZ2UqLwpAQCAtODc2NiwyMyArODg0MSwyMyBAQAogCQl2YWwyID0ganZhbHVlICYgMHgwMDAwM2YwMDsKIAkJdmFsMiA9IHZhbDIgPDwgODsKIAkJanZhbHVlID0gdmFsMSArIHZhbDI7Ci0JCWIwID0gZ2VuX25jbXAoT1JfUEFDS0VULCBuZXdvZmZfZHBjLCBCUEZfVywgMHhmZjNmMDAwMCwKKwkJYjAgPSBnZW5fbmNtcChjc3RhdGUsIE9SX1BBQ0tFVCwgbmV3b2ZmX2RwYywgQlBGX1csIDB4ZmYzZjAwMDAsCiAJCSAgICAodV9pbnQpanR5cGUsIHJldmVyc2UsICh1X2ludClqdmFsdWUpOwogCQlicmVhazsKIAogCWNhc2UgTUhfU0xTOgogCSAgbmV3b2ZmX3Nscys9MzsKIAljYXNlIE1fU0xTOgotCSAgICAgICAgaWYgKG9mZl9zbHMgPT0gKHVfaW50KS0xKQotCQkJYnBmX2Vycm9yKCInc2xzJyBzdXBwb3J0ZWQgb25seSBvbiBTUzciKTsKKwkgICAgICAgIGlmIChjc3RhdGUtPm9mZl9zbHMgPT0gKHVfaW50KS0xKQorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIidzbHMnIHN1cHBvcnRlZCBvbmx5IG9uIFNTNyIpOwogCQkvKiBzbHMgY29kZWQgb24gNCBiaXRzIHNvIG1heCB2YWx1ZSAxNSAqLwogCQlpZiAoanZhbHVlID4gMTUpCi0JCSAgICAgICAgIGJwZl9lcnJvcigic2xzIHZhbHVlICV1IHRvbyBiaWc7IG1heCB2YWx1ZSA9IDE1IiwKKwkJICAgICAgICAgYnBmX2Vycm9yKGNzdGF0ZSwgInNscyB2YWx1ZSAldSB0b28gYmlnOyBtYXggdmFsdWUgPSAxNSIsCiAJCSAgICAgICAgICAgICBqdmFsdWUpOwogCQkvKiB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uIGlzIG1hZGUgdG8gY29udmVydCBqdmFsdWUKIAkJICogdG8gdGhlIGZvcm1lIHVzZWQgdG8gd3JpdGUgc2xzIGluIGFuIHNzNyBtZXNzYWdlKi8KIAkJanZhbHVlID0ganZhbHVlIDw8IDQ7Ci0JCWIwID0gZ2VuX25jbXAoT1JfUEFDS0VULCBuZXdvZmZfc2xzLCBCUEZfQiwgMHhmMCwKKwkJYjAgPSBnZW5fbmNtcChjc3RhdGUsIE9SX1BBQ0tFVCwgbmV3b2ZmX3NscywgQlBGX0IsIDB4ZjAsCiAJCSAgICAodV9pbnQpanR5cGUscmV2ZXJzZSwgKHVfaW50KWp2YWx1ZSk7CiAJCWJyZWFrOwogCkBAIC04NzkzLDggKzg4NjgsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGJsb2NrICoKLWdlbl9tc2dfYWJicmV2KHR5cGUpCi0JaW50IHR5cGU7CitnZW5fbXNnX2FiYnJldihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCB0eXBlKQogewogCXN0cnVjdCBibG9jayAqYjE7CiAKQEAgLTg4MDUsMjcgKzg4NzksMjcgQEAKIAlzd2l0Y2ggKHR5cGUpIHsKIAogCWNhc2UgQV9TRVRVUDoKLQkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShBX01TR1RZUEUsIFNFVFVQLCBCUEZfSkVRLCAwKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfTVNHVFlQRSwgU0VUVVAsIEJQRl9KRVEsIDApOwogCQlicmVhazsKIAogCWNhc2UgQV9DQUxMUFJPQ0VFRDoKLQkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShBX01TR1RZUEUsIENBTExfUFJPQ0VFRCwgQlBGX0pFUSwgMCk7CisJCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoY3N0YXRlLCBBX01TR1RZUEUsIENBTExfUFJPQ0VFRCwgQlBGX0pFUSwgMCk7CiAJCWJyZWFrOwogCiAJY2FzZSBBX0NPTk5FQ1Q6Ci0JCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9NU0dUWVBFLCBDT05ORUNULCBCUEZfSkVRLCAwKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfTVNHVFlQRSwgQ09OTkVDVCwgQlBGX0pFUSwgMCk7CiAJCWJyZWFrOwogCiAJY2FzZSBBX0NPTk5FQ1RBQ0s6Ci0JCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9NU0dUWVBFLCBDT05ORUNUX0FDSywgQlBGX0pFUSwgMCk7CisJCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoY3N0YXRlLCBBX01TR1RZUEUsIENPTk5FQ1RfQUNLLCBCUEZfSkVRLCAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFfUkVMRUFTRToKLQkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShBX01TR1RZUEUsIFJFTEVBU0UsIEJQRl9KRVEsIDApOworCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKGNzdGF0ZSwgQV9NU0dUWVBFLCBSRUxFQVNFLCBCUEZfSkVRLCAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFfUkVMRUFTRV9ET05FOgotCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfTVNHVFlQRSwgUkVMRUFTRV9ET05FLCBCUEZfSkVRLCAwKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfTVNHVFlQRSwgUkVMRUFTRV9ET05FLCBCUEZfSkVRLCAwKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtODgzNSwyNyArODkwOSwyNiBAQAogfQogCiBzdHJ1Y3QgYmxvY2sgKgotZ2VuX2F0bW11bHRpX2FiYnJldih0eXBlKQotCWludCB0eXBlOworZ2VuX2F0bW11bHRpX2FiYnJldihjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGludCB0eXBlKQogewogCXN0cnVjdCBibG9jayAqYjAsICpiMTsKIAogCXN3aXRjaCAodHlwZSkgewogCiAJY2FzZSBBX09BTToKLQkJaWYgKCFpc19hdG0pCi0JCQlicGZfZXJyb3IoIidvYW0nIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKLQkJYjEgPSBnZW5fYXRtbXVsdGlfYWJicmV2KEFfT0FNRjQpOworCQlpZiAoIWNzdGF0ZS0+aXNfYXRtKQorCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIidvYW0nIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKKwkJYjEgPSBnZW5fYXRtbXVsdGlfYWJicmV2KGNzdGF0ZSwgQV9PQU1GNCk7CiAJCWJyZWFrOwogCiAJY2FzZSBBX09BTUY0OgotCQlpZiAoIWlzX2F0bSkKLQkJCWJwZl9lcnJvcigiJ29hbWY0JyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CisJCWlmICghY3N0YXRlLT5pc19hdG0pCisJCQlicGZfZXJyb3IoY3N0YXRlLCAiJ29hbWY0JyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CiAJCS8qIE9BTSBGNCB0eXBlICovCi0JCWIwID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WQ0ksIDMsIEJQRl9KRVEsIDApOwotCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVkNJLCA0LCBCUEZfSkVRLCAwKTsKKwkJYjAgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfVkNJLCAzLCBCUEZfSkVRLCAwKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsIEFfVkNJLCA0LCBCUEZfSkVRLCAwKTsKIAkJZ2VuX29yKGIwLCBiMSk7Ci0JCWIwID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WUEksIDAsIEJQRl9KRVEsIDApOworCQliMCA9IGdlbl9hdG1maWVsZF9jb2RlKGNzdGF0ZSwgQV9WUEksIDAsIEJQRl9KRVEsIDApOwogCQlnZW5fYW5kKGIwLCBiMSk7CiAJCWJyZWFrOwogCkBAIC04ODY0LDM2ICs4OTM3LDM2IEBACiAJCSAqIEdldCBRLjI5MzEgc2lnbmFsbGluZyBtZXNzYWdlcyBmb3Igc3dpdGNoZWQKIAkJICogdmlydHVhbCBjb25uZWN0aW9uCiAJCSAqLwotCQlpZiAoIWlzX2F0bSkKLQkJCWJwZl9lcnJvcigiJ2Nvbm5lY3Rtc2cnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKLQkJYjAgPSBnZW5fbXNnX2FiYnJldihBX1NFVFVQKTsKLQkJYjEgPSBnZW5fbXNnX2FiYnJldihBX0NBTExQUk9DRUVEKTsKKwkJaWYgKCFjc3RhdGUtPmlzX2F0bSkKKwkJCWJwZl9lcnJvcihjc3RhdGUsICInY29ubmVjdG1zZycgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KGNzdGF0ZSwgQV9TRVRVUCk7CisJCWIxID0gZ2VuX21zZ19hYmJyZXYoY3N0YXRlLCBBX0NBTExQUk9DRUVEKTsKIAkJZ2VuX29yKGIwLCBiMSk7Ci0JCWIwID0gZ2VuX21zZ19hYmJyZXYoQV9DT05ORUNUKTsKKwkJYjAgPSBnZW5fbXNnX2FiYnJldihjc3RhdGUsIEFfQ09OTkVDVCk7CiAJCWdlbl9vcihiMCwgYjEpOwotCQliMCA9IGdlbl9tc2dfYWJicmV2KEFfQ09OTkVDVEFDSyk7CisJCWIwID0gZ2VuX21zZ19hYmJyZXYoY3N0YXRlLCBBX0NPTk5FQ1RBQ0spOwogCQlnZW5fb3IoYjAsIGIxKTsKLQkJYjAgPSBnZW5fbXNnX2FiYnJldihBX1JFTEVBU0UpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KGNzdGF0ZSwgQV9SRUxFQVNFKTsKIAkJZ2VuX29yKGIwLCBiMSk7Ci0JCWIwID0gZ2VuX21zZ19hYmJyZXYoQV9SRUxFQVNFX0RPTkUpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KGNzdGF0ZSwgQV9SRUxFQVNFX0RPTkUpOwogCQlnZW5fb3IoYjAsIGIxKTsKLQkJYjAgPSBnZW5fYXRtdHlwZV9hYmJyZXYoQV9TQyk7CisJCWIwID0gZ2VuX2F0bXR5cGVfYWJicmV2KGNzdGF0ZSwgQV9TQyk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFfTUVUQUNPTk5FQ1Q6Ci0JCWlmICghaXNfYXRtKQotCQkJYnBmX2Vycm9yKCInbWV0YWNvbm5lY3QnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKLQkJYjAgPSBnZW5fbXNnX2FiYnJldihBX1NFVFVQKTsKLQkJYjEgPSBnZW5fbXNnX2FiYnJldihBX0NBTExQUk9DRUVEKTsKKwkJaWYgKCFjc3RhdGUtPmlzX2F0bSkKKwkJCWJwZl9lcnJvcihjc3RhdGUsICInbWV0YWNvbm5lY3QnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKKwkJYjAgPSBnZW5fbXNnX2FiYnJldihjc3RhdGUsIEFfU0VUVVApOworCQliMSA9IGdlbl9tc2dfYWJicmV2KGNzdGF0ZSwgQV9DQUxMUFJPQ0VFRCk7CiAJCWdlbl9vcihiMCwgYjEpOwotCQliMCA9IGdlbl9tc2dfYWJicmV2KEFfQ09OTkVDVCk7CisJCWIwID0gZ2VuX21zZ19hYmJyZXYoY3N0YXRlLCBBX0NPTk5FQ1QpOwogCQlnZW5fb3IoYjAsIGIxKTsKLQkJYjAgPSBnZW5fbXNnX2FiYnJldihBX1JFTEVBU0UpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KGNzdGF0ZSwgQV9SRUxFQVNFKTsKIAkJZ2VuX29yKGIwLCBiMSk7Ci0JCWIwID0gZ2VuX21zZ19hYmJyZXYoQV9SRUxFQVNFX0RPTkUpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KGNzdGF0ZSwgQV9SRUxFQVNFX0RPTkUpOwogCQlnZW5fb3IoYjAsIGIxKTsKLQkJYjAgPSBnZW5fYXRtdHlwZV9hYmJyZXYoQV9NRVRBQyk7CisJCWIwID0gZ2VuX2F0bXR5cGVfYWJicmV2KGNzdGF0ZSwgQV9NRVRBQyk7CiAJCWdlbl9hbmQoYjAsIGIxKTsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2dlbmNvZGUuaCBiL2dlbmNvZGUuaAppbmRleCA2N2VkMGRjLi4yYjA4OWQyIDEwMDY0NAotLS0gYS9nZW5jb2RlLmgKKysrIGIvZ2VuY29kZS5oCkBAIC0yODEsODUgKzI4MSwxMTUgQEAKIAl1bnNpZ25lZCBjaGFyIHBhZDsKIH07CiAKLXN0cnVjdCBhcnRoICpnZW5fbG9hZGkoaW50KTsKLXN0cnVjdCBhcnRoICpnZW5fbG9hZChpbnQsIHN0cnVjdCBhcnRoICosIGludCk7Ci1zdHJ1Y3QgYXJ0aCAqZ2VuX2xvYWRsZW4odm9pZCk7Ci1zdHJ1Y3QgYXJ0aCAqZ2VuX25lZyhzdHJ1Y3QgYXJ0aCAqKTsKLXN0cnVjdCBhcnRoICpnZW5fYXJ0aChpbnQsIHN0cnVjdCBhcnRoICosIHN0cnVjdCBhcnRoICopOworc3RydWN0IF9jb21waWxlcl9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2NvbXBpbGVyX3N0YXRlIGNvbXBpbGVyX3N0YXRlX3Q7CisKK3N0cnVjdCBhcnRoICpnZW5fbG9hZGkoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOworc3RydWN0IGFydGggKmdlbl9sb2FkKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50LCBzdHJ1Y3QgYXJ0aCAqLCBpbnQpOworc3RydWN0IGFydGggKmdlbl9sb2FkbGVuKGNvbXBpbGVyX3N0YXRlX3QgKik7CitzdHJ1Y3QgYXJ0aCAqZ2VuX25lZyhjb21waWxlcl9zdGF0ZV90ICosIHN0cnVjdCBhcnRoICopOworc3RydWN0IGFydGggKmdlbl9hcnRoKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50LCBzdHJ1Y3QgYXJ0aCAqLCBzdHJ1Y3QgYXJ0aCAqKTsKIAogdm9pZCBnZW5fYW5kKHN0cnVjdCBibG9jayAqLCBzdHJ1Y3QgYmxvY2sgKik7CiB2b2lkIGdlbl9vcihzdHJ1Y3QgYmxvY2sgKiwgc3RydWN0IGJsb2NrICopOwogdm9pZCBnZW5fbm90KHN0cnVjdCBibG9jayAqKTsKIAotc3RydWN0IGJsb2NrICpnZW5fc2NvZGUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcXVhbCk7Ci1zdHJ1Y3QgYmxvY2sgKmdlbl9lY29kZShjb25zdCB1X2NoYXIgKiwgc3RydWN0IHF1YWwpOwotc3RydWN0IGJsb2NrICpnZW5fYWNvZGUoY29uc3QgdV9jaGFyICosIHN0cnVjdCBxdWFsKTsKLXN0cnVjdCBibG9jayAqZ2VuX21jb2RlKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBxdWFsKTsKK3N0cnVjdCBibG9jayAqZ2VuX3Njb2RlKGNvbXBpbGVyX3N0YXRlX3QgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgcXVhbCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9lY29kZShjb21waWxlcl9zdGF0ZV90ICosIGNvbnN0IHVfY2hhciAqLCBzdHJ1Y3QgcXVhbCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9hY29kZShjb21waWxlcl9zdGF0ZV90ICosIGNvbnN0IHVfY2hhciAqLCBzdHJ1Y3QgcXVhbCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9tY29kZShjb21waWxlcl9zdGF0ZV90ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorICAgIHVuc2lnbmVkIGludCwgc3RydWN0IHF1YWwpOwogI2lmZGVmIElORVQ2Ci1zdHJ1Y3QgYmxvY2sgKmdlbl9tY29kZTYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgc3RydWN0IHF1YWwpOworc3RydWN0IGJsb2NrICpnZW5fbWNvZGU2KGNvbXBpbGVyX3N0YXRlX3QgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisgICAgdW5zaWduZWQgaW50LCBzdHJ1Y3QgcXVhbCk7CiAjZW5kaWYKLXN0cnVjdCBibG9jayAqZ2VuX25jb2RlKGNvbnN0IGNoYXIgKiwgYnBmX3VfaW50MzIsIHN0cnVjdCBxdWFsKTsKLXN0cnVjdCBibG9jayAqZ2VuX3Byb3RvX2FiYnJldihpbnQpOwotc3RydWN0IGJsb2NrICpnZW5fcmVsYXRpb24oaW50LCBzdHJ1Y3QgYXJ0aCAqLCBzdHJ1Y3QgYXJ0aCAqLCBpbnQpOwotc3RydWN0IGJsb2NrICpnZW5fbGVzcyhpbnQpOwotc3RydWN0IGJsb2NrICpnZW5fZ3JlYXRlcihpbnQpOwotc3RydWN0IGJsb2NrICpnZW5fYnl0ZW9wKGludCwgaW50LCBpbnQpOwotc3RydWN0IGJsb2NrICpnZW5fYnJvYWRjYXN0KGludCk7Ci1zdHJ1Y3QgYmxvY2sgKmdlbl9tdWx0aWNhc3QoaW50KTsKLXN0cnVjdCBibG9jayAqZ2VuX2luYm91bmQoaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX25jb2RlKGNvbXBpbGVyX3N0YXRlX3QgKiwgY29uc3QgY2hhciAqLCBicGZfdV9pbnQzMiwKKyAgICBzdHJ1Y3QgcXVhbCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9wcm90b19hYmJyZXYoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOworc3RydWN0IGJsb2NrICpnZW5fcmVsYXRpb24oY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQsIHN0cnVjdCBhcnRoICosCisgICAgc3RydWN0IGFydGggKiwgaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX2xlc3MoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOworc3RydWN0IGJsb2NrICpnZW5fZ3JlYXRlcihjb21waWxlcl9zdGF0ZV90ICosIGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9ieXRlb3AoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQsIGludCwgaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX2Jyb2FkY2FzdChjb21waWxlcl9zdGF0ZV90ICosIGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9tdWx0aWNhc3QoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOworc3RydWN0IGJsb2NrICpnZW5faW5ib3VuZChjb21waWxlcl9zdGF0ZV90ICosIGludCk7CiAKLXN0cnVjdCBibG9jayAqZ2VuX2xsYyh2b2lkKTsKLXN0cnVjdCBibG9jayAqZ2VuX2xsY19pKHZvaWQpOwotc3RydWN0IGJsb2NrICpnZW5fbGxjX3Modm9pZCk7Ci1zdHJ1Y3QgYmxvY2sgKmdlbl9sbGNfdSh2b2lkKTsKLXN0cnVjdCBibG9jayAqZ2VuX2xsY19zX3N1YnR5cGUoYnBmX3VfaW50MzIpOwotc3RydWN0IGJsb2NrICpnZW5fbGxjX3Vfc3VidHlwZShicGZfdV9pbnQzMik7CitzdHJ1Y3QgYmxvY2sgKmdlbl9sbGMoY29tcGlsZXJfc3RhdGVfdCAqKTsKK3N0cnVjdCBibG9jayAqZ2VuX2xsY19pKGNvbXBpbGVyX3N0YXRlX3QgKik7CitzdHJ1Y3QgYmxvY2sgKmdlbl9sbGNfcyhjb21waWxlcl9zdGF0ZV90ICopOworc3RydWN0IGJsb2NrICpnZW5fbGxjX3UoY29tcGlsZXJfc3RhdGVfdCAqKTsKK3N0cnVjdCBibG9jayAqZ2VuX2xsY19zX3N1YnR5cGUoY29tcGlsZXJfc3RhdGVfdCAqLCBicGZfdV9pbnQzMik7CitzdHJ1Y3QgYmxvY2sgKmdlbl9sbGNfdV9zdWJ0eXBlKGNvbXBpbGVyX3N0YXRlX3QgKiwgYnBmX3VfaW50MzIpOwogCi1zdHJ1Y3QgYmxvY2sgKmdlbl92bGFuKGludCk7Ci1zdHJ1Y3QgYmxvY2sgKmdlbl9tcGxzKGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl92bGFuKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX21wbHMoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOwogCi1zdHJ1Y3QgYmxvY2sgKmdlbl9wcHBvZWQodm9pZCk7Ci1zdHJ1Y3QgYmxvY2sgKmdlbl9wcHBvZXMoaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX3BwcG9lZChjb21waWxlcl9zdGF0ZV90ICopOworc3RydWN0IGJsb2NrICpnZW5fcHBwb2VzKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50KTsKIAotc3RydWN0IGJsb2NrICpnZW5fZ2VuZXZlKGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9nZW5ldmUoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOwogCi1zdHJ1Y3QgYmxvY2sgKmdlbl9hdG1maWVsZF9jb2RlKGludCBhdG1maWVsZCwgYnBmX2ludDMyIGp2YWx1ZSwgYnBmX3VfaW50MzIganR5cGUsIGludCByZXZlcnNlKTsKLXN0cnVjdCBibG9jayAqZ2VuX2F0bXR5cGVfYWJicmV2KGludCB0eXBlKTsKLXN0cnVjdCBibG9jayAqZ2VuX2F0bW11bHRpX2FiYnJldihpbnQgdHlwZSk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9hdG1maWVsZF9jb2RlKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50LCBicGZfaW50MzIsCisgICAgYnBmX3VfaW50MzIsIGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9hdG10eXBlX2FiYnJldihjb21waWxlcl9zdGF0ZV90ICosIGludCB0eXBlKTsKK3N0cnVjdCBibG9jayAqZ2VuX2F0bW11bHRpX2FiYnJldihjb21waWxlcl9zdGF0ZV90ICosIGludCB0eXBlKTsKIAotc3RydWN0IGJsb2NrICpnZW5fbXRwMnR5cGVfYWJicmV2KGludCB0eXBlKTsKLXN0cnVjdCBibG9jayAqZ2VuX210cDNmaWVsZF9jb2RlKGludCBtdHAzZmllbGQsIGJwZl91X2ludDMyIGp2YWx1ZSwgYnBmX3VfaW50MzIganR5cGUsIGludCByZXZlcnNlKTsKK3N0cnVjdCBibG9jayAqZ2VuX210cDJ0eXBlX2FiYnJldihjb21waWxlcl9zdGF0ZV90ICosIGludCB0eXBlKTsKK3N0cnVjdCBibG9jayAqZ2VuX210cDNmaWVsZF9jb2RlKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50LCBicGZfdV9pbnQzMiwKKyAgICBicGZfdV9pbnQzMiwgaW50KTsKIAotc3RydWN0IGJsb2NrICpnZW5fcGZfaWZuYW1lKGNvbnN0IGNoYXIgKik7Ci1zdHJ1Y3QgYmxvY2sgKmdlbl9wZl9ybnIoaW50KTsKLXN0cnVjdCBibG9jayAqZ2VuX3BmX3NybnIoaW50KTsKLXN0cnVjdCBibG9jayAqZ2VuX3BmX3J1bGVzZXQoY2hhciAqKTsKLXN0cnVjdCBibG9jayAqZ2VuX3BmX3JlYXNvbihpbnQpOwotc3RydWN0IGJsb2NrICpnZW5fcGZfYWN0aW9uKGludCk7Ci1zdHJ1Y3QgYmxvY2sgKmdlbl9wZl9kaXIoaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX3BmX2lmbmFtZShjb21waWxlcl9zdGF0ZV90ICosIGNvbnN0IGNoYXIgKik7CitzdHJ1Y3QgYmxvY2sgKmdlbl9wZl9ybnIoY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOworc3RydWN0IGJsb2NrICpnZW5fcGZfc3Jucihjb21waWxlcl9zdGF0ZV90ICosIGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9wZl9ydWxlc2V0KGNvbXBpbGVyX3N0YXRlX3QgKiwgY2hhciAqKTsKK3N0cnVjdCBibG9jayAqZ2VuX3BmX3JlYXNvbihjb21waWxlcl9zdGF0ZV90ICosIGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9wZl9hY3Rpb24oY29tcGlsZXJfc3RhdGVfdCAqLCBpbnQpOwogCi1zdHJ1Y3QgYmxvY2sgKmdlbl9wODAyMTFfdHlwZShpbnQsIGludCk7Ci1zdHJ1Y3QgYmxvY2sgKmdlbl9wODAyMTFfZmNkaXIoaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX3A4MDIxMV90eXBlKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50LCBpbnQpOworc3RydWN0IGJsb2NrICpnZW5fcDgwMjExX2ZjZGlyKGNvbXBpbGVyX3N0YXRlX3QgKiwgaW50KTsKIAotdm9pZCBicGZfb3B0aW1pemUoc3RydWN0IGJsb2NrICoqKTsKLXZvaWQgYnBmX2Vycm9yKGNvbnN0IGNoYXIgKiwgLi4uKQorLyoKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgcHJvZ3JhbSBhcyBhIHRyZWUgb2YgYmxvY2tzLCBwbHVzIGN1cnJlbnQgbWFyay4KKyAqIEEgYmxvY2sgaXMgbWFya2VkIGlmIG9ubHkgaWYgaXRzIG1hcmsgZXF1YWxzIHRoZSBjdXJyZW50IG1hcmsuCisgKiBSYXRoZXIgdGhhbiB0cmF2ZXJzZSB0aGUgY29kZSBhcnJheSwgbWFya2luZyBlYWNoIGl0ZW0sICdjdXJfbWFyaycKKyAqIGlzIGluY3JlbWVudGVkLiAgVGhpcyBhdXRvbWF0aWNhbGx5IG1ha2VzIGVhY2ggZWxlbWVudCB1bm1hcmtlZC4KKyAqLworI2RlZmluZSBpc01hcmtlZChpY3AsIHApICgocCktPm1hcmsgPT0gKGljcCktPmN1cl9tYXJrKQorI2RlZmluZSB1bk1hcmtBbGwoaWNwKSAoaWNwKS0+Y3VyX21hcmsgKz0gMQorI2RlZmluZSBNYXJrKGljcCwgcCkgKChwKS0+bWFyayA9IChpY3ApLT5jdXJfbWFyaykKKworc3RydWN0IGljb2RlIHsKKwlzdHJ1Y3QgYmxvY2sgKnJvb3Q7CisJaW50IGN1cl9tYXJrOworfTsKKwordm9pZCBicGZfb3B0aW1pemUoY29tcGlsZXJfc3RhdGVfdCAqLCBzdHJ1Y3QgaWNvZGUgKmljKTsKK3ZvaWQgYnBmX3N5bnRheF9lcnJvcihjb21waWxlcl9zdGF0ZV90ICosIGNvbnN0IGNoYXIgKik7Cit2b2lkIGJwZl9lcnJvcihjb21waWxlcl9zdGF0ZV90ICosIGNvbnN0IGNoYXIgKiwgLi4uKQogICAgIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKICNpZmRlZiBfX0FUVFJJQlVURV9fX0ZPUk1BVF9PSwotICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpCisgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKICNlbmRpZiAvKiBfX0FUVFJJQlVURV9fX0ZPUk1BVF9PSyAqLwogICAgIDsKIAotdm9pZCBmaW5pc2hfcGFyc2Uoc3RydWN0IGJsb2NrICopOwotY2hhciAqc2R1cChjb25zdCBjaGFyICopOwordm9pZCBmaW5pc2hfcGFyc2UoY29tcGlsZXJfc3RhdGVfdCAqLCBzdHJ1Y3QgYmxvY2sgKik7CitjaGFyICpzZHVwKGNvbXBpbGVyX3N0YXRlX3QgKiwgY29uc3QgY2hhciAqKTsKIAotc3RydWN0IGJwZl9pbnNuICppY29kZV90b19mY29kZShzdHJ1Y3QgYmxvY2sgKiwgdV9pbnQgKik7Ci1pbnQgcGNhcF9wYXJzZSh2b2lkKTsKLXZvaWQgbGV4X2luaXQoY29uc3QgY2hhciAqKTsKLXZvaWQgbGV4X2NsZWFudXAodm9pZCk7CitzdHJ1Y3QgX29wdF9zdGF0ZTsKK3R5cGVkZWYgc3RydWN0IF9vcHRfc3RhdGUgb3B0X3N0YXRlX3Q7CisKK3N0cnVjdCBicGZfaW5zbiAqaWNvZGVfdG9fZmNvZGUoY29tcGlsZXJfc3RhdGVfdCAqLCBzdHJ1Y3QgaWNvZGUgKiwKKyAgICBzdHJ1Y3QgYmxvY2sgKiwgdV9pbnQgKik7CiB2b2lkIHNhcHBlbmQoc3RydWN0IHNsaXN0ICosIHN0cnVjdCBzbGlzdCAqKTsKIAorLyoKKyAqIE9sZGVyIHZlcnNpb25zIG9mIEJpc29uIGRvbid0IHB1dCB0aGlzIGRlY2xhcmF0aW9uIGluCisgKiBncmFtbWFyLmguCisgKi8KK2ludCBwY2FwX3BhcnNlKHZvaWQgKiwgY29tcGlsZXJfc3RhdGVfdCAqKTsKKwogLyogWFhYICovCiAjZGVmaW5lIEpUKGIpICAoKGIpLT5ldC5zdWNjKQogI2RlZmluZSBKRihiKSAgKChiKS0+ZWYuc3VjYykKLQotZXh0ZXJuIGludCBub19vcHRpbWl6ZTsKZGlmZiAtLWdpdCBhL2dyYW1tYXIuYyBiL2dyYW1tYXIuYwppbmRleCBmNWFhNzkxLi42NzM0NDliIDEwMDY0NAotLS0gYS9ncmFtbWFyLmMKKysrIGIvZ3JhbW1hci5jCkBAIC01MCw3ICs1MCw3IEBACiAjZGVmaW5lIFlZU0tFTEVUT05fTkFNRSAieWFjYy5jIgogCiAvKiBQdXJlIHBhcnNlcnMuICAqLwotI2RlZmluZSBZWVBVUkUgMAorI2RlZmluZSBZWVBVUkUgMQogCiAvKiBQdXNoIHBhcnNlcnMuICAqLwogI2RlZmluZSBZWVBVU0ggMApAQCAtNjYsMTEgKzY2LDkgQEAKICNkZWZpbmUgeXlkZWJ1ZyAgICAgICAgIHBjYXBfZGVidWcKICNkZWZpbmUgeXluZXJycyAgICAgICAgIHBjYXBfbmVycnMKIAotI2RlZmluZSB5eWx2YWwgICAgICAgICAgcGNhcF9sdmFsCi0jZGVmaW5lIHl5Y2hhciAgICAgICAgICBwY2FwX2NoYXIKIAogLyogQ29weSB0aGUgZmlyc3QgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCi0jbGluZSAxICJncmFtbWFyLnkiIC8qIHlhY2MuYzozMzkgICovCisjbGluZSAyNiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MzM5ICAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CkBAIC05OCwxNiArOTYsMTYgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCi0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgotI2Vsc2UgLyogV0lOMzIgKi8KKyNlbHNlIC8qIF9XSU4zMiAqLwogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIF9XSU4zMiAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKLSNpZm5kZWYgV0lOMzIKKyNpZm5kZWYgX1dJTjMyCiAjaWYgX19TVERDX18KIHN0cnVjdCBtYnVmOwogc3RydWN0IHJ0ZW50cnk7CkBAIC0xMTUsMTMgKzExMywxNiBAQAogCiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2VuZGlmIC8qIFdJTjMyICovCisjZW5kaWYgLyogX1dJTjMyICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogCiAjaW5jbHVkZSAicGNhcC1pbnQuaCIKIAogI2luY2x1ZGUgImdlbmNvZGUuaCIKKyNpbmNsdWRlICJncmFtbWFyLmgiCisjaW5jbHVkZSAic2Nhbm5lci5oIgorCiAjaWZkZWYgSEFWRV9ORVRfUEZWQVJfSAogI2luY2x1ZGUgPG5ldC9pZi5oPgogI2luY2x1ZGUgPG5ldC9wZnZhci5oPgpAQCAtMjQyLDMxICsyNDMsMTggQEAKIAlyZXR1cm4gKC0xKTsKIH0KIAotaW50IG5fZXJyb3JzID0gMDsKLQogc3RhdGljIHN0cnVjdCBxdWFsIHFlcnIgPSB7IFFfVU5ERUYsIFFfVU5ERUYsIFFfVU5ERUYsIFFfVU5ERUYgfTsKIAogc3RhdGljIHZvaWQKLXl5ZXJyb3IoY29uc3QgY2hhciAqbXNnKQoreXllcnJvcih2b2lkICp5eXNjYW5uZXIsIGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgY2hhciAqbXNnKQogewotCSsrbl9lcnJvcnM7Ci0JYnBmX2Vycm9yKCIlcyIsIG1zZyk7CisJYnBmX3N5bnRheF9lcnJvcihjc3RhdGUsIG1zZyk7CiAJLyogTk9UUkVBQ0hFRCAqLwogfQogCi0jaWZkZWYgTkVFRF9ZWVBBUlNFX1dSQVBQRVIKLWludCB5eXBhcnNlKHZvaWQpOwotCi1pbnQKLXBjYXBfcGFyc2UoKQotewotCXJldHVybiAoeXlwYXJzZSgpKTsKLX0KLSNlbmRpZgotCiAjaWZkZWYgSEFWRV9ORVRfUEZWQVJfSAogc3RhdGljIGludAotcGZyZWFzb25fdG9fbnVtKGNvbnN0IGNoYXIgKnJlYXNvbikKK3BmcmVhc29uX3RvX251bShjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGNvbnN0IGNoYXIgKnJlYXNvbikKIHsKIAljb25zdCBjaGFyICpyZWFzb25zW10gPSBQRlJFU19OQU1FUzsKIAlpbnQgaTsKQEAgLTI3NSwxMiArMjYzLDEyIEBACiAJCWlmIChwY2FwX3N0cmNhc2VjbXAocmVhc29uLCByZWFzb25zW2ldKSA9PSAwKQogCQkJcmV0dXJuIChpKTsKIAl9Ci0JYnBmX2Vycm9yKCJ1bmtub3duIFBGIHJlYXNvbiIpOworCWJwZl9lcnJvcihjc3RhdGUsICJ1bmtub3duIFBGIHJlYXNvbiIpOwogCS8qTk9UUkVBQ0hFRCovCiB9CiAKIHN0YXRpYyBpbnQKLXBmYWN0aW9uX3RvX251bShjb25zdCBjaGFyICphY3Rpb24pCitwZmFjdGlvbl90b19udW0oY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBjb25zdCBjaGFyICphY3Rpb24pCiB7CiAJaWYgKHBjYXBfc3RyY2FzZWNtcChhY3Rpb24sICJwYXNzIikgPT0gMCB8fAogCSAgICBwY2FwX3N0cmNhc2VjbXAoYWN0aW9uLCAiYWNjZXB0IikgPT0gMCkKQEAgLTI5OSwxNSArMjg3LDE1IEBACiAJCXJldHVybiAoUEZfTk9SRFIpOwogI2VuZGlmCiAJZWxzZSB7Ci0JCWJwZl9lcnJvcigidW5rbm93biBQRiBhY3Rpb24iKTsKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gUEYgYWN0aW9uIik7CiAJCS8qTk9UUkVBQ0hFRCovCiAJfQogfQogI2Vsc2UgLyogIUhBVkVfTkVUX1BGVkFSX0ggKi8KIHN0YXRpYyBpbnQKLXBmcmVhc29uX3RvX251bShjb25zdCBjaGFyICpyZWFzb24pCitwZnJlYXNvbl90b19udW0oY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBjb25zdCBjaGFyICpyZWFzb24pCiB7Ci0JYnBmX2Vycm9yKCJsaWJwY2FwIHdhcyBjb21waWxlZCBvbiBhIG1hY2hpbmUgd2l0aG91dCBwZiBzdXBwb3J0Iik7CisJYnBmX2Vycm9yKGNzdGF0ZSwgImxpYnBjYXAgd2FzIGNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRob3V0IHBmIHN1cHBvcnQiKTsKIAkvKk5PVFJFQUNIRUQqLwogCiAJLyogdGhpcyBpcyB0byBtYWtlIHRoZSBWQyBjb21waWxlciBoYXBweSAqLwpAQCAtMzE1LDkgKzMwMyw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLXBmYWN0aW9uX3RvX251bShjb25zdCBjaGFyICphY3Rpb24pCitwZmFjdGlvbl90b19udW0oY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBjb25zdCBjaGFyICphY3Rpb24pCiB7Ci0JYnBmX2Vycm9yKCJsaWJwY2FwIHdhcyBjb21waWxlZCBvbiBhIG1hY2hpbmUgd2l0aG91dCBwZiBzdXBwb3J0Iik7CisJYnBmX2Vycm9yKGNzdGF0ZSwgImxpYnBjYXAgd2FzIGNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRob3V0IHBmIHN1cHBvcnQiKTsKIAkvKk5PVFJFQUNIRUQqLwogCiAJLyogdGhpcyBpcyB0byBtYWtlIHRoZSBWQyBjb21waWxlciBoYXBweSAqLwpAQCAtMzI1LDcgKzMxMyw3IEBACiB9CiAjZW5kaWYgLyogSEFWRV9ORVRfUEZWQVJfSCAqLwogCi0jbGluZSAzMjkgInkudGFiLmMiIC8qIHlhY2MuYzozMzkgICovCisjbGluZSAzMTcgImdyYW1tYXIuYyIgLyogeWFjYy5jOjMzOSAgKi8KIAogIyBpZm5kZWYgWVlfTlVMTFBUUgogIyAgaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiAyMDExMDNMIDw9IF9fY3BsdXNwbHVzCkBAIC0zNDQsOSArMzMyLDkgQEAKICNlbmRpZgogCiAvKiBJbiBhIGZ1dHVyZSByZWxlYXNlIG9mIEJpc29uLCB0aGlzIHNlY3Rpb24gd2lsbCBiZSByZXBsYWNlZAotICAgYnkgI2luY2x1ZGUgInkudGFiLmgiLiAgKi8KLSNpZm5kZWYgWVlfUENBUF9ZX1RBQl9IX0lOQ0xVREVECi0jIGRlZmluZSBZWV9QQ0FQX1lfVEFCX0hfSU5DTFVERUQKKyAgIGJ5ICNpbmNsdWRlICJncmFtbWFyLmgiLiAgKi8KKyNpZm5kZWYgWVlfUENBUF9HUkFNTUFSX0hfSU5DTFVERUQKKyMgZGVmaW5lIFlZX1BDQVBfR1JBTU1BUl9IX0lOQ0xVREVECiAvKiBEZWJ1ZyB0cmFjZXMuICAqLwogI2lmbmRlZiBZWURFQlVHCiAjIGRlZmluZSBZWURFQlVHIDAKQEAgLTYwNyw3ICs1OTUsNyBAQAogdHlwZWRlZiB1bmlvbiBZWVNUWVBFIFlZU1RZUEU7CiB1bmlvbiBZWVNUWVBFCiB7Ci0jbGluZSAyNTYgImdyYW1tYXIueSIgLyogeWFjYy5jOjM1NSAgKi8KKyNsaW5lIDI3MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MzU1ICAqLwogCiAJaW50IGk7CiAJYnBmX3VfaW50MzIgaDsKQEAgLTYyMywyMiArNjExLDIxIEBACiAJfSBibGs7CiAJc3RydWN0IGJsb2NrICpyYmxrOwogCi0jbGluZSA2MjcgInkudGFiLmMiIC8qIHlhY2MuYzozNTUgICovCisjbGluZSA2MTUgImdyYW1tYXIuYyIgLyogeWFjYy5jOjM1NSAgKi8KIH07CiAjIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQogIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCiAjZW5kaWYKIAogCi1leHRlcm4gWVlTVFlQRSBwY2FwX2x2YWw7CiAKLWludCBwY2FwX3BhcnNlICh2b2lkKTsKK2ludCBwY2FwX3BhcnNlICh2b2lkICp5eXNjYW5uZXIsIGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSk7CiAKLSNlbmRpZiAvKiAhWVlfUENBUF9ZX1RBQl9IX0lOQ0xVREVEICAqLworI2VuZGlmIC8qICFZWV9QQ0FQX0dSQU1NQVJfSF9JTkNMVURFRCAgKi8KIAogLyogQ29weSB0aGUgc2Vjb25kIHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLwogCi0jbGluZSA2NDIgInkudGFiLmMiIC8qIHlhY2MuYzozNTggICovCisjbGluZSA2MjkgImdyYW1tYXIuYyIgLyogeWFjYy5jOjM1OCAgKi8KIAogI2lmZGVmIHNob3J0CiAjIHVuZGVmIHNob3J0CkBAIC05NDcsMjkgKzkzNCwyOSBAQAogICAvKiBZWVJMSU5FW1lZTl0gLS0gU291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5cmxpbmVbXSA9CiB7Ci0gICAgICAgMCwgICAzMzAsICAgMzMwLCAgIDMzNCwgICAzMzYsICAgMzM4LCAgIDMzOSwgICAzNDAsICAgMzQxLCAgIDM0MiwKLSAgICAgMzQ0LCAgIDM0NiwgICAzNDgsICAgMzQ5LCAgIDM1MSwgICAzNTMsICAgMzU0LCAgIDM1NiwgICAzNTgsICAgMzcxLAotICAgICAzODAsICAgMzg5LCAgIDM5OCwgICA0MDcsICAgNDA5LCAgIDQxMSwgICA0MTMsICAgNDE0LCAgIDQxNSwgICA0MTcsCi0gICAgIDQxOSwgICA0MjEsICAgNDIyLCAgIDQyNCwgICA0MjUsICAgNDI2LCAgIDQyNywgICA0MjgsICAgNDI5LCAgIDQzMSwKLSAgICAgNDMyLCAgIDQzMywgICA0MzQsICAgNDM2LCAgIDQzOCwgICA0MzksICAgNDQwLCAgIDQ0MSwgICA0NDIsICAgNDQzLAotICAgICA0NDYsICAgNDQ3LCAgIDQ1MCwgICA0NTEsICAgNDUyLCAgIDQ1MywgICA0NTQsICAgNDU1LCAgIDQ1NiwgICA0NTcsCi0gICAgIDQ1OCwgICA0NTksICAgNDYwLCAgIDQ2MSwgICA0NjQsICAgNDY1LCAgIDQ2NiwgICA0NjcsICAgNDcwLCAgIDQ3MiwKLSAgICAgNDczLCAgIDQ3NCwgICA0NzUsICAgNDc2LCAgIDQ3NywgICA0NzgsICAgNDc5LCAgIDQ4MCwgICA0ODEsICAgNDgyLAotICAgICA0ODMsICAgNDg0LCAgIDQ4NSwgICA0ODYsICAgNDg3LCAgIDQ4OCwgICA0ODksICAgNDkwLCAgIDQ5MSwgICA0OTIsCi0gICAgIDQ5MywgICA0OTQsICAgNDk1LCAgIDQ5NiwgICA0OTcsICAgNDk4LCAgIDQ5OSwgICA1MDAsICAgNTAxLCAgIDUwMiwKLSAgICAgNTAzLCAgIDUwNCwgICA1MDUsICAgNTA2LCAgIDUwNywgICA1MDgsICAgNTA5LCAgIDUxMCwgICA1MTIsICAgNTEzLAotICAgICA1MTQsICAgNTE1LCAgIDUxNiwgICA1MTcsICAgNTE4LCAgIDUxOSwgICA1MjAsICAgNTIxLCAgIDUyMiwgICA1MjMsCi0gICAgIDUyNCwgICA1MjUsICAgNTI2LCAgIDUyNywgICA1MjgsICAgNTI5LCAgIDUzMCwgICA1MzMsICAgNTM0LCAgIDUzNSwKLSAgICAgNTM2LCAgIDUzNywgICA1MzgsICAgNTQxLCAgIDU0NiwgICA1NDksICAgNTUzLCAgIDU1NiwgICA1NTcsICAgNTYzLAotICAgICA1NjQsICAgNTg0LCAgIDYwMCwgICA2MDEsICAgNjIyLCAgIDYyNSwgICA2MjYsICAgNjM5LCAgIDY0MCwgICA2NDMsCi0gICAgIDY0NiwgICA2NDcsICAgNjQ4LCAgIDY1MCwgICA2NTEsICAgNjUyLCAgIDY1NCwgICA2NTUsICAgNjU3LCAgIDY1OCwKLSAgICAgNjU5LCAgIDY2MCwgICA2NjEsICAgNjYyLCAgIDY2MywgICA2NjQsICAgNjY1LCAgIDY2NiwgICA2NjcsICAgNjY4LAotICAgICA2NjksICAgNjcwLCAgIDY3MSwgICA2NzMsICAgNjc0LCAgIDY3NSwgICA2NzYsICAgNjc3LCAgIDY3OSwgICA2ODAsCi0gICAgIDY4MiwgICA2ODMsICAgNjg0LCAgIDY4NSwgICA2ODYsICAgNjg3LCAgIDY4OCwgICA2OTAsICAgNjkxLCAgIDY5MiwKLSAgICAgNjkzLCAgIDY5NiwgICA2OTcsICAgNjk5LCAgIDcwMCwgICA3MDEsICAgNzAyLCAgIDcwNCwgICA3MTEsICAgNzEyLAotICAgICA3MTUsICAgNzE2LCAgIDcxNywgICA3MTgsICAgNzE5LCAgIDcyMCwgICA3MjMsICAgNzI0LCAgIDcyNSwgICA3MjYsCi0gICAgIDcyNywgICA3MjgsICAgNzI5LCAgIDczMCwgICA3MzIsICAgNzMzLCAgIDczNCwgICA3MzUsICAgNzM3LCAgIDc1MCwKLSAgICAgNzUxCisgICAgICAgMCwgICAzNDUsICAgMzQ1LCAgIDM0OSwgICAzNTEsICAgMzUzLCAgIDM1NCwgICAzNTUsICAgMzU2LCAgIDM1NywKKyAgICAgMzU5LCAgIDM2MSwgICAzNjMsICAgMzY0LCAgIDM2NiwgICAzNjgsICAgMzY5LCAgIDM3MSwgICAzNzMsICAgMzg2LAorICAgICAzOTUsICAgNDA0LCAgIDQxMywgICA0MjIsICAgNDI0LCAgIDQyNiwgICA0MjgsICAgNDI5LCAgIDQzMCwgICA0MzIsCisgICAgIDQzNCwgICA0MzYsICAgNDM3LCAgIDQzOSwgICA0NDAsICAgNDQxLCAgIDQ0MiwgICA0NDMsICAgNDQ0LCAgIDQ0NiwKKyAgICAgNDQ3LCAgIDQ0OCwgICA0NDksICAgNDUxLCAgIDQ1MywgICA0NTQsICAgNDU1LCAgIDQ1NiwgICA0NTcsICAgNDU4LAorICAgICA0NjEsICAgNDYyLCAgIDQ2NSwgICA0NjYsICAgNDY3LCAgIDQ2OCwgICA0NjksICAgNDcwLCAgIDQ3MSwgICA0NzIsCisgICAgIDQ3MywgICA0NzQsICAgNDc1LCAgIDQ3NiwgICA0NzksICAgNDgwLCAgIDQ4MSwgICA0ODIsICAgNDg1LCAgIDQ4NywKKyAgICAgNDg4LCAgIDQ4OSwgICA0OTAsICAgNDkxLCAgIDQ5MiwgICA0OTMsICAgNDk0LCAgIDQ5NSwgICA0OTYsICAgNDk3LAorICAgICA0OTgsICAgNDk5LCAgIDUwMCwgICA1MDEsICAgNTAyLCAgIDUwMywgICA1MDQsICAgNTA1LCAgIDUwNiwgICA1MDcsCisgICAgIDUwOCwgICA1MDksICAgNTEwLCAgIDUxMSwgICA1MTIsICAgNTEzLCAgIDUxNCwgICA1MTUsICAgNTE2LCAgIDUxNywKKyAgICAgNTE4LCAgIDUxOSwgICA1MjAsICAgNTIxLCAgIDUyMiwgICA1MjMsICAgNTI0LCAgIDUyNSwgICA1MjcsICAgNTI4LAorICAgICA1MjksICAgNTMwLCAgIDUzMSwgICA1MzIsICAgNTMzLCAgIDUzNCwgICA1MzUsICAgNTM2LCAgIDUzNywgICA1MzgsCisgICAgIDUzOSwgICA1NDAsICAgNTQxLCAgIDU0MiwgICA1NDMsICAgNTQ0LCAgIDU0NSwgICA1NDgsICAgNTQ5LCAgIDU1MCwKKyAgICAgNTUxLCAgIDU1MiwgICA1NTMsICAgNTU2LCAgIDU2MSwgICA1NjQsICAgNTY4LCAgIDU3MSwgICA1NzIsICAgNTc4LAorICAgICA1NzksICAgNTk5LCAgIDYxNSwgICA2MTYsICAgNjM3LCAgIDY0MCwgICA2NDEsICAgNjU0LCAgIDY1NSwgICA2NTgsCisgICAgIDY2MSwgICA2NjIsICAgNjYzLCAgIDY2NSwgICA2NjYsICAgNjY3LCAgIDY2OSwgICA2NzAsICAgNjcyLCAgIDY3MywKKyAgICAgNjc0LCAgIDY3NSwgICA2NzYsICAgNjc3LCAgIDY3OCwgICA2NzksICAgNjgwLCAgIDY4MSwgICA2ODIsICAgNjgzLAorICAgICA2ODQsICAgNjg1LCAgIDY4NiwgICA2ODgsICAgNjg5LCAgIDY5MCwgICA2OTEsICAgNjkyLCAgIDY5NCwgICA2OTUsCisgICAgIDY5NywgICA2OTgsICAgNjk5LCAgIDcwMCwgICA3MDEsICAgNzAyLCAgIDcwMywgICA3MDUsICAgNzA2LCAgIDcwNywKKyAgICAgNzA4LCAgIDcxMSwgICA3MTIsICAgNzE0LCAgIDcxNSwgICA3MTYsICAgNzE3LCAgIDcxOSwgICA3MjYsICAgNzI3LAorICAgICA3MzAsICAgNzMxLCAgIDczMiwgICA3MzMsICAgNzM0LCAgIDczNSwgICA3MzgsICAgNzM5LCAgIDc0MCwgICA3NDEsCisgICAgIDc0MiwgICA3NDMsICAgNzQ0LCAgIDc0NSwgICA3NDcsICAgNzQ4LCAgIDc0OSwgICA3NTAsICAgNzUyLCAgIDc2NSwKKyAgICAgNzY2CiB9OwogI2VuZGlmCiAKQEAgLTE0MTYsNyArMTQwMyw3IEBACiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKSk7IFwKKyAgICAgIHl5ZXJyb3IgKHl5c2Nhbm5lciwgY3N0YXRlLCBZWV8oInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKSk7IFwKICAgICAgIFlZRVJST1I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogd2hpbGUgKDApCkBAIC0xNDUzLDcgKzE0NDAsNyBAQAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIFRpdGxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgVHlwZSwgVmFsdWUpOyBcCisgICAgICAgICAgICAgICAgICBUeXBlLCBWYWx1ZSwgeXlzY2FubmVyLCBjc3RhdGUpOyBcCiAgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSB3aGlsZSAoMCkKQEAgLTE0NjQsMTAgKzE0NTEsMTIgQEAKIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHZvaWQKLXl5X3N5bWJvbF92YWx1ZV9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCkKK3l5X3N5bWJvbF92YWx1ZV9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCwgdm9pZCAqeXlzY2FubmVyLCBjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAgIEZJTEUgKnl5byA9IHl5b3V0cHV0OwogICBZWVVTRSAoeXlvKTsKKyAgWVlVU0UgKHl5c2Nhbm5lcik7CisgIFlZVVNFIChjc3RhdGUpOwogICBpZiAoIXl5dmFsdWVwKQogICAgIHJldHVybjsKICMgaWZkZWYgWVlQUklOVApAQCAtMTQ4MywxMiArMTQ3MiwxMiBAQAogYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHZvaWQKLXl5X3N5bWJvbF9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCkKK3l5X3N5bWJvbF9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCwgdm9pZCAqeXlzY2FubmVyLCBjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICIlcyAlcyAoIiwKICAgICAgICAgICAgICB5eXR5cGUgPCBZWU5UT0tFTlMgPyAidG9rZW4iIDogIm50ZXJtIiwgeXl0bmFtZVt5eXR5cGVdKTsKIAotICB5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwKTsKKyAgeXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCwgeXlzY2FubmVyLCBjc3RhdGUpOwogICBZWUZQUklOVEYgKHl5b3V0cHV0LCAiKSIpOwogfQogCkBAIC0xNTIxLDcgKzE1MTAsNyBAQAogYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyB2b2lkCi15eV9yZWR1Y2VfcHJpbnQgKHl5dHlwZV9pbnQxNiAqeXlzc3AsIFlZU1RZUEUgKnl5dnNwLCBpbnQgeXlydWxlKQoreXlfcmVkdWNlX3ByaW50ICh5eXR5cGVfaW50MTYgKnl5c3NwLCBZWVNUWVBFICp5eXZzcCwgaW50IHl5cnVsZSwgdm9pZCAqeXlzY2FubmVyLCBjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpCiB7CiAgIHVuc2lnbmVkIGxvbmcgaW50IHl5bG5vID0geXlybGluZVt5eXJ1bGVdOwogICBpbnQgeXlucmhzID0geXlyMlt5eXJ1bGVdOwpAQCAtMTUzNSw3ICsxNTI0LDcgQEAKICAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgICB5eXN0b3NbeXlzc3BbeXlpICsgMSAtIHl5bnJoc11dLAogICAgICAgICAgICAgICAgICAgICAgICAmKHl5dnNwWyh5eWkgKyAxKSAtICh5eW5yaHMpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgeXlzY2FubmVyLCBjc3RhdGUpOwogICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwogICAgIH0KIH0KQEAgLTE1NDMsNyArMTUzMiw3IEBACiAjIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkgICAgICAgICAgXAogZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgaWYgKHl5ZGVidWcpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeXlfcmVkdWNlX3ByaW50ICh5eXNzcCwgeXl2c3AsIFJ1bGUpOyBcCisgICAgeXlfcmVkdWNlX3ByaW50ICh5eXNzcCwgeXl2c3AsIFJ1bGUsIHl5c2Nhbm5lciwgY3N0YXRlKTsgXAogfSB3aGlsZSAoMCkKIAogLyogTm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZS4gIEl0IGlzIGxlZnQgdW5pbml0aWFsaXplZCBzbyB0aGF0CkBAIC0xODAxLDkgKzE3OTAsMTEgQEAKIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyB2b2lkCi15eWRlc3RydWN0IChjb25zdCBjaGFyICp5eW1zZywgaW50IHl5dHlwZSwgWVlTVFlQRSAqeXl2YWx1ZXApCit5eWRlc3RydWN0IChjb25zdCBjaGFyICp5eW1zZywgaW50IHl5dHlwZSwgWVlTVFlQRSAqeXl2YWx1ZXAsIHZvaWQgKnl5c2Nhbm5lciwgY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlKQogewogICBZWVVTRSAoeXl2YWx1ZXApOworICBZWVVTRSAoeXlzY2FubmVyKTsKKyAgWVlVU0UgKGNzdGF0ZSk7CiAgIGlmICgheXltc2cpCiAgICAgeXltc2cgPSAiRGVsZXRpbmciOwogICBZWV9TWU1CT0xfUFJJTlQgKHl5bXNnLCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCk7CkBAIC0xODE2LDIyICsxODA3LDI2IEBACiAKIAogCi0vKiBUaGUgbG9va2FoZWFkIHN5bWJvbC4gICovCi1pbnQgeXljaGFyOwotCi0vKiBUaGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLwotWVlTVFlQRSB5eWx2YWw7Ci0vKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLwotaW50IHl5bmVycnM7Ci0KLQogLyotLS0tLS0tLS0tLgogfCB5eXBhcnNlLiAgfAogYC0tLS0tLS0tLS0qLwogCiBpbnQKLXl5cGFyc2UgKHZvaWQpCit5eXBhcnNlICh2b2lkICp5eXNjYW5uZXIsIGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSkKIHsKKy8qIFRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KK2ludCB5eWNoYXI7CisKKworLyogVGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KKy8qIERlZmF1bHQgdmFsdWUgdXNlZCBmb3IgaW5pdGlhbGl6YXRpb24sIGZvciBwYWNpZnlpbmcgb2xkZXIgR0NDcworICAgb3Igbm9uLUdDQyBjb21waWxlcnMuICAqLworWVlfSU5JVElBTF9WQUxVRSAoc3RhdGljIFlZU1RZUEUgeXl2YWxfZGVmYXVsdDspCitZWVNUWVBFIHl5bHZhbCBZWV9JTklUSUFMX1ZBTFVFICg9IHl5dmFsX2RlZmF1bHQpOworCisgICAgLyogTnVtYmVyIG9mIHN5bnRheCBlcnJvcnMgc28gZmFyLiAgKi8KKyAgICBpbnQgeXluZXJyczsKKwogICAgIGludCB5eXN0YXRlOwogICAgIC8qIE51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQuICAqLwogICAgIGludCB5eWVycnN0YXR1czsKQEAgLTE5ODYsNyArMTk4MSw3IEBACiAgIGlmICh5eWNoYXIgPT0gWVlFTVBUWSkKICAgICB7CiAgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJSZWFkaW5nIGEgdG9rZW46ICIpKTsKLSAgICAgIHl5Y2hhciA9IHl5bGV4ICgpOworICAgICAgeXljaGFyID0geXlsZXggKCZ5eWx2YWwsIHl5c2Nhbm5lcik7CiAgICAgfQogCiAgIGlmICh5eWNoYXIgPD0gWVlFT0YpCkBAIC0yMDY1LDEzOCArMjA2MCwxMzggQEAKICAgc3dpdGNoICh5eW4pCiAgICAgewogICAgICAgICBjYXNlIDI6Ci0jbGluZSAzMzEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzNDYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgewotCWZpbmlzaF9wYXJzZSgoeXl2c3BbMF0uYmxrKS5iKTsKKwlmaW5pc2hfcGFyc2UoY3N0YXRlLCAoeXl2c3BbMF0uYmxrKS5iKTsKIH0KLSNsaW5lIDIwNzMgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjA2OCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDQ6Ci0jbGluZSAzMzYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzNTEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQotI2xpbmUgMjA3OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMDc0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNjoKLSNsaW5lIDMzOSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDM1NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7IGdlbl9hbmQoKHl5dnNwWy0yXS5ibGspLmIsICh5eXZzcFswXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFswXS5ibGspOyB9Ci0jbGluZSAyMDg1ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIwODAgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA3OgotI2xpbmUgMzQwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzU1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgZ2VuX2FuZCgoeXl2c3BbLTJdLmJsaykuYiwgKHl5dnNwWzBdLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWzBdLmJsayk7IH0KLSNsaW5lIDIwOTEgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjA4NiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDg6Ci0jbGluZSAzNDEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzNTYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyBnZW5fb3IoKHl5dnNwWy0yXS5ibGspLmIsICh5eXZzcFswXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFswXS5ibGspOyB9Ci0jbGluZSAyMDk3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIwOTIgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA5OgotI2xpbmUgMzQyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzU3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgZ2VuX29yKCh5eXZzcFstMl0uYmxrKS5iLCAoeXl2c3BbMF0uYmxrKS5iKTsgKHl5dmFsLmJsaykgPSAoeXl2c3BbMF0uYmxrKTsgfQotI2xpbmUgMjEwMyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMDk4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA6Ci0jbGluZSAzNDQgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzNTkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuYmxrKSA9ICh5eXZzcFstMV0uYmxrKTsgfQotI2xpbmUgMjEwOSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMTA0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTE6Ci0jbGluZSAzNDYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzNjEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuYmxrKSA9ICh5eXZzcFstMV0uYmxrKTsgfQotI2xpbmUgMjExNSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMTEwICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTM6Ci0jbGluZSAzNDkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX25jb2RlKE5VTEwsIChicGZfdV9pbnQzMikoeXl2c3BbMF0uaSksCisjbGluZSAzNjQgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX25jb2RlKGNzdGF0ZSwgTlVMTCwgKGJwZl91X2ludDMyKSh5eXZzcFswXS5pKSwKIAkJCQkJCSAgICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbLTFdLmJsaykucSk7IH0KLSNsaW5lIDIxMjIgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjExNyAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE0OgotI2xpbmUgMzUxICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzY2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmJsaykgPSAoeXl2c3BbLTFdLmJsayk7IH0KLSNsaW5lIDIxMjggInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjEyMyAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE1OgotI2xpbmUgMzUzICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9zY29kZSgoeXl2c3BbMF0ucyksICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbLTFdLmJsaykucSk7IH0KLSNsaW5lIDIxMzQgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzY4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9zY29kZShjc3RhdGUsICh5eXZzcFswXS5zKSwgKHl5dmFsLmJsaykucSA9ICh5eXZzcFstMV0uYmxrKS5xKTsgfQorI2xpbmUgMjEyOSAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE2OgotI2xpbmUgMzU0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9tY29kZSgoeXl2c3BbLTJdLnMpLCBOVUxMLCAoeXl2c3BbMF0uaSksCisjbGluZSAzNjkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX21jb2RlKGNzdGF0ZSwgKHl5dnNwWy0yXS5zKSwgTlVMTCwgKHl5dnNwWzBdLmkpLAogCQkJCSAgICAoeXl2YWwuYmxrKS5xID0gKHl5dnNwWy0zXS5ibGspLnEpOyB9Ci0jbGluZSAyMTQxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIxMzYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNzoKLSNsaW5lIDM1NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fbWNvZGUoKHl5dnNwWy0yXS5zKSwgKHl5dnNwWzBdLnMpLCAwLAorI2xpbmUgMzcxICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9tY29kZShjc3RhdGUsICh5eXZzcFstMl0ucyksICh5eXZzcFswXS5zKSwgMCwKIAkJCQkgICAgKHl5dmFsLmJsaykucSA9ICh5eXZzcFstM10uYmxrKS5xKTsgfQotI2xpbmUgMjE0OCAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMTQzICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTg6Ci0jbGluZSAzNTggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzNzMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgewogCQkJCSAgLyogRGVjaWRlIGhvdyB0byBwYXJzZSBISUQgYmFzZWQgb24gcHJvdG8gKi8KIAkJCQkgICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbLTFdLmJsaykucTsKIAkJCQkgIGlmICgoeXl2YWwuYmxrKS5xLmFkZHIgPT0gUV9QT1JUKQotCQkJCSAgCWJwZl9lcnJvcigiJ3BvcnQnIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXAgaG9zdCIpOworCQkJCSAgCWJwZl9lcnJvcihjc3RhdGUsICIncG9ydCcgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CiAJCQkJICBlbHNlIGlmICgoeXl2YWwuYmxrKS5xLmFkZHIgPT0gUV9QT1JUUkFOR0UpCi0JCQkJICAJYnBmX2Vycm9yKCIncG9ydHJhbmdlJyBtb2RpZmllciBhcHBsaWVkIHRvIGlwIGhvc3QiKTsKKwkJCQkgIAlicGZfZXJyb3IoY3N0YXRlLCAiJ3BvcnRyYW5nZScgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CiAJCQkJICBlbHNlIGlmICgoeXl2YWwuYmxrKS5xLmFkZHIgPT0gUV9QUk9UTykKLQkJCQkgIAlicGZfZXJyb3IoIidwcm90bycgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CisJCQkJICAJYnBmX2Vycm9yKGNzdGF0ZSwgIidwcm90bycgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CiAJCQkJICBlbHNlIGlmICgoeXl2YWwuYmxrKS5xLmFkZHIgPT0gUV9QUk9UT0NIQUlOKQotCQkJCSAgCWJwZl9lcnJvcigiJ3Byb3RvY2hhaW4nIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXAgaG9zdCIpOwotCQkJCSAgKHl5dmFsLmJsaykuYiA9IGdlbl9uY29kZSgoeXl2c3BbMF0ucyksIDAsICh5eXZhbC5ibGspLnEpOworCQkJCSAgCWJwZl9lcnJvcihjc3RhdGUsICIncHJvdG9jaGFpbicgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CisJCQkJICAoeXl2YWwuYmxrKS5iID0gZ2VuX25jb2RlKGNzdGF0ZSwgKHl5dnNwWzBdLnMpLCAwLCAoeXl2YWwuYmxrKS5xKTsKIAkJCQl9Ci0jbGluZSAyMTY2ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIxNjEgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxOToKLSNsaW5lIDM3MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDM4NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7CiAjaWZkZWYgSU5FVDYKLQkJCQkgICh5eXZhbC5ibGspLmIgPSBnZW5fbWNvZGU2KCh5eXZzcFstMl0ucyksIE5VTEwsICh5eXZzcFswXS5pKSwKKwkJCQkgICh5eXZhbC5ibGspLmIgPSBnZW5fbWNvZGU2KGNzdGF0ZSwgKHl5dnNwWy0yXS5zKSwgTlVMTCwgKHl5dnNwWzBdLmkpLAogCQkJCSAgICAoeXl2YWwuYmxrKS5xID0gKHl5dnNwWy0zXS5ibGspLnEpOwogI2Vsc2UKLQkJCQkgIGJwZl9lcnJvcigiJ2lwNmFkZHIvcHJlZml4bGVuJyBub3Qgc3VwcG9ydGVkICIKKwkJCQkgIGJwZl9lcnJvcihjc3RhdGUsICInaXA2YWRkci9wcmVmaXhsZW4nIG5vdCBzdXBwb3J0ZWQgIgogCQkJCQkiaW4gdGhpcyBjb25maWd1cmF0aW9uIik7CiAjZW5kaWYgLypJTkVUNiovCiAJCQkJfQotI2xpbmUgMjE4MCAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMTc1ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMjA6Ci0jbGluZSAzODAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzOTUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgewogI2lmZGVmIElORVQ2Ci0JCQkJICAoeXl2YWwuYmxrKS5iID0gZ2VuX21jb2RlNigoeXl2c3BbMF0ucyksIDAsIDEyOCwKKwkJCQkgICh5eXZhbC5ibGspLmIgPSBnZW5fbWNvZGU2KGNzdGF0ZSwgKHl5dnNwWzBdLnMpLCAwLCAxMjgsCiAJCQkJICAgICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbLTFdLmJsaykucSk7CiAjZWxzZQotCQkJCSAgYnBmX2Vycm9yKCInaXA2YWRkcicgbm90IHN1cHBvcnRlZCAiCisJCQkJICBicGZfZXJyb3IoY3N0YXRlLCAiJ2lwNmFkZHInIG5vdCBzdXBwb3J0ZWQgIgogCQkJCQkiaW4gdGhpcyBjb25maWd1cmF0aW9uIik7CiAjZW5kaWYgLypJTkVUNiovCiAJCQkJfQotI2xpbmUgMjE5NCAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMTg5ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMjE6Ci0jbGluZSAzODkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0MDQgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgewotCQkJCSAgKHl5dmFsLmJsaykuYiA9IGdlbl9lY29kZSgoeXl2c3BbMF0uZSksICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbLTFdLmJsaykucSk7CisJCQkJICAoeXl2YWwuYmxrKS5iID0gZ2VuX2Vjb2RlKGNzdGF0ZSwgKHl5dnNwWzBdLmUpLCAoeXl2YWwuYmxrKS5xID0gKHl5dnNwWy0xXS5ibGspLnEpOwogCQkJCSAgLyoKIAkJCQkgICAqICQxIHdhcyBhbGxvY2F0ZWQgYnkgInBjYXBfZXRoZXJfYXRvbigpIiwKIAkJCQkgICAqIHNvIHdlIG11c3QgZnJlZSBpdCBub3cgdGhhdCB3ZSdyZSBkb25lCkBAIC0yMjA0LDEzICsyMTk5LDEzIEBACiAJCQkJICAgKi8KIAkJCQkgIGZyZWUoKHl5dnNwWzBdLmUpKTsKIAkJCQl9Ci0jbGluZSAyMjA4ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIyMDMgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAyMjoKLSNsaW5lIDM5OCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQxMyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7Ci0JCQkJICAoeXl2YWwuYmxrKS5iID0gZ2VuX2Fjb2RlKCh5eXZzcFswXS5lKSwgKHl5dmFsLmJsaykucSA9ICh5eXZzcFstMV0uYmxrKS5xKTsKKwkJCQkgICh5eXZhbC5ibGspLmIgPSBnZW5fYWNvZGUoY3N0YXRlLCAoeXl2c3BbMF0uZSksICh5eXZhbC5ibGspLnEgPSAoeXl2c3BbLTFdLmJsaykucSk7CiAJCQkJICAvKgogCQkJCSAgICogJDEgd2FzIGFsbG9jYXRlZCBieSAicGNhcF9ldGhlcl9hdG9uKCkiLAogCQkJCSAgICogc28gd2UgbXVzdCBmcmVlIGl0IG5vdyB0aGF0IHdlJ3JlIGRvbmUKQEAgLTIyMTgsNjk3ICsyMjEzLDY5NyBAQAogCQkJCSAgICovCiAJCQkJICBmcmVlKCh5eXZzcFswXS5lKSk7CiAJCQkJfQotI2xpbmUgMjIyMiAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMjE3ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMjM6Ci0jbGluZSA0MDcgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0MjIgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyBnZW5fbm90KCh5eXZzcFswXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFswXS5ibGspOyB9Ci0jbGluZSAyMjI4ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIyMjMgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAyNDoKLSNsaW5lIDQwOSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQyNCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspID0gKHl5dnNwWy0xXS5ibGspOyB9Ci0jbGluZSAyMjM0ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIyMjkgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAyNToKLSNsaW5lIDQxMSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQyNiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspID0gKHl5dnNwWy0xXS5ibGspOyB9Ci0jbGluZSAyMjQwICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIyMzUgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAyNzoKLSNsaW5lIDQxNCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQyOSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7IGdlbl9hbmQoKHl5dnNwWy0yXS5ibGspLmIsICh5eXZzcFswXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFswXS5ibGspOyB9Ci0jbGluZSAyMjQ2ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIyNDEgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAyODoKLSNsaW5lIDQxNSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQzMCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7IGdlbl9vcigoeXl2c3BbLTJdLmJsaykuYiwgKHl5dnNwWzBdLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWzBdLmJsayk7IH0KLSNsaW5lIDIyNTIgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjI0NyAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDI5OgotI2xpbmUgNDE3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9uY29kZShOVUxMLCAoYnBmX3VfaW50MzIpKHl5dnNwWzBdLmkpLAorI2xpbmUgNDMyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9uY29kZShjc3RhdGUsIE5VTEwsIChicGZfdV9pbnQzMikoeXl2c3BbMF0uaSksCiAJCQkJCQkgICAoeXl2YWwuYmxrKS5xID0gKHl5dnNwWy0xXS5ibGspLnEpOyB9Ci0jbGluZSAyMjU5ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIyNTQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAzMjoKLSNsaW5lIDQyMiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQzNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7IGdlbl9ub3QoKHl5dnNwWzBdLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWzBdLmJsayk7IH0KLSNsaW5lIDIyNjUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjI2MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDMzOgotI2xpbmUgNDI0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDM5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgUVNFVCgoeXl2YWwuYmxrKS5xLCAoeXl2c3BbLTJdLmkpLCAoeXl2c3BbLTFdLmkpLCAoeXl2c3BbMF0uaSkpOyB9Ci0jbGluZSAyMjcxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIyNjYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAzNDoKLSNsaW5lIDQyNSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ0MCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7IFFTRVQoKHl5dmFsLmJsaykucSwgKHl5dnNwWy0xXS5pKSwgKHl5dnNwWzBdLmkpLCBRX0RFRkFVTFQpOyB9Ci0jbGluZSAyMjc3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIyNzIgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAzNToKLSNsaW5lIDQyNiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ0MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7IFFTRVQoKHl5dmFsLmJsaykucSwgKHl5dnNwWy0xXS5pKSwgUV9ERUZBVUxULCAoeXl2c3BbMF0uaSkpOyB9Ci0jbGluZSAyMjgzICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIyNzggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAzNjoKLSNsaW5lIDQyNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ0MiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7IFFTRVQoKHl5dmFsLmJsaykucSwgKHl5dnNwWy0xXS5pKSwgUV9ERUZBVUxULCBRX1BST1RPKTsgfQotI2xpbmUgMjI4OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMjg0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMzc6Ci0jbGluZSA0MjggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0NDMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyBRU0VUKCh5eXZhbC5ibGspLnEsICh5eXZzcFstMV0uaSksIFFfREVGQVVMVCwgUV9QUk9UT0NIQUlOKTsgfQotI2xpbmUgMjI5NSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMjkwICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMzg6Ci0jbGluZSA0MjkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0NDQgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyBRU0VUKCh5eXZhbC5ibGspLnEsICh5eXZzcFstMV0uaSksIFFfREVGQVVMVCwgKHl5dnNwWzBdLmkpKTsgfQotI2xpbmUgMjMwMSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMjk2ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMzk6Ci0jbGluZSA0MzEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0NDYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuYmxrKSA9ICh5eXZzcFswXS5ibGspOyB9Ci0jbGluZSAyMzA3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIzMDIgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA0MDoKLSNsaW5lIDQzMiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ0NyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspLmIgPSAoeXl2c3BbLTFdLmJsaykuYjsgKHl5dmFsLmJsaykucSA9ICh5eXZzcFstMl0uYmxrKS5xOyB9Ci0jbGluZSAyMzEzICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIzMDggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA0MToKLSNsaW5lIDQzMyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fcHJvdG9fYWJicmV2KCh5eXZzcFswXS5pKSk7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9Ci0jbGluZSAyMzE5ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ0OCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fcHJvdG9fYWJicmV2KGNzdGF0ZSwgKHl5dnNwWzBdLmkpKTsgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KKyNsaW5lIDIzMTQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA0MjoKLSNsaW5lIDQzNCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fcmVsYXRpb24oKHl5dnNwWy0xXS5pKSwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpLCAwKTsKKyNsaW5lIDQ0OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fcmVsYXRpb24oY3N0YXRlLCAoeXl2c3BbLTFdLmkpLCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSksIDApOwogCQkJCSAgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KLSNsaW5lIDIzMjYgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjMyMSAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDQzOgotI2xpbmUgNDM2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9yZWxhdGlvbigoeXl2c3BbLTFdLmkpLCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSksIDEpOworI2xpbmUgNDUxICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9yZWxhdGlvbihjc3RhdGUsICh5eXZzcFstMV0uaSksICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSwgMSk7CiAJCQkJICAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQotI2xpbmUgMjMzMyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMzI4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNDQ6Ci0jbGluZSA0MzggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0NTMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuYmxrKS5iID0gKHl5dnNwWzBdLnJibGspOyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQotI2xpbmUgMjMzOSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMzM0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNDU6Ci0jbGluZSA0MzkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX2F0bXR5cGVfYWJicmV2KCh5eXZzcFswXS5pKSk7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9Ci0jbGluZSAyMzQ1ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ1NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fYXRtdHlwZV9hYmJyZXYoY3N0YXRlLCAoeXl2c3BbMF0uaSkpOyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQorI2xpbmUgMjM0MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDQ2OgotI2xpbmUgNDQwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9hdG1tdWx0aV9hYmJyZXYoKHl5dnNwWzBdLmkpKTsgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KLSNsaW5lIDIzNTEgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDU1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9hdG1tdWx0aV9hYmJyZXYoY3N0YXRlLCAoeXl2c3BbMF0uaSkpOyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQorI2xpbmUgMjM0NiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDQ3OgotI2xpbmUgNDQxICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDU2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmJsaykuYiA9ICh5eXZzcFswXS5ibGspLmI7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9Ci0jbGluZSAyMzU3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIzNTIgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA0ODoKLSNsaW5lIDQ0MiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fbXRwMnR5cGVfYWJicmV2KCh5eXZzcFswXS5pKSk7ICh5eXZhbC5ibGspLnEgPSBxZXJyOyB9Ci0jbGluZSAyMzYzICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ1NyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fbXRwMnR5cGVfYWJicmV2KGNzdGF0ZSwgKHl5dnNwWzBdLmkpKTsgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KKyNsaW5lIDIzNTggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA0OToKLSNsaW5lIDQ0MyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ1OCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspLmIgPSAoeXl2c3BbMF0uYmxrKS5iOyAoeXl2YWwuYmxrKS5xID0gcWVycjsgfQotI2xpbmUgMjM2OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMzY0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNTE6Ci0jbGluZSA0NDcgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0NjIgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX0RFRkFVTFQ7IH0KLSNsaW5lIDIzNzUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjM3MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDUyOgotI2xpbmUgNDUwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDY1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9TUkM7IH0KLSNsaW5lIDIzODEgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjM3NiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDUzOgotI2xpbmUgNDUxICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDY2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9EU1Q7IH0KLSNsaW5lIDIzODcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjM4MiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDU0OgotI2xpbmUgNDUyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDY3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9PUjsgfQotI2xpbmUgMjM5MyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyMzg4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNTU6Ci0jbGluZSA0NTMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0NjggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX09SOyB9Ci0jbGluZSAyMzk5ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDIzOTQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA1NjoKLSNsaW5lIDQ1NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ2OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfQU5EOyB9Ci0jbGluZSAyNDA1ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI0MDAgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA1NzoKLSNsaW5lIDQ1NSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ3MCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfQU5EOyB9Ci0jbGluZSAyNDExICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI0MDYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA1ODoKLSNsaW5lIDQ1NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ3MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfQUREUjE7IH0KLSNsaW5lIDI0MTcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjQxMiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDU5OgotI2xpbmUgNDU3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDcyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9BRERSMjsgfQotI2xpbmUgMjQyMyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNDE4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNjA6Ci0jbGluZSA0NTggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0NzMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX0FERFIzOyB9Ci0jbGluZSAyNDI5ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI0MjQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA2MToKLSNsaW5lIDQ1OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ3NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfQUREUjQ7IH0KLSNsaW5lIDI0MzUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjQzMCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDYyOgotI2xpbmUgNDYwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDc1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9SQTsgfQotI2xpbmUgMjQ0MSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNDM2ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNjM6Ci0jbGluZSA0NjEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0NzYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX1RBOyB9Ci0jbGluZSAyNDQ3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI0NDIgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA2NDoKLSNsaW5lIDQ2NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ3OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfSE9TVDsgfQotI2xpbmUgMjQ1MyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNDQ4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNjU6Ci0jbGluZSA0NjUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0ODAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX05FVDsgfQotI2xpbmUgMjQ1OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNDU0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNjY6Ci0jbGluZSA0NjYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0ODEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX1BPUlQ7IH0KLSNsaW5lIDI0NjUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjQ2MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDY3OgotI2xpbmUgNDY3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDgyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9QT1JUUkFOR0U7IH0KLSNsaW5lIDI0NzEgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjQ2NiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDY4OgotI2xpbmUgNDcwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDg1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9HQVRFV0FZOyB9Ci0jbGluZSAyNDc3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI0NzIgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA2OToKLSNsaW5lIDQ3MiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ4NyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfTElOSzsgfQotI2xpbmUgMjQ4MyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNDc4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNzA6Ci0jbGluZSA0NzMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0ODggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX0lQOyB9Ci0jbGluZSAyNDg5ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI0ODQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA3MToKLSNsaW5lIDQ3NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ4OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfQVJQOyB9Ci0jbGluZSAyNDk1ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI0OTAgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA3MjoKLSNsaW5lIDQ3NSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ5MCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfUkFSUDsgfQotI2xpbmUgMjUwMSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNDk2ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNzM6Ci0jbGluZSA0NzYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0OTEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX1NDVFA7IH0KLSNsaW5lIDI1MDcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjUwMiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDc0OgotI2xpbmUgNDc3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDkyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9UQ1A7IH0KLSNsaW5lIDI1MTMgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjUwOCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDc1OgotI2xpbmUgNDc4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDkzICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9VRFA7IH0KLSNsaW5lIDI1MTkgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjUxNCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDc2OgotI2xpbmUgNDc5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDk0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9JQ01QOyB9Ci0jbGluZSAyNTI1ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI1MjAgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA3NzoKLSNsaW5lIDQ4MCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ5NSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfSUdNUDsgfQotI2xpbmUgMjUzMSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNTI2ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgNzg6Ci0jbGluZSA0ODEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA0OTYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX0lHUlA7IH0KLSNsaW5lIDI1MzcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjUzMiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDc5OgotI2xpbmUgNDgyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDk3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9QSU07IH0KLSNsaW5lIDI1NDMgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjUzOCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDgwOgotI2xpbmUgNDgzICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNDk4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9WUlJQOyB9Ci0jbGluZSAyNTQ5ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI1NDQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA4MToKLSNsaW5lIDQ4NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDQ5OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfQ0FSUDsgfQotI2xpbmUgMjU1NSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNTUwICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgODI6Ci0jbGluZSA0ODUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MDAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX0FUQUxLOyB9Ci0jbGluZSAyNTYxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI1NTYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA4MzoKLSNsaW5lIDQ4NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUwMSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfQUFSUDsgfQotI2xpbmUgMjU2NyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNTYyICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgODQ6Ci0jbGluZSA0ODcgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MDIgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX0RFQ05FVDsgfQotI2xpbmUgMjU3MyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNTY4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgODU6Ci0jbGluZSA0ODggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MDMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX0xBVDsgfQotI2xpbmUgMjU3OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNTc0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgODY6Ci0jbGluZSA0ODkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MDQgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX1NDQTsgfQotI2xpbmUgMjU4NSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNTgwICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgODc6Ci0jbGluZSA0OTAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MDUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX01PUERMOyB9Ci0jbGluZSAyNTkxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI1ODYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA4ODoKLSNsaW5lIDQ5MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUwNiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfTU9QUkM7IH0KLSNsaW5lIDI1OTcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjU5MiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDg5OgotI2xpbmUgNDkyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTA3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9JUFY2OyB9Ci0jbGluZSAyNjAzICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI1OTggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA5MDoKLSNsaW5lIDQ5MyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUwOCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfSUNNUFY2OyB9Ci0jbGluZSAyNjA5ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI2MDQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA5MToKLSNsaW5lIDQ5NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUwOSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfQUg7IH0KLSNsaW5lIDI2MTUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjYxMCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDkyOgotI2xpbmUgNDk1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTEwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9FU1A7IH0KLSNsaW5lIDI2MjEgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjYxNiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDkzOgotI2xpbmUgNDk2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTExICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9JU087IH0KLSNsaW5lIDI2MjcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjYyMiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDk0OgotI2xpbmUgNDk3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTEyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9FU0lTOyB9Ci0jbGluZSAyNjMzICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI2MjggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA5NToKLSNsaW5lIDQ5OCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUxMyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfSVNJUzsgfQotI2xpbmUgMjYzOSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNjM0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgOTY6Ci0jbGluZSA0OTkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MTQgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX0lTSVNfTDE7IH0KLSNsaW5lIDI2NDUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjY0MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDk3OgotI2xpbmUgNTAwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTE1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9JU0lTX0wyOyB9Ci0jbGluZSAyNjUxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI2NDYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSA5ODoKLSNsaW5lIDUwMSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUxNiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfSVNJU19JSUg7IH0KLSNsaW5lIDI2NTcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjY1MiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDk5OgotI2xpbmUgNTAyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTE3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9JU0lTX0xTUDsgfQotI2xpbmUgMjY2MyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNjU4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTAwOgotI2xpbmUgNTAzICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTE4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9JU0lTX1NOUDsgfQotI2xpbmUgMjY2OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNjY0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTAxOgotI2xpbmUgNTA0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTE5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9JU0lTX1BTTlA7IH0KLSNsaW5lIDI2NzUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjY3MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDEwMjoKLSNsaW5lIDUwNSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUyMCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfSVNJU19DU05QOyB9Ci0jbGluZSAyNjgxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI2NzYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMDM6Ci0jbGluZSA1MDYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MjEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX0NMTlA7IH0KLSNsaW5lIDI2ODcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjY4MiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDEwNDoKLSNsaW5lIDUwNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUyMiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IFFfU1RQOyB9Ci0jbGluZSAyNjkzICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI2ODggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMDU6Ci0jbGluZSA1MDggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MjMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX0lQWDsgfQotI2xpbmUgMjY5OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyNjk0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA2OgotI2xpbmUgNTA5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTI0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gUV9ORVRCRVVJOyB9Ci0jbGluZSAyNzA1ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI3MDAgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMDc6Ci0jbGluZSA1MTAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MjUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBRX1JBRElPOyB9Ci0jbGluZSAyNzExICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI3MDYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMDg6Ci0jbGluZSA1MTIgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fYnJvYWRjYXN0KCh5eXZzcFstMV0uaSkpOyB9Ci0jbGluZSAyNzE3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUyNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9icm9hZGNhc3QoY3N0YXRlLCAoeXl2c3BbLTFdLmkpKTsgfQorI2xpbmUgMjcxMiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDEwOToKLSNsaW5lIDUxMyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9tdWx0aWNhc3QoKHl5dnNwWy0xXS5pKSk7IH0KLSNsaW5lIDI3MjMgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTI4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX211bHRpY2FzdChjc3RhdGUsICh5eXZzcFstMV0uaSkpOyB9CisjbGluZSAyNzE4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTEwOgotI2xpbmUgNTE0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX2xlc3MoKHl5dnNwWzBdLmkpKTsgfQotI2xpbmUgMjcyOSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MjkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fbGVzcyhjc3RhdGUsICh5eXZzcFswXS5pKSk7IH0KKyNsaW5lIDI3MjQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTE6Ci0jbGluZSA1MTUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fZ3JlYXRlcigoeXl2c3BbMF0uaSkpOyB9Ci0jbGluZSAyNzM1ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUzMCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9ncmVhdGVyKGNzdGF0ZSwgKHl5dnNwWzBdLmkpKTsgfQorI2xpbmUgMjczMCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDExMjoKLSNsaW5lIDUxNiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9ieXRlb3AoKHl5dnNwWy0xXS5pKSwgKHl5dnNwWy0yXS5pKSwgKHl5dnNwWzBdLmkpKTsgfQotI2xpbmUgMjc0MSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MzEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fYnl0ZW9wKGNzdGF0ZSwgKHl5dnNwWy0xXS5pKSwgKHl5dnNwWy0yXS5pKSwgKHl5dnNwWzBdLmkpKTsgfQorI2xpbmUgMjczNiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDExMzoKLSNsaW5lIDUxNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9pbmJvdW5kKDApOyB9Ci0jbGluZSAyNzQ3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUzMiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9pbmJvdW5kKGNzdGF0ZSwgMCk7IH0KKyNsaW5lIDI3NDIgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTQ6Ci0jbGluZSA1MTggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5faW5ib3VuZCgxKTsgfQotI2xpbmUgMjc1MyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MzMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5faW5ib3VuZChjc3RhdGUsIDEpOyB9CisjbGluZSAyNzQ4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTE1OgotI2xpbmUgNTE5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3ZsYW4oKHl5dnNwWzBdLmkpKTsgfQotI2xpbmUgMjc1OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MzQgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fdmxhbihjc3RhdGUsICh5eXZzcFswXS5pKSk7IH0KKyNsaW5lIDI3NTQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTY6Ci0jbGluZSA1MjAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fdmxhbigtMSk7IH0KLSNsaW5lIDI3NjUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTM1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3ZsYW4oY3N0YXRlLCAtMSk7IH0KKyNsaW5lIDI3NjAgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTc6Ci0jbGluZSA1MjEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fbXBscygoeXl2c3BbMF0uaSkpOyB9Ci0jbGluZSAyNzcxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDUzNiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9tcGxzKGNzdGF0ZSwgKHl5dnNwWzBdLmkpKTsgfQorI2xpbmUgMjc2NiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDExODoKLSNsaW5lIDUyMiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9tcGxzKC0xKTsgfQotI2xpbmUgMjc3NyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MzcgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fbXBscyhjc3RhdGUsIC0xKTsgfQorI2xpbmUgMjc3MiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDExOToKLSNsaW5lIDUyMyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wcHBvZWQoKTsgfQotI2xpbmUgMjc4MyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1MzggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcHBwb2VkKGNzdGF0ZSk7IH0KKyNsaW5lIDI3NzggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMjA6Ci0jbGluZSA1MjQgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcHBwb2VzKCh5eXZzcFswXS5pKSk7IH0KLSNsaW5lIDI3ODkgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTM5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3BwcG9lcyhjc3RhdGUsICh5eXZzcFswXS5pKSk7IH0KKyNsaW5lIDI3ODQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMjE6Ci0jbGluZSA1MjUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcHBwb2VzKC0xKTsgfQotI2xpbmUgMjc5NSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1NDAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcHBwb2VzKGNzdGF0ZSwgLTEpOyB9CisjbGluZSAyNzkwICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTIyOgotI2xpbmUgNTI2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX2dlbmV2ZSgoeXl2c3BbMF0uaSkpOyB9Ci0jbGluZSAyODAxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDU0MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9nZW5ldmUoY3N0YXRlLCAoeXl2c3BbMF0uaSkpOyB9CisjbGluZSAyNzk2ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTIzOgotI2xpbmUgNTI3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX2dlbmV2ZSgtMSk7IH0KLSNsaW5lIDI4MDcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTQyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX2dlbmV2ZShjc3RhdGUsIC0xKTsgfQorI2xpbmUgMjgwMiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDEyNDoKLSNsaW5lIDUyOCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDU0MyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5yYmxrKSA9ICh5eXZzcFswXS5yYmxrKTsgfQotI2xpbmUgMjgxMyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyODA4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTI1OgotI2xpbmUgNTI5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTQ0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLnJibGspID0gKHl5dnNwWzBdLnJibGspOyB9Ci0jbGluZSAyODE5ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI4MTQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMjY6Ci0jbGluZSA1MzAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1NDUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwucmJsaykgPSAoeXl2c3BbMF0ucmJsayk7IH0KLSNsaW5lIDI4MjUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjgyMCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDEyNzoKLSNsaW5lIDUzMyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wZl9pZm5hbWUoKHl5dnNwWzBdLnMpKTsgfQotI2xpbmUgMjgzMSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1NDggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcGZfaWZuYW1lKGNzdGF0ZSwgKHl5dnNwWzBdLnMpKTsgfQorI2xpbmUgMjgyNiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDEyODoKLSNsaW5lIDUzNCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wZl9ydWxlc2V0KCh5eXZzcFswXS5zKSk7IH0KLSNsaW5lIDI4MzcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTQ5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3BmX3J1bGVzZXQoY3N0YXRlLCAoeXl2c3BbMF0ucykpOyB9CisjbGluZSAyODMyICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTI5OgotI2xpbmUgNTM1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3BmX3JucigoeXl2c3BbMF0uaSkpOyB9Ci0jbGluZSAyODQzICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDU1MCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wZl9ybnIoY3N0YXRlLCAoeXl2c3BbMF0uaSkpOyB9CisjbGluZSAyODM4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTMwOgotI2xpbmUgNTM2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3BmX3NybnIoKHl5dnNwWzBdLmkpKTsgfQotI2xpbmUgMjg0OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1NTEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcGZfc3Jucihjc3RhdGUsICh5eXZzcFswXS5pKSk7IH0KKyNsaW5lIDI4NDQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzE6Ci0jbGluZSA1MzcgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcGZfcmVhc29uKCh5eXZzcFswXS5pKSk7IH0KLSNsaW5lIDI4NTUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTUyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3BmX3JlYXNvbihjc3RhdGUsICh5eXZzcFswXS5pKSk7IH0KKyNsaW5lIDI4NTAgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzI6Ci0jbGluZSA1MzggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcGZfYWN0aW9uKCh5eXZzcFswXS5pKSk7IH0KLSNsaW5lIDI4NjEgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTUzICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3BmX2FjdGlvbihjc3RhdGUsICh5eXZzcFswXS5pKSk7IH0KKyNsaW5lIDI4NTYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzM6Ci0jbGluZSA1NDIgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcDgwMjExX3R5cGUoKHl5dnNwWy0yXS5pKSB8ICh5eXZzcFswXS5pKSwKKyNsaW5lIDU1NyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wODAyMTFfdHlwZShjc3RhdGUsICh5eXZzcFstMl0uaSkgfCAoeXl2c3BbMF0uaSksCiAJCQkJCUlFRUU4MDIxMV9GQzBfVFlQRV9NQVNLIHwKIAkJCQkJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spOwogCQkJCX0KLSNsaW5lIDI4NzAgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjg2NSAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDEzNDoKLSNsaW5lIDU0NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9wODAyMTFfdHlwZSgoeXl2c3BbMF0uaSksCisjbGluZSA1NjEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcDgwMjExX3R5cGUoY3N0YXRlLCAoeXl2c3BbMF0uaSksCiAJCQkJCUlFRUU4MDIxMV9GQzBfVFlQRV9NQVNLKTsKIAkJCQl9Ci0jbGluZSAyODc4ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI4NzMgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzU6Ci0jbGluZSA1NDkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcDgwMjExX3R5cGUoKHl5dnNwWzBdLmkpLAorI2xpbmUgNTY0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3A4MDIxMV90eXBlKGNzdGF0ZSwgKHl5dnNwWzBdLmkpLAogCQkJCQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyB8CiAJCQkJCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKTsKIAkJCQl9Ci0jbGluZSAyODg3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI4ODIgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzY6Ci0jbGluZSA1NTMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fcDgwMjExX2ZjZGlyKCh5eXZzcFswXS5pKSk7IH0KLSNsaW5lIDI4OTMgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTY4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX3A4MDIxMV9mY2Rpcihjc3RhdGUsICh5eXZzcFswXS5pKSk7IH0KKyNsaW5lIDI4ODggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzg6Ci0jbGluZSA1NTcgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA1NzIgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBzdHIydG9rKCh5eXZzcFswXS5zKSwgaWVlZTgwMjExX3R5cGVzKTsKIAkJCQkgIGlmICgoeXl2YWwuaSkgPT0gLTEpCi0JCQkJICAJYnBmX2Vycm9yKCJ1bmtub3duIDgwMi4xMSB0eXBlIG5hbWUiKTsKKwkJCQkgIAlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biA4MDIuMTEgdHlwZSBuYW1lIik7CiAJCQkJfQotI2xpbmUgMjkwMiAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyODk3ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTQwOgotI2xpbmUgNTY0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNTc5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgY29uc3Qgc3RydWN0IHRvayAqdHlwZXMgPSBOVUxMOwogCQkJCSAgaW50IGk7CiAJCQkJICBmb3IgKGkgPSAwOzsgaSsrKSB7CiAJCQkJICAJaWYgKGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW2ldLnRvayA9PSBOVUxMKSB7CiAJCQkJICAJCS8qIFJhbiBvdXQgb2YgdHlwZXMgKi8KLQkJCQkJCWJwZl9lcnJvcigidW5rbm93biA4MDIuMTEgdHlwZSIpOworCQkJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gODAyLjExIHR5cGUiKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWlmICgoeXl2c3BbKC0xKSAtICgxKV0uaSkgPT0gaWVlZTgwMjExX3R5cGVfc3VidHlwZXNbaV0udHlwZSkgewpAQCAtMjkxOSwxOCArMjkxNCwxOCBAQAogCiAJCQkJICAoeXl2YWwuaSkgPSBzdHIydG9rKCh5eXZzcFswXS5zKSwgdHlwZXMpOwogCQkJCSAgaWYgKCh5eXZhbC5pKSA9PSAtMSkKLQkJCQkJYnBmX2Vycm9yKCJ1bmtub3duIDgwMi4xMSBzdWJ0eXBlIG5hbWUiKTsKKwkJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gODAyLjExIHN1YnR5cGUgbmFtZSIpOwogCQkJCX0KLSNsaW5lIDI5MjUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjkyMCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE0MToKLSNsaW5lIDU4NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDU5OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7IGludCBpOwogCQkJCSAgZm9yIChpID0gMDs7IGkrKykgewogCQkJCSAgCWlmIChpZWVlODAyMTFfdHlwZV9zdWJ0eXBlc1tpXS50b2sgPT0gTlVMTCkgewogCQkJCSAgCQkvKiBSYW4gb3V0IG9mIHR5cGVzICovCi0JCQkJCQlicGZfZXJyb3IoInVua25vd24gODAyLjExIHR5cGUgbmFtZSIpOworCQkJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gODAyLjExIHR5cGUgbmFtZSIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJKHl5dmFsLmkpID0gc3RyMnRvaygoeXl2c3BbMF0ucyksIGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW2ldLnRvayk7CkBAIC0yOTQwLDQ4ICsyOTM1LDQ4IEBACiAJCQkJCX0KIAkJCQkgIH0KIAkJCQl9Ci0jbGluZSAyOTQ0ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI5MzkgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNDI6Ci0jbGluZSA2MDAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwucmJsaykgPSBnZW5fbGxjKCk7IH0KLSNsaW5lIDI5NTAgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjE1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLnJibGspID0gZ2VuX2xsYyhjc3RhdGUpOyB9CisjbGluZSAyOTQ1ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTQzOgotI2xpbmUgNjAxICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjE2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgaWYgKHBjYXBfc3RyY2FzZWNtcCgoeXl2c3BbMF0ucyksICJpIikgPT0gMCkKLQkJCQkJKHl5dmFsLnJibGspID0gZ2VuX2xsY19pKCk7CisJCQkJCSh5eXZhbC5yYmxrKSA9IGdlbl9sbGNfaShjc3RhdGUpOwogCQkJCSAgZWxzZSBpZiAocGNhcF9zdHJjYXNlY21wKCh5eXZzcFswXS5zKSwgInMiKSA9PSAwKQotCQkJCQkoeXl2YWwucmJsaykgPSBnZW5fbGxjX3MoKTsKKwkJCQkJKHl5dmFsLnJibGspID0gZ2VuX2xsY19zKGNzdGF0ZSk7CiAJCQkJICBlbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoKHl5dnNwWzBdLnMpLCAidSIpID09IDApCi0JCQkJCSh5eXZhbC5yYmxrKSA9IGdlbl9sbGNfdSgpOworCQkJCQkoeXl2YWwucmJsaykgPSBnZW5fbGxjX3UoY3N0YXRlKTsKIAkJCQkgIGVsc2UgewotCQkJCSAgCXVfaW50IHN1YnR5cGU7CisJCQkJCWludCBzdWJ0eXBlOwogCiAJCQkJCXN1YnR5cGUgPSBzdHIydG9rKCh5eXZzcFswXS5zKSwgbGxjX3Nfc3VidHlwZXMpOwogCQkJCQlpZiAoc3VidHlwZSAhPSAtMSkKLQkJCQkJCSh5eXZhbC5yYmxrKSA9IGdlbl9sbGNfc19zdWJ0eXBlKHN1YnR5cGUpOworCQkJCQkJKHl5dmFsLnJibGspID0gZ2VuX2xsY19zX3N1YnR5cGUoY3N0YXRlLCBzdWJ0eXBlKTsKIAkJCQkJZWxzZSB7CiAJCQkJCQlzdWJ0eXBlID0gc3RyMnRvaygoeXl2c3BbMF0ucyksIGxsY191X3N1YnR5cGVzKTsKIAkJCQkJCWlmIChzdWJ0eXBlID09IC0xKQotCQkJCQkgIAkJYnBmX2Vycm9yKCJ1bmtub3duIExMQyB0eXBlIG5hbWUgXCIlc1wiIiwgKHl5dnNwWzBdLnMpKTsKLQkJCQkJCSh5eXZhbC5yYmxrKSA9IGdlbl9sbGNfdV9zdWJ0eXBlKHN1YnR5cGUpOworCQkJCQkgIAkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gTExDIHR5cGUgbmFtZSBcIiVzXCIiLCAoeXl2c3BbMF0ucykpOworCQkJCQkJKHl5dmFsLnJibGspID0gZ2VuX2xsY191X3N1YnR5cGUoY3N0YXRlLCBzdWJ0eXBlKTsKIAkJCQkJfQogCQkJCSAgfQogCQkJCX0KLSNsaW5lIDI5NzUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMjk3MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE0NDoKLSNsaW5lIDYyMiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9sbGNfc19zdWJ0eXBlKExMQ19STlIpOyB9Ci0jbGluZSAyOTgxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDYzNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5yYmxrKSA9IGdlbl9sbGNfc19zdWJ0eXBlKGNzdGF0ZSwgTExDX1JOUik7IH0KKyNsaW5lIDI5NzYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNDY6Ci0jbGluZSA2MjYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2NDEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyBpZiAocGNhcF9zdHJjYXNlY21wKCh5eXZzcFswXS5zKSwgIm5vZHMiKSA9PSAwKQogCQkJCQkoeXl2YWwuaSkgPSBJRUVFODAyMTFfRkMxX0RJUl9OT0RTOwogCQkJCSAgZWxzZSBpZiAocGNhcF9zdHJjYXNlY21wKCh5eXZzcFswXS5zKSwgInRvZHMiKSA9PSAwKQpAQCAtMjk5MSw0MTQgKzI5ODYsNDE0IEBACiAJCQkJICBlbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoKHl5dnNwWzBdLnMpLCAiZHN0b2RzIikgPT0gMCkKIAkJCQkJKHl5dmFsLmkpID0gSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTOwogCQkJCSAgZWxzZQotCQkJCQlicGZfZXJyb3IoInVua25vd24gODAyLjExIGRpcmVjdGlvbiIpOworCQkJCQlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biA4MDIuMTEgZGlyZWN0aW9uIik7CiAJCQkJfQotI2xpbmUgMjk5NyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAyOTkyICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTQ3OgotI2xpbmUgNjM5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjU0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gKHl5dnNwWzBdLmkpOyB9Ci0jbGluZSAzMDAzICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDI5OTggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNDg6Ci0jbGluZSA2NDAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwuaSkgPSBwZnJlYXNvbl90b19udW0oKHl5dnNwWzBdLnMpKTsgfQotI2xpbmUgMzAwOSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2NTUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuaSkgPSBwZnJlYXNvbl90b19udW0oY3N0YXRlLCAoeXl2c3BbMF0ucykpOyB9CisjbGluZSAzMDA0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTQ5OgotI2xpbmUgNjQzICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmkpID0gcGZhY3Rpb25fdG9fbnVtKCh5eXZzcFswXS5zKSk7IH0KLSNsaW5lIDMwMTUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjU4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmkpID0gcGZhY3Rpb25fdG9fbnVtKGNzdGF0ZSwgKHl5dnNwWzBdLnMpKTsgfQorI2xpbmUgMzAxMCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE1MDoKLSNsaW5lIDY0NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY2MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEJQRl9KR1Q7IH0KLSNsaW5lIDMwMjEgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzAxNiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE1MToKLSNsaW5lIDY0NyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY2MiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEJQRl9KR0U7IH0KLSNsaW5lIDMwMjcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzAyMiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE1MjoKLSNsaW5lIDY0OCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY2MyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEJQRl9KRVE7IH0KLSNsaW5lIDMwMzMgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzAyOCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE1MzoKLSNsaW5lIDY1MCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY2NSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEJQRl9KR1Q7IH0KLSNsaW5lIDMwMzkgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzAzNCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE1NDoKLSNsaW5lIDY1MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY2NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEJQRl9KR0U7IH0KLSNsaW5lIDMwNDUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzA0MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE1NToKLSNsaW5lIDY1MiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY2NyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEJQRl9KRVE7IH0KLSNsaW5lIDMwNTEgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzA0NiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE1NjoKLSNsaW5lIDY1NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9sb2FkaSgoeXl2c3BbMF0uaSkpOyB9Ci0jbGluZSAzMDU3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY2OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9sb2FkaShjc3RhdGUsICh5eXZzcFswXS5pKSk7IH0KKyNsaW5lIDMwNTIgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNTg6Ci0jbGluZSA2NTcgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwuYSkgPSBnZW5fbG9hZCgoeXl2c3BbLTNdLmkpLCAoeXl2c3BbLTFdLmEpLCAxKTsgfQotI2xpbmUgMzA2MyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2NzIgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYSkgPSBnZW5fbG9hZChjc3RhdGUsICh5eXZzcFstM10uaSksICh5eXZzcFstMV0uYSksIDEpOyB9CisjbGluZSAzMDU4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTU5OgotI2xpbmUgNjU4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmEpID0gZ2VuX2xvYWQoKHl5dnNwWy01XS5pKSwgKHl5dnNwWy0zXS5hKSwgKHl5dnNwWy0xXS5pKSk7IH0KLSNsaW5lIDMwNjkgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjczICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmEpID0gZ2VuX2xvYWQoY3N0YXRlLCAoeXl2c3BbLTVdLmkpLCAoeXl2c3BbLTNdLmEpLCAoeXl2c3BbLTFdLmkpKTsgfQorI2xpbmUgMzA2NCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE2MDoKLSNsaW5lIDY1OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9BREQsICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSk7IH0KLSNsaW5lIDMwNzUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjc0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmEpID0gZ2VuX2FydGgoY3N0YXRlLCBCUEZfQURELCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSkpOyB9CisjbGluZSAzMDcwICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTYxOgotI2xpbmUgNjYwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmEpID0gZ2VuX2FydGgoQlBGX1NVQiwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQotI2xpbmUgMzA4MSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2NzUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChjc3RhdGUsIEJQRl9TVUIsICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSk7IH0KKyNsaW5lIDMwNzYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNjI6Ci0jbGluZSA2NjEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChCUEZfTVVMLCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSkpOyB9Ci0jbGluZSAzMDg3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY3NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKGNzdGF0ZSwgQlBGX01VTCwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQorI2xpbmUgMzA4MiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE2MzoKLSNsaW5lIDY2MiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9ESVYsICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSk7IH0KLSNsaW5lIDMwOTMgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjc3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmEpID0gZ2VuX2FydGgoY3N0YXRlLCBCUEZfRElWLCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSkpOyB9CisjbGluZSAzMDg4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTY0OgotI2xpbmUgNjYzICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmEpID0gZ2VuX2FydGgoQlBGX01PRCwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQotI2xpbmUgMzA5OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2NzggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChjc3RhdGUsIEJQRl9NT0QsICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSk7IH0KKyNsaW5lIDMwOTQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNjU6Ci0jbGluZSA2NjQgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChCUEZfQU5ELCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSkpOyB9Ci0jbGluZSAzMTA1ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY3OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKGNzdGF0ZSwgQlBGX0FORCwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQorI2xpbmUgMzEwMCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE2NjoKLSNsaW5lIDY2NSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9PUiwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQotI2xpbmUgMzExMSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2ODAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChjc3RhdGUsIEJQRl9PUiwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQorI2xpbmUgMzEwNiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE2NzoKLSNsaW5lIDY2NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKEJQRl9YT1IsICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSk7IH0KLSNsaW5lIDMxMTcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjgxICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmEpID0gZ2VuX2FydGgoY3N0YXRlLCBCUEZfWE9SLCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSkpOyB9CisjbGluZSAzMTEyICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTY4OgotI2xpbmUgNjY3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmEpID0gZ2VuX2FydGgoQlBGX0xTSCwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQotI2xpbmUgMzEyMyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2ODIgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChjc3RhdGUsIEJQRl9MU0gsICh5eXZzcFstMl0uYSksICh5eXZzcFswXS5hKSk7IH0KKyNsaW5lIDMxMTggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNjk6Ci0jbGluZSA2NjggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwuYSkgPSBnZW5fYXJ0aChCUEZfUlNILCAoeXl2c3BbLTJdLmEpLCAoeXl2c3BbMF0uYSkpOyB9Ci0jbGluZSAzMTI5ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY4MyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyAgICB7ICh5eXZhbC5hKSA9IGdlbl9hcnRoKGNzdGF0ZSwgQlBGX1JTSCwgKHl5dnNwWy0yXS5hKSwgKHl5dnNwWzBdLmEpKTsgfQorI2xpbmUgMzEyNCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE3MDoKLSNsaW5lIDY2OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9uZWcoKHl5dnNwWzBdLmEpKTsgfQotI2xpbmUgMzEzNSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2ODQgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYSkgPSBnZW5fbmVnKGNzdGF0ZSwgKHl5dnNwWzBdLmEpKTsgfQorI2xpbmUgMzEzMCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE3MToKLSNsaW5lIDY3MCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY4NSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5hKSA9ICh5eXZzcFstMV0uYSk7IH0KLSNsaW5lIDMxNDEgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzEzNiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE3MjoKLSNsaW5lIDY3MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5hKSA9IGdlbl9sb2FkbGVuKCk7IH0KLSNsaW5lIDMxNDcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjg2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmEpID0gZ2VuX2xvYWRsZW4oY3N0YXRlKTsgfQorI2xpbmUgMzE0MiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE3MzoKLSNsaW5lIDY3MyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY4OCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9ICcmJzsgfQotI2xpbmUgMzE1MyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMTQ4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTc0OgotI2xpbmUgNjc0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjg5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gJ3wnOyB9Ci0jbGluZSAzMTU5ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDMxNTQgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNzU6Ci0jbGluZSA2NzUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2OTAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSAnPCc7IH0KLSNsaW5lIDMxNjUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzE2MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE3NjoKLSNsaW5lIDY3NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY5MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9ICc+JzsgfQotI2xpbmUgMzE3MSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMTY2ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTc3OgotI2xpbmUgNjc3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNjkyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gJz0nOyB9Ci0jbGluZSAzMTc3ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDMxNzIgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNzk6Ci0jbGluZSA2ODAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2OTUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSAoeXl2c3BbLTFdLmkpOyB9Ci0jbGluZSAzMTgzICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDMxNzggImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxODA6Ci0jbGluZSA2ODIgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA2OTcgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBBX0xBTkU7IH0KLSNsaW5lIDMxODkgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzE4NCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE4MToKLSNsaW5lIDY4MyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY5OCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEFfTUVUQUM7CX0KLSNsaW5lIDMxOTUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzE5MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE4MjoKLSNsaW5lIDY4NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDY5OSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEFfQkNDOyB9Ci0jbGluZSAzMjAxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDMxOTYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxODM6Ci0jbGluZSA2ODUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA3MDAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBBX09BTUY0RUM7IH0KLSNsaW5lIDMyMDcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzIwMiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE4NDoKLSNsaW5lIDY4NiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDcwMSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEFfT0FNRjRTQzsgfQotI2xpbmUgMzIxMyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMjA4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTg1OgotI2xpbmUgNjg3ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzAyICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gQV9TQzsgfQotI2xpbmUgMzIxOSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMjE0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTg2OgotI2xpbmUgNjg4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzAzICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gQV9JTE1JQzsgfQotI2xpbmUgMzIyNSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMjIwICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTg3OgotI2xpbmUgNjkwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzA1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gQV9PQU07IH0KLSNsaW5lIDMyMzEgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzIyNiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE4ODoKLSNsaW5lIDY5MSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDcwNiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEFfT0FNRjQ7IH0KLSNsaW5lIDMyMzcgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzIzMiAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE4OToKLSNsaW5lIDY5MiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDcwNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IEFfQ09OTkVDVE1TRzsgfQotI2xpbmUgMzI0MyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMjM4ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTkwOgotI2xpbmUgNjkzICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzA4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gQV9NRVRBQ09OTkVDVDsgfQotI2xpbmUgMzI0OSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMjQ0ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTkxOgotI2xpbmUgNjk2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzExICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlID0gQV9WUEk7IH0KLSNsaW5lIDMyNTUgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzI1MCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE5MjoKLSNsaW5lIDY5NyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDcxMiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspLmF0bWZpZWxkdHlwZSA9IEFfVkNJOyB9Ci0jbGluZSAzMjYxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDMyNTYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAxOTQ6Ci0jbGluZSA3MDAgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCi0gICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX2F0bWZpZWxkX2NvZGUoKHl5dnNwWy0yXS5ibGspLmF0bWZpZWxkdHlwZSwgKGJwZl9pbnQzMikoeXl2c3BbMF0uaSksIChicGZfdV9pbnQzMikoeXl2c3BbLTFdLmkpLCAwKTsgfQotI2xpbmUgMzI2NyAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA3MTUgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX2F0bWZpZWxkX2NvZGUoY3N0YXRlLCAoeXl2c3BbLTJdLmJsaykuYXRtZmllbGR0eXBlLCAoYnBmX2ludDMyKSh5eXZzcFswXS5pKSwgKGJwZl91X2ludDMyKSh5eXZzcFstMV0uaSksIDApOyB9CisjbGluZSAzMjYyICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMTk1OgotI2xpbmUgNzAxICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwotICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9hdG1maWVsZF9jb2RlKCh5eXZzcFstMl0uYmxrKS5hdG1maWVsZHR5cGUsIChicGZfaW50MzIpKHl5dnNwWzBdLmkpLCAoYnBmX3VfaW50MzIpKHl5dnNwWy0xXS5pKSwgMSk7IH0KLSNsaW5lIDMyNzMgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzE2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworICAgIHsgKHl5dmFsLmJsaykuYiA9IGdlbl9hdG1maWVsZF9jb2RlKGNzdGF0ZSwgKHl5dnNwWy0yXS5ibGspLmF0bWZpZWxkdHlwZSwgKGJwZl9pbnQzMikoeXl2c3BbMF0uaSksIChicGZfdV9pbnQzMikoeXl2c3BbLTFdLmkpLCAxKTsgfQorI2xpbmUgMzI2OCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE5NjoKLSNsaW5lIDcwMiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDcxNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspLmIgPSAoeXl2c3BbLTFdLmJsaykuYjsgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KLSNsaW5lIDMyNzkgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzI3NCAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE5NzoKLSNsaW5lIDcwNCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDcxOSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7CiAJKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlID0gKHl5dnNwWy0xXS5ibGspLmF0bWZpZWxkdHlwZTsKIAlpZiAoKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlID09IEFfVlBJIHx8CiAJICAgICh5eXZhbC5ibGspLmF0bWZpZWxkdHlwZSA9PSBBX1ZDSSkKLQkJKHl5dmFsLmJsaykuYiA9IGdlbl9hdG1maWVsZF9jb2RlKCh5eXZhbC5ibGspLmF0bWZpZWxkdHlwZSwgKGJwZl9pbnQzMikgKHl5dnNwWzBdLmkpLCBCUEZfSkVRLCAwKTsKKwkJKHl5dmFsLmJsaykuYiA9IGdlbl9hdG1maWVsZF9jb2RlKGNzdGF0ZSwgKHl5dmFsLmJsaykuYXRtZmllbGR0eXBlLCAoYnBmX2ludDMyKSAoeXl2c3BbMF0uaSksIEJQRl9KRVEsIDApOwogCX0KLSNsaW5lIDMyOTAgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzI4NSAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDE5OToKLSNsaW5lIDcxMiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDcyNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7IGdlbl9vcigoeXl2c3BbLTJdLmJsaykuYiwgKHl5dnNwWzBdLmJsaykuYik7ICh5eXZhbC5ibGspID0gKHl5dnNwWzBdLmJsayk7IH0KLSNsaW5lIDMyOTYgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzI5MSAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDIwMDoKLSNsaW5lIDcxNSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDczMCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5pKSA9IE1fRklTVTsgfQotI2xpbmUgMzMwMiAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMjk3ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMjAxOgotI2xpbmUgNzE2ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzMxICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gTV9MU1NVOyB9Ci0jbGluZSAzMzA4ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDMzMDMgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAyMDI6Ci0jbGluZSA3MTcgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA3MzIgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuaSkgPSBNX01TVTsgfQotI2xpbmUgMzMxNCAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMzA5ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMjAzOgotI2xpbmUgNzE4ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzMzICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gTUhfRklTVTsgfQotI2xpbmUgMzMyMCAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMzE1ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMjA0OgotI2xpbmUgNzE5ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzM0ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gTUhfTFNTVTsgfQotI2xpbmUgMzMyNiAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMzIxICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMjA1OgotI2xpbmUgNzIwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzM1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmkpID0gTUhfTVNVOyB9Ci0jbGluZSAzMzMyICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDMzMjcgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAyMDY6Ci0jbGluZSA3MjMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA3MzggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuYmxrKS5tdHAzZmllbGR0eXBlID0gTV9TSU87IH0KLSNsaW5lIDMzMzggInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzMzMyAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDIwNzoKLSNsaW5lIDcyNCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDczOSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSBNX09QQzsgfQotI2xpbmUgMzM0NCAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzMzM5ICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIGJyZWFrOwogCiAgIGNhc2UgMjA4OgotI2xpbmUgNzI1ICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgNzQwICJncmFtbWFyLnkiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgIHsgKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9IE1fRFBDOyB9Ci0jbGluZSAzMzUwICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDMzNDUgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAyMDk6Ci0jbGluZSA3MjYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA3NDEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyAoeXl2YWwuYmxrKS5tdHAzZmllbGR0eXBlID0gTV9TTFM7IH0KLSNsaW5lIDMzNTYgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzM1MSAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDIxMDoKLSNsaW5lIDcyNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDc0MiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSBNSF9TSU87IH0KLSNsaW5lIDMzNjIgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzM1NyAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDIxMToKLSNsaW5lIDcyOCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDc0MyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSBNSF9PUEM7IH0KLSNsaW5lIDMzNjggInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzM2MyAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDIxMjoKLSNsaW5lIDcyOSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDc0NCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSBNSF9EUEM7IH0KLSNsaW5lIDMzNzQgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzM2OSAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDIxMzoKLSNsaW5lIDczMCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDc0NSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPSBNSF9TTFM7IH0KLSNsaW5lIDMzODAgInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzM3NSAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDIxNToKLSNsaW5lIDczMyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoKHl5dnNwWy0yXS5ibGspLm10cDNmaWVsZHR5cGUsICh1X2ludCkoeXl2c3BbMF0uaSksICh1X2ludCkoeXl2c3BbLTFdLmkpLCAwKTsgfQotI2xpbmUgMzM4NiAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA3NDggImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX210cDNmaWVsZF9jb2RlKGNzdGF0ZSwgKHl5dnNwWy0yXS5ibGspLm10cDNmaWVsZHR5cGUsICh1X2ludCkoeXl2c3BbMF0uaSksICh1X2ludCkoeXl2c3BbLTFdLmkpLCAwKTsgfQorI2xpbmUgMzM4MSAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDIxNjoKLSNsaW5lIDczNCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KLSAgICB7ICh5eXZhbC5ibGspLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoKHl5dnNwWy0yXS5ibGspLm10cDNmaWVsZHR5cGUsICh1X2ludCkoeXl2c3BbMF0uaSksICh1X2ludCkoeXl2c3BbLTFdLmkpLCAxKTsgfQotI2xpbmUgMzM5MiAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA3NDkgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisgICAgeyAoeXl2YWwuYmxrKS5iID0gZ2VuX210cDNmaWVsZF9jb2RlKGNzdGF0ZSwgKHl5dnNwWy0yXS5ibGspLm10cDNmaWVsZHR5cGUsICh1X2ludCkoeXl2c3BbMF0uaSksICh1X2ludCkoeXl2c3BbLTFdLmkpLCAxKTsgfQorI2xpbmUgMzM4NyAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDIxNzoKLSNsaW5lIDczNSAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDc1MCAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7ICh5eXZhbC5ibGspLmIgPSAoeXl2c3BbLTFdLmJsaykuYjsgKHl5dmFsLmJsaykucSA9IHFlcnI7IH0KLSNsaW5lIDMzOTggInkudGFiLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLworI2xpbmUgMzM5MyAiZ3JhbW1hci5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICBicmVhazsKIAogICBjYXNlIDIxODoKLSNsaW5lIDczNyAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDc1MiAiZ3JhbW1hci55IiAvKiB5YWNjLmM6MTY0NiAgKi8KICAgICB7CiAJKHl5dmFsLmJsaykubXRwM2ZpZWxkdHlwZSA9ICh5eXZzcFstMV0uYmxrKS5tdHAzZmllbGR0eXBlOwogCWlmICgoeXl2YWwuYmxrKS5tdHAzZmllbGR0eXBlID09IE1fU0lPIHx8CkBAIC0zNDA5LDE5ICszNDA0LDE5IEBACiAJICAgICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPT0gTUhfT1BDIHx8CiAJICAgICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPT0gTUhfRFBDIHx8CiAJICAgICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUgPT0gTUhfU0xTKQotCQkoeXl2YWwuYmxrKS5iID0gZ2VuX210cDNmaWVsZF9jb2RlKCh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUsICh1X2ludCkgKHl5dnNwWzBdLmkpLCBCUEZfSkVRLCAwKTsKKwkJKHl5dmFsLmJsaykuYiA9IGdlbl9tdHAzZmllbGRfY29kZShjc3RhdGUsICh5eXZhbC5ibGspLm10cDNmaWVsZHR5cGUsICh1X2ludCkgKHl5dnNwWzBdLmkpLCBCUEZfSkVRLCAwKTsKIAl9Ci0jbGluZSAzNDE1ICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDM0MTAgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKICAgY2FzZSAyMjA6Ci0jbGluZSA3NTEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSA3NjYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgeyBnZW5fb3IoKHl5dnNwWy0yXS5ibGspLmIsICh5eXZzcFswXS5ibGspLmIpOyAoeXl2YWwuYmxrKSA9ICh5eXZzcFswXS5ibGspOyB9Ci0jbGluZSAzNDIxICJ5LnRhYi5jIiAvKiB5YWNjLmM6MTY0NiAgKi8KKyNsaW5lIDM0MTYgImdyYW1tYXIuYyIgLyogeWFjYy5jOjE2NDYgICovCiAgICAgYnJlYWs7CiAKIAotI2xpbmUgMzQyNSAieS50YWIuYyIgLyogeWFjYy5jOjE2NDYgICovCisjbGluZSAzNDIwICJncmFtbWFyLmMiIC8qIHlhY2MuYzoxNjQ2ICAqLwogICAgICAgZGVmYXVsdDogYnJlYWs7CiAgICAgfQogICAvKiBVc2VyIHNlbWFudGljIGFjdGlvbnMgc29tZXRpbWVzIGFsdGVyIHl5Y2hhciwgYW5kIHRoYXQgcmVxdWlyZXMKQEAgLTM0NzEsNyArMzQ2Niw3IEBACiAgICAgewogICAgICAgKyt5eW5lcnJzOwogI2lmICEgWVlFUlJPUl9WRVJCT1NFCi0gICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKKyAgICAgIHl5ZXJyb3IgKHl5c2Nhbm5lciwgY3N0YXRlLCBZWV8oInN5bnRheCBlcnJvciIpKTsKICNlbHNlCiAjIGRlZmluZSBZWVNZTlRBWF9FUlJPUiB5eXN5bnRheF9lcnJvciAoJnl5bXNnX2FsbG9jLCAmeXltc2csIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eXNzcCwgeXl0b2tlbikKQEAgLTM0OTgsNyArMzQ5Myw3IEBACiAgICAgICAgICAgICAgICAgeXltc2dwID0geXltc2c7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgIHl5ZXJyb3IgKHl5bXNncCk7CisgICAgICAgIHl5ZXJyb3IgKHl5c2Nhbm5lciwgY3N0YXRlLCB5eW1zZ3ApOwogICAgICAgICBpZiAoeXlzeW50YXhfZXJyb3Jfc3RhdHVzID09IDIpCiAgICAgICAgICAgZ290byB5eWV4aGF1c3RlZGxhYjsKICAgICAgIH0KQEAgLTM1MjIsNyArMzUxNyw3IEBACiAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICB5eWRlc3RydWN0ICgiRXJyb3I6IGRpc2NhcmRpbmciLAotICAgICAgICAgICAgICAgICAgICAgIHl5dG9rZW4sICZ5eWx2YWwpOworICAgICAgICAgICAgICAgICAgICAgIHl5dG9rZW4sICZ5eWx2YWwsIHl5c2Nhbm5lciwgY3N0YXRlKTsKICAgICAgICAgICB5eWNoYXIgPSBZWUVNUFRZOwogICAgICAgICB9CiAgICAgfQpAQCAtMzU3OCw3ICszNTczLDcgQEAKIAogCiAgICAgICB5eWRlc3RydWN0ICgiRXJyb3I6IHBvcHBpbmciLAotICAgICAgICAgICAgICAgICAgeXlzdG9zW3l5c3RhdGVdLCB5eXZzcCk7CisgICAgICAgICAgICAgICAgICB5eXN0b3NbeXlzdGF0ZV0sIHl5dnNwLCB5eXNjYW5uZXIsIGNzdGF0ZSk7CiAgICAgICBZWVBPUFNUQUNLICgxKTsKICAgICAgIHl5c3RhdGUgPSAqeXlzc3A7CiAgICAgICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOwpAQCAtMzYxNSw3ICszNjEwLDcgQEAKIHwgeXlleGhhdXN0ZWRsYWIgLS0gbWVtb3J5IGV4aGF1c3Rpb24gY29tZXMgaGVyZS4gIHwKIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHl5ZXhoYXVzdGVkbGFiOgotICB5eWVycm9yIChZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSk7CisgIHl5ZXJyb3IgKHl5c2Nhbm5lciwgY3N0YXRlLCBZWV8oIm1lbW9yeSBleGhhdXN0ZWQiKSk7CiAgIHl5cmVzdWx0ID0gMjsKICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KICNlbmRpZgpAQCAtMzYyNyw3ICszNjIyLDcgQEAKICAgICAgICAgIHVzZXIgc2VtYW50aWMgYWN0aW9ucyBmb3Igd2h5IHRoaXMgaXMgbmVjZXNzYXJ5LiAgKi8KICAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKICAgICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBkaXNjYXJkaW5nIGxvb2thaGVhZCIsCi0gICAgICAgICAgICAgICAgICB5eXRva2VuLCAmeXlsdmFsKTsKKyAgICAgICAgICAgICAgICAgIHl5dG9rZW4sICZ5eWx2YWwsIHl5c2Nhbm5lciwgY3N0YXRlKTsKICAgICB9CiAgIC8qIERvIG5vdCByZWNsYWltIHRoZSBzeW1ib2xzIG9mIHRoZSBydWxlIHdob3NlIGFjdGlvbiB0cmlnZ2VyZWQKICAgICAgdGhpcyBZWUFCT1JUIG9yIFlZQUNDRVBULiAgKi8KQEAgLTM2MzYsNyArMzYzMSw3IEBACiAgIHdoaWxlICh5eXNzcCAhPSB5eXNzKQogICAgIHsKICAgICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBwb3BwaW5nIiwKLSAgICAgICAgICAgICAgICAgIHl5c3Rvc1sqeXlzc3BdLCB5eXZzcCk7CisgICAgICAgICAgICAgICAgICB5eXN0b3NbKnl5c3NwXSwgeXl2c3AsIHl5c2Nhbm5lciwgY3N0YXRlKTsKICAgICAgIFlZUE9QU1RBQ0sgKDEpOwogICAgIH0KICNpZm5kZWYgeXlvdmVyZmxvdwpAQCAtMzY0OSw1ICszNjQ0LDUgQEAKICNlbmRpZgogICByZXR1cm4geXlyZXN1bHQ7CiB9Ci0jbGluZSA3NTMgImdyYW1tYXIueSIgLyogeWFjYy5jOjE5MDYgICovCisjbGluZSA3NjggImdyYW1tYXIueSIgLyogeWFjYy5jOjE5MDYgICovCiAKZGlmZiAtLWdpdCBhL3Rva2RlZnMuaCBiL2dyYW1tYXIuaApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSB0b2tkZWZzLmgKcmVuYW1lIHRvIGdyYW1tYXIuaAppbmRleCBkYTlmZDkxLi4yYTQ5NWEwIDEwMDY0NAotLS0gYS90b2tkZWZzLmgKKysrIGIvZ3JhbW1hci5oCkBAIC0zMCw4ICszMCw4IEBACiAgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluCiAgICB2ZXJzaW9uIDIuMiBvZiBCaXNvbi4gICovCiAKLSNpZm5kZWYgWVlfUENBUF9ZX1RBQl9IX0lOQ0xVREVECi0jIGRlZmluZSBZWV9QQ0FQX1lfVEFCX0hfSU5DTFVERUQKKyNpZm5kZWYgWVlfUENBUF9HUkFNTUFSX0hfSU5DTFVERUQKKyMgZGVmaW5lIFlZX1BDQVBfR1JBTU1BUl9IX0lOQ0xVREVECiAvKiBEZWJ1ZyB0cmFjZXMuICAqLwogI2lmbmRlZiBZWURFQlVHCiAjIGRlZmluZSBZWURFQlVHIDAKQEAgLTI5Miw3ICsyOTIsNyBAQAogdHlwZWRlZiB1bmlvbiBZWVNUWVBFIFlZU1RZUEU7CiB1bmlvbiBZWVNUWVBFCiB7Ci0jbGluZSAyNTYgImdyYW1tYXIueSIgLyogeWFjYy5jOjE5MDkgICovCisjbGluZSAyNzEgImdyYW1tYXIueSIgLyogeWFjYy5jOjE5MDkgICovCiAKIAlpbnQgaTsKIAlicGZfdV9pbnQzMiBoOwpAQCAtMzA4LDE1ICszMDgsMTQgQEAKIAl9IGJsazsKIAlzdHJ1Y3QgYmxvY2sgKnJibGs7CiAKLSNsaW5lIDMxMiAieS50YWIuaCIgLyogeWFjYy5jOjE5MDkgICovCisjbGluZSAzMTIgImdyYW1tYXIuaCIgLyogeWFjYy5jOjE5MDkgICovCiB9OwogIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKICMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQogI2VuZGlmCiAKIAotZXh0ZXJuIFlZU1RZUEUgcGNhcF9sdmFsOwogCi1pbnQgcGNhcF9wYXJzZSAodm9pZCk7CitpbnQgcGNhcF9wYXJzZSAodm9pZCAqeXlzY2FubmVyLCBjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUpOwogCi0jZW5kaWYgLyogIVlZX1BDQVBfWV9UQUJfSF9JTkNMVURFRCAgKi8KKyNlbmRpZiAvKiAhWVlfUENBUF9HUkFNTUFSX0hfSU5DTFVERUQgICovCmRpZmYgLS1naXQgYS9ncmFtbWFyLnkgYi9ncmFtbWFyLnkKaW5kZXggOTk1YTUxNC4uOGUxZDQwYSAxMDA2NDQKLS0tIGEvZ3JhbW1hci55CisrKyBiL2dyYW1tYXIueQpAQCAtMSwzICsxLDI4IEBACisvKgorICogV2Ugd2FudCBhIHJlZW50cmFudCBwYXJzZXIuCisgKi8KKyVwdXJlLXBhcnNlcgorCisvKgorICogV2UgYWxzbyB3YW50IGEgcmVlbnRyYW50IHNjYW5uZXIsIHNvIHdlIGhhdmUgdG8gcGFzcyB0aGUKKyAqIGhhbmRsZSBmb3IgdGhlIHJlZW50cmFudCBzY2FubmVyIHRvIHRoZSBwYXJzZXIsIGFuZCB0aGUKKyAqIHBhcnNlciBoYXMgdG8gcGFzcyBpdCB0byB0aGUgbGV4aWNhbCBhbmFseXplci4KKyAqCisgKiBXZSB1c2Ugdm9pZCAqIHJhdGhlciB0aGFuIHl5c2Nhbl90IGJlY2F1c2UsIGF0IGxlYXN0IHdpdGggc29tZQorICogdmVyc2lvbnMgb2YgRmxleCBhbmQgQmlzb24sIGlmIHlvdSB1c2UgeXlzY2FuX3QgaW4gJXBhcnNlLXBhcmFtIGFuZAorICogJWxleC1wYXJhbSwgeW91IGhhdmUgdG8gaW5jbHVkZSBzY2FubmVyLmggYmVmb3JlIGdyYW1tYXIuaCB0byBnZXQKKyAqIHl5c2Nhbl90IGRlY2xhcmVkLCBhbmQgeW91IGhhdmUgdG8gaW5jbHVkZSBncmFtbWFyLmggYmVmb3JlIHNjYW5uZXIuaAorICogdG8gZ2V0IFlZU1RZUEUgZGVjbGFyZWQuICBVc2luZyB2b2lkICogYnJlYWtzIHRoZSBjeWNsZTsgdGhlIEZsZXgKKyAqIGRvY3VtZW50YXRpb24gc2F5cyB5eXNjYW5fdCBpcyBqdXN0IGEgdm9pZCAqLgorICovCislcGFyc2UtcGFyYW0gICB7dm9pZCAqeXlzY2FubmVyfQorJWxleC1wYXJhbSAgIHt2b2lkICp5eXNjYW5uZXJ9CisKKy8qCisgKiBBbmQgd2UgbmVlZCB0byBwYXNzIHRoZSBjb21waWxlciBzdGF0ZSB0byB0aGUgc2Nhbm5lci4KKyAqLworJXBhcnNlLXBhcmFtIHtjb21waWxlcl9zdGF0ZV90ICpjc3RhdGV9CisKICV7CiAvKgogICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CkBAIC0yNSwxNiArNTAsMTYgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCi0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgotI2Vsc2UgLyogV0lOMzIgKi8KKyNlbHNlIC8qIF9XSU4zMiAqLwogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIF9XSU4zMiAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKLSNpZm5kZWYgV0lOMzIKKyNpZm5kZWYgX1dJTjMyCiAjaWYgX19TVERDX18KIHN0cnVjdCBtYnVmOwogc3RydWN0IHJ0ZW50cnk7CkBAIC00MiwxMyArNjcsMTYgQEAKIAogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIF9XSU4zMiAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAogI2luY2x1ZGUgInBjYXAtaW50LmgiCiAKICNpbmNsdWRlICJnZW5jb2RlLmgiCisjaW5jbHVkZSAiZ3JhbW1hci5oIgorI2luY2x1ZGUgInNjYW5uZXIuaCIKKwogI2lmZGVmIEhBVkVfTkVUX1BGVkFSX0gKICNpbmNsdWRlIDxuZXQvaWYuaD4KICNpbmNsdWRlIDxuZXQvcGZ2YXIuaD4KQEAgLTE2OSwzMSArMTk3LDE4IEBACiAJcmV0dXJuICgtMSk7CiB9CiAKLWludCBuX2Vycm9ycyA9IDA7Ci0KIHN0YXRpYyBzdHJ1Y3QgcXVhbCBxZXJyID0geyBRX1VOREVGLCBRX1VOREVGLCBRX1VOREVGLCBRX1VOREVGIH07CiAKIHN0YXRpYyB2b2lkCi15eWVycm9yKGNvbnN0IGNoYXIgKm1zZykKK3l5ZXJyb3Iodm9pZCAqeXlzY2FubmVyLCBjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIGNvbnN0IGNoYXIgKm1zZykKIHsKLQkrK25fZXJyb3JzOwotCWJwZl9lcnJvcigiJXMiLCBtc2cpOworCWJwZl9zeW50YXhfZXJyb3IoY3N0YXRlLCBtc2cpOwogCS8qIE5PVFJFQUNIRUQgKi8KIH0KIAotI2lmZGVmIE5FRURfWVlQQVJTRV9XUkFQUEVSCi1pbnQgeXlwYXJzZSh2b2lkKTsKLQotaW50Ci1wY2FwX3BhcnNlKCkKLXsKLQlyZXR1cm4gKHl5cGFyc2UoKSk7Ci19Ci0jZW5kaWYKLQogI2lmZGVmIEhBVkVfTkVUX1BGVkFSX0gKIHN0YXRpYyBpbnQKLXBmcmVhc29uX3RvX251bShjb25zdCBjaGFyICpyZWFzb24pCitwZnJlYXNvbl90b19udW0oY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBjb25zdCBjaGFyICpyZWFzb24pCiB7CiAJY29uc3QgY2hhciAqcmVhc29uc1tdID0gUEZSRVNfTkFNRVM7CiAJaW50IGk7CkBAIC0yMDIsMTIgKzIxNywxMiBAQAogCQlpZiAocGNhcF9zdHJjYXNlY21wKHJlYXNvbiwgcmVhc29uc1tpXSkgPT0gMCkKIAkJCXJldHVybiAoaSk7CiAJfQotCWJwZl9lcnJvcigidW5rbm93biBQRiByZWFzb24iKTsKKwlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biBQRiByZWFzb24iKTsKIAkvKk5PVFJFQUNIRUQqLwogfQogCiBzdGF0aWMgaW50Ci1wZmFjdGlvbl90b19udW0oY29uc3QgY2hhciAqYWN0aW9uKQorcGZhY3Rpb25fdG9fbnVtKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgY2hhciAqYWN0aW9uKQogewogCWlmIChwY2FwX3N0cmNhc2VjbXAoYWN0aW9uLCAicGFzcyIpID09IDAgfHwKIAkgICAgcGNhcF9zdHJjYXNlY21wKGFjdGlvbiwgImFjY2VwdCIpID09IDApCkBAIC0yMjYsMTUgKzI0MSwxNSBAQAogCQlyZXR1cm4gKFBGX05PUkRSKTsKICNlbmRpZgogCWVsc2UgewotCQlicGZfZXJyb3IoInVua25vd24gUEYgYWN0aW9uIik7CisJCWJwZl9lcnJvcihjc3RhdGUsICJ1bmtub3duIFBGIGFjdGlvbiIpOwogCQkvKk5PVFJFQUNIRUQqLwogCX0KIH0KICNlbHNlIC8qICFIQVZFX05FVF9QRlZBUl9IICovCiBzdGF0aWMgaW50Ci1wZnJlYXNvbl90b19udW0oY29uc3QgY2hhciAqcmVhc29uKQorcGZyZWFzb25fdG9fbnVtKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgY2hhciAqcmVhc29uKQogewotCWJwZl9lcnJvcigibGlicGNhcCB3YXMgY29tcGlsZWQgb24gYSBtYWNoaW5lIHdpdGhvdXQgcGYgc3VwcG9ydCIpOworCWJwZl9lcnJvcihjc3RhdGUsICJsaWJwY2FwIHdhcyBjb21waWxlZCBvbiBhIG1hY2hpbmUgd2l0aG91dCBwZiBzdXBwb3J0Iik7CiAJLypOT1RSRUFDSEVEKi8KIAogCS8qIHRoaXMgaXMgdG8gbWFrZSB0aGUgVkMgY29tcGlsZXIgaGFwcHkgKi8KQEAgLTI0Miw5ICsyNTcsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1wZmFjdGlvbl90b19udW0oY29uc3QgY2hhciAqYWN0aW9uKQorcGZhY3Rpb25fdG9fbnVtKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29uc3QgY2hhciAqYWN0aW9uKQogewotCWJwZl9lcnJvcigibGlicGNhcCB3YXMgY29tcGlsZWQgb24gYSBtYWNoaW5lIHdpdGhvdXQgcGYgc3VwcG9ydCIpOworCWJwZl9lcnJvcihjc3RhdGUsICJsaWJwY2FwIHdhcyBjb21waWxlZCBvbiBhIG1hY2hpbmUgd2l0aG91dCBwZiBzdXBwb3J0Iik7CiAJLypOT1RSRUFDSEVEKi8KIAogCS8qIHRoaXMgaXMgdG8gbWFrZSB0aGUgVkMgY29tcGlsZXIgaGFwcHkgKi8KQEAgLTMyOSw3ICszNDQsNyBAQAogJSUKIHByb2c6CSAgbnVsbCBleHByCiB7Ci0JZmluaXNoX3BhcnNlKCQyLmIpOworCWZpbmlzaF9wYXJzZShjc3RhdGUsICQyLmIpOwogfQogCXwgbnVsbAogCTsKQEAgLTM0Niw0OCArMzYxLDQ4IEBACiBvcjoJICBPUgkJCXsgJCQgPSAkPGJsaz4wOyB9CiAJOwogaWQ6CSAgbmlkCi0JfCBwbnVtCQkJeyAkJC5iID0gZ2VuX25jb2RlKE5VTEwsIChicGZfdV9pbnQzMikkMSwKKwl8IHBudW0JCQl7ICQkLmIgPSBnZW5fbmNvZGUoY3N0YXRlLCBOVUxMLCAoYnBmX3VfaW50MzIpJDEsCiAJCQkJCQkgICAkJC5xID0gJDxibGs+MC5xKTsgfQogCXwgcGFyZW4gcGlkICcpJwkJeyAkJCA9ICQyOyB9CiAJOwotbmlkOgkgIElECQkJeyAkJC5iID0gZ2VuX3Njb2RlKCQxLCAkJC5xID0gJDxibGs+MC5xKTsgfQotCXwgSElEICcvJyBOVU0JCXsgJCQuYiA9IGdlbl9tY29kZSgkMSwgTlVMTCwgJDMsCituaWQ6CSAgSUQJCQl7ICQkLmIgPSBnZW5fc2NvZGUoY3N0YXRlLCAkMSwgJCQucSA9ICQ8YmxrPjAucSk7IH0KKwl8IEhJRCAnLycgTlVNCQl7ICQkLmIgPSBnZW5fbWNvZGUoY3N0YXRlLCAkMSwgTlVMTCwgJDMsCiAJCQkJICAgICQkLnEgPSAkPGJsaz4wLnEpOyB9Ci0JfCBISUQgTkVUTUFTSyBISUQJeyAkJC5iID0gZ2VuX21jb2RlKCQxLCAkMywgMCwKKwl8IEhJRCBORVRNQVNLIEhJRAl7ICQkLmIgPSBnZW5fbWNvZGUoY3N0YXRlLCAkMSwgJDMsIDAsCiAJCQkJICAgICQkLnEgPSAkPGJsaz4wLnEpOyB9CiAJfCBISUQJCQl7CiAJCQkJICAvKiBEZWNpZGUgaG93IHRvIHBhcnNlIEhJRCBiYXNlZCBvbiBwcm90byAqLwogCQkJCSAgJCQucSA9ICQ8YmxrPjAucTsKIAkJCQkgIGlmICgkJC5xLmFkZHIgPT0gUV9QT1JUKQotCQkJCSAgCWJwZl9lcnJvcigiJ3BvcnQnIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXAgaG9zdCIpOworCQkJCSAgCWJwZl9lcnJvcihjc3RhdGUsICIncG9ydCcgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CiAJCQkJICBlbHNlIGlmICgkJC5xLmFkZHIgPT0gUV9QT1JUUkFOR0UpCi0JCQkJICAJYnBmX2Vycm9yKCIncG9ydHJhbmdlJyBtb2RpZmllciBhcHBsaWVkIHRvIGlwIGhvc3QiKTsKKwkJCQkgIAlicGZfZXJyb3IoY3N0YXRlLCAiJ3BvcnRyYW5nZScgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CiAJCQkJICBlbHNlIGlmICgkJC5xLmFkZHIgPT0gUV9QUk9UTykKLQkJCQkgIAlicGZfZXJyb3IoIidwcm90bycgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CisJCQkJICAJYnBmX2Vycm9yKGNzdGF0ZSwgIidwcm90bycgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CiAJCQkJICBlbHNlIGlmICgkJC5xLmFkZHIgPT0gUV9QUk9UT0NIQUlOKQotCQkJCSAgCWJwZl9lcnJvcigiJ3Byb3RvY2hhaW4nIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXAgaG9zdCIpOwotCQkJCSAgJCQuYiA9IGdlbl9uY29kZSgkMSwgMCwgJCQucSk7CisJCQkJICAJYnBmX2Vycm9yKGNzdGF0ZSwgIidwcm90b2NoYWluJyBtb2RpZmllciBhcHBsaWVkIHRvIGlwIGhvc3QiKTsKKwkJCQkgICQkLmIgPSBnZW5fbmNvZGUoY3N0YXRlLCAkMSwgMCwgJCQucSk7CiAJCQkJfQogCXwgSElENiAnLycgTlVNCQl7CiAjaWZkZWYgSU5FVDYKLQkJCQkgICQkLmIgPSBnZW5fbWNvZGU2KCQxLCBOVUxMLCAkMywKKwkJCQkgICQkLmIgPSBnZW5fbWNvZGU2KGNzdGF0ZSwgJDEsIE5VTEwsICQzLAogCQkJCSAgICAkJC5xID0gJDxibGs+MC5xKTsKICNlbHNlCi0JCQkJICBicGZfZXJyb3IoIidpcDZhZGRyL3ByZWZpeGxlbicgbm90IHN1cHBvcnRlZCAiCisJCQkJICBicGZfZXJyb3IoY3N0YXRlLCAiJ2lwNmFkZHIvcHJlZml4bGVuJyBub3Qgc3VwcG9ydGVkICIKIAkJCQkJImluIHRoaXMgY29uZmlndXJhdGlvbiIpOwogI2VuZGlmIC8qSU5FVDYqLwogCQkJCX0KIAl8IEhJRDYJCQl7CiAjaWZkZWYgSU5FVDYKLQkJCQkgICQkLmIgPSBnZW5fbWNvZGU2KCQxLCAwLCAxMjgsCisJCQkJICAkJC5iID0gZ2VuX21jb2RlNihjc3RhdGUsICQxLCAwLCAxMjgsCiAJCQkJICAgICQkLnEgPSAkPGJsaz4wLnEpOwogI2Vsc2UKLQkJCQkgIGJwZl9lcnJvcigiJ2lwNmFkZHInIG5vdCBzdXBwb3J0ZWQgIgorCQkJCSAgYnBmX2Vycm9yKGNzdGF0ZSwgIidpcDZhZGRyJyBub3Qgc3VwcG9ydGVkICIKIAkJCQkJImluIHRoaXMgY29uZmlndXJhdGlvbiIpOwogI2VuZGlmIC8qSU5FVDYqLwogCQkJCX0KIAl8IEVJRAkJCXsKLQkJCQkgICQkLmIgPSBnZW5fZWNvZGUoJDEsICQkLnEgPSAkPGJsaz4wLnEpOworCQkJCSAgJCQuYiA9IGdlbl9lY29kZShjc3RhdGUsICQxLCAkJC5xID0gJDxibGs+MC5xKTsKIAkJCQkgIC8qCiAJCQkJICAgKiAkMSB3YXMgYWxsb2NhdGVkIGJ5ICJwY2FwX2V0aGVyX2F0b24oKSIsCiAJCQkJICAgKiBzbyB3ZSBtdXN0IGZyZWUgaXQgbm93IHRoYXQgd2UncmUgZG9uZQpAQCAtMzk2LDcgKzQxMSw3IEBACiAJCQkJICBmcmVlKCQxKTsKIAkJCQl9CiAJfCBBSUQJCQl7Ci0JCQkJICAkJC5iID0gZ2VuX2Fjb2RlKCQxLCAkJC5xID0gJDxibGs+MC5xKTsKKwkJCQkgICQkLmIgPSBnZW5fYWNvZGUoY3N0YXRlLCAkMSwgJCQucSA9ICQ8YmxrPjAucSk7CiAJCQkJICAvKgogCQkJCSAgICogJDEgd2FzIGFsbG9jYXRlZCBieSAicGNhcF9ldGhlcl9hdG9uKCkiLAogCQkJCSAgICogc28gd2UgbXVzdCBmcmVlIGl0IG5vdyB0aGF0IHdlJ3JlIGRvbmUKQEAgLTQxNCw3ICs0MjksNyBAQAogCXwgcWlkIGFuZCBpZAkJeyBnZW5fYW5kKCQxLmIsICQzLmIpOyAkJCA9ICQzOyB9CiAJfCBxaWQgb3IgaWQJCXsgZ2VuX29yKCQxLmIsICQzLmIpOyAkJCA9ICQzOyB9CiAJOwotcWlkOgkgIHBudW0JCQl7ICQkLmIgPSBnZW5fbmNvZGUoTlVMTCwgKGJwZl91X2ludDMyKSQxLAorcWlkOgkgIHBudW0JCQl7ICQkLmIgPSBnZW5fbmNvZGUoY3N0YXRlLCBOVUxMLCAoYnBmX3VfaW50MzIpJDEsCiAJCQkJCQkgICAkJC5xID0gJDxibGs+MC5xKTsgfQogCXwgcGlkCiAJOwpAQCAtNDMwLDE2ICs0NDUsMTYgQEAKIAk7CiBydGVybToJICBoZWFkIGlkCQl7ICQkID0gJDI7IH0KIAl8IHBhcmVuIGV4cHIgJyknCXsgJCQuYiA9ICQyLmI7ICQkLnEgPSAkMS5xOyB9Ci0JfCBwbmFtZQkJCXsgJCQuYiA9IGdlbl9wcm90b19hYmJyZXYoJDEpOyAkJC5xID0gcWVycjsgfQotCXwgYXJ0aCByZWxvcCBhcnRoCXsgJCQuYiA9IGdlbl9yZWxhdGlvbigkMiwgJDEsICQzLCAwKTsKKwl8IHBuYW1lCQkJeyAkJC5iID0gZ2VuX3Byb3RvX2FiYnJldihjc3RhdGUsICQxKTsgJCQucSA9IHFlcnI7IH0KKwl8IGFydGggcmVsb3AgYXJ0aAl7ICQkLmIgPSBnZW5fcmVsYXRpb24oY3N0YXRlLCAkMiwgJDEsICQzLCAwKTsKIAkJCQkgICQkLnEgPSBxZXJyOyB9Ci0JfCBhcnRoIGlyZWxvcCBhcnRoCXsgJCQuYiA9IGdlbl9yZWxhdGlvbigkMiwgJDEsICQzLCAxKTsKKwl8IGFydGggaXJlbG9wIGFydGgJeyAkJC5iID0gZ2VuX3JlbGF0aW9uKGNzdGF0ZSwgJDIsICQxLCAkMywgMSk7CiAJCQkJICAkJC5xID0gcWVycjsgfQogCXwgb3RoZXIJCQl7ICQkLmIgPSAkMTsgJCQucSA9IHFlcnI7IH0KLQl8IGF0bXR5cGUJCXsgJCQuYiA9IGdlbl9hdG10eXBlX2FiYnJldigkMSk7ICQkLnEgPSBxZXJyOyB9Ci0JfCBhdG1tdWx0aXR5cGUJCXsgJCQuYiA9IGdlbl9hdG1tdWx0aV9hYmJyZXYoJDEpOyAkJC5xID0gcWVycjsgfQorCXwgYXRtdHlwZQkJeyAkJC5iID0gZ2VuX2F0bXR5cGVfYWJicmV2KGNzdGF0ZSwgJDEpOyAkJC5xID0gcWVycjsgfQorCXwgYXRtbXVsdGl0eXBlCQl7ICQkLmIgPSBnZW5fYXRtbXVsdGlfYWJicmV2KGNzdGF0ZSwgJDEpOyAkJC5xID0gcWVycjsgfQogCXwgYXRtZmllbGQgYXRtdmFsdWUJeyAkJC5iID0gJDIuYjsgJCQucSA9IHFlcnI7IH0KLQl8IG10cDJ0eXBlCQl7ICQkLmIgPSBnZW5fbXRwMnR5cGVfYWJicmV2KCQxKTsgJCQucSA9IHFlcnI7IH0KKwl8IG10cDJ0eXBlCQl7ICQkLmIgPSBnZW5fbXRwMnR5cGVfYWJicmV2KGNzdGF0ZSwgJDEpOyAkJC5xID0gcWVycjsgfQogCXwgbXRwM2ZpZWxkIG10cDN2YWx1ZQl7ICQkLmIgPSAkMi5iOyAkJC5xID0gcWVycjsgfQogCTsKIC8qIHByb3RvY29sIGxldmVsIHF1YWxpZmllcnMgKi8KQEAgLTUwOSw1NCArNTI0LDU0IEBACiAJfCBORVRCRVVJCQl7ICQkID0gUV9ORVRCRVVJOyB9CiAJfCBSQURJTwkJCXsgJCQgPSBRX1JBRElPOyB9CiAJOwotb3RoZXI6CSAgcHF1YWwgVEtfQlJPQURDQVNUCXsgJCQgPSBnZW5fYnJvYWRjYXN0KCQxKTsgfQotCXwgcHF1YWwgVEtfTVVMVElDQVNUCXsgJCQgPSBnZW5fbXVsdGljYXN0KCQxKTsgfQotCXwgTEVTUyBOVU0JCXsgJCQgPSBnZW5fbGVzcygkMik7IH0KLQl8IEdSRUFURVIgTlVNCQl7ICQkID0gZ2VuX2dyZWF0ZXIoJDIpOyB9Ci0JfCBDQllURSBOVU0gYnl0ZW9wIE5VTQl7ICQkID0gZ2VuX2J5dGVvcCgkMywgJDIsICQ0KTsgfQotCXwgSU5CT1VORAkJeyAkJCA9IGdlbl9pbmJvdW5kKDApOyB9Ci0JfCBPVVRCT1VORAkJeyAkJCA9IGdlbl9pbmJvdW5kKDEpOyB9Ci0JfCBWTEFOIHBudW0JCXsgJCQgPSBnZW5fdmxhbigkMik7IH0KLQl8IFZMQU4JCQl7ICQkID0gZ2VuX3ZsYW4oLTEpOyB9Ci0JfCBNUExTIHBudW0JCXsgJCQgPSBnZW5fbXBscygkMik7IH0KLQl8IE1QTFMJCQl7ICQkID0gZ2VuX21wbHMoLTEpOyB9Ci0JfCBQUFBPRUQJCXsgJCQgPSBnZW5fcHBwb2VkKCk7IH0KLQl8IFBQUE9FUyBwbnVtCQl7ICQkID0gZ2VuX3BwcG9lcygkMik7IH0KLQl8IFBQUE9FUwkJeyAkJCA9IGdlbl9wcHBvZXMoLTEpOyB9Ci0JfCBHRU5FVkUgcG51bQkJeyAkJCA9IGdlbl9nZW5ldmUoJDIpOyB9Ci0JfCBHRU5FVkUJCXsgJCQgPSBnZW5fZ2VuZXZlKC0xKTsgfQorb3RoZXI6CSAgcHF1YWwgVEtfQlJPQURDQVNUCXsgJCQgPSBnZW5fYnJvYWRjYXN0KGNzdGF0ZSwgJDEpOyB9CisJfCBwcXVhbCBUS19NVUxUSUNBU1QJeyAkJCA9IGdlbl9tdWx0aWNhc3QoY3N0YXRlLCAkMSk7IH0KKwl8IExFU1MgTlVNCQl7ICQkID0gZ2VuX2xlc3MoY3N0YXRlLCAkMik7IH0KKwl8IEdSRUFURVIgTlVNCQl7ICQkID0gZ2VuX2dyZWF0ZXIoY3N0YXRlLCAkMik7IH0KKwl8IENCWVRFIE5VTSBieXRlb3AgTlVNCXsgJCQgPSBnZW5fYnl0ZW9wKGNzdGF0ZSwgJDMsICQyLCAkNCk7IH0KKwl8IElOQk9VTkQJCXsgJCQgPSBnZW5faW5ib3VuZChjc3RhdGUsIDApOyB9CisJfCBPVVRCT1VORAkJeyAkJCA9IGdlbl9pbmJvdW5kKGNzdGF0ZSwgMSk7IH0KKwl8IFZMQU4gcG51bQkJeyAkJCA9IGdlbl92bGFuKGNzdGF0ZSwgJDIpOyB9CisJfCBWTEFOCQkJeyAkJCA9IGdlbl92bGFuKGNzdGF0ZSwgLTEpOyB9CisJfCBNUExTIHBudW0JCXsgJCQgPSBnZW5fbXBscyhjc3RhdGUsICQyKTsgfQorCXwgTVBMUwkJCXsgJCQgPSBnZW5fbXBscyhjc3RhdGUsIC0xKTsgfQorCXwgUFBQT0VECQl7ICQkID0gZ2VuX3BwcG9lZChjc3RhdGUpOyB9CisJfCBQUFBPRVMgcG51bQkJeyAkJCA9IGdlbl9wcHBvZXMoY3N0YXRlLCAkMik7IH0KKwl8IFBQUE9FUwkJeyAkJCA9IGdlbl9wcHBvZXMoY3N0YXRlLCAtMSk7IH0KKwl8IEdFTkVWRSBwbnVtCQl7ICQkID0gZ2VuX2dlbmV2ZShjc3RhdGUsICQyKTsgfQorCXwgR0VORVZFCQl7ICQkID0gZ2VuX2dlbmV2ZShjc3RhdGUsIC0xKTsgfQogCXwgcGZ2YXIJCQl7ICQkID0gJDE7IH0KIAl8IHBxdWFsIHA4MDIxMQkJeyAkJCA9ICQyOyB9CiAJfCBwbGxjCQkJeyAkJCA9ICQxOyB9CiAJOwogCi1wZnZhcjoJICBQRl9JRk5BTUUgSUQJCXsgJCQgPSBnZW5fcGZfaWZuYW1lKCQyKTsgfQotCXwgUEZfUlNFVCBJRAkJeyAkJCA9IGdlbl9wZl9ydWxlc2V0KCQyKTsgfQotCXwgUEZfUk5SIE5VTQkJeyAkJCA9IGdlbl9wZl9ybnIoJDIpOyB9Ci0JfCBQRl9TUk5SIE5VTQkJeyAkJCA9IGdlbl9wZl9zcm5yKCQyKTsgfQotCXwgUEZfUkVBU09OIHJlYXNvbgl7ICQkID0gZ2VuX3BmX3JlYXNvbigkMik7IH0KLQl8IFBGX0FDVElPTiBhY3Rpb24JeyAkJCA9IGdlbl9wZl9hY3Rpb24oJDIpOyB9CitwZnZhcjoJICBQRl9JRk5BTUUgSUQJCXsgJCQgPSBnZW5fcGZfaWZuYW1lKGNzdGF0ZSwgJDIpOyB9CisJfCBQRl9SU0VUIElECQl7ICQkID0gZ2VuX3BmX3J1bGVzZXQoY3N0YXRlLCAkMik7IH0KKwl8IFBGX1JOUiBOVU0JCXsgJCQgPSBnZW5fcGZfcm5yKGNzdGF0ZSwgJDIpOyB9CisJfCBQRl9TUk5SIE5VTQkJeyAkJCA9IGdlbl9wZl9zcm5yKGNzdGF0ZSwgJDIpOyB9CisJfCBQRl9SRUFTT04gcmVhc29uCXsgJCQgPSBnZW5fcGZfcmVhc29uKGNzdGF0ZSwgJDIpOyB9CisJfCBQRl9BQ1RJT04gYWN0aW9uCXsgJCQgPSBnZW5fcGZfYWN0aW9uKGNzdGF0ZSwgJDIpOyB9CiAJOwogCiBwODAyMTE6ICAgVFlQRSB0eXBlIFNVQlRZUEUgc3VidHlwZQotCQkJCXsgJCQgPSBnZW5fcDgwMjExX3R5cGUoJDIgfCAkNCwKKwkJCQl7ICQkID0gZ2VuX3A4MDIxMV90eXBlKGNzdGF0ZSwgJDIgfCAkNCwKIAkJCQkJSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfAogCQkJCQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSyk7CiAJCQkJfQotCXwgVFlQRSB0eXBlCQl7ICQkID0gZ2VuX3A4MDIxMV90eXBlKCQyLAorCXwgVFlQRSB0eXBlCQl7ICQkID0gZ2VuX3A4MDIxMV90eXBlKGNzdGF0ZSwgJDIsCiAJCQkJCUlFRUU4MDIxMV9GQzBfVFlQRV9NQVNLKTsKIAkJCQl9Ci0JfCBTVUJUWVBFIHR5cGVfc3VidHlwZQl7ICQkID0gZ2VuX3A4MDIxMV90eXBlKCQyLAorCXwgU1VCVFlQRSB0eXBlX3N1YnR5cGUJeyAkJCA9IGdlbl9wODAyMTFfdHlwZShjc3RhdGUsICQyLAogCQkJCQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyB8CiAJCQkJCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKTsKIAkJCQl9Ci0JfCBESVIgZGlyCQl7ICQkID0gZ2VuX3A4MDIxMV9mY2RpcigkMik7IH0KKwl8IERJUiBkaXIJCXsgJCQgPSBnZW5fcDgwMjExX2ZjZGlyKGNzdGF0ZSwgJDIpOyB9CiAJOwogCiB0eXBlOgkgIE5VTQogCXwgSUQJCQl7ICQkID0gc3RyMnRvaygkMSwgaWVlZTgwMjExX3R5cGVzKTsKIAkJCQkgIGlmICgkJCA9PSAtMSkKLQkJCQkgIAlicGZfZXJyb3IoInVua25vd24gODAyLjExIHR5cGUgbmFtZSIpOworCQkJCSAgCWJwZl9lcnJvcihjc3RhdGUsICJ1bmtub3duIDgwMi4xMSB0eXBlIG5hbWUiKTsKIAkJCQl9CiAJOwogCkBAIC01NjYsNyArNTgxLDcgQEAKIAkJCQkgIGZvciAoaSA9IDA7OyBpKyspIHsKIAkJCQkgIAlpZiAoaWVlZTgwMjExX3R5cGVfc3VidHlwZXNbaV0udG9rID09IE5VTEwpIHsKIAkJCQkgIAkJLyogUmFuIG91dCBvZiB0eXBlcyAqLwotCQkJCQkJYnBmX2Vycm9yKCJ1bmtub3duIDgwMi4xMSB0eXBlIik7CisJCQkJCQlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biA4MDIuMTEgdHlwZSIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJaWYgKCQ8aT4tMSA9PSBpZWVlODAyMTFfdHlwZV9zdWJ0eXBlc1tpXS50eXBlKSB7CkBAIC01NzcsNyArNTkyLDcgQEAKIAogCQkJCSAgJCQgPSBzdHIydG9rKCQxLCB0eXBlcyk7CiAJCQkJICBpZiAoJCQgPT0gLTEpCi0JCQkJCWJwZl9lcnJvcigidW5rbm93biA4MDIuMTEgc3VidHlwZSBuYW1lIik7CisJCQkJCWJwZl9lcnJvcihjc3RhdGUsICJ1bmtub3duIDgwMi4xMSBzdWJ0eXBlIG5hbWUiKTsKIAkJCQl9CiAJOwogCkBAIC01ODUsNyArNjAwLDcgQEAKIAkJCQkgIGZvciAoaSA9IDA7OyBpKyspIHsKIAkJCQkgIAlpZiAoaWVlZTgwMjExX3R5cGVfc3VidHlwZXNbaV0udG9rID09IE5VTEwpIHsKIAkJCQkgIAkJLyogUmFuIG91dCBvZiB0eXBlcyAqLwotCQkJCQkJYnBmX2Vycm9yKCJ1bmtub3duIDgwMi4xMSB0eXBlIG5hbWUiKTsKKwkJCQkJCWJwZl9lcnJvcihjc3RhdGUsICJ1bmtub3duIDgwMi4xMSB0eXBlIG5hbWUiKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCSQkID0gc3RyMnRvaygkMSwgaWVlZTgwMjExX3R5cGVfc3VidHlwZXNbaV0udG9rKTsKQEAgLTU5NywyOSArNjEyLDI5IEBACiAJCQkJfQogCQk7CiAKLXBsbGM6CUxMQwkJCXsgJCQgPSBnZW5fbGxjKCk7IH0KK3BsbGM6CUxMQwkJCXsgJCQgPSBnZW5fbGxjKGNzdGF0ZSk7IH0KIAl8IExMQyBJRAkJeyBpZiAocGNhcF9zdHJjYXNlY21wKCQyLCAiaSIpID09IDApCi0JCQkJCSQkID0gZ2VuX2xsY19pKCk7CisJCQkJCSQkID0gZ2VuX2xsY19pKGNzdGF0ZSk7CiAJCQkJICBlbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoJDIsICJzIikgPT0gMCkKLQkJCQkJJCQgPSBnZW5fbGxjX3MoKTsKKwkJCQkJJCQgPSBnZW5fbGxjX3MoY3N0YXRlKTsKIAkJCQkgIGVsc2UgaWYgKHBjYXBfc3RyY2FzZWNtcCgkMiwgInUiKSA9PSAwKQotCQkJCQkkJCA9IGdlbl9sbGNfdSgpOworCQkJCQkkJCA9IGdlbl9sbGNfdShjc3RhdGUpOwogCQkJCSAgZWxzZSB7Ci0JCQkJICAJdV9pbnQgc3VidHlwZTsKKwkJCQkJaW50IHN1YnR5cGU7CiAKIAkJCQkJc3VidHlwZSA9IHN0cjJ0b2soJDIsIGxsY19zX3N1YnR5cGVzKTsKIAkJCQkJaWYgKHN1YnR5cGUgIT0gLTEpCi0JCQkJCQkkJCA9IGdlbl9sbGNfc19zdWJ0eXBlKHN1YnR5cGUpOworCQkJCQkJJCQgPSBnZW5fbGxjX3Nfc3VidHlwZShjc3RhdGUsIHN1YnR5cGUpOwogCQkJCQllbHNlIHsKIAkJCQkJCXN1YnR5cGUgPSBzdHIydG9rKCQyLCBsbGNfdV9zdWJ0eXBlcyk7CiAJCQkJCQlpZiAoc3VidHlwZSA9PSAtMSkKLQkJCQkJICAJCWJwZl9lcnJvcigidW5rbm93biBMTEMgdHlwZSBuYW1lIFwiJXNcIiIsICQyKTsKLQkJCQkJCSQkID0gZ2VuX2xsY191X3N1YnR5cGUoc3VidHlwZSk7CisJCQkJCSAgCQlicGZfZXJyb3IoY3N0YXRlLCAidW5rbm93biBMTEMgdHlwZSBuYW1lIFwiJXNcIiIsICQyKTsKKwkJCQkJCSQkID0gZ2VuX2xsY191X3N1YnR5cGUoY3N0YXRlLCBzdWJ0eXBlKTsKIAkJCQkJfQogCQkJCSAgfQogCQkJCX0KIAkJCQkvKiBzaWdoLCAicm5yIiBpcyBhbHJlYWR5IGEga2V5d29yZCBmb3IgUEYgKi8KLQl8IExMQyBQRl9STlIJCXsgJCQgPSBnZW5fbGxjX3Nfc3VidHlwZShMTENfUk5SKTsgfQorCXwgTExDIFBGX1JOUgkJeyAkJCA9IGdlbl9sbGNfc19zdWJ0eXBlKGNzdGF0ZSwgTExDX1JOUik7IH0KIAk7CiAKIGRpcjoJICBOVU0KQEAgLTYzMiwxNSArNjQ3LDE1IEBACiAJCQkJICBlbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoJDEsICJkc3RvZHMiKSA9PSAwKQogCQkJCQkkJCA9IElFRUU4MDIxMV9GQzFfRElSX0RTVE9EUzsKIAkJCQkgIGVsc2UKLQkJCQkJYnBmX2Vycm9yKCJ1bmtub3duIDgwMi4xMSBkaXJlY3Rpb24iKTsKKwkJCQkJYnBmX2Vycm9yKGNzdGF0ZSwgInVua25vd24gODAyLjExIGRpcmVjdGlvbiIpOwogCQkJCX0KIAk7CiAKIHJlYXNvbjoJICBOVU0JCQl7ICQkID0gJDE7IH0KLQl8IElECQkJeyAkJCA9IHBmcmVhc29uX3RvX251bSgkMSk7IH0KKwl8IElECQkJeyAkJCA9IHBmcmVhc29uX3RvX251bShjc3RhdGUsICQxKTsgfQogCTsKIAotYWN0aW9uOgkgIElECQkJeyAkJCA9IHBmYWN0aW9uX3RvX251bSgkMSk7IH0KK2FjdGlvbjoJICBJRAkJCXsgJCQgPSBwZmFjdGlvbl90b19udW0oY3N0YXRlLCAkMSk7IH0KIAk7CiAKIHJlbG9wOgkgICc+JwkJCXsgJCQgPSBCUEZfSkdUOyB9CkBAIC02NTEsMjQgKzY2NiwyNCBAQAogCXwgJzwnCQkJeyAkJCA9IEJQRl9KR0U7IH0KIAl8IE5FUQkJCXsgJCQgPSBCUEZfSkVROyB9CiAJOwotYXJ0aDoJICBwbnVtCQkJeyAkJCA9IGdlbl9sb2FkaSgkMSk7IH0KK2FydGg6CSAgcG51bQkJCXsgJCQgPSBnZW5fbG9hZGkoY3N0YXRlLCAkMSk7IH0KIAl8IG5hcnRoCiAJOwotbmFydGg6CSAgcG5hbWUgJ1snIGFydGggJ10nCQl7ICQkID0gZ2VuX2xvYWQoJDEsICQzLCAxKTsgfQotCXwgcG5hbWUgJ1snIGFydGggJzonIE5VTSAnXScJeyAkJCA9IGdlbl9sb2FkKCQxLCAkMywgJDUpOyB9Ci0JfCBhcnRoICcrJyBhcnRoCQkJeyAkJCA9IGdlbl9hcnRoKEJQRl9BREQsICQxLCAkMyk7IH0KLQl8IGFydGggJy0nIGFydGgJCQl7ICQkID0gZ2VuX2FydGgoQlBGX1NVQiwgJDEsICQzKTsgfQotCXwgYXJ0aCAnKicgYXJ0aAkJCXsgJCQgPSBnZW5fYXJ0aChCUEZfTVVMLCAkMSwgJDMpOyB9Ci0JfCBhcnRoICcvJyBhcnRoCQkJeyAkJCA9IGdlbl9hcnRoKEJQRl9ESVYsICQxLCAkMyk7IH0KLQl8IGFydGggJyUnIGFydGgJCQl7ICQkID0gZ2VuX2FydGgoQlBGX01PRCwgJDEsICQzKTsgfQotCXwgYXJ0aCAnJicgYXJ0aAkJCXsgJCQgPSBnZW5fYXJ0aChCUEZfQU5ELCAkMSwgJDMpOyB9Ci0JfCBhcnRoICd8JyBhcnRoCQkJeyAkJCA9IGdlbl9hcnRoKEJQRl9PUiwgJDEsICQzKTsgfQotCXwgYXJ0aCAnXicgYXJ0aAkJCXsgJCQgPSBnZW5fYXJ0aChCUEZfWE9SLCAkMSwgJDMpOyB9Ci0JfCBhcnRoIExTSCBhcnRoCQkJeyAkJCA9IGdlbl9hcnRoKEJQRl9MU0gsICQxLCAkMyk7IH0KLQl8IGFydGggUlNIIGFydGgJCQl7ICQkID0gZ2VuX2FydGgoQlBGX1JTSCwgJDEsICQzKTsgfQotCXwgJy0nIGFydGggJXByZWMgVU1JTlVTCQl7ICQkID0gZ2VuX25lZygkMik7IH0KK25hcnRoOgkgIHBuYW1lICdbJyBhcnRoICddJwkJeyAkJCA9IGdlbl9sb2FkKGNzdGF0ZSwgJDEsICQzLCAxKTsgfQorCXwgcG5hbWUgJ1snIGFydGggJzonIE5VTSAnXScJeyAkJCA9IGdlbl9sb2FkKGNzdGF0ZSwgJDEsICQzLCAkNSk7IH0KKwl8IGFydGggJysnIGFydGgJCQl7ICQkID0gZ2VuX2FydGgoY3N0YXRlLCBCUEZfQURELCAkMSwgJDMpOyB9CisJfCBhcnRoICctJyBhcnRoCQkJeyAkJCA9IGdlbl9hcnRoKGNzdGF0ZSwgQlBGX1NVQiwgJDEsICQzKTsgfQorCXwgYXJ0aCAnKicgYXJ0aAkJCXsgJCQgPSBnZW5fYXJ0aChjc3RhdGUsIEJQRl9NVUwsICQxLCAkMyk7IH0KKwl8IGFydGggJy8nIGFydGgJCQl7ICQkID0gZ2VuX2FydGgoY3N0YXRlLCBCUEZfRElWLCAkMSwgJDMpOyB9CisJfCBhcnRoICclJyBhcnRoCQkJeyAkJCA9IGdlbl9hcnRoKGNzdGF0ZSwgQlBGX01PRCwgJDEsICQzKTsgfQorCXwgYXJ0aCAnJicgYXJ0aAkJCXsgJCQgPSBnZW5fYXJ0aChjc3RhdGUsIEJQRl9BTkQsICQxLCAkMyk7IH0KKwl8IGFydGggJ3wnIGFydGgJCQl7ICQkID0gZ2VuX2FydGgoY3N0YXRlLCBCUEZfT1IsICQxLCAkMyk7IH0KKwl8IGFydGggJ14nIGFydGgJCQl7ICQkID0gZ2VuX2FydGgoY3N0YXRlLCBCUEZfWE9SLCAkMSwgJDMpOyB9CisJfCBhcnRoIExTSCBhcnRoCQkJeyAkJCA9IGdlbl9hcnRoKGNzdGF0ZSwgQlBGX0xTSCwgJDEsICQzKTsgfQorCXwgYXJ0aCBSU0ggYXJ0aAkJCXsgJCQgPSBnZW5fYXJ0aChjc3RhdGUsIEJQRl9SU0gsICQxLCAkMyk7IH0KKwl8ICctJyBhcnRoICVwcmVjIFVNSU5VUwkJeyAkJCA9IGdlbl9uZWcoY3N0YXRlLCAkMik7IH0KIAl8IHBhcmVuIG5hcnRoICcpJwkJeyAkJCA9ICQyOyB9Ci0JfCBMRU4JCQkJeyAkJCA9IGdlbl9sb2FkbGVuKCk7IH0KKwl8IExFTgkJCQl7ICQkID0gZ2VuX2xvYWRsZW4oY3N0YXRlKTsgfQogCTsKIGJ5dGVvcDoJICAnJicJCQl7ICQkID0gJyYnOyB9CiAJfCAnfCcJCQl7ICQkID0gJ3wnOyB9CkBAIC02OTcsMTUgKzcxMiwxNSBAQAogCXwgVkNJCQkJeyAkJC5hdG1maWVsZHR5cGUgPSBBX1ZDSTsgfQogCTsKIGF0bXZhbHVlOiBhdG1maWVsZHZhbHVlCi0JfCByZWxvcCBOVU0JCXsgJCQuYiA9IGdlbl9hdG1maWVsZF9jb2RlKCQ8YmxrPjAuYXRtZmllbGR0eXBlLCAoYnBmX2ludDMyKSQyLCAoYnBmX3VfaW50MzIpJDEsIDApOyB9Ci0JfCBpcmVsb3AgTlVNCQl7ICQkLmIgPSBnZW5fYXRtZmllbGRfY29kZSgkPGJsaz4wLmF0bWZpZWxkdHlwZSwgKGJwZl9pbnQzMikkMiwgKGJwZl91X2ludDMyKSQxLCAxKTsgfQorCXwgcmVsb3AgTlVNCQl7ICQkLmIgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsICQ8YmxrPjAuYXRtZmllbGR0eXBlLCAoYnBmX2ludDMyKSQyLCAoYnBmX3VfaW50MzIpJDEsIDApOyB9CisJfCBpcmVsb3AgTlVNCQl7ICQkLmIgPSBnZW5fYXRtZmllbGRfY29kZShjc3RhdGUsICQ8YmxrPjAuYXRtZmllbGR0eXBlLCAoYnBmX2ludDMyKSQyLCAoYnBmX3VfaW50MzIpJDEsIDEpOyB9CiAJfCBwYXJlbiBhdG1saXN0dmFsdWUgJyknIHsgJCQuYiA9ICQyLmI7ICQkLnEgPSBxZXJyOyB9CiAJOwogYXRtZmllbGR2YWx1ZTogTlVNIHsKIAkkJC5hdG1maWVsZHR5cGUgPSAkPGJsaz4wLmF0bWZpZWxkdHlwZTsKIAlpZiAoJCQuYXRtZmllbGR0eXBlID09IEFfVlBJIHx8CiAJICAgICQkLmF0bWZpZWxkdHlwZSA9PSBBX1ZDSSkKLQkJJCQuYiA9IGdlbl9hdG1maWVsZF9jb2RlKCQkLmF0bWZpZWxkdHlwZSwgKGJwZl9pbnQzMikgJDEsIEJQRl9KRVEsIDApOworCQkkJC5iID0gZ2VuX2F0bWZpZWxkX2NvZGUoY3N0YXRlLCAkJC5hdG1maWVsZHR5cGUsIChicGZfaW50MzIpICQxLCBCUEZfSkVRLCAwKTsKIAl9CiAJOwogYXRtbGlzdHZhbHVlOiBhdG1maWVsZHZhbHVlCkBAIC03MzAsOCArNzQ1LDggQEAKIAl8IEhTTFMgICAgICAgICAgICAgICAgICB7ICQkLm10cDNmaWVsZHR5cGUgPSBNSF9TTFM7IH0KIAk7CiBtdHAzdmFsdWU6IG10cDNmaWVsZHZhbHVlCi0JfCByZWxvcCBOVU0JCXsgJCQuYiA9IGdlbl9tdHAzZmllbGRfY29kZSgkPGJsaz4wLm10cDNmaWVsZHR5cGUsICh1X2ludCkkMiwgKHVfaW50KSQxLCAwKTsgfQotCXwgaXJlbG9wIE5VTQkJeyAkJC5iID0gZ2VuX210cDNmaWVsZF9jb2RlKCQ8YmxrPjAubXRwM2ZpZWxkdHlwZSwgKHVfaW50KSQyLCAodV9pbnQpJDEsIDEpOyB9CisJfCByZWxvcCBOVU0JCXsgJCQuYiA9IGdlbl9tdHAzZmllbGRfY29kZShjc3RhdGUsICQ8YmxrPjAubXRwM2ZpZWxkdHlwZSwgKHVfaW50KSQyLCAodV9pbnQpJDEsIDApOyB9CisJfCBpcmVsb3AgTlVNCQl7ICQkLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoY3N0YXRlLCAkPGJsaz4wLm10cDNmaWVsZHR5cGUsICh1X2ludCkkMiwgKHVfaW50KSQxLCAxKTsgfQogCXwgcGFyZW4gbXRwM2xpc3R2YWx1ZSAnKScgeyAkJC5iID0gJDIuYjsgJCQucSA9IHFlcnI7IH0KIAk7CiBtdHAzZmllbGR2YWx1ZTogTlVNIHsKQEAgLTc0NCw3ICs3NTksNyBAQAogCSAgICAkJC5tdHAzZmllbGR0eXBlID09IE1IX09QQyB8fAogCSAgICAkJC5tdHAzZmllbGR0eXBlID09IE1IX0RQQyB8fAogCSAgICAkJC5tdHAzZmllbGR0eXBlID09IE1IX1NMUykKLQkJJCQuYiA9IGdlbl9tdHAzZmllbGRfY29kZSgkJC5tdHAzZmllbGR0eXBlLCAodV9pbnQpICQxLCBCUEZfSkVRLCAwKTsKKwkJJCQuYiA9IGdlbl9tdHAzZmllbGRfY29kZShjc3RhdGUsICQkLm10cDNmaWVsZHR5cGUsICh1X2ludCkgJDEsIEJQRl9KRVEsIDApOwogCX0KIAk7CiBtdHAzbGlzdHZhbHVlOiBtdHAzZmllbGR2YWx1ZQpkaWZmIC0tZ2l0IGEvaW5ldC5jIGIvaW5ldC5jCmluZGV4IGU3ZDIxMDQuLjE2YTQ4M2QgMTAwNjQ0Ci0tLSBhL2luZXQuYworKysgYi9pbmV0LmMKQEAgLTM2LDkgKzM2LDkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCi0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgotI2Vsc2UgLyogV0lOMzIgKi8KKyNlbHNlIC8qIF9XSU4zMiAqLwogCiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAjaWZuZGVmIE1TRE9TCkBAIC01NCwyMiArNTQsMTYgQEAKIHN0cnVjdCBydGVudHJ5OwkJLyogZGVjbGFyYXRpb25zIGluIDxuZXQvaWYuaD4gKi8KICNpbmNsdWRlIDxuZXQvaWYuaD4KICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jZW5kaWYgLyogV0lOMzIgKi8KKyNlbmRpZiAvKiBfV0lOMzIgKi8KIAotI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxtZW1vcnkuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgLyogIVdJTjMyICYmICFfX0JPUkxBTkRDX18gKi8KLSNpZmRlZiBIQVZFX0xJTUlUU19ICi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotI2RlZmluZSBJTlRfTUFYCQkyMTQ3NDgzNjQ3Ci0jZW5kaWYKKyNlbmRpZiAvKiAhX1dJTjMyICYmICFfX0JPUkxBTkRDX18gKi8KIAogI2luY2x1ZGUgInBjYXAtaW50LmgiCiAKQEAgLTc3LDc1OCArNzEsNyBAQAogI2luY2x1ZGUgIm9zLXByb3RvLmgiCiAjZW5kaWYKIAotLyogTm90IGFsbCBzeXN0ZW1zIGhhdmUgSUZGX0xPT1BCQUNLICovCi0jaWZkZWYgSUZGX0xPT1BCQUNLCi0jZGVmaW5lIElTTE9PUEJBQ0sobmFtZSwgZmxhZ3MpICgoZmxhZ3MpICYgSUZGX0xPT1BCQUNLKQotI2Vsc2UKLSNkZWZpbmUgSVNMT09QQkFDSyhuYW1lLCBmbGFncykgKChuYW1lKVswXSA9PSAnbCcgJiYgKG5hbWUpWzFdID09ICdvJyAmJiBcCi0gICAgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKChuYW1lKVsyXSkpIHx8IChuYW1lKVsyXSA9PSAnXDAnKSkKLSNlbmRpZgotCi0jaWZkZWYgSUZGX1VQCi0jZGVmaW5lIElTVVAoZmxhZ3MpICgoZmxhZ3MpICYgSUZGX1VQKQotI2Vsc2UKLSNkZWZpbmUgSVNVUChmbGFncykgMAotI2VuZGlmCi0KLSNpZmRlZiBJRkZfUlVOTklORwotI2RlZmluZSBJU1JVTk5JTkcoZmxhZ3MpICgoZmxhZ3MpICYgSUZGX1JVTk5JTkcpCi0jZWxzZQotI2RlZmluZSBJU1JVTk5JTkcoZmxhZ3MpIDAKLSNlbmRpZgotCi1zdHJ1Y3Qgc29ja2FkZHIgKgotZHVwX3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqc2EsIHNpemVfdCBzYV9sZW5ndGgpCi17Ci0Jc3RydWN0IHNvY2thZGRyICpuZXdzYTsKLQotCWlmICgobmV3c2EgPSBtYWxsb2Moc2FfbGVuZ3RoKSkgPT0gTlVMTCkKLQkJcmV0dXJuIChOVUxMKTsKLQlyZXR1cm4gKG1lbWNweShuZXdzYSwgc2EsIHNhX2xlbmd0aCkpOwotfQotCi0vKgotICogQ29uc3RydWN0IGEgImZpZ3VyZSBvZiBtZXJpdCIgZm9yIGFuIGludGVyZmFjZSwgZm9yIHVzZSB3aGVuIHNvcnRpbmcKLSAqIHRoZSBsaXN0IG9mIGludGVyZmFjZXMsIGluIHdoaWNoIGludGVyZmFjZXMgdGhhdCBhcmUgdXAgYXJlIHN1cGVyaW9yCi0gKiB0byBpbnRlcmZhY2VzIHRoYXQgYXJlbid0IHVwLCBpbnRlcmZhY2VzIHRoYXQgYXJlIHVwIGFuZCBydW5uaW5nIGFyZQotICogc3VwZXJpb3IgdG8gaW50ZXJmYWNlcyB0aGF0IGFyZSB1cCBidXQgbm90IHJ1bm5pbmcsIGFuZCBub24tbG9vcGJhY2sKLSAqIGludGVyZmFjZXMgdGhhdCBhcmUgdXAgYW5kIHJ1bm5pbmcgYXJlIHN1cGVyaW9yIHRvIGxvb3BiYWNrIGludGVyZmFjZXMsCi0gKiBhbmQgaW50ZXJmYWNlcyB3aXRoIHRoZSBzYW1lIGZsYWdzIGhhdmUgYSBmaWd1cmUgb2YgbWVyaXQgdGhhdCdzIGhpZ2hlcgotICogdGhlIGxvd2VyIHRoZSBpbnN0YW5jZSBudW1iZXIuCi0gKgotICogVGhlIGdvYWwgaXMgdG8gdHJ5IHRvIHB1dCB0aGUgaW50ZXJmYWNlcyBtb3N0IGxpa2VseSB0byBiZSB1c2VmdWwgZm9yCi0gKiBjYXB0dXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuCi0gKgotICogVGhlIGZpZ3VyZSBvZiBtZXJpdCwgd2hpY2ggaXMgbG93ZXIgdGhlICJiZXR0ZXIiIHRoZSBpbnRlcmZhY2UgaXMsCi0gKiBoYXMgdGhlIHVwcGVybW9zdCBiaXQgc2V0IGlmIHRoZSBpbnRlcmZhY2UgaXNuJ3QgcnVubmluZywgdGhlIGJpdAotICogYmVsb3cgdGhhdCBzZXQgaWYgdGhlIGludGVyZmFjZSBpc24ndCB1cCwgdGhlIGJpdCBiZWxvdyB0aGF0IHNldAotICogaWYgdGhlIGludGVyZmFjZSBpcyBhIGxvb3BiYWNrIGludGVyZmFjZSwgYW5kIHRoZSBpbnRlcmZhY2UgaW5kZXgKLSAqIGluIHRoZSAyOSBiaXRzIGJlbG93IHRoYXQuICAoWWVzLCB3ZSBhc3N1bWUgdV9pbnQgaXMgMzIgYml0cy4pCi0gKi8KLXN0YXRpYyB1X2ludAotZ2V0X2ZpZ3VyZV9vZl9tZXJpdChwY2FwX2lmX3QgKmRldikKLXsKLQljb25zdCBjaGFyICpjcDsKLQl1X2ludCBuOwotCi0JaWYgKHN0cmNtcChkZXYtPm5hbWUsICJhbnkiKSA9PSAwKSB7Ci0JCS8qCi0JCSAqIEdpdmUgdGhlICJhbnkiIGRldmljZSBhbiBhcnRpZmljaWFsbHkgaGlnaCBpbnN0YW5jZQotCQkgKiBudW1iZXIsIHNvIGl0IHNob3dzIHVwIGFmdGVyIGFsbCBvdGhlciBub24tbG9vcGJhY2sKLQkJICogaW50ZXJmYWNlcy4KLQkJICovCi0JCW4gPSAweDFGRkZGRkZGOwkvKiAyOSBhbGwtMSBiaXRzICovCi0JfSBlbHNlIHsKLQkJLyoKLQkJICogQSBudW1iZXIgYXQgdGhlIGVuZCBvZiB0aGUgZGV2aWNlIG5hbWUgc3RyaW5nIGlzCi0JCSAqIGFzc3VtZWQgdG8gYmUgYSB1bml0IG51bWJlci4KLQkJICovCi0JCWNwID0gZGV2LT5uYW1lICsgc3RybGVuKGRldi0+bmFtZSkgLSAxOwotCQl3aGlsZSAoY3AtMSA+PSBkZXYtPm5hbWUgJiYgKihjcC0xKSA+PSAnMCcgJiYgKihjcC0xKSA8PSAnOScpCi0JCQljcC0tOwotCQlpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQotCQkJbiA9IGF0b2koY3ApOwotCQllbHNlCi0JCQluID0gMDsKLQl9Ci0JaWYgKCEoZGV2LT5mbGFncyAmIFBDQVBfSUZfUlVOTklORykpCi0JCW4gfD0gMHg4MDAwMDAwMDsKLQlpZiAoIShkZXYtPmZsYWdzICYgUENBUF9JRl9VUCkpCi0JCW4gfD0gMHg0MDAwMDAwMDsKLQlpZiAoZGV2LT5mbGFncyAmIFBDQVBfSUZfTE9PUEJBQ0spCi0JCW4gfD0gMHgyMDAwMDAwMDsKLQlyZXR1cm4gKG4pOwotfQotCi0vKgotICogTG9vayBmb3IgYSBnaXZlbiBkZXZpY2UgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG9mIGRldmljZXMuCi0gKgotICogSWYgd2UgZmluZCBpdCwgcmV0dXJuIDAgYW5kIHNldCAqY3VyZGV2X3JldCB0byBwb2ludCB0byBpdC4KLSAqCi0gKiBJZiB3ZSBkb24ndCBmaW5kIGl0LCBjaGVjayB3aGV0aGVyIHdlIGNhbiBvcGVuIGl0OgotICoKLSAqICAgICBJZiB0aGF0IGZhaWxzIHdpdGggUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSBvcgotICogICAgIFBDQVBfRVJST1JfSUZBQ0VfTk9UX1VQLCBkb24ndCBhdHRlbXB0IHRvIGFkZCBhbiBlbnRyeSBmb3IKLSAqICAgICBpdCwgYXMgdGhhdCBwcm9iYWJseSBtZWFucyBpdCBleGlzdHMgYnV0IGRvZXNuJ3Qgc3VwcG9ydAotICogICAgIHBhY2tldCBjYXB0dXJlLgotICoKLSAqICAgICBPdGhlcndpc2UsIGF0dGVtcHQgdG8gYWRkIGFuIGVudHJ5IGZvciBpdCwgd2l0aCB0aGUgc3BlY2lmaWVkCi0gKiAgICAgaWZuZXQgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uLCBhbmQsIGlmIHRoYXQgc3VjY2VlZHMsIHJldHVybiAwCi0gKiAgICAgYW5kIHNldCAqY3VyZGV2X3JldCB0byBwb2ludCB0byB0aGUgbmV3IGVudHJ5LCBvdGhlcndpc2UKLSAqICAgICByZXR1cm4gUENBUF9FUlJPUiBhbmQgc2V0IGVycmJ1ZiB0byBhbiBlcnJvciBtZXNzYWdlLgotICovCi1pbnQKLWFkZF9vcl9maW5kX2lmKHBjYXBfaWZfdCAqKmN1cmRldl9yZXQsIHBjYXBfaWZfdCAqKmFsbGRldnMsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgdV9pbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLCBjaGFyICplcnJidWYpCi17Ci0JcGNhcF90ICpwOwotCXBjYXBfaWZfdCAqY3VyZGV2LCAqcHJldmRldiwgKm5leHRkZXY7Ci0JdV9pbnQgdGhpc19maWd1cmVfb2ZfbWVyaXQsIG5leHRkZXZfZmlndXJlX29mX21lcml0OwotCWNoYXIgb3Blbl9lcnJidWZbUENBUF9FUlJCVUZfU0laRV07Ci0JaW50IHJldDsKLQotCS8qCi0JICogSXMgdGhlcmUgYWxyZWFkeSBhbiBlbnRyeSBpbiB0aGUgbGlzdCBmb3IgdGhpcyBpbnRlcmZhY2U/Ci0JICovCi0JZm9yIChjdXJkZXYgPSAqYWxsZGV2czsgY3VyZGV2ICE9IE5VTEw7IGN1cmRldiA9IGN1cmRldi0+bmV4dCkgewotCQlpZiAoc3RyY21wKG5hbWUsIGN1cmRldi0+bmFtZSkgPT0gMCkKLQkJCWJyZWFrOwkvKiB5ZXMsIHdlIGZvdW5kIGl0ICovCi0JfQotCi0JaWYgKGN1cmRldiA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIE5vLCB3ZSBkaWRuJ3QgZmluZCBpdC4KLQkJICoKLQkJICogQ2FuIHdlIG9wZW4gdGhpcyBpbnRlcmZhY2UgZm9yIGxpdmUgY2FwdHVyZT8KLQkJICoKLQkJICogV2UgZG8gdGhpcyBjaGVjayBzbyB0aGF0IGludGVyZmFjZXMgdGhhdCBhcmUKLQkJICogc3VwcGxpZWQgYnkgdGhlIGludGVyZmFjZSBlbnVtZXJhdGlvbiBtZWNoYW5pc20KLQkJICogd2UncmUgdXNpbmcgYnV0IHRoYXQgZG9uJ3Qgc3VwcG9ydCBwYWNrZXQgY2FwdHVyZQotCQkgKiBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIGxpc3QuICBMb29wYmFjayBpbnRlcmZhY2VzCi0JCSAqIG9uIFNvbGFyaXMgYXJlIGFuIGV4YW1wbGUgb2YgdGhpczsgd2UgZG9uJ3QganVzdAotCQkgKiBvbWl0IGxvb3BiYWNrIGludGVyZmFjZXMgb24gYWxsIHBsYXRmb3JtcyBiZWNhdXNlCi0JCSAqIHlvdSAqY2FuKiBjYXB0dXJlIG9uIGxvb3BiYWNrIGludGVyZmFjZXMgb24gc29tZQotCQkgKiBPU2VzLgotCQkgKgotCQkgKiBPbiBPUyBYLCB3ZSBkb24ndCBkbyB0aGlzIGNoZWNrIGlmIHRoZSBkZXZpY2UKLQkJICogbmFtZSBiZWdpbnMgd2l0aCAid2x0IjsgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucwotCQkgKiBvZiBPUyBYIG9mZmVyIG1vbml0b3IgbW9kZSBjYXB0dXJpbmcgYnkgaGF2aW5nCi0JCSAqIGEgc2VwYXJhdGUgIm1vbml0b3IgbW9kZSIgZGV2aWNlIGZvciBlYWNoIHdpcmVsZXNzCi0JCSAqIGFkYXB0ZXIsIHJhdGhlciB0aGFuIGJ5IGltcGxlbWVudGluZyB0aGUgaW9jdGxzCi0JCSAqIHRoYXQge0ZyZWUsTmV0LE9wZW4sRHJhZ29uRmx5fUJTRCBwcm92aWRlLgotCQkgKiBPcGVuaW5nIHRoYXQgZGV2aWNlIHB1dHMgdGhlIGFkYXB0ZXIgaW50byBtb25pdG9yCi0JCSAqIG1vZGUsIHdoaWNoLCBhdCBsZWFzdCBmb3Igc29tZSBhZGFwdGVycywgY2F1c2VzCi0JCSAqIHRoZW0gdG8gZGVhc3NvY2lhdGUgZnJvbSB0aGUgbmV0d29yayB3aXRoIHdoaWNoCi0JCSAqIHRoZXkncmUgYXNzb2NpYXRlZC4KLQkJICoKLQkJICogSW5zdGVhZCwgd2UgdHJ5IHRvIG9wZW4gdGhlIGNvcnJlc3BvbmRpbmcgImVuIgotCQkgKiBkZXZpY2UgKHNvIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIHdpdGgsIGZvciB1c2VycwotCQkgKiB3aXRob3V0IHN1ZmZpY2llbnQgcHJpdmlsZWdlIHRvIG9wZW4gY2FwdHVyZQotCQkgKiBkZXZpY2VzLCBhIGxpc3Qgb2YgYWRhcHRlcnMgdGhhdCBvbmx5IGluY2x1ZGVzCi0JCSAqIHRoZSB3bHQgZGV2aWNlcykuCi0JCSAqLwotI2lmZGVmIF9fQVBQTEVfXwotCQlpZiAoc3RybmNtcChuYW1lLCAid2x0IiwgMykgPT0gMCkgewotCQkJY2hhciAqZW5fbmFtZTsKLQkJCXNpemVfdCBlbl9uYW1lX2xlbjsKLQotCQkJLyoKLQkJCSAqIFRyeSB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlICJlbiIKLQkJCSAqIGRldmljZSdzIG5hbWUuCi0JCQkgKi8KLQkJCWVuX25hbWVfbGVuID0gc3RybGVuKG5hbWUpIC0gMTsKLQkJCWVuX25hbWUgPSBtYWxsb2MoZW5fbmFtZV9sZW4gKyAxKTsKLQkJCWlmIChlbl9uYW1lID09IE5VTEwpIHsKLQkJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJCXJldHVybiAoLTEpOwotCQkJfQotCQkJc3RyY3B5KGVuX25hbWUsICJlbiIpOwotCQkJc3RyY2F0KGVuX25hbWUsIG5hbWUgKyAzKTsKLQkJCXAgPSBwY2FwX2NyZWF0ZShlbl9uYW1lLCBvcGVuX2VycmJ1Zik7Ci0JCQlmcmVlKGVuX25hbWUpOwotCQl9IGVsc2UKLSNlbmRpZiAvKiBfX0FQUExFICovCi0JCXAgPSBwY2FwX2NyZWF0ZShuYW1lLCBvcGVuX2VycmJ1Zik7Ci0JCWlmIChwID09IE5VTEwpIHsKLQkJCS8qCi0JCQkgKiBUaGUgYXR0ZW1wdCB0byBjcmVhdGUgdGhlIHBjYXBfdCBmYWlsZWQ7Ci0JCQkgKiB0aGF0J3MgcHJvYmFibHkgYW4gaW5kaWNhdGlvbiB0aGF0IHdlJ3JlCi0JCQkgKiBvdXQgb2YgbWVtb3J5LgotCQkJICoKLQkJCSAqIERvbid0IGJvdGhlciBpbmNsdWRpbmcgdGhpcyBpbnRlcmZhY2UsCi0JCQkgKiBidXQgZG9uJ3QgdHJlYXQgaXQgYXMgYW4gZXJyb3IuCi0JCQkgKi8KLQkJCSpjdXJkZXZfcmV0ID0gTlVMTDsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQkJLyogU21hbGwgc25hcGxlbiwgc28gd2UgZG9uJ3QgdHJ5IHRvIGFsbG9jYXRlIG11Y2ggbWVtb3J5LiAqLwotCQlwY2FwX3NldF9zbmFwbGVuKHAsIDY4KTsKLQkJcmV0ID0gcGNhcF9hY3RpdmF0ZShwKTsKLQkJcGNhcF9jbG9zZShwKTsKLQkJc3dpdGNoIChyZXQpIHsKLQotCQljYXNlIFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U6Ci0JCWNhc2UgUENBUF9FUlJPUl9JRkFDRV9OT1RfVVA6Ci0JCQkvKgotCQkJICogV2UgZXhwZWN0IHRoZXNlIHR3byBlcnJvcnMgLSB0aGV5J3JlIHRoZQotCQkJICogcmVhc29uIHdlIHRyeSB0byBvcGVuIHRoZSBkZXZpY2UuCi0JCQkgKgotCQkJICogUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSB0eXBpY2FsbHkgbWVhbnMKLQkJCSAqICJ0aGVyZSdzIG5vIHN1Y2ggZGV2aWNlICprbm93biB0byB0aGUKLQkJCSAqIE9TJ3MgY2FwdHVyZSBtZWNoYW5pc20qIiwgc28sIGV2ZW4gdGhvdWdoCi0JCQkgKiBpdCBtaWdodCBiZSBhIHZhbGlkIG5ldHdvcmsgaW50ZXJmYWNlLCB5b3UKLQkJCSAqIGNhbid0IGNhcHR1cmUgb24gaXQgKGUuZy4sIHRoZSBsb29wYmFjawotCQkJICogZGV2aWNlIGluIFNvbGFyaXMgdXAgdG8gU29sYXJpcyAxMCwgb3IKLQkJCSAqIHRoZSB2bW5ldCBkZXZpY2VzIGluIE9TIFggd2l0aCBWTXdhcmUKLQkJCSAqIEZ1c2lvbikuICBXZSBkb24ndCBpbmNsdWRlIHRob3NlIGRldmljZXMKLQkJCSAqIGluIG91ciBsaXN0IG9mIGRldmljZXMsIGFzIHRoZXJlJ3Mgbm8KLQkJCSAqIHBvaW50IGluIGRvaW5nIHNvIC0gdGhleSdyZSBub3QgYXZhaWxhYmxlCi0JCQkgKiBmb3IgY2FwdHVyZS4KLQkJCSAqCi0JCQkgKiBQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCBtZWFucyB0aGF0IHRoZQotCQkJICogT1MncyBjYXB0dXJlIG1lY2hhbmlzbSBkb2Vzbid0IHdvcmsgb24KLQkJCSAqIGludGVyZmFjZXMgbm90IG1hcmtlZCBhcyB1cDsgc29tZSBjYXB0dXJlCi0JCQkgKiBtZWNoYW5pc21zICpkbyogc3VwcG9ydCB0aGF0LCBzbyB3ZSBubwotCQkJICogbG9uZ2VyIHJlamVjdCB0aG9zZSBpbnRlcmZhY2VzIG91dCBvZiBoYW5kLAotCQkJICogYnV0IHdlICpkbyogd2FudCB0byByZWplY3QgdGhlbSBpZiB0aGV5Ci0JCQkgKiBjYW4ndCBiZSBvcGVuZWQgZm9yIGNhcHR1cmUuCi0JCQkgKi8KLQkJCSpjdXJkZXZfcmV0ID0gTlVMTDsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQotCQkvKgotCQkgKiBZZXMsIHdlIGNhbiBvcGVuIGl0LCBvciB3ZSBjYW4ndCwgZm9yIHNvbWUgb3RoZXIKLQkJICogcmVhc29uLgotCQkgKgotCQkgKiBJZiB3ZSBjYW4gb3BlbiBpdCwgd2Ugd2FudCB0byBvZmZlciBpdCBmb3IKLQkJICogY2FwdHVyZSwgYXMgeW91IGNhbiBjYXB0dXJlIG9uIGl0LiAgSWYgd2UgY2FuJ3QsCi0JCSAqIHdlIHdhbnQgdG8gb2ZmZXIgaXQgZm9yIGNhcHR1cmUsIHNvIHRoYXQsIGlmCi0JCSAqIHRoZSB1c2VyIHRyaWVzIHRvIGNhcHR1cmUgb24gaXQsIHRoZXknbGwgZ2V0Ci0JCSAqIGFuIGVycm9yIGFuZCB0aGV5J2xsIGtub3cgd2h5IHRoZXkgY2FuJ3QKLQkJICogY2FwdHVyZSBvbiBpdCAoZS5nLiwgaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zKQotCQkgKiBvciB0aGV5J2xsIHJlcG9ydCBpdCBhcyBhIHByb2JsZW0gKGFuZCB0aGVuCi0JCSAqIGhhdmUgdGhlIGVycm9yIG1lc3NhZ2UgdG8gcHJvdmlkZSBhcyBpbmZvcm1hdGlvbikuCi0JCSAqCi0JCSAqIEFsbG9jYXRlIGEgbmV3IGVudHJ5LgotCQkgKi8KLQkJY3VyZGV2ID0gbWFsbG9jKHNpemVvZihwY2FwX2lmX3QpKTsKLQkJaWYgKGN1cmRldiA9PSBOVUxMKSB7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotCi0JCS8qCi0JCSAqIEZpbGwgaW4gdGhlIGVudHJ5LgotCQkgKi8KLQkJY3VyZGV2LT5uZXh0ID0gTlVMTDsKLQkJY3VyZGV2LT5uYW1lID0gc3RyZHVwKG5hbWUpOwotCQlpZiAoY3VyZGV2LT5uYW1lID09IE5VTEwpIHsKLQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCWZyZWUoY3VyZGV2KTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBOVUxMKSB7Ci0JCQkvKgotCQkJICogV2UgaGF2ZSBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIGludGVyZmFjZS4KLQkJCSAqLwotCQkJY3VyZGV2LT5kZXNjcmlwdGlvbiA9IHN0cmR1cChkZXNjcmlwdGlvbik7Ci0JCQlpZiAoY3VyZGV2LT5kZXNjcmlwdGlvbiA9PSBOVUxMKSB7Ci0JCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlmcmVlKGN1cmRldi0+bmFtZSk7Ci0JCQkJZnJlZShjdXJkZXYpOwotCQkJCXJldHVybiAoLTEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIFdlIGRvbid0LgotCQkJICovCi0JCQljdXJkZXYtPmRlc2NyaXB0aW9uID0gTlVMTDsKLQkJfQotCQljdXJkZXYtPmFkZHJlc3NlcyA9IE5VTEw7CS8qIGxpc3Qgc3RhcnRzIG91dCBhcyBlbXB0eSAqLwotCQljdXJkZXYtPmZsYWdzID0gMDsKLQkJaWYgKElTTE9PUEJBQ0sobmFtZSwgZmxhZ3MpKQotCQkJY3VyZGV2LT5mbGFncyB8PSBQQ0FQX0lGX0xPT1BCQUNLOwotCQlpZiAoSVNVUChmbGFncykpCi0JCQljdXJkZXYtPmZsYWdzIHw9IFBDQVBfSUZfVVA7Ci0JCWlmIChJU1JVTk5JTkcoZmxhZ3MpKQotCQkJY3VyZGV2LT5mbGFncyB8PSBQQ0FQX0lGX1JVTk5JTkc7Ci0KLQkJLyoKLQkJICogQWRkIGl0IHRvIHRoZSBsaXN0LCBpbiB0aGUgYXBwcm9wcmlhdGUgbG9jYXRpb24uCi0JCSAqIEZpcnN0LCBnZXQgdGhlICJmaWd1cmUgb2YgbWVyaXQiIGZvciB0aGlzCi0JCSAqIGludGVyZmFjZS4KLQkJICovCi0JCXRoaXNfZmlndXJlX29mX21lcml0ID0gZ2V0X2ZpZ3VyZV9vZl9tZXJpdChjdXJkZXYpOwotCi0JCS8qCi0JCSAqIE5vdyBsb29rIGZvciB0aGUgbGFzdCBpbnRlcmZhY2Ugd2l0aCBhbiBmaWd1cmUgb2YgbWVyaXQKLQkJICogbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBuZXcgaW50ZXJmYWNlJ3MgZmlndXJlIG9mCi0JCSAqIG1lcml0LgotCQkgKgotCQkgKiBXZSBzdGFydCB3aXRoICJwcmV2ZGV2IiBiZWluZyBOVUxMLCBtZWFuaW5nIHdlJ3JlIGJlZm9yZQotCQkgKiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdC4KLQkJICovCi0JCXByZXZkZXYgPSBOVUxMOwotCQlmb3IgKDs7KSB7Ci0JCQkvKgotCQkJICogR2V0IHRoZSBpbnRlcmZhY2UgYWZ0ZXIgdGhpcyBvbmUuCi0JCQkgKi8KLQkJCWlmIChwcmV2ZGV2ID09IE5VTEwpIHsKLQkJCQkvKgotCQkJCSAqIFRoZSBuZXh0IGVsZW1lbnQgaXMgdGhlIGZpcnN0IGVsZW1lbnQuCi0JCQkJICovCi0JCQkJbmV4dGRldiA9ICphbGxkZXZzOwotCQkJfSBlbHNlCi0JCQkJbmV4dGRldiA9IHByZXZkZXYtPm5leHQ7Ci0KLQkJCS8qCi0JCQkgKiBBcmUgd2UgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdD8KLQkJCSAqLwotCQkJaWYgKG5leHRkZXYgPT0gTlVMTCkgewotCQkJCS8qCi0JCQkJICogWWVzIC0gd2UgaGF2ZSB0byBwdXQgdGhlIG5ldyBlbnRyeQotCQkJCSAqIGFmdGVyICJwcmV2ZGV2Ii4KLQkJCQkgKi8KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIElzIHRoZSBuZXcgaW50ZXJmYWNlJ3MgZmlndXJlIG9mIG1lcml0IGxlc3MKLQkJCSAqIHRoYW4gdGhlIG5leHQgaW50ZXJmYWNlJ3MgZmlndXJlIG9mIG1lcml0LAotCQkJICogbWVhbmluZyB0aGF0IHRoZSBuZXcgaW50ZXJmYWNlIGlzIGJldHRlcgotCQkJICogdGhhbiB0aGUgbmV4dCBpbnRlcmZhY2U/Ci0JCQkgKi8KLQkJCW5leHRkZXZfZmlndXJlX29mX21lcml0ID0gZ2V0X2ZpZ3VyZV9vZl9tZXJpdChuZXh0ZGV2KTsKLQkJCWlmICh0aGlzX2ZpZ3VyZV9vZl9tZXJpdCA8IG5leHRkZXZfZmlndXJlX29mX21lcml0KSB7Ci0JCQkJLyoKLQkJCQkgKiBZZXMgLSB3ZSBzaG91bGQgcHV0IHRoZSBuZXcgZW50cnkKLQkJCQkgKiBiZWZvcmUgIm5leHRkZXYiLCBpLmUuIGFmdGVyICJwcmV2ZGV2Ii4KLQkJCQkgKi8KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcHJldmRldiA9IG5leHRkZXY7Ci0JCX0KLQotCQkvKgotCQkgKiBJbnNlcnQgYmVmb3JlICJuZXh0ZGV2Ii4KLQkJICovCi0JCWN1cmRldi0+bmV4dCA9IG5leHRkZXY7Ci0KLQkJLyoKLQkJICogSW5zZXJ0IGFmdGVyICJwcmV2ZGV2IiAtIHVubGVzcyAicHJldmRldiIgaXMgbnVsbCwKLQkJICogaW4gd2hpY2ggY2FzZSB0aGlzIGlzIHRoZSBmaXJzdCBpbnRlcmZhY2UuCi0JCSAqLwotCQlpZiAocHJldmRldiA9PSBOVUxMKSB7Ci0JCQkvKgotCQkJICogVGhpcyBpcyB0aGUgZmlyc3QgaW50ZXJmYWNlLiAgUGFzcyBiYWNrIGEKLQkJCSAqIHBvaW50ZXIgdG8gaXQsIGFuZCBwdXQgImN1cmRldiIgYmVmb3JlCi0JCQkgKiAibmV4dGRldiIuCi0JCQkgKi8KLQkJCSphbGxkZXZzID0gY3VyZGV2OwotCQl9IGVsc2UKLQkJCXByZXZkZXYtPm5leHQgPSBjdXJkZXY7Ci0JfQotCi0JKmN1cmRldl9yZXQgPSBjdXJkZXY7Ci0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIFRyeSB0byBnZXQgYSBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbiBkZXZpY2UuCi0gKiBSZXR1cm5zIGEgbWFsbG9jYXRlZCBkZXNjcmlwdGlvbiBpZiBpdCBjb3VsZCBhbmQgTlVMTCBpZiBpdCBjb3VsZG4ndC4KLSAqCi0gKiBYWFggLSBvbiBGcmVlQlNEcyB0aGF0IHN1cHBvcnQgaXQsIHNob3VsZCBpdCBnZXQgdGhlIHN5c2N0bCBuYW1lZAotICogImRldi57YWRhcHRlciBmYW1pbHkgbmFtZX0ue2FkYXB0ZXIgdW5pdH0uJWRlc2MiIHRvIGdldCBhIGRlc2NyaXB0aW9uCi0gKiBvZiB0aGUgYWRhcHRlcj8gIE5vdGUgdGhhdCAiZGV2LmFuLjAuJWRlc2MiIGlzICJBaXJvbmV0IFBDNDUwMC9QQzQ4MDAiCi0gKiB3aXRoIG15IENpc2NvIDM1MCBjYXJkLCBzbyB0aGUgbmFtZSBpc24ndCBlbnRpcmVseSBkZXNjcmlwdGl2ZS4gIFRoZQotICogImRldi5hbi4wLiVwbnBpbmZvIiBoYXMgYSBiZXR0ZXIgZGVzY3JpcHRpb24sIGFsdGhvdWdoIG9uZSBtaWdodCBhcmd1ZQotICogdGhhdCB0aGUgcHJvYmxlbSBpcyByZWFsbHkgYSBkcml2ZXIgYnVnIC0gaWYgaXQgY2FuIGZpbmQgb3V0IHRoYXQgaXQncwotICogYSBDaXNjbyAzNDAgb3IgMzUwLCByYXRoZXIgdGhhbiBhbiBvbGQgQWlyb25ldCBjYXJkLCBpdCBzaG91bGQgdXNlCi0gKiB0aGF0IGluIHRoZSBkZXNjcmlwdGlvbi4KLSAqCi0gKiBEbyBOZXRCU0QsIERyYWdvbmZseUJTRCwgb3IgT3BlbkJTRCBzdXBwb3J0IHRoaXMgYXMgd2VsbD8gIEZyZWVCU0QKLSAqIGFuZCBPcGVuQlNEIGxldCB5b3UgZ2V0IGEgZGVzY3JpcHRpb24sIGJ1dCBpdCdzIG5vdCBnZW5lcmF0ZWQgYnkgdGhlIE9TLAotICogaXQncyBzZXQgd2l0aCBhbm90aGVyIGlvY3RsIHRoYXQgaWZjb25maWcgc3VwcG9ydHM7IHdlIHVzZSB0aGF0IHRvIGdldAotICogYSBkZXNjcmlwdGlvbiBpbiBGcmVlQlNEIGFuZCBPcGVuQlNELCBidXQgaWYgdGhlcmUgaXMgbm8gc3VjaAotICogZGVzY3JpcHRpb24gYXZhaWxhYmxlLCBpdCBzdGlsbCBtaWdodCBiZSBuaWNlIHRvIGdldCBzb21lIGRlc2NyaXB0aW9uCi0gKiBzdHJpbmcgYmFzZWQgb24gdGhlIGRldmljZSB0eXBlIG9yIHNvbWV0aGluZyBzdWNoIGFzIHRoYXQuCi0gKgotICogSW4gT1MgWCwgdGhlIFN5c3RlbSBDb25maWd1cmF0aW9uIGZyYW1ld29yayBjYW4gYXBwYXJlbnRseSByZXR1cm4KLSAqIG5hbWVzIGluIDEwLjQgYW5kIGxhdGVyLgotICoKLSAqIEl0IGFsc28gYXBwZWFycyB0aGF0IGZyZWVkZXNrdG9wLm9yZydzIEhBTCBvZmZlcnMgYW4gImluZm8ucHJvZHVjdCIKLSAqIHN0cmluZywgYnV0IHRoZSBIQUwgc3BlY2lmaWNhdGlvbiBzYXlzIGl0ICJzaG91bGQgbm90IGJlIHVzZWQgaW4gYW55Ci0gKiBVSSIgYW5kICJzdWJzeXN0ZW0vY2FwYWJpbGl0eSBzcGVjaWZpYyBwcm9wZXJ0aWVzIiBzaG91bGQgYmUgdXNlZAotICogaW5zdGVhZCBhbmQsIGluIGFueSBjYXNlLCBJIHRoaW5rIEhBTCBpcyBiZWluZyBkZXByZWNhdGVkIGluCi0gKiBmYXZvciBvZiBvdGhlciBzdHVmZiBzdWNoIGFzIERldmljZUtpdC4gIERldmljZUtpdCBkb2Vzbid0IGFwcGVhcgotICogdG8gaGF2ZSBhbnkgb2J2aW91cyBwcm9kdWN0IGluZm9ybWF0aW9uIGZvciBkZXZpY2VzLCBidXQgbWF5YmUKLSAqIEkgaGF2ZW4ndCBsb29rZWQgaGFyZCBlbm91Z2guCi0gKgotICogVXNpbmcgdGhlIFN5c3RlbSBDb25maWd1cmF0aW9uIGZyYW1ld29yaywgb3IgSEFMLCBvciBEZXZpY2VLaXQsIG9yCi0gKiB3aGF0ZXZlciwgd291bGQgcmVxdWlyZSB0aGF0IGxpYnBjYXAgYXBwbGljYXRpb25zIGJlIGxpbmtlZCB3aXRoCi0gKiB0aGUgZnJhbWV3b3Jrcy9saWJyYXJpZXMgaW4gcXVlc3Rpb24uICBUaGF0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0KLSAqIGZvciBwcm9ncmFtcyBsaW5raW5nIHdpdGggdGhlIHNoYXJlZCB2ZXJzaW9uIG9mIGxpYnBjYXAgKHVubGVzcwotICogeW91J3JlIHJ1bm5pbmcgb24gQUlYIC0gd2hpY2ggSSB0aGluayBpcyB0aGUgb25seSBVTipYIHRoYXQgZG9lc24ndAotICogc3VwcG9ydCBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCBvdGhlciBsaWJyYXJpZXMgb24gd2hpY2ggaXQKLSAqIGRlcGVuZHMsIGFuZCBoYXZpbmcgYW4gZXhlY3V0YWJsZSBsaW5rZWQgb25seSB3aXRoIHRoZSBmaXJzdCBzaGFyZWQKLSAqIGxpYnJhcnkgYXV0b21hdGljYWxseSBwaWNrIHVwIHRoZSBvdGhlciBsaWJyYXJpZXMgd2hlbiBzdGFydGVkIC0KLSAqIGFuZCB1c2luZyBIQUwgb3Igd2hhdGV2ZXIpLiAgUHJvZ3JhbXMgbGlua2VkIHdpdGggdGhlIHN0YXRpYwotICogdmVyc2lvbiBvZiBsaWJwY2FwIHdvdWxkIGhhdmUgdG8gdXNlIHBjYXAtY29uZmlnIHdpdGggdGhlIC0tc3RhdGljCi0gKiBmbGFnIGluIG9yZGVyIHRvIGdldCB0aGUgcmlnaHQgbGlua2VyIGZsYWdzIGluIG9yZGVyIHRvIHBpY2sgdXAKLSAqIHRoZSBhZGRpdGlvbmFsIGxpYnJhcmllcy9mcmFtZXdvcmtzOyB0aG9zZSBwcm9ncmFtcyBuZWVkIHRoYXQgYW55d2F5Ci0gKiBmb3IgbGlicGNhcCAxLjEgYW5kIGJleW9uZCBvbiBMaW51eCwgYXMsIGJ5IGRlZmF1bHQsIGl0IHJlcXVpcmVzCi0gKiAtbG5sLgotICoKLSAqIERvIGFueSBvdGhlciBVTipYZXMsIG9yIGRlc2t0b3AgZW52aXJvbm1lbnRzIHN1cHBvcnQgZ2V0dGluZyBhCi0gKiBkZXNjcmlwdGlvbj8KLSAqLwotc3RhdGljIGNoYXIgKgotZ2V0X2lmX2Rlc2NyaXB0aW9uKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0jaWZkZWYgU0lPQ0dJRkRFU0NSCi0JY2hhciAqZGVzY3JpcHRpb24gPSBOVUxMOwotCWludCBzOwotCXN0cnVjdCBpZnJlcSBpZnJkZXNjOwotI2lmbmRlZiBJRkRFU0NSU0laRQotCXNpemVfdCBkZXNjcmxlbiA9IDY0OwotI2Vsc2UKLQlzaXplX3QgZGVzY3JsZW4gPSBJRkRFU0NSU0laRTsKLSNlbmRpZiAvKiBJRkRFU0NSU0laRSAqLwotCi0JLyoKLQkgKiBHZXQgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgaW50ZXJmYWNlLgotCSAqLwotCW1lbXNldCgmaWZyZGVzYywgMCwgc2l6ZW9mIGlmcmRlc2MpOwotCXN0cmxjcHkoaWZyZGVzYy5pZnJfbmFtZSwgbmFtZSwgc2l6ZW9mIGlmcmRlc2MuaWZyX25hbWUpOwotCXMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7Ci0JaWYgKHMgPj0gMCkgewotI2lmZGVmIF9fRnJlZUJTRF9fCi0JCS8qCi0JCSAqIE9uIEZyZWVCU0QsIGlmIHRoZSBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaCBmb3IgdGhlCi0JCSAqIGRlc2NyaXB0aW9uLCB0aGUgaW9jdGwgc3VjY2VlZHMsIGJ1dCB0aGUgZGVzY3JpcHRpb24KLQkJICogaXNuJ3QgY29waWVkLCBpZnJfYnVmZmVyLmxlbmd0aCBpcyBzZXQgdG8gdGhlIGRlc2NyaXB0aW9uCi0JCSAqIGxlbmd0aCwgYW5kIGlmcl9idWZmZXIuYnVmZmVyIGlzIHNldCB0byBOVUxMLgotCQkgKi8KLQkJZm9yICg7OykgewotCQkJZnJlZShkZXNjcmlwdGlvbik7Ci0JCQlpZiAoKGRlc2NyaXB0aW9uID0gbWFsbG9jKGRlc2NybGVuKSkgIT0gTlVMTCkgewotCQkJCWlmcmRlc2MuaWZyX2J1ZmZlci5idWZmZXIgPSBkZXNjcmlwdGlvbjsKLQkJCQlpZnJkZXNjLmlmcl9idWZmZXIubGVuZ3RoID0gZGVzY3JsZW47Ci0JCQkJaWYgKGlvY3RsKHMsIFNJT0NHSUZERVNDUiwgJmlmcmRlc2MpID09IDApIHsKLQkJCQkJaWYgKGlmcmRlc2MuaWZyX2J1ZmZlci5idWZmZXIgPT0KLQkJCQkJICAgIGRlc2NyaXB0aW9uKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWVsc2UKLQkJCQkJCWRlc2NybGVuID0gaWZyZGVzYy5pZnJfYnVmZmVyLmxlbmd0aDsKLQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBGYWlsZWQgdG8gZ2V0IGludGVyZmFjZSBkZXNjcmlwdGlvbi4KLQkJCQkJICovCi0JCQkJCWZyZWUoZGVzY3JpcHRpb24pOwotCQkJCQlkZXNjcmlwdGlvbiA9IE5VTEw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0jZWxzZSAvKiBfX0ZyZWVCU0RfXyAqLwotCQkvKgotCQkgKiBUaGUgb25seSBvdGhlciBPUyB0aGF0IGN1cnJlbnRseSBzdXBwb3J0cwotCQkgKiBTSU9DR0lGREVTQ1IgaXMgT3BlbkJTRCwgYW5kIGl0IGhhcyBubyB3YXkKLQkJICogdG8gZ2V0IHRoZSBkZXNjcmlwdGlvbiBsZW5ndGggLSBpdCdzIGNsYW1wZWQKLQkJICogdG8gYSBtYXhpbXVtIG9mIElGREVTQ1JTSVpFLgotCQkgKi8KLQkJaWYgKChkZXNjcmlwdGlvbiA9IG1hbGxvYyhkZXNjcmxlbikpICE9IE5VTEwpIHsKLQkJCWlmcmRlc2MuaWZyX2RhdGEgPSAoY2FkZHJfdClkZXNjcmlwdGlvbjsKLQkJCWlmIChpb2N0bChzLCBTSU9DR0lGREVTQ1IsICZpZnJkZXNjKSAhPSAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBGYWlsZWQgdG8gZ2V0IGludGVyZmFjZSBkZXNjcmlwdGlvbi4KLQkJCQkgKi8KLQkJCQlmcmVlKGRlc2NyaXB0aW9uKTsKLQkJCQlkZXNjcmlwdGlvbiA9IE5VTEw7Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvKiBfX0ZyZWVCU0RfXyAqLwotCQljbG9zZShzKTsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IE5VTEwgJiYgc3RybGVuKGRlc2NyaXB0aW9uKSA9PSAwKSB7Ci0JCQlmcmVlKGRlc2NyaXB0aW9uKTsKLQkJCWRlc2NyaXB0aW9uID0gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiAoZGVzY3JpcHRpb24pOwotI2Vsc2UgLyogU0lPQ0dJRkRFU0NSICovCi0JcmV0dXJuIChOVUxMKTsKLSNlbmRpZiAvKiBTSU9DR0lGREVTQ1IgKi8KLX0KLQotLyoKLSAqIFRyeSB0byBnZXQgYSBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbiBkZXZpY2UsIGFuZCB0aGVuIGxvb2sgZm9yIHRoYXQKLSAqIGRldmljZSBpbiB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgZGV2aWNlcy4KLSAqCi0gKiBJZiB3ZSBmaW5kIGl0LCB0aGVuLCBpZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgaXNuJ3QgbnVsbCwgYWRkIGl0IHRvCi0gKiB0aGUgbGlzdCBvZiBhZGRyZXNzZXMgZm9yIHRoZSBkZXZpY2UgYW5kIHJldHVybiAwLgotICoKLSAqIElmIHdlIGRvbid0IGZpbmQgaXQsIGNoZWNrIHdoZXRoZXIgd2UgY2FuIG9wZW4gaXQ6Ci0gKgotICogICAgIElmIHRoYXQgZmFpbHMgd2l0aCBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFIG9yCi0gKiAgICAgUENBUF9FUlJPUl9JRkFDRV9OT1RfVVAsIGRvbid0IGF0dGVtcHQgdG8gYWRkIGFuIGVudHJ5IGZvcgotICogICAgIGl0LCBhcyB0aGF0IHByb2JhYmx5IG1lYW5zIGl0IGV4aXN0cyBidXQgZG9lc24ndCBzdXBwb3J0Ci0gKiAgICAgcGFja2V0IGNhcHR1cmUuCi0gKgotICogICAgIE90aGVyd2lzZSwgYXR0ZW1wdCB0byBhZGQgYW4gZW50cnkgZm9yIGl0LCB3aXRoIHRoZSBzcGVjaWZpZWQKLSAqICAgICBpZm5ldCBmbGFncyBhbmQgZGVzY3JpcHRpb24sIGFuZCwgaWYgdGhhdCBzdWNjZWVkcywgYWRkIHRoZQotICogICAgIHNwZWNpZmllZCBhZGRyZXNzIHRvIGl0cyBsaXN0IG9mIGFkZHJlc3NlcyBpZiB0aGF0IGFkZHJlc3MgaXMKLSAqICAgICBub24tbnVsbCwgc2V0ICpjdXJkZXZfcmV0IHRvIHBvaW50IHRvIHRoZSBuZXcgZW50cnksIGFuZAotICogICAgIHJldHVybiAwLCBvdGhlcndpc2UgcmV0dXJuIFBDQVBfRVJST1IgYW5kIHNldCBlcnJidWYgdG8gYW4KLSAqICAgICBlcnJvciBtZXNzYWdlLgotICoKLSAqIChXZSBjYW4gZ2V0IGNhbGxlZCB3aXRoIGEgbnVsbCBhZGRyZXNzIGJlY2F1c2Ugd2UgbWlnaHQgZ2V0IGEgbGlzdAotICogb2YgaW50ZXJmYWNlIG5hbWUvYWRkcmVzcyBjb21iaW5hdGlvbnMgZnJvbSB0aGUgdW5kZXJseWluZyBPUywgd2l0aAotICogdGhlIGFkZHJlc3MgYmVpbmcgYWJzZW50IGluIHNvbWUgY2FzZXMsIHJhdGhlciB0aGFuIGEgbGlzdCBvZgotICogaW50ZXJmYWNlcyB3aXRoIGVhY2ggaW50ZXJmYWNlIGhhdmluZyBhIGxpc3Qgb2YgYWRkcmVzc2VzLCBzbyB0aGlzCi0gKiBjYWxsIG1heSBiZSB0aGUgb25seSBjYWxsIG1hZGUgdG8gYWRkIHRvIHRoZSBsaXN0LCBhbmQgd2Ugd2FudCB0bwotICogYWRkIGludGVyZmFjZXMgZXZlbiBpZiB0aGV5IGhhdmUgbm8gYWRkcmVzc2VzLikKLSAqLwotaW50Ci1hZGRfYWRkcl90b19pZmxpc3QocGNhcF9pZl90ICoqYWxsZGV2cywgY29uc3QgY2hhciAqbmFtZSwgdV9pbnQgZmxhZ3MsCi0gICAgc3RydWN0IHNvY2thZGRyICphZGRyLCBzaXplX3QgYWRkcl9zaXplLAotICAgIHN0cnVjdCBzb2NrYWRkciAqbmV0bWFzaywgc2l6ZV90IG5ldG1hc2tfc2l6ZSwKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgKmJyb2FkYWRkciwgc2l6ZV90IGJyb2FkYWRkcl9zaXplLAotICAgIHN0cnVjdCBzb2NrYWRkciAqZHN0YWRkciwgc2l6ZV90IGRzdGFkZHJfc2l6ZSwKLSAgICBjaGFyICplcnJidWYpCi17Ci0JY2hhciAqZGVzY3JpcHRpb247Ci0JcGNhcF9pZl90ICpjdXJkZXY7Ci0KLQlkZXNjcmlwdGlvbiA9IGdldF9pZl9kZXNjcmlwdGlvbihuYW1lKTsKLQlpZiAoYWRkX29yX2ZpbmRfaWYoJmN1cmRldiwgYWxsZGV2cywgbmFtZSwgZmxhZ3MsIGRlc2NyaXB0aW9uLAotCSAgICBlcnJidWYpID09IC0xKSB7Ci0JCWZyZWUoZGVzY3JpcHRpb24pOwotCQkvKgotCQkgKiBFcnJvciAtIGdpdmUgdXAuCi0JCSAqLwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0JZnJlZShkZXNjcmlwdGlvbik7Ci0JaWYgKGN1cmRldiA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIERldmljZSB3YXNuJ3QgYWRkZWQgYmVjYXVzZSBpdCBjYW4ndCBiZSBvcGVuZWQuCi0JCSAqIE5vdCBhIGZhdGFsIGVycm9yLgotCQkgKi8KLQkJcmV0dXJuICgwKTsKLQl9Ci0KLQlpZiAoYWRkciA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIFRoZXJlJ3Mgbm8gYWRkcmVzcyB0byBhZGQ7IHRoaXMgZW50cnkganVzdCBtZWFudAotCQkgKiAiaGVyZSdzIGEgbmV3IGludGVyZmFjZSIuCi0JCSAqLwotCQlyZXR1cm4gKDApOwotCX0KLQotCS8qCi0JICogImN1cmRldiIgaXMgYW4gZW50cnkgZm9yIHRoaXMgaW50ZXJmYWNlLCBhbmQgd2UgaGF2ZSBhbgotCSAqIGFkZHJlc3MgZm9yIGl0OyBhZGQgYW4gZW50cnkgZm9yIHRoYXQgYWRkcmVzcyB0byB0aGUKLQkgKiBpbnRlcmZhY2UncyBsaXN0IG9mIGFkZHJlc3Nlcy4KLQkgKgotCSAqIEFsbG9jYXRlIHRoZSBuZXcgZW50cnkgYW5kIGZpbGwgaXQgaW4uCi0JICovCi0JcmV0dXJuIChhZGRfYWRkcl90b19kZXYoY3VyZGV2LCBhZGRyLCBhZGRyX3NpemUsIG5ldG1hc2ssCi0JICAgIG5ldG1hc2tfc2l6ZSwgYnJvYWRhZGRyLCBicm9hZGFkZHJfc2l6ZSwgZHN0YWRkciwKLQkgICAgZHN0YWRkcl9zaXplLCBlcnJidWYpKTsKLX0KLQotLyoKLSAqIEFkZCBhbiBlbnRyeSB0byB0aGUgbGlzdCBvZiBhZGRyZXNzZXMgZm9yIGFuIGludGVyZmFjZS4KLSAqICJjdXJkZXYiIGlzIHRoZSBlbnRyeSBmb3IgdGhhdCBpbnRlcmZhY2UuCi0gKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBJUCBhZGRyZXNzIGFkZGVkIHRvIHRoZSBpbnRlcmZhY2UsIG1vdmUgaXQKLSAqIGluIHRoZSBsaXN0IGFzIGFwcHJvcHJpYXRlLgotICovCi1pbnQKLWFkZF9hZGRyX3RvX2RldihwY2FwX2lmX3QgKmN1cmRldiwKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNpemVfdCBhZGRyX3NpemUsCi0gICAgc3RydWN0IHNvY2thZGRyICpuZXRtYXNrLCBzaXplX3QgbmV0bWFza19zaXplLAotICAgIHN0cnVjdCBzb2NrYWRkciAqYnJvYWRhZGRyLCBzaXplX3QgYnJvYWRhZGRyX3NpemUsCi0gICAgc3RydWN0IHNvY2thZGRyICpkc3RhZGRyLCBzaXplX3QgZHN0YWRkcl9zaXplLAotICAgIGNoYXIgKmVycmJ1ZikKLXsKLQlwY2FwX2FkZHJfdCAqY3VyYWRkciwgKnByZXZhZGRyLCAqbmV4dGFkZHI7Ci0KLQljdXJhZGRyID0gbWFsbG9jKHNpemVvZihwY2FwX2FkZHJfdCkpOwotCWlmIChjdXJhZGRyID09IE5VTEwpIHsKLQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCWN1cmFkZHItPm5leHQgPSBOVUxMOwotCWlmIChhZGRyICE9IE5VTEwpIHsKLQkJY3VyYWRkci0+YWRkciA9IGR1cF9zb2NrYWRkcihhZGRyLCBhZGRyX3NpemUpOwotCQlpZiAoY3VyYWRkci0+YWRkciA9PSBOVUxMKSB7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQlmcmVlKGN1cmFkZHIpOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9IGVsc2UKLQkJY3VyYWRkci0+YWRkciA9IE5VTEw7Ci0KLQlpZiAobmV0bWFzayAhPSBOVUxMKSB7Ci0JCWN1cmFkZHItPm5ldG1hc2sgPSBkdXBfc29ja2FkZHIobmV0bWFzaywgbmV0bWFza19zaXplKTsKLQkJaWYgKGN1cmFkZHItPm5ldG1hc2sgPT0gTlVMTCkgewotCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJaWYgKGN1cmFkZHItPmFkZHIgIT0gTlVMTCkKLQkJCQlmcmVlKGN1cmFkZHItPmFkZHIpOwotCQkJZnJlZShjdXJhZGRyKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JfSBlbHNlCi0JCWN1cmFkZHItPm5ldG1hc2sgPSBOVUxMOwotCi0JaWYgKGJyb2FkYWRkciAhPSBOVUxMKSB7Ci0JCWN1cmFkZHItPmJyb2FkYWRkciA9IGR1cF9zb2NrYWRkcihicm9hZGFkZHIsIGJyb2FkYWRkcl9zaXplKTsKLQkJaWYgKGN1cmFkZHItPmJyb2FkYWRkciA9PSBOVUxMKSB7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQlpZiAoY3VyYWRkci0+bmV0bWFzayAhPSBOVUxMKQotCQkJCWZyZWUoY3VyYWRkci0+bmV0bWFzayk7Ci0JCQlpZiAoY3VyYWRkci0+YWRkciAhPSBOVUxMKQotCQkJCWZyZWUoY3VyYWRkci0+YWRkcik7Ci0JCQlmcmVlKGN1cmFkZHIpOwotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQl9IGVsc2UKLQkJY3VyYWRkci0+YnJvYWRhZGRyID0gTlVMTDsKLQotCWlmIChkc3RhZGRyICE9IE5VTEwpIHsKLQkJY3VyYWRkci0+ZHN0YWRkciA9IGR1cF9zb2NrYWRkcihkc3RhZGRyLCBkc3RhZGRyX3NpemUpOwotCQlpZiAoY3VyYWRkci0+ZHN0YWRkciA9PSBOVUxMKSB7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQlpZiAoY3VyYWRkci0+YnJvYWRhZGRyICE9IE5VTEwpCi0JCQkJZnJlZShjdXJhZGRyLT5icm9hZGFkZHIpOwotCQkJaWYgKGN1cmFkZHItPm5ldG1hc2sgIT0gTlVMTCkKLQkJCQlmcmVlKGN1cmFkZHItPm5ldG1hc2spOwotCQkJaWYgKGN1cmFkZHItPmFkZHIgIT0gTlVMTCkKLQkJCQlmcmVlKGN1cmFkZHItPmFkZHIpOwotCQkJZnJlZShjdXJhZGRyKTsKLQkJCXJldHVybiAoLTEpOwotCQl9Ci0JfSBlbHNlCi0JCWN1cmFkZHItPmRzdGFkZHIgPSBOVUxMOwotCi0JLyoKLQkgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgYWRkcmVzc2VzLgotCSAqLwotCWZvciAocHJldmFkZHIgPSBjdXJkZXYtPmFkZHJlc3NlczsgcHJldmFkZHIgIT0gTlVMTDsgcHJldmFkZHIgPSBuZXh0YWRkcikgewotCQluZXh0YWRkciA9IHByZXZhZGRyLT5uZXh0OwotCQlpZiAobmV4dGFkZHIgPT0gTlVMTCkgewotCQkJLyoKLQkJCSAqIFRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLQkJCSAqLwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAocHJldmFkZHIgPT0gTlVMTCkgewotCQkvKgotCQkgKiBUaGUgbGlzdCB3YXMgZW1wdHk7IHRoaXMgaXMgdGhlIGZpcnN0IG1lbWJlci4KLQkJICovCi0JCWN1cmRldi0+YWRkcmVzc2VzID0gY3VyYWRkcjsKLQl9IGVsc2UgewotCQkvKgotCQkgKiAicHJldmFkZHIiIGlzIHRoZSBsYXN0IG1lbWJlciBvZiB0aGUgbGlzdDsgYXBwZW5kCi0JCSAqIHRoaXMgbWVtYmVyIHRvIGl0LgotCQkgKi8KLQkJcHJldmFkZHItPm5leHQgPSBjdXJhZGRyOwotCX0KLQotCXJldHVybiAoMCk7Ci19Ci0KLS8qCi0gKiBMb29rIGZvciBhIGdpdmVuIGRldmljZSBpbiB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgZGV2aWNlcy4KLSAqCi0gKiBJZiB3ZSBmaW5kIGl0LCByZXR1cm4gMC4KLSAqCi0gKiBJZiB3ZSBkb24ndCBmaW5kIGl0LCBjaGVjayB3aGV0aGVyIHdlIGNhbiBvcGVuIGl0OgotICoKLSAqICAgICBJZiB0aGF0IGZhaWxzIHdpdGggUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSBvcgotICogICAgIFBDQVBfRVJST1JfSUZBQ0VfTk9UX1VQLCBkb24ndCBhdHRlbXB0IHRvIGFkZCBhbiBlbnRyeSBmb3IKLSAqICAgICBpdCwgYXMgdGhhdCBwcm9iYWJseSBtZWFucyBpdCBleGlzdHMgYnV0IGRvZXNuJ3Qgc3VwcG9ydAotICogICAgIHBhY2tldCBjYXB0dXJlLgotICoKLSAqICAgICBPdGhlcndpc2UsIGF0dGVtcHQgdG8gYWRkIGFuIGVudHJ5IGZvciBpdCwgd2l0aCB0aGUgc3BlY2lmaWVkCi0gKiAgICAgaWZuZXQgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uLCBhbmQsIGlmIHRoYXQgc3VjY2VlZHMsIHJldHVybiAwCi0gKiAgICAgYW5kIHNldCAqY3VyZGV2X3JldCB0byBwb2ludCB0byB0aGUgbmV3IGVudHJ5LCBvdGhlcndpc2UKLSAqICAgICByZXR1cm4gUENBUF9FUlJPUiBhbmQgc2V0IGVycmJ1ZiB0byBhbiBlcnJvciBtZXNzYWdlLgotICovCi1pbnQKLXBjYXBfYWRkX2lmKHBjYXBfaWZfdCAqKmRldmxpc3QsIGNvbnN0IGNoYXIgKm5hbWUsIHVfaW50IGZsYWdzLAotICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLCBjaGFyICplcnJidWYpCi17Ci0JcGNhcF9pZl90ICpjdXJkZXY7Ci0KLQlyZXR1cm4gKGFkZF9vcl9maW5kX2lmKCZjdXJkZXYsIGRldmxpc3QsIG5hbWUsIGZsYWdzLCBkZXNjcmlwdGlvbiwKLQkgICAgZXJyYnVmKSk7Ci19Ci0KLQotLyoKLSAqIEZyZWUgYSBsaXN0IG9mIGludGVyZmFjZXMuCi0gKi8KLXZvaWQKLXBjYXBfZnJlZWFsbGRldnMocGNhcF9pZl90ICphbGxkZXZzKQotewotCXBjYXBfaWZfdCAqY3VyZGV2LCAqbmV4dGRldjsKLQlwY2FwX2FkZHJfdCAqY3VyYWRkciwgKm5leHRhZGRyOwotCi0JZm9yIChjdXJkZXYgPSBhbGxkZXZzOyBjdXJkZXYgIT0gTlVMTDsgY3VyZGV2ID0gbmV4dGRldikgewotCQluZXh0ZGV2ID0gY3VyZGV2LT5uZXh0OwotCi0JCS8qCi0JCSAqIEZyZWUgYWxsIGFkZHJlc3Nlcy4KLQkJICovCi0JCWZvciAoY3VyYWRkciA9IGN1cmRldi0+YWRkcmVzc2VzOyBjdXJhZGRyICE9IE5VTEw7IGN1cmFkZHIgPSBuZXh0YWRkcikgewotCQkJbmV4dGFkZHIgPSBjdXJhZGRyLT5uZXh0OwotCQkJaWYgKGN1cmFkZHItPmFkZHIpCi0JCQkJZnJlZShjdXJhZGRyLT5hZGRyKTsKLQkJCWlmIChjdXJhZGRyLT5uZXRtYXNrKQotCQkJCWZyZWUoY3VyYWRkci0+bmV0bWFzayk7Ci0JCQlpZiAoY3VyYWRkci0+YnJvYWRhZGRyKQotCQkJCWZyZWUoY3VyYWRkci0+YnJvYWRhZGRyKTsKLQkJCWlmIChjdXJhZGRyLT5kc3RhZGRyKQotCQkJCWZyZWUoY3VyYWRkci0+ZHN0YWRkcik7Ci0JCQlmcmVlKGN1cmFkZHIpOwotCQl9Ci0KLQkJLyoKLQkJICogRnJlZSB0aGUgbmFtZSBzdHJpbmcuCi0JCSAqLwotCQlmcmVlKGN1cmRldi0+bmFtZSk7Ci0KLQkJLyoKLQkJICogRnJlZSB0aGUgZGVzY3JpcHRpb24gc3RyaW5nLCBpZiBhbnkuCi0JCSAqLwotCQlpZiAoY3VyZGV2LT5kZXNjcmlwdGlvbiAhPSBOVUxMKQotCQkJZnJlZShjdXJkZXYtPmRlc2NyaXB0aW9uKTsKLQotCQkvKgotCQkgKiBGcmVlIHRoZSBpbnRlcmZhY2UuCi0JCSAqLwotCQlmcmVlKGN1cmRldik7Ci0JfQotfQotCi0jaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQorI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCiAKIC8qCiAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgYSBuZXR3b3JrIGludGVyZmFjZSBhdHRhY2hlZCB0byB0aGUgc3lzdGVtLCBvciBOVUxMCkBAIC05MTUsNyArMTU4LDcgQEAKIAogCWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwogCWlmIChmZCA8IDApIHsKLQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic29ja2V0OiAlcyIsCisJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic29ja2V0OiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTkyNywxMCArMTcwLDEwIEBACiAJKHZvaWQpc3RybGNweShpZnIuaWZyX25hbWUsIGRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwogCWlmIChpb2N0bChmZCwgU0lPQ0dJRkFERFIsIChjaGFyICopJmlmcikgPCAwKSB7CiAJCWlmIChlcnJubyA9PSBFQUREUk5PVEFWQUlMKSB7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiJXM6IG5vIElQdjQgYWRkcmVzcyBhc3NpZ25lZCIsIGRldmljZSk7CiAJCX0gZWxzZSB7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiU0lPQ0dJRkFERFI6ICVzOiAlcyIsCiAJCQkgICAgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCX0KQEAgLTk0Niw3ICsxODksNyBAQAogI2VuZGlmCiAJKHZvaWQpc3RybGNweShpZnIuaWZyX25hbWUsIGRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwogCWlmIChpb2N0bChmZCwgU0lPQ0dJRk5FVE1BU0ssIChjaGFyICopJmlmcikgPCAwKSB7Ci0JCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiU0lPQ0dJRk5FVE1BU0s6ICVzOiAlcyIsIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkodm9pZCljbG9zZShmZCk7CiAJCXJldHVybiAoLTEpOwpAQCAtOTYxLDcgKzIwNCw3IEBACiAJCWVsc2UgaWYgKElOX0NMQVNTQygqbmV0cCkpCiAJCQkqbWFza3AgPSBJTl9DTEFTU0NfTkVUOwogCQllbHNlIHsKLQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJpbmV0IGNsYXNzIGZvciAweCV4IHVua25vd24iLCAqbmV0cCk7CiAJCQlyZXR1cm4gKC0xKTsKIAkJfQpAQCAtOTcwLDI4ICsyMTMsMzggQEAKIAlyZXR1cm4gKDApOwogfQogCi0jZWxpZiBkZWZpbmVkKFdJTjMyKQorI2VsaWYgZGVmaW5lZChfV0lOMzIpCiAKIC8qCiAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgYSBuZXR3b3JrIGludGVyZmFjZSBhdHRhY2hlZCB0byB0aGUgc3lzdGVtLCBvciBOVUxMCiAgKiBpZiBub25lIGNhbiBiZSBmb3VuZC4gIFRoZSBpbnRlcmZhY2UgbXVzdCBiZSBjb25maWd1cmVkIHVwOyB0aGUKICAqIGxvd2VzdCB1bml0IG51bWJlciBpcyBwcmVmZXJyZWQ7IGxvb3BiYWNrIGlzIGlnbm9yZWQuCisgKgorICogSW4gdGhlIGJlc3Qgb2YgYWxsIHBvc3NpYmxlIHdvcmxkcywgdGhpcyB3b3VsZCBiZSB0aGUgc2FtZSBhcyBvbgorICogVU4qWCwgYnV0IHRoZXJlIG1heSBiZSBzb2Z0d2FyZSB0aGF0IGV4cGVjdHMgdGhpcyB0byByZXR1cm4gYQorICogZnVsbCBsaXN0IG9mIGRldmljZXMgYWZ0ZXIgdGhlIGZpcnN0IGRldmljZS4KICAqLworI2RlZmluZSBBREFQVEVSU05BTUVfTEVOCTgxOTIKIGNoYXIgKgogcGNhcF9sb29rdXBkZXYoZXJyYnVmKQogCXJlZ2lzdGVyIGNoYXIgKmVycmJ1ZjsKIHsKIAlEV09SRCBkd1ZlcnNpb247CiAJRFdPUkQgZHdXaW5kb3dzTWFqb3JWZXJzaW9uOworCWNoYXIgb3VyX2VycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFKzFdOworCisjcHJhZ21hIHdhcm5pbmcgKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQ5OTYpIC8qIGRpc2FibGUgTVNWQydzIEdldFZlcnNpb24oKSBkZXByZWNhdGVkIHdhcm5pbmcgaGVyZSAqLwogCWR3VmVyc2lvbiA9IEdldFZlcnNpb24oKTsJLyogZ2V0IHRoZSBPUyB2ZXJzaW9uICovCisjcHJhZ21hIHdhcm5pbmcgKHBvcCkKIAlkd1dpbmRvd3NNYWpvclZlcnNpb24gPSAoRFdPUkQpKExPQllURShMT1dPUkQoZHdWZXJzaW9uKSkpOwogCiAJaWYgKGR3VmVyc2lvbiA+PSAweDgwMDAwMDAwICYmIGR3V2luZG93c01ham9yVmVyc2lvbiA+PSA0KSB7CiAJCS8qCiAJCSAqIFdpbmRvd3MgOTUsIDk4LCBNRS4KIAkJICovCi0JCVVMT05HIE5hbWVMZW5ndGggPSA4MTkyOwotCQlzdGF0aWMgY2hhciBBZGFwdGVyc05hbWVbODE5Ml07CisJCVVMT05HIE5hbWVMZW5ndGggPSBBREFQVEVSU05BTUVfTEVOOworCQlzdGF0aWMgY2hhciBBZGFwdGVyc05hbWVbQURBUFRFUlNOQU1FX0xFTl07CiAKIAkJaWYgKFBhY2tldEdldEFkYXB0ZXJOYW1lcyhBZGFwdGVyc05hbWUsJk5hbWVMZW5ndGgpICkKIAkJCXJldHVybiAoQWRhcHRlcnNOYW1lKTsKQEAgLTk5OSw2MCArMjUyLDEwOSBAQAogCQkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlIHsKIAkJLyoKLQkJICogV2luZG93cyBOVCAoTlQgNC4wLCBXMkssIFdYUCkuIENvbnZlcnQgdGhlIG5hbWVzIHRvIFVOSUNPREUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKwkJICogV2luZG93cyBOVCAoTlQgNC4wIGFuZCBsYXRlcikuCisJCSAqIENvbnZlcnQgdGhlIG5hbWVzIHRvIFVuaWNvZGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAJCSAqLwotCQlVTE9ORyBOYW1lTGVuZ3RoID0gODE5MjsKLQkJc3RhdGljIFdDSEFSIEFkYXB0ZXJzTmFtZVs4MTkyXTsKKwkJVUxPTkcgTmFtZUxlbmd0aCA9IEFEQVBURVJTTkFNRV9MRU47CisJCXN0YXRpYyBXQ0hBUiBBZGFwdGVyc05hbWVbQURBUFRFUlNOQU1FX0xFTl07CisJCXNpemVfdCBCdWZmZXJTcGFjZUxlZnQ7CiAJCWNoYXIgKnRBc3RyOwotCQlXQ0hBUiAqdFVzdHI7Ci0JCVdDSEFSICpUQWRhcHRlcnNOYW1lID0gKFdDSEFSKiltYWxsb2MoODE5MiAqIHNpemVvZihXQ0hBUikpOworCQlXQ0hBUiAqVW5hbWVwdHI7CisJCWNoYXIgKkFkZXNjcHRyOworCQlzaXplX3QgbmFtZWxlbiwgaTsKKwkJV0NIQVIgKlRBZGFwdGVyc05hbWUgPSAoV0NIQVIqKW1hbGxvYyhBREFQVEVSU05BTUVfTEVOICogc2l6ZW9mKFdDSEFSKSk7CiAJCWludCBOQWRhcHRzID0gMDsKIAogCQlpZihUQWRhcHRlcnNOYW1lID09IE5VTEwpCiAJCXsKLQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKKwkJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAogCQlpZiAoICFQYWNrZXRHZXRBZGFwdGVyTmFtZXMoKFBUU1RSKVRBZGFwdGVyc05hbWUsJk5hbWVMZW5ndGgpICkKIAkJewotCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCSJQYWNrZXRHZXRBZGFwdGVyTmFtZXM6ICVzIiwKLQkJCQlwY2FwX3dpbjMyc3RyZXJyb3IoKSk7CisJCQlwY2FwX3dpbjMyX2Vycl90b19zdHIoR2V0TGFzdEVycm9yKCksIG91cl9lcnJidWYpOworCQkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJIlBhY2tldEdldEFkYXB0ZXJOYW1lczogJXMiLCBvdXJfZXJyYnVmKTsKIAkJCWZyZWUoVEFkYXB0ZXJzTmFtZSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCiAKKwkJQnVmZmVyU3BhY2VMZWZ0ID0gQURBUFRFUlNOQU1FX0xFTiAqIHNpemVvZihXQ0hBUik7CiAJCXRBc3RyID0gKGNoYXIqKVRBZGFwdGVyc05hbWU7Ci0JCXRVc3RyID0gKFdDSEFSKilBZGFwdGVyc05hbWU7CisJCVVuYW1lcHRyID0gQWRhcHRlcnNOYW1lOwogCiAJCS8qCi0JCSAqIENvbnZlcnQgYW5kIGNvcHkgdGhlIGRldmljZSBuYW1lcworCQkgKiBDb252ZXJ0IHRoZSBkZXZpY2UgbmFtZXMgdG8gVW5pY29kZSBpbnRvIEFkYXB0ZXJOYW1lLgogCQkgKi8KLQkJd2hpbGUoc3NjYW5mKHRBc3RyLCAiJVMiLCB0VXN0cikgPiAwKQotCQl7Ci0JCQl0QXN0ciArPSBzdHJsZW4odEFzdHIpICsgMTsKLQkJCXRVc3RyICs9IHdjc2xlbih0VXN0cikgKyAxOwotCQkJTkFkYXB0cyArKzsKLQkJfQorCQlkbyB7CisJCQkvKgorCQkJICogTGVuZ3RoIG9mIHRoZSBuYW1lLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nCisJCQkgKiBOVUwuCisJCQkgKi8KKwkJCW5hbWVsZW4gPSBzdHJsZW4odEFzdHIpICsgMTsKIAotCQl0QXN0cisrOwotCQkqdFVzdHIgPSAwOwotCQl0VXN0cisrOworCQkJLyoKKwkJCSAqIERvIHdlIGhhdmUgcm9vbSBmb3IgdGhlIG5hbWUgaW4gdGhlIFVuaWNvZGUKKwkJCSAqIGJ1ZmZlcj8KKwkJCSAqLworCQkJaWYgKEJ1ZmZlclNwYWNlTGVmdCA8IG5hbWVsZW4gKiBzaXplb2YoV0NIQVIpKSB7CisJCQkJLyoKKwkJCQkgKiBOby4KKwkJCQkgKi8KKwkJCQlnb3RvIHF1aXQ7CisJCQl9CisJCQlCdWZmZXJTcGFjZUxlZnQgLT0gbmFtZWxlbiAqIHNpemVvZihXQ0hBUik7CisKKwkJCS8qCisJCQkgKiBDb3B5IHRoZSBuYW1lLCBjb252ZXJ0aW5nIEFTQ0lJIHRvIFVuaWNvZGUuCisJCQkgKiBuYW1lbGVuIGluY2x1ZGVzIHRoZSBOVUwsIHNvIHdlIGNvcHkgaXQgYXMKKwkJCSAqIHdlbGwuCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBuYW1lbGVuOyBpKyspCisJCQkJKlVuYW1lcHRyKysgPSAqdEFzdHIrKzsKKworCQkJLyoKKwkJCSAqIENvdW50IHRoaXMgYWRhcHRlci4KKwkJCSAqLworCQkJTkFkYXB0cysrOworCQl9IHdoaWxlIChuYW1lbGVuICE9IDEpOwogCiAJCS8qCi0JCSAqIENvcHkgdGhlIGRlc2NyaXB0aW9ucworCQkgKiBDb3B5IHRoZSBkZXNjcmlwdGlvbnMsIGJ1dCBkb24ndCBjb252ZXJ0IHRoZW0gZnJvbQorCQkgKiBBU0NJSSB0byBVbmljb2RlLgogCQkgKi8KKwkJQWRlc2NwdHIgPSAoY2hhciAqKVVuYW1lcHRyOwogCQl3aGlsZShOQWRhcHRzLS0pCiAJCXsKLQkJCWNoYXIqIHRtcCA9IChjaGFyKil0VXN0cjsKLQkJCXN0cmNweSh0bXAsIHRBc3RyKTsKLQkJCXRtcCArPSBzdHJsZW4odEFzdHIpICsgMTsKLQkJCXRVc3RyID0gKFdDSEFSKil0bXA7Ci0JCQl0QXN0ciArPSBzdHJsZW4odEFzdHIpICsgMTsKKwkJCXNpemVfdCBkZXNjbGVuOworCisJCQlkZXNjbGVuID0gc3RybGVuKHRBc3RyKSArIDE7CisKKwkJCS8qCisJCQkgKiBEbyB3ZSBoYXZlIHJvb20gZm9yIHRoZSBuYW1lIGluIHRoZSBVbmljb2RlCisJCQkgKiBidWZmZXI/CisJCQkgKi8KKwkJCWlmIChCdWZmZXJTcGFjZUxlZnQgPCBkZXNjbGVuKSB7CisJCQkJLyoKKwkJCQkgKiBOby4KKwkJCQkgKi8KKwkJCQlnb3RvIHF1aXQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBKdXN0IGNvcHkgdGhlIEFTQ0lJIHN0cmluZy4KKwkJCSAqIG5hbWVsZW4gaW5jbHVkZXMgdGhlIE5VTCwgc28gd2UgY29weSBpdCBhcworCQkJICogd2VsbC4KKwkJCSAqLworCQkJbWVtY3B5KEFkZXNjcHRyLCB0QXN0ciwgZGVzY2xlbik7CisJCQlBZGVzY3B0ciArPSBkZXNjbGVuOworCQkJdEFzdHIgKz0gZGVzY2xlbjsKKwkJCUJ1ZmZlclNwYWNlTGVmdCAtPSBkZXNjbGVuOwogCQl9CiAKKwlxdWl0OgogCQlmcmVlKFRBZGFwdGVyc05hbWUpOwogCQlyZXR1cm4gKGNoYXIgKikoQWRhcHRlcnNOYW1lKTsKIAl9CkBAIC0xMDk4LDQgKzQwMCw0IEBACiAJcmV0dXJuICgwKTsKIH0KIAotI2VuZGlmIC8qICFXSU4zMiAmJiAhTVNET1MgKi8KKyNlbmRpZiAvKiAhX1dJTjMyICYmICFNU0RPUyAqLwpkaWZmIC0tZ2l0IGEvbGJsL29zLWFpeDcuaCBiL2xibC9vcy1haXg3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiMTJmMgotLS0gL2Rldi9udWxsCisrKyBiL2xibC9vcy1haXg3LmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKy8qIFByb3RvdHlwZXMgbWlzc2luZyBpbiBBSVggNy54ICovCitpbnQJZmZzKGludCBpKTsKZGlmZiAtLWdpdCBhL2xibC9vcy1vc2Y0LmggYi9sYmwvb3Mtb3NmNC5oCmluZGV4IGY0NjFlZWEuLjA1NWViODAgMTAwNjQ0Ci0tLSBhL2xibC9vcy1vc2Y0LmgKKysrIGIvbGJsL29zLW9zZjQuaApAQCAtMjAsNyArMjAsNyBAQAogICovCiAKIC8qIFByb3RvdHlwZXMgbWlzc2luZyBpbiBEaWdpdGFsIFVOSVggNC54ICovCi1pbnQJc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKLWludAl2c25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CitpbnQJcGNhcF9zbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOworaW50CXBjYXBfdnNucHJpbnRmKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwogaW50CXBmb3BlbihjaGFyICosIGludCk7CiAKZGlmZiAtLWdpdCBhL2xibC9vcy1vc2Y1LmggYi9sYmwvb3Mtb3NmNS5oCmluZGV4IDUyYWIxNzUuLjU0MjJmMTggMTAwNjQ0Ci0tLSBhL2xibC9vcy1vc2Y1LmgKKysrIGIvbGJsL29zLW9zZjUuaApAQCAtMjEsMTAgKzIxLDEwIEBACiAKIC8qCiAgKiBQcm90b3R5cGVzIG1pc3NpbmcgaW4gVHJ1NjQgVU5JWCA1LngKLSAqIFhYWCAtICJzbnByaW50ZigpIiBhbmQgInZzbnByaW50ZigpIiBhcmVuJ3QgbWlzc2luZywgYnV0IHlvdSBoYXZlIHRvCisgKiBYWFggLSAicGNhcF9zbnByaW50ZigpIiBhbmQgInBjYXBfdnNucHJpbnRmKCkiIGFyZW4ndCBtaXNzaW5nLCBidXQgeW91IGhhdmUgdG8KICAqICNkZWZpbmUgdGhlIHJpZ2h0IHZhbHVlIHRvIGdldCB0aGVtIGRlZmluZWQgYnkgPHN0ZGlvLmg+LgogICovCi1pbnQJc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKLWludAl2c25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CitpbnQJcGNhcF9zbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOworaW50CXBjYXBfdnNucHJpbnRmKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwogaW50CXBmb3BlbihjaGFyICosIGludCk7CiAKZGlmZiAtLWdpdCBhL2xibC9vcy1zb2xhcmlzMi5oIGIvbGJsL29zLXNvbGFyaXMyLmgKaW5kZXggMjI5NDhiNC4uYTU1NWY1ZSAxMDA2NDQKLS0tIGEvbGJsL29zLXNvbGFyaXMyLmgKKysrIGIvbGJsL29zLXNvbGFyaXMyLmgKQEAgLTIxLDQgKzIxLDQgQEAKIAogLyogUHJvdG90eXBlcyBtaXNzaW5nIGluIFN1bk9TIDUgKi8KIGNoYXIgICAgKnN0cmVycm9yKGludCk7Ci1pbnQJc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2ludAlwY2FwX3NucHJpbnRmKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIC4uLik7CmRpZmYgLS1naXQgYS9sYmwvb3Mtc3Vub3M0LmggYi9sYmwvb3Mtc3Vub3M0LmgKaW5kZXggYjczNTg1Ny4uNjM1M2ZiMCAxMDA2NDQKLS0tIGEvbGJsL29zLXN1bm9zNC5oCisrKyBiL2xibC9vcy1zdW5vczQuaApAQCAtNjUsNyArNjUsNiBAQAogaW50CWZjaG93bihpbnQsIGludCwgaW50KTsKIHZvaWQJZW5kZ3JlbnQodm9pZCk7CiB2b2lkCWVuZHB3ZW50KHZvaWQpOwotdm9pZAllbmRzZXJ2ZW50KHZvaWQpOwogI2lmZGVmIF9fU1REQ19fCiBzdHJ1Y3QJZXRoZXJfYWRkcjsKICNlbmRpZgpAQCAtMTQ2LDcgKzE0NSw2IEBACiBpbnQJc2V0cGdycChpbnQsIGludCk7CiB2b2lkCXNldHB3ZW50KHZvaWQpOwogaW50CXNldHJsaW1pdChpbnQsIHN0cnVjdCBybGltaXQgKik7Ci12b2lkCXNldHNlcnZlbnQoaW50KTsKIGludAlzZXRzb2Nrb3B0KGludCwgaW50LCBpbnQsIGNoYXIgKiwgaW50KTsKIGludAlzaHV0ZG93bihpbnQsIGludCk7CiBpbnQJc2lnYmxvY2soaW50KTsKQEAgLTE1Nyw3ICsxNTUsNyBAQAogc3RydWN0CXNpZ3ZlYzsKICNlbmRpZgogaW50CXNpZ3ZlYyhpbnQsIHN0cnVjdCBzaWd2ZWMgKiwgc3RydWN0IHNpZ3ZlYyopOwotaW50CXNucHJpbnRmKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIC4uLik7CitpbnQJcGNhcF9zbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOwogaW50CXNvY2tldChpbnQsIGludCwgaW50KTsKIGludAlzb2NrZXRwYWlyKGludCwgaW50LCBpbnQsIGludCAqKTsKIGludAlzeW1saW5rKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL2xibC9vcy11bHRyaXg0LmggYi9sYmwvb3MtdWx0cml4NC5oCmluZGV4IGZhMWY3NzAuLjIxZTU3MDIgMTAwNjQ0Ci0tLSBhL2xibC9vcy11bHRyaXg0LmgKKysrIGIvbGJsL29zLXVsdHJpeDQuaApAQCAtMjMsNyArMjMsNiBAQAogaW50CWJjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVfaW50KTsKIHZvaWQJYmNvcHkoY29uc3Qgdm9pZCAqLCB2b2lkICosIHVfaW50KTsKIHZvaWQJYnplcm8odm9pZCAqLCB1X2ludCk7Ci12b2lkCWVuZHNlcnZlbnQodm9pZCk7CiBpbnQJZ2V0b3B0KGludCwgY2hhciAqIGNvbnN0ICosIGNvbnN0IGNoYXIgKik7CiAjaWZkZWYgX19TVERDX18KIHN0cnVjdCB0aW1ldmFsOwpkaWZmIC0tZ2l0IGEvV2luMzIvU3JjL2dldG9wdC5jIGIvbWlzc2luZy9nZXRvcHQuYwpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBXaW4zMi9TcmMvZ2V0b3B0LmMKcmVuYW1lIHRvIG1pc3NpbmcvZ2V0b3B0LmMKaW5kZXggMDNjMjA4Ni4uY2M3OThlMSAxMDA2NDQKLS0tIGEvV2luMzIvU3JjL2dldG9wdC5jCisrKyBiL21pc3NpbmcvZ2V0b3B0LmMKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgImdldG9wdC5oIgorCiBpbnQJb3B0ZXJyID0gMSwJCS8qIGlmIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIHByaW50ZWQgKi8KIAlvcHRpbmQgPSAxLAkJLyogaW5kZXggaW50byBwYXJlbnQgYXJndiB2ZWN0b3IgKi8KIAlvcHRvcHQsCQkJLyogY2hhcmFjdGVyIGNoZWNrZWQgZm9yIHZhbGlkaXR5ICovCkBAIC01OSwxNCArNjEsMTcgQEAKIAljaGFyICogY29uc3QgKm5hcmd2OwogCWNvbnN0IGNoYXIgKm9zdHI7CiB7Ci0jaWZkZWYgV0lOMzIKLQljaGFyICpfX3Byb2duYW1lPSJ3aW5kdW1wIjsKLSNlbHNlCi0JZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7Ci0jZW5kaWYKKwljaGFyICpjcDsKKwlzdGF0aWMgY2hhciAqX19wcm9nbmFtZTsKIAlzdGF0aWMgY2hhciAqcGxhY2UgPSBFTVNHOwkJLyogb3B0aW9uIGxldHRlciBwcm9jZXNzaW5nICovCiAJY2hhciAqb2xpOwkJCQkvKiBvcHRpb24gbGV0dGVyIGxpc3QgaW5kZXggKi8KIAorCWlmIChfX3Byb2duYW1lID09IE5VTEwpIHsKKwkJaWYgKChjcCA9IHN0cnJjaHIobmFyZ3ZbMF0sICcvJykpICE9IE5VTEwpCisJCQlfX3Byb2duYW1lID0gY3AgKyAxOworCQllbHNlCisJCQlfX3Byb2duYW1lID0gbmFyZ3ZbMF07CisJfQogCWlmIChvcHRyZXNldCB8fCAhKnBsYWNlKSB7CQkvKiB1cGRhdGUgc2Nhbm5pbmcgcG9pbnRlciAqLwogCQlvcHRyZXNldCA9IDA7CiAJCWlmIChvcHRpbmQgPj0gbmFyZ2MgfHwgKihwbGFjZSA9IG5hcmd2W29wdGluZF0pICE9ICctJykgewpkaWZmIC0tZ2l0IGEvbWlzc2luZy9nZXRvcHQuaCBiL21pc3NpbmcvZ2V0b3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NjM0NQotLS0gL2Rldi9udWxsCisrKyBiL21pc3NpbmcvZ2V0b3B0LmgKQEAgLTAsMCArMSw3IEBACisvKgorICogSGVhZGVyIGZvciB0aGUgZ2V0b3B0KCkgd2Ugc3VwcGx5IGlmIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBseSBpdC4KKyAqLworZXh0ZXJuIGNoYXIgKm9wdGFyZzsJCQkvKiBnZXRvcHQoMykgZXh0ZXJuYWwgdmFyaWFibGVzICovCitleHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CisKK2V4dGVybiBpbnQgZ2V0b3B0KGludCBuYXJnYywgY2hhciAqIGNvbnN0ICpuYXJndiwgY29uc3QgY2hhciAqb3N0cik7CmRpZmYgLS1naXQgYS9taXNzaW5nL3NucHJpbnRmLmMgYi9taXNzaW5nL3NucHJpbnRmLmMKaW5kZXggOWI2M2Y4Yi4uOTlmMGJkZiAxMDA2NDQKLS0tIGEvbWlzc2luZy9zbnByaW50Zi5jCisrKyBiL21pc3Npbmcvc25wcmludGYuYwpAQCAtNDU2LDEzICs0NTYsMTMgQEAKIAogI2lmbmRlZiBIQVZFX1NOUFJJTlRGCiBpbnQKLXNucHJpbnRmIChjaGFyICpzdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCitwY2FwX3NucHJpbnRmIChjaGFyICpzdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAgIHZhX2xpc3QgYXJnczsKICAgaW50IHJldDsKIAogICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotICByZXQgPSB2c25wcmludGYgKHN0ciwgc3osIGZvcm1hdCwgYXJncyk7CisgIHJldCA9IHBjYXBfdnNucHJpbnRmIChzdHIsIHN6LCBmb3JtYXQsIGFyZ3MpOwogCiAjaWZkZWYgUEFSQU5PSUEKICAgewpAQCAtNDczLDcgKzQ3Myw3IEBACiAgICAgaWYgKHRtcCA9PSBOVUxMKQogICAgICAgYWJvcnQgKCk7CiAKLSAgICByZXQyID0gdnNwcmludGYgKHRtcCwgZm9ybWF0LCBhcmdzKTsKKyAgICByZXQyID0gcGNhcF92c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOwogICAgIGlmIChyZXQgIT0gcmV0MiB8fCBzdHJjbXAoc3RyLCB0bXApKQogICAgICAgYWJvcnQgKCk7CiAgICAgZnJlZSAodG1wKTsKQEAgLTUxOCwxMyArNTE4LDEzIEBACiAKICNpZm5kZWYgSEFWRV9BU05QUklOVEYKIGludAotYXNucHJpbnRmIChjaGFyICoqcmV0LCBzaXplX3QgbWF4X3N6LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3BjYXBfYXNucHJpbnRmIChjaGFyICoqcmV0LCBzaXplX3QgbWF4X3N6LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgdmFfbGlzdCBhcmdzOwogICBpbnQgdmFsOwogCiAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0gIHZhbCA9IHZhc25wcmludGYgKHJldCwgbWF4X3N6LCBmb3JtYXQsIGFyZ3MpOworICB2YWwgPSBwY2FwX3Zhc25wcmludGYgKHJldCwgbWF4X3N6LCBmb3JtYXQsIGFyZ3MpOwogCiAjaWZkZWYgUEFSQU5PSUEKICAgewpAQCAtNTM0LDcgKzUzNCw3IEBACiAgICAgaWYgKHRtcCA9PSBOVUxMKQogICAgICAgYWJvcnQgKCk7CiAKLSAgICByZXQyID0gdnNwcmludGYgKHRtcCwgZm9ybWF0LCBhcmdzKTsKKyAgICByZXQyID0gcGNhcF92c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOwogICAgIGlmICh2YWwgIT0gcmV0MiB8fCBzdHJjbXAoKnJldCwgdG1wKSkKICAgICAgIGFib3J0ICgpOwogICAgIGZyZWUgKHRtcCk7CkBAIC01NDgsMTYgKzU0OCwxNiBAQAogCiAjaWZuZGVmIEhBVkVfVkFTUFJJTlRGCiBpbnQKLXZhc3ByaW50ZiAoY2hhciAqKnJldCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCitwY2FwX3Zhc3ByaW50ZiAoY2hhciAqKnJldCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCiB7Ci0gIHJldHVybiB2YXNucHJpbnRmIChyZXQsIDAsIGZvcm1hdCwgYXJncyk7CisgIHJldHVybiBwY2FwX3Zhc25wcmludGYgKHJldCwgMCwgZm9ybWF0LCBhcmdzKTsKIH0KICNlbmRpZgogCiAKICNpZm5kZWYgSEFWRV9WQVNOUFJJTlRGCiBpbnQKLXZhc25wcmludGYgKGNoYXIgKipyZXQsIHNpemVfdCBtYXhfc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorcGNhcF92YXNucHJpbnRmIChjaGFyICoqcmV0LCBzaXplX3QgbWF4X3N6LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKIHsKICAgaW50IHN0OwogICBzaXplX3QgbGVuOwpAQCAtNjAwLDcgKzYwMCw3IEBACiAKICNpZm5kZWYgSEFWRV9WU05QUklOVEYKIGludAotdnNucHJpbnRmIChjaGFyICpzdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCitwY2FwX3ZzbnByaW50ZiAoY2hhciAqc3RyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQogewogICBzdHJ1Y3Qgc3RhdGUgc3RhdGU7CiAgIGludCByZXQ7CmRpZmYgLS1naXQgYS9taXNzaW5nL3N0cnRva19yLmMgYi9taXNzaW5nL3N0cnRva19yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljOTRiOQotLS0gL2Rldi9udWxsCisrKyBiL21pc3Npbmcvc3RydG9rX3IuYwpAQCAtMCwwICsxLDg3IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5OCBTb2Z0d2V5ciBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIHN0cnRva19yLCBmcm9tIEJlcmtlbGV5IHN0cnRvaworICogT2N0IDEzLCAxOTk4IGJ5IFdlcyBQZXRlcnMgPHdlc0Bzb2Z0d2V5ci5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2VzLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZXMsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBTT0ZUV0VZUiBMTEMsIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBTT0ZUV0VZUiBMTEMsIFRIRQorICogUkVHRU5UUywgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIEZyb206IEAoIylzdHJ0b2suYwk4LjEgKEJlcmtlbGV5KSA2LzQvOTMKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJwb3J0YWJpbGl0eS5oIgorCitjaGFyICoKK3BjYXBfc3RydG9rX3IoY2hhciAqcywgY29uc3QgY2hhciAqZGVsaW0sIGNoYXIgKipsYXN0KQoreworCWNoYXIgKnNwYW5wLCAqdG9rOworCWludCBjLCBzYzsKKworCWlmIChzID09IE5VTEwgJiYgKHMgPSAqbGFzdCkgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCS8qCisJICogU2tpcCAoc3BhbikgbGVhZGluZyBkZWxpbWl0ZXJzIChzICs9IHN0cnNwbihzLCBkZWxpbSksIHNvcnQgb2YpLgorCSAqLworY29udDoKKwljID0gKnMrKzsKKwlmb3IgKHNwYW5wID0gKGNoYXIgKilkZWxpbTsgKHNjID0gKnNwYW5wKyspICE9IDA7KSB7CisJCWlmIChjID09IHNjKQorCQkJZ290byBjb250OworCX0KKworCWlmIChjID09IDApIHsJCS8qIG5vIG5vbi1kZWxpbWl0ZXIgY2hhcmFjdGVycyAqLworCQkqbGFzdCA9IE5VTEw7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXRvayA9IHMgLSAxOworCisJLyoKKwkgKiBTY2FuIHRva2VuIChzY2FuIGZvciBkZWxpbWl0ZXJzOiBzICs9IHN0cmNzcG4ocywgZGVsaW0pLCBzb3J0IG9mKS4KKwkgKiBOb3RlIHRoYXQgZGVsaW0gbXVzdCBoYXZlIG9uZSBOVUw7IHdlIHN0b3AgaWYgd2Ugc2VlIHRoYXQsIHRvby4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWMgPSAqcysrOworCQlzcGFucCA9IChjaGFyICopZGVsaW07CisJCWRvIHsKKwkJCWlmICgoc2MgPSAqc3BhbnArKykgPT0gYykgeworCQkJCWlmIChjID09IDApCisJCQkJCXMgPSBOVUxMOworCQkJCWVsc2UKKwkJCQkJc1stMV0gPSAnXDAnOworCQkJCSpsYXN0ID0gczsKKwkJCQlyZXR1cm4gKHRvayk7CisJCQl9CisJCX0gd2hpbGUgKHNjICE9IDApOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS9taXNzaW5nL3dpbl9zbnByaW50Zi5jIGIvbWlzc2luZy93aW5fc25wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWE4ZWExCi0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZy93aW5fc25wcmludGYuYwpAQCAtMCwwICsxLDMxIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworaW50CitwY2FwX3ZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzdHJfc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisJaW50IHJldDsKKworCXJldCA9IF92c25wcmludGZfcyhzdHIsIHN0cl9zaXplLCBfVFJVTkNBVEUsIGZvcm1hdCwgYXJncyk7CisKKwkvKgorCSAqIFhYWCAtIF92c25wcmludGYoKSBhbmQgX3NucHJpbnRmKCkgZG8gKm5vdCogZ3VhcmFudGVlCisJICogdGhhdCBzdHIgaXMgbnVsbC10ZXJtaW5hdGVkLCBidXQgQzk5J3MgdnNucHJpbnRmKCkKKwkgKiBhbmQgc25wcmludGYoKSBkbywgYW5kIHdlIHdhbnQgdG8gb2ZmZXIgQzk5IGJlaGF2aW9yLAorCSAqIHNvIGZvcmNpYmx5IG51bGwtdGVybWluYXRlIHRoZSBzdHJpbmcuCisJICovCisJc3RyW3N0cl9zaXplIC0gMV0gPSAnXDAnOworCXJldHVybiAocmV0KTsKK30KKworaW50CitwY2FwX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHN0cl9zaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJldDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJcmV0ID0gcGNhcF92c25wcmludGYoc3RyLCBzdHJfc2l6ZSwgZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcmV0dXJuIChyZXQpOworfQpkaWZmIC0tZ2l0IGEvbXNkb3MvYmluMmMuYyBiL21zZG9zL2JpbjJjLmMKaW5kZXggZDgyMDU2ZS4uMjZkOTAwOCAxMDA2NDQKLS0tIGEvbXNkb3MvYmluMmMuYworKysgYi9tc2Rvcy9iaW4yYy5jCkBAIC0xLDQzICsxLDQzIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4NCi0jaW5jbHVkZSA8c3RkbGliLmg+DQotI2luY2x1ZGUgPHN0ZGFyZy5oPg0KLSNpbmNsdWRlIDx0aW1lLmg+DQotDQotc3RhdGljIHZvaWQgQWJvcnQgKGNoYXIgKmZtdCwuLi4pDQotew0KLSAgdmFfbGlzdCBhcmdzOw0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7DQotICB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFyZ3MpOw0KLSAgdmFfZW5kIChhcmdzKTsNCi0gIGV4aXQgKDEpOw0KLX0NCi0NCi1pbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQ0KLXsNCi0gIEZJTEUgICppbkZpbGU7DQotICBGSUxFICAqb3V0RmlsZSA9IHN0ZG91dDsNCi0gIHRpbWVfdCBub3cgICAgID0gdGltZSAoTlVMTCk7DQotICBpbnQgICAgY2gsIGk7DQotDQotICBpZiAoYXJnYyAhPSAyKQ0KLSAgICAgQWJvcnQgKCJVc2FnZTogJXMgYmluLWZpbGUgWz4gcmVzdWx0XSIsIGFyZ3ZbMF0pOw0KLQ0KLSAgaWYgKChpbkZpbGUgPSBmb3Blbihhcmd2WzFdLCJyYiIpKSA9PSBOVUxMKQ0KLSAgICAgQWJvcnQgKCJDYW5ub3Qgb3BlbiAlc1xuIiwgYXJndlsxXSk7DQotDQotICBmcHJpbnRmIChvdXRGaWxlLA0KLSAgICAgICAgICAgIi8qIGRhdGEgc3RhdGVtZW50cyBmb3IgZmlsZSAlcyBhdCAlLjI0cyAqL1xuIg0KLSAgICAgICAgICAgIi8qIEdlbmVyYXRlZCBieSBCSU4yQywgRy5WYW5lbSAxOTk1ICovXG4iLA0KLSAgICAgICAgICAgYXJndlsxXSwgY3RpbWUoJm5vdykpOw0KLQ0KLSAgaSA9IDA7DQotICB3aGlsZSAoKGNoID0gZmdldGMoaW5GaWxlKSkgIT0gRU9GKQ0KLSAgew0KLSAgICBpZiAoaSsrICUgMTIgPT0gMCkNCi0gICAgICAgZnB1dHMgKCJcbiAgIiwgb3V0RmlsZSk7DQotICAgIGZwcmludGYgKG91dEZpbGUsICIweCUwMlgsIiwgY2gpOw0KLSAgfQ0KLSAgZnB1dGMgKCdcbicsIG91dEZpbGUpOw0KLSAgZmNsb3NlIChpbkZpbGUpOw0KLSAgcmV0dXJuICgwKTsNCi19DQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCitzdGF0aWMgdm9pZCBBYm9ydCAoY29uc3QgY2hhciAqZm10LC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydCAoYXJncywgZm10KTsKKyAgdmZwcmludGYgKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgZXhpdCAoMSk7Cit9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEZJTEUgICppbkZpbGU7CisgIEZJTEUgICpvdXRGaWxlID0gc3Rkb3V0OworICB0aW1lX3Qgbm93ICAgICA9IHRpbWUgKE5VTEwpOworICBpbnQgICAgY2gsIGk7CisKKyAgaWYgKGFyZ2MgIT0gMikKKyAgICAgQWJvcnQgKCJVc2FnZTogJXMgYmluLWZpbGUgWz4gcmVzdWx0XSIsIGFyZ3ZbMF0pOworCisgIGlmICgoaW5GaWxlID0gZm9wZW4oYXJndlsxXSwicmIiKSkgPT0gTlVMTCkKKyAgICAgQWJvcnQgKCJDYW5ub3Qgb3BlbiAlc1xuIiwgYXJndlsxXSk7CisKKyAgZnByaW50ZiAob3V0RmlsZSwKKyAgICAgICAgICAgIi8qIGRhdGEgc3RhdGVtZW50cyBmb3IgZmlsZSAlcyBhdCAlLjI0cyAqL1xuIgorICAgICAgICAgICAiLyogR2VuZXJhdGVkIGJ5IEJJTjJDLCBHLiBWYW5lbSAxOTk1ICovXG4iLAorICAgICAgICAgICBhcmd2WzFdLCBjdGltZSgmbm93KSk7CisKKyAgaSA9IDA7CisgIHdoaWxlICgoY2ggPSBmZ2V0YyhpbkZpbGUpKSAhPSBFT0YpCisgIHsKKyAgICBpZiAoaSsrICUgMTIgPT0gMCkKKyAgICAgICBmcHV0cyAoIlxuICAiLCBvdXRGaWxlKTsKKyAgICBmcHJpbnRmIChvdXRGaWxlLCAiMHglMDJYLCIsIGNoKTsKKyAgfQorICBmcHV0YyAoJ1xuJywgb3V0RmlsZSk7CisgIGZjbG9zZSAoaW5GaWxlKTsKKyAgcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL21zZG9zL2NvbW1vbi5kaiBiL21zZG9zL2NvbW1vbi5kagppbmRleCBlYzBjZTAyLi5kYWNmZDFmIDEwMDY0NAotLS0gYS9tc2Rvcy9jb21tb24uZGoKKysrIGIvbXNkb3MvY29tbW9uLmRqCkBAIC03LDcgKzcsMTMgQEAKIAogZGVmYXVsdDogY2hlY2tfZ2NjbGliIGFsbAogCi1HQ0NMSUIgICA9IC9kamdwcC9saWIvZ2NjLWxpYi9kamdwcC8zLjMxCisjCisjIFRoaXMgdmFsdWUgaXMgbm9ybWFsbHkgbm90IGltcG9ydGFudC4gVXNlZCBieSAnZHhlM2dlbicgaW4KKyMgbXNkb3MvcG1fZHJ2ci9tYWtlZmlsZS5kaiB0byBtYWtlICJkeW5hbWljYWxseSBsb2FkZWQgbW9kdWxlcyIuCisjIEJ1dCB0aGlzIGlzIG5vdCBmaW5pc2hlZC4KKyMKKyNHQ0NfTElCICA9ICQoc2hlbGwgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lKQorR0NDX0xJQiAgPSAuCiBNQUtFRklMRSA9IE1ha2VmaWxlLmRqCiAKICMKQEAgLTE5LDEwICsyNSwxMSBAQAogCiBXQVRUMzJfUk9PVCA9ICQoc3Vic3QgXCwvLCQoV0FUVF9ST09UKSkKIAorT0JKX0RJUiA9IGRqZ3BwLm9iagogCi1pZmVxICgkKHdpbGRjYXJkICQoR0NDTElCKS9saWJnY2MuYSksKQoraWZlcSAoJCh3aWxkY2FyZCAkKEdDQ19MSUIpKSwpCiBjaGVja19nY2NsaWI6Ci0JQGVjaG8gbGliZ2NjLmEgbm90IGZvdW5kLiBTZXQgXCIkKEdDQ0xJQilcIiB0byBcIi9kamdwcC9saWIvZ2NjLWxpYi9kamdwcC8zLlhcIgorCUBlY2hvIGxpYmdjYy5hIG5vdCBmb3VuZC4gU2V0IFwiJChHQ0NfTElCKVwiIHRvIFwiL2RqZ3BwL2xpYi9nY2MvZGpncHAvNC5YL2xpYmdjYy5hXCIKIGVuZGlmCiAKIApAQCAtNTQsNyArNjEsNyBAQAogWUFDQyA9IGJpc29uLmV4ZQogTEVYICA9IGZsZXguZXhlCiAKLUNGTEFHUyA9IC1nIC1nY29mZiAtTzIgLVdhbGwgLUkuIC1JJChXQVRUMzJfUk9PVCkvaW5jCitDRkxBR1MgPSAtZyAtTzIgLVdhbGwgLUkuIC1JJChXQVRUMzJfUk9PVCkvaW5jCiAKIGlmZXEgKCQoVVNFX0VYQ0VQVCksMSkKICAgQ0ZMQUdTICs9IC1EVVNFX0VYQ0VQVApAQCAtNzAsNyArNzcsNyBAQAogZW5kaWYKIAogJS5vOiAlLmMKLQkkKENDKSAtYyAkKENGTEFHUykgJDwKKwkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKIAlAZWNobwogCiAlLm86ICUucwpkaWZmIC0tZ2l0IGEvbXNkb3MvbWFrZWZpbGUgYi9tc2Rvcy9tYWtlZmlsZQppbmRleCBjZGI0ZTdjLi4yMzRhMjc2IDEwMDY0NAotLS0gYS9tc2Rvcy9tYWtlZmlsZQorKysgYi9tc2Rvcy9tYWtlZmlsZQpAQCAtMSwxODQgKzEsMTg0IEBACi0jDQotIyAgTWFrZWZpbGUgZm9yIGRvcy1saWJwY2FwLiBOQi4gVGhpcyBtYWtlZmlsZSByZXF1aXJlcyBhIEJvcmxhbmQNCi0jICBjb21wYXRpYmxlIG1ha2UgdG9vbC4NCi0jDQotIyAgVGFyZ2V0czoNCi0jICAgIEJvcmxhbmQgQyA0LjArICAgICAgKERPUyBsYXJnZSBtb2RlbCkNCi0jICAgIE1ldGF3YXJlIEhpZ2hDIDMuMysgKFBoYXJMYXAgMzg2fERvc1gpDQotIw0KLQ0KLS5BVVRPREVQRU5EDQotLlNXQVANCi0NCi0haWYgIiQoV0FUVF9ST09UKSIgPT0gIiINCi0hZXJyb3IgRW52aXJvbm1lbnQgdmFyaWFibGUgIldBVFRfUk9PVCIgbm90IHNldC4NCi0hZW5kaWYNCi0NCi1XQVRUX0lOQyA9ICQoV0FUVF9ST09UKVxpbmMNCi0NCi1ERUZTICAgPSAtRE1TRE9TIC1EREVCVUcgLURORElTX0RFQlVHIC1EX1VfPSAtRGlubGluZT0gXA0KLSAgICAgICAgIC1ESEFWRV9TVFJFUlJPUiAtREhBVkVfTElNSVRTX0gNCi0NCi1BU00gICAgPSB0YXNtLmV4ZSAtdCAtbCAtbXggLW0yIC1EREVCVUcNCi0NCi1TT1VSQ0UgPSBncmFtbWFyLmMgIHNjYW5uZXIuYyBicGZfZmlsdC5jIGJwZl9pbWFnLmMgYnBmX2R1bXAuYyBcDQotICAgICAgICAgZXRoZXJlbnQuYyBnZW5jb2RlLmMgbmFtZXRvYWQuYyBwY2FwLWRvcy5jIG9wdGltaXplLmMgXA0KLSAgICAgICAgIHNhdmVmaWxlLmMgcGNhcC5jIGluZXQuYyBtc2Rvc1xuZGlzMi5jIG1zZG9zXHBrdGRydnIuYyBcDQotICAgICAgICAgbWlzc2luZ1xzbnByaW50Zi5jDQotDQotQk9STEFORF9PQkogPSAkKFNPVVJDRTouYz0ub2JqKSBtc2Rvc1xwa3RfcngwLm9iaiBtc2Rvc1xuZGlzXzAub2JqDQotDQotSElHSENfT0JKICAgPSAkKFNPVVJDRTouYz0ubzMyKSBtc2Rvc1xwa3RfcngwLm8zMg0KLQ0KLWFsbDoNCi0gICAgICAgICAgICBAZWNobyBVc2FnZTogbWFrZSBwY2FwX2JjLmxpYiBvciBwY2FwX2hjLmxpYg0KLQ0KLQ0KLXBjYXBfYmMubGliOiBiY2MuYXJnICQoQk9STEFORF9PQkopIHBjYXBfYmMNCi0NCi0NCi1wY2FwX2hjLmxpYjogaGMzODYuYXJnICQoSElHSENfT0JKKQ0KLSAgICAgICAgICAgIDM4NmxpYiAkPCBAJiZ8DQotICAgICAgICAgICAgICAgLW5vd2FybiAtbm9iYWNrdXAgLXR3b2Nhc2UgLXJlcGxhY2UgJChISUdIQ19PQkopDQotfA0KLQ0KLXBjYXBfYmM6ICAgICQoQk9STEFORF9PQkopDQotICAgICAgICAgICAgQHRsaWIgcGNhcF9iYy5saWIgL0MgQCYmfA0KLSAgICAgICAgICAgICAgIC0rJCgqKjoub2JqPS0rKQ0KLXwNCi0NCi0uYy5vYmo6DQotICAgICAgICAgICAgYmNjLmV4ZSBAYmNjLmFyZyAtbyQqLm9iaiAkKi5jDQotDQotLmMubzMyOg0KLSAgICAgICAgICAgIGhjMzg2LmV4ZSBAaGMzODYuYXJnIC1vICQqLm8zMiAkKi5jDQotDQotLmFzbS5vYmo6DQotICAgICAgICAgICAgJChBU00pICQqLmFzbSwgJCoub2JqDQotDQotLmFzbS5vMzI6DQotICAgICAgICAgICAgJChBU00pIC1ERE9TWD0xICQqLmFzbSwgJCoubzMyDQotDQotc2Nhbm5lci5jOiBzY2FubmVyLmwNCi0gICAgICAgICAgICBmbGV4IC1QcGNhcF8gLTcgLW9zY2FubmVyLmMgc2Nhbm5lci5sDQotDQotZ3JhbW1hci5jIHRva2RlZnMuaDogZ3JhbW1hci55DQotICAgICAgICAgICAgYmlzb24gLS1uYW1lLXByZWZpeD1wY2FwXyAtLXlhY2MgLS1kZWZpbmVzIGdyYW1tYXIueQ0KLSAgICAgICAgICAgIC0gQGRlbCBncmFtbWFyLmMNCi0gICAgICAgICAgICAtIEBkZWwgdG9rZGVmcy5oDQotICAgICAgICAgICAgcmVuIHlfdGFiLmMgZ3JhbW1hci5jDQotICAgICAgICAgICAgcmVuIHlfdGFiLmggdG9rZGVmcy5oDQotDQotYmNjLmFyZzogICAgbXNkb3NcTWFrZWZpbGUNCi0gICAgICAgICAgICBAY29weSAmJnwNCi0gICAgICAgICAgICAgICQoREVGUykgLW1sIC1jIC12IC0zIC1PMiAtcG8gLVJULSAtdy0NCi0gICAgICAgICAgICAgIC1JJChXQVRUX0lOQykgLUkuIC1JLlxtc2Rvc1xwbV9kcnZyIC1IPSQoVEVNUClcYmNjLnN5bQ0KLXwgJDwNCi0NCi1oYzM4Ni5hcmc6ICBtc2Rvc1xNYWtlZmlsZQ0KLSAgICAgICAgICAgIEBjb3B5ICYmfA0KLSAgICAgICAgICAgICMgLURVU0VfMzJCSVRfRFJJVkVSUw0KLSAgICAgICAgICAgICAgJChERUZTKSAtRERPU1g9MSAtdzMgLWMgLWcgLU81DQotICAgICAgICAgICAgICAtSSQoV0FUVF9JTkMpIC1JLiAtSS5cbXNkb3NccG1fZHJ2cg0KLSAgICAgICAgICAgICAgLUhzdWZmaXg9Lm8zMg0KLSAgICAgICAgICAgICAgLUhub2NvcHlyDQotICAgICAgICAgICAgICAtSHByYWdtYT1PZmZ3YXJuKDQ5MSw1NTMsNTcyKQ0KLSAgICAgICAgICAgICAgLUhvbj1SZWNvZ25pemVfbGlicmFyeSAgIyBtYWtlIG1lbWNweS9zdHJsZW4gZXRjLiBpbmxpbmUNCi0gICAgICAgICAgICAgIC1Ib2ZmPUJlaGF2ZWQgICAgICAgICAgICMgdHVybiBvZmYgc29tZSBvcHRpbWlzZXIgd2FybmluZ3MNCi18ICQ8DQotDQotY2xlYW46DQotICAgICAgICAgICAgQGRlbCAqLm9iag0KLSAgICAgICAgICAgIEBkZWwgKi5vMzINCi0gICAgICAgICAgICBAZGVsICoubHN0DQotICAgICAgICAgICAgQGRlbCAqLm1hcA0KLSAgICAgICAgICAgIEBkZWwgYmNjLmFyZw0KLSAgICAgICAgICAgIEBkZWwgaGMzODYuYXJnDQotICAgICAgICAgICAgQGRlbCBncmFtbWFyLmMNCi0gICAgICAgICAgICBAZGVsIHRva2RlZnMuaA0KLSAgICAgICAgICAgIEBkZWwgc2Nhbm5lci5jDQotICAgICAgICAgICAgQGVjaG8gQ2xlYW5lZA0KLQ0KLSMNCi0jIGRlcGVuZGVuY2llcw0KLSMgICAgICAgICAgICAgDQotcGt0X3J4MC5vYmo6ICBtc2Rvc1xwa3RfcngwLmFzbQ0KLQ0KLWJwZl9maWx0Lm9iajogYnBmX2ZpbHQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdudWMuaA0KLQ0KLWJwZl9pbWFnLm9iajogYnBmX2ltYWcuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQotDQotYnBmX2R1bXAub2JqOiBicGZfZHVtcC5jIHBjYXAuaCBwY2FwLWJwZi5oDQotDQotZXRoZXJlbnQub2JqOiBldGhlcmVudC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggcGNhcC1uYW1lZGIuaA0KLQ0KLW9wdGltaXplLm9iajogb3B0aW1pemUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaA0KLQ0KLXNhdmVmaWxlLm9iajogc2F2ZWZpbGUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQotDQotcGNhcC5vYmo6IHBjYXAuYyBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCi0NCi1pbmV0Lm9iajogaW5ldC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCi0NCi1ncmFtbWFyLm9iajogZ3JhbW1hci5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwNCi0gIHBmLmggcGNhcC1uYW1lZGIuaA0KLQ0KLXNjYW5uZXIub2JqOiBzY2FubmVyLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggXA0KLSAgcGNhcC1uYW1lZGIuaCB0b2tkZWZzLmgNCi0NCi1nZW5jb2RlLm9iajogZ2VuY29kZS5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBcDQotICBldGhlcnR5cGUuaCBubHBpZC5oIGxsYy5oIGdlbmNvZGUuaCBhdG11bmkzMS5oIHN1bmF0bXBvcy5oIHBwcC5oIHNsbC5oIFwNCi0gIGFyY25ldC5oIHBmLmggcGNhcC1uYW1lZGIuaA0KLQ0KLW5hbWV0b2FkLm9iajogbmFtZXRvYWQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCBcDQotICBwY2FwLW5hbWVkYi5oIGV0aGVydHlwZS5oDQotDQotcGNhcC1kb3Mub2JqOiBwY2FwLWRvcy5jIHBjYXAuaCBwY2FwLWJwZi5oIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBcDQotICBtc2Rvc1xwa3RkcnZyLmgNCi0NCi1wa3RkcnZyLm9iajogbXNkb3NccGt0ZHJ2ci5jIGdudWMuaCBwY2FwLWRvcy5oIHBjYXAtaW50LmggXA0KLSAgcGNhcC5oIHBjYXAtYnBmLmggbXNkb3NccGt0ZHJ2ci5oIG1zZG9zXHBrdF9zdHViLmluYw0KLQ0KLW5kaXMyLm9iajogbXNkb3NcbmRpczIuYyBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggXA0KLSAgbXNkb3NcbmRpczIuaA0KLQ0KLXBrdF9yeDAubzMyOiAgbXNkb3NccGt0X3J4MC5hc20NCi0NCi1icGZfZmlsdC5vMzI6IGJwZl9maWx0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnbnVjLmgNCi0NCi1icGZfaW1hZy5vMzI6IGJwZl9pbWFnLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KLQ0KLWJwZl9kdW1wLm8zMjogYnBmX2R1bXAuYyBwY2FwLmggcGNhcC1icGYuaA0KLQ0KLWV0aGVyZW50Lm8zMjogZXRoZXJlbnQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIHBjYXAtbmFtZWRiLmgNCi0NCi1vcHRpbWl6ZS5vMzI6IG9wdGltaXplLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmgNCi0NCi1zYXZlZmlsZS5vMzI6IHNhdmVmaWxlLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KLQ0KLXBjYXAubzMyOiBwY2FwLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQotDQotaW5ldC5vMzI6IGluZXQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQotDQotZ3JhbW1hci5vMzI6IGdyYW1tYXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCBcDQotICBwZi5oIHBjYXAtbmFtZWRiLmgNCi0NCi1zY2FubmVyLm8zMjogc2Nhbm5lci5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwNCi0gIHBjYXAtbmFtZWRiLmggdG9rZGVmcy5oDQotDQotZ2VuY29kZS5vMzI6IGdlbmNvZGUuYyBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggXA0KLSAgZXRoZXJ0eXBlLmggbmxwaWQuaCBsbGMuaCBnZW5jb2RlLmggYXRtdW5pMzEuaCBzdW5hdG1wb3MuaCBwcHAuaCBzbGwuaCBcDQotICBhcmNuZXQuaCBwZi5oIHBjYXAtbmFtZWRiLmgNCi0NCi1uYW1ldG9hZC5vMzI6IG5hbWV0b2FkLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggXA0KLSAgcGNhcC1uYW1lZGIuaCBldGhlcnR5cGUuaA0KLQ0KLXBjYXAtZG9zLm8zMjogcGNhcC1kb3MuYyBwY2FwLmggcGNhcC1icGYuaCBwY2FwLWRvcy5oIHBjYXAtaW50LmggXA0KLSAgbXNkb3NccGt0ZHJ2ci5oDQotDQotcGt0ZHJ2ci5vMzI6IG1zZG9zXHBrdGRydnIuYyBnbnVjLmggcGNhcC1kb3MuaCBwY2FwLWludC5oIFwNCi0gIHBjYXAuaCBwY2FwLWJwZi5oIG1zZG9zXHBrdGRydnIuaCBtc2Rvc1xwa3Rfc3R1Yi5pbmMNCi0NCi1uZGlzMi5vMzI6IG1zZG9zXG5kaXMyLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIFwNCi0gIG1zZG9zXG5kaXMyLmgNCi0NCisjCisjICBNYWtlZmlsZSBmb3IgZG9zLWxpYnBjYXAuIE5CLiBUaGlzIG1ha2VmaWxlIHJlcXVpcmVzIGEgQm9ybGFuZAorIyAgY29tcGF0aWJsZSBtYWtlIHRvb2wuCisjCisjICBUYXJnZXRzOgorIyAgICBCb3JsYW5kIEMgNC4wKyAgICAgIChET1MgbGFyZ2UgbW9kZWwpCisjICAgIE1ldGF3YXJlIEhpZ2hDIDMuMysgKFBoYXJMYXAgMzg2fERvc1gpCisjCisKKy5BVVRPREVQRU5ECisuU1dBUAorCishaWYgIiQoV0FUVF9ST09UKSIgPT0gIiIKKyFlcnJvciBFbnZpcm9ubWVudCB2YXJpYWJsZSAiV0FUVF9ST09UIiBub3Qgc2V0LgorIWVuZGlmCisKK1dBVFRfSU5DID0gJChXQVRUX1JPT1QpXGluYworCitERUZTICAgPSAtRE1TRE9TIC1EREVCVUcgLURORElTX0RFQlVHIC1EX1VfPSAtRGlubGluZT0gXAorICAgICAgICAgLURIQVZFX1NUUkVSUk9SIC1ESEFWRV9MSU1JVFNfSAorCitBU00gICAgPSB0YXNtLmV4ZSAtdCAtbCAtbXggLW0yIC1EREVCVUcKKworU09VUkNFID0gZ3JhbW1hci5jICBzY2FubmVyLmMgYnBmX2ZpbHQuYyBicGZfaW1hZy5jIGJwZl9kdW1wLmMgXAorICAgICAgICAgZXRoZXJlbnQuYyBnZW5jb2RlLmMgbmFtZXRvYWQuYyBwY2FwLWRvcy5jIG9wdGltaXplLmMgXAorICAgICAgICAgc2F2ZWZpbGUuYyBwY2FwLmMgaW5ldC5jIG1zZG9zXG5kaXMyLmMgbXNkb3NccGt0ZHJ2ci5jIFwKKyAgICAgICAgIG1pc3Npbmdcc25wcmludGYuYworCitCT1JMQU5EX09CSiA9ICQoU09VUkNFOi5jPS5vYmopIG1zZG9zXHBrdF9yeDAub2JqIG1zZG9zXG5kaXNfMC5vYmoKKworSElHSENfT0JKICAgPSAkKFNPVVJDRTouYz0ubzMyKSBtc2Rvc1xwa3RfcngwLm8zMgorCithbGw6CisgICAgICAgICAgICBAZWNobyBVc2FnZTogbWFrZSBwY2FwX2JjLmxpYiBvciBwY2FwX2hjLmxpYgorCisKK3BjYXBfYmMubGliOiBiY2MuYXJnICQoQk9STEFORF9PQkopIHBjYXBfYmMKKworCitwY2FwX2hjLmxpYjogaGMzODYuYXJnICQoSElHSENfT0JKKQorICAgICAgICAgICAgMzg2bGliICQ8IEAmJnwKKyAgICAgICAgICAgICAgIC1ub3dhcm4gLW5vYmFja3VwIC10d29jYXNlIC1yZXBsYWNlICQoSElHSENfT0JKKQorfAorCitwY2FwX2JjOiAgICAkKEJPUkxBTkRfT0JKKQorICAgICAgICAgICAgQHRsaWIgcGNhcF9iYy5saWIgL0MgQCYmfAorICAgICAgICAgICAgICAgLSskKCoqOi5vYmo9LSspCit8CisKKy5jLm9iajoKKyAgICAgICAgICAgIGJjYy5leGUgQGJjYy5hcmcgLW8kKi5vYmogJCouYworCisuYy5vMzI6CisgICAgICAgICAgICBoYzM4Ni5leGUgQGhjMzg2LmFyZyAtbyAkKi5vMzIgJCouYworCisuYXNtLm9iajoKKyAgICAgICAgICAgICQoQVNNKSAkKi5hc20sICQqLm9iagorCisuYXNtLm8zMjoKKyAgICAgICAgICAgICQoQVNNKSAtRERPU1g9MSAkKi5hc20sICQqLm8zMgorCitzY2FubmVyLmM6IHNjYW5uZXIubAorICAgICAgICAgICAgZmxleCAtUHBjYXBfIC03IC1vc2Nhbm5lci5jIHNjYW5uZXIubAorCitncmFtbWFyLmMgdG9rZGVmcy5oOiBncmFtbWFyLnkKKyAgICAgICAgICAgIGJpc29uIC0tbmFtZS1wcmVmaXg9cGNhcF8gLS15YWNjIC0tZGVmaW5lcyBncmFtbWFyLnkKKyAgICAgICAgICAgIC0gQGRlbCBncmFtbWFyLmMKKyAgICAgICAgICAgIC0gQGRlbCB0b2tkZWZzLmgKKyAgICAgICAgICAgIHJlbiB5X3RhYi5jIGdyYW1tYXIuYworICAgICAgICAgICAgcmVuIHlfdGFiLmggdG9rZGVmcy5oCisKK2JjYy5hcmc6ICAgIG1zZG9zXE1ha2VmaWxlCisgICAgICAgICAgICBAY29weSAmJnwKKyAgICAgICAgICAgICAgJChERUZTKSAtbWwgLWMgLXYgLTMgLU8yIC1wbyAtUlQtIC13LQorICAgICAgICAgICAgICAtSSQoV0FUVF9JTkMpIC1JLiAtSS5cbXNkb3NccG1fZHJ2ciAtSD0kKFRFTVApXGJjYy5zeW0KK3wgJDwKKworaGMzODYuYXJnOiAgbXNkb3NcTWFrZWZpbGUKKyAgICAgICAgICAgIEBjb3B5ICYmfAorICAgICAgICAgICAgIyAtRFVTRV8zMkJJVF9EUklWRVJTCisgICAgICAgICAgICAgICQoREVGUykgLURET1NYPTEgLXczIC1jIC1nIC1PNQorICAgICAgICAgICAgICAtSSQoV0FUVF9JTkMpIC1JLiAtSS5cbXNkb3NccG1fZHJ2cgorICAgICAgICAgICAgICAtSHN1ZmZpeD0ubzMyCisgICAgICAgICAgICAgIC1Ibm9jb3B5cgorICAgICAgICAgICAgICAtSHByYWdtYT1PZmZ3YXJuKDQ5MSw1NTMsNTcyKQorICAgICAgICAgICAgICAtSG9uPVJlY29nbml6ZV9saWJyYXJ5ICAjIG1ha2UgbWVtY3B5L3N0cmxlbiBldGMuIGlubGluZQorICAgICAgICAgICAgICAtSG9mZj1CZWhhdmVkICAgICAgICAgICAjIHR1cm4gb2ZmIHNvbWUgb3B0aW1pc2VyIHdhcm5pbmdzCit8ICQ8CisKK2NsZWFuOgorICAgICAgICAgICAgQGRlbCAqLm9iagorICAgICAgICAgICAgQGRlbCAqLm8zMgorICAgICAgICAgICAgQGRlbCAqLmxzdAorICAgICAgICAgICAgQGRlbCAqLm1hcAorICAgICAgICAgICAgQGRlbCBiY2MuYXJnCisgICAgICAgICAgICBAZGVsIGhjMzg2LmFyZworICAgICAgICAgICAgQGRlbCBncmFtbWFyLmMKKyAgICAgICAgICAgIEBkZWwgdG9rZGVmcy5oCisgICAgICAgICAgICBAZGVsIHNjYW5uZXIuYworICAgICAgICAgICAgQGVjaG8gQ2xlYW5lZAorCisjCisjIGRlcGVuZGVuY2llcworIworcGt0X3J4MC5vYmo6ICBtc2Rvc1xwa3RfcngwLmFzbQorCiticGZfZmlsdC5vYmo6IGJwZl9maWx0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnbnVjLmgKKworYnBmX2ltYWcub2JqOiBicGZfaW1hZy5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgKKworYnBmX2R1bXAub2JqOiBicGZfZHVtcC5jIHBjYXAuaCBwY2FwLWJwZi5oCisKK2V0aGVyZW50Lm9iajogZXRoZXJlbnQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIHBjYXAtbmFtZWRiLmgKKworb3B0aW1pemUub2JqOiBvcHRpbWl6ZS5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oCisKK3NhdmVmaWxlLm9iajogc2F2ZWZpbGUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oCisKK3BjYXAub2JqOiBwY2FwLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oCisKK2luZXQub2JqOiBpbmV0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaAorCitncmFtbWFyLm9iajogZ3JhbW1hci5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwKKyAgcGYuaCBwY2FwLW5hbWVkYi5oCisKK3NjYW5uZXIub2JqOiBzY2FubmVyLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggXAorICBwY2FwLW5hbWVkYi5oIHRva2RlZnMuaAorCitnZW5jb2RlLm9iajogZ2VuY29kZS5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBcCisgIGV0aGVydHlwZS5oIG5scGlkLmggbGxjLmggZ2VuY29kZS5oIGF0bXVuaTMxLmggc3VuYXRtcG9zLmggcHBwLmggc2xsLmggXAorICBhcmNuZXQuaCBwZi5oIHBjYXAtbmFtZWRiLmgKKworbmFtZXRvYWQub2JqOiBuYW1ldG9hZC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwKKyAgcGNhcC1uYW1lZGIuaCBldGhlcnR5cGUuaAorCitwY2FwLWRvcy5vYmo6IHBjYXAtZG9zLmMgcGNhcC5oIHBjYXAtYnBmLmggcGNhcC1kb3MuaCBwY2FwLWludC5oIFwKKyAgbXNkb3NccGt0ZHJ2ci5oCisKK3BrdGRydnIub2JqOiBtc2Rvc1xwa3RkcnZyLmMgZ251Yy5oIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBcCisgIHBjYXAuaCBwY2FwLWJwZi5oIG1zZG9zXHBrdGRydnIuaCBtc2Rvc1xwa3Rfc3R1Yi5pbmMKKworbmRpczIub2JqOiBtc2Rvc1xuZGlzMi5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBcCisgIG1zZG9zXG5kaXMyLmgKKworcGt0X3J4MC5vMzI6ICBtc2Rvc1xwa3RfcngwLmFzbQorCiticGZfZmlsdC5vMzI6IGJwZl9maWx0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnbnVjLmgKKworYnBmX2ltYWcubzMyOiBicGZfaW1hZy5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgKKworYnBmX2R1bXAubzMyOiBicGZfZHVtcC5jIHBjYXAuaCBwY2FwLWJwZi5oCisKK2V0aGVyZW50Lm8zMjogZXRoZXJlbnQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIHBjYXAtbmFtZWRiLmgKKworb3B0aW1pemUubzMyOiBvcHRpbWl6ZS5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oCisKK3NhdmVmaWxlLm8zMjogc2F2ZWZpbGUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oCisKK3BjYXAubzMyOiBwY2FwLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oCisKK2luZXQubzMyOiBpbmV0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaAorCitncmFtbWFyLm8zMjogZ3JhbW1hci5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwKKyAgcGYuaCBwY2FwLW5hbWVkYi5oCisKK3NjYW5uZXIubzMyOiBzY2FubmVyLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggXAorICBwY2FwLW5hbWVkYi5oIHRva2RlZnMuaAorCitnZW5jb2RlLm8zMjogZ2VuY29kZS5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBcCisgIGV0aGVydHlwZS5oIG5scGlkLmggbGxjLmggZ2VuY29kZS5oIGF0bXVuaTMxLmggc3VuYXRtcG9zLmggcHBwLmggc2xsLmggXAorICBhcmNuZXQuaCBwZi5oIHBjYXAtbmFtZWRiLmgKKworbmFtZXRvYWQubzMyOiBuYW1ldG9hZC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwKKyAgcGNhcC1uYW1lZGIuaCBldGhlcnR5cGUuaAorCitwY2FwLWRvcy5vMzI6IHBjYXAtZG9zLmMgcGNhcC5oIHBjYXAtYnBmLmggcGNhcC1kb3MuaCBwY2FwLWludC5oIFwKKyAgbXNkb3NccGt0ZHJ2ci5oCisKK3BrdGRydnIubzMyOiBtc2Rvc1xwa3RkcnZyLmMgZ251Yy5oIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBcCisgIHBjYXAuaCBwY2FwLWJwZi5oIG1zZG9zXHBrdGRydnIuaCBtc2Rvc1xwa3Rfc3R1Yi5pbmMKKworbmRpczIubzMyOiBtc2Rvc1xuZGlzMi5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBcCisgIG1zZG9zXG5kaXMyLmgKKwpkaWZmIC0tZ2l0IGEvbXNkb3MvbWFrZWZpbGUuZGogYi9tc2Rvcy9tYWtlZmlsZS5kagppbmRleCBhZTIwYWRhLi4zZjU2ZGE5IDEwMDY0NAotLS0gYS9tc2Rvcy9tYWtlZmlsZS5kagorKysgYi9tc2Rvcy9tYWtlZmlsZS5kagpAQCAtNiw0MyArNiw0OSBAQAogIwogIyAgYzpcbmV0XHBjYXA+IG1ha2UgLWYgbXNkb3MvbWFrZWZpbGUuZGoKICMKKyMgTm90ZTogeW91IHNob3VsZCBkbyBhICJzZXQgTEZOPXkiIGJlZm9yZSBydW5uaW5nIHRoaXMgbWFrZWZpbGUuCisjCiAKLVZQQVRIID0gbWlzc2luZyBtc2RvcworVlBBVEggPSBtaXNzaW5nIG1zZG9zIGJwZi9uZXQKIAogUFJFUkVRVUlTSVRFUyA9IHNjYW5uZXIuYyBncmFtbWFyLmMgdG9rZGVmcy5oIHZlcnNpb24uaCBtc2Rvcy9wa3Rfc3R1Yi5pbmMKIAotaW5jbHVkZSBtc2Rvcy9jb21tb24uZGoKK2luY2x1ZGUgLi9tc2Rvcy9jb21tb24uZGoKIAogRFJJVkVSX0RJUiA9IC4vbXNkb3MvcG1fZHJ2cgogCi1DRkxBR1MgKz0gLURERUJVRyAtRE5ESVNfREVCVUcgLURIQVZFX0xJTUlUU19IIC1ESEFWRV9TVFJFUlJPUiBcCi0gICAgICAgICAgLURfVV89J19fYXR0cmlidXRlX18oKHVudXNlZCkpJyAtREhBVkVfVkVSU0lPTl9ICitDRkxBR1MgKz0gLURERUJVRyAtRE5ESVNfREVCVUcgLURIQVZFX0xJTUlUU19IIC1ESEFWRV9TVFJFUlJPUiAtREhBVkVfU05QUklOVEYgLURIQVZFX1ZTTlBSSU5URlwKKyAgICAgICAgICAtRF9VXz0nX19hdHRyaWJ1dGVfXygodW51c2VkKSknCiAKLSMgQ0ZMQUdTICs9IC1EeXlsdmFsPXBjYXBfbHZhbCAtREJERUJVRyAtRE5ERUJVRworQ0ZMQUdTICs9IC1EeXlsdmFsPXBjYXBfbHZhbCAjIC1EQkRFQlVHIC1ETkRFQlVHCiAKLVNPVVJDRVMgPSBncmFtbWFyLmMgc2Nhbm5lci5jIGJwZl9maWx0LmMgYnBmX2ltYWcuYyBicGZfZHVtcC5jICAgXAotICAgICAgICAgIGV0aGVyZW50LmMgZ2VuY29kZS5jIG5hbWV0b2FkLmMgcGNhcC1kb3MuYyBvcHRpbWl6ZS5jICBcCi0gICAgICAgICAgc2F2ZWZpbGUuYyBwY2FwLmMgaW5ldC5jIG1zZG9zXHBrdGRydnIuYyBtc2Rvcy9uZGlzMi5jIFwKLSAgICAgICAgICBtaXNzaW5nL3NucHJpbnRmLmMKK1NPVVJDRVMgPSBncmFtbWFyLmMgc2Nhbm5lci5jIGJwZi9uZXQvYnBmX2ZpbHRlci5jIGJwZl9pbWFnZS5jIGJwZl9kdW1wLmMgXAorICAgICAgICAgIGV0aGVyZW50LmMgZ2VuY29kZS5jIG5hbWV0b2FkZHIuYyBwY2FwLWNvbW1vbi5jIHBjYXAtZG9zLmMgb3B0aW1pemUuYyBcCisgICAgICAgICAgc2F2ZWZpbGUuYyBwY2FwLmMgc2YtcGNhcC5jIHNmLXBjYXAtbmcuYyBpbmV0LmMgXAorICAgICAgICAgIG1zZG9zL3BrdGRydnIuYyBtc2Rvcy9uZGlzMi5jICMgbWlzc2luZy9zbnByaW50Zi5jCiAKLU9CSkVDVFMgPSAkKG5vdGRpciAkKFNPVVJDRVM6LmM9Lm8pKQorT0JKRUNUUyA9ICQoYWRkcHJlZml4ICQoT0JKX0RJUikvLCAkKG5vdGRpciAkKFNPVVJDRVM6LmM9Lm8pKSkKIFRFTVBCSU4gPSB0bXAuYmluCiAKIGlmZXEgKCQoVVNFXzMyQklUX0RSSVZFUlMpLDEpCi0gIFBNX09CSkVDVFMgPSAkKGFkZHByZWZpeCAkKERSSVZFUl9ESVIpLywgXAorICBQTV9PQkpFQ1RTID0gJChhZGRwcmVmaXggJChPQkpfRElSKS8sIFwKICAgICAgICAgICAgICAgICAgcHJpbnRrLm8gcGNpLm8gcGNpLXNjYW4ubyBiaW9zMzIubyBkbWEubyBpcnEubyBpbnR3cmFwLm8gXAogICAgICAgICAgICAgICAgICBsb2NrLm8ga21hbGxvYy5vIHF1aXJrcy5vIHRpbWVyLm8gbmV0X2luaXQubykKICAgIwogICAjIFN0YXRpYyBsaW5rIG9mIGRyaXZlcnMKICAgIwogICBpZmVxICgkKFVTRV8zMkJJVF9NT0RVTEVTKSwwKQotICAgIFBNX09CSkVDVFMgKz0gJChhZGRwcmVmaXggJChEUklWRVJfRElSKS8sIFwKKyAgICBQTV9PQkpFQ1RTICs9ICQoYWRkcHJlZml4ICQoT0JKX0RJUikvLCBcCiAgICAgICAgICAgICAgICAgICAgIGFjY3Rvbi5vIDgzOTAubyAzYzUwMy5vIDNjNTA5Lm8gM2M1OXgubyAzYzUxNS5vIFwKICAgICAgICAgICAgICAgICAgICAgM2M1NzVfY2IubyAzYzkweC5vIG5lLm8gd2QubyBjczg5eDAubyBydGw4MTM5Lm8pCiAgIGVuZGlmCiBlbmRpZgogCi1hbGw6IGxpYnBjYXAuYQorVEFSR0VUUyA9IG1zZG9zL2JpbjJjLmV4ZSBsaWJwY2FwLmEgZmlsdGVydGVzdC5leGUgZmluZGFsbGRldnN0ZXN0LmV4ZSBcCisgICAgICAgICAgbm9uYmxvY2t0ZXN0LmV4ZSBvcGVudGVzdC5leGUKKworYWxsOiAkKFRBUkdFVFMpCisJQGVjaG8gJ1dlbGNvbWUgdG8gbGlicGNhcC9kamdwcCB3aXRoIHNhbXBsZXMuJwogCiBpZmVxICgkKFVTRV8zMkJJVF9EUklWRVJTKSwxKQogJChQTV9PQkpFQ1RTKToKQEAgLTUzLDYgKzU5LDIyIEBACiAJcm0gLWYgJEAKIAlhciBycyAkQCAkXgogCitmaWx0ZXJ0ZXN0LmV4ZTogdGVzdHMvZmlsdGVydGVzdC5jIGxpYnBjYXAuYQorCSQoQ0MpICQoQ0ZMQUdTKSAtRGluX2FkZHJfdD11X2xvbmcgLW8gJEAgJF4gJChXQVRUMzJfUk9PVCkvbGliL2xpYndhdHQuYQorCUBlY2hvCisKK2ZpbmRhbGxkZXZzdGVzdC5leGU6IHRlc3RzL2ZpbmRhbGxkZXZzdGVzdC5jIGxpYnBjYXAuYQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAkXiAkKFdBVFQzMl9ST09UKS9saWIvbGlid2F0dC5hCisJQGVjaG8KKworbm9uYmxvY2t0ZXN0LmV4ZTogdGVzdHMvbm9uYmxvY2t0ZXN0LmMgbGlicGNhcC5hCisJJChDQykgJChDRkxBR1MpIC1vICRAICReICQoV0FUVDMyX1JPT1QpL2xpYi9saWJ3YXR0LmEKKwlAZWNobworCitvcGVudGVzdC5leGU6IHRlc3RzL29wZW50ZXN0LmMgbGlicGNhcC5hCisJJChDQykgJChDRkxBR1MpIC1vICRAICReICQoV0FUVDMyX1JPT1QpL2xpYi9saWJ3YXR0LmEKKwlAZWNobworCiBtc2Rvcy9wa3Rfc3R1Yi5pbmM6IG1zZG9zL2JpbjJjLmV4ZSBtc2Rvcy9wa3RfcngxLlMKIAkkKEFTTSkgLW8gJChURU1QQklOKSAtbG1zZG9zL3BrdF9yeDEubHN0IG1zZG9zL3BrdF9yeDEuUwogCS4vbXNkb3MvYmluMmMgJChURU1QQklOKSA+ICRACkBAIC02MSw4ICs4Myw4IEBACiBncmFtbWFyLmMgdG9rZGVmcy5oOiBncmFtbWFyLnkKIAlybSAtZiBncmFtbWFyLmMgdG9rZGVmcy5oCiAJJChZQUNDKSAtLW5hbWUtcHJlZml4PXBjYXBfIC0teWFjYyAtLWRlZmluZXMgZ3JhbW1hci55Ci0JbXYgLWYgeV90YWIuYyBncmFtbWFyLmMKLQltdiAtZiB5X3RhYi5oIHRva2RlZnMuaAorCW12IC1mIHkudGFiLmMgZ3JhbW1hci5jCisJbXYgLWYgeS50YWIuaCB0b2tkZWZzLmgKIAogdmVyc2lvbi5oOiAuL1ZFUlNJT04KIAlAZWNobyAnLyogR2VuZXJhdGVkIGZyb20gVkVSU0lPTi4gRG8gbm90IGVkaXQgKi8nID4gJEAKQEAgLTc2LDMxICs5OCwxMiBAQAogCSQoQ0MpICQqLmMgLW8gJCouZXhlCiAKIGNsZWFuOgotCSQoTUFLRSkgLWYgTWFrZWZpbGUuZGogLUMgJChEUklWRVJfRElSKSBjbGVhbgotCSQoTUFLRSkgLWYgTWFrZWZpbGUuZGogLUMgbGliY3BjYXAgY2xlYW4KLQlybSAtZiAkKE9CSkVDVFMpIG1zZG9zL3BrdF9yeDEubHN0IE1ha2VmaWxlLmJhayAkKFBSRVJFUVVJU0lURVMpCisJcm0gLWYgJChPQkpFQ1RTKSBtc2Rvcy9wa3RfcngxLmxzdCBNYWtlZmlsZS5iYWsgLmRlcGVuZC5kaiAkKFBSRVJFUVVJU0lURVMpCisjCSQoTUFLRSkgLWYgTWFrZWZpbGUuZGogLUMgJChEUklWRVJfRElSKSBjbGVhbgogCiB2Y2xlYW46IGNsZWFuCi0Jcm0gLWYgbGlicGNhcC5hIG1zZG9zL2JpbjJjLmV4ZQotCi0jCi0jIEdlbmVyYXRlZCBkZXBlbmRlbmNpZXM7IER1ZSB0byBzb21lIGhhY2tzIGluIGdjYyAyLjk1IGFuZCBkamdwcCAyLjAzCi0jIHdlIG11c3QgcHJldmVudCAiJChESkRJUikvYmluLy4uL2luY2x1ZGUvc3lzL3ZlcnNpb24uaCIgZnJvbSBiZWVpbmcKLSMgaW5jbHVkZWQgaW4gZGVwZW5kZW5jeSBvdXRwdXQgKG9yIGVsc2UgdGhpcyBtYWtlZmlsZSBjYW5ub3QgYmUgdXNlZCBvbgotIyBhbm90aGVyIG1hY2hpbmUpLiBXZSB0aGVyZWZvcmUgdXNlIGEgc3BlY2lhbCAnc3BlY3MnIGZpbGUgZHVyaW5nCi0jIHByZS1wcm9jZXNzaW5nLgotIwotTU1fU1BFQ1MgPSBzcGVjcy50bXAKLU1BS0VGSUxFID0gbXNkb3MvTWFrZWZpbGUuZGoKLQotZGVwZW5kOiAkKFBSRVJFUVVJU0lURVMpCi0JQGVjaG8gR2VuZXJhdGluZyBkZXBlbmRlbmNpZXMuLgotCUBjcCAkKE1BS0VGSUxFKSBNYWtlZmlsZS5iYWsKLQlAZWNobyAiKmNwcDogJShjcHBfY3B1KSAle3Bvc2l4Oi1EX1BPU0lYX1NPVVJDRX0gLXJlbWFwIiA+ICQoTU1fU1BFQ1MpCi0Jc2VkIC1lICIvXiMgRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCIgPCBNYWtlZmlsZS5iYWsgPiAkKE1BS0VGSUxFKQotCWVjaG8gIiMgRE8gTk9UIERFTEVURSBUSElTIExJTkUiICAgICAgICAgICAgICAgICAgICAgICAgPj4gJChNQUtFRklMRSkKLQkkKENDKSAtTU0gLXNwZWNzPSQoTU1fU1BFQ1MpICQoQ0ZMQUdTKSAkKFNPVVJDRVMpICAgICAgID4+ICQoTUFLRUZJTEUpCi0Jcm0gLWYgJChNTV9TUEVDUykKKwlybSAtZiAkKFRBUkdFVFMpCisJLXJtZGlyICQoT0JKX0RJUikKIAogIwogIyBNYW51YWxseSBnZW5lcmF0ZWQgZGVwZW5kZW5jaWVzCkBAIC0xMDksNDMgKzExMiwxNiBAQAogc2Nhbm5lci5jOiBzY2FubmVyLmwKIGdyYW1tYXIuYyB0b2tkZWZzLmg6IGdyYW1tYXIueQogZ3JhbW1hci5oOiBncmFtbWFyLnkKLXNjYW5uZXIubDogcGNhcC1pbnQuaCBwY2FwLW5hbWVkYi5oIGdlbmNvZGUuaCBncmFtbWFyLmggZ251Yy5oCi1ncmFtbWFyLnk6IHBjYXAtaW50LmggZ2VuY29kZS5oIHBjYXAtbmFtZWRiLmggZ251Yy5oCitzY2FubmVyLmw6IHBjYXAtaW50LmggcGNhcC1uYW1lZGIuaCBnZW5jb2RlLmggZ3JhbW1hci5oCitncmFtbWFyLnk6IHBjYXAtaW50LmggZ2VuY29kZS5oIHBjYXAtbmFtZWRiLmgKIAogIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMKKyMgR2VuZXJhdGUgZGVwZW5kZW5jaWVzLgogIwotIyBETyBOT1QgREVMRVRFIFRISVMgTElORQotZ3JhbW1hci5vOiBncmFtbWFyLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggcGYuaCBcCi0gIHBjYXAtbmFtZWRiLmgKLXNjYW5uZXIubzogc2Nhbm5lci5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIHBjYXAtbmFtZWRiLmggXAotICB0b2tkZWZzLmgKLWJwZl9maWx0Lm86IGJwZl9maWx0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnbnVjLmgKLWJwZl9pbWFnLm86IGJwZl9pbWFnLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaAotYnBmX2R1bXAubzogYnBmX2R1bXAuYyBwY2FwLmggcGNhcC1icGYuaAotZXRoZXJlbnQubzogZXRoZXJlbnQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIHBjYXAtbmFtZWRiLmgKLWdlbmNvZGUubzogZ2VuY29kZS5jIHBjYXAtZG9zLmggbXNkb3MvcG1fZHJ2ci9sb2NrLmggcGNhcC1pbnQuaCBwY2FwLmggXAotICBwY2FwLWJwZi5oIGV0aGVydHlwZS5oIG5scGlkLmggbGxjLmggZ2VuY29kZS5oIGF0bXVuaTMxLmggc3VuYXRtcG9zLmggXAotICBwcHAuaCBzbGwuaCBhcmNuZXQuaCBwZi5oIHBjYXAtbmFtZWRiLmgKLW5hbWV0b2FkLm86IG5hbWV0b2FkLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggXAotICBwY2FwLW5hbWVkYi5oIGV0aGVydHlwZS5oCi1wY2FwLWRvcy5vOiBwY2FwLWRvcy5jIG1zZG9zL3BtX2RydnIvcG1kcnZyLmggbXNkb3MvcG1fZHJ2ci9pZmFjZS5oIFwKLSAgbXNkb3MvcG1fZHJ2ci9sb2NrLmggbXNkb3MvcG1fZHJ2ci9pb3BvcnQuaCBwY2FwLWRvcy5oIHBjYXAtaW50LmggXAotICBwY2FwLmggcGNhcC1icGYuaCBtc2Rvcy9wbV9kcnZyL2ttYWxsb2MuaCBtc2Rvcy9wbV9kcnZyL2JpdG9wcy5oIFwKLSAgbXNkb3MvcG1fZHJ2ci90aW1lci5oIG1zZG9zL3BtX2RydnIvZG1hLmggbXNkb3MvcG1fZHJ2ci9pcnEuaCBcCi0gIG1zZG9zL3BtX2RydnIvcHJpbnRrLmggbXNkb3MvcG1fZHJ2ci9wY2kuaCBtc2Rvcy9wbV9kcnZyL2Jpb3MzMi5oIFwKLSAgbXNkb3MvcG1fZHJ2ci9tb2R1bGUuaCBtc2Rvcy9wbV9kcnZyLzNjNTAxLmggbXNkb3MvcG1fZHJ2ci8zYzUwMy5oIFwKLSAgbXNkb3MvcG1fZHJ2ci8zYzUwOS5oIG1zZG9zL3BtX2RydnIvM2M1OXguaCBtc2Rvcy9wbV9kcnZyLzNjNTE1LmggXAotICBtc2Rvcy9wbV9kcnZyLzNjOTB4LmggbXNkb3MvcG1fZHJ2ci8zYzU3NV9jYi5oIG1zZG9zL3BtX2RydnIvbmUuaCBcCi0gIG1zZG9zL3BtX2RydnIvd2QuaCBtc2Rvcy9wbV9kcnZyL2FjY3Rvbi5oIG1zZG9zL3BtX2RydnIvY3M4OXgwLmggXAotICBtc2Rvcy9wbV9kcnZyL3J0bDgxMzkuaCBtc2Rvcy9wbV9kcnZyL25lMmstcGNpLmggbXNkb3MvcGt0ZHJ2ci5oCi1vcHRpbWl6ZS5vOiBvcHRpbWl6ZS5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oCi1zYXZlZmlsZS5vOiBzYXZlZmlsZS5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgKLXBjYXAubzogcGNhcC5jIHBjYXAtZG9zLmggbXNkb3MvcG1fZHJ2ci9sb2NrLmggcGNhcC1pbnQuaCBwY2FwLmggXAotICBwY2FwLWJwZi5oCi1pbmV0Lm86IGluZXQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oCi1wa3RkcnZyLm86IG1zZG9zL3BrdGRydnIuYyBnbnVjLmggcGNhcC1kb3MuaCBtc2Rvcy9wbV9kcnZyL2xvY2suaCBcCi0gIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggbXNkb3MvcGt0ZHJ2ci5oIG1zZG9zL3BrdF9zdHViLmluYwotbmRpczIubzogbXNkb3MvbmRpczIuYyBwY2FwLWRvcy5oIG1zZG9zL3BtX2RydnIvbG9jay5oIHBjYXAtaW50LmggcGNhcC5oIFwKLSAgcGNhcC1icGYuaCBtc2Rvcy9uZGlzMi5oCi1zbnByaW50Zi5vOiBtaXNzaW5nL3NucHJpbnRmLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaAorUkVQTEFDRSA9IHNlZCAtZSAncy9cKC4qXClcLm86IC9cbiQkKE9CSl9ESVIpXC9cMS5vOiAvJworCitkZXBlbmQ6ICQoUFJFUkVRVUlTSVRFUykKKwkkKENDKSAtTU0gJChDRkxBR1MpICQoU09VUkNFUykgfCAkKFJFUExBQ0UpID4gLmRlcGVuZC5kagorCistaW5jbHVkZSAuZGVwZW5kLmRqCisKZGlmZiAtLWdpdCBhL21zZG9zL21ha2VmaWxlLndjIGIvbXNkb3MvbWFrZWZpbGUud2MKaW5kZXggZTBkNTY3Mi4uNjFiYTEzNyAxMDA2NDQKLS0tIGEvbXNkb3MvbWFrZWZpbGUud2MKKysrIGIvbXNkb3MvbWFrZWZpbGUud2MKQEAgLTEsMTMxICsxLDEzNCBAQAotIw0KLSMgIFdhdGNvbSBNYWtlZmlsZSBmb3IgZG9zLWxpYnBjYXAuDQotIw0KLSMgU3BlY2lmeSBNT0RFTCA9IGAzcicgb3IgYDNzJw0KLSMgU3BlY2lmeSBUQVJHRVQgPSBgcGhhcmxhcCcgb3IgYGRvczRnJw0KLSMNCi0jIFVzZSB0aGlzIG1ha2VmaWxlIGZyb20gdGhlIGxpYnBjYXAgcm9vdCBkaXJlY3RvcnkuDQotIyBFLmcuIGxpa2UgdGhpczoNCi0jDQotIyAgYzpcbmV0XHBjYXA+IHdtYWtlIC1mIG1zZG9zXG1ha2VmaWxlLndjDQotIw0KLQ0KLU1PREVMICA9IDNzDQotVEFSR0VUID0gZG9zNGcNCi0NCi1PQkpESVIgPSBtc2Rvc1wkKFRBUkdFVCkudyQoTU9ERUwpDQotTElCICAgID0gJChPQkpESVIpXHBjYXAubGliDQotDQotLkVYVEVOU0lPTlM6IC5sIC55DQotDQotREVGUyA9IC1kREVCVUcgLWRORElTX0RFQlVHIC1kX1VfPSAtZEhBVkVfTElNSVRTX0ggLWRIQVZFX1NUUkVSUk9SICYNCi0gICAgICAgLWRIQVZFX1NOUFJJTlRGIC1kSEFWRV9WU05QUklOVEYNCi0NCi1DQyAgPSB3Y2MzODYuZXhlDQotQVNNID0gd2FzbS5leGUgLSQoTU9ERUwpICQoREVGUykgLWRET1NYIC1kRE9TNEdXIC16cSAtYnQ9ZG9zIC1mcj1udWwgLWQzIC1zDQotDQotT0JKUyA9ICQoT0JKRElSKVxncmFtbWFyLm9iaiAgJChPQkpESVIpXHNjYW5uZXIub2JqICAkKE9CSkRJUilccGNhcC5vYmogICAgICYNCi0gICAgICAgJChPQkpESVIpXGJwZl9maWx0Lm9iaiAkKE9CSkRJUilcYnBmX2ltYWcub2JqICQoT0JKRElSKVxicGZfZHVtcC5vYmogJg0KLSAgICAgICAkKE9CSkRJUilcZXRoZXJlbnQub2JqICQoT0JKRElSKVxnZW5jb2RlLm9iaiAgJChPQkpESVIpXG5hbWV0b2FkLm9iaiAmDQotICAgICAgICQoT0JKRElSKVxwY2FwLWRvcy5vYmogJChPQkpESVIpXHBrdGRydnIub2JqICAkKE9CSkRJUilcb3B0aW1pemUub2JqICYNCi0gICAgICAgJChPQkpESVIpXHNhdmVmaWxlLm9iaiAkKE9CSkRJUilcaW5ldC5vYmogICAgICQoT0JKRElSKVxuZGlzMi5vYmoNCi0NCi1DRkxBR1MgPSAkKERFRlMpICQoWVlERUZTKSAtSS4gLUkkKCV3YXR0X3Jvb3QpXGluYyAtSS5cbXNkb3NccG1fZHJ2ciAmDQotICAgICAgICAgLSQoTU9ERUwpIC1tZiAtemZmIC16Z2YgLXpxIC1idD1kb3MgLWZyPW51bCAtdzYgLWZwaSAgICAgICAgJg0KLSAgICAgICAgIC1vaWxydGYgLXptDQotDQotVEVNUEJJTiA9IHRtcC5iaW4NCi0NCi1hbGw6ICQoT0JKRElSKSAkKE9CSkRJUilccGNhcC5saWINCi0NCi0kKE9CSkRJUik6DQotICAgICAgICAgIC0gbWtkaXIgJChPQkpESVIpDQotDQotJChPQkpESVIpXHBjYXAubGliOiAkKE9CSlMpIHdsaWIuYXJnDQotICAgICAgICAgIHdsaWIgLXEgLWIgLWMgJChPQkpESVIpXHBjYXAubGliIEB3bGliLmFyZw0KLQ0KLXdsaWIuYXJnOiBtc2Rvc1xtYWtlZmlsZS53Yw0KLSAgICAgICAgICAlY3JlYXRlICReQA0KLSAgICAgICAgICBmb3IgJWYgaW4gKCQoT0JKUykpIGRvICVhcHBlbmQgJF5AICstICVmDQotDQotJChPQkpESVIpXHBrdGRydnIub2JqOiBtc2Rvc1xwa3Rfc3R1Yi5pbmMgbXNkb3NccGt0ZHJ2ci5jIGdudWMuaCAmDQotICBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIG1zZG9zXHBrdGRydnIuaA0KLSAgICAgICAgICAqJChDQykgJChDRkxBR1MpIG1zZG9zXHBrdGRydnIuYyAtZm89JEANCi0NCi0kKE9CSkRJUilcbmRpczIub2JqOiBtc2Rvc1xuZGlzMi5jDQotICAgICAgICAgICokKENDKSAkKENGTEFHUykgbXNkb3NcbmRpczIuYyAtZm89JEANCi0NCi0uRVJBU0UNCi0uY3skKE9CSkRJUil9Lm9iajoNCi0gICAgICAgICAgKiQoQ0MpICQoQ0ZMQUdTKSAkW0AgLWZvPSRADQotDQotZ3JhbW1hci5jIHRva2RlZnMuaDogZ3JhbW1hci55IA0KLSAgICAgICAgICBiaXNvbiAtLW5hbWUtcHJlZml4PXBjYXBfIC0teWFjYyAtLWRlZmluZXMgJFtADQotICAgICAgICAgIC0gQGRlbCBncmFtbWFyLmMNCi0gICAgICAgICAgLSBAZGVsIHRva2RlZnMuaA0KLSAgICAgICAgICByZW4geV90YWIuYyBncmFtbWFyLmMNCi0gICAgICAgICAgcmVuIHlfdGFiLmggdG9rZGVmcy5oDQotDQotc2Nhbm5lci5jOiBzY2FubmVyLmwNCi0gICAgICAgICAgZmxleCAtUHBjYXBfIC03IC1vJEAgJFtADQotDQotbXNkb3NccGt0X3N0dWIuaW5jOiBiaW4yYy5leGUgbXNkb3NccGt0X3J4MS5TDQotICAgICAgICAgIG5hc20gLWZiaW4gLWRERUJVRyAtbyAkKFRFTVBCSU4pIC1sbXNkb3NccGt0X3J4MS5sc3QgbXNkb3NccGt0X3J4MS5TDQotICAgICAgICAgIGJpbjJjLmV4ZSAgJChURU1QQklOKSA+ICRADQotICAgICAgICAgIEBkZWwgJChURU1QQklOKQ0KLQ0KLWJpbjJjLmV4ZTogbXNkb3NcYmluMmMuYw0KLSAgICAgICAgICB3Y2wgJFtADQotDQotY2xlYW4gcmVhbGNsZWFuIHZjbGVhbjogLlNZTUJPTElDDQotICAgICAgICAgIGZvciAlZiBpbiAoZG9zNGcudzNyIGRvczRnLnczcyBwaGFybGFwLnczciBwaGFybGFwLnczcykgZG8gJg0KLSAgICAgICAgICAgIEBkZWwgJWZcKi5vYmoNCi0gICAgICAgICAgQGRlbCBncmFtbWFyLmMNCi0gICAgICAgICAgQGRlbCB0b2tkZWZzLmgNCi0gICAgICAgICAgQGRlbCBzY2FubmVyLmMNCi0gICAgICAgICAgQGRlbCBiaW4yYy5leGUNCi0gICAgICAgICAgQGRlbCBiaW4yYy5vYmoNCi0gICAgICAgICAgQGRlbCBtc2Rvc1xwa3Rfc3R1Yi5pbmMNCi0gICAgICAgICAgQGVjaG8gQ2xlYW5lZA0KLQ0KLSMNCi0jIGRlcGVuZGVuY2llcw0KLSMgICAgICAgICAgICAgICAgICAgICANCi0kKE9CSkRJUilcYnBmX2ZpbHQub2JqOiBicGZfZmlsdC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ251Yy5oDQotDQotJChPQkpESVIpXGJwZl9pbWFnLm9iajogYnBmX2ltYWcuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQotDQotJChPQkpESVIpXGJwZl9kdW1wLm9iajogYnBmX2R1bXAuYyBwY2FwLmggcGNhcC1icGYuaA0KLQ0KLSQoT0JKRElSKVxldGhlcmVudC5vYmo6IGV0aGVyZW50LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBwY2FwLW5hbS5oDQotDQotJChPQkpESVIpXG9wdGltaXplLm9iajogb3B0aW1pemUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaA0KLQ0KLSQoT0JKRElSKVxzYXZlZmlsZS5vYmo6IHNhdmVmaWxlLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KLQ0KLSQoT0JKRElSKVxwY2FwLm9iajogcGNhcC5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KLQ0KLSQoT0JKRElSKVxpbmV0Lm9iajogaW5ldC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCi0NCi0kKE9CSkRJUilcZ3JhbW1hci5vYmo6IGdyYW1tYXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCAmDQotICBwZi5oIHBjYXAtbmFtLmgNCi0NCi0kKE9CSkRJUilcc2Nhbm5lci5vYmo6IHNjYW5uZXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCAmDQotICBwY2FwLW5hbS5oIHRva2RlZnMuaA0KLQ0KLSQoT0JKRElSKVxnZW5jb2RlLm9iajogZ2VuY29kZS5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCAmDQotICBldGhlcnR5cC5oIG5scGlkLmggbGxjLmggZ2VuY29kZS5oIGF0bXVuaTMxLmggc3VuYXRtcG8uaCBwcHAuaCBzbGwuaCAmDQotICBhcmNuZXQuaCBwZi5oIHBjYXAtbmFtLmgNCi0NCi0kKE9CSkRJUilcbmFtZXRvYWQub2JqOiBuYW1ldG9hZC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oICYNCi0gIHBjYXAtbmFtLmggZXRoZXJ0eXAuaA0KLQ0KLSQoT0JKRElSKVxwY2FwLWRvcy5vYmo6IHBjYXAtZG9zLmMgcGNhcC5oIHBjYXAtYnBmLmggcGNhcC1kb3MuaCBwY2FwLWludC5oICYNCi0gIG1zZG9zXHBrdGRydnIuaA0KLQ0KLSQoT0JKRElSKVxwa3RkcnZyLm9iajogbXNkb3NccGt0ZHJ2ci5jIGdudWMuaCBwY2FwLWRvcy5oIHBjYXAtaW50LmggJg0KLSAgcGNhcC5oIHBjYXAtYnBmLmggbXNkb3NccGt0ZHJ2ci5oIG1zZG9zXHBrdF9zdHViLmluYw0KLQ0KLSQoT0JKRElSKVxuZGlzMi5vYmo6IG1zZG9zXG5kaXMyLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oICYNCi0gIG1zZG9zXG5kaXMyLmgNCi0NCisjCisjICBXYXRjb20gTWFrZWZpbGUgZm9yIGRvcy1saWJwY2FwLgorIworIyBTcGVjaWZ5IE1PREVMID0gYDNyJyBvciBgM3MnCisjIFNwZWNpZnkgVEFSR0VUID0gYHBoYXJsYXAnIG9yIGBkb3M0ZycKKyMKKyMgVXNlIHRoaXMgbWFrZWZpbGUgZnJvbSB0aGUgbGlicGNhcCByb290IGRpcmVjdG9yeS4KKyMgRS5nLiBsaWtlIHRoaXM6CisjCisjICBjOlxuZXRccGNhcD4gd21ha2UgLWYgbXNkb3NcbWFrZWZpbGUud2MKKyMKKworTU9ERUwgID0gM3MKK1RBUkdFVCA9IGRvczRnCisKK09CSkRJUiA9IG1zZG9zXCQoVEFSR0VUKS53JChNT0RFTCkKK0xJQiAgICA9ICQoT0JKRElSKVxwY2FwLmxpYgorCisuRVhURU5TSU9OUzogLmwgLnkKKworREVGUyA9IC1kREVCVUcgLWRORElTX0RFQlVHIC1kX1VfPSAtZEhBVkVfTElNSVRTX0ggLWRIQVZFX1NUUkVSUk9SICYKKyAgICAgICAtZEhBVkVfU05QUklOVEYgLWRIQVZFX1ZTTlBSSU5URgorCitDQyAgPSB3Y2MzODYuZXhlCitBU00gPSB3YXNtLmV4ZSAtJChNT0RFTCkgJChERUZTKSAtZERPU1ggLWRET1M0R1cgLXpxIC1idD1kb3MgLWZyPW51bCAtZDMgLXMKKworT0JKUyA9ICQoT0JKRElSKVxncmFtbWFyLm9iaiAgICAkKE9CSkRJUilcc2Nhbm5lci5vYmogICQoT0JKRElSKVxwY2FwLm9iaiAgICAgJgorICAgICAgICQoT0JKRElSKVxicGZfZmlsdGVyLm9iaiAkKE9CSkRJUilcYnBmX2ltYWcub2JqICQoT0JKRElSKVxicGZfZHVtcC5vYmogJgorICAgICAgICQoT0JKRElSKVxldGhlcmVudC5vYmogICAkKE9CSkRJUilcZ2VuY29kZS5vYmogICQoT0JKRElSKVxuYW1ldG9hZC5vYmogJgorICAgICAgICQoT0JKRElSKVxwY2FwLWRvcy5vYmogICAkKE9CSkRJUilccGt0ZHJ2ci5vYmogICQoT0JKRElSKVxvcHRpbWl6ZS5vYmogJgorICAgICAgICQoT0JKRElSKVxzYXZlZmlsZS5vYmogICAkKE9CSkRJUilcaW5ldC5vYmogICAgICQoT0JKRElSKVxuZGlzMi5vYmoKKworQ0ZMQUdTID0gJChERUZTKSAkKFlZREVGUykgLUkuIC1JJCgld2F0dF9yb290KVxpbmMgLUkuXG1zZG9zXHBtX2RydnIgJgorICAgICAgICAgLSQoTU9ERUwpIC1tZiAtemZmIC16Z2YgLXpxIC1idD1kb3MgLWZyPW51bCAtdzYgLWZwaSAgICAgICAgJgorICAgICAgICAgLW9pbHJ0ZiAtem0KKworVEVNUEJJTiA9IHRtcC5iaW4KKworYWxsOiAkKE9CSkRJUikgJChPQkpESVIpXHBjYXAubGliCisKKyQoT0JKRElSKToKKyAgICAgICAgICAtIG1rZGlyICQoT0JKRElSKQorCiskKE9CSkRJUilccGNhcC5saWI6ICQoT0JKUykgd2xpYi5hcmcKKyAgICAgICAgICB3bGliIC1xIC1iIC1jICQoT0JKRElSKVxwY2FwLmxpYiBAd2xpYi5hcmcKKword2xpYi5hcmc6IG1zZG9zXG1ha2VmaWxlLndjCisgICAgICAgICAgJWNyZWF0ZSAkXkAKKyAgICAgICAgICBmb3IgJWYgaW4gKCQoT0JKUykpIGRvICVhcHBlbmQgJF5AICstICVmCisKKyQoT0JKRElSKVxwa3RkcnZyLm9iajogbXNkb3NccGt0X3N0dWIuaW5jIG1zZG9zXHBrdGRydnIuYyAmCisgIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggbXNkb3NccGt0ZHJ2ci5oCisgICAgICAgICAgKiQoQ0MpICQoQ0ZMQUdTKSBtc2Rvc1xwa3RkcnZyLmMgLWZvPSRACisKKyQoT0JKRElSKVxicGZfZmlsdGVyLm9iajogYnBmXG5ldFxicGZfZmlsdGVyLmMKKyAgICAgICAgICAqJChDQykgJChDRkxBR1MpIGJwZlxuZXRcYnBmX2ZpbHRlci5jIC1mbz0kQAorCiskKE9CSkRJUilcbmRpczIub2JqOiBtc2Rvc1xuZGlzMi5jCisgICAgICAgICAgKiQoQ0MpICQoQ0ZMQUdTKSBtc2Rvc1xuZGlzMi5jIC1mbz0kQAorCisuRVJBU0UKKy5jeyQoT0JKRElSKX0ub2JqOgorICAgICAgICAgICokKENDKSAkKENGTEFHUykgJFtAIC1mbz0kQAorCitncmFtbWFyLmMgdG9rZGVmcy5oOiBncmFtbWFyLnkKKyAgICAgICAgICBiaXNvbiAtLW5hbWUtcHJlZml4PXBjYXBfIC0teWFjYyAtLWRlZmluZXMgJFtACisgICAgICAgICAgLSBAZGVsIGdyYW1tYXIuYworICAgICAgICAgIC0gQGRlbCB0b2tkZWZzLmgKKyAgICAgICAgICByZW4geV90YWIuYyBncmFtbWFyLmMKKyAgICAgICAgICByZW4geV90YWIuaCB0b2tkZWZzLmgKKworc2Nhbm5lci5jOiBzY2FubmVyLmwKKyAgICAgICAgICBmbGV4IC1QcGNhcF8gLTcgLW8kQCAkW0AKKworbXNkb3NccGt0X3N0dWIuaW5jOiBiaW4yYy5leGUgbXNkb3NccGt0X3J4MS5TCisgICAgICAgICAgbmFzbSAtZmJpbiAtZERFQlVHIC1vICQoVEVNUEJJTikgLWxtc2Rvc1xwa3RfcngxLmxzdCBtc2Rvc1xwa3RfcngxLlMKKyAgICAgICAgICBiaW4yYy5leGUgICQoVEVNUEJJTikgPiAkQAorICAgICAgICAgIEBkZWwgJChURU1QQklOKQorCitiaW4yYy5leGU6IG1zZG9zXGJpbjJjLmMKKyAgICAgICAgICB3Y2wgJFtACisKK2NsZWFuIHJlYWxjbGVhbiB2Y2xlYW46IC5TWU1CT0xJQworICAgICAgICAgIGZvciAlZiBpbiAoZG9zNGcudzNyIGRvczRnLnczcyBwaGFybGFwLnczciBwaGFybGFwLnczcykgZG8gJgorICAgICAgICAgICAgQGRlbCAlZlwqLm9iagorICAgICAgICAgIEBkZWwgZ3JhbW1hci5jCisgICAgICAgICAgQGRlbCB0b2tkZWZzLmgKKyAgICAgICAgICBAZGVsIHNjYW5uZXIuYworICAgICAgICAgIEBkZWwgYmluMmMuZXhlCisgICAgICAgICAgQGRlbCBiaW4yYy5vYmoKKyAgICAgICAgICBAZGVsIG1zZG9zXHBrdF9zdHViLmluYworICAgICAgICAgIEBlY2hvIENsZWFuZWQKKworIworIyBkZXBlbmRlbmNpZXMKKyMKKyQoT0JKRElSKVxicGZfZmlsdGVyLm9iajogYnBmXG5ldFxicGZfZmlsdGVyLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaAorCiskKE9CSkRJUilcYnBmX2ltYWcub2JqOiBicGZfaW1hZy5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgKKworJChPQkpESVIpXGJwZl9kdW1wLm9iajogYnBmX2R1bXAuYyBwY2FwLmggcGNhcC1icGYuaAorCiskKE9CSkRJUilcZXRoZXJlbnQub2JqOiBldGhlcmVudC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggcGNhcC1uYW1lZGIuaAorCiskKE9CSkRJUilcb3B0aW1pemUub2JqOiBvcHRpbWl6ZS5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oCisKKyQoT0JKRElSKVxzYXZlZmlsZS5vYmo6IHNhdmVmaWxlLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaAorCiskKE9CSkRJUilccGNhcC5vYmo6IHBjYXAuYyBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgKKworJChPQkpESVIpXGluZXQub2JqOiBpbmV0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaAorCiskKE9CSkRJUilcZ3JhbW1hci5vYmo6IGdyYW1tYXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCAmCisgIHBjYXAtbmFtZWRiLmgKKworJChPQkpESVIpXHNjYW5uZXIub2JqOiBzY2FubmVyLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggJgorICBwY2FwLW5hbWVkYi5oIHRva2RlZnMuaAorCiskKE9CSkRJUilcZ2VuY29kZS5vYmo6IGdlbmNvZGUuYyBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggJgorICBldGhlcnR5cC5oIG5scGlkLmggbGxjLmggZ2VuY29kZS5oIGF0bXVuaTMxLmggc3VuYXRtcG8uaCBwcHAuaCBzbGwuaCAmCisgIGFyY25ldC5oIHBjYXAtbmFtZWRiLmgKKworJChPQkpESVIpXG5hbWV0b2FkLm9iajogbmFtZXRvYWQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCAmCisgIHBjYXAtbmFtZWRiLmggZXRoZXJ0eXAuaAorCiskKE9CSkRJUilccGNhcC1kb3Mub2JqOiBwY2FwLWRvcy5jIHBjYXAuaCBwY2FwLWJwZi5oIHBjYXAtZG9zLmggcGNhcC1pbnQuaCAmCisgIG1zZG9zXHBrdGRydnIuaAorCiskKE9CSkRJUilccGt0ZHJ2ci5vYmo6IG1zZG9zXHBrdGRydnIuYyBwY2FwLWRvcy5oIHBjYXAtaW50LmggJgorICBwY2FwLmggcGNhcC1icGYuaCBtc2Rvc1xwa3RkcnZyLmggbXNkb3NccGt0X3N0dWIuaW5jCisKKyQoT0JKRElSKVxuZGlzMi5vYmo6IG1zZG9zXG5kaXMyLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oICYKKyAgbXNkb3NcbmRpczIuaAorCmRpZmYgLS1naXQgYS9tc2Rvcy9uZGlzMi5jIGIvbXNkb3MvbmRpczIuYwppbmRleCAwYTVlYTJhLi41MjZiMjIxIDEwMDY0NAotLS0gYS9tc2Rvcy9uZGlzMi5jCisrKyBiL21zZG9zL25kaXMyLmMKQEAgLTEsODYwICsxLDg2MCBAQAotLyogDQotICogQ29weXJpZ2h0IChjKSAxOTkzLDE5OTQNCi0gKiAgICAgIFRleGFzIEEmTSBVbml2ZXJzaXR5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0gKg0KLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KLSAqIGFyZSBtZXQ6DQotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlDQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUNCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6DQotICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFRleGFzIEEmTSBVbml2ZXJzaXR5DQotICogICAgICBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4NCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycw0KLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQ0KLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLSAqDQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgVU5JVkVSU0lUWSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQNCi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUNCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQ0KLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFVOSVZFUlNJVFkgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQ0KLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMDQotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMNCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikNCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVA0KLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkNCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GDQotICogU1VDSCBEQU1BR0UuDQotICoNCi0gKiBEZXZlbG9wZXJzOg0KLSAqICAgICAgICAgICAgIERhdmlkIEsuIEhlc3MsIERvdWdsYXMgTGVlIFNjaGFsZXMsIERhdmlkIFIuIFNhZmZvcmQNCi0gKg0KLSAqIEhlYXZpbHkgbW9kaWZpZWQgZm9yIE1ldGF3YXJlIEhpZ2hDICsgR05VIEMgMi44Kw0KLSAqICAgICAgICAgICAgIEdpc2xlIFZhbmVtIDE5OTgNCi0gKi8NCi0NCi0jaW5jbHVkZSA8c3RkaW8uaD4NCi0jaW5jbHVkZSA8c3RkbGliLmg+DQotI2luY2x1ZGUgPGRvcy5oPg0KLSNpbmNsdWRlIDxpby5oPg0KLSNpbmNsdWRlIDxmY250bC5oPg0KLSNpbmNsdWRlIDxtYWxsb2MuaD4NCi0jaW5jbHVkZSA8c3RyaW5nLmg+DQotDQotI2luY2x1ZGUgInBjYXAtZG9zLmgiDQotI2luY2x1ZGUgInBjYXAtaW50LmgiDQotI2luY2x1ZGUgIm1zZG9zL25kaXMyLmgiDQotDQotI2lmIGRlZmluZWQoVVNFX05ESVMyKQ0KLQ0KLS8qDQotICogIFBhY2tldCBidWZmZXIgaGFuZGxpbmcNCi0gKi8NCi1leHRlcm4gaW50ICAgICBGcmVlUGt0QnVmICAoUGt0QnVmICpidWYpOw0KLWV4dGVybiBpbnQgICAgIEVucXVlUGt0QnVmIChQa3RCdWYgKmJ1Zik7DQotZXh0ZXJuIFBrdEJ1ZiogQWxsb2NQa3RCdWYgKHZvaWQpOw0KLQ0KLS8qDQotICogIFZhcmlvdXMgZGVmaW5lcw0KLSAqLw0KLSNkZWZpbmUgTUFYX05VTV9ERUJVR19TVFJJTkdTIDkwDQotI2RlZmluZSBERUJVR19TVFJJTkdfTEVOR1RIICAgODANCi0jZGVmaW5lIFNUQUNLX1BPT0xfU0laRSAgICAgICA2DQotI2RlZmluZSBTVEFDS19TSVpFICAgICAgICAgICAgMjU2DQotDQotI2RlZmluZSBNRURJQV9GRERJICAgICAgICAgICAgMQ0KLSNkZWZpbmUgTUVESUFfRVRIRVJORVQgICAgICAgIDINCi0jZGVmaW5lIE1FRElBX1RPS0VOICAgICAgICAgICAzDQotDQotc3RhdGljIGludCAgICAgc3RhcnREZWJ1ZyAgICAgPSAwOw0KLXN0YXRpYyBpbnQgICAgIHN0b3BEZWJ1ZyAgICAgID0gMDsNCi0NCi1zdGF0aWMgRFdPUkQgICBkcm9wcGVkUGFja2V0cyA9IDBMOw0KLXN0YXRpYyBXT1JEICAgIGZyYW1lU2l6ZSAgICAgID0gMDsNCi1zdGF0aWMgV09SRCAgICBoZWFkZXJTaXplICAgICA9IDA7DQotc3RhdGljIGludCAgICAgbWVkaWFUeXBlICAgICAgPSAwOw0KLXN0YXRpYyBjaGFyICAgKmxhc3RFcnIgICAgICAgID0gTlVMTDsNCi0NCi1zdGF0aWMgQllURSAgICBkZWJ1Z1N0cmluZ3MgW01BWF9OVU1fREVCVUdfU1RSSU5HU11bREVCVUdfU1RSSU5HX0xFTkdUSF07DQotc3RhdGljIEJZVEUgICAqZnJlZVN0YWNrcyAgIFtTVEFDS19QT09MX1NJWkVdOw0KLXN0YXRpYyBpbnQgICAgIGZyZWVTdGFja1B0ciA9IFNUQUNLX1BPT0xfU0laRSAtIDE7DQotDQotc3RhdGljIFByb3RNYW4gcHJvdE1hbkVudHJ5ID0gTlVMTDsNCi1zdGF0aWMgV09SRCAgICBwcm90TWFuRFMgICAgPSAwOw0KLXN0YXRpYyB2b2xhdGlsZSBpbnQgeG1pdFBlbmRpbmc7DQotDQotc3RhdGljIHN0cnVjdCBfUGt0QnVmICAgICAgICAqdHhCdWZQZW5kaW5nOw0KLXN0YXRpYyBzdHJ1Y3QgX0NhcmRIYW5kbGUgICAgKmhhbmRsZTsNCi1zdGF0aWMgc3RydWN0IF9Db21tb25DaGFycyAgICBjb21tb247DQotc3RhdGljIHN0cnVjdCBfUHJvdG9jb2xDaGFycyAgcHJvdENoYXJzOw0KLXN0YXRpYyBzdHJ1Y3QgX1Byb3REaXNwYXRjaCAgIGxvd2VyVGFibGU7DQotDQotc3RhdGljIHN0cnVjdCBfRmFpbGluZ01vZHVsZXMgZmFpbGluZ01vZHVsZXM7DQotc3RhdGljIHN0cnVjdCBfQmluZGluZ3NMaXN0ICAgYmluZGluZ3M7DQotDQotc3RhdGljIHN0cnVjdCB7DQotICAgICAgICAgV09SRCAgZXJyX251bTsNCi0gICAgICAgICBjaGFyICplcnJfdGV4dDsNCi0gICAgICAgfSBuZGlzX2Vycmxpc3RbXSA9IHsNCi0NCi0gIHsgRVJSX1NVQ0NFU1MsDQotICAgICJUaGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiIgIH0sDQotDQotICB7IEVSUl9XQUlUX0ZPUl9SRUxFQVNFLA0KLSAgICAiVGhlIFJlY2VpdmVDaGFpbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCB0aGUgcHJvdG9jb2wgaGFzXG4iDQotICAgICJyZXRhaW5lZCBjb250cm9sIG9mIHRoZSBidWZmZXIuXG4iICB9LA0KLQ0KLSAgeyBFUlJfUkVRVUVTVF9RVUVVRUQsDQotICAgICJUaGUgY3VycmVudCByZXF1ZXN0IGhhcyBiZWVuIHF1ZXVlZC5cbiIgIH0sDQotDQotICB7IEVSUl9GUkFNRV9OT1RfUkVDT0dOSVpFRCwNCi0gICAgIkZyYW1lIG5vdCByZWNvZ25pemVkLlxuIiAgfSwNCi0NCi0gIHsgRVJSX0ZSQU1FX1JFSkVDVEVELA0KLSAgICAiRnJhbWUgd2FzIGRpc2NhcmRlZC5cbiIgIH0sDQotDQotICB7IEVSUl9GT1JXQVJEX0ZSQU1FLA0KLSAgICAiUHJvdG9jb2wgd2lzaGVzIHRvIGZvcndhcmQgZnJhbWUgdG8gYW5vdGhlciBwcm90b2NvbC5cbiIgIH0sDQotDQotICB7IEVSUl9PVVRfT0ZfUkVTT1VSQ0UsDQotICAgICJPdXQgb2YgcmVzb3VyY2UuXG4iICB9LA0KLQ0KLSAgeyBFUlJfSU5WQUxJRF9QQVJBTUVURVIsDQotICAgICJJbnZhbGlkIHBhcmFtZXRlci5cbiIgIH0sDQotDQotICB7IEVSUl9JTlZBTElEX0ZVTkNUSU9OLA0KLSAgICAiSW52YWxpZCBmdW5jdGlvbi5cbiIgIH0sDQotDQotICB7IEVSUl9OT1RfU1VQUE9SVEVELA0KLSAgICAiTm90IHN1cHBvcnRlZC5cbiIgIH0sDQotDQotICB7IEVSUl9IQVJEV0FSRV9FUlJPUiwNCi0gICAgIkhhcmR3YXJlIGVycm9yLlxuIiAgfSwNCi0NCi0gIHsgRVJSX1RSQU5TTUlUX0VSUk9SLA0KLSAgICAiVGhlIHBhY2tldCB3YXMgbm90IHRyYW5zbWl0dGVkIGR1ZSB0byBhbiBlcnJvci5cbiIgIH0sDQotDQotICB7IEVSUl9OT19TVUNIX0RFU1RJTkFUSU9OLA0KLSAgICAiVG9rZW4gcmluZyBwYWNrZXQgd2FzIG5vdCByZWNvZ25pemVkIHdoZW4gdHJhbnNtaXR0ZWQuXG4iICB9LA0KLQ0KLSAgeyBFUlJfQlVGRkVSX1RPT19TTUFMTCwNCi0gICAgIlByb3ZpZGVkIGJ1ZmZlciB3YXMgdG9vIHNtYWxsLlxuIiAgfSwNCi0NCi0gIHsgRVJSX0FMUkVBRFlfU1RBUlRFRCwNCi0gICAgIk5ldHdvcmsgZHJpdmVycyBhbHJlYWR5IHN0YXJ0ZWQuXG4iICB9LA0KLQ0KLSAgeyBFUlJfSU5DT01QTEVURV9CSU5ESU5HLA0KLSAgICAiUHJvdG9jb2wgZHJpdmVyIGNvdWxkIG5vdCBjb21wbGV0ZSBpdHMgYmluZGluZ3MuXG4iICB9LA0KLQ0KLSAgeyBFUlJfRFJJVkVSX05PVF9JTklUSUFMSVpFRCwNCi0gICAgIk1BQyBkaWQgbm90IGluaXRpYWxpemUgcHJvcGVybHkuXG4iICB9LA0KLQ0KLSAgeyBFUlJfSEFSRFdBUkVfTk9UX0ZPVU5ELA0KLSAgICAiSGFyZHdhcmUgbm90IGZvdW5kLlxuIiAgfSwNCi0NCi0gIHsgRVJSX0hBUkRXQVJFX0ZBSUxVUkUsDQotICAgICJIYXJkd2FyZSBmYWlsdXJlLlxuIiAgfSwNCi0NCi0gIHsgRVJSX0NPTkZJR1VSQVRJT05fRkFJTFVSRSwNCi0gICAgIkNvbmZpZ3VyYXRpb24gZmFpbHVyZS5cbiIgIH0sDQotDQotICB7IEVSUl9JTlRFUlJVUFRfQ09ORkxJQ1QsDQotICAgICJJbnRlcnJ1cHQgY29uZmxpY3QuXG4iICB9LA0KLQ0KLSAgeyBFUlJfSU5DT01QQVRJQkxFX01BQywNCi0gICAgIlRoZSBNQUMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wuXG4iICB9LA0KLQ0KLSAgeyBFUlJfSU5JVElBTElaQVRJT05fRkFJTEVELA0KLSAgICAiSW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIiAgfSwNCi0NCi0gIHsgRVJSX05PX0JJTkRJTkcsDQotICAgICJCaW5kaW5nIGRpZCBub3Qgb2NjdXIuXG4iICB9LA0KLQ0KLSAgeyBFUlJfTkVUV09SS19NQVlfTk9UX0JFX0NPTk5FQ1RFRCwNCi0gICAgIlRoZSBuZXR3b3JrIG1heSBub3QgYmUgY29ubmVjdGVkIHRvIHRoZSBhZGFwdGVyLlxuIiAgfSwNCi0NCi0gIHsgRVJSX0lOQ09NUEFUSUJMRV9PU19WRVJTSU9OLA0KLSAgICAiVGhlIHZlcnNpb24gb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sLlxuIiAgfSwNCi0NCi0gIHsgRVJSX0FMUkVBRFlfUkVHSVNURVJFRCwNCi0gICAgIlRoZSBwcm90b2NvbCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4iICB9LA0KLQ0KLSAgeyBFUlJfUEFUSF9OT1RfRk9VTkQsDQotICAgICJQUk9UTUFOLkVYRSBjb3VsZCBub3QgYmUgZm91bmQuXG4iICB9LA0KLQ0KLSAgeyBFUlJfSU5TVUZGSUNJRU5UX01FTU9SWSwNCi0gICAgIkluc3VmZmljaWVudCBtZW1vcnkuXG4iICB9LA0KLQ0KLSAgeyBFUlJfSU5GT19OT1RfRk9VTkQsDQotICAgICJQcm90b2NvbCBNYW5hbmdlciBpbmZvIHN0cnVjdHVyZSBpcyBsb3N0IG9yIGNvcnJ1cHRlZC5cbiIgIH0sDQotDQotICB7IEVSUl9HRU5FUkFMX0ZBSUxVUkUsDQotICAgICJHZW5lcmFsIGZhaWx1cmUuXG4iICB9DQotfTsNCi0NCi0vKg0KLSAqICBTb21lIGhhbmR5IG1hY3Jvcw0KLSAqLyAgICAgICANCi0jZGVmaW5lIFBFUlJPUihzdHIpICAgIHByaW50ZigiJXMgKCVkKTogJXNcbiIsIF9fRklMRV9fLF9fTElORV9fLHN0cikNCi0jZGVmaW5lIERFQlVHX1JJTkcoKSAgIChkZWJ1Z1N0cmluZ3Nbc3RvcERlYnVnKzEgPT0gTUFYX05VTV9ERUJVR19TVFJJTkdTID8gXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BEZWJ1ZyA9IDAgOiArK3N0b3BEZWJ1Z10pDQotDQotLyoNCi0gKiBuZWVkcyByZXdyaXRlIGZvciBET1NYDQotICovDQotI2RlZmluZSBNQUNfRElTUEFUQ0goaG5kKSAgKChzdHJ1Y3QgX01hY1VwcGVyRGlzcGF0Y2gqKShobmQpLT5jb21tb24tPnVwcGVyRGlzcGF0Y2hUYWJsZSkNCi0jZGVmaW5lIE1BQ19TVEFUVVMoaG5kKSAgICAoKHN0cnVjdCBfTWFjU3RhdHVzVGFibGUqKSAgKGhuZCktPmNvbW1vbi0+c2VydmljZVN0YXR1cykNCi0jZGVmaW5lIE1BQ19DSEFSKGhuZCkgICAgICAoKHN0cnVjdCBfTWFjQ2hhcnMqKSAgICAgICAgKGhuZCktPmNvbW1vbi0+c2VydmljZUNoYXJzKQ0KLQ0KLSNpZmRlZiBORElTX0RFQlVHDQotICAjZGVmaW5lIERFQlVHMChzdHIpICAgICAgcHJpbnRmIChzdHIpDQotICAjZGVmaW5lIERFQlVHMShmbXQsYSkgICAgcHJpbnRmIChmbXQsYSkNCi0gICNkZWZpbmUgREVCVUcyKGZtdCxhLGIpICBwcmludGYgKGZtdCxhLGIpDQotICAjZGVmaW5lIFRSQUNFMChzdHIpICAgICAgc3ByaW50ZiAoREVCVUdfUklORygpLHN0cikNCi0gICNkZWZpbmUgVFJBQ0UxKGZtdCxhKSAgICBzcHJpbnRmIChERUJVR19SSU5HKCksZm10LGEpDQotI2Vsc2UNCi0gICNkZWZpbmUgREVCVUcwKHN0cikgICAgICAoKHZvaWQpMCkNCi0gICNkZWZpbmUgREVCVUcxKGZtdCxhKSAgICAoKHZvaWQpMCkNCi0gICNkZWZpbmUgREVCVUcyKGZtdCxhLGIpICAoKHZvaWQpMCkNCi0gICNkZWZpbmUgVFJBQ0UwKHN0cikgICAgICAoKHZvaWQpMCkNCi0gICNkZWZpbmUgVFJBQ0UxKGZtdCxhKSAgICAoKHZvaWQpMCkNCi0jZW5kaWYNCi0NCi0vKg0KLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBib3RoIHRocmVhZHMNCi0gKi8NCi12b2lkIE5kaXNGcmVlU3RhY2sgKEJZVEUgKmFTdGFjaykNCi17DQotICBHVUFSRCgpOw0KLQ0KLSAgaWYgKGZyZWVTdGFja1B0ciA9PSBTVEFDS19QT09MX1NJWkUgLSAxKQ0KLSAgICAgUEVSUk9SICgidHJpZWQgdG8gZnJlZSB0b28gbWFueSBzdGFja3MiKTsNCi0NCi0gIGZyZWVTdGFja3NbKytmcmVlU3RhY2tQdHJdID0gYVN0YWNrOw0KLQ0KLSAgaWYgKGZyZWVTdGFja1B0ciA9PSAwKQ0KLSAgICAgVFJBQ0UwICgiZnJlZVN0YWNrUHRyIHdlbnQgcG9zaXRpdmVcbiIpOw0KLQ0KLSAgVU5HVUFSRCgpOw0KLX0NCi0NCi0vKg0KLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBjYWxsYmFja3MgdG8gYWxsb2NhdGUgbG9jYWwgZGF0YQ0KLSAqLw0KLUJZVEUgKk5kaXNBbGxvY1N0YWNrICh2b2lkKQ0KLXsNCi0gIEJZVEUgKnN0YWNrOw0KLQ0KLSAgR1VBUkQoKTsNCi0NCi0gIGlmIChmcmVlU3RhY2tQdHIgPCAwKQ0KLSAgew0KLSAgICAvKiBSYW4gb3V0IG9mIHN0YWNrIGJ1ZmZlcnMuIFJldHVybiBOVUxMIHdoaWNoIHdpbGwgc3RhcnQNCi0gICAgICogZHJvcHBpbmcgcGFja2V0cw0KLSAgICAgKi8NCi0gICAgVFJBQ0UwICgiZnJlZVN0YWNrUHRyIHdlbnQgbmVnYXRpdmVcbiIpOw0KLSAgICBzdGFjayA9IDA7DQotICB9DQotICBlbHNlDQotICAgIHN0YWNrID0gZnJlZVN0YWNrc1tmcmVlU3RhY2tQdHItLV07DQotDQotICBVTkdVQVJEKCk7DQotICByZXR1cm4gKHN0YWNrKTsNCi19DQotDQotQ0FMTEJBQ0sgKE5kaXNTeXN0ZW1SZXF1ZXN0IChEV09SRCBwYXJhbTEsIERXT1JEIHBhcmFtMiwgV09SRCBwYXJhbTMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIG9wY29kZSwgV09SRCB0YXJnZXREUykpDQotew0KLSAgc3RhdGljIGludCAgICAgICAgICAgIGJpbmRFbnRyeSA9IDA7DQotICBzdHJ1Y3QgX0NvbW1vbkNoYXJzICAqbWFjQ29tbW9uOw0KLSAgdm9sYXRpbGUgV09SRCByZXN1bHQ7DQotDQotICBzd2l0Y2ggKG9wY29kZSkNCi0gIHsNCi0gICAgY2FzZSBSRVFfSU5JVElBVEVfQklORDoNCi0gICAgICAgICBtYWNDb21tb24gPSAoc3RydWN0IF9Db21tb25DaGFycyopIHBhcmFtMjsNCi0gICAgICAgICBpZiAobWFjQ29tbW9uID09IE5VTEwpDQotCSB7DQotICAgICAgICAgICBwcmludGYgKCJUaGVyZSBpcyBhbiBORElTIG1pc2NvbmZpZ3VyYXRpb24uXG4iKTsNCi0gICAgICAgICAgIHJlc3VsdCA9IEVSUl9HRU5FUkFMX0ZBSUxVUkU7DQotCSAgIGJyZWFrOw0KLQkgfQ0KLSAgICAgICAgIERFQlVHMiAoIm1vZHVsZSBuYW1lICVzXG4iDQotICAgICAgICAgICAgICAgICAibW9kdWxlIHR5cGUgJXNcbiIsDQotICAgICAgICAgICAgICAgICBtYWNDb21tb24tPm1vZHVsZU5hbWUsDQotICAgICAgICAgICAgICAgICAoKE1hY0NoYXJzKikgbWFjQ29tbW9uLT5zZXJ2aWNlQ2hhcnMpLT5tYWNOYW1lKTsNCi0NCi0gICAgICAgICAvKiBCaW5kaW5nIHRvIHRoZSBNQUMgKi8NCi0gICAgICAgICByZXN1bHQgPSBtYWNDb21tb24tPnN5c3RlbVJlcXVlc3QgKChEV09SRCkmY29tbW9uLCAoRFdPUkQpJm1hY0NvbW1vbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFJFUV9CSU5ELA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ29tbW9uLT5tb2R1bGVEUyk7DQotDQotICAgICAgICAgaWYgKCFzdHJjbXAoYmluZGluZ3MubW9kdWxlTmFtZVtiaW5kRW50cnldLCBoYW5kbGUtPm1vZHVsZU5hbWUpKQ0KLSAgICAgICAgICAgICAgaGFuZGxlLT5jb21tb24gPSBtYWNDb21tb247DQotICAgICAgICAgZWxzZSBQRVJST1IgKCJ1bmtub3duIG1vZHVsZSIpOw0KLSAgICAgICAgICsrYmluZEVudHJ5Ow0KLQkgYnJlYWs7DQotDQotICAgIGNhc2UgUkVRX0lOSVRJQVRFX1VOQklORDoNCi0gICAgICAgICBtYWNDb21tb24gPSAoc3RydWN0IF9Db21tb25DaGFycyopIHBhcmFtMjsNCi0gICAgICAgICByZXN1bHQgPSBtYWNDb21tb24tPnN5c3RlbVJlcXVlc3QgKChEV09SRCkmY29tbW9uLCAwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUkVRX1VOQklORCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0NvbW1vbi0+bW9kdWxlRFMpOw0KLSAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgICAgIHJlc3VsdCA9IEVSUl9HRU5FUkFMX0ZBSUxVUkU7DQotCSBicmVhazsNCi0gIH0NCi0gIEFSR1NVU0VEIChwYXJhbTEpOw0KLSAgQVJHU1VTRUQgKHBhcmFtMyk7DQotICBBUkdTVVNFRCAodGFyZ2V0RFMpOw0KLSAgcmV0dXJuIChyZXN1bHQpOw0KLX0NCi0NCi1DQUxMQkFDSyAoTmRpc1JlcXVlc3RDb25maXJtIChXT1JEIHByb3RJZCwgV09SRCBtYWNJZCwgICBXT1JEIHJlcUhhbmRsZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHN0YXR1cywgV09SRCByZXF1ZXN0LCBXT1JEIHByb3REUykpDQotew0KLSAgQVJHU1VTRUQgKHByb3RJZCk7ICAgIEFSR1NVU0VEIChtYWNJZCk7DQotICBBUkdTVVNFRCAocmVxSGFuZGxlKTsgQVJHU1VTRUQgKHN0YXR1cyk7DQotICBBUkdTVVNFRCAocmVxdWVzdCk7ICAgQVJHU1VTRUQgKHByb3REUyk7DQotICByZXR1cm4gKEVSUl9TVUNDRVNTKTsNCi19DQotDQotQ0FMTEJBQ0sgKE5kaXNUcmFuc21pdENvbmZpcm0gKFdPUkQgcHJvdElkLCBXT1JEIG1hY0lkLCBXT1JEIHJlcUhhbmRsZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBzdGF0dXMsIFdPUkQgcHJvdERTKSkNCi17DQotICB4bWl0UGVuZGluZy0tOw0KLSAgRnJlZVBrdEJ1ZiAodHhCdWZQZW5kaW5nKTsgIC8qIEFkZCBwYXNzZWQgRUNCIGJhY2sgdG8gdGhlIGZyZWUgbGlzdCAqLw0KLQ0KLSAgQVJHU1VTRUQgKHJlcUhhbmRsZSk7DQotICBBUkdTVVNFRCAoc3RhdHVzKTsNCi0gIEFSR1NVU0VEIChwcm90RFMpOw0KLSAgcmV0dXJuIChFUlJfU1VDQ0VTUyk7DQotfQ0KLQ0KLQ0KLS8qDQotICogVGhlIHByaW1hcnkgZnVuY3Rpb24gZm9yIHJlY2VpdmluZyBwYWNrZXRzDQotICovDQotQ0FMTEJBQ0sgKE5kaXNSZWNlaXZlTG9va2FoZWFkIChXT1JEICBtYWNJZCwgICAgICBXT1JEICBmcmFtZVNpemUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICBieXRlc0F2YWlsLCBCWVRFICpidWZmZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWVRFICppbmRpY2F0ZSwgICBXT1JEICBwcm90RFMpKQ0KLXsNCi0gIGludCAgICAgcmVzdWx0Ow0KLSAgUGt0QnVmICpwa3RCdWY7DQotICBXT1JEICAgIGJ5dGVzQ29waWVkOw0KLSAgc3RydWN0IF9UREJ1ZkRlc2NyIHREQnVmRGVzY3I7DQotDQotI2lmIDANCi0gIFRSQUNFMSAoImxvb2thaGVhZCBsZW5ndGggPSAlZCwgIiwgYnl0ZXNBdmFpbCk7DQotICBUUkFDRTEgKCJlY2IgPSAlMDhsWCwgIiwgICAgICAgICAgKmVjYik7DQotICBUUkFDRTEgKCJjb3VudCA9ICUwOGxYXG4iLCAgICAgICAgIGNvdW50KTsNCi0gIFRSQUNFMSAoIm9mZnNldCA9ICUwOGxYLCAiLCAgICAgICAgb2Zmc2V0KTsNCi0gIFRSQUNFMSAoInRpbWVzQWxsb3dlZCA9ICVkLCAiLCAgICAgdGltZXNBbGxvd2VkKTsNCi0gIFRSQUNFMSAoInBhY2tldCBzaXplID0gJWRcbiIsICAgICAgbG9vay0+ZGF0YUxvb2tBaGVhZExlbik7DQotI2VuZGlmDQotDQotICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIHBhY2tldA0KLSAgICovDQotICBpZiAoKHBrdEJ1ZiA9IEFsbG9jUGt0QnVmKCkpID09IE5VTEwpDQotICB7DQotICAgIGRyb3BwZWRQYWNrZXRzKys7DQotICAgIHJldHVybiAoRVJSX0ZSQU1FX1JFSkVDVEVEKTsNCi0gIH0NCi0NCi0gIC8qDQotICAgKiBOb3cga2x1ZGdlIHRoaW5ncy4gTm90ZSB3ZSB3aWxsIGhhdmUgdG8gdW5kbyB0aGlzIGxhdGVyLiBUaGlzIHdpbGwNCi0gICAqIG1ha2UgdGhlIHBhY2tldCBjb250aWd1b3VzIGFmdGVyIHRoZSBNTElEIGhhcyBkb25lIHRoZSByZXF1ZXN0ZWQgY29weS4NCi0gICAqLw0KLQ0KLSAgdERCdWZEZXNjci50RERhdGFDb3VudCA9IDE7DQotICB0REJ1ZkRlc2NyLnREQnVmRGVzY3JSZWNbMF0udERQdHJUeXBlID0gTkRJU19QVFJfUEhZU0lDQUw7DQotICB0REJ1ZkRlc2NyLnREQnVmRGVzY3JSZWNbMF0udEREYXRhUHRyID0gcGt0QnVmLT5idWZmZXI7DQotICB0REJ1ZkRlc2NyLnREQnVmRGVzY3JSZWNbMF0udEREYXRhTGVuID0gcGt0QnVmLT5sZW5ndGg7DQotICB0REJ1ZkRlc2NyLnREQnVmRGVzY3JSZWNbMF0uZHVtbXkgICAgID0gMDsNCi0NCi0gIHJlc3VsdCA9IE1BQ19ESVNQQVRDSChoYW5kbGUpLT50cmFuc2ZlckRhdGEgKCZieXRlc0NvcGllZCwgMCwgJnREQnVmRGVzY3IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUtPmNvbW1vbi0+bW9kdWxlRFMpOw0KLSAgcGt0QnVmLT5wYWNrZXRMZW5ndGggPSBieXRlc0NvcGllZDsNCi0NCi0gIGlmIChyZXN1bHQgPT0gRVJSX1NVQ0NFU1MpDQotICAgICAgIEVucXVlUGt0QnVmKHBrdEJ1Zik7DQotICBlbHNlIEZyZWVQa3RCdWYgKHBrdEJ1Zik7DQotDQotICBBUkdTVVNFRCAoZnJhbWVTaXplKTsNCi0gIEFSR1NVU0VEIChieXRlc0F2YWlsKTsNCi0gIEFSR1NVU0VEIChpbmRpY2F0ZSk7DQotICBBUkdTVVNFRCAocHJvdERTKTsNCi0NCi0gIHJldHVybiAoRVJSX1NVQ0NFU1MpOw0KLX0NCi0NCi1DQUxMQkFDSyAoTmRpc0luZGljYXRpb25Db21wbGV0ZSAoV09SRCBtYWNJZCwgV09SRCBwcm90RFMpKQ0KLXsNCi0gIEFSR1NVU0VEIChtYWNJZCk7DQotICBBUkdTVVNFRCAocHJvdERTKTsNCi0NCi0gIC8qIFdlIGRvbid0IGdpdmUgYSBob290IGFib3V0IHRoZXNlLiBKdXN0IHJldHVybg0KLSAgICovDQotICByZXR1cm4gKEVSUl9TVUNDRVNTKTsNCi19DQotDQotLyoNCi0gKiBUaGlzIGlzIHRoZSBPVEhFUiB3YXkgd2UgbWF5IHJlY2VpdmUgcGFja2V0cw0KLSAqLw0KLUNBTExCQUNLIChOZGlzUmVjZWl2ZUNoYWluIChXT1JEIG1hY0lkLCBXT1JEIGZyYW1lU2l6ZSwgV09SRCByZXFIYW5kbGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUnhCdWZEZXNjciAqcnhCdWZEZXNjciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQllURSAqaW5kaWNhdGUsIFdPUkQgcHJvdERTKSkNCi17DQotICBzdHJ1Y3QgX1BrdEJ1ZiAqcGt0QnVmOw0KLSAgaW50ICAgICBpOw0KLQ0KLSAgLyoNCi0gICAqIEZvciBub3cgd2UgY29weSB0aGUgZW50aXJlIHBhY2tldCBvdmVyIHRvIGEgUGt0QnVmIHN0cnVjdHVyZS4gVGhpcyBtYXkgYmUNCi0gICAqIGEgcGVyZm9ybWFuY2UgaGl0IGJ1dCB0aGlzIHJvdXRpbmUgcHJvYmFibHkgaXNuJ3QgY2FsbGVkIHZlcnkgbXVjaCwgYW5kDQotICAgKiBpdCBpcyBhIGxvdCBvZiB3b3JrIHRvIGRvIGl0IG90aGVyd2lzZS4gQWxzbyBpZiBpdCBpcyBhIGZpbHRlciBwcm90b2NvbA0KLSAgICogcGFja2V0IHdlIGNvdWxkIGVuZCB1cCBzdWNraW5nIHVwIE1BQyBidWZmZXMuDQotICAgKi8NCi0NCi0gIGlmICgocGt0QnVmID0gQWxsb2NQa3RCdWYoKSkgPT0gTlVMTCkNCi0gIHsNCi0gICAgZHJvcHBlZFBhY2tldHMrKzsNCi0gICAgcmV0dXJuIChFUlJfRlJBTUVfUkVKRUNURUQpOw0KLSAgfQ0KLSAgcGt0QnVmLT5wYWNrZXRMZW5ndGggPSAwOw0KLQ0KLSAgLyogQ29weSB0aGUgcGFja2V0IHRvIHRoZSBidWZmZXINCi0gICAqLw0KLSAgZm9yIChpID0gMDsgaSA8IHJ4QnVmRGVzY3ItPnJ4RGF0YUNvdW50OyArK2kpDQotICB7DQotICAgIHN0cnVjdCBfUnhCdWZEZXNjclJlYyAqcnhEZXNjciA9ICZyeEJ1ZkRlc2NyLT5yeEJ1ZkRlc2NyUmVjW2ldOw0KLQ0KLSAgICBtZW1jcHkgKHBrdEJ1Zi0+YnVmZmVyICsgcGt0QnVmLT5wYWNrZXRMZW5ndGgsDQotICAgICAgICAgICAgcnhEZXNjci0+cnhEYXRhUHRyLCByeERlc2NyLT5yeERhdGFMZW4pOw0KLSAgICBwa3RCdWYtPnBhY2tldExlbmd0aCArPSByeERlc2NyLT5yeERhdGFMZW47DQotICB9DQotDQotICBFbnF1ZVBrdEJ1ZiAocGt0QnVmKTsNCi0NCi0gIEFSR1NVU0VEIChmcmFtZVNpemUpOw0KLSAgQVJHU1VTRUQgKHJlcUhhbmRsZSk7DQotICBBUkdTVVNFRCAoaW5kaWNhdGUpOw0KLSAgQVJHU1VTRUQgKHByb3REUyk7ICAgDQotDQotICAvKiBUaGlzIGZyZWVzIHVwIHRoZSBidWZmZXIgZm9yIHRoZSBNQUMgdG8gdXNlDQotICAgKi8NCi0gIHJldHVybiAoRVJSX1NVQ0NFU1MpOw0KLX0NCi0NCi1DQUxMQkFDSyAoTmRpc1N0YXR1c1Byb2MgKFdPUkQgbWFjSWQsICBXT1JEIHBhcmFtMSwgQllURSAqaW5kaWNhdGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIG9wY29kZSwgV09SRCBwcm90RFMpKQ0KLXsNCi0gIHN3aXRjaCAob3Bjb2RlKQ0KLSAgew0KLSAgICBjYXNlIFNUQVRVU19SSU5HX1NUQVRVUzoNCi0JIGJyZWFrOw0KLSAgICBjYXNlIFNUQVRVU19BREFQVEVSX0NIRUNLOg0KLQkgYnJlYWs7DQotICAgIGNhc2UgU1RBVFVTX1NUQVJUX1JFU0VUOg0KLQkgYnJlYWs7DQotICAgIGNhc2UgU1RBVFVTX0lOVEVSUlVQVDoNCi0JIGJyZWFrOw0KLSAgICBjYXNlIFNUQVRVU19FTkRfUkVTRVQ6DQotCSBicmVhazsNCi0gICAgZGVmYXVsdDoNCi0JIGJyZWFrOw0KLSAgfQ0KLSAgQVJHU1VTRUQgKG1hY0lkKTsNCi0gIEFSR1NVU0VEIChwYXJhbTEpOw0KLSAgQVJHU1VTRUQgKGluZGljYXRlKTsNCi0gIEFSR1NVU0VEIChvcGNvZGUpOw0KLSAgQVJHU1VTRUQgKHByb3REUyk7DQotDQotICAvKiBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFib3V0IHRoaXMgc3R1ZmYgeWV0DQotICAgKi8NCi0gIHJldHVybiAoRVJSX1NVQ0NFU1MpOw0KLX0NCi0NCi0vKg0KLSAqIFRlbGwgdGhlIE5ESVMgZHJpdmVyIHRvIHN0YXJ0IHRoZSBkZWxpdmVyeSBvZiB0aGUgcGFja2V0DQotICovDQotaW50IE5kaXNTZW5kUGFja2V0IChzdHJ1Y3QgX1BrdEJ1ZiAqcGt0QnVmLCBpbnQgbWFjSWQpDQoteyANCi0gIHN0cnVjdCBfVHhCdWZEZXNjciB0eEJ1ZkRlc2NyOw0KLSAgaW50ICAgICByZXN1bHQ7DQotDQotICB4bWl0UGVuZGluZysrOw0KLSAgdHhCdWZQZW5kaW5nID0gcGt0QnVmOyAgICAvKiB3ZSBvbmx5IGhhdmUgMSBwZW5kaW5nIFR4IGF0IGEgdGltZSAqLw0KLQ0KLSAgdHhCdWZEZXNjci50eEltbWVkTGVuICA9IDA7DQotICB0eEJ1ZkRlc2NyLnR4SW1tZWRQdHIgID0gTlVMTDsNCi0gIHR4QnVmRGVzY3IudHhEYXRhQ291bnQgPSAxOw0KLSAgdHhCdWZEZXNjci50eEJ1ZkRlc2NyUmVjWzBdLnR4UHRyVHlwZSA9IE5ESVNfUFRSX1BIWVNJQ0FMOw0KLSAgdHhCdWZEZXNjci50eEJ1ZkRlc2NyUmVjWzBdLmR1bW15ICAgICA9IDA7DQotICB0eEJ1ZkRlc2NyLnR4QnVmRGVzY3JSZWNbMF0udHhEYXRhTGVuID0gcGt0QnVmLT5wYWNrZXRMZW5ndGg7DQotICB0eEJ1ZkRlc2NyLnR4QnVmRGVzY3JSZWNbMF0udHhEYXRhUHRyID0gcGt0QnVmLT5idWZmZXI7DQotDQotICByZXN1bHQgPSBNQUNfRElTUEFUQ0goaGFuZGxlKS0+dHJhbnNtaXRDaGFpbiAoY29tbW9uLm1vZHVsZUlkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdEJ1Zi0+aGFuZGxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eEJ1ZkRlc2NyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+Y29tbW9uLT5tb2R1bGVEUyk7DQotICBzd2l0Y2ggKHJlc3VsdCkNCi0gIHsNCi0gICAgY2FzZSBFUlJfT1VUX09GX1JFU09VUkNFOg0KLSAgICAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBub3QgaGFwcGVuIGJ1dCBpZiBpdCBkb2VzIHRoZXJlIGlzIG5vdA0KLSAgICAgICAgICAqIG11Y2ggd2UgY2FuIGRvIGFib3V0IGl0DQotICAgICAgICAgICovDQotICAgICAgICAgcHJpbnRmICgiRVJST1I6IHRyYW5zbWl0IHF1ZXVlIG92ZXJmbG93ZWRcbiIpOw0KLSAgICAgICAgIHJldHVybiAoMCk7DQotDQotICAgIGNhc2UgRVJSX1NVQ0NFU1M6DQotICAgICAgICAgLyogRXZlcnl0aGluZyB3YXMgaHVua3kgZG9yeSBhbmQgc3luY2hyb25vdXMuIEZyZWUgdXAgdGhlIA0KLSAgICAgICAgICAqIHBhY2tldCBidWZmZXINCi0gICAgICAgICAgKi8NCi0gICAgICAgICB4bWl0UGVuZGluZy0tOw0KLSAgICAgICAgIEZyZWVQa3RCdWYgKHBrdEJ1Zik7DQotICAgICAgICAgcmV0dXJuICgxKTsNCi0NCi0gICAgY2FzZSBFUlJfUkVRVUVTVF9RVUVVRUQ6DQotICAgICAgICAgLyogRXZlcnl0aGluZyB3YXMgaHVua3kgZG9yeSBhbmQgYXN5bmNocm9ub3VzLiBEbyBub3RoaW5nDQotICAgICAgICAgICovDQotICAgICAgICAgcmV0dXJuICgxKTsNCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICAgICBwcmludGYgKCJUeCBmYWlsLCBjb2RlID0gJTA0WFxuIiwgcmVzdWx0KTsNCi0gICAgICAgICByZXR1cm4gKDApOw0KLSAgfQ0KLX0NCi0NCi0NCi0NCi1zdGF0aWMgaW50IG5kaXNfbmVyciA9IHNpemVvZihuZGlzX2Vycmxpc3QpIC8gc2l6ZW9mKG5kaXNfZXJybGlzdFswXSk7DQotDQotc3RhdGljIGNoYXIgKk5kaXNfc3RyZXJyb3IgKFdPUkQgZXJyb3JDb2RlKQ0KLXsNCi0gIHN0YXRpYyBjaGFyIGJ1ZlszMF07DQotICBpbnQgICAgaTsNCi0NCi0gIGZvciAoaSA9IDA7IGkgPCBuZGlzX25lcnI7IGkrKykNCi0gICAgICBpZiAoZXJyb3JDb2RlID09IG5kaXNfZXJybGlzdFtpXS5lcnJfbnVtKQ0KLSAgICAgICAgIHJldHVybiAobmRpc19lcnJsaXN0W2ldLmVycl90ZXh0KTsNCi0NCi0gIHNwcmludGYgKGJ1ZiwidW5rbm93biBlcnJvciAlZCIsZXJyb3JDb2RlKTsNCi0gIHJldHVybiAoYnVmKTsNCi19DQotDQotDQotY2hhciAqTmRpc0xhc3RFcnJvciAodm9pZCkNCi17DQotICBjaGFyICplcnJTdHIgPSBsYXN0RXJyOw0KLSAgbGFzdEVyciA9IE5VTEw7DQotICByZXR1cm4gKGVyclN0cik7DQotfQ0KLQ0KLWludCBOZGlzT3BlbiAodm9pZCkNCi17DQotICBzdHJ1Y3QgX1JlcUJsb2NrIHJlcUJsb2NrOw0KLSAgaW50ICAgICByZXN1bHQ7DQotICBpbnQgICAgIG5kaXNGZCA9IG9wZW4gKE5ESVNfUEFUSCwgT19SRE9OTFkpOw0KLQ0KLSAgaWYgKG5kaXNGZCA8IDApDQotICB7DQotICAgIHByaW50ZiAoIkNvdWxkIG5vdCBvcGVuIE5ESVMgUHJvdG9jb2wgTWFuYWdlciBkZXZpY2UuXG4iKTsNCi0gICAgcmV0dXJuICgwKTsNCi0gIH0NCi0NCi0gIG1lbXNldCAoJnJlcUJsb2NrLCAwLCBzaXplb2YoUmVxQmxvY2spKTsNCi0NCi0gIHJlcUJsb2NrLm9wY29kZSA9IFBNX0dFVF9QUk9UT0NPTF9NQU5BR0VSX0xJTktBR0U7DQotDQotICByZXN1bHQgPSBOZGlzR2V0TGlua2FnZSAobmRpc0ZkLCAoY2hhciopJnJlcUJsb2NrLCBzaXplb2YoUmVxQmxvY2spKTsNCi0gIGlmIChyZXN1bHQgIT0gMCkNCi0gIHsNCi0gICAgcHJpbnRmICgiQ291bGQgbm90IGdldCBQcm90b2NvbCBNYW5hZ2VyIGxpbmthZ2UuXG4iKTsNCi0gICAgY2xvc2UgKG5kaXNGZCk7DQotICAgIHJldHVybiAoMCk7DQotICB9DQotDQotICBjbG9zZSAobmRpc0ZkKTsNCi0gIHByb3RNYW5FbnRyeSA9IChQcm90TWFuKSByZXFCbG9jay5wb2ludGVyMTsNCi0gIHByb3RNYW5EUyAgICA9IHJlcUJsb2NrLndvcmQxOw0KLQ0KLSAgREVCVUcyICgiRW50cnkgUG9pbnQgPSAlMDRYOiUwNFhcbiIsIEZQX1NFRyhwcm90TWFuRW50cnkpLEZQX09GRihwcm90TWFuRW50cnkpKTsNCi0gIERFQlVHMSAoIlByb3RNYW4gRFMgID0gJTA0WFxuIiwgcHJvdE1hbkRTKTsNCi0gIHJldHVybiAoMSk7DQotfQ0KLQ0KLQ0KLWludCBOZGlzUmVnaXN0ZXJBbmRCaW5kIChpbnQgcHJvbWlzKQ0KLXsNCi0gIHN0cnVjdCBfUmVxQmxvY2sgcmVxQmxvY2s7DQotICBXT1JEICAgIHJlc3VsdDsNCi0NCi0gIG1lbXNldCAoJmNvbW1vbiwwLHNpemVvZihjb21tb24pKTsNCi0NCi0gIGNvbW1vbi50YWJsZVNpemUgPSBzaXplb2YgKGNvbW1vbik7DQotDQotICBjb21tb24ubWFqb3JOZGlzVmVyc2lvbiAgID0gMjsNCi0gIGNvbW1vbi5taW5vck5kaXNWZXJzaW9uICAgPSAwOw0KLSAgY29tbW9uLm1ham9yTW9kdWxlVmVyc2lvbiA9IDI7DQotICBjb21tb24ubWlub3JNb2R1bGVWZXJzaW9uID0gMDsNCi0NCi0gIC8qIEluZGljYXRlcyBiaW5kaW5nIGZyb20gYmVsb3cgYW5kIGR5bmFtaWNhbGx5IGxvYWRlZA0KLSAgICovDQotICBjb21tb24ubW9kdWxlRmxhZ3MgPSAweDAwMDAwMDA2TDsNCi0NCi0gIHN0cmNweSAoY29tbW9uLm1vZHVsZU5hbWUsICJQQ0FQIik7DQotDQotICBjb21tb24ucHJvdG9jb2xMZXZlbFVwcGVyID0gMHhGRjsNCi0gIGNvbW1vbi5wcm90b2NvbExldmVsTG93ZXIgPSAxOw0KLSAgY29tbW9uLmludGVyZmFjZUxvd2VyICAgICA9IDE7DQotI2lmZGVmIF9fREpHUFBfXw0KLSAgY29tbW9uLm1vZHVsZURTICAgICAgICAgICA9IF9kb3NfZHM7IC8qIHRoZSBjYWxsYmFjayBkYXRhIHNlZ21lbnQgKi8NCi0jZWxzZQ0KLSAgY29tbW9uLm1vZHVsZURTICAgICAgICAgICA9IF9EUzsNCi0jZW5kaWYNCi0NCi0gIGNvbW1vbi5zeXN0ZW1SZXF1ZXN0ICAgICAgPSAoU3lzdGVtUmVxdWVzdCkgc3lzdGVtUmVxdWVzdEdsdWU7DQotICBjb21tb24uc2VydmljZUNoYXJzICAgICAgID0gKEJZVEUqKSAmcHJvdENoYXJzOw0KLSAgY29tbW9uLnNlcnZpY2VTdGF0dXMgICAgICA9IE5VTEw7DQotICBjb21tb24udXBwZXJEaXNwYXRjaFRhYmxlID0gTlVMTDsNCi0gIGNvbW1vbi5sb3dlckRpc3BhdGNoVGFibGUgPSAoQllURSopICZsb3dlclRhYmxlOw0KLQ0KLSAgcHJvdENoYXJzLmxlbmd0aCAgPSBzaXplb2YgKHByb3RDaGFycyk7DQotICBwcm90Q2hhcnMubmFtZVswXSA9IDA7DQotICBwcm90Q2hhcnMudHlwZSAgICA9IDA7DQotDQotICBsb3dlclRhYmxlLmJhY2tQb2ludGVyICAgICAgICA9ICZjb21tb247DQotICBsb3dlclRhYmxlLnJlcXVlc3RDb25maXJtICAgICA9IHJlcXVlc3RDb25maXJtR2x1ZTsNCi0gIGxvd2VyVGFibGUudHJhbnNtaXRDb25maXJtICAgID0gdHJhbnNtaXRDb25maXJtR2x1ZTsNCi0gIGxvd2VyVGFibGUucmVjZWl2ZUxvb2thaGVhZCAgID0gcmVjZWl2ZUxvb2thaGVhZEdsdWU7DQotICBsb3dlclRhYmxlLmluZGljYXRpb25Db21wbGV0ZSA9IGluZGljYXRpb25Db21wbGV0ZUdsdWU7DQotICBsb3dlclRhYmxlLnJlY2VpdmVDaGFpbiAgICAgICA9IHJlY2VpdmVDaGFpbkdsdWU7DQotICBsb3dlclRhYmxlLnN0YXR1cyAgICAgICAgICAgICA9IHN0YXR1c0dsdWU7DQotICBsb3dlclRhYmxlLmZsYWdzICAgICAgICAgICAgICA9IDM7DQotICBpZiAocHJvbWlzKQ0KLSAgICAgbG93ZXJUYWJsZS5mbGFncyB8PSA0OyAgIC8qIHByb21pc2NvdXMgbW9kZSAocmVjZWl2ZSBldmVyeXRoaW5nKSAqLw0KLQ0KLSAgYmluZGluZ3MubnVtQmluZGluZ3MgPSAxOw0KLSAgc3RyY3B5IChiaW5kaW5ncy5tb2R1bGVOYW1lWzBdLCBoYW5kbGUtPm1vZHVsZU5hbWUpOw0KLQ0KLSAgLyogUmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggTkRJUw0KLSAgICovDQotICByZXFCbG9jay5vcGNvZGUgICA9IFBNX1JFR0lTVEVSX01PRFVMRTsNCi0gIHJlcUJsb2NrLnBvaW50ZXIxID0gKEJZVEUgRkFSKikgJmNvbW1vbjsNCi0gIHJlcUJsb2NrLnBvaW50ZXIyID0gKEJZVEUgRkFSKikgJmJpbmRpbmdzOw0KLQ0KLSAgcmVzdWx0ID0gKCpwcm90TWFuRW50cnkpICgmcmVxQmxvY2ssIHByb3RNYW5EUyk7DQotICBpZiAocmVzdWx0KQ0KLSAgew0KLSAgICBwcmludGYgKCJQcm90bWFuIHJlZ2lzdGVyaW5nIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7DQotICAgIHJldHVybiAoMCk7DQotICB9DQotDQotICAvKiBTdGFydCB0aGUgYmluZGluZyBwcm9jZXNzDQotICAgKi8NCi0gIHJlcUJsb2NrLm9wY29kZSAgID0gUE1fQklORF9BTkRfU1RBUlQ7DQotICByZXFCbG9jay5wb2ludGVyMSA9IChCWVRFIEZBUiopICZmYWlsaW5nTW9kdWxlczsNCi0NCi0gIHJlc3VsdCA9ICgqcHJvdE1hbkVudHJ5KSAoJnJlcUJsb2NrLCBwcm90TWFuRFMpOw0KLSAgaWYgKHJlc3VsdCkNCi0gIHsNCi0gICAgcHJpbnRmICgiU3RhcnQgYmluZGluZyBmYWlsZWQ6ICVzXG4iLCBOZGlzX3N0cmVycm9yKHJlc3VsdCkpOw0KLSAgICByZXR1cm4gKDApOw0KLSAgfQ0KLSAgcmV0dXJuICgxKTsNCi19DQotDQotc3RhdGljIGludCBDaGVja01hY0ZlYXR1cmVzIChDYXJkSGFuZGxlICpjYXJkKQ0KLXsNCi0gIERXT1JEICAgICAgc2VydmljZUZsYWdzOw0KLSAgQllURSBfZmFyICptZWRpYVN0cmluZzsNCi0gIEJZVEUgX2ZhciAqbWFjX2FkZHI7DQotDQotICBERUJVRzIgKCJjaGVja2luZyBjYXJkIGZlYXR1cmVzXG4iDQotICAgICAgICAgICJjb21tb24gdGFibGUgYWRkcmVzcyA9ICUwOGxYLCBtYWNJZCA9ICVkXG4iLA0KLSAgICAgICAgICBjYXJkLT5jb21tb24sIGNhcmQtPmNvbW1vbi0+bW9kdWxlSWQpOw0KLQ0KLSAgc2VydmljZUZsYWdzID0gTUFDX0NIQVIgKGhhbmRsZSktPnNlcnZpY2VGbGFnczsNCi0NCi0gIGlmICgoc2VydmljZUZsYWdzICYgU0ZfUFJPTUlTQ1VPVVMpID09IDApDQotICB7DQotICAgIHByaW50ZiAoIlRoZSBNQUMgJXMgZG9lcyBub3Qgc3VwcG9ydCBwcm9taXNjdW91cyBtb2RlLlxuIiwNCi0gICAgICAgICAgICBjYXJkLT5tb2R1bGVOYW1lKTsNCi0gICAgcmV0dXJuICgwKTsNCi0gIH0NCi0NCi0gIG1lZGlhU3RyaW5nID0gTUFDX0NIQVIgKGhhbmRsZSktPm1hY05hbWU7DQotDQotICBERUJVRzEgKCJtZWRpYSB0eXBlID0gJXNcbiIsbWVkaWFTdHJpbmcpOw0KLQ0KLSAgLyogR2V0IHRoZSBtZWRpYSB0eXBlLiBBbmQgc2V0IHRoZSBoZWFkZXIgc2l6ZQ0KLSAgICovDQotICBpZiAoIXN0cm5jbXAobWVkaWFTdHJpbmcsIjgwMi4zIiw1KSB8fA0KLSAgICAgICFzdHJuY21wKG1lZGlhU3RyaW5nLCJESVgiLDMpICAgfHwNCi0gICAgICAhc3RybmNtcChtZWRpYVN0cmluZywiRElYKzgwMi4zIiw5KSkNCi0gICAgICAgaGVhZGVyU2l6ZSA9IHNpemVvZiAoRXRoZXJuZXRJSUhlYWRlcik7DQotDQotICBlbHNlIGlmICghc3RybmNtcChtZWRpYVN0cmluZywiRkRESSIsNCkpDQotICAgICAgIGhlYWRlclNpemUgPSBzaXplb2YgKEZkZGlIZWFkZXIpICsNCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZiAoSWVlZTgwMkRvdDJTbmFwSGVhZGVyKTsNCi0gIGVsc2UNCi0gIHsNCi0gICAgcHJpbnRmICgiVW5zdXBwb3J0ZWQgTUFDIHR5cGU6IGAlcydcbiIsIG1lZGlhU3RyaW5nKTsNCi0gICAgcmV0dXJuICgwKTsNCi0gIH0NCi0NCi0gIGZyYW1lU2l6ZSA9IE1BQ19DSEFSIChoYW5kbGUpLT5tYXhGcmFtZVNpemU7DQotICBtYWNfYWRkciAgPSBNQUNfQ0hBUiAoaGFuZGxlKS0+Y3VycmVudEFkZHJlc3M7DQotDQotICBwcmludGYgKCJIYXJkd2FyZSBhZGRyZXNzOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwNCi0gICAgICAgICAgbWFjX2FkZHJbMF0sIG1hY19hZGRyWzFdLCBtYWNfYWRkclsyXSwNCi0gICAgICAgICAgbWFjX2FkZHJbM10sIG1hY19hZGRyWzRdLCBtYWNfYWRkcls1XSk7DQotICByZXR1cm4gKDEpOw0KLX0NCi0NCi1zdGF0aWMgaW50IE5kaXNTdGFydE1hYyAoQ2FyZEhhbmRsZSAqY2FyZCkNCi17DQotICBXT1JEIHJlc3VsdDsNCi0NCi0gIC8qIFNldCB0aGUgbG9va2FoZWFkIGxlbmd0aA0KLSAgICovDQotICByZXN1bHQgPSBNQUNfRElTUEFUQ0goaGFuZGxlKS0+cmVxdWVzdCAoY29tbW9uLm1vZHVsZUlkLCAwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclNpemUsIDAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRX1NFVF9MT09LQUhFQUQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+Y29tbW9uLT5tb2R1bGVEUyk7DQotDQotICAvKiBXZSBhc3N1bWUgdGhhdCBpZiB3ZSBnb3QgSU5WQUxJRCBQQVJBTUVURVIgdGhlbiBlaXRoZXIgdGhpcw0KLSAgICogaXMgbm90IHN1cHBvcnRlZCBvciB3aWxsIHdvcmsgYW55d2F5LiBORTIwMDAgZG9lcyB0aGlzLg0KLSAgICovDQotICBpZiAocmVzdWx0ICE9IEVSUl9TVUNDRVNTICYmIHJlc3VsdCAhPSBFUlJfSU5WQUxJRF9QQVJBTUVURVIpDQotICB7DQotICAgIERFQlVHMSAoIlNldCBsb29rYWhlYWQgZmFpbGVkOiAlc1xuIiwgTmRpc19zdHJlcnJvcihyZXN1bHQpKTsNCi0gICAgcmV0dXJuICgwKTsNCi0gIH0NCi0NCi0gIC8qIFNldCB0aGUgcGFja2V0IGZpbHRlci4gTm90ZSB0aGF0IGZvciBzb21lIG1lZGlhcyBhbmQgZHJpdmVycyB3ZQ0KLSAgICogbXVzdCBzcGVjaWZ5IGFsbCB0aHJlZSBmbGFncyBvciB0aGUgY2FyZChzKSB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4NCi0gICAqLw0KLSAgcmVzdWx0ID0gTUFDX0RJU1BBVENIKGhhbmRsZSktPnJlcXVlc3QgKGNvbW1vbi5tb2R1bGVJZCwgMCwNCi0gICAgICAgICAgICAgICAgICAgICAgLyogYWxsIHBhY2tldHMgKi8gICBGSUxURVJfUFJPTUlTQ1VPVVMgfA0KLSAgICAgICAgICAgICAgICAgICAgICAvKiBwYWNrZXRzIHRvIHVzICovIEZJTFRFUl9ESVJFQ1RFRCAgICB8DQotICAgICAgICAgICAgICAgICAgICAgIC8qIGJyb2FkY2FzdHMgKi8gICAgRklMVEVSX0JST0FEQ0FTVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBSRVFfU0VUX1BBQ0tFVF9GSUxURVIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+Y29tbW9uLT5tb2R1bGVEUyk7DQotICBpZiAocmVzdWx0ICE9IEVSUl9TVUNDRVNTKQ0KLSAgew0KLSAgICBERUJVRzEgKCJTZXQgcGFja2V0IGZpbHRlciBmYWlsZWQ6ICVzXG4iLCBOZGlzX3N0cmVycm9yKHJlc3VsdCkpOw0KLSAgICByZXR1cm4gKDApOw0KLSAgfQ0KLQ0KLSAgLyogSWYgT1BFTi9DTE9TRSBzdXBwb3J0ZWQgdGhlbiBvcGVuIHRoZSBhZGFwdGVyDQotICAgKi8NCi0gIGlmIChNQUNfQ0hBUihoYW5kbGUpLT5zZXJ2aWNlRmxhZ3MgJiBTRl9PUEVOX0NMT1NFKQ0KLSAgew0KLSAgICByZXN1bHQgPSBNQUNfRElTUEFUQ0goaGFuZGxlKS0+cmVxdWVzdCAoY29tbW9uLm1vZHVsZUlkLCAwLCAwLCBOVUxMLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRX09QRU5fQURBUFRFUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmNvbW1vbi0+bW9kdWxlRFMpOw0KLSAgICBpZiAocmVzdWx0ICE9IEVSUl9TVUNDRVNTKQ0KLSAgICB7DQotICAgICAgREVCVUcxICgiT3BlbmluZyB0aGUgTUFDIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7DQotICAgICAgcmV0dXJuICgwKTsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuICgxKTsNCi19DQotDQotdm9pZCBOZGlzU2h1dGRvd24gKHZvaWQpDQotew0KLSAgc3RydWN0IF9SZXFCbG9jayByZXFCbG9jazsNCi0gIGludCAgICAgcmVzdWx0LCBpOw0KLQ0KLSAgaWYgKCFoYW5kbGUpDQotICAgICByZXR1cm47DQotDQotICAvKiBJZiB0aGUgYWRhcHRlcnMgc3VwcG9ydCBvcGVuIGFuZCBhcmUgb3BlbiB0aGVuIGNsb3NlIHRoZW0NCi0gICAqLw0KLSAgaWYgKChNQUNfQ0hBUihoYW5kbGUpLT5zZXJ2aWNlRmxhZ3MgJiBTRl9PUEVOX0NMT1NFKSAmJg0KLSAgICAgIChNQUNfU1RBVFVTKGhhbmRsZSktPm1hY1N0YXR1cyAmIE1BQ19PUEVOKSkNCi0gIHsNCi0gICAgcmVzdWx0ID0gTUFDX0RJU1BBVENIKGhhbmRsZSktPnJlcXVlc3QgKGNvbW1vbi5tb2R1bGVJZCwgMCwgMCwgMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUV9DTE9TRV9BREFQVEVSLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLT5jb21tb24tPm1vZHVsZURTKTsNCi0gICAgaWYgKHJlc3VsdCAhPSBFUlJfU1VDQ0VTUykNCi0gICAgew0KLSAgICAgIHByaW50ZiAoIkNsb3NpbmcgdGhlIE1BQyBmYWlsZWQ6ICVzXG4iLCBOZGlzX3N0cmVycm9yKHJlc3VsdCkpOw0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyogVGVsbCB0aGUgUHJvdG9jb2wgTWFuYWdlciB0byB1bmJpbmQgYW5kIHN0b3ANCi0gICAqLw0KLSAgcmVxQmxvY2sub3Bjb2RlICAgPSBQTV9VTkJJTkRfQU5EX1NUT1A7DQotICByZXFCbG9jay5wb2ludGVyMSA9IChCWVRFIEZBUiopICZmYWlsaW5nTW9kdWxlczsNCi0gIHJlcUJsb2NrLnBvaW50ZXIyID0gTlVMTDsNCi0NCi0gIHJlc3VsdCA9ICgqcHJvdE1hbkVudHJ5KSAoJnJlcUJsb2NrLCBwcm90TWFuRFMpOw0KLSAgaWYgKHJlc3VsdCkNCi0gICAgIHByaW50ZiAoIlVuYmluZCBmYWlsZWQ6ICVzXG4iLCAgTmRpc19zdHJlcnJvcihyZXN1bHQpKTsNCi0NCi0gIGZvciAoaSA9IDA7IGkgPCBTVEFDS19QT09MX1NJWkU7ICsraSkNCi0gICAgIGZyZWUgKGZyZWVTdGFja3NbaV0gLSBTVEFDS19TSVpFKTsNCi0NCi0gIGhhbmRsZSA9IE5VTEw7DQotfQ0KLQ0KLWludCBOZGlzSW5pdCAoaW50IHByb21pcykNCi17DQotICBpbnQgaSwgcmVzdWx0Ow0KLQ0KLSAgLyogQWxsb2NhdGUgdGhlIHJlYWwgbW9kZSBzdGFja3MgdXNlZCBmb3IgTkRJUyBjYWxsYmFja3MNCi0gICAqLw0KLSAgZm9yIChpID0gMDsgaSA8IFNUQUNLX1BPT0xfU0laRTsgKytpKQ0KLSAgew0KLSAgICBmcmVlU3RhY2tzW2ldID0gbWFsbG9jIChTVEFDS19TSVpFKTsNCi0gICAgaWYgKCFmcmVlU3RhY2tzW2ldKQ0KLSAgICAgICByZXR1cm4gKDApOw0KLSAgICBmcmVlU3RhY2tzW2ldICs9IFNUQUNLX1NJWkU7DQotICB9DQotDQotICBpZiAoIU5kaXNPcGVuKCkpDQotICAgICByZXR1cm4gKDApOw0KLQ0KLSAgaWYgKCFOZGlzUmVnaXN0ZXJBbmRCaW5kKHByb21pcykpDQotICAgICByZXR1cm4gKDApOw0KLQ0KLSAgREVCVUcxICgiTXkgbW9kdWxlIGlkOiAlZFxuIiwgY29tbW9uLm1vZHVsZUlkKTsNCi0gIERFQlVHMSAoIkhhbmRsZSBpZDsgICAgJWRcbiIsIGhhbmRsZS0+Y29tbW9uLT5tb2R1bGVJZCk7DQotICBERUJVRzEgKCJNQUMgY2FyZDogICAgICUtMTZzIC0gIiwgaGFuZGxlLT5tb2R1bGVOYW1lKTsNCi0NCi0gIGF0ZXhpdCAoTmRpc1NodXRkb3duKTsNCi0NCi0gIGlmICghQ2hlY2tNYWNGZWF0dXJlcygmaGFuZGxlKSkNCi0gICAgIHJldHVybiAoMCk7DQotDQotICBzd2l0Y2ggKG1lZGlhVHlwZSkNCi0gIHsNCi0gICAgY2FzZSBNRURJQV9GRERJOg0KLSAgICAgICAgIERFQlVHMCAoIk1lZGlhIHR5cGU6IEZEREkiKTsNCi0JIGJyZWFrOw0KLSAgICBjYXNlIE1FRElBX0VUSEVSTkVUOg0KLSAgICAgICAgIERFQlVHMCAoIk1lZGlhIHR5cGU6IEVUSEVSTkVUIik7DQotCSBicmVhazsNCi0gICAgZGVmYXVsdDoNCi0gICAgICAgICBERUJVRzAgKCJVbnN1cHBvcnRlZCBtZWRpYS5cbiIpOw0KLSAgICAgICAgIHJldHVybiAoMCk7DQotICB9DQotDQotICBERUJVRzEgKCIgLSBGcmFtZSBzaXplOiAlZFxuIiwgZnJhbWVTaXplKTsNCi0NCi0gIGlmICghTmRpc1N0YXJ0TWFjKCZoYW5kbGUpKQ0KLSAgICAgcmV0dXJuICgwKTsNCi0gIHJldHVybiAoMSk7DQotfQ0KLSNlbmRpZiAgLyogVVNFX05ESVMyICovDQotDQorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywxOTk0CisgKiAgICAgIFRleGFzIEEmTSBVbml2ZXJzaXR5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFRleGFzIEEmTSBVbml2ZXJzaXR5CisgKiAgICAgIGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgVU5JVkVSU0lUWSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFVOSVZFUlNJVFkgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBEZXZlbG9wZXJzOgorICogICAgICAgICAgICAgRGF2aWQgSy4gSGVzcywgRG91Z2xhcyBMZWUgU2NoYWxlcywgRGF2aWQgUi4gU2FmZm9yZAorICoKKyAqIEhlYXZpbHkgbW9kaWZpZWQgZm9yIE1ldGF3YXJlIEhpZ2hDICsgR05VIEMgMi44KworICogICAgICAgICAgICAgR2lzbGUgVmFuZW0gMTk5OAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRvcy5oPgorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInBjYXAtZG9zLmgiCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKyNpbmNsdWRlICJtc2Rvcy9uZGlzMi5oIgorCisjaWYgZGVmaW5lZChVU0VfTkRJUzIpCisKKy8qCisgKiAgUGFja2V0IGJ1ZmZlciBoYW5kbGluZworICovCitleHRlcm4gaW50ICAgICBGcmVlUGt0QnVmICAoUGt0QnVmICpidWYpOworZXh0ZXJuIGludCAgICAgRW5xdWVQa3RCdWYgKFBrdEJ1ZiAqYnVmKTsKK2V4dGVybiBQa3RCdWYqIEFsbG9jUGt0QnVmICh2b2lkKTsKKworLyoKKyAqICBWYXJpb3VzIGRlZmluZXMKKyAqLworI2RlZmluZSBNQVhfTlVNX0RFQlVHX1NUUklOR1MgOTAKKyNkZWZpbmUgREVCVUdfU1RSSU5HX0xFTkdUSCAgIDgwCisjZGVmaW5lIFNUQUNLX1BPT0xfU0laRSAgICAgICA2CisjZGVmaW5lIFNUQUNLX1NJWkUgICAgICAgICAgICAyNTYKKworI2RlZmluZSBNRURJQV9GRERJICAgICAgICAgICAgMQorI2RlZmluZSBNRURJQV9FVEhFUk5FVCAgICAgICAgMgorI2RlZmluZSBNRURJQV9UT0tFTiAgICAgICAgICAgMworCitzdGF0aWMgaW50ICAgICBzdGFydERlYnVnICAgICA9IDA7CitzdGF0aWMgaW50ICAgICBzdG9wRGVidWcgICAgICA9IDA7CisKK3N0YXRpYyBEV09SRCAgIGRyb3BwZWRQYWNrZXRzID0gMEw7CitzdGF0aWMgV09SRCAgICBmcmFtZVNpemUgICAgICA9IDA7CitzdGF0aWMgV09SRCAgICBoZWFkZXJTaXplICAgICA9IDA7CitzdGF0aWMgaW50ICAgICBtZWRpYVR5cGUgICAgICA9IDA7CitzdGF0aWMgY2hhciAgICpsYXN0RXJyICAgICAgICA9IE5VTEw7CisKK3N0YXRpYyBCWVRFICAgIGRlYnVnU3RyaW5ncyBbTUFYX05VTV9ERUJVR19TVFJJTkdTXVtERUJVR19TVFJJTkdfTEVOR1RIXTsKK3N0YXRpYyBCWVRFICAgKmZyZWVTdGFja3MgICBbU1RBQ0tfUE9PTF9TSVpFXTsKK3N0YXRpYyBpbnQgICAgIGZyZWVTdGFja1B0ciA9IFNUQUNLX1BPT0xfU0laRSAtIDE7CisKK3N0YXRpYyBQcm90TWFuIHByb3RNYW5FbnRyeSA9IE5VTEw7CitzdGF0aWMgV09SRCAgICBwcm90TWFuRFMgICAgPSAwOworc3RhdGljIHZvbGF0aWxlIGludCB4bWl0UGVuZGluZzsKKworc3RhdGljIHN0cnVjdCBfUGt0QnVmICAgICAgICAqdHhCdWZQZW5kaW5nOworc3RhdGljIHN0cnVjdCBfQ2FyZEhhbmRsZSAgICAqaGFuZGxlOworc3RhdGljIHN0cnVjdCBfQ29tbW9uQ2hhcnMgICAgY29tbW9uOworc3RhdGljIHN0cnVjdCBfUHJvdG9jb2xDaGFycyAgcHJvdENoYXJzOworc3RhdGljIHN0cnVjdCBfUHJvdERpc3BhdGNoICAgbG93ZXJUYWJsZTsKKworc3RhdGljIHN0cnVjdCBfRmFpbGluZ01vZHVsZXMgZmFpbGluZ01vZHVsZXM7CitzdGF0aWMgc3RydWN0IF9CaW5kaW5nc0xpc3QgICBiaW5kaW5nczsKKworc3RhdGljIHN0cnVjdCB7CisgICAgICAgICBXT1JEICBlcnJfbnVtOworICAgICAgICAgY2hhciAqZXJyX3RleHQ7CisgICAgICAgfSBuZGlzX2Vycmxpc3RbXSA9IHsKKworICB7IEVSUl9TVUNDRVNTLAorICAgICJUaGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiIgIH0sCisKKyAgeyBFUlJfV0FJVF9GT1JfUkVMRUFTRSwKKyAgICAiVGhlIFJlY2VpdmVDaGFpbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCB0aGUgcHJvdG9jb2wgaGFzXG4iCisgICAgInJldGFpbmVkIGNvbnRyb2wgb2YgdGhlIGJ1ZmZlci5cbiIgIH0sCisKKyAgeyBFUlJfUkVRVUVTVF9RVUVVRUQsCisgICAgIlRoZSBjdXJyZW50IHJlcXVlc3QgaGFzIGJlZW4gcXVldWVkLlxuIiAgfSwKKworICB7IEVSUl9GUkFNRV9OT1RfUkVDT0dOSVpFRCwKKyAgICAiRnJhbWUgbm90IHJlY29nbml6ZWQuXG4iICB9LAorCisgIHsgRVJSX0ZSQU1FX1JFSkVDVEVELAorICAgICJGcmFtZSB3YXMgZGlzY2FyZGVkLlxuIiAgfSwKKworICB7IEVSUl9GT1JXQVJEX0ZSQU1FLAorICAgICJQcm90b2NvbCB3aXNoZXMgdG8gZm9yd2FyZCBmcmFtZSB0byBhbm90aGVyIHByb3RvY29sLlxuIiAgfSwKKworICB7IEVSUl9PVVRfT0ZfUkVTT1VSQ0UsCisgICAgIk91dCBvZiByZXNvdXJjZS5cbiIgIH0sCisKKyAgeyBFUlJfSU5WQUxJRF9QQVJBTUVURVIsCisgICAgIkludmFsaWQgcGFyYW1ldGVyLlxuIiAgfSwKKworICB7IEVSUl9JTlZBTElEX0ZVTkNUSU9OLAorICAgICJJbnZhbGlkIGZ1bmN0aW9uLlxuIiAgfSwKKworICB7IEVSUl9OT1RfU1VQUE9SVEVELAorICAgICJOb3Qgc3VwcG9ydGVkLlxuIiAgfSwKKworICB7IEVSUl9IQVJEV0FSRV9FUlJPUiwKKyAgICAiSGFyZHdhcmUgZXJyb3IuXG4iICB9LAorCisgIHsgRVJSX1RSQU5TTUlUX0VSUk9SLAorICAgICJUaGUgcGFja2V0IHdhcyBub3QgdHJhbnNtaXR0ZWQgZHVlIHRvIGFuIGVycm9yLlxuIiAgfSwKKworICB7IEVSUl9OT19TVUNIX0RFU1RJTkFUSU9OLAorICAgICJUb2tlbiByaW5nIHBhY2tldCB3YXMgbm90IHJlY29nbml6ZWQgd2hlbiB0cmFuc21pdHRlZC5cbiIgIH0sCisKKyAgeyBFUlJfQlVGRkVSX1RPT19TTUFMTCwKKyAgICAiUHJvdmlkZWQgYnVmZmVyIHdhcyB0b28gc21hbGwuXG4iICB9LAorCisgIHsgRVJSX0FMUkVBRFlfU1RBUlRFRCwKKyAgICAiTmV0d29yayBkcml2ZXJzIGFscmVhZHkgc3RhcnRlZC5cbiIgIH0sCisKKyAgeyBFUlJfSU5DT01QTEVURV9CSU5ESU5HLAorICAgICJQcm90b2NvbCBkcml2ZXIgY291bGQgbm90IGNvbXBsZXRlIGl0cyBiaW5kaW5ncy5cbiIgIH0sCisKKyAgeyBFUlJfRFJJVkVSX05PVF9JTklUSUFMSVpFRCwKKyAgICAiTUFDIGRpZCBub3QgaW5pdGlhbGl6ZSBwcm9wZXJseS5cbiIgIH0sCisKKyAgeyBFUlJfSEFSRFdBUkVfTk9UX0ZPVU5ELAorICAgICJIYXJkd2FyZSBub3QgZm91bmQuXG4iICB9LAorCisgIHsgRVJSX0hBUkRXQVJFX0ZBSUxVUkUsCisgICAgIkhhcmR3YXJlIGZhaWx1cmUuXG4iICB9LAorCisgIHsgRVJSX0NPTkZJR1VSQVRJT05fRkFJTFVSRSwKKyAgICAiQ29uZmlndXJhdGlvbiBmYWlsdXJlLlxuIiAgfSwKKworICB7IEVSUl9JTlRFUlJVUFRfQ09ORkxJQ1QsCisgICAgIkludGVycnVwdCBjb25mbGljdC5cbiIgIH0sCisKKyAgeyBFUlJfSU5DT01QQVRJQkxFX01BQywKKyAgICAiVGhlIE1BQyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbC5cbiIgIH0sCisKKyAgeyBFUlJfSU5JVElBTElaQVRJT05fRkFJTEVELAorICAgICJJbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iICB9LAorCisgIHsgRVJSX05PX0JJTkRJTkcsCisgICAgIkJpbmRpbmcgZGlkIG5vdCBvY2N1ci5cbiIgIH0sCisKKyAgeyBFUlJfTkVUV09SS19NQVlfTk9UX0JFX0NPTk5FQ1RFRCwKKyAgICAiVGhlIG5ldHdvcmsgbWF5IG5vdCBiZSBjb25uZWN0ZWQgdG8gdGhlIGFkYXB0ZXIuXG4iICB9LAorCisgIHsgRVJSX0lOQ09NUEFUSUJMRV9PU19WRVJTSU9OLAorICAgICJUaGUgdmVyc2lvbiBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wuXG4iICB9LAorCisgIHsgRVJSX0FMUkVBRFlfUkVHSVNURVJFRCwKKyAgICAiVGhlIHByb3RvY29sIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIgIH0sCisKKyAgeyBFUlJfUEFUSF9OT1RfRk9VTkQsCisgICAgIlBST1RNQU4uRVhFIGNvdWxkIG5vdCBiZSBmb3VuZC5cbiIgIH0sCisKKyAgeyBFUlJfSU5TVUZGSUNJRU5UX01FTU9SWSwKKyAgICAiSW5zdWZmaWNpZW50IG1lbW9yeS5cbiIgIH0sCisKKyAgeyBFUlJfSU5GT19OT1RfRk9VTkQsCisgICAgIlByb3RvY29sIE1hbmFuZ2VyIGluZm8gc3RydWN0dXJlIGlzIGxvc3Qgb3IgY29ycnVwdGVkLlxuIiAgfSwKKworICB7IEVSUl9HRU5FUkFMX0ZBSUxVUkUsCisgICAgIkdlbmVyYWwgZmFpbHVyZS5cbiIgIH0KK307CisKKy8qCisgKiAgU29tZSBoYW5keSBtYWNyb3MKKyAqLworI2RlZmluZSBQRVJST1Ioc3RyKSAgICBwcmludGYoIiVzICglZCk6ICVzXG4iLCBfX0ZJTEVfXyxfX0xJTkVfXyxzdHIpCisjZGVmaW5lIERFQlVHX1JJTkcoKSAgIChkZWJ1Z1N0cmluZ3Nbc3RvcERlYnVnKzEgPT0gTUFYX05VTV9ERUJVR19TVFJJTkdTID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcERlYnVnID0gMCA6ICsrc3RvcERlYnVnXSkKKworLyoKKyAqIG5lZWRzIHJld3JpdGUgZm9yIERPU1gKKyAqLworI2RlZmluZSBNQUNfRElTUEFUQ0goaG5kKSAgKChzdHJ1Y3QgX01hY1VwcGVyRGlzcGF0Y2gqKShobmQpLT5jb21tb24tPnVwcGVyRGlzcGF0Y2hUYWJsZSkKKyNkZWZpbmUgTUFDX1NUQVRVUyhobmQpICAgICgoc3RydWN0IF9NYWNTdGF0dXNUYWJsZSopICAoaG5kKS0+Y29tbW9uLT5zZXJ2aWNlU3RhdHVzKQorI2RlZmluZSBNQUNfQ0hBUihobmQpICAgICAgKChzdHJ1Y3QgX01hY0NoYXJzKikgICAgICAgIChobmQpLT5jb21tb24tPnNlcnZpY2VDaGFycykKKworI2lmZGVmIE5ESVNfREVCVUcKKyAgI2RlZmluZSBERUJVRzAoc3RyKSAgICAgIHByaW50ZiAoc3RyKQorICAjZGVmaW5lIERFQlVHMShmbXQsYSkgICAgcHJpbnRmIChmbXQsYSkKKyAgI2RlZmluZSBERUJVRzIoZm10LGEsYikgIHByaW50ZiAoZm10LGEsYikKKyAgI2RlZmluZSBUUkFDRTAoc3RyKSAgICAgIHNwcmludGYgKERFQlVHX1JJTkcoKSxzdHIpCisgICNkZWZpbmUgVFJBQ0UxKGZtdCxhKSAgICBzcHJpbnRmIChERUJVR19SSU5HKCksZm10LGEpCisjZWxzZQorICAjZGVmaW5lIERFQlVHMChzdHIpICAgICAgKCh2b2lkKTApCisgICNkZWZpbmUgREVCVUcxKGZtdCxhKSAgICAoKHZvaWQpMCkKKyAgI2RlZmluZSBERUJVRzIoZm10LGEsYikgICgodm9pZCkwKQorICAjZGVmaW5lIFRSQUNFMChzdHIpICAgICAgKCh2b2lkKTApCisgICNkZWZpbmUgVFJBQ0UxKGZtdCxhKSAgICAoKHZvaWQpMCkKKyNlbmRpZgorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIGJvdGggdGhyZWFkcworICovCit2b2lkIE5kaXNGcmVlU3RhY2sgKEJZVEUgKmFTdGFjaykKK3sKKyAgR1VBUkQoKTsKKworICBpZiAoZnJlZVN0YWNrUHRyID09IFNUQUNLX1BPT0xfU0laRSAtIDEpCisgICAgIFBFUlJPUiAoInRyaWVkIHRvIGZyZWUgdG9vIG1hbnkgc3RhY2tzIik7CisKKyAgZnJlZVN0YWNrc1srK2ZyZWVTdGFja1B0cl0gPSBhU3RhY2s7CisKKyAgaWYgKGZyZWVTdGFja1B0ciA9PSAwKQorICAgICBUUkFDRTAgKCJmcmVlU3RhY2tQdHIgd2VudCBwb3NpdGl2ZVxuIik7CisKKyAgVU5HVUFSRCgpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIGNhbGxiYWNrcyB0byBhbGxvY2F0ZSBsb2NhbCBkYXRhCisgKi8KK0JZVEUgKk5kaXNBbGxvY1N0YWNrICh2b2lkKQoreworICBCWVRFICpzdGFjazsKKworICBHVUFSRCgpOworCisgIGlmIChmcmVlU3RhY2tQdHIgPCAwKQorICB7CisgICAgLyogUmFuIG91dCBvZiBzdGFjayBidWZmZXJzLiBSZXR1cm4gTlVMTCB3aGljaCB3aWxsIHN0YXJ0CisgICAgICogZHJvcHBpbmcgcGFja2V0cworICAgICAqLworICAgIFRSQUNFMCAoImZyZWVTdGFja1B0ciB3ZW50IG5lZ2F0aXZlXG4iKTsKKyAgICBzdGFjayA9IDA7CisgIH0KKyAgZWxzZQorICAgIHN0YWNrID0gZnJlZVN0YWNrc1tmcmVlU3RhY2tQdHItLV07CisKKyAgVU5HVUFSRCgpOworICByZXR1cm4gKHN0YWNrKTsKK30KKworQ0FMTEJBQ0sgKE5kaXNTeXN0ZW1SZXF1ZXN0IChEV09SRCBwYXJhbTEsIERXT1JEIHBhcmFtMiwgV09SRCBwYXJhbTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgb3Bjb2RlLCBXT1JEIHRhcmdldERTKSkKK3sKKyAgc3RhdGljIGludCAgICAgICAgICAgIGJpbmRFbnRyeSA9IDA7CisgIHN0cnVjdCBfQ29tbW9uQ2hhcnMgICptYWNDb21tb247CisgIHZvbGF0aWxlIFdPUkQgcmVzdWx0OworCisgIHN3aXRjaCAob3Bjb2RlKQorICB7CisgICAgY2FzZSBSRVFfSU5JVElBVEVfQklORDoKKyAgICAgICAgIG1hY0NvbW1vbiA9IChzdHJ1Y3QgX0NvbW1vbkNoYXJzKikgcGFyYW0yOworICAgICAgICAgaWYgKG1hY0NvbW1vbiA9PSBOVUxMKQorCSB7CisgICAgICAgICAgIHByaW50ZiAoIlRoZXJlIGlzIGFuIE5ESVMgbWlzY29uZmlndXJhdGlvbi5cbiIpOworICAgICAgICAgICByZXN1bHQgPSBFUlJfR0VORVJBTF9GQUlMVVJFOworCSAgIGJyZWFrOworCSB9CisgICAgICAgICBERUJVRzIgKCJtb2R1bGUgbmFtZSAlc1xuIgorICAgICAgICAgICAgICAgICAibW9kdWxlIHR5cGUgJXNcbiIsCisgICAgICAgICAgICAgICAgIG1hY0NvbW1vbi0+bW9kdWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgKChNYWNDaGFycyopIG1hY0NvbW1vbi0+c2VydmljZUNoYXJzKS0+bWFjTmFtZSk7CisKKyAgICAgICAgIC8qIEJpbmRpbmcgdG8gdGhlIE1BQyAqLworICAgICAgICAgcmVzdWx0ID0gbWFjQ29tbW9uLT5zeXN0ZW1SZXF1ZXN0ICgoRFdPUkQpJmNvbW1vbiwgKERXT1JEKSZtYWNDb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFJFUV9CSU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDb21tb24tPm1vZHVsZURTKTsKKworICAgICAgICAgaWYgKCFzdHJjbXAoYmluZGluZ3MubW9kdWxlTmFtZVtiaW5kRW50cnldLCBoYW5kbGUtPm1vZHVsZU5hbWUpKQorICAgICAgICAgICAgICBoYW5kbGUtPmNvbW1vbiA9IG1hY0NvbW1vbjsKKyAgICAgICAgIGVsc2UgUEVSUk9SICgidW5rbm93biBtb2R1bGUiKTsKKyAgICAgICAgICsrYmluZEVudHJ5OworCSBicmVhazsKKworICAgIGNhc2UgUkVRX0lOSVRJQVRFX1VOQklORDoKKyAgICAgICAgIG1hY0NvbW1vbiA9IChzdHJ1Y3QgX0NvbW1vbkNoYXJzKikgcGFyYW0yOworICAgICAgICAgcmVzdWx0ID0gbWFjQ29tbW9uLT5zeXN0ZW1SZXF1ZXN0ICgoRFdPUkQpJmNvbW1vbiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUkVRX1VOQklORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ29tbW9uLT5tb2R1bGVEUyk7CisgICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgICByZXN1bHQgPSBFUlJfR0VORVJBTF9GQUlMVVJFOworCSBicmVhazsKKyAgfQorICBBUkdTVVNFRCAocGFyYW0xKTsKKyAgQVJHU1VTRUQgKHBhcmFtMyk7CisgIEFSR1NVU0VEICh0YXJnZXREUyk7CisgIHJldHVybiAocmVzdWx0KTsKK30KKworQ0FMTEJBQ0sgKE5kaXNSZXF1ZXN0Q29uZmlybSAoV09SRCBwcm90SWQsIFdPUkQgbWFjSWQsICAgV09SRCByZXFIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHN0YXR1cywgV09SRCByZXF1ZXN0LCBXT1JEIHByb3REUykpCit7CisgIEFSR1NVU0VEIChwcm90SWQpOyAgICBBUkdTVVNFRCAobWFjSWQpOworICBBUkdTVVNFRCAocmVxSGFuZGxlKTsgQVJHU1VTRUQgKHN0YXR1cyk7CisgIEFSR1NVU0VEIChyZXF1ZXN0KTsgICBBUkdTVVNFRCAocHJvdERTKTsKKyAgcmV0dXJuIChFUlJfU1VDQ0VTUyk7Cit9CisKK0NBTExCQUNLIChOZGlzVHJhbnNtaXRDb25maXJtIChXT1JEIHByb3RJZCwgV09SRCBtYWNJZCwgV09SRCByZXFIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBzdGF0dXMsIFdPUkQgcHJvdERTKSkKK3sKKyAgeG1pdFBlbmRpbmctLTsKKyAgRnJlZVBrdEJ1ZiAodHhCdWZQZW5kaW5nKTsgIC8qIEFkZCBwYXNzZWQgRUNCIGJhY2sgdG8gdGhlIGZyZWUgbGlzdCAqLworCisgIEFSR1NVU0VEIChyZXFIYW5kbGUpOworICBBUkdTVVNFRCAoc3RhdHVzKTsKKyAgQVJHU1VTRUQgKHByb3REUyk7CisgIHJldHVybiAoRVJSX1NVQ0NFU1MpOworfQorCisKKy8qCisgKiBUaGUgcHJpbWFyeSBmdW5jdGlvbiBmb3IgcmVjZWl2aW5nIHBhY2tldHMKKyAqLworQ0FMTEJBQ0sgKE5kaXNSZWNlaXZlTG9va2FoZWFkIChXT1JEICBtYWNJZCwgICAgICBXT1JEICBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgIGJ5dGVzQXZhaWwsIEJZVEUgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQllURSAqaW5kaWNhdGUsICAgV09SRCAgcHJvdERTKSkKK3sKKyAgaW50ICAgICByZXN1bHQ7CisgIFBrdEJ1ZiAqcGt0QnVmOworICBXT1JEICAgIGJ5dGVzQ29waWVkOworICBzdHJ1Y3QgX1REQnVmRGVzY3IgdERCdWZEZXNjcjsKKworI2lmIDAKKyAgVFJBQ0UxICgibG9va2FoZWFkIGxlbmd0aCA9ICVkLCAiLCBieXRlc0F2YWlsKTsKKyAgVFJBQ0UxICgiZWNiID0gJTA4bFgsICIsICAgICAgICAgICplY2IpOworICBUUkFDRTEgKCJjb3VudCA9ICUwOGxYXG4iLCAgICAgICAgIGNvdW50KTsKKyAgVFJBQ0UxICgib2Zmc2V0ID0gJTA4bFgsICIsICAgICAgICBvZmZzZXQpOworICBUUkFDRTEgKCJ0aW1lc0FsbG93ZWQgPSAlZCwgIiwgICAgIHRpbWVzQWxsb3dlZCk7CisgIFRSQUNFMSAoInBhY2tldCBzaXplID0gJWRcbiIsICAgICAgbG9vay0+ZGF0YUxvb2tBaGVhZExlbik7CisjZW5kaWYKKworICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIHBhY2tldAorICAgKi8KKyAgaWYgKChwa3RCdWYgPSBBbGxvY1BrdEJ1ZigpKSA9PSBOVUxMKQorICB7CisgICAgZHJvcHBlZFBhY2tldHMrKzsKKyAgICByZXR1cm4gKEVSUl9GUkFNRV9SRUpFQ1RFRCk7CisgIH0KKworICAvKgorICAgKiBOb3cga2x1ZGdlIHRoaW5ncy4gTm90ZSB3ZSB3aWxsIGhhdmUgdG8gdW5kbyB0aGlzIGxhdGVyLiBUaGlzIHdpbGwKKyAgICogbWFrZSB0aGUgcGFja2V0IGNvbnRpZ3VvdXMgYWZ0ZXIgdGhlIE1MSUQgaGFzIGRvbmUgdGhlIHJlcXVlc3RlZCBjb3B5LgorICAgKi8KKworICB0REJ1ZkRlc2NyLnRERGF0YUNvdW50ID0gMTsKKyAgdERCdWZEZXNjci50REJ1ZkRlc2NyUmVjWzBdLnREUHRyVHlwZSA9IE5ESVNfUFRSX1BIWVNJQ0FMOworICB0REJ1ZkRlc2NyLnREQnVmRGVzY3JSZWNbMF0udEREYXRhUHRyID0gcGt0QnVmLT5idWZmZXI7CisgIHREQnVmRGVzY3IudERCdWZEZXNjclJlY1swXS50RERhdGFMZW4gPSBwa3RCdWYtPmxlbmd0aDsKKyAgdERCdWZEZXNjci50REJ1ZkRlc2NyUmVjWzBdLmR1bW15ICAgICA9IDA7CisKKyAgcmVzdWx0ID0gTUFDX0RJU1BBVENIKGhhbmRsZSktPnRyYW5zZmVyRGF0YSAoJmJ5dGVzQ29waWVkLCAwLCAmdERCdWZEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLT5jb21tb24tPm1vZHVsZURTKTsKKyAgcGt0QnVmLT5wYWNrZXRMZW5ndGggPSBieXRlc0NvcGllZDsKKworICBpZiAocmVzdWx0ID09IEVSUl9TVUNDRVNTKQorICAgICAgIEVucXVlUGt0QnVmKHBrdEJ1Zik7CisgIGVsc2UgRnJlZVBrdEJ1ZiAocGt0QnVmKTsKKworICBBUkdTVVNFRCAoZnJhbWVTaXplKTsKKyAgQVJHU1VTRUQgKGJ5dGVzQXZhaWwpOworICBBUkdTVVNFRCAoaW5kaWNhdGUpOworICBBUkdTVVNFRCAocHJvdERTKTsKKworICByZXR1cm4gKEVSUl9TVUNDRVNTKTsKK30KKworQ0FMTEJBQ0sgKE5kaXNJbmRpY2F0aW9uQ29tcGxldGUgKFdPUkQgbWFjSWQsIFdPUkQgcHJvdERTKSkKK3sKKyAgQVJHU1VTRUQgKG1hY0lkKTsKKyAgQVJHU1VTRUQgKHByb3REUyk7CisKKyAgLyogV2UgZG9uJ3QgZ2l2ZSBhIGhvb3QgYWJvdXQgdGhlc2UuIEp1c3QgcmV0dXJuCisgICAqLworICByZXR1cm4gKEVSUl9TVUNDRVNTKTsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIE9USEVSIHdheSB3ZSBtYXkgcmVjZWl2ZSBwYWNrZXRzCisgKi8KK0NBTExCQUNLIChOZGlzUmVjZWl2ZUNoYWluIChXT1JEIG1hY0lkLCBXT1JEIGZyYW1lU2l6ZSwgV09SRCByZXFIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9SeEJ1ZkRlc2NyICpyeEJ1ZkRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUgKmluZGljYXRlLCBXT1JEIHByb3REUykpCit7CisgIHN0cnVjdCBfUGt0QnVmICpwa3RCdWY7CisgIGludCAgICAgaTsKKworICAvKgorICAgKiBGb3Igbm93IHdlIGNvcHkgdGhlIGVudGlyZSBwYWNrZXQgb3ZlciB0byBhIFBrdEJ1ZiBzdHJ1Y3R1cmUuIFRoaXMgbWF5IGJlCisgICAqIGEgcGVyZm9ybWFuY2UgaGl0IGJ1dCB0aGlzIHJvdXRpbmUgcHJvYmFibHkgaXNuJ3QgY2FsbGVkIHZlcnkgbXVjaCwgYW5kCisgICAqIGl0IGlzIGEgbG90IG9mIHdvcmsgdG8gZG8gaXQgb3RoZXJ3aXNlLiBBbHNvIGlmIGl0IGlzIGEgZmlsdGVyIHByb3RvY29sCisgICAqIHBhY2tldCB3ZSBjb3VsZCBlbmQgdXAgc3Vja2luZyB1cCBNQUMgYnVmZmVzLgorICAgKi8KKworICBpZiAoKHBrdEJ1ZiA9IEFsbG9jUGt0QnVmKCkpID09IE5VTEwpCisgIHsKKyAgICBkcm9wcGVkUGFja2V0cysrOworICAgIHJldHVybiAoRVJSX0ZSQU1FX1JFSkVDVEVEKTsKKyAgfQorICBwa3RCdWYtPnBhY2tldExlbmd0aCA9IDA7CisKKyAgLyogQ29weSB0aGUgcGFja2V0IHRvIHRoZSBidWZmZXIKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCByeEJ1ZkRlc2NyLT5yeERhdGFDb3VudDsgKytpKQorICB7CisgICAgc3RydWN0IF9SeEJ1ZkRlc2NyUmVjICpyeERlc2NyID0gJnJ4QnVmRGVzY3ItPnJ4QnVmRGVzY3JSZWNbaV07CisKKyAgICBtZW1jcHkgKHBrdEJ1Zi0+YnVmZmVyICsgcGt0QnVmLT5wYWNrZXRMZW5ndGgsCisgICAgICAgICAgICByeERlc2NyLT5yeERhdGFQdHIsIHJ4RGVzY3ItPnJ4RGF0YUxlbik7CisgICAgcGt0QnVmLT5wYWNrZXRMZW5ndGggKz0gcnhEZXNjci0+cnhEYXRhTGVuOworICB9CisKKyAgRW5xdWVQa3RCdWYgKHBrdEJ1Zik7CisKKyAgQVJHU1VTRUQgKGZyYW1lU2l6ZSk7CisgIEFSR1NVU0VEIChyZXFIYW5kbGUpOworICBBUkdTVVNFRCAoaW5kaWNhdGUpOworICBBUkdTVVNFRCAocHJvdERTKTsKKworICAvKiBUaGlzIGZyZWVzIHVwIHRoZSBidWZmZXIgZm9yIHRoZSBNQUMgdG8gdXNlCisgICAqLworICByZXR1cm4gKEVSUl9TVUNDRVNTKTsKK30KKworQ0FMTEJBQ0sgKE5kaXNTdGF0dXNQcm9jIChXT1JEIG1hY0lkLCAgV09SRCBwYXJhbTEsIEJZVEUgKmluZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIG9wY29kZSwgV09SRCBwcm90RFMpKQoreworICBzd2l0Y2ggKG9wY29kZSkKKyAgeworICAgIGNhc2UgU1RBVFVTX1JJTkdfU1RBVFVTOgorCSBicmVhazsKKyAgICBjYXNlIFNUQVRVU19BREFQVEVSX0NIRUNLOgorCSBicmVhazsKKyAgICBjYXNlIFNUQVRVU19TVEFSVF9SRVNFVDoKKwkgYnJlYWs7CisgICAgY2FzZSBTVEFUVVNfSU5URVJSVVBUOgorCSBicmVhazsKKyAgICBjYXNlIFNUQVRVU19FTkRfUkVTRVQ6CisJIGJyZWFrOworICAgIGRlZmF1bHQ6CisJIGJyZWFrOworICB9CisgIEFSR1NVU0VEIChtYWNJZCk7CisgIEFSR1NVU0VEIChwYXJhbTEpOworICBBUkdTVVNFRCAoaW5kaWNhdGUpOworICBBUkdTVVNFRCAob3Bjb2RlKTsKKyAgQVJHU1VTRUQgKHByb3REUyk7CisKKyAgLyogV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhYm91dCB0aGlzIHN0dWZmIHlldAorICAgKi8KKyAgcmV0dXJuIChFUlJfU1VDQ0VTUyk7Cit9CisKKy8qCisgKiBUZWxsIHRoZSBORElTIGRyaXZlciB0byBzdGFydCB0aGUgZGVsaXZlcnkgb2YgdGhlIHBhY2tldAorICovCitpbnQgTmRpc1NlbmRQYWNrZXQgKHN0cnVjdCBfUGt0QnVmICpwa3RCdWYsIGludCBtYWNJZCkKK3sKKyAgc3RydWN0IF9UeEJ1ZkRlc2NyIHR4QnVmRGVzY3I7CisgIGludCAgICAgcmVzdWx0OworCisgIHhtaXRQZW5kaW5nKys7CisgIHR4QnVmUGVuZGluZyA9IHBrdEJ1ZjsgICAgLyogd2Ugb25seSBoYXZlIDEgcGVuZGluZyBUeCBhdCBhIHRpbWUgKi8KKworICB0eEJ1ZkRlc2NyLnR4SW1tZWRMZW4gID0gMDsKKyAgdHhCdWZEZXNjci50eEltbWVkUHRyICA9IE5VTEw7CisgIHR4QnVmRGVzY3IudHhEYXRhQ291bnQgPSAxOworICB0eEJ1ZkRlc2NyLnR4QnVmRGVzY3JSZWNbMF0udHhQdHJUeXBlID0gTkRJU19QVFJfUEhZU0lDQUw7CisgIHR4QnVmRGVzY3IudHhCdWZEZXNjclJlY1swXS5kdW1teSAgICAgPSAwOworICB0eEJ1ZkRlc2NyLnR4QnVmRGVzY3JSZWNbMF0udHhEYXRhTGVuID0gcGt0QnVmLT5wYWNrZXRMZW5ndGg7CisgIHR4QnVmRGVzY3IudHhCdWZEZXNjclJlY1swXS50eERhdGFQdHIgPSBwa3RCdWYtPmJ1ZmZlcjsKKworICByZXN1bHQgPSBNQUNfRElTUEFUQ0goaGFuZGxlKS0+dHJhbnNtaXRDaGFpbiAoY29tbW9uLm1vZHVsZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0QnVmLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHhCdWZEZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+Y29tbW9uLT5tb2R1bGVEUyk7CisgIHN3aXRjaCAocmVzdWx0KQorICB7CisgICAgY2FzZSBFUlJfT1VUX09GX1JFU09VUkNFOgorICAgICAgICAgLyogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYnV0IGlmIGl0IGRvZXMgdGhlcmUgaXMgbm90CisgICAgICAgICAgKiBtdWNoIHdlIGNhbiBkbyBhYm91dCBpdAorICAgICAgICAgICovCisgICAgICAgICBwcmludGYgKCJFUlJPUjogdHJhbnNtaXQgcXVldWUgb3ZlcmZsb3dlZFxuIik7CisgICAgICAgICByZXR1cm4gKDApOworCisgICAgY2FzZSBFUlJfU1VDQ0VTUzoKKyAgICAgICAgIC8qIEV2ZXJ5dGhpbmcgd2FzIGh1bmt5IGRvcnkgYW5kIHN5bmNocm9ub3VzLiBGcmVlIHVwIHRoZQorICAgICAgICAgICogcGFja2V0IGJ1ZmZlcgorICAgICAgICAgICovCisgICAgICAgICB4bWl0UGVuZGluZy0tOworICAgICAgICAgRnJlZVBrdEJ1ZiAocGt0QnVmKTsKKyAgICAgICAgIHJldHVybiAoMSk7CisKKyAgICBjYXNlIEVSUl9SRVFVRVNUX1FVRVVFRDoKKyAgICAgICAgIC8qIEV2ZXJ5dGhpbmcgd2FzIGh1bmt5IGRvcnkgYW5kIGFzeW5jaHJvbm91cy4gRG8gbm90aGluZworICAgICAgICAgICovCisgICAgICAgICByZXR1cm4gKDEpOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgIHByaW50ZiAoIlR4IGZhaWwsIGNvZGUgPSAlMDRYXG4iLCByZXN1bHQpOworICAgICAgICAgcmV0dXJuICgwKTsKKyAgfQorfQorCisKKworc3RhdGljIGludCBuZGlzX25lcnIgPSBzaXplb2YobmRpc19lcnJsaXN0KSAvIHNpemVvZihuZGlzX2Vycmxpc3RbMF0pOworCitzdGF0aWMgY2hhciAqTmRpc19zdHJlcnJvciAoV09SRCBlcnJvckNvZGUpCit7CisgIHN0YXRpYyBjaGFyIGJ1ZlszMF07CisgIGludCAgICBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuZGlzX25lcnI7IGkrKykKKyAgICAgIGlmIChlcnJvckNvZGUgPT0gbmRpc19lcnJsaXN0W2ldLmVycl9udW0pCisgICAgICAgICByZXR1cm4gKG5kaXNfZXJybGlzdFtpXS5lcnJfdGV4dCk7CisKKyAgc3ByaW50ZiAoYnVmLCJ1bmtub3duIGVycm9yICVkIixlcnJvckNvZGUpOworICByZXR1cm4gKGJ1Zik7Cit9CisKKworY2hhciAqTmRpc0xhc3RFcnJvciAodm9pZCkKK3sKKyAgY2hhciAqZXJyU3RyID0gbGFzdEVycjsKKyAgbGFzdEVyciA9IE5VTEw7CisgIHJldHVybiAoZXJyU3RyKTsKK30KKworaW50IE5kaXNPcGVuICh2b2lkKQoreworICBzdHJ1Y3QgX1JlcUJsb2NrIHJlcUJsb2NrOworICBpbnQgICAgIHJlc3VsdDsKKyAgaW50ICAgICBuZGlzRmQgPSBvcGVuIChORElTX1BBVEgsIE9fUkRPTkxZKTsKKworICBpZiAobmRpc0ZkIDwgMCkKKyAgeworICAgIHByaW50ZiAoIkNvdWxkIG5vdCBvcGVuIE5ESVMgUHJvdG9jb2wgTWFuYWdlciBkZXZpY2UuXG4iKTsKKyAgICByZXR1cm4gKDApOworICB9CisKKyAgbWVtc2V0ICgmcmVxQmxvY2ssIDAsIHNpemVvZihSZXFCbG9jaykpOworCisgIHJlcUJsb2NrLm9wY29kZSA9IFBNX0dFVF9QUk9UT0NPTF9NQU5BR0VSX0xJTktBR0U7CisKKyAgcmVzdWx0ID0gTmRpc0dldExpbmthZ2UgKG5kaXNGZCwgKGNoYXIqKSZyZXFCbG9jaywgc2l6ZW9mKFJlcUJsb2NrKSk7CisgIGlmIChyZXN1bHQgIT0gMCkKKyAgeworICAgIHByaW50ZiAoIkNvdWxkIG5vdCBnZXQgUHJvdG9jb2wgTWFuYWdlciBsaW5rYWdlLlxuIik7CisgICAgY2xvc2UgKG5kaXNGZCk7CisgICAgcmV0dXJuICgwKTsKKyAgfQorCisgIGNsb3NlIChuZGlzRmQpOworICBwcm90TWFuRW50cnkgPSAoUHJvdE1hbikgcmVxQmxvY2sucG9pbnRlcjE7CisgIHByb3RNYW5EUyAgICA9IHJlcUJsb2NrLndvcmQxOworCisgIERFQlVHMiAoIkVudHJ5IFBvaW50ID0gJTA0WDolMDRYXG4iLCBGUF9TRUcocHJvdE1hbkVudHJ5KSxGUF9PRkYocHJvdE1hbkVudHJ5KSk7CisgIERFQlVHMSAoIlByb3RNYW4gRFMgID0gJTA0WFxuIiwgcHJvdE1hbkRTKTsKKyAgcmV0dXJuICgxKTsKK30KKworCitpbnQgTmRpc1JlZ2lzdGVyQW5kQmluZCAoaW50IHByb21pcykKK3sKKyAgc3RydWN0IF9SZXFCbG9jayByZXFCbG9jazsKKyAgV09SRCAgICByZXN1bHQ7CisKKyAgbWVtc2V0ICgmY29tbW9uLDAsc2l6ZW9mKGNvbW1vbikpOworCisgIGNvbW1vbi50YWJsZVNpemUgPSBzaXplb2YgKGNvbW1vbik7CisKKyAgY29tbW9uLm1ham9yTmRpc1ZlcnNpb24gICA9IDI7CisgIGNvbW1vbi5taW5vck5kaXNWZXJzaW9uICAgPSAwOworICBjb21tb24ubWFqb3JNb2R1bGVWZXJzaW9uID0gMjsKKyAgY29tbW9uLm1pbm9yTW9kdWxlVmVyc2lvbiA9IDA7CisKKyAgLyogSW5kaWNhdGVzIGJpbmRpbmcgZnJvbSBiZWxvdyBhbmQgZHluYW1pY2FsbHkgbG9hZGVkCisgICAqLworICBjb21tb24ubW9kdWxlRmxhZ3MgPSAweDAwMDAwMDA2TDsKKworICBzdHJjcHkgKGNvbW1vbi5tb2R1bGVOYW1lLCAiUENBUCIpOworCisgIGNvbW1vbi5wcm90b2NvbExldmVsVXBwZXIgPSAweEZGOworICBjb21tb24ucHJvdG9jb2xMZXZlbExvd2VyID0gMTsKKyAgY29tbW9uLmludGVyZmFjZUxvd2VyICAgICA9IDE7CisjaWZkZWYgX19ESkdQUF9fCisgIGNvbW1vbi5tb2R1bGVEUyAgICAgICAgICAgPSBfZG9zX2RzOyAvKiB0aGUgY2FsbGJhY2sgZGF0YSBzZWdtZW50ICovCisjZWxzZQorICBjb21tb24ubW9kdWxlRFMgICAgICAgICAgID0gX0RTOworI2VuZGlmCisKKyAgY29tbW9uLnN5c3RlbVJlcXVlc3QgICAgICA9IChTeXN0ZW1SZXF1ZXN0KSBzeXN0ZW1SZXF1ZXN0R2x1ZTsKKyAgY29tbW9uLnNlcnZpY2VDaGFycyAgICAgICA9IChCWVRFKikgJnByb3RDaGFyczsKKyAgY29tbW9uLnNlcnZpY2VTdGF0dXMgICAgICA9IE5VTEw7CisgIGNvbW1vbi51cHBlckRpc3BhdGNoVGFibGUgPSBOVUxMOworICBjb21tb24ubG93ZXJEaXNwYXRjaFRhYmxlID0gKEJZVEUqKSAmbG93ZXJUYWJsZTsKKworICBwcm90Q2hhcnMubGVuZ3RoICA9IHNpemVvZiAocHJvdENoYXJzKTsKKyAgcHJvdENoYXJzLm5hbWVbMF0gPSAwOworICBwcm90Q2hhcnMudHlwZSAgICA9IDA7CisKKyAgbG93ZXJUYWJsZS5iYWNrUG9pbnRlciAgICAgICAgPSAmY29tbW9uOworICBsb3dlclRhYmxlLnJlcXVlc3RDb25maXJtICAgICA9IHJlcXVlc3RDb25maXJtR2x1ZTsKKyAgbG93ZXJUYWJsZS50cmFuc21pdENvbmZpcm0gICAgPSB0cmFuc21pdENvbmZpcm1HbHVlOworICBsb3dlclRhYmxlLnJlY2VpdmVMb29rYWhlYWQgICA9IHJlY2VpdmVMb29rYWhlYWRHbHVlOworICBsb3dlclRhYmxlLmluZGljYXRpb25Db21wbGV0ZSA9IGluZGljYXRpb25Db21wbGV0ZUdsdWU7CisgIGxvd2VyVGFibGUucmVjZWl2ZUNoYWluICAgICAgID0gcmVjZWl2ZUNoYWluR2x1ZTsKKyAgbG93ZXJUYWJsZS5zdGF0dXMgICAgICAgICAgICAgPSBzdGF0dXNHbHVlOworICBsb3dlclRhYmxlLmZsYWdzICAgICAgICAgICAgICA9IDM7CisgIGlmIChwcm9taXMpCisgICAgIGxvd2VyVGFibGUuZmxhZ3MgfD0gNDsgICAvKiBwcm9taXNjb3VzIG1vZGUgKHJlY2VpdmUgZXZlcnl0aGluZykgKi8KKworICBiaW5kaW5ncy5udW1CaW5kaW5ncyA9IDE7CisgIHN0cmNweSAoYmluZGluZ3MubW9kdWxlTmFtZVswXSwgaGFuZGxlLT5tb2R1bGVOYW1lKTsKKworICAvKiBSZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCBORElTCisgICAqLworICByZXFCbG9jay5vcGNvZGUgICA9IFBNX1JFR0lTVEVSX01PRFVMRTsKKyAgcmVxQmxvY2sucG9pbnRlcjEgPSAoQllURSBGQVIqKSAmY29tbW9uOworICByZXFCbG9jay5wb2ludGVyMiA9IChCWVRFIEZBUiopICZiaW5kaW5nczsKKworICByZXN1bHQgPSAoKnByb3RNYW5FbnRyeSkgKCZyZXFCbG9jaywgcHJvdE1hbkRTKTsKKyAgaWYgKHJlc3VsdCkKKyAgeworICAgIHByaW50ZiAoIlByb3RtYW4gcmVnaXN0ZXJpbmcgZmFpbGVkOiAlc1xuIiwgTmRpc19zdHJlcnJvcihyZXN1bHQpKTsKKyAgICByZXR1cm4gKDApOworICB9CisKKyAgLyogU3RhcnQgdGhlIGJpbmRpbmcgcHJvY2VzcworICAgKi8KKyAgcmVxQmxvY2sub3Bjb2RlICAgPSBQTV9CSU5EX0FORF9TVEFSVDsKKyAgcmVxQmxvY2sucG9pbnRlcjEgPSAoQllURSBGQVIqKSAmZmFpbGluZ01vZHVsZXM7CisKKyAgcmVzdWx0ID0gKCpwcm90TWFuRW50cnkpICgmcmVxQmxvY2ssIHByb3RNYW5EUyk7CisgIGlmIChyZXN1bHQpCisgIHsKKyAgICBwcmludGYgKCJTdGFydCBiaW5kaW5nIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7CisgICAgcmV0dXJuICgwKTsKKyAgfQorICByZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50IENoZWNrTWFjRmVhdHVyZXMgKENhcmRIYW5kbGUgKmNhcmQpCit7CisgIERXT1JEICAgICAgc2VydmljZUZsYWdzOworICBCWVRFIF9mYXIgKm1lZGlhU3RyaW5nOworICBCWVRFIF9mYXIgKm1hY19hZGRyOworCisgIERFQlVHMiAoImNoZWNraW5nIGNhcmQgZmVhdHVyZXNcbiIKKyAgICAgICAgICAiY29tbW9uIHRhYmxlIGFkZHJlc3MgPSAlMDhsWCwgbWFjSWQgPSAlZFxuIiwKKyAgICAgICAgICBjYXJkLT5jb21tb24sIGNhcmQtPmNvbW1vbi0+bW9kdWxlSWQpOworCisgIHNlcnZpY2VGbGFncyA9IE1BQ19DSEFSIChoYW5kbGUpLT5zZXJ2aWNlRmxhZ3M7CisKKyAgaWYgKChzZXJ2aWNlRmxhZ3MgJiBTRl9QUk9NSVNDVU9VUykgPT0gMCkKKyAgeworICAgIHByaW50ZiAoIlRoZSBNQUMgJXMgZG9lcyBub3Qgc3VwcG9ydCBwcm9taXNjdW91cyBtb2RlLlxuIiwKKyAgICAgICAgICAgIGNhcmQtPm1vZHVsZU5hbWUpOworICAgIHJldHVybiAoMCk7CisgIH0KKworICBtZWRpYVN0cmluZyA9IE1BQ19DSEFSIChoYW5kbGUpLT5tYWNOYW1lOworCisgIERFQlVHMSAoIm1lZGlhIHR5cGUgPSAlc1xuIixtZWRpYVN0cmluZyk7CisKKyAgLyogR2V0IHRoZSBtZWRpYSB0eXBlLiBBbmQgc2V0IHRoZSBoZWFkZXIgc2l6ZQorICAgKi8KKyAgaWYgKCFzdHJuY21wKG1lZGlhU3RyaW5nLCI4MDIuMyIsNSkgfHwKKyAgICAgICFzdHJuY21wKG1lZGlhU3RyaW5nLCJESVgiLDMpICAgfHwKKyAgICAgICFzdHJuY21wKG1lZGlhU3RyaW5nLCJESVgrODAyLjMiLDkpKQorICAgICAgIGhlYWRlclNpemUgPSBzaXplb2YgKEV0aGVybmV0SUlIZWFkZXIpOworCisgIGVsc2UgaWYgKCFzdHJuY21wKG1lZGlhU3RyaW5nLCJGRERJIiw0KSkKKyAgICAgICBoZWFkZXJTaXplID0gc2l6ZW9mIChGZGRpSGVhZGVyKSArCisgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoSWVlZTgwMkRvdDJTbmFwSGVhZGVyKTsKKyAgZWxzZQorICB7CisgICAgcHJpbnRmICgiVW5zdXBwb3J0ZWQgTUFDIHR5cGU6IGAlcydcbiIsIG1lZGlhU3RyaW5nKTsKKyAgICByZXR1cm4gKDApOworICB9CisKKyAgZnJhbWVTaXplID0gTUFDX0NIQVIgKGhhbmRsZSktPm1heEZyYW1lU2l6ZTsKKyAgbWFjX2FkZHIgID0gTUFDX0NIQVIgKGhhbmRsZSktPmN1cnJlbnRBZGRyZXNzOworCisgIHByaW50ZiAoIkhhcmR3YXJlIGFkZHJlc3M6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorICAgICAgICAgIG1hY19hZGRyWzBdLCBtYWNfYWRkclsxXSwgbWFjX2FkZHJbMl0sCisgICAgICAgICAgbWFjX2FkZHJbM10sIG1hY19hZGRyWzRdLCBtYWNfYWRkcls1XSk7CisgIHJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQgTmRpc1N0YXJ0TWFjIChDYXJkSGFuZGxlICpjYXJkKQoreworICBXT1JEIHJlc3VsdDsKKworICAvKiBTZXQgdGhlIGxvb2thaGVhZCBsZW5ndGgKKyAgICovCisgIHJlc3VsdCA9IE1BQ19ESVNQQVRDSChoYW5kbGUpLT5yZXF1ZXN0IChjb21tb24ubW9kdWxlSWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJTaXplLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRX1NFVF9MT09LQUhFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5jb21tb24tPm1vZHVsZURTKTsKKworICAvKiBXZSBhc3N1bWUgdGhhdCBpZiB3ZSBnb3QgSU5WQUxJRCBQQVJBTUVURVIgdGhlbiBlaXRoZXIgdGhpcworICAgKiBpcyBub3Qgc3VwcG9ydGVkIG9yIHdpbGwgd29yayBhbnl3YXkuIE5FMjAwMCBkb2VzIHRoaXMuCisgICAqLworICBpZiAocmVzdWx0ICE9IEVSUl9TVUNDRVNTICYmIHJlc3VsdCAhPSBFUlJfSU5WQUxJRF9QQVJBTUVURVIpCisgIHsKKyAgICBERUJVRzEgKCJTZXQgbG9va2FoZWFkIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7CisgICAgcmV0dXJuICgwKTsKKyAgfQorCisgIC8qIFNldCB0aGUgcGFja2V0IGZpbHRlci4gTm90ZSB0aGF0IGZvciBzb21lIG1lZGlhcyBhbmQgZHJpdmVycyB3ZQorICAgKiBtdXN0IHNwZWNpZnkgYWxsIHRocmVlIGZsYWdzIG9yIHRoZSBjYXJkKHMpIHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgorICAgKi8KKyAgcmVzdWx0ID0gTUFDX0RJU1BBVENIKGhhbmRsZSktPnJlcXVlc3QgKGNvbW1vbi5tb2R1bGVJZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwgcGFja2V0cyAqLyAgIEZJTFRFUl9QUk9NSVNDVU9VUyB8CisgICAgICAgICAgICAgICAgICAgICAgLyogcGFja2V0cyB0byB1cyAqLyBGSUxURVJfRElSRUNURUQgICAgfAorICAgICAgICAgICAgICAgICAgICAgIC8qIGJyb2FkY2FzdHMgKi8gICAgRklMVEVSX0JST0FEQ0FTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFJFUV9TRVRfUEFDS0VUX0ZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmNvbW1vbi0+bW9kdWxlRFMpOworICBpZiAocmVzdWx0ICE9IEVSUl9TVUNDRVNTKQorICB7CisgICAgREVCVUcxICgiU2V0IHBhY2tldCBmaWx0ZXIgZmFpbGVkOiAlc1xuIiwgTmRpc19zdHJlcnJvcihyZXN1bHQpKTsKKyAgICByZXR1cm4gKDApOworICB9CisKKyAgLyogSWYgT1BFTi9DTE9TRSBzdXBwb3J0ZWQgdGhlbiBvcGVuIHRoZSBhZGFwdGVyCisgICAqLworICBpZiAoTUFDX0NIQVIoaGFuZGxlKS0+c2VydmljZUZsYWdzICYgU0ZfT1BFTl9DTE9TRSkKKyAgeworICAgIHJlc3VsdCA9IE1BQ19ESVNQQVRDSChoYW5kbGUpLT5yZXF1ZXN0IChjb21tb24ubW9kdWxlSWQsIDAsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUV9PUEVOX0FEQVBURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmNvbW1vbi0+bW9kdWxlRFMpOworICAgIGlmIChyZXN1bHQgIT0gRVJSX1NVQ0NFU1MpCisgICAgeworICAgICAgREVCVUcxICgiT3BlbmluZyB0aGUgTUFDIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgfQorICByZXR1cm4gKDEpOworfQorCit2b2lkIE5kaXNTaHV0ZG93biAodm9pZCkKK3sKKyAgc3RydWN0IF9SZXFCbG9jayByZXFCbG9jazsKKyAgaW50ICAgICByZXN1bHQsIGk7CisKKyAgaWYgKCFoYW5kbGUpCisgICAgIHJldHVybjsKKworICAvKiBJZiB0aGUgYWRhcHRlcnMgc3VwcG9ydCBvcGVuIGFuZCBhcmUgb3BlbiB0aGVuIGNsb3NlIHRoZW0KKyAgICovCisgIGlmICgoTUFDX0NIQVIoaGFuZGxlKS0+c2VydmljZUZsYWdzICYgU0ZfT1BFTl9DTE9TRSkgJiYKKyAgICAgIChNQUNfU1RBVFVTKGhhbmRsZSktPm1hY1N0YXR1cyAmIE1BQ19PUEVOKSkKKyAgeworICAgIHJlc3VsdCA9IE1BQ19ESVNQQVRDSChoYW5kbGUpLT5yZXF1ZXN0IChjb21tb24ubW9kdWxlSWQsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUV9DTE9TRV9BREFQVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUtPmNvbW1vbi0+bW9kdWxlRFMpOworICAgIGlmIChyZXN1bHQgIT0gRVJSX1NVQ0NFU1MpCisgICAgeworICAgICAgcHJpbnRmICgiQ2xvc2luZyB0aGUgTUFDIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLyogVGVsbCB0aGUgUHJvdG9jb2wgTWFuYWdlciB0byB1bmJpbmQgYW5kIHN0b3AKKyAgICovCisgIHJlcUJsb2NrLm9wY29kZSAgID0gUE1fVU5CSU5EX0FORF9TVE9QOworICByZXFCbG9jay5wb2ludGVyMSA9IChCWVRFIEZBUiopICZmYWlsaW5nTW9kdWxlczsKKyAgcmVxQmxvY2sucG9pbnRlcjIgPSBOVUxMOworCisgIHJlc3VsdCA9ICgqcHJvdE1hbkVudHJ5KSAoJnJlcUJsb2NrLCBwcm90TWFuRFMpOworICBpZiAocmVzdWx0KQorICAgICBwcmludGYgKCJVbmJpbmQgZmFpbGVkOiAlc1xuIiwgIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7CisKKyAgZm9yIChpID0gMDsgaSA8IFNUQUNLX1BPT0xfU0laRTsgKytpKQorICAgICBmcmVlIChmcmVlU3RhY2tzW2ldIC0gU1RBQ0tfU0laRSk7CisKKyAgaGFuZGxlID0gTlVMTDsKK30KKworaW50IE5kaXNJbml0IChpbnQgcHJvbWlzKQoreworICBpbnQgaSwgcmVzdWx0OworCisgIC8qIEFsbG9jYXRlIHRoZSByZWFsIG1vZGUgc3RhY2tzIHVzZWQgZm9yIE5ESVMgY2FsbGJhY2tzCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgU1RBQ0tfUE9PTF9TSVpFOyArK2kpCisgIHsKKyAgICBmcmVlU3RhY2tzW2ldID0gbWFsbG9jIChTVEFDS19TSVpFKTsKKyAgICBpZiAoIWZyZWVTdGFja3NbaV0pCisgICAgICAgcmV0dXJuICgwKTsKKyAgICBmcmVlU3RhY2tzW2ldICs9IFNUQUNLX1NJWkU7CisgIH0KKworICBpZiAoIU5kaXNPcGVuKCkpCisgICAgIHJldHVybiAoMCk7CisKKyAgaWYgKCFOZGlzUmVnaXN0ZXJBbmRCaW5kKHByb21pcykpCisgICAgIHJldHVybiAoMCk7CisKKyAgREVCVUcxICgiTXkgbW9kdWxlIGlkOiAlZFxuIiwgY29tbW9uLm1vZHVsZUlkKTsKKyAgREVCVUcxICgiSGFuZGxlIGlkOyAgICAlZFxuIiwgaGFuZGxlLT5jb21tb24tPm1vZHVsZUlkKTsKKyAgREVCVUcxICgiTUFDIGNhcmQ6ICAgICAlLTE2cyAtICIsIGhhbmRsZS0+bW9kdWxlTmFtZSk7CisKKyAgYXRleGl0IChOZGlzU2h1dGRvd24pOworCisgIGlmICghQ2hlY2tNYWNGZWF0dXJlcygmaGFuZGxlKSkKKyAgICAgcmV0dXJuICgwKTsKKworICBzd2l0Y2ggKG1lZGlhVHlwZSkKKyAgeworICAgIGNhc2UgTUVESUFfRkRESToKKyAgICAgICAgIERFQlVHMCAoIk1lZGlhIHR5cGU6IEZEREkiKTsKKwkgYnJlYWs7CisgICAgY2FzZSBNRURJQV9FVEhFUk5FVDoKKyAgICAgICAgIERFQlVHMCAoIk1lZGlhIHR5cGU6IEVUSEVSTkVUIik7CisJIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgICBERUJVRzAgKCJVbnN1cHBvcnRlZCBtZWRpYS5cbiIpOworICAgICAgICAgcmV0dXJuICgwKTsKKyAgfQorCisgIERFQlVHMSAoIiAtIEZyYW1lIHNpemU6ICVkXG4iLCBmcmFtZVNpemUpOworCisgIGlmICghTmRpc1N0YXJ0TWFjKCZoYW5kbGUpKQorICAgICByZXR1cm4gKDApOworICByZXR1cm4gKDEpOworfQorI2VuZGlmICAvKiBVU0VfTkRJUzIgKi8KKwpkaWZmIC0tZ2l0IGEvbXNkb3MvbmRpczIuaCBiL21zZG9zL25kaXMyLmgKaW5kZXggZGM3MmY0Yy4uZjI3OGI1ZCAxMDA2NDQKLS0tIGEvbXNkb3MvbmRpczIuaAorKysgYi9tc2Rvcy9uZGlzMi5oCkBAIC0xLDU1OSArMSw1NTkgQEAKLS8qIA0KLSAqIENvcHlyaWdodCAoYykgMTk5MywxOTk0DQotICogICAgICBUZXhhcyBBJk0gVW5pdmVyc2l0eS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoNCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCi0gKiBhcmUgbWV0Og0KLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0DQotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQ0KLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlDQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50Og0KLSAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBUZXhhcyBBJk0gVW5pdmVyc2l0eQ0KLSAqICAgICAgYW5kIGl0cyBjb250cmlidXRvcnMuDQotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMNCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUNCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0gKg0KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFVOSVZFUlNJVFkgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EDQotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UNCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBVTklWRVJTSVRZIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUNCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTA0KLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTDQotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pDQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QNCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZDQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRg0KLSAqIFNVQ0ggREFNQUdFLg0KLSAqDQotICogRGV2ZWxvcGVyczoNCi0gKiAgICAgICAgICAgICBEYXZpZCBLLiBIZXNzLCBEb3VnbGFzIExlZSBTY2hhbGVzLCBEYXZpZCBSLiBTYWZmb3JkDQotICoNCi0gKiBIZWF2aWx5IG1vZGlmaWVkIGZvciBNZXRhd2FyZSBIaWdoQyArIEdOVSBDIDIuOCsNCi0gKiAgICAgICAgICAgICBHaXNsZSBWYW5lbSAxOTk4DQotICovDQotDQotI2lmbmRlZiBfX1BDQVBfTkRJU19IDQotI2RlZmluZSBfX1BDQVBfTkRJU19IDQotDQotI2lmIGRlZmluZWQgKF9fSElHSENfXykNCi0gICNkZWZpbmUgcGFzY2FsICAgICAgICAgIF9DQyhfQ0FMTEVFX1BPUFNfU1RBQ0sgJiB+X1JFVkVSU0VfUEFSTVMpIC8qIGNhbGxpbmcgY29udmVudGlvbiAqLw0KLSAgI2RlZmluZSBDQUxMQkFDSyhmb28pICAgcGFzY2FsIFdPUkQgZm9vDQotICAjZGVmaW5lIFBBU19QVFIoeCxhcmcpICB0eXBlZGVmIEZBUiBXT1JEIHBhc2NhbCAoKngpIGFyZw0KLSAgI2RlZmluZSBHVUFSRCgpICAgICAgICAgX2lubGluZSAoMHg5QywweEZBKSAgIC8qIHB1c2hmZCwgY2xpICovDQotICAjZGVmaW5lIFVOR1VBUkQoKSAgICAgICBfaW5saW5lICgweDlEKSAgICAgICAgLyogcG9wZmQgKi8NCi0gICNkZWZpbmUgRkFSICAgICAgICAgICAgIF9mYXINCi0NCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKQ0KLSAgI2RlZmluZSBDQUxMQkFDSyhmb28pICAgV09SRCBmb28gX19hdHRyaWJ1dGVfXygoc3RkY2FsbCkpDQotICAjZGVmaW5lIFBBU19QVFIoeCxhcmcpICB0eXBlZGVmIFdPUkQgKCp4KSBhcmcgX19hdHRyaWJ1dGVfXygoc3RkY2FsbCkpDQotICAjZGVmaW5lIEdVQVJEKCkgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInB1c2hmZDsgY2xpIikNCi0gICNkZWZpbmUgVU5HVUFSRCgpICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgicG9wZmQiKQ0KLSAgI2RlZmluZSBGQVINCi0NCi0jZWxpZiBkZWZpbmVkIChfX1RVUkJPQ19fKQ0KLSAgI2RlZmluZSBDQUxMQkFDSyhmb28pICAgV09SRCBwYXNjYWwgZm9vDQotICAjZGVmaW5lIFBBU19QVFIoeCxhcmcpICB0eXBlZGVmIFdPUkQgcGFzY2FsIChfZmFyICp4KSBhcmcNCi0gICNkZWZpbmUgR1VBUkQoKSAgICAgICAgIF9hc20geyBwdXNoZjsgY2xpIH0NCi0gICNkZWZpbmUgVU5HVUFSRCgpICAgICAgIF9hc20geyBwb3BmIH0NCi0gICNkZWZpbmUgRkFSICAgICAgICAgICAgIF9mYXINCi0NCi0jZWxpZiBkZWZpbmVkIChfX1dBVENPTUNfXykNCi0gICNkZWZpbmUgQ0FMTEJBQ0soZm9vKSAgIFdPUkQgcGFzY2FsIGZvbw0KLSAgI2RlZmluZSBQQVNfUFRSKHgsYXJnKSAgdHlwZWRlZiBXT1JEIHBhc2NhbCAoX2ZhciAqeCkgYXJnDQotICAjZGVmaW5lIEdVQVJEKCkgICAgICAgICBfZGlzYWJsZSgpDQotICAjZGVmaW5lIFVOR1VBUkQoKSAgICAgICBfZW5hYmxlKCkNCi0gICNkZWZpbmUgRkFSICAgICAgICAgICAgIF9mYXINCi0NCi0jZWxzZQ0KLSAgI2Vycm9yIFVuc3VwcG9ydGVkIGNvbXBpbGVyDQotI2VuZGlmDQotDQotDQotLyoNCi0gKiAgRm9yd2FyZHMNCi0gKi8NCi1zdHJ1Y3QgX1JlcUJsb2NrOw0KLXN0cnVjdCBfVHhCdWZEZXNjcjsNCi1zdHJ1Y3QgX1REQnVmRGVzY3I7DQotDQotLyoNCi0gKiBQcm90b2NvbCBNYW5hZ2VyIEFQSQ0KLSAqLw0KLVBBU19QVFIgKFByb3RNYW4sIChzdHJ1Y3QgX1JlcUJsb2NrIEZBUiosIFdPUkQpKTsNCi0NCi0vKg0KLSAqIFN5c3RlbSByZXF1ZXN0DQotICovDQotUEFTX1BUUiAoU3lzdGVtUmVxdWVzdCwgKERXT1JELCBEV09SRCwgV09SRCwgV09SRCwgV09SRCkpOw0KLQ0KLS8qDQotICogTUFDIEFQSQ0KLSAqLw0KLVBBU19QVFIgKFRyYW5zbWl0Q2hhaW4sIChXT1JELCBXT1JELCBzdHJ1Y3QgX1R4QnVmRGVzY3IgRkFSKiwgV09SRCkpOw0KLVBBU19QVFIgKFRyYW5zZmVyRGF0YSwgIChXT1JEKixXT1JELCBzdHJ1Y3QgX1REQnVmRGVzY3IgRkFSKiwgV09SRCkpOw0KLVBBU19QVFIgKFJlcXVlc3QsICAgICAgIChXT1JELCBXT1JELCBXT1JELCBEV09SRCwgV09SRCwgV09SRCkpOw0KLVBBU19QVFIgKFJlY2VpdmVSZWxlYXNlLChXT1JELCBXT1JEKSk7DQotUEFTX1BUUiAoSW5kaWNhdGlvbk9uLCAgKFdPUkQpKTsNCi1QQVNfUFRSIChJbmRpY2F0aW9uT2ZmLCAoV09SRCkpOw0KLQ0KLQ0KLXR5cGVkZWYgZW51bSB7DQotICAgICAgICBIQVJEV0FSRV9OT1RfSU5TVEFMTEVEICA9IDAsDQotICAgICAgICBIQVJEV0FSRV9GQUlMRURfRElBRyAgICA9IDEsDQotICAgICAgICBIQVJEV0FSRV9GQUlMRURfQ09ORklHICA9IDIsDQotICAgICAgICBIQVJEV0FSRV9IQVJEX0ZBVUxUICAgICA9IDMsDQotICAgICAgICBIQVJEV0FSRV9TT0ZUX0ZBVUxUICAgICA9IDQsDQotICAgICAgICBIQVJEV0FSRV9PSyAgICAgICAgICAgICA9IDcsDQotICAgICAgICBIQVJEV0FSRV9NQVNLICAgICAgICAgICA9IDB4MDAwNywNCi0gICAgICAgIE1BQ19CT1VORCAgICAgICAgICAgICAgID0gMHgwMDA4LA0KLSAgICAgICAgTUFDX09QRU4gICAgICAgICAgICAgICAgPSAweDAwMTAsDQotICAgICAgICBESUFHX0lOX1BST0dSRVNTICAgICAgICA9IDB4MDAyMA0KLSAgICAgIH0gTmRpc01hY1N0YXR1czsNCi0NCi10eXBlZGVmIGVudW0gew0KLSAgICAgICAgU1RBVFVTX1JJTkdfU1RBVFVTICAgICAgPSAxLA0KLSAgICAgICAgU1RBVFVTX0FEQVBURVJfQ0hFQ0sgICAgPSAyLA0KLSAgICAgICAgU1RBVFVTX1NUQVJUX1JFU0VUICAgICAgPSAzLA0KLSAgICAgICAgU1RBVFVTX0lOVEVSUlVQVCAgICAgICAgPSA0LA0KLSAgICAgICAgU1RBVFVTX0VORF9SRVNFVCAgICAgICAgPSA1DQotICAgICAgfSBOZGlzU3RhdHVzOw0KLQ0KLXR5cGVkZWYgZW51bSB7DQotICAgICAgICBGSUxURVJfRElSRUNURUQgICAgICAgICA9IDEsDQotICAgICAgICBGSUxURVJfQlJPQURDQVNUICAgICAgICA9IDIsDQotICAgICAgICBGSUxURVJfUFJPTUlTQ1VPVVMgICAgICA9IDQsDQotICAgICAgICBGSUxURVJfU09VUkNFX1JPVVRFICAgICA9IDgNCi0gICAgICB9IE5kaXNQYWNrZXRGaWx0ZXI7DQotDQotdHlwZWRlZiBlbnVtIHsNCi0gICAgICAgIFJFUV9JTklUSUFURV9ESUFHTk9TVElDUyAgICAgPSAxLA0KLSAgICAgICAgUkVRX1JFQURfRVJST1JfTE9HICAgICAgICAgICA9IDIsDQotICAgICAgICBSRVFfU0VUX1NUQVRJT05fQUREUkVTUyAgICAgID0gMywNCi0gICAgICAgIFJFUV9PUEVOX0FEQVBURVIgICAgICAgICAgICAgPSA0LA0KLSAgICAgICAgUkVRX0NMT1NFX0FEQVBURVIgICAgICAgICAgICA9IDUsDQotICAgICAgICBSRVFfUkVTRVRfTUFDICAgICAgICAgICAgICAgID0gNiwNCi0gICAgICAgIFJFUV9TRVRfUEFDS0VUX0ZJTFRFUiAgICAgICAgPSA3LA0KLSAgICAgICAgUkVRX0FERF9NVUxUSUNBU1RfQUREUkVTUyAgICA9IDgsDQotICAgICAgICBSRVFfREVMRVRFX01VTFRJQ0FTVF9BRERSRVNTID0gOSwNCi0gICAgICAgIFJFUV9VUERBVEVfU1RBVElTVElDUyAgICAgICAgPSAxMCwNCi0gICAgICAgIFJFUV9DTEVBUl9TVEFUSVNUSUNTICAgICAgICAgPSAxMSwNCi0gICAgICAgIFJFUV9JTlRFUlJVUFRfUkVRVUVTVCAgICAgICAgPSAxMiwNCi0gICAgICAgIFJFUV9TRVRfRlVOQ1RJT05BTF9BRERSRVNTICAgPSAxMywNCi0gICAgICAgIFJFUV9TRVRfTE9PS0FIRUFEICAgICAgICAgICAgPSAxNA0KLSAgICAgIH0gTmRpc0dlbmVyYWxSZXF1ZXN0Ow0KLQ0KLXR5cGVkZWYgZW51bSB7DQotICAgICAgICBTRl9CUk9BRENBU1QgICAgICAgICAgICAgPSAweDAwMDAwMDAxTCwNCi0gICAgICAgIFNGX01VTFRJQ0FTVCAgICAgICAgICAgICA9IDB4MDAwMDAwMDJMLA0KLSAgICAgICAgU0ZfRlVOQ1RJT05BTCAgICAgICAgICAgID0gMHgwMDAwMDAwNEwsDQotICAgICAgICBTRl9QUk9NSVNDVU9VUyAgICAgICAgICAgPSAweDAwMDAwMDA4TCwNCi0gICAgICAgIFNGX1NPRlRfQUREUkVTUyAgICAgICAgICA9IDB4MDAwMDAwMTBMLA0KLSAgICAgICAgU0ZfU1RBVFNfQ1VSUkVOVCAgICAgICAgID0gMHgwMDAwMDAyMEwsDQotICAgICAgICBTRl9JTklUSUFURV9ESUFHUyAgICAgICAgPSAweDAwMDAwMDQwTCwNCi0gICAgICAgIFNGX0xPT1BCQUNLICAgICAgICAgICAgICA9IDB4MDAwMDAwODBMLA0KLSAgICAgICAgU0ZfUkVDRUlWRV9DSEFJTiAgICAgICAgID0gMHgwMDAwMDEwMEwsDQotICAgICAgICBTRl9TT1VSQ0VfUk9VVElORyAgICAgICAgPSAweDAwMDAwMjAwTCwNCi0gICAgICAgIFNGX1JFU0VUX01BQyAgICAgICAgICAgICA9IDB4MDAwMDA0MDBMLA0KLSAgICAgICAgU0ZfT1BFTl9DTE9TRSAgICAgICAgICAgID0gMHgwMDAwMDgwMEwsDQotICAgICAgICBTRl9JTlRFUlJVUFRfUkVRVUVTVCAgICAgPSAweDAwMDAxMDAwTCwNCi0gICAgICAgIFNGX1NPVVJDRV9ST1VUSU5HX0JSSURHRSA9IDB4MDAwMDIwMDBMLA0KLSAgICAgICAgU0ZfVklSVFVBTF9BRERSRVNTRVMgICAgID0gMHgwMDAwNDAwMEwNCi0gICAgICB9IE5kaXNNYWNTZXJ2aWNlRmxhZ3M7DQotDQotdHlwZWRlZiBlbnVtIHsNCi0gICAgICAgIFJFUV9JTklUSUFURV9CSU5EICAgICAgICA9IDEsDQotICAgICAgICBSRVFfQklORCAgICAgICAgICAgICAgICAgPSAyLA0KLSAgICAgICAgUkVRX0lOSVRJQVRFX1BSRUJJTkQgICAgID0gMywNCi0gICAgICAgIFJFUV9JTklUSUFURV9VTkJJTkQgICAgICA9IDQsDQotICAgICAgICBSRVFfVU5CSU5EICAgICAgICAgICAgICAgPSA1DQotICAgICAgfSBOZGlzU3lzUmVxdWVzdDsNCi0NCi10eXBlZGVmIGVudW0gIHsNCi0gICAgICAgIFBNX0dFVF9QUk9UT0NPTF9NQU5BR0VSX0lORk8gICAgICA9IDEsDQotICAgICAgICBQTV9SRUdJU1RFUl9NT0RVTEUgICAgICAgICAgICAgICAgPSAyLA0KLSAgICAgICAgUE1fQklORF9BTkRfU1RBUlQgICAgICAgICAgICAgICAgID0gMywNCi0gICAgICAgIFBNX0dFVF9QUk9UT0NPTF9NQU5BR0VSX0xJTktBR0UgICA9IDQsDQotICAgICAgICBQTV9HRVRfUFJPVE9DT0xfSU5JX1BBVEggICAgICAgICAgPSA1LA0KLSAgICAgICAgUE1fUkVHSVNURVJfUFJPVE9DT0xfTUFOQUdFUl9JTkZPID0gNiwNCi0gICAgICAgIFBNX0lOSVRfQU5EX1JFR0lTVEVSICAgICAgICAgICAgICA9IDcsDQotICAgICAgICBQTV9VTkJJTkRfQU5EX1NUT1AgICAgICAgICAgICAgICAgPSA4LA0KLSAgICAgICAgUE1fQklORF9TVEFUVVMgICAgICAgICAgICAgICAgICAgID0gOSwNCi0gICAgICAgIFBNX1JFR0lTVEVSX1NUQVRVUyAgICAgICAgICAgICAgICA9IDEwDQotICAgICAgfSBOZGlzUHJvdE1hbmFnZXI7DQotDQotDQotdHlwZWRlZiBlbnVtIHsNCi0gICAgICAgIEVSUl9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgID0gMHgwMCwNCi0gICAgICAgIEVSUl9XQUlUX0ZPUl9SRUxFQVNFICAgICAgICAgICAgID0gMHgwMSwNCi0gICAgICAgIEVSUl9SRVFVRVNUX1FVRVVFRCAgICAgICAgICAgICAgID0gMHgwMiwNCi0gICAgICAgIEVSUl9GUkFNRV9OT1RfUkVDT0dOSVpFRCAgICAgICAgID0gMHgwMywNCi0gICAgICAgIEVSUl9GUkFNRV9SRUpFQ1RFRCAgICAgICAgICAgICAgID0gMHgwNCwNCi0gICAgICAgIEVSUl9GT1JXQVJEX0ZSQU1FICAgICAgICAgICAgICAgID0gMHgwNSwNCi0gICAgICAgIEVSUl9PVVRfT0ZfUkVTT1VSQ0UgICAgICAgICAgICAgID0gMHgwNiwNCi0gICAgICAgIEVSUl9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAgICAgID0gMHgwNywNCi0gICAgICAgIEVSUl9JTlZBTElEX0ZVTkNUSU9OICAgICAgICAgICAgID0gMHgwOCwNCi0gICAgICAgIEVSUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgID0gMHgwOSwNCi0gICAgICAgIEVSUl9IQVJEV0FSRV9FUlJPUiAgICAgICAgICAgICAgID0gMHgwQSwNCi0gICAgICAgIEVSUl9UUkFOU01JVF9FUlJPUiAgICAgICAgICAgICAgID0gMHgwQiwNCi0gICAgICAgIEVSUl9OT19TVUNIX0RFU1RJTkFUSU9OICAgICAgICAgID0gMHgwQywNCi0gICAgICAgIEVSUl9CVUZGRVJfVE9PX1NNQUxMICAgICAgICAgICAgID0gMHgwRCwNCi0gICAgICAgIEVSUl9BTFJFQURZX1NUQVJURUQgICAgICAgICAgICAgID0gMHgyMCwNCi0gICAgICAgIEVSUl9JTkNPTVBMRVRFX0JJTkRJTkcgICAgICAgICAgID0gMHgyMSwNCi0gICAgICAgIEVSUl9EUklWRVJfTk9UX0lOSVRJQUxJWkVEICAgICAgID0gMHgyMiwNCi0gICAgICAgIEVSUl9IQVJEV0FSRV9OT1RfRk9VTkQgICAgICAgICAgID0gMHgyMywNCi0gICAgICAgIEVSUl9IQVJEV0FSRV9GQUlMVVJFICAgICAgICAgICAgID0gMHgyNCwNCi0gICAgICAgIEVSUl9DT05GSUdVUkFUSU9OX0ZBSUxVUkUgICAgICAgID0gMHgyNSwNCi0gICAgICAgIEVSUl9JTlRFUlJVUFRfQ09ORkxJQ1QgICAgICAgICAgID0gMHgyNiwNCi0gICAgICAgIEVSUl9JTkNPTVBBVElCTEVfTUFDICAgICAgICAgICAgID0gMHgyNywNCi0gICAgICAgIEVSUl9JTklUSUFMSVpBVElPTl9GQUlMRUQgICAgICAgID0gMHgyOCwNCi0gICAgICAgIEVSUl9OT19CSU5ESU5HICAgICAgICAgICAgICAgICAgID0gMHgyOSwNCi0gICAgICAgIEVSUl9ORVRXT1JLX01BWV9OT1RfQkVfQ09OTkVDVEVEID0gMHgyQSwNCi0gICAgICAgIEVSUl9JTkNPTVBBVElCTEVfT1NfVkVSU0lPTiAgICAgID0gMHgyQiwNCi0gICAgICAgIEVSUl9BTFJFQURZX1JFR0lTVEVSRUQgICAgICAgICAgID0gMHgyQywNCi0gICAgICAgIEVSUl9QQVRIX05PVF9GT1VORCAgICAgICAgICAgICAgID0gMHgyRCwNCi0gICAgICAgIEVSUl9JTlNVRkZJQ0lFTlRfTUVNT1JZICAgICAgICAgID0gMHgyRSwNCi0gICAgICAgIEVSUl9JTkZPX05PVF9GT1VORCAgICAgICAgICAgICAgID0gMHgyRiwNCi0gICAgICAgIEVSUl9HRU5FUkFMX0ZBSUxVUkUgICAgICAgICAgICAgID0gMHhGRg0KLSAgICAgIH0gTmRpc0Vycm9yOw0KLQ0KLSNkZWZpbmUgTkRJU19QQVJBTV9JTlRFR0VSICAgMA0KLSNkZWZpbmUgTkRJU19QQVJBTV9TVFJJTkcgICAgMQ0KLQ0KLSNkZWZpbmUgTkRJU19UWF9CVUZfTEVOR1RIICAgOA0KLSNkZWZpbmUgTkRJU19URF9CVUZfTEVOR1RIICAgMQ0KLSNkZWZpbmUgTkRJU19SWF9CVUZfTEVOR1RIICAgOA0KLQ0KLSNkZWZpbmUgTkRJU19QVFJfUEhZU0lDQUwgICAgMA0KLSNkZWZpbmUgTkRJU19QVFJfVklSVFVBTCAgICAgMg0KLQ0KLSNkZWZpbmUgTkRJU19QQVRIICAgICJQUk9UTUFOJCINCi0NCi0NCi10eXBlZGVmIHN0cnVjdCBfQ29tbW9uQ2hhcnMgew0KLSAgICAgICAgV09SRCAgdGFibGVTaXplOw0KLSAgICAgICAgQllURSAgbWFqb3JOZGlzVmVyc2lvbjsgICAgICAgIC8qIDIgLSBMYXRlc3QgdmVyc2lvbiAqLw0KLSAgICAgICAgQllURSAgbWlub3JOZGlzVmVyc2lvbjsgICAgICAgIC8qIDAgICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgV09SRCAgcmVzZXJ2ZWQxOw0KLSAgICAgICAgQllURSAgbWFqb3JNb2R1bGVWZXJzaW9uOw0KLSAgICAgICAgQllURSAgbWlub3JNb2R1bGVWZXJzaW9uOw0KLSAgICAgICAgRFdPUkQgbW9kdWxlRmxhZ3M7DQotICAgICAgICAvKiAwIC0gQmluZGluZyBhdCB1cHBlciBib3VuZGFyeSBzdXBwb3J0ZWQNCi0gICAgICAgICAqIDEgLSBCaW5kaW5nIGF0IGxvd2VyIGJvdW5kYXJ5IHN1cHBvcnRlZA0KLSAgICAgICAgICogMiAtIER5bmFtaWNhbGx5IGJvdW5kLg0KLSAgICAgICAgICogMy0zMSAtIFJlc2VydmVkLCBtdXN0IGJlIHplcm8uDQotICAgICAgICAgKi8NCi0gICAgICAgIEJZVEUgIG1vZHVsZU5hbWVbMTZdOw0KLSAgICAgICAgQllURSAgcHJvdG9jb2xMZXZlbFVwcGVyOw0KLSAgICAgICAgLyogMSAtIE1BQw0KLSAgICAgICAgICogMiAtIERhdGEgTGluaw0KLSAgICAgICAgICogMyAtIE5ldHdvcmsNCi0gICAgICAgICAqIDQgLSBUcmFuc3BvcnQNCi0gICAgICAgICAqIDUgLSBTZXNzaW9uDQotICAgICAgICAgKiAtMSAtIE5vdCBzcGVjaWZpZWQNCi0gICAgICAgICAqLw0KLSAgICAgICAgQllURSAgaW50ZXJmYWNlVXBwZXI7DQotICAgICAgICBCWVRFICBwcm90b2NvbExldmVsTG93ZXI7DQotICAgICAgICAvKiAwIC0gUGh5c2ljYWwNCi0gICAgICAgICAqIDEgLSBNQUMNCi0gICAgICAgICAqIDIgLSBEYXRhIExpbmsNCi0gICAgICAgICAqIDMgLSBOZXR3b3JrDQotICAgICAgICAgKiA0IC0gVHJhbnNwb3J0DQotICAgICAgICAgKiA1IC0gU2Vzc2lvbg0KLSAgICAgICAgICogLTEgLSBOb3Qgc3BlY2lmaWVkDQotICAgICAgICAgKi8NCi0gICAgICAgIEJZVEUgIGludGVyZmFjZUxvd2VyOw0KLSAgICAgICAgV09SRCAgbW9kdWxlSWQ7DQotICAgICAgICBXT1JEICBtb2R1bGVEUzsNCi0gICAgICAgIFN5c3RlbVJlcXVlc3Qgc3lzdGVtUmVxdWVzdDsNCi0gICAgICAgIEJZVEUgKnNlcnZpY2VDaGFyczsNCi0gICAgICAgIEJZVEUgKnNlcnZpY2VTdGF0dXM7DQotICAgICAgICBCWVRFICp1cHBlckRpc3BhdGNoVGFibGU7DQotICAgICAgICBCWVRFICpsb3dlckRpc3BhdGNoVGFibGU7DQotICAgICAgICBCWVRFICpyZXNlcnZlZDI7ICAgICAgICAgICAgLyogTXVzdCBiZSBOVUxMICovDQotICAgICAgICBCWVRFICpyZXNlcnZlZDM7ICAgICAgICAgICAgLyogTXVzdCBiZSBOVUxMICovDQotICAgICAgfSBDb21tb25DaGFyczsNCi0NCi0NCi10eXBlZGVmIHN0cnVjdCBfTXVsdGljYXN0TGlzdCB7DQotICAgICAgICBXT1JEICAgbWF4TXVsdGljYXN0QWRkcmVzc2VzOw0KLSAgICAgICAgV09SRCAgIG51bWJlck11bHRpY2FzdEFkZHJlc3NlczsNCi0gICAgICAgIEJZVEUgICBtdWx0aWNhc3RBZGRyZXNzWzE2XVsxNl07DQotICAgICAgfSBNdWx0aWNhc3RMaXN0Ow0KLQ0KLQ0KLXR5cGVkZWYgc3RydWN0IF9NYWNDaGFycyB7DQotICAgICAgICBXT1JEICAgdGFibGVTaXplOw0KLSAgICAgICAgQllURSAgIG1hY05hbWVbMTZdOw0KLSAgICAgICAgV09SRCAgIGFkZHJlc3NMZW5ndGg7DQotICAgICAgICBCWVRFICAgcGVybWFuZW50QWRkcmVzc1sxNl07DQotICAgICAgICBCWVRFICAgY3VycmVudEFkZHJlc3NbMTZdOw0KLSAgICAgICAgRFdPUkQgIGN1cnJlbnRGdW5jdGlvbmFsQWRkcmVzczsNCi0gICAgICAgIE11bHRpY2FzdExpc3QgKm11bHRpY2FzdExpc3Q7DQotICAgICAgICBEV09SRCAgbGlua1NwZWVkOw0KLSAgICAgICAgRFdPUkQgIHNlcnZpY2VGbGFnczsNCi0gICAgICAgIFdPUkQgICBtYXhGcmFtZVNpemU7DQotICAgICAgICBEV09SRCAgdHhCdWZmZXJTaXplOw0KLSAgICAgICAgV09SRCAgIHR4QnVmZmVyQWxsb2NTaXplOw0KLSAgICAgICAgRFdPUkQgIHJ4QnVmZmVyU2l6ZTsNCi0gICAgICAgIFdPUkQgICByeEJ1ZmZlckFsbG9jU2l6ZTsNCi0gICAgICAgIEJZVEUgICBpZWVlVmVuZG9yWzNdOw0KLSAgICAgICAgQllURSAgIHZlbmRvckFkYXB0ZXI7DQotICAgICAgICBCWVRFICAqdmVuZG9yQWRhcHRlckRlc2NyaXB0aW9uOw0KLSAgICAgICAgV09SRCAgIGludGVycnVwdExldmVsOw0KLSAgICAgICAgV09SRCAgIHR4UXVldWVEZXB0aDsNCi0gICAgICAgIFdPUkQgICBtYXhEYXRhQmxvY2tzOw0KLSAgICAgIH0gTWFjQ2hhcnM7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QgX1Byb3RvY29sQ2hhcnMgew0KLSAgICAgICAgV09SRCAgIGxlbmd0aDsNCi0gICAgICAgIEJZVEUgICBuYW1lWzE2XTsNCi0gICAgICAgIFdPUkQgICB0eXBlOw0KLSAgICAgIH0gUHJvdG9jb2xDaGFyczsNCi0NCi0NCi10eXBlZGVmIHN0cnVjdCBfTWFjVXBwZXJEaXNwYXRjaCB7DQotICAgICAgICBDb21tb25DaGFycyAgICAgICpiYWNrUG9pbnRlcjsNCi0gICAgICAgIFJlcXVlc3QgICAgICAgICAgIHJlcXVlc3Q7DQotICAgICAgICBUcmFuc21pdENoYWluICAgICB0cmFuc21pdENoYWluOw0KLSAgICAgICAgVHJhbnNmZXJEYXRhICAgICAgdHJhbnNmZXJEYXRhOw0KLSAgICAgICAgUmVjZWl2ZVJlbGVhc2UgICAgcmVjZWl2ZVJlbGVhc2U7DQotICAgICAgICBJbmRpY2F0aW9uT24gICAgICBpbmRpY2F0aW9uT247DQotICAgICAgICBJbmRpY2F0aW9uT2ZmICAgICBpbmRpY2F0aW9uT2ZmOw0KLSAgICAgIH0gTWFjVXBwZXJEaXNwYXRjaDsNCi0NCi0NCi10eXBlZGVmIHN0cnVjdCBfTWFjU3RhdHVzVGFibGUgew0KLSAgICAgICAgV09SRCAgIHRhYmxlU2l6ZTsNCi0gICAgICAgIERXT1JEICBsYXN0RGlhZzsNCi0gICAgICAgIERXT1JEICBtYWNTdGF0dXM7DQotICAgICAgICBXT1JEICAgcGFja2V0RmlsdGVyOw0KLSAgICAgICAgQllURSAgKm1lZGlhU3BlY2lmaWNTdGF0czsNCi0gICAgICAgIERXT1JEICBsYXN0Q2xlYXI7DQotICAgICAgICBEV09SRCAgdG90YWxGcmFtZXNSeDsNCi0gICAgICAgIERXT1JEICB0b3RhbEZyYW1lc0NyYzsNCi0gICAgICAgIERXT1JEICB0b3RhbEJ5dGVzUng7DQotICAgICAgICBEV09SRCAgdG90YWxEaXNjYXJkQnVmU3BhY2VSeDsNCi0gICAgICAgIERXT1JEICB0b3RhbE11bHRpY2FzdFJ4Ow0KLSAgICAgICAgRFdPUkQgIHRvdGFsQnJvYWRjYXN0Ung7DQotICAgICAgICBEV09SRCAgb2Jzb2xldGUxWzVdOw0KLSAgICAgICAgRFdPUkQgIHRvdGFsRGlzY2FyZEh3RXJyb3JSeDsNCi0gICAgICAgIERXT1JEICB0b3RhbEZyYW1lc1R4Ow0KLSAgICAgICAgRFdPUkQgIHRvdGFsQnl0ZXNUeDsNCi0gICAgICAgIERXT1JEICB0b3RhbE11bHRpY2FzdFR4Ow0KLSAgICAgICAgRFdPUkQgIHRvdGFsQnJvYWRjYXN0VHg7DQotICAgICAgICBEV09SRCAgb2Jzb2xldGUyWzJdOw0KLSAgICAgICAgRFdPUkQgIHRvdGFsRGlzY2FyZFRpbWVvdXRUeDsNCi0gICAgICAgIERXT1JEICB0b3RhbERpc2NhcmRId0Vycm9yVHg7DQotICAgICAgfSBNYWNTdGF0dXNUYWJsZTsNCi0NCi0NCi10eXBlZGVmIHN0cnVjdCBfUHJvdERpc3BhdGNoIHsNCi0gICAgICAgIENvbW1vbkNoYXJzICpiYWNrUG9pbnRlcjsNCi0gICAgICAgIERXT1JEICAgICAgICBmbGFnczsNCi0gICAgICAgIC8qIDAgLSBoYW5kbGVzIG5vbi1MTEMgZnJhbWVzDQotICAgICAgICAgKiAxIC0gaGFuZGxlcyBzcGVjaWZpYy1MU0FQIExMQyBmcmFtZXMNCi0gICAgICAgICAqIDIgLSBoYW5kbGVzIHNwZWNpZmljLUxTQVAgTExDIGZyYW1lcw0KLSAgICAgICAgICogMy0zMSAtIHJlc2VydmVkIG11c3QgYmUgMA0KLSAgICAgICAgICovDQotICAgICAgICB2b2lkICAoKnJlcXVlc3RDb25maXJtKSAodm9pZCk7DQotICAgICAgICB2b2lkICAoKnRyYW5zbWl0Q29uZmlybSkgKHZvaWQpOw0KLSAgICAgICAgdm9pZCAgKCpyZWNlaXZlTG9va2FoZWFkKSAodm9pZCk7DQotICAgICAgICB2b2lkICAoKmluZGljYXRpb25Db21wbGV0ZSkgKHZvaWQpOw0KLSAgICAgICAgdm9pZCAgKCpyZWNlaXZlQ2hhaW4pICh2b2lkKTsNCi0gICAgICAgIHZvaWQgICgqc3RhdHVzKSAodm9pZCk7DQotICAgICAgfSBQcm90RGlzcGF0Y2g7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QgX1JlcUJsb2NrIHsNCi0gICAgICAgIFdPUkQgICAgICBvcGNvZGU7DQotICAgICAgICBXT1JEICAgICAgc3RhdHVzOw0KLSAgICAgICAgQllURSBGQVIgKnBvaW50ZXIxOw0KLSAgICAgICAgQllURSBGQVIgKnBvaW50ZXIyOw0KLSAgICAgICAgV09SRCAgICAgIHdvcmQxOw0KLSAgICAgIH0gUmVxQmxvY2s7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QgX1R4QnVmRGVzY3JSZWMgew0KLSAgICAgICAgQllURSAgIHR4UHRyVHlwZTsNCi0gICAgICAgIEJZVEUgICBkdW1teTsNCi0gICAgICAgIFdPUkQgICB0eERhdGFMZW47DQotICAgICAgICBCWVRFICAqdHhEYXRhUHRyOw0KLSAgICAgIH0gVHhCdWZEZXNjclJlYzsNCi0NCi0NCi10eXBlZGVmIHN0cnVjdCBfVHhCdWZEZXNjciB7DQotICAgICAgICBXT1JEICAgICAgICAgIHR4SW1tZWRMZW47DQotICAgICAgICBCWVRFICAgICAgICAgKnR4SW1tZWRQdHI7DQotICAgICAgICBXT1JEICAgICAgICAgIHR4RGF0YUNvdW50Ow0KLSAgICAgICAgVHhCdWZEZXNjclJlYyB0eEJ1ZkRlc2NyUmVjW05ESVNfVFhfQlVGX0xFTkdUSF07DQotICAgICAgfSBUeEJ1ZkRlc2NyOw0KLQ0KLQ0KLXR5cGVkZWYgc3RydWN0IF9UREJ1ZkRlc2NyUmVjIHsNCi0gICAgICAgIEJZVEUgICB0RFB0clR5cGU7DQotICAgICAgICBCWVRFICAgZHVtbXk7DQotICAgICAgICBXT1JEICAgdEREYXRhTGVuOw0KLSAgICAgICAgQllURSAgKnRERGF0YVB0cjsNCi0gICAgICB9IFREQnVmRGVzY3JSZWM7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QgX1REQnVmRGVzY3Igew0KLSAgICAgICAgV09SRCAgICAgICAgICB0RERhdGFDb3VudDsNCi0gICAgICAgIFREQnVmRGVzY3JSZWMgdERCdWZEZXNjclJlY1tORElTX1REX0JVRl9MRU5HVEhdOw0KLSAgICAgIH0gVERCdWZEZXNjcjsNCi0NCi0NCi10eXBlZGVmIHN0cnVjdCBfUnhCdWZEZXNjclJlYyB7DQotICAgICAgICBXT1JEICAgcnhEYXRhTGVuOw0KLSAgICAgICAgQllURSAgKnJ4RGF0YVB0cjsNCi0gICAgICB9IFJ4QnVmRGVzY3JSZWM7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QgX1J4QnVmRGVzY3Igew0KLSAgICAgICAgV09SRCAgICAgICAgICByeERhdGFDb3VudDsNCi0gICAgICAgIFJ4QnVmRGVzY3JSZWMgcnhCdWZEZXNjclJlY1tORElTX1JYX0JVRl9MRU5HVEhdOw0KLSAgICAgIH0gUnhCdWZEZXNjcjsNCi0NCi0NCi10eXBlZGVmIHN0cnVjdCBfUGt0QnVmIHsNCi0Jc3RydWN0IF9Qa3RCdWYgKm5leHRMaW5rOw0KLQlzdHJ1Y3QgX1BrdEJ1ZiAqcHJldkxpbms7DQotICAgICAgICBpbnQgICAgaGFuZGxlOw0KLSAgICAgICAgaW50ICAgIGxlbmd0aDsNCi0gICAgICAgIGludCAgICBwYWNrZXRMZW5ndGg7DQotICAgICAgICBEV09SRCAgc2VxdWVuY2U7DQotICAgICAgICBCWVRFICAqYnVmZmVyOw0KLSAgICAgIH0gUGt0QnVmOw0KLQ0KLQ0KLXR5cGVkZWYgc3RydWN0IF9DYXJkSGFuZGxlIHsNCi0gICAgICAgIEJZVEUgICAgICAgICBtb2R1bGVOYW1lWzE2XTsNCi0gICAgICAgIENvbW1vbkNoYXJzICpjb21tb247DQotICAgICAgfSBDYXJkSGFuZGxlOw0KLQ0KLQ0KLXR5cGVkZWYgc3RydWN0IF9CaW5kaW5nc0xpc3Qgew0KLSAgICAgICAgV09SRCAgbnVtQmluZGluZ3M7DQotICAgICAgICBCWVRFICBtb2R1bGVOYW1lWzJdWzE2XTsNCi0gICAgICB9IEJpbmRpbmdzTGlzdDsNCi0NCi0NCi10eXBlZGVmIHN0cnVjdCBfRmFpbGluZ01vZHVsZXMgew0KLSAgICAgICAgQllURSAgdXBwZXJNb2R1bGVOYW1lWzE2XTsNCi0gICAgICAgIEJZVEUgIGxvd2VyTW9kdWxlTmFtZVsxNl07DQotICAgICAgfSBGYWlsaW5nTW9kdWxlczsNCi0NCi0NCi10eXBlZGVmIHVuaW9uIF9IYXJkd2FyZUFkZHJlc3Mgew0KLSAgICAgICAgQllURSAgYnl0ZXNbNl07DQotICAgICAgICBXT1JEICB3b3Jkc1szXTsNCi0gICAgICAgIHN0cnVjdCB7DQotICAgICAgICAgIEJZVEUgYnl0ZXNbNl07DQotICAgICAgICB9IGFkZHI7DQotICAgICAgfSBIYXJkd2FyZUFkZHJlc3M7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QgX0ZkZGlIZWFkZXIgew0KLSAgICAgICAgQllURSAgICAgICAgICAgICBmcmFtZUNvbnRyb2w7DQotICAgICAgICBIYXJkd2FyZUFkZHJlc3MgIGV0aGVyRGVzdEhvc3Q7DQotICAgICAgICBIYXJkd2FyZUFkZHJlc3MgIGV0aGVyU3JjSG9zdDsNCi0gICAgICB9IEZkZGlIZWFkZXI7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QgX0V0aGVybmV0SUlIZWFkZXIgew0KLSAgICAgICAgSGFyZHdhcmVBZGRyZXNzICBldGhlckRlc3RIb3N0Ow0KLSAgICAgICAgSGFyZHdhcmVBZGRyZXNzICBldGhlclNyY0hvc3Q7DQotICAgICAgICBXT1JEICAgICAgICAgICAgIGV0aGVyVHlwZTsNCi0gICAgICB9IEV0aGVybmV0SUlIZWFkZXI7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QgX0llZWU4MDJEb3Q1SGVhZGVyIHsNCi0gICAgICAgIEhhcmR3YXJlQWRkcmVzcyAgZXRoZXJEZXN0SG9zdDsNCi0gICAgICAgIEhhcmR3YXJlQWRkcmVzcyAgZXRoZXJTcmNIb3N0Ow0KLSAgICAgICAgQllURSAgICAgICAgICAgICByb3V0ZUluZm9bMzBdOw0KLSAgICAgIH0gSWVlZTgwMkRvdDVIZWFkZXI7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QgX0llZWU4MDJEb3QyU25hcEhlYWRlciB7DQotICAgICAgICBCWVRFICBkc2FwOyAgICAgICAgICAgICAgICAgICAgICAvKiAweEFBICovDQotICAgICAgICBCWVRFICBzc2FwOyAgICAgICAgICAgICAgICAgICAgICAvKiAweEFBICovDQotICAgICAgICBCWVRFICBjb250cm9sOyAgICAgICAgICAgICAgICAgICAvKiAzICAgICovDQotICAgICAgICBCWVRFIHByb3RvY29sSWRbNV07DQotICAgICAgfSBJZWVlODAyRG90MlNuYXBIZWFkZXI7DQotDQotDQotLyoNCi0gKiAgUHJvdG90eXBlcw0KLSAqLw0KLWV4dGVybiBjaGFyICpOZGlzTGFzdEVycm9yICAgICAgICAodm9pZCk7DQotZXh0ZXJuIGludCAgIE5kaXNPcGVuICAgICAgICAgICAgICh2b2lkKTsNCi1leHRlcm4gaW50ICAgTmRpc0luaXQgICAgICAgICAgICAgKGludCBwcm9taXMpOw0KLWV4dGVybiBpbnQgICBOZGlzUmVnaXN0ZXJBbmRCaW5kICAoaW50IHByb21pcyk7DQotZXh0ZXJuIHZvaWQgIE5kaXNTaHV0ZG93biAgICAgICAgICh2b2lkKTsNCi1leHRlcm4gdm9pZCAgTmRpc0NoZWNrTWFjRmVhdHVyZXMgKHN0cnVjdCBfQ2FyZEhhbmRsZSAqY2FyZCk7DQotZXh0ZXJuIGludCAgIE5kaXNTZW5kUGFja2V0ICAgICAgIChzdHJ1Y3QgX1BrdEJ1ZiAqcGt0QnVmLCBpbnQgbWFjSWQpOw0KLQ0KLS8qDQotICogIEFzc2VtYmx5ICJnbHVlIiBmdW5jdGlvbnMNCi0gKi8NCi1leHRlcm4gaW50IHN5c3RlbVJlcXVlc3RHbHVlKCk7DQotZXh0ZXJuIGludCByZXF1ZXN0Q29uZmlybUdsdWUoKTsNCi1leHRlcm4gaW50IHRyYW5zbWl0Q29uZmlybUdsdWUoKTsNCi1leHRlcm4gaW50IHJlY2VpdmVMb29rYWhlYWRHbHVlKCk7DQotZXh0ZXJuIGludCBpbmRpY2F0aW9uQ29tcGxldGVHbHVlKCk7DQotZXh0ZXJuIGludCByZWNlaXZlQ2hhaW5HbHVlKCk7DQotZXh0ZXJuIGludCBzdGF0dXNHbHVlKCk7DQotDQotLyoNCi0gKiAgSU9DVEwgZnVuY3Rpb24NCi0gKi8NCi0jaWZkZWYgX19TTUFMTF9fDQotZXh0ZXJuIGludCBfZmFyIE5kaXNHZXRMaW5rYWdlIChpbnQgaGFuZGxlLCBjaGFyICpkYXRhLCBpbnQgc2l6ZSk7DQotI2Vsc2UNCi1leHRlcm4gaW50IE5kaXNHZXRMaW5rYWdlIChpbnQgaGFuZGxlLCBjaGFyICpkYXRhLCBpbnQgc2l6ZSk7DQotI2VuZGlmDQotDQotLyoNCi0gKiAgTkRJUyBjYWxsYmFjayBoYW5kbGVycw0KLSAqLw0KLUNBTExCQUNLIChOZGlzU3lzdGVtUmVxdWVzdCAgICAgKERXT1JELERXT1JELCBXT1JELCBXT1JELCBXT1JEKSk7DQotQ0FMTEJBQ0sgKE5kaXNSZXF1ZXN0Q29uZmlybSAgICAoIFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQsV09SRCkpOw0KLUNBTExCQUNLIChOZGlzVHJhbnNtaXRDb25maXJtICAgKCBXT1JELCBXT1JELCBXT1JELCBXT1JELCBXT1JEKSk7DQotQ0FMTEJBQ0sgKE5kaXNSZWNlaXZlTG9va2FoZWFkICAoIFdPUkQsIFdPUkQsIFdPUkQsIEJZVEUqLCBCWVRFKiwgV09SRCkpOw0KLUNBTExCQUNLIChOZGlzUmVjZWl2ZUNoYWluICAgICAgKCBXT1JELCBXT1JELCBXT1JELCBzdHJ1Y3QgX1J4QnVmRGVzY3IqLCBCWVRFKiwgV09SRCkpOw0KLUNBTExCQUNLIChOZGlzU3RhdHVzUHJvYyAgICAgICAgKCBXT1JELCBXT1JELCBCWVRFKiwgV09SRCxXT1JEKSk7DQotQ0FMTEJBQ0sgKE5kaXNJbmRpY2F0aW9uQ29tcGxldGUoIFdPUkQsIFdPUkQpKTsNCi0NCi1CWVRFICpOZGlzQWxsb2NTdGFjayAodm9pZCk7DQotdm9pZCAgTmRpc0ZyZWVTdGFjayAgKEJZVEUqKTsNCi0NCi0jaWZkZWYgX19ISUdIQ19fDQotICAjZGVmaW5lIFJFTkFNRV9BU01fU1lNKHgpIHByYWdtYSBBbGlhcyh4LCJAIiAjeCAiIikgIC8qIHByZXBlbmQgYEAnICovDQotICAjZGVmaW5lIFJFTkFNRV9DX1NZTSh4KSAgIHByYWdtYSBBbGlhcyh4LCJfIiAjeCAiIikgIC8qIHByZXBlbmQgYF8nICovDQotDQotICBSRU5BTUVfQVNNX1NZTSAoc3lzdGVtUmVxdWVzdEdsdWUpOw0KLSAgUkVOQU1FX0FTTV9TWU0gKHJlcXVlc3RDb25maXJtR2x1ZSk7DQotICBSRU5BTUVfQVNNX1NZTSAodHJhbnNtaXRDb25maXJtR2x1ZSk7DQotICBSRU5BTUVfQVNNX1NZTSAocmVjZWl2ZUxvb2thaGVhZEdsdWUpOw0KLSAgUkVOQU1FX0FTTV9TWU0gKGluZGljYXRpb25Db21wbGV0ZUdsdWUpOw0KLSAgUkVOQU1FX0FTTV9TWU0gKHJlY2VpdmVDaGFpbkdsdWUpOw0KLSAgUkVOQU1FX0FTTV9TWU0gKHN0YXR1c0dsdWUpOw0KLSAgUkVOQU1FX0FTTV9TWU0gKE5kaXNHZXRMaW5rYWdlKTsNCi0gIFJFTkFNRV9DX1NZTSAgIChOZGlzU3lzdGVtUmVxdWVzdCk7DQotICBSRU5BTUVfQ19TWU0gICAoTmRpc1JlcXVlc3RDb25maXJtKTsNCi0gIFJFTkFNRV9DX1NZTSAgIChOZGlzVHJhbnNtaXRDb25maXJtKTsNCi0gIFJFTkFNRV9DX1NZTSAgIChOZGlzUmVjZWl2ZUxvb2thaGVhZCk7DQotICBSRU5BTUVfQ19TWU0gICAoTmRpc0luZGljYXRpb25Db21wbGV0ZSk7DQotICBSRU5BTUVfQ19TWU0gICAoTmRpc1JlY2VpdmVDaGFpbik7DQotICBSRU5BTUVfQ19TWU0gICAoTmRpc1N0YXR1c1Byb2MpOw0KLSAgUkVOQU1FX0NfU1lNICAgKE5kaXNBbGxvY1N0YWNrKTsNCi0gIFJFTkFNRV9DX1NZTSAgIChOZGlzRnJlZVN0YWNrKTsNCi0jZW5kaWYNCi0NCi0jZW5kaWYNCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLDE5OTQKKyAqICAgICAgVGV4YXMgQSZNIFVuaXZlcnNpdHkuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgVGV4YXMgQSZNIFVuaXZlcnNpdHkKKyAqICAgICAgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBVTklWRVJTSVRZIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgVU5JVkVSU0lUWSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIERldmVsb3BlcnM6CisgKiAgICAgICAgICAgICBEYXZpZCBLLiBIZXNzLCBEb3VnbGFzIExlZSBTY2hhbGVzLCBEYXZpZCBSLiBTYWZmb3JkCisgKgorICogSGVhdmlseSBtb2RpZmllZCBmb3IgTWV0YXdhcmUgSGlnaEMgKyBHTlUgQyAyLjgrCisgKiAgICAgICAgICAgICBHaXNsZSBWYW5lbSAxOTk4CisgKi8KKworI2lmbmRlZiBfX1BDQVBfTkRJU19ICisjZGVmaW5lIF9fUENBUF9ORElTX0gKKworI2lmIGRlZmluZWQgKF9fSElHSENfXykKKyAgI2RlZmluZSBwYXNjYWwgICAgICAgICAgX0NDKF9DQUxMRUVfUE9QU19TVEFDSyAmIH5fUkVWRVJTRV9QQVJNUykgLyogY2FsbGluZyBjb252ZW50aW9uICovCisgICNkZWZpbmUgQ0FMTEJBQ0soZm9vKSAgIHBhc2NhbCBXT1JEIGZvbworICAjZGVmaW5lIFBBU19QVFIoeCxhcmcpICB0eXBlZGVmIEZBUiBXT1JEIHBhc2NhbCAoKngpIGFyZworICAjZGVmaW5lIEdVQVJEKCkgICAgICAgICBfaW5saW5lICgweDlDLDB4RkEpICAgLyogcHVzaGZkLCBjbGkgKi8KKyAgI2RlZmluZSBVTkdVQVJEKCkgICAgICAgX2lubGluZSAoMHg5RCkgICAgICAgIC8qIHBvcGZkICovCisgICNkZWZpbmUgRkFSICAgICAgICAgICAgIF9mYXIKKworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgI2RlZmluZSBDQUxMQkFDSyhmb28pICAgV09SRCBmb28gX19hdHRyaWJ1dGVfXygoc3RkY2FsbCkpCisgICNkZWZpbmUgUEFTX1BUUih4LGFyZykgIHR5cGVkZWYgV09SRCAoKngpIGFyZyBfX2F0dHJpYnV0ZV9fKChzdGRjYWxsKSkKKyAgI2RlZmluZSBHVUFSRCgpICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwdXNoZmQ7IGNsaSIpCisgICNkZWZpbmUgVU5HVUFSRCgpICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgicG9wZmQiKQorICAjZGVmaW5lIEZBUgorCisjZWxpZiBkZWZpbmVkIChfX1RVUkJPQ19fKQorICAjZGVmaW5lIENBTExCQUNLKGZvbykgICBXT1JEIHBhc2NhbCBmb28KKyAgI2RlZmluZSBQQVNfUFRSKHgsYXJnKSAgdHlwZWRlZiBXT1JEIHBhc2NhbCAoX2ZhciAqeCkgYXJnCisgICNkZWZpbmUgR1VBUkQoKSAgICAgICAgIF9hc20geyBwdXNoZjsgY2xpIH0KKyAgI2RlZmluZSBVTkdVQVJEKCkgICAgICAgX2FzbSB7IHBvcGYgfQorICAjZGVmaW5lIEZBUiAgICAgICAgICAgICBfZmFyCisKKyNlbGlmIGRlZmluZWQgKF9fV0FUQ09NQ19fKQorICAjZGVmaW5lIENBTExCQUNLKGZvbykgICBXT1JEIHBhc2NhbCBmb28KKyAgI2RlZmluZSBQQVNfUFRSKHgsYXJnKSAgdHlwZWRlZiBXT1JEIHBhc2NhbCAoX2ZhciAqeCkgYXJnCisgICNkZWZpbmUgR1VBUkQoKSAgICAgICAgIF9kaXNhYmxlKCkKKyAgI2RlZmluZSBVTkdVQVJEKCkgICAgICAgX2VuYWJsZSgpCisgICNkZWZpbmUgRkFSICAgICAgICAgICAgIF9mYXIKKworI2Vsc2UKKyAgI2Vycm9yIFVuc3VwcG9ydGVkIGNvbXBpbGVyCisjZW5kaWYKKworCisvKgorICogIEZvcndhcmRzCisgKi8KK3N0cnVjdCBfUmVxQmxvY2s7CitzdHJ1Y3QgX1R4QnVmRGVzY3I7CitzdHJ1Y3QgX1REQnVmRGVzY3I7CisKKy8qCisgKiBQcm90b2NvbCBNYW5hZ2VyIEFQSQorICovCitQQVNfUFRSIChQcm90TWFuLCAoc3RydWN0IF9SZXFCbG9jayBGQVIqLCBXT1JEKSk7CisKKy8qCisgKiBTeXN0ZW0gcmVxdWVzdAorICovCitQQVNfUFRSIChTeXN0ZW1SZXF1ZXN0LCAoRFdPUkQsIERXT1JELCBXT1JELCBXT1JELCBXT1JEKSk7CisKKy8qCisgKiBNQUMgQVBJCisgKi8KK1BBU19QVFIgKFRyYW5zbWl0Q2hhaW4sIChXT1JELCBXT1JELCBzdHJ1Y3QgX1R4QnVmRGVzY3IgRkFSKiwgV09SRCkpOworUEFTX1BUUiAoVHJhbnNmZXJEYXRhLCAgKFdPUkQqLFdPUkQsIHN0cnVjdCBfVERCdWZEZXNjciBGQVIqLCBXT1JEKSk7CitQQVNfUFRSIChSZXF1ZXN0LCAgICAgICAoV09SRCwgV09SRCwgV09SRCwgRFdPUkQsIFdPUkQsIFdPUkQpKTsKK1BBU19QVFIgKFJlY2VpdmVSZWxlYXNlLChXT1JELCBXT1JEKSk7CitQQVNfUFRSIChJbmRpY2F0aW9uT24sICAoV09SRCkpOworUEFTX1BUUiAoSW5kaWNhdGlvbk9mZiwgKFdPUkQpKTsKKworCit0eXBlZGVmIGVudW0geworICAgICAgICBIQVJEV0FSRV9OT1RfSU5TVEFMTEVEICA9IDAsCisgICAgICAgIEhBUkRXQVJFX0ZBSUxFRF9ESUFHICAgID0gMSwKKyAgICAgICAgSEFSRFdBUkVfRkFJTEVEX0NPTkZJRyAgPSAyLAorICAgICAgICBIQVJEV0FSRV9IQVJEX0ZBVUxUICAgICA9IDMsCisgICAgICAgIEhBUkRXQVJFX1NPRlRfRkFVTFQgICAgID0gNCwKKyAgICAgICAgSEFSRFdBUkVfT0sgICAgICAgICAgICAgPSA3LAorICAgICAgICBIQVJEV0FSRV9NQVNLICAgICAgICAgICA9IDB4MDAwNywKKyAgICAgICAgTUFDX0JPVU5EICAgICAgICAgICAgICAgPSAweDAwMDgsCisgICAgICAgIE1BQ19PUEVOICAgICAgICAgICAgICAgID0gMHgwMDEwLAorICAgICAgICBESUFHX0lOX1BST0dSRVNTICAgICAgICA9IDB4MDAyMAorICAgICAgfSBOZGlzTWFjU3RhdHVzOworCit0eXBlZGVmIGVudW0geworICAgICAgICBTVEFUVVNfUklOR19TVEFUVVMgICAgICA9IDEsCisgICAgICAgIFNUQVRVU19BREFQVEVSX0NIRUNLICAgID0gMiwKKyAgICAgICAgU1RBVFVTX1NUQVJUX1JFU0VUICAgICAgPSAzLAorICAgICAgICBTVEFUVVNfSU5URVJSVVBUICAgICAgICA9IDQsCisgICAgICAgIFNUQVRVU19FTkRfUkVTRVQgICAgICAgID0gNQorICAgICAgfSBOZGlzU3RhdHVzOworCit0eXBlZGVmIGVudW0geworICAgICAgICBGSUxURVJfRElSRUNURUQgICAgICAgICA9IDEsCisgICAgICAgIEZJTFRFUl9CUk9BRENBU1QgICAgICAgID0gMiwKKyAgICAgICAgRklMVEVSX1BST01JU0NVT1VTICAgICAgPSA0LAorICAgICAgICBGSUxURVJfU09VUkNFX1JPVVRFICAgICA9IDgKKyAgICAgIH0gTmRpc1BhY2tldEZpbHRlcjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICAgICAgUkVRX0lOSVRJQVRFX0RJQUdOT1NUSUNTICAgICA9IDEsCisgICAgICAgIFJFUV9SRUFEX0VSUk9SX0xPRyAgICAgICAgICAgPSAyLAorICAgICAgICBSRVFfU0VUX1NUQVRJT05fQUREUkVTUyAgICAgID0gMywKKyAgICAgICAgUkVRX09QRU5fQURBUFRFUiAgICAgICAgICAgICA9IDQsCisgICAgICAgIFJFUV9DTE9TRV9BREFQVEVSICAgICAgICAgICAgPSA1LAorICAgICAgICBSRVFfUkVTRVRfTUFDICAgICAgICAgICAgICAgID0gNiwKKyAgICAgICAgUkVRX1NFVF9QQUNLRVRfRklMVEVSICAgICAgICA9IDcsCisgICAgICAgIFJFUV9BRERfTVVMVElDQVNUX0FERFJFU1MgICAgPSA4LAorICAgICAgICBSRVFfREVMRVRFX01VTFRJQ0FTVF9BRERSRVNTID0gOSwKKyAgICAgICAgUkVRX1VQREFURV9TVEFUSVNUSUNTICAgICAgICA9IDEwLAorICAgICAgICBSRVFfQ0xFQVJfU1RBVElTVElDUyAgICAgICAgID0gMTEsCisgICAgICAgIFJFUV9JTlRFUlJVUFRfUkVRVUVTVCAgICAgICAgPSAxMiwKKyAgICAgICAgUkVRX1NFVF9GVU5DVElPTkFMX0FERFJFU1MgICA9IDEzLAorICAgICAgICBSRVFfU0VUX0xPT0tBSEVBRCAgICAgICAgICAgID0gMTQKKyAgICAgIH0gTmRpc0dlbmVyYWxSZXF1ZXN0OworCit0eXBlZGVmIGVudW0geworICAgICAgICBTRl9CUk9BRENBU1QgICAgICAgICAgICAgPSAweDAwMDAwMDAxTCwKKyAgICAgICAgU0ZfTVVMVElDQVNUICAgICAgICAgICAgID0gMHgwMDAwMDAwMkwsCisgICAgICAgIFNGX0ZVTkNUSU9OQUwgICAgICAgICAgICA9IDB4MDAwMDAwMDRMLAorICAgICAgICBTRl9QUk9NSVNDVU9VUyAgICAgICAgICAgPSAweDAwMDAwMDA4TCwKKyAgICAgICAgU0ZfU09GVF9BRERSRVNTICAgICAgICAgID0gMHgwMDAwMDAxMEwsCisgICAgICAgIFNGX1NUQVRTX0NVUlJFTlQgICAgICAgICA9IDB4MDAwMDAwMjBMLAorICAgICAgICBTRl9JTklUSUFURV9ESUFHUyAgICAgICAgPSAweDAwMDAwMDQwTCwKKyAgICAgICAgU0ZfTE9PUEJBQ0sgICAgICAgICAgICAgID0gMHgwMDAwMDA4MEwsCisgICAgICAgIFNGX1JFQ0VJVkVfQ0hBSU4gICAgICAgICA9IDB4MDAwMDAxMDBMLAorICAgICAgICBTRl9TT1VSQ0VfUk9VVElORyAgICAgICAgPSAweDAwMDAwMjAwTCwKKyAgICAgICAgU0ZfUkVTRVRfTUFDICAgICAgICAgICAgID0gMHgwMDAwMDQwMEwsCisgICAgICAgIFNGX09QRU5fQ0xPU0UgICAgICAgICAgICA9IDB4MDAwMDA4MDBMLAorICAgICAgICBTRl9JTlRFUlJVUFRfUkVRVUVTVCAgICAgPSAweDAwMDAxMDAwTCwKKyAgICAgICAgU0ZfU09VUkNFX1JPVVRJTkdfQlJJREdFID0gMHgwMDAwMjAwMEwsCisgICAgICAgIFNGX1ZJUlRVQUxfQUREUkVTU0VTICAgICA9IDB4MDAwMDQwMDBMCisgICAgICB9IE5kaXNNYWNTZXJ2aWNlRmxhZ3M7CisKK3R5cGVkZWYgZW51bSB7CisgICAgICAgIFJFUV9JTklUSUFURV9CSU5EICAgICAgICA9IDEsCisgICAgICAgIFJFUV9CSU5EICAgICAgICAgICAgICAgICA9IDIsCisgICAgICAgIFJFUV9JTklUSUFURV9QUkVCSU5EICAgICA9IDMsCisgICAgICAgIFJFUV9JTklUSUFURV9VTkJJTkQgICAgICA9IDQsCisgICAgICAgIFJFUV9VTkJJTkQgICAgICAgICAgICAgICA9IDUKKyAgICAgIH0gTmRpc1N5c1JlcXVlc3Q7CisKK3R5cGVkZWYgZW51bSAgeworICAgICAgICBQTV9HRVRfUFJPVE9DT0xfTUFOQUdFUl9JTkZPICAgICAgPSAxLAorICAgICAgICBQTV9SRUdJU1RFUl9NT0RVTEUgICAgICAgICAgICAgICAgPSAyLAorICAgICAgICBQTV9CSU5EX0FORF9TVEFSVCAgICAgICAgICAgICAgICAgPSAzLAorICAgICAgICBQTV9HRVRfUFJPVE9DT0xfTUFOQUdFUl9MSU5LQUdFICAgPSA0LAorICAgICAgICBQTV9HRVRfUFJPVE9DT0xfSU5JX1BBVEggICAgICAgICAgPSA1LAorICAgICAgICBQTV9SRUdJU1RFUl9QUk9UT0NPTF9NQU5BR0VSX0lORk8gPSA2LAorICAgICAgICBQTV9JTklUX0FORF9SRUdJU1RFUiAgICAgICAgICAgICAgPSA3LAorICAgICAgICBQTV9VTkJJTkRfQU5EX1NUT1AgICAgICAgICAgICAgICAgPSA4LAorICAgICAgICBQTV9CSU5EX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgPSA5LAorICAgICAgICBQTV9SRUdJU1RFUl9TVEFUVVMgICAgICAgICAgICAgICAgPSAxMAorICAgICAgfSBOZGlzUHJvdE1hbmFnZXI7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgICAgICAgRVJSX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgPSAweDAwLAorICAgICAgICBFUlJfV0FJVF9GT1JfUkVMRUFTRSAgICAgICAgICAgICA9IDB4MDEsCisgICAgICAgIEVSUl9SRVFVRVNUX1FVRVVFRCAgICAgICAgICAgICAgID0gMHgwMiwKKyAgICAgICAgRVJSX0ZSQU1FX05PVF9SRUNPR05JWkVEICAgICAgICAgPSAweDAzLAorICAgICAgICBFUlJfRlJBTUVfUkVKRUNURUQgICAgICAgICAgICAgICA9IDB4MDQsCisgICAgICAgIEVSUl9GT1JXQVJEX0ZSQU1FICAgICAgICAgICAgICAgID0gMHgwNSwKKyAgICAgICAgRVJSX09VVF9PRl9SRVNPVVJDRSAgICAgICAgICAgICAgPSAweDA2LAorICAgICAgICBFUlJfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgICAgICA9IDB4MDcsCisgICAgICAgIEVSUl9JTlZBTElEX0ZVTkNUSU9OICAgICAgICAgICAgID0gMHgwOCwKKyAgICAgICAgRVJSX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgPSAweDA5LAorICAgICAgICBFUlJfSEFSRFdBUkVfRVJST1IgICAgICAgICAgICAgICA9IDB4MEEsCisgICAgICAgIEVSUl9UUkFOU01JVF9FUlJPUiAgICAgICAgICAgICAgID0gMHgwQiwKKyAgICAgICAgRVJSX05PX1NVQ0hfREVTVElOQVRJT04gICAgICAgICAgPSAweDBDLAorICAgICAgICBFUlJfQlVGRkVSX1RPT19TTUFMTCAgICAgICAgICAgICA9IDB4MEQsCisgICAgICAgIEVSUl9BTFJFQURZX1NUQVJURUQgICAgICAgICAgICAgID0gMHgyMCwKKyAgICAgICAgRVJSX0lOQ09NUExFVEVfQklORElORyAgICAgICAgICAgPSAweDIxLAorICAgICAgICBFUlJfRFJJVkVSX05PVF9JTklUSUFMSVpFRCAgICAgICA9IDB4MjIsCisgICAgICAgIEVSUl9IQVJEV0FSRV9OT1RfRk9VTkQgICAgICAgICAgID0gMHgyMywKKyAgICAgICAgRVJSX0hBUkRXQVJFX0ZBSUxVUkUgICAgICAgICAgICAgPSAweDI0LAorICAgICAgICBFUlJfQ09ORklHVVJBVElPTl9GQUlMVVJFICAgICAgICA9IDB4MjUsCisgICAgICAgIEVSUl9JTlRFUlJVUFRfQ09ORkxJQ1QgICAgICAgICAgID0gMHgyNiwKKyAgICAgICAgRVJSX0lOQ09NUEFUSUJMRV9NQUMgICAgICAgICAgICAgPSAweDI3LAorICAgICAgICBFUlJfSU5JVElBTElaQVRJT05fRkFJTEVEICAgICAgICA9IDB4MjgsCisgICAgICAgIEVSUl9OT19CSU5ESU5HICAgICAgICAgICAgICAgICAgID0gMHgyOSwKKyAgICAgICAgRVJSX05FVFdPUktfTUFZX05PVF9CRV9DT05ORUNURUQgPSAweDJBLAorICAgICAgICBFUlJfSU5DT01QQVRJQkxFX09TX1ZFUlNJT04gICAgICA9IDB4MkIsCisgICAgICAgIEVSUl9BTFJFQURZX1JFR0lTVEVSRUQgICAgICAgICAgID0gMHgyQywKKyAgICAgICAgRVJSX1BBVEhfTk9UX0ZPVU5EICAgICAgICAgICAgICAgPSAweDJELAorICAgICAgICBFUlJfSU5TVUZGSUNJRU5UX01FTU9SWSAgICAgICAgICA9IDB4MkUsCisgICAgICAgIEVSUl9JTkZPX05PVF9GT1VORCAgICAgICAgICAgICAgID0gMHgyRiwKKyAgICAgICAgRVJSX0dFTkVSQUxfRkFJTFVSRSAgICAgICAgICAgICAgPSAweEZGCisgICAgICB9IE5kaXNFcnJvcjsKKworI2RlZmluZSBORElTX1BBUkFNX0lOVEVHRVIgICAwCisjZGVmaW5lIE5ESVNfUEFSQU1fU1RSSU5HICAgIDEKKworI2RlZmluZSBORElTX1RYX0JVRl9MRU5HVEggICA4CisjZGVmaW5lIE5ESVNfVERfQlVGX0xFTkdUSCAgIDEKKyNkZWZpbmUgTkRJU19SWF9CVUZfTEVOR1RIICAgOAorCisjZGVmaW5lIE5ESVNfUFRSX1BIWVNJQ0FMICAgIDAKKyNkZWZpbmUgTkRJU19QVFJfVklSVFVBTCAgICAgMgorCisjZGVmaW5lIE5ESVNfUEFUSCAgICAiUFJPVE1BTiQiCisKKwordHlwZWRlZiBzdHJ1Y3QgX0NvbW1vbkNoYXJzIHsKKyAgICAgICAgV09SRCAgdGFibGVTaXplOworICAgICAgICBCWVRFICBtYWpvck5kaXNWZXJzaW9uOyAgICAgICAgLyogMiAtIExhdGVzdCB2ZXJzaW9uICovCisgICAgICAgIEJZVEUgIG1pbm9yTmRpc1ZlcnNpb247ICAgICAgICAvKiAwICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgV09SRCAgcmVzZXJ2ZWQxOworICAgICAgICBCWVRFICBtYWpvck1vZHVsZVZlcnNpb247CisgICAgICAgIEJZVEUgIG1pbm9yTW9kdWxlVmVyc2lvbjsKKyAgICAgICAgRFdPUkQgbW9kdWxlRmxhZ3M7CisgICAgICAgIC8qIDAgLSBCaW5kaW5nIGF0IHVwcGVyIGJvdW5kYXJ5IHN1cHBvcnRlZAorICAgICAgICAgKiAxIC0gQmluZGluZyBhdCBsb3dlciBib3VuZGFyeSBzdXBwb3J0ZWQKKyAgICAgICAgICogMiAtIER5bmFtaWNhbGx5IGJvdW5kLgorICAgICAgICAgKiAzLTMxIC0gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KKyAgICAgICAgICovCisgICAgICAgIEJZVEUgIG1vZHVsZU5hbWVbMTZdOworICAgICAgICBCWVRFICBwcm90b2NvbExldmVsVXBwZXI7CisgICAgICAgIC8qIDEgLSBNQUMKKyAgICAgICAgICogMiAtIERhdGEgTGluaworICAgICAgICAgKiAzIC0gTmV0d29yaworICAgICAgICAgKiA0IC0gVHJhbnNwb3J0CisgICAgICAgICAqIDUgLSBTZXNzaW9uCisgICAgICAgICAqIC0xIC0gTm90IHNwZWNpZmllZAorICAgICAgICAgKi8KKyAgICAgICAgQllURSAgaW50ZXJmYWNlVXBwZXI7CisgICAgICAgIEJZVEUgIHByb3RvY29sTGV2ZWxMb3dlcjsKKyAgICAgICAgLyogMCAtIFBoeXNpY2FsCisgICAgICAgICAqIDEgLSBNQUMKKyAgICAgICAgICogMiAtIERhdGEgTGluaworICAgICAgICAgKiAzIC0gTmV0d29yaworICAgICAgICAgKiA0IC0gVHJhbnNwb3J0CisgICAgICAgICAqIDUgLSBTZXNzaW9uCisgICAgICAgICAqIC0xIC0gTm90IHNwZWNpZmllZAorICAgICAgICAgKi8KKyAgICAgICAgQllURSAgaW50ZXJmYWNlTG93ZXI7CisgICAgICAgIFdPUkQgIG1vZHVsZUlkOworICAgICAgICBXT1JEICBtb2R1bGVEUzsKKyAgICAgICAgU3lzdGVtUmVxdWVzdCBzeXN0ZW1SZXF1ZXN0OworICAgICAgICBCWVRFICpzZXJ2aWNlQ2hhcnM7CisgICAgICAgIEJZVEUgKnNlcnZpY2VTdGF0dXM7CisgICAgICAgIEJZVEUgKnVwcGVyRGlzcGF0Y2hUYWJsZTsKKyAgICAgICAgQllURSAqbG93ZXJEaXNwYXRjaFRhYmxlOworICAgICAgICBCWVRFICpyZXNlcnZlZDI7ICAgICAgICAgICAgLyogTXVzdCBiZSBOVUxMICovCisgICAgICAgIEJZVEUgKnJlc2VydmVkMzsgICAgICAgICAgICAvKiBNdXN0IGJlIE5VTEwgKi8KKyAgICAgIH0gQ29tbW9uQ2hhcnM7CisKKwordHlwZWRlZiBzdHJ1Y3QgX011bHRpY2FzdExpc3QgeworICAgICAgICBXT1JEICAgbWF4TXVsdGljYXN0QWRkcmVzc2VzOworICAgICAgICBXT1JEICAgbnVtYmVyTXVsdGljYXN0QWRkcmVzc2VzOworICAgICAgICBCWVRFICAgbXVsdGljYXN0QWRkcmVzc1sxNl1bMTZdOworICAgICAgfSBNdWx0aWNhc3RMaXN0OworCisKK3R5cGVkZWYgc3RydWN0IF9NYWNDaGFycyB7CisgICAgICAgIFdPUkQgICB0YWJsZVNpemU7CisgICAgICAgIEJZVEUgICBtYWNOYW1lWzE2XTsKKyAgICAgICAgV09SRCAgIGFkZHJlc3NMZW5ndGg7CisgICAgICAgIEJZVEUgICBwZXJtYW5lbnRBZGRyZXNzWzE2XTsKKyAgICAgICAgQllURSAgIGN1cnJlbnRBZGRyZXNzWzE2XTsKKyAgICAgICAgRFdPUkQgIGN1cnJlbnRGdW5jdGlvbmFsQWRkcmVzczsKKyAgICAgICAgTXVsdGljYXN0TGlzdCAqbXVsdGljYXN0TGlzdDsKKyAgICAgICAgRFdPUkQgIGxpbmtTcGVlZDsKKyAgICAgICAgRFdPUkQgIHNlcnZpY2VGbGFnczsKKyAgICAgICAgV09SRCAgIG1heEZyYW1lU2l6ZTsKKyAgICAgICAgRFdPUkQgIHR4QnVmZmVyU2l6ZTsKKyAgICAgICAgV09SRCAgIHR4QnVmZmVyQWxsb2NTaXplOworICAgICAgICBEV09SRCAgcnhCdWZmZXJTaXplOworICAgICAgICBXT1JEICAgcnhCdWZmZXJBbGxvY1NpemU7CisgICAgICAgIEJZVEUgICBpZWVlVmVuZG9yWzNdOworICAgICAgICBCWVRFICAgdmVuZG9yQWRhcHRlcjsKKyAgICAgICAgQllURSAgKnZlbmRvckFkYXB0ZXJEZXNjcmlwdGlvbjsKKyAgICAgICAgV09SRCAgIGludGVycnVwdExldmVsOworICAgICAgICBXT1JEICAgdHhRdWV1ZURlcHRoOworICAgICAgICBXT1JEICAgbWF4RGF0YUJsb2NrczsKKyAgICAgIH0gTWFjQ2hhcnM7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1Byb3RvY29sQ2hhcnMgeworICAgICAgICBXT1JEICAgbGVuZ3RoOworICAgICAgICBCWVRFICAgbmFtZVsxNl07CisgICAgICAgIFdPUkQgICB0eXBlOworICAgICAgfSBQcm90b2NvbENoYXJzOworCisKK3R5cGVkZWYgc3RydWN0IF9NYWNVcHBlckRpc3BhdGNoIHsKKyAgICAgICAgQ29tbW9uQ2hhcnMgICAgICAqYmFja1BvaW50ZXI7CisgICAgICAgIFJlcXVlc3QgICAgICAgICAgIHJlcXVlc3Q7CisgICAgICAgIFRyYW5zbWl0Q2hhaW4gICAgIHRyYW5zbWl0Q2hhaW47CisgICAgICAgIFRyYW5zZmVyRGF0YSAgICAgIHRyYW5zZmVyRGF0YTsKKyAgICAgICAgUmVjZWl2ZVJlbGVhc2UgICAgcmVjZWl2ZVJlbGVhc2U7CisgICAgICAgIEluZGljYXRpb25PbiAgICAgIGluZGljYXRpb25PbjsKKyAgICAgICAgSW5kaWNhdGlvbk9mZiAgICAgaW5kaWNhdGlvbk9mZjsKKyAgICAgIH0gTWFjVXBwZXJEaXNwYXRjaDsKKworCit0eXBlZGVmIHN0cnVjdCBfTWFjU3RhdHVzVGFibGUgeworICAgICAgICBXT1JEICAgdGFibGVTaXplOworICAgICAgICBEV09SRCAgbGFzdERpYWc7CisgICAgICAgIERXT1JEICBtYWNTdGF0dXM7CisgICAgICAgIFdPUkQgICBwYWNrZXRGaWx0ZXI7CisgICAgICAgIEJZVEUgICptZWRpYVNwZWNpZmljU3RhdHM7CisgICAgICAgIERXT1JEICBsYXN0Q2xlYXI7CisgICAgICAgIERXT1JEICB0b3RhbEZyYW1lc1J4OworICAgICAgICBEV09SRCAgdG90YWxGcmFtZXNDcmM7CisgICAgICAgIERXT1JEICB0b3RhbEJ5dGVzUng7CisgICAgICAgIERXT1JEICB0b3RhbERpc2NhcmRCdWZTcGFjZVJ4OworICAgICAgICBEV09SRCAgdG90YWxNdWx0aWNhc3RSeDsKKyAgICAgICAgRFdPUkQgIHRvdGFsQnJvYWRjYXN0Ung7CisgICAgICAgIERXT1JEICBvYnNvbGV0ZTFbNV07CisgICAgICAgIERXT1JEICB0b3RhbERpc2NhcmRId0Vycm9yUng7CisgICAgICAgIERXT1JEICB0b3RhbEZyYW1lc1R4OworICAgICAgICBEV09SRCAgdG90YWxCeXRlc1R4OworICAgICAgICBEV09SRCAgdG90YWxNdWx0aWNhc3RUeDsKKyAgICAgICAgRFdPUkQgIHRvdGFsQnJvYWRjYXN0VHg7CisgICAgICAgIERXT1JEICBvYnNvbGV0ZTJbMl07CisgICAgICAgIERXT1JEICB0b3RhbERpc2NhcmRUaW1lb3V0VHg7CisgICAgICAgIERXT1JEICB0b3RhbERpc2NhcmRId0Vycm9yVHg7CisgICAgICB9IE1hY1N0YXR1c1RhYmxlOworCisKK3R5cGVkZWYgc3RydWN0IF9Qcm90RGlzcGF0Y2ggeworICAgICAgICBDb21tb25DaGFycyAqYmFja1BvaW50ZXI7CisgICAgICAgIERXT1JEICAgICAgICBmbGFnczsKKyAgICAgICAgLyogMCAtIGhhbmRsZXMgbm9uLUxMQyBmcmFtZXMKKyAgICAgICAgICogMSAtIGhhbmRsZXMgc3BlY2lmaWMtTFNBUCBMTEMgZnJhbWVzCisgICAgICAgICAqIDIgLSBoYW5kbGVzIHNwZWNpZmljLUxTQVAgTExDIGZyYW1lcworICAgICAgICAgKiAzLTMxIC0gcmVzZXJ2ZWQgbXVzdCBiZSAwCisgICAgICAgICAqLworICAgICAgICB2b2lkICAoKnJlcXVlc3RDb25maXJtKSAodm9pZCk7CisgICAgICAgIHZvaWQgICgqdHJhbnNtaXRDb25maXJtKSAodm9pZCk7CisgICAgICAgIHZvaWQgICgqcmVjZWl2ZUxvb2thaGVhZCkgKHZvaWQpOworICAgICAgICB2b2lkICAoKmluZGljYXRpb25Db21wbGV0ZSkgKHZvaWQpOworICAgICAgICB2b2lkICAoKnJlY2VpdmVDaGFpbikgKHZvaWQpOworICAgICAgICB2b2lkICAoKnN0YXR1cykgKHZvaWQpOworICAgICAgfSBQcm90RGlzcGF0Y2g7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1JlcUJsb2NrIHsKKyAgICAgICAgV09SRCAgICAgIG9wY29kZTsKKyAgICAgICAgV09SRCAgICAgIHN0YXR1czsKKyAgICAgICAgQllURSBGQVIgKnBvaW50ZXIxOworICAgICAgICBCWVRFIEZBUiAqcG9pbnRlcjI7CisgICAgICAgIFdPUkQgICAgICB3b3JkMTsKKyAgICAgIH0gUmVxQmxvY2s7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1R4QnVmRGVzY3JSZWMgeworICAgICAgICBCWVRFICAgdHhQdHJUeXBlOworICAgICAgICBCWVRFICAgZHVtbXk7CisgICAgICAgIFdPUkQgICB0eERhdGFMZW47CisgICAgICAgIEJZVEUgICp0eERhdGFQdHI7CisgICAgICB9IFR4QnVmRGVzY3JSZWM7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1R4QnVmRGVzY3IgeworICAgICAgICBXT1JEICAgICAgICAgIHR4SW1tZWRMZW47CisgICAgICAgIEJZVEUgICAgICAgICAqdHhJbW1lZFB0cjsKKyAgICAgICAgV09SRCAgICAgICAgICB0eERhdGFDb3VudDsKKyAgICAgICAgVHhCdWZEZXNjclJlYyB0eEJ1ZkRlc2NyUmVjW05ESVNfVFhfQlVGX0xFTkdUSF07CisgICAgICB9IFR4QnVmRGVzY3I7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1REQnVmRGVzY3JSZWMgeworICAgICAgICBCWVRFICAgdERQdHJUeXBlOworICAgICAgICBCWVRFICAgZHVtbXk7CisgICAgICAgIFdPUkQgICB0RERhdGFMZW47CisgICAgICAgIEJZVEUgICp0RERhdGFQdHI7CisgICAgICB9IFREQnVmRGVzY3JSZWM7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1REQnVmRGVzY3IgeworICAgICAgICBXT1JEICAgICAgICAgIHRERGF0YUNvdW50OworICAgICAgICBUREJ1ZkRlc2NyUmVjIHREQnVmRGVzY3JSZWNbTkRJU19URF9CVUZfTEVOR1RIXTsKKyAgICAgIH0gVERCdWZEZXNjcjsKKworCit0eXBlZGVmIHN0cnVjdCBfUnhCdWZEZXNjclJlYyB7CisgICAgICAgIFdPUkQgICByeERhdGFMZW47CisgICAgICAgIEJZVEUgICpyeERhdGFQdHI7CisgICAgICB9IFJ4QnVmRGVzY3JSZWM7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1J4QnVmRGVzY3IgeworICAgICAgICBXT1JEICAgICAgICAgIHJ4RGF0YUNvdW50OworICAgICAgICBSeEJ1ZkRlc2NyUmVjIHJ4QnVmRGVzY3JSZWNbTkRJU19SWF9CVUZfTEVOR1RIXTsKKyAgICAgIH0gUnhCdWZEZXNjcjsKKworCit0eXBlZGVmIHN0cnVjdCBfUGt0QnVmIHsKKwlzdHJ1Y3QgX1BrdEJ1ZiAqbmV4dExpbms7CisJc3RydWN0IF9Qa3RCdWYgKnByZXZMaW5rOworICAgICAgICBpbnQgICAgaGFuZGxlOworICAgICAgICBpbnQgICAgbGVuZ3RoOworICAgICAgICBpbnQgICAgcGFja2V0TGVuZ3RoOworICAgICAgICBEV09SRCAgc2VxdWVuY2U7CisgICAgICAgIEJZVEUgICpidWZmZXI7CisgICAgICB9IFBrdEJ1ZjsKKworCit0eXBlZGVmIHN0cnVjdCBfQ2FyZEhhbmRsZSB7CisgICAgICAgIEJZVEUgICAgICAgICBtb2R1bGVOYW1lWzE2XTsKKyAgICAgICAgQ29tbW9uQ2hhcnMgKmNvbW1vbjsKKyAgICAgIH0gQ2FyZEhhbmRsZTsKKworCit0eXBlZGVmIHN0cnVjdCBfQmluZGluZ3NMaXN0IHsKKyAgICAgICAgV09SRCAgbnVtQmluZGluZ3M7CisgICAgICAgIEJZVEUgIG1vZHVsZU5hbWVbMl1bMTZdOworICAgICAgfSBCaW5kaW5nc0xpc3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0ZhaWxpbmdNb2R1bGVzIHsKKyAgICAgICAgQllURSAgdXBwZXJNb2R1bGVOYW1lWzE2XTsKKyAgICAgICAgQllURSAgbG93ZXJNb2R1bGVOYW1lWzE2XTsKKyAgICAgIH0gRmFpbGluZ01vZHVsZXM7CisKKwordHlwZWRlZiB1bmlvbiBfSGFyZHdhcmVBZGRyZXNzIHsKKyAgICAgICAgQllURSAgYnl0ZXNbNl07CisgICAgICAgIFdPUkQgIHdvcmRzWzNdOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgIEJZVEUgYnl0ZXNbNl07CisgICAgICAgIH0gYWRkcjsKKyAgICAgIH0gSGFyZHdhcmVBZGRyZXNzOworCisKK3R5cGVkZWYgc3RydWN0IF9GZGRpSGVhZGVyIHsKKyAgICAgICAgQllURSAgICAgICAgICAgICBmcmFtZUNvbnRyb2w7CisgICAgICAgIEhhcmR3YXJlQWRkcmVzcyAgZXRoZXJEZXN0SG9zdDsKKyAgICAgICAgSGFyZHdhcmVBZGRyZXNzICBldGhlclNyY0hvc3Q7CisgICAgICB9IEZkZGlIZWFkZXI7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0V0aGVybmV0SUlIZWFkZXIgeworICAgICAgICBIYXJkd2FyZUFkZHJlc3MgIGV0aGVyRGVzdEhvc3Q7CisgICAgICAgIEhhcmR3YXJlQWRkcmVzcyAgZXRoZXJTcmNIb3N0OworICAgICAgICBXT1JEICAgICAgICAgICAgIGV0aGVyVHlwZTsKKyAgICAgIH0gRXRoZXJuZXRJSUhlYWRlcjsKKworCit0eXBlZGVmIHN0cnVjdCBfSWVlZTgwMkRvdDVIZWFkZXIgeworICAgICAgICBIYXJkd2FyZUFkZHJlc3MgIGV0aGVyRGVzdEhvc3Q7CisgICAgICAgIEhhcmR3YXJlQWRkcmVzcyAgZXRoZXJTcmNIb3N0OworICAgICAgICBCWVRFICAgICAgICAgICAgIHJvdXRlSW5mb1szMF07CisgICAgICB9IEllZWU4MDJEb3Q1SGVhZGVyOworCisKK3R5cGVkZWYgc3RydWN0IF9JZWVlODAyRG90MlNuYXBIZWFkZXIgeworICAgICAgICBCWVRFICBkc2FwOyAgICAgICAgICAgICAgICAgICAgICAvKiAweEFBICovCisgICAgICAgIEJZVEUgIHNzYXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4QUEgKi8KKyAgICAgICAgQllURSAgY29udHJvbDsgICAgICAgICAgICAgICAgICAgLyogMyAgICAqLworICAgICAgICBCWVRFIHByb3RvY29sSWRbNV07CisgICAgICB9IEllZWU4MDJEb3QyU25hcEhlYWRlcjsKKworCisvKgorICogIFByb3RvdHlwZXMKKyAqLworZXh0ZXJuIGNoYXIgKk5kaXNMYXN0RXJyb3IgICAgICAgICh2b2lkKTsKK2V4dGVybiBpbnQgICBOZGlzT3BlbiAgICAgICAgICAgICAodm9pZCk7CitleHRlcm4gaW50ICAgTmRpc0luaXQgICAgICAgICAgICAgKGludCBwcm9taXMpOworZXh0ZXJuIGludCAgIE5kaXNSZWdpc3RlckFuZEJpbmQgIChpbnQgcHJvbWlzKTsKK2V4dGVybiB2b2lkICBOZGlzU2h1dGRvd24gICAgICAgICAodm9pZCk7CitleHRlcm4gdm9pZCAgTmRpc0NoZWNrTWFjRmVhdHVyZXMgKHN0cnVjdCBfQ2FyZEhhbmRsZSAqY2FyZCk7CitleHRlcm4gaW50ICAgTmRpc1NlbmRQYWNrZXQgICAgICAgKHN0cnVjdCBfUGt0QnVmICpwa3RCdWYsIGludCBtYWNJZCk7CisKKy8qCisgKiAgQXNzZW1ibHkgImdsdWUiIGZ1bmN0aW9ucworICovCitleHRlcm4gaW50IHN5c3RlbVJlcXVlc3RHbHVlKCk7CitleHRlcm4gaW50IHJlcXVlc3RDb25maXJtR2x1ZSgpOworZXh0ZXJuIGludCB0cmFuc21pdENvbmZpcm1HbHVlKCk7CitleHRlcm4gaW50IHJlY2VpdmVMb29rYWhlYWRHbHVlKCk7CitleHRlcm4gaW50IGluZGljYXRpb25Db21wbGV0ZUdsdWUoKTsKK2V4dGVybiBpbnQgcmVjZWl2ZUNoYWluR2x1ZSgpOworZXh0ZXJuIGludCBzdGF0dXNHbHVlKCk7CisKKy8qCisgKiAgSU9DVEwgZnVuY3Rpb24KKyAqLworI2lmZGVmIF9fU01BTExfXworZXh0ZXJuIGludCBfZmFyIE5kaXNHZXRMaW5rYWdlIChpbnQgaGFuZGxlLCBjaGFyICpkYXRhLCBpbnQgc2l6ZSk7CisjZWxzZQorZXh0ZXJuIGludCBOZGlzR2V0TGlua2FnZSAoaW50IGhhbmRsZSwgY2hhciAqZGF0YSwgaW50IHNpemUpOworI2VuZGlmCisKKy8qCisgKiAgTkRJUyBjYWxsYmFjayBoYW5kbGVycworICovCitDQUxMQkFDSyAoTmRpc1N5c3RlbVJlcXVlc3QgICAgIChEV09SRCxEV09SRCwgV09SRCwgV09SRCwgV09SRCkpOworQ0FMTEJBQ0sgKE5kaXNSZXF1ZXN0Q29uZmlybSAgICAoIFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQsV09SRCkpOworQ0FMTEJBQ0sgKE5kaXNUcmFuc21pdENvbmZpcm0gICAoIFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQpKTsKK0NBTExCQUNLIChOZGlzUmVjZWl2ZUxvb2thaGVhZCAgKCBXT1JELCBXT1JELCBXT1JELCBCWVRFKiwgQllURSosIFdPUkQpKTsKK0NBTExCQUNLIChOZGlzUmVjZWl2ZUNoYWluICAgICAgKCBXT1JELCBXT1JELCBXT1JELCBzdHJ1Y3QgX1J4QnVmRGVzY3IqLCBCWVRFKiwgV09SRCkpOworQ0FMTEJBQ0sgKE5kaXNTdGF0dXNQcm9jICAgICAgICAoIFdPUkQsIFdPUkQsIEJZVEUqLCBXT1JELFdPUkQpKTsKK0NBTExCQUNLIChOZGlzSW5kaWNhdGlvbkNvbXBsZXRlKCBXT1JELCBXT1JEKSk7CisKK0JZVEUgKk5kaXNBbGxvY1N0YWNrICh2b2lkKTsKK3ZvaWQgIE5kaXNGcmVlU3RhY2sgIChCWVRFKik7CisKKyNpZmRlZiBfX0hJR0hDX18KKyAgI2RlZmluZSBSRU5BTUVfQVNNX1NZTSh4KSBwcmFnbWEgQWxpYXMoeCwiQCIgI3ggIiIpICAvKiBwcmVwZW5kIGBAJyAqLworICAjZGVmaW5lIFJFTkFNRV9DX1NZTSh4KSAgIHByYWdtYSBBbGlhcyh4LCJfIiAjeCAiIikgIC8qIHByZXBlbmQgYF8nICovCisKKyAgUkVOQU1FX0FTTV9TWU0gKHN5c3RlbVJlcXVlc3RHbHVlKTsKKyAgUkVOQU1FX0FTTV9TWU0gKHJlcXVlc3RDb25maXJtR2x1ZSk7CisgIFJFTkFNRV9BU01fU1lNICh0cmFuc21pdENvbmZpcm1HbHVlKTsKKyAgUkVOQU1FX0FTTV9TWU0gKHJlY2VpdmVMb29rYWhlYWRHbHVlKTsKKyAgUkVOQU1FX0FTTV9TWU0gKGluZGljYXRpb25Db21wbGV0ZUdsdWUpOworICBSRU5BTUVfQVNNX1NZTSAocmVjZWl2ZUNoYWluR2x1ZSk7CisgIFJFTkFNRV9BU01fU1lNIChzdGF0dXNHbHVlKTsKKyAgUkVOQU1FX0FTTV9TWU0gKE5kaXNHZXRMaW5rYWdlKTsKKyAgUkVOQU1FX0NfU1lNICAgKE5kaXNTeXN0ZW1SZXF1ZXN0KTsKKyAgUkVOQU1FX0NfU1lNICAgKE5kaXNSZXF1ZXN0Q29uZmlybSk7CisgIFJFTkFNRV9DX1NZTSAgIChOZGlzVHJhbnNtaXRDb25maXJtKTsKKyAgUkVOQU1FX0NfU1lNICAgKE5kaXNSZWNlaXZlTG9va2FoZWFkKTsKKyAgUkVOQU1FX0NfU1lNICAgKE5kaXNJbmRpY2F0aW9uQ29tcGxldGUpOworICBSRU5BTUVfQ19TWU0gICAoTmRpc1JlY2VpdmVDaGFpbik7CisgIFJFTkFNRV9DX1NZTSAgIChOZGlzU3RhdHVzUHJvYyk7CisgIFJFTkFNRV9DX1NZTSAgIChOZGlzQWxsb2NTdGFjayk7CisgIFJFTkFNRV9DX1NZTSAgIChOZGlzRnJlZVN0YWNrKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21zZG9zL25kaXNfMC5hc20gYi9tc2Rvcy9uZGlzXzAuYXNtCmluZGV4IDI5OTA5ODUuLmVhNjVlMGYgMTAwNjQ0Ci0tLSBhL21zZG9zL25kaXNfMC5hc20KKysrIGIvbXNkb3MvbmRpc18wLmFzbQpAQCAtMSwxODggKzEsMTg4IEBACi1QQUdFIDYwLDEzMg0KLU5BTUUgTkRJU18wDQotDQotaWZkZWYgRE9TWA0KLSAgLjM4Ng0KLSAgX1RFWFQgICBTRUdNRU5UIFBVQkxJQyBEV09SRCBVU0UxNiAnQ09ERScNCi0gIF9URVhUICAgRU5EUw0KLSAgX0RBVEEgICBTRUdNRU5UIFBVQkxJQyBEV09SRCBVU0UxNiAnQ09ERScNCi0gIF9EQVRBICAgRU5EUw0KLSAgX1RFWFQzMiBTRUdNRU5UIFBVQkxJQyBCWVRFICBVU0UzMiAnQ09ERScNCi0gIF9URVhUMzIgRU5EUw0KLSAgQ0JfRFNFRyBFUVUgPENTPiAgICAgICAgICAgICAgICAgICAgICAgICAgOyBET1NYIGlzIHRpbnktbW9kZWwNCi0gIERfU0VHICAgRVFVIDxfVEVYVCBTRUdNRU5UPg0KLSAgRF9FTkQgICBFUVUgPF9URVhUIEVORFM+DQotICBBU1NVTUUgIENTOl9URVhULERTOl9URVhUDQotDQotICBQVVNIUkVHUyBlcXUgPHB1c2hhZD4NCi0gIFBPUFJFR1MgIGVxdSA8cG9wYWQ+DQotDQotICBQVUJQUk9DIG1hY3JvIG5hbWUNCi0gICAgICAgICAgYWxpZ24gNA0KLSAgICAgICAgICBwdWJsaWMgQCZuYW1lDQotICAgICAgICAgIEAmbmFtZSBsYWJlbCBuZWFyDQotICAgICAgICAgIGVuZG0NCi1lbHNlDQotICAuMjg2DQotICBfVEVYVCAgIFNFR01FTlQgUFVCTElDIERXT1JEICdDT0RFJw0KLSAgX1RFWFQgICBFTkRTDQotICBfREFUQSAgIFNFR01FTlQgUFVCTElDIERXT1JEICdEQVRBJw0KLSAgX0RBVEEgICBFTkRTDQotICBDQl9EU0VHIEVRVSA8U0VHIF9EQVRBPiAgICAgICAgICAgICAgICAgICA7IDE2Yml0IGlzIHNtYWxsL2xhcmdlIG1vZGVsDQotICBEX1NFRyAgIEVRVSA8X0RBVEEgU0VHTUVOVD4NCi0gIERfRU5EICAgRVFVIDxfREFUQSBFTkRTPg0KLSAgQVNTVU1FICBDUzpfVEVYVCxEUzpfREFUQQ0KLQ0KLSAgUFVTSFJFR1MgZXF1IDxwdXNoYT4NCi0gIFBPUFJFR1MgIGVxdSA8cG9wYT4NCi0NCi0gIFBVQlBST0MgIG1hY3JvIG5hbWUNCi0gICAgICAgICAgIHB1YmxpYyBfJm5hbWUNCi0gICAgICAgICAgIF8mbmFtZSBsYWJlbCBmYXINCi0gICAgICAgICAgIGVuZG0NCi1lbmRpZg0KLQ0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotRF9TRUcNCi0NCi1EX0VORA0KLQ0KLQ0KLV9URVhUIFNFR01FTlQNCi0NCi1FWFRSTiBfTmRpc1N5c3RlbVJlcXVlc3QgICAgICA6IG5lYXINCi1FWFRSTiBfTmRpc1JlcXVlc3RDb25maXJtICAgICA6IG5lYXINCi1FWFRSTiBfTmRpc1RyYW5zbWl0Q29uZmlybSAgICA6IG5lYXINCi1FWFRSTiBfTmRpc1JlY2VpdmVMb29rYWhlYWQgICA6IG5lYXINCi1FWFRSTiBfTmRpc0luZGljYXRpb25Db21wbGV0ZSA6IG5lYXINCi1FWFRSTiBfTmRpc1JlY2VpdmVDaGFpbiAgICAgICA6IG5lYXINCi1FWFRSTiBfTmRpc1N0YXR1c1Byb2MgICAgICAgICA6IG5lYXINCi1FWFRSTiBfTmRpc0FsbG9jU3RhY2sgICAgICAgICA6IG5lYXINCi1FWFRSTiBfTmRpc0ZyZWVTdGFjayAgICAgICAgICA6IG5lYXINCi0NCi07DQotOyAqQUxMKiBpbnRlcnJ1cHQgdGhyZWFkcyBjb21lIHRocm91Z2ggdGhpcyBtYWNyby4NCi07DQotQ0FMTEJBQ0sgbWFjcm8gY2FsbGJhY2tQcm9jLCBhcmdzU2l6ZQ0KLQ0KLSAgICAgcHVzaGYNCi0gICAgIFBVU0hSRUdTICAgICAgICAgICAgICAgIDs7IFNhdmUgdGhlIHJlZ2lzdGVycw0KLQ0KLSAgICAgcHVzaCBlcw0KLSAgICAgcHVzaCBkcw0KLSAgICAgbW92ICBheCxDQl9EU0VHICAgICAgICAgOzsgTG9hZCBEUw0KLSAgICAgbW92ICBkcyxheA0KLSAgICAgY2FsbCBfTmRpc0FsbG9jU3RhY2sgICAgOzsgR2V0IGFuZCBpbnN0YWxsIGEgc3RhY2suDQotDQotICAgICBtb3YgIGJ4LHNzICAgICAgICAgICAgICA7OyBTYXZlIG9mZiB0aGUgb2xkIHN0YWNrIGluIG90aGVyIHJlZ3MNCi0gICAgIG1vdiAgY3gsc3ANCi0gICAgIG1vdiAgc3MsZHggICAgICAgICAgICAgIDs7IEluc3RhbGwgdGhlIG5ldyBvbmUNCi0gICAgIG1vdiAgc3AsYXgNCi0gICAgIHB1c2ggYnggICAgICAgICAgICAgICAgIDs7IFNhdmUgdGhlIG9sZCBvbmUgb24gdG8gdGhlIG5ldyBzdGFjaw0KLSAgICAgcHVzaCBjeA0KLSAgICAgc3ViICBzcCwmYXJnc1NpemUgICAgICAgOzsgQWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sNCi0NCi0gICAgIG1vdiAgYXgsc3MgICAgICAgICAgICAgIDs7IFNldCB1cCB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBtb3ZlDQotICAgICBtb3YgIGVzLGF4DQotICAgICBtb3YgIGRpLHNwDQotICAgICBtb3YgIGRzLGJ4ICAgICAgICAgICAgICA7OyBTZXQgdXAgdGhlIHNvdXJjZSBmb3IgdGhlIG1vdmUuDQotICAgICBtb3YgIHNpLGN4DQotICAgICBhZGQgIHNpLDQrNiszMg0KLQ0KLSAgICAgbW92ICBjeCwmYXJnc1NpemUgICAgICAgOzsgTW92ZSB0aGUgYXJndW1lbnRzIHRvIHRoZSBzdGFjay4NCi0gICAgIHNociAgY3gsMQ0KLSAgICAgY2xkDQotICAgICByZXAgIG1vdnN3DQotDQotICAgICBtb3YgIGF4LENCX0RTRUcgICAgICAgICA7OyBTZXQgbXkgZGF0YSBzZWdtZW50IGFnYWluLg0KLSAgICAgbW92ICBkcyxheA0KLQ0KLSAgICAgY2FsbCAmY2FsbGJhY2tQcm9jICAgICAgOzsgQ2FsbCB0aGUgcmVhbCBjYWxsYmFjay4NCi0gICAgIHBvcCAgZGkgICAgICAgICAgICAgICAgIDs7IFBvcCBvZmYgdGhlIG9sZCBzdGFjaw0KLSAgICAgcG9wICBzaQ0KLSAgICAgbW92ICBieCxzcyAgICAgICAgICAgICAgOzsgU2F2ZSBvZmYgdGhlIGN1cnJlbnQgYWxsb2NhdGVkIHN0YWNrLg0KLSAgICAgbW92ICBjeCxzcA0KLSAgICAgbW92ICBzcyxzaSAgICAgICAgICAgICAgOzsgUmVzdG9yZSB0aGUgb2xkIHN0YWNrDQotICAgICBtb3YgIHNwLGRpDQotICAgICBwdXNoIGF4ICAgICAgICAgICAgICAgICA7OyBTYXZlIHRoZSByZXR1cm4gY29kZQ0KLSAgICAgcHVzaCBieCAgICAgICAgICAgICAgICAgOzsgRnJlZSB0aGUgc3RhY2suIFB1c2ggdGhlIHBvaW50ZXIgdG8gaXQNCi0gICAgIHB1c2ggY3gNCi0gICAgIGNhbGwgX05kaXNGcmVlU3RhY2sNCi0gICAgIGFkZCAgc3AsNA0KLSAgICAgcG9wICBheCAgICAgICAgICAgICAgICAgOzsgR2V0IHRoZSByZXR1cm4gY29kZSBiYWNrDQotICAgICBhZGQgIGRpLDMyICAgICAgICAgICAgICA7OyBHZXQgYSBwb2ludGVyIHRvIGF4IG9uIHRoZSBzdGFjaw0KLSAgICAgbW92ICB3b3JkIHB0ciBzczpbZGldLGF4DQotICAgICBwb3AgIGRzDQotICAgICBwb3AgIGVzDQotDQotICAgICBQT1BSRUdTDQotICAgICBwb3BmDQotZW5kbQ0KLQ0KLTsNCi07IERlZmluZSBhbGwgb2YgdGhlIGNhbGxiYWNrcyBmb3IgdGhlIE5ESVMgcHJvY3MuDQotOw0KLQ0KLVBVQlBST0Mgc3lzdGVtUmVxdWVzdEdsdWUNCi1DQUxMQkFDSyBfTmRpc1N5c3RlbVJlcXVlc3QsMTQNCi1SRVRGDQotDQotUFVCUFJPQyByZXF1ZXN0Q29uZmlybUdsdWUNCi1DQUxMQkFDSyBfTmRpc1JlcXVlc3RDb25maXJtLDEyDQotUkVURg0KLQ0KLVBVQlBST0MgdHJhbnNtaXRDb25maXJtR2x1ZQ0KLUNBTExCQUNLIF9OZGlzVHJhbnNtaXRDb25maXJtLDEwDQotUkVURg0KLQ0KLVBVQlBST0MgcmVjZWl2ZUxvb2thaGVhZEdsdWUNCi1DQUxMQkFDSyBfTmRpc1JlY2VpdmVMb29rYWhlYWQsMTYNCi1SRVRGDQotDQotUFVCUFJPQyBpbmRpY2F0aW9uQ29tcGxldGVHbHVlDQotQ0FMTEJBQ0sgX05kaXNJbmRpY2F0aW9uQ29tcGxldGUsNA0KLVJFVEYNCi0NCi1QVUJQUk9DIHJlY2VpdmVDaGFpbkdsdWUNCi1DQUxMQkFDSyBfTmRpc1JlY2VpdmVDaGFpbiwxNg0KLVJFVEYNCi0NCi1QVUJQUk9DIHN0YXR1c0dsdWUNCi1DQUxMQkFDSyBfTmRpc1N0YXR1c1Byb2MsMTINCi1SRVRGDQotDQotOw0KLTsgaW50IEZBUiBOZGlzR2V0TGlua2FnZSAoaW50IGhhbmRsZSwgY2hhciAqZGF0YSwgaW50IHNpemUpOw0KLTsNCi0NCi1pZmRlZiBET1NYDQotICBQVUJQUk9DIE5kaXNHZXRMaW5rYWdlDQotICAgICAgICAgIHB1c2ggZWJ4DQotICAgICAgICAgIG1vdiBlYngsIFtlc3ArOF0gICAgICAgICAgICAgIDsgZGV2aWNlIGhhbmRsZQ0KLSAgICAgICAgICBtb3YgZWF4LCA0NDAyaCAgICAgICAgICAgICAgICA7IElPQ1RSTCByZWFkIGZ1bmN0aW9uDQotICAgICAgICAgIG1vdiBlZHgsIFtlc3ArMTJdICAgICAgICAgICAgIDsgRFM6RURYIC0+IHJlc3VsdCBkYXRhDQotICAgICAgICAgIG1vdiBlY3gsIFtlc3ArMTZdICAgICAgICAgICAgIDsgRUNYID0gbGVuZ3RoDQotICAgICAgICAgIGludCAyMWgNCi0gICAgICAgICAgcG9wIGVieA0KLSAgICAgICAgICBqYyAgQGZhaWwNCi0gICAgICAgICAgeG9yIGVheCwgZWF4DQotICBAZmFpbDogIHJldA0KLQ0KLWVsc2UNCi0gIFBVQlBST0MgTmRpc0dldExpbmthZ2UNCi0gICAgICAgICAgZW50ZXIgMCwgMA0KLSAgICAgICAgICBtb3YgYngsIFticCs2XQ0KLSAgICAgICAgICBtb3YgYXgsIDQ0MDJoDQotICAgICAgICAgIG1vdiBkeCwgW2JwKzhdDQotICAgICAgICAgIG1vdiBjeCwgW2JwKzEyXQ0KLSAgICAgICAgICBpbnQgMjFoDQotICAgICAgICAgIGpjICBAZmFpbA0KLSAgICAgICAgICB4b3IgYXgsIGF4DQotICBAZmFpbDogIGxlYXZlDQotICAgICAgICAgIHJldGYNCi1lbmRpZg0KLQ0KLUVORFMNCi0NCi1FTkQNCitQQUdFIDYwLDEzMgorTkFNRSBORElTXzAKKworaWZkZWYgRE9TWAorICAuMzg2CisgIF9URVhUICAgU0VHTUVOVCBQVUJMSUMgRFdPUkQgVVNFMTYgJ0NPREUnCisgIF9URVhUICAgRU5EUworICBfREFUQSAgIFNFR01FTlQgUFVCTElDIERXT1JEIFVTRTE2ICdDT0RFJworICBfREFUQSAgIEVORFMKKyAgX1RFWFQzMiBTRUdNRU5UIFBVQkxJQyBCWVRFICBVU0UzMiAnQ09ERScKKyAgX1RFWFQzMiBFTkRTCisgIENCX0RTRUcgRVFVIDxDUz4gICAgICAgICAgICAgICAgICAgICAgICAgIDsgRE9TWCBpcyB0aW55LW1vZGVsCisgIERfU0VHICAgRVFVIDxfVEVYVCBTRUdNRU5UPgorICBEX0VORCAgIEVRVSA8X1RFWFQgRU5EUz4KKyAgQVNTVU1FICBDUzpfVEVYVCxEUzpfVEVYVAorCisgIFBVU0hSRUdTIGVxdSA8cHVzaGFkPgorICBQT1BSRUdTICBlcXUgPHBvcGFkPgorCisgIFBVQlBST0MgbWFjcm8gbmFtZQorICAgICAgICAgIGFsaWduIDQKKyAgICAgICAgICBwdWJsaWMgQCZuYW1lCisgICAgICAgICAgQCZuYW1lIGxhYmVsIG5lYXIKKyAgICAgICAgICBlbmRtCitlbHNlCisgIC4yODYKKyAgX1RFWFQgICBTRUdNRU5UIFBVQkxJQyBEV09SRCAnQ09ERScKKyAgX1RFWFQgICBFTkRTCisgIF9EQVRBICAgU0VHTUVOVCBQVUJMSUMgRFdPUkQgJ0RBVEEnCisgIF9EQVRBICAgRU5EUworICBDQl9EU0VHIEVRVSA8U0VHIF9EQVRBPiAgICAgICAgICAgICAgICAgICA7IDE2Yml0IGlzIHNtYWxsL2xhcmdlIG1vZGVsCisgIERfU0VHICAgRVFVIDxfREFUQSBTRUdNRU5UPgorICBEX0VORCAgIEVRVSA8X0RBVEEgRU5EUz4KKyAgQVNTVU1FICBDUzpfVEVYVCxEUzpfREFUQQorCisgIFBVU0hSRUdTIGVxdSA8cHVzaGE+CisgIFBPUFJFR1MgIGVxdSA8cG9wYT4KKworICBQVUJQUk9DICBtYWNybyBuYW1lCisgICAgICAgICAgIHB1YmxpYyBfJm5hbWUKKyAgICAgICAgICAgXyZuYW1lIGxhYmVsIGZhcgorICAgICAgICAgICBlbmRtCitlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEX1NFRworCitEX0VORAorCisKK19URVhUIFNFR01FTlQKKworRVhUUk4gX05kaXNTeXN0ZW1SZXF1ZXN0ICAgICAgOiBuZWFyCitFWFRSTiBfTmRpc1JlcXVlc3RDb25maXJtICAgICA6IG5lYXIKK0VYVFJOIF9OZGlzVHJhbnNtaXRDb25maXJtICAgIDogbmVhcgorRVhUUk4gX05kaXNSZWNlaXZlTG9va2FoZWFkICAgOiBuZWFyCitFWFRSTiBfTmRpc0luZGljYXRpb25Db21wbGV0ZSA6IG5lYXIKK0VYVFJOIF9OZGlzUmVjZWl2ZUNoYWluICAgICAgIDogbmVhcgorRVhUUk4gX05kaXNTdGF0dXNQcm9jICAgICAgICAgOiBuZWFyCitFWFRSTiBfTmRpc0FsbG9jU3RhY2sgICAgICAgICA6IG5lYXIKK0VYVFJOIF9OZGlzRnJlZVN0YWNrICAgICAgICAgIDogbmVhcgorCis7Cis7ICpBTEwqIGludGVycnVwdCB0aHJlYWRzIGNvbWUgdGhyb3VnaCB0aGlzIG1hY3JvLgorOworQ0FMTEJBQ0sgbWFjcm8gY2FsbGJhY2tQcm9jLCBhcmdzU2l6ZQorCisgICAgIHB1c2hmCisgICAgIFBVU0hSRUdTICAgICAgICAgICAgICAgIDs7IFNhdmUgdGhlIHJlZ2lzdGVycworCisgICAgIHB1c2ggZXMKKyAgICAgcHVzaCBkcworICAgICBtb3YgIGF4LENCX0RTRUcgICAgICAgICA7OyBMb2FkIERTCisgICAgIG1vdiAgZHMsYXgKKyAgICAgY2FsbCBfTmRpc0FsbG9jU3RhY2sgICAgOzsgR2V0IGFuZCBpbnN0YWxsIGEgc3RhY2suCisKKyAgICAgbW92ICBieCxzcyAgICAgICAgICAgICAgOzsgU2F2ZSBvZmYgdGhlIG9sZCBzdGFjayBpbiBvdGhlciByZWdzCisgICAgIG1vdiAgY3gsc3AKKyAgICAgbW92ICBzcyxkeCAgICAgICAgICAgICAgOzsgSW5zdGFsbCB0aGUgbmV3IG9uZQorICAgICBtb3YgIHNwLGF4CisgICAgIHB1c2ggYnggICAgICAgICAgICAgICAgIDs7IFNhdmUgdGhlIG9sZCBvbmUgb24gdG8gdGhlIG5ldyBzdGFjaworICAgICBwdXNoIGN4CisgICAgIHN1YiAgc3AsJmFyZ3NTaXplICAgICAgIDs7IEFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgb24gdGhlIHN0YWNrCisKKyAgICAgbW92ICBheCxzcyAgICAgICAgICAgICAgOzsgU2V0IHVwIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIG1vdmUKKyAgICAgbW92ICBlcyxheAorICAgICBtb3YgIGRpLHNwCisgICAgIG1vdiAgZHMsYnggICAgICAgICAgICAgIDs7IFNldCB1cCB0aGUgc291cmNlIGZvciB0aGUgbW92ZS4KKyAgICAgbW92ICBzaSxjeAorICAgICBhZGQgIHNpLDQrNiszMgorCisgICAgIG1vdiAgY3gsJmFyZ3NTaXplICAgICAgIDs7IE1vdmUgdGhlIGFyZ3VtZW50cyB0byB0aGUgc3RhY2suCisgICAgIHNociAgY3gsMQorICAgICBjbGQKKyAgICAgcmVwICBtb3ZzdworCisgICAgIG1vdiAgYXgsQ0JfRFNFRyAgICAgICAgIDs7IFNldCBteSBkYXRhIHNlZ21lbnQgYWdhaW4uCisgICAgIG1vdiAgZHMsYXgKKworICAgICBjYWxsICZjYWxsYmFja1Byb2MgICAgICA7OyBDYWxsIHRoZSByZWFsIGNhbGxiYWNrLgorICAgICBwb3AgIGRpICAgICAgICAgICAgICAgICA7OyBQb3Agb2ZmIHRoZSBvbGQgc3RhY2sKKyAgICAgcG9wICBzaQorICAgICBtb3YgIGJ4LHNzICAgICAgICAgICAgICA7OyBTYXZlIG9mZiB0aGUgY3VycmVudCBhbGxvY2F0ZWQgc3RhY2suCisgICAgIG1vdiAgY3gsc3AKKyAgICAgbW92ICBzcyxzaSAgICAgICAgICAgICAgOzsgUmVzdG9yZSB0aGUgb2xkIHN0YWNrCisgICAgIG1vdiAgc3AsZGkKKyAgICAgcHVzaCBheCAgICAgICAgICAgICAgICAgOzsgU2F2ZSB0aGUgcmV0dXJuIGNvZGUKKyAgICAgcHVzaCBieCAgICAgICAgICAgICAgICAgOzsgRnJlZSB0aGUgc3RhY2suIFB1c2ggdGhlIHBvaW50ZXIgdG8gaXQKKyAgICAgcHVzaCBjeAorICAgICBjYWxsIF9OZGlzRnJlZVN0YWNrCisgICAgIGFkZCAgc3AsNAorICAgICBwb3AgIGF4ICAgICAgICAgICAgICAgICA7OyBHZXQgdGhlIHJldHVybiBjb2RlIGJhY2sKKyAgICAgYWRkICBkaSwzMiAgICAgICAgICAgICAgOzsgR2V0IGEgcG9pbnRlciB0byBheCBvbiB0aGUgc3RhY2sKKyAgICAgbW92ICB3b3JkIHB0ciBzczpbZGldLGF4CisgICAgIHBvcCAgZHMKKyAgICAgcG9wICBlcworCisgICAgIFBPUFJFR1MKKyAgICAgcG9wZgorZW5kbQorCis7Cis7IERlZmluZSBhbGwgb2YgdGhlIGNhbGxiYWNrcyBmb3IgdGhlIE5ESVMgcHJvY3MuCis7CisKK1BVQlBST0Mgc3lzdGVtUmVxdWVzdEdsdWUKK0NBTExCQUNLIF9OZGlzU3lzdGVtUmVxdWVzdCwxNAorUkVURgorCitQVUJQUk9DIHJlcXVlc3RDb25maXJtR2x1ZQorQ0FMTEJBQ0sgX05kaXNSZXF1ZXN0Q29uZmlybSwxMgorUkVURgorCitQVUJQUk9DIHRyYW5zbWl0Q29uZmlybUdsdWUKK0NBTExCQUNLIF9OZGlzVHJhbnNtaXRDb25maXJtLDEwCitSRVRGCisKK1BVQlBST0MgcmVjZWl2ZUxvb2thaGVhZEdsdWUKK0NBTExCQUNLIF9OZGlzUmVjZWl2ZUxvb2thaGVhZCwxNgorUkVURgorCitQVUJQUk9DIGluZGljYXRpb25Db21wbGV0ZUdsdWUKK0NBTExCQUNLIF9OZGlzSW5kaWNhdGlvbkNvbXBsZXRlLDQKK1JFVEYKKworUFVCUFJPQyByZWNlaXZlQ2hhaW5HbHVlCitDQUxMQkFDSyBfTmRpc1JlY2VpdmVDaGFpbiwxNgorUkVURgorCitQVUJQUk9DIHN0YXR1c0dsdWUKK0NBTExCQUNLIF9OZGlzU3RhdHVzUHJvYywxMgorUkVURgorCis7Cis7IGludCBGQVIgTmRpc0dldExpbmthZ2UgKGludCBoYW5kbGUsIGNoYXIgKmRhdGEsIGludCBzaXplKTsKKzsKKworaWZkZWYgRE9TWAorICBQVUJQUk9DIE5kaXNHZXRMaW5rYWdlCisgICAgICAgICAgcHVzaCBlYngKKyAgICAgICAgICBtb3YgZWJ4LCBbZXNwKzhdICAgICAgICAgICAgICA7IGRldmljZSBoYW5kbGUKKyAgICAgICAgICBtb3YgZWF4LCA0NDAyaCAgICAgICAgICAgICAgICA7IElPQ1RSTCByZWFkIGZ1bmN0aW9uCisgICAgICAgICAgbW92IGVkeCwgW2VzcCsxMl0gICAgICAgICAgICAgOyBEUzpFRFggLT4gcmVzdWx0IGRhdGEKKyAgICAgICAgICBtb3YgZWN4LCBbZXNwKzE2XSAgICAgICAgICAgICA7IEVDWCA9IGxlbmd0aAorICAgICAgICAgIGludCAyMWgKKyAgICAgICAgICBwb3AgZWJ4CisgICAgICAgICAgamMgIEBmYWlsCisgICAgICAgICAgeG9yIGVheCwgZWF4CisgIEBmYWlsOiAgcmV0CisKK2Vsc2UKKyAgUFVCUFJPQyBOZGlzR2V0TGlua2FnZQorICAgICAgICAgIGVudGVyIDAsIDAKKyAgICAgICAgICBtb3YgYngsIFticCs2XQorICAgICAgICAgIG1vdiBheCwgNDQwMmgKKyAgICAgICAgICBtb3YgZHgsIFticCs4XQorICAgICAgICAgIG1vdiBjeCwgW2JwKzEyXQorICAgICAgICAgIGludCAyMWgKKyAgICAgICAgICBqYyAgQGZhaWwKKyAgICAgICAgICB4b3IgYXgsIGF4CisgIEBmYWlsOiAgbGVhdmUKKyAgICAgICAgICByZXRmCitlbmRpZgorCitFTkRTCisKK0VORApkaWZmIC0tZ2l0IGEvbXNkb3MvcGt0X3J4MC5hc20gYi9tc2Rvcy9wa3RfcngwLmFzbQppbmRleCA5NGYzZDA5Li5kNjA0ZmExIDEwMDY0NAotLS0gYS9tc2Rvcy9wa3RfcngwLmFzbQorKysgYi9tc2Rvcy9wa3RfcngwLmFzbQpAQCAtMSwxOTcgKzEsMTk3IEBACi1QQUdFIDYwLDEzMg0KLU5BTUUgUEtUX1JYDQotDQotaWZkZWYgPz92ZXJzaW9uICAgICAgICA7IHVzaW5nIFRBU00NCi0gIG1hc20NCi0gIGp1bXBzDQotZW5kaWYNCi0NCi1QVUJMSUMgX3BrdERyb3AsIF9wa3RSeEJ1ZiwgX3BrdFR4QnVmLCAgICBfcGt0VGVtcA0KLVBVQkxJQyBfcnhPdXRPZnMsIF9yeEluT2ZzLCBfUGt0UmVjZWl2ZXIsIF9wa3RSeEVuZA0KLQ0KLTsNCi07IHRoZXNlIHNpemVzIE1VU1QgYmUgZXF1YWwgdG8gdGhlIHNpemVzIGluIFBLVERSVlIuSA0KLTsNCi0NCi1SWF9CVUZfU0laRSA9IDE1MDAgICAgICA7IG1heCBtZXNzYWdlIHNpemUgb24gRXRoZXJuZXQNCi1UWF9CVUZfU0laRSA9IDE1MDANCi0NCi1pZmRlZiBET1NYDQotIC4zODYNCi0gIE5VTV9SWF9CVUYgPSAzMiAgICAgICA7ICMgb2YgUlggZWxlbWVudCBidWZmZXJzDQotICBfVEVYVCAgIFNFR01FTlQgUFVCTElDIERXT1JEIFVTRTE2ICdDT0RFJw0KLSAgX1RFWFQgICBFTkRTDQotICBfREFUQSAgIFNFR01FTlQgUFVCTElDIERXT1JEIFVTRTE2ICdDT0RFJw0KLSAgX0RBVEEgICBFTkRTDQotICBEX1NFRyAgIEVRVSA8X1RFWFQgU0VHTUVOVD4NCi0gIERfRU5EICAgRVFVIDxfVEVYVCBFTkRTPg0KLSAgQVNTVU1FICBDUzpfVEVYVCxEUzpfVEVYVA0KLWVsc2UNCi0gLjI4Ng0KLSAgTlVNX1JYX0JVRiA9IDEwDQotICBfVEVYVCAgIFNFR01FTlQgUFVCTElDIERXT1JEICdDT0RFJw0KLSAgX1RFWFQgICBFTkRTDQotICBfREFUQSAgIFNFR01FTlQgUFVCTElDIERXT1JEICdEQVRBJw0KLSAgX0RBVEEgICBFTkRTDQotICBEX1NFRyAgIEVRVSA8X0RBVEEgU0VHTUVOVD4NCi0gIERfRU5EICAgRVFVIDxfREFUQSBFTkRTPg0KLSAgQVNTVU1FICBDUzpfVEVYVCxEUzpfREFUQQ0KLWVuZGlmDQotDQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi1EX1NFRw0KLQ0KLVJYX0VMRU1FTlQgICAgIFNUUlVDDQotICAgZmlyc3RDb3VudCAgZHcgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIyBvZiBieXRlcyBvbiAxc3QgY2FsbA0KLSAgIHNlY29uZENvdW50IGR3ICAwICAgICAgICAgICAgICAgICAgICAgICAgICA7ICMgb2YgYnl0ZXMgb24gMm5kIGNhbGwNCi0gICBoYW5kbGUgICAgICBkdyAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgOyBoYW5kbGUgZm9yIHVwY2FsbA0KLSAgIGRlc3RpbkFkciAgIGRiICA2ICAgICAgICAgICBkdXAgKDApICAgICAgICA7IHBhY2tldCBkZXN0aW5hdGlvbiBhZGRyZXNzDQotICAgc291cmNlQWRyICAgZGIgIDYgICAgICAgICAgIGR1cCAoMCkgICAgICAgIDsgcGFja2V0IHNvdXJjZSBhZGRyZXNzDQotICAgcHJvdG9jb2wgICAgZHcgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcGFja2V0IHByb3RvY29sIG51bWJlcg0KLSAgIHJ4QnVmZmVyICAgIGRiICBSWF9CVUZfU0laRSBkdXAgKDApICAgICAgICA7IFJYIGJ1ZmZlcg0KLUVORFMNCi0gICAgICAgICAgICAgICBhbGlnbiA0DQotX3J4T3V0T2ZzICAgICAgZHcgIG9mZnNldCBfcGt0UnhCdWYgICAgICAgICAgIDsgcmluZyBidWZmZXIgb2Zmc2V0cw0KLV9yeEluT2ZzICAgICAgIGR3ICBvZmZzZXQgX3BrdFJ4QnVmICAgICAgICAgICA7IGludG8gX3BrdFJ4QnVmDQotX3BrdERyb3AgICAgICAgZHcgIDAsMCAgICAgICAgICAgICAgICAgICAgICAgIDsgcGFja2V0IGRyb3AgY291bnRlcg0KLV9wa3RUZW1wICAgICAgIGRiICAyMCAgICAgICAgICAgICAgICBkdXAgKDApICA7IHRlbXAgd29yayBhcmVhDQotX3BrdFR4QnVmICAgICAgZGIgIChUWF9CVUZfU0laRSsxNCkgIGR1cCAoMCkgIDsgVFggYnVmZmVyDQotX3BrdFJ4QnVmICAgICAgUlhfRUxFTUVOVCBOVU1fUlhfQlVGIGR1cCAoPD4pIDsgUlggc3RydWN0dXJlcw0KLSBMQVNUX09GUyAgICAgID0gb2Zmc2V0ICQNCi0NCi0gc2NyZWVuU2VnICAgICBkdyAgMEI4MDBoDQotIG5ld0luT2Zmc2V0ICAgZHcgIDANCi0NCi0gZmFuQ2hhcnMgICAgICBkYiAgJy1cfC8nDQotIGZhbkluZGV4ICAgICAgZHcgIDANCi0NCi1EX0VORA0KLQ0KLV9URVhUIFNFR01FTlQNCi0NCi0NCi1TSE9XX1JYICBNQUNSTw0KLSAgICAgICAgIHB1c2ggZXMNCi0gICAgICAgICBwdXNoIGJ4DQotICAgICAgICAgbW92IGJ4LCBzY3JlZW5TZWcNCi0gICAgICAgICBtb3YgZXMsIGJ4ICAgICAgICAgICAgICAgICAgICA7OyByLW1vZGUgc2VnbWVudCBvZiBjb2xvdXIgc2NyZWVuDQotICAgICAgICAgbW92IGRpLCAxNTggICAgICAgICAgICAgICAgICAgOzsgdXBwZXIgcmlnaHQgY29ybmVyIC0gMQ0KLSAgICAgICAgIG1vdiBieCwgZmFuSW5kZXgNCi0gICAgICAgICBtb3YgYWwsIGZhbkNoYXJzW2J4XSAgICAgICAgICA7OyBnZXQgd3JpdGUgY2hhcg0KLSAgICAgICAgIG1vdiBhaCwgMTUgICAgICAgICAgICAgICAgICAgIDs7ICBhbmQgd2hpdGUgY29sb3VyDQotICAgICAgICAgc3Rvc3cgICAgICAgICAgICAgICAgICAgICAgICAgOzsgd3JpdGUgdG8gc2NyZWVuIGF0IEVTOkVESQ0KLSAgICAgICAgIGluYyBmYW5JbmRleCAgICAgICAgICAgICAgICAgIDs7IHVwZGF0ZSBuZXh0IGluZGV4DQotICAgICAgICAgYW5kIGZhbkluZGV4LCAzDQotICAgICAgICAgcG9wIGJ4DQotICAgICAgICAgcG9wIGVzDQotRU5ETQ0KLQ0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi07DQotOyBUaGlzIG1hY3JvIHJldHVybiBFUzpESSB0byB0YWlsIG9mIFJ4IHF1ZXVlDQotDQotRU5RVUVVRSAgTUFDUk8NCi0gICAgICAgICBMT0NBTCBAbm9XcmFwDQotICAgICAgICAgbW92IGF4LCBfcnhJbk9mcyAgICAgICAgICAgICAgOzsgREkgPSBjdXJyZW50IGluLW9mZnNldA0KLSAgICAgICAgIGFkZCBheCwgU0laRSBSWF9FTEVNRU5UICAgICAgIDs7IHBvaW50IHRvIG5leHQgX3BrdFJ4QnVmIGJ1ZmZlcg0KLSAgICAgICAgIGNtcCBheCwgTEFTVF9PRlMgICAgICAgICAgICAgIDs7IHBvaW50aW5nIHBhc3QgbGFzdCA/DQotICAgICAgICAgamIgIEBub1dyYXAgICAgICAgICAgICAgICAgICAgOzsgbm8gLSBqdW1wDQotICAgICAgICAgbGVhIGF4LCBfcGt0UnhCdWYgICAgICAgICAgICAgOzsgeWVzLCBwb2ludCB0byAxc3QgYnVmZmVyDQotICAgICAgICAgYWxpZ24gNA0KLUBub1dyYXA6IGNtcCBheCwgX3J4T3V0T2ZzICAgICAgICAgICAgIDs7IGluLW9mcyA9IG91dC1vZnMgPw0KLSAgICAgICAgIGplICBAZHVtcCAgICAgICAgICAgICAgICAgICAgIDs7IHllcywgcXVldWUgaXMgZnVsbA0KLSAgICAgICAgIG1vdiBkaSwgX3J4SW5PZnMgICAgICAgICAgICAgIDs7IEVTOkRJIC0+IGJ1ZmZlciBhdCBxdWV1ZSBpbnB1dA0KLSAgICAgICAgIG1vdiBuZXdJbk9mZnNldCwgYXggICAgICAgICAgIDs7IHJlbWVtYmVyIG5ldyBpbnB1dCBvZmZzZXQNCi0NCi0gICA7OyBOT1RFLiByeEluT2ZzIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIHBhY2tldCBoYXMgYmVlbiBjb3BpZWQNCi0gICA7OyB0byBFUzpESSAoPSBEUzpTSSBvbiAybmQgY2FsbCkgYnkgdGhlIHBhY2tldCBkcml2ZXINCi0NCi1FTkRNDQotDQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLTsNCi07IFRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCBieSB0aGUgcGFja2V0IGRyaXZlciB0d2ljZToNCi07ICAgMXN0IHRpbWUgKEFYPTApIGl0IHJlcXVlc3RzIGFuIGFkZHJlc3Mgd2hlcmUgdG8gcHV0IHRoZSBwYWNrZXQNCi07DQotOyAgIDJuZCB0aW1lIChBWD0xKSB0aGUgcGFja2V0IGhhcyBiZWVuIGNvcGllZCB0byB0aGlzIGxvY2F0aW9uIChEUzpTSSkNCi07ICAgQlggaGFzIGNsaWVudCBoYW5kbGUgKHN0b3JlZCBpbiBSWF9FTEVNRU5ULmhhbmRsZSkuDQotOyAgIENYIGhhcyAjIG9mIGJ5dGVzIGluIHBhY2tldCBvbiBib3RoIGNhbGwuIFRoZXkgc2hvdWxkIGJlIGVxdWFsLg0KLTsNCi07IEEgdGVzdCBmb3IgZXF1YWxpdHkgaXMgZG9uZSBieSBwdXR0aW5nIENYIGluIF9wa3RSeEJ1ZiBbbl0uZmlyc3RDb3VudA0KLTsgYW5kIF9wa3RSeEJ1ZltuXS5zZWNvbmRDb3VudCwgYW5kIENMIG9uIGZpcnN0IGNhbGwgaW4NCi07IF9wa3RSeEJ1ZltuXS5yeEJ1ZmZlcltDWF0uIFRoZXNlIHZhbHVlcyBhcmUgY2hlY2tlZCBpbiAiUGt0UmVjZWl2ZSINCi07IChQS1REUlZSLkMpDQotOw0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi1fUGt0UmVjZWl2ZXI6DQotICAgICAgICAgcHVzaGYNCi0gICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBubyBkaXN0cmFjdGlvbiB3YW50ZWQgIQ0KLSAgICAgICAgIHB1c2ggZHMNCi0gICAgICAgICBwdXNoIGJ4DQotaWZkZWYgRE9TWA0KLSAgICAgICAgIG1vdiBieCwgY3MNCi1lbHNlDQotICAgICAgICAgbW92IGJ4LCBTRUcgX0RBVEENCi1lbmRpZg0KLSAgICAgICAgIG1vdiBkcywgYngNCi0gICAgICAgICBtb3YgZXMsIGJ4ICAgICAgICAgICAgICAgICAgOyBFUyA9IERTID0gQ1Mgb3Igc2VnIF9EQVRBDQotICAgICAgICAgcG9wIGJ4ICAgICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBoYW5kbGUNCi0NCi0gICAgICAgICBjbXAgYXgsIDAgICAgICAgICAgICAgICAgICAgOyBmaXJzdCBjYWxsPyAoQVg9MCkNCi0gICAgICAgICBqbmUgQHBvc3QgICAgICAgICAgICAgICAgICAgOyBBWD0xOiBzZWNvbmQgY2FsbCwgZG8gcG9zdCBwcm9jZXNzDQotDQotaWZkZWYgREVCVUcNCi0gICAgICAgICBTSE9XX1JYICAgICAgICAgICAgICAgICAgICAgOyBzaG93IHRoYXQgYSBwYWNrZXQgaXMgcmVjZWl2ZWQNCi1lbmRpZg0KLSAgICAgICAgIGNtcCBjeCwgUlhfQlVGX1NJWkUrMTQgICAgICA7IHNpemUgT0sgPw0KLSAgICAgICAgIGphICBAc2tpcCAgICAgICAgICAgICAgICAgICA7IG5vLCBwYWNrZXQgdG8gbGFyZ2UgZm9yIHVzDQotDQotICAgICAgICAgRU5RVUVVRSAgICAgICAgICAgICAgICAgICAgIDsgRVM6REkgLT4gX3BrdFJ4QnVmW25dDQotDQotICAgICAgICAgbW92IFtkaV0uZmlyc3RDb3VudCwgY3ggICAgIDsgcmVtZW1iZXIgdGhlIGZpcnN0IGNvdW50Lg0KLSAgICAgICAgIG1vdiBbZGldLmhhbmRsZSwgYnggICAgICAgICA7IHJlbWVtYmVyIHRoZSBoYW5kbGUuDQotICAgICAgICAgYWRkIGRpLCA2ICAgICAgICAgICAgICAgICAgIDsgRVM6REkgLT4gX3BrdFJ4QnVmW25dLmRlc3RpbkFkcg0KLSAgICAgICAgIHBvcCBkcw0KLSAgICAgICAgIHBvcGYNCi0gICAgICAgICByZXRmICAgICAgICAgICAgICAgICAgICAgICAgOyBmYXIgcmV0dXJuIHRvIGRyaXZlciB3aXRoIEVTOkRJDQotDQotICAgICAgICAgYWxpZ24gNA0KLUBkdW1wOiAgIGluYyBfcGt0RHJvcFswXSAgICAgICAgICAgICA7IGRpc2NhcmQgdGhlIHBhY2tldCBvbiAxc3QgY2FsbA0KLSAgICAgICAgIGFkYyBfcGt0RHJvcFsyXSwgMCAgICAgICAgICA7IGluY3JlbWVudCBwYWNrZXRzIGxvc3QNCi0NCi1Ac2tpcDogICB4b3IgZGksIGRpICAgICAgICAgICAgICAgICAgOyByZXR1cm4gRVM6REkgPSBOSUwgcG9pbnRlcg0KLSAgICAgICAgIHhvciBheCwgYXgNCi0gICAgICAgICBtb3YgZXMsIGF4DQotICAgICAgICAgcG9wIGRzDQotICAgICAgICAgcG9wZg0KLSAgICAgICAgIHJldGYNCi0NCi0gICAgICAgICBhbGlnbiA0DQotQHBvc3Q6ICAgb3Igc2ksIHNpICAgICAgICAgICAgICAgICAgIDsgRFM6U0ktPl9wa3RSeEJ1ZltuXVtuXS5kZXN0aW5BZHINCi0gICAgICAgICBqeiBAZGlzY2FyZCAgICAgICAgICAgICAgICAgOyBtYWtlIHN1cmUgd2UgZG9uJ3QgdXNlIE5VTEwtcG9pbnRlcg0KLQ0KLSAgICAgICAgIHN1YiBzaSwgNiAgICAgICAgICAgICAgICAgICA7IERTOlNJIC0+IF9wa3RSeEJ1ZltuXS5kZXN0aW5BZHINCi0gICAgICAgOw0KLSAgICAgICA7IHB1c2ggc2kNCi0gICAgICAgOyBwdXNoIFtzaV0uZmlyc3RDb3VudA0KLSAgICAgICA7IGNhbGwgYnBmX2ZpbHRlcl9tYXRjaCAgICAgICA7IHJ1biB0aGUgZmlsdGVyIGhlcmUgc29tZSBkYXk/DQotICAgICAgIDsgYWRkIHNwLCA0DQotICAgICAgIDsgY21wIGF4LCAwDQotICAgICAgIDsgamUgIEBkaXNjYXJkDQotDQotICAgICAgICAgbW92IFtzaV0uc2Vjb25kQ291bnQsIGN4DQotICAgICAgICAgbW92IGF4LCBuZXdJbk9mZnNldA0KLSAgICAgICAgIG1vdiBfcnhJbk9mcywgYXggICAgICAgICAgICA7IHVwZGF0ZSBfcGt0UnhCdWYgaW5wdXQgb2Zmc2V0DQotDQotICAgICAgICAgYWxpZ24gNA0KLUBkaXNjYXJkOnBvcCBkcw0KLSAgICAgICAgIHBvcGYNCi0gICAgICAgICByZXRmDQotDQotX3BrdFJ4RW5kICBkYiAwICAgICAgICAgICAgICAgICAgICAgIDsgbWFya2VyIGZvciBlbmQgb2Ygci1tb2RlIGNvZGUvZGF0YQ0KLQ0KLV9URVhUIEVORFMNCi0NCi1FTkQNCitQQUdFIDYwLDEzMgorTkFNRSBQS1RfUlgKKworaWZkZWYgPz92ZXJzaW9uICAgICAgICA7IHVzaW5nIFRBU00KKyAgbWFzbQorICBqdW1wcworZW5kaWYKKworUFVCTElDIF9wa3REcm9wLCBfcGt0UnhCdWYsIF9wa3RUeEJ1ZiwgICAgX3BrdFRlbXAKK1BVQkxJQyBfcnhPdXRPZnMsIF9yeEluT2ZzLCBfUGt0UmVjZWl2ZXIsIF9wa3RSeEVuZAorCis7Cis7IHRoZXNlIHNpemVzIE1VU1QgYmUgZXF1YWwgdG8gdGhlIHNpemVzIGluIFBLVERSVlIuSAorOworCitSWF9CVUZfU0laRSA9IDE1MDAgICAgICA7IG1heCBtZXNzYWdlIHNpemUgb24gRXRoZXJuZXQKK1RYX0JVRl9TSVpFID0gMTUwMAorCitpZmRlZiBET1NYCisgLjM4NgorICBOVU1fUlhfQlVGID0gMzIgICAgICAgOyAjIG9mIFJYIGVsZW1lbnQgYnVmZmVycworICBfVEVYVCAgIFNFR01FTlQgUFVCTElDIERXT1JEIFVTRTE2ICdDT0RFJworICBfVEVYVCAgIEVORFMKKyAgX0RBVEEgICBTRUdNRU5UIFBVQkxJQyBEV09SRCBVU0UxNiAnQ09ERScKKyAgX0RBVEEgICBFTkRTCisgIERfU0VHICAgRVFVIDxfVEVYVCBTRUdNRU5UPgorICBEX0VORCAgIEVRVSA8X1RFWFQgRU5EUz4KKyAgQVNTVU1FICBDUzpfVEVYVCxEUzpfVEVYVAorZWxzZQorIC4yODYKKyAgTlVNX1JYX0JVRiA9IDEwCisgIF9URVhUICAgU0VHTUVOVCBQVUJMSUMgRFdPUkQgJ0NPREUnCisgIF9URVhUICAgRU5EUworICBfREFUQSAgIFNFR01FTlQgUFVCTElDIERXT1JEICdEQVRBJworICBfREFUQSAgIEVORFMKKyAgRF9TRUcgICBFUVUgPF9EQVRBIFNFR01FTlQ+CisgIERfRU5EICAgRVFVIDxfREFUQSBFTkRTPgorICBBU1NVTUUgIENTOl9URVhULERTOl9EQVRBCitlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEX1NFRworCitSWF9FTEVNRU5UICAgICBTVFJVQworICAgZmlyc3RDb3VudCAgZHcgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIyBvZiBieXRlcyBvbiAxc3QgY2FsbAorICAgc2Vjb25kQ291bnQgZHcgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIyBvZiBieXRlcyBvbiAybmQgY2FsbAorICAgaGFuZGxlICAgICAgZHcgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgaGFuZGxlIGZvciB1cGNhbGwKKyAgIGRlc3RpbkFkciAgIGRiICA2ICAgICAgICAgICBkdXAgKDApICAgICAgICA7IHBhY2tldCBkZXN0aW5hdGlvbiBhZGRyZXNzCisgICBzb3VyY2VBZHIgICBkYiAgNiAgICAgICAgICAgZHVwICgwKSAgICAgICAgOyBwYWNrZXQgc291cmNlIGFkZHJlc3MKKyAgIHByb3RvY29sICAgIGR3ICAwICAgICAgICAgICAgICAgICAgICAgICAgICA7IHBhY2tldCBwcm90b2NvbCBudW1iZXIKKyAgIHJ4QnVmZmVyICAgIGRiICBSWF9CVUZfU0laRSBkdXAgKDApICAgICAgICA7IFJYIGJ1ZmZlcgorRU5EUworICAgICAgICAgICAgICAgYWxpZ24gNAorX3J4T3V0T2ZzICAgICAgZHcgIG9mZnNldCBfcGt0UnhCdWYgICAgICAgICAgIDsgcmluZyBidWZmZXIgb2Zmc2V0cworX3J4SW5PZnMgICAgICAgZHcgIG9mZnNldCBfcGt0UnhCdWYgICAgICAgICAgIDsgaW50byBfcGt0UnhCdWYKK19wa3REcm9wICAgICAgIGR3ICAwLDAgICAgICAgICAgICAgICAgICAgICAgICA7IHBhY2tldCBkcm9wIGNvdW50ZXIKK19wa3RUZW1wICAgICAgIGRiICAyMCAgICAgICAgICAgICAgICBkdXAgKDApICA7IHRlbXAgd29yayBhcmVhCitfcGt0VHhCdWYgICAgICBkYiAgKFRYX0JVRl9TSVpFKzE0KSAgZHVwICgwKSAgOyBUWCBidWZmZXIKK19wa3RSeEJ1ZiAgICAgIFJYX0VMRU1FTlQgTlVNX1JYX0JVRiBkdXAgKDw+KSA7IFJYIHN0cnVjdHVyZXMKKyBMQVNUX09GUyAgICAgID0gb2Zmc2V0ICQKKworIHNjcmVlblNlZyAgICAgZHcgIDBCODAwaAorIG5ld0luT2Zmc2V0ICAgZHcgIDAKKworIGZhbkNoYXJzICAgICAgZGIgICctXHwvJworIGZhbkluZGV4ICAgICAgZHcgIDAKKworRF9FTkQKKworX1RFWFQgU0VHTUVOVAorCisKK1NIT1dfUlggIE1BQ1JPCisgICAgICAgICBwdXNoIGVzCisgICAgICAgICBwdXNoIGJ4CisgICAgICAgICBtb3YgYngsIHNjcmVlblNlZworICAgICAgICAgbW92IGVzLCBieCAgICAgICAgICAgICAgICAgICAgOzsgci1tb2RlIHNlZ21lbnQgb2YgY29sb3VyIHNjcmVlbgorICAgICAgICAgbW92IGRpLCAxNTggICAgICAgICAgICAgICAgICAgOzsgdXBwZXIgcmlnaHQgY29ybmVyIC0gMQorICAgICAgICAgbW92IGJ4LCBmYW5JbmRleAorICAgICAgICAgbW92IGFsLCBmYW5DaGFyc1tieF0gICAgICAgICAgOzsgZ2V0IHdyaXRlIGNoYXIKKyAgICAgICAgIG1vdiBhaCwgMTUgICAgICAgICAgICAgICAgICAgIDs7ICBhbmQgd2hpdGUgY29sb3VyCisgICAgICAgICBzdG9zdyAgICAgICAgICAgICAgICAgICAgICAgICA7OyB3cml0ZSB0byBzY3JlZW4gYXQgRVM6RURJCisgICAgICAgICBpbmMgZmFuSW5kZXggICAgICAgICAgICAgICAgICA7OyB1cGRhdGUgbmV4dCBpbmRleAorICAgICAgICAgYW5kIGZhbkluZGV4LCAzCisgICAgICAgICBwb3AgYngKKyAgICAgICAgIHBvcCBlcworRU5ETQorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IFRoaXMgbWFjcm8gcmV0dXJuIEVTOkRJIHRvIHRhaWwgb2YgUnggcXVldWUKKworRU5RVUVVRSAgTUFDUk8KKyAgICAgICAgIExPQ0FMIEBub1dyYXAKKyAgICAgICAgIG1vdiBheCwgX3J4SW5PZnMgICAgICAgICAgICAgIDs7IERJID0gY3VycmVudCBpbi1vZmZzZXQKKyAgICAgICAgIGFkZCBheCwgU0laRSBSWF9FTEVNRU5UICAgICAgIDs7IHBvaW50IHRvIG5leHQgX3BrdFJ4QnVmIGJ1ZmZlcgorICAgICAgICAgY21wIGF4LCBMQVNUX09GUyAgICAgICAgICAgICAgOzsgcG9pbnRpbmcgcGFzdCBsYXN0ID8KKyAgICAgICAgIGpiICBAbm9XcmFwICAgICAgICAgICAgICAgICAgIDs7IG5vIC0ganVtcAorICAgICAgICAgbGVhIGF4LCBfcGt0UnhCdWYgICAgICAgICAgICAgOzsgeWVzLCBwb2ludCB0byAxc3QgYnVmZmVyCisgICAgICAgICBhbGlnbiA0CitAbm9XcmFwOiBjbXAgYXgsIF9yeE91dE9mcyAgICAgICAgICAgICA7OyBpbi1vZnMgPSBvdXQtb2ZzID8KKyAgICAgICAgIGplICBAZHVtcCAgICAgICAgICAgICAgICAgICAgIDs7IHllcywgcXVldWUgaXMgZnVsbAorICAgICAgICAgbW92IGRpLCBfcnhJbk9mcyAgICAgICAgICAgICAgOzsgRVM6REkgLT4gYnVmZmVyIGF0IHF1ZXVlIGlucHV0CisgICAgICAgICBtb3YgbmV3SW5PZmZzZXQsIGF4ICAgICAgICAgICA7OyByZW1lbWJlciBuZXcgaW5wdXQgb2Zmc2V0CisKKyAgIDs7IE5PVEUuIHJ4SW5PZnMgaXMgdXBkYXRlZCBhZnRlciB0aGUgcGFja2V0IGhhcyBiZWVuIGNvcGllZAorICAgOzsgdG8gRVM6REkgKD0gRFM6U0kgb24gMm5kIGNhbGwpIGJ5IHRoZSBwYWNrZXQgZHJpdmVyCisKK0VORE0KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgYnkgdGhlIHBhY2tldCBkcml2ZXIgdHdpY2U6Cis7ICAgMXN0IHRpbWUgKEFYPTApIGl0IHJlcXVlc3RzIGFuIGFkZHJlc3Mgd2hlcmUgdG8gcHV0IHRoZSBwYWNrZXQKKzsKKzsgICAybmQgdGltZSAoQVg9MSkgdGhlIHBhY2tldCBoYXMgYmVlbiBjb3BpZWQgdG8gdGhpcyBsb2NhdGlvbiAoRFM6U0kpCis7ICAgQlggaGFzIGNsaWVudCBoYW5kbGUgKHN0b3JlZCBpbiBSWF9FTEVNRU5ULmhhbmRsZSkuCis7ICAgQ1ggaGFzICMgb2YgYnl0ZXMgaW4gcGFja2V0IG9uIGJvdGggY2FsbC4gVGhleSBzaG91bGQgYmUgZXF1YWwuCis7Cis7IEEgdGVzdCBmb3IgZXF1YWxpdHkgaXMgZG9uZSBieSBwdXR0aW5nIENYIGluIF9wa3RSeEJ1ZiBbbl0uZmlyc3RDb3VudAorOyBhbmQgX3BrdFJ4QnVmW25dLnNlY29uZENvdW50LCBhbmQgQ0wgb24gZmlyc3QgY2FsbCBpbgorOyBfcGt0UnhCdWZbbl0ucnhCdWZmZXJbQ1hdLiBUaGVzZSB2YWx1ZXMgYXJlIGNoZWNrZWQgaW4gIlBrdFJlY2VpdmUiCis7IChQS1REUlZSLkMpCis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK19Qa3RSZWNlaXZlcjoKKyAgICAgICAgIHB1c2hmCisgICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBubyBkaXN0cmFjdGlvbiB3YW50ZWQgIQorICAgICAgICAgcHVzaCBkcworICAgICAgICAgcHVzaCBieAoraWZkZWYgRE9TWAorICAgICAgICAgbW92IGJ4LCBjcworZWxzZQorICAgICAgICAgbW92IGJ4LCBTRUcgX0RBVEEKK2VuZGlmCisgICAgICAgICBtb3YgZHMsIGJ4CisgICAgICAgICBtb3YgZXMsIGJ4ICAgICAgICAgICAgICAgICAgOyBFUyA9IERTID0gQ1Mgb3Igc2VnIF9EQVRBCisgICAgICAgICBwb3AgYnggICAgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIGhhbmRsZQorCisgICAgICAgICBjbXAgYXgsIDAgICAgICAgICAgICAgICAgICAgOyBmaXJzdCBjYWxsPyAoQVg9MCkKKyAgICAgICAgIGpuZSBAcG9zdCAgICAgICAgICAgICAgICAgICA7IEFYPTE6IHNlY29uZCBjYWxsLCBkbyBwb3N0IHByb2Nlc3MKKworaWZkZWYgREVCVUcKKyAgICAgICAgIFNIT1dfUlggICAgICAgICAgICAgICAgICAgICA7IHNob3cgdGhhdCBhIHBhY2tldCBpcyByZWNlaXZlZAorZW5kaWYKKyAgICAgICAgIGNtcCBjeCwgUlhfQlVGX1NJWkUrMTQgICAgICA7IHNpemUgT0sgPworICAgICAgICAgamEgIEBza2lwICAgICAgICAgICAgICAgICAgIDsgbm8sIHBhY2tldCB0byBsYXJnZSBmb3IgdXMKKworICAgICAgICAgRU5RVUVVRSAgICAgICAgICAgICAgICAgICAgIDsgRVM6REkgLT4gX3BrdFJ4QnVmW25dCisKKyAgICAgICAgIG1vdiBbZGldLmZpcnN0Q291bnQsIGN4ICAgICA7IHJlbWVtYmVyIHRoZSBmaXJzdCBjb3VudC4KKyAgICAgICAgIG1vdiBbZGldLmhhbmRsZSwgYnggICAgICAgICA7IHJlbWVtYmVyIHRoZSBoYW5kbGUuCisgICAgICAgICBhZGQgZGksIDYgICAgICAgICAgICAgICAgICAgOyBFUzpESSAtPiBfcGt0UnhCdWZbbl0uZGVzdGluQWRyCisgICAgICAgICBwb3AgZHMKKyAgICAgICAgIHBvcGYKKyAgICAgICAgIHJldGYgICAgICAgICAgICAgICAgICAgICAgICA7IGZhciByZXR1cm4gdG8gZHJpdmVyIHdpdGggRVM6REkKKworICAgICAgICAgYWxpZ24gNAorQGR1bXA6ICAgaW5jIF9wa3REcm9wWzBdICAgICAgICAgICAgIDsgZGlzY2FyZCB0aGUgcGFja2V0IG9uIDFzdCBjYWxsCisgICAgICAgICBhZGMgX3BrdERyb3BbMl0sIDAgICAgICAgICAgOyBpbmNyZW1lbnQgcGFja2V0cyBsb3N0CisKK0Bza2lwOiAgIHhvciBkaSwgZGkgICAgICAgICAgICAgICAgICA7IHJldHVybiBFUzpESSA9IE5JTCBwb2ludGVyCisgICAgICAgICB4b3IgYXgsIGF4CisgICAgICAgICBtb3YgZXMsIGF4CisgICAgICAgICBwb3AgZHMKKyAgICAgICAgIHBvcGYKKyAgICAgICAgIHJldGYKKworICAgICAgICAgYWxpZ24gNAorQHBvc3Q6ICAgb3Igc2ksIHNpICAgICAgICAgICAgICAgICAgIDsgRFM6U0ktPl9wa3RSeEJ1ZltuXVtuXS5kZXN0aW5BZHIKKyAgICAgICAgIGp6IEBkaXNjYXJkICAgICAgICAgICAgICAgICA7IG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgTlVMTC1wb2ludGVyCisKKyAgICAgICAgIHN1YiBzaSwgNiAgICAgICAgICAgICAgICAgICA7IERTOlNJIC0+IF9wa3RSeEJ1ZltuXS5kZXN0aW5BZHIKKyAgICAgICA7CisgICAgICAgOyBwdXNoIHNpCisgICAgICAgOyBwdXNoIFtzaV0uZmlyc3RDb3VudAorICAgICAgIDsgY2FsbCBicGZfZmlsdGVyX21hdGNoICAgICAgIDsgcnVuIHRoZSBmaWx0ZXIgaGVyZSBzb21lIGRheT8KKyAgICAgICA7IGFkZCBzcCwgNAorICAgICAgIDsgY21wIGF4LCAwCisgICAgICAgOyBqZSAgQGRpc2NhcmQKKworICAgICAgICAgbW92IFtzaV0uc2Vjb25kQ291bnQsIGN4CisgICAgICAgICBtb3YgYXgsIG5ld0luT2Zmc2V0CisgICAgICAgICBtb3YgX3J4SW5PZnMsIGF4ICAgICAgICAgICAgOyB1cGRhdGUgX3BrdFJ4QnVmIGlucHV0IG9mZnNldAorCisgICAgICAgICBhbGlnbiA0CitAZGlzY2FyZDpwb3AgZHMKKyAgICAgICAgIHBvcGYKKyAgICAgICAgIHJldGYKKworX3BrdFJ4RW5kICBkYiAwICAgICAgICAgICAgICAgICAgICAgIDsgbWFya2VyIGZvciBlbmQgb2Ygci1tb2RlIGNvZGUvZGF0YQorCitfVEVYVCBFTkRTCisKK0VORApkaWZmIC0tZ2l0IGEvbXNkb3MvcGt0X3J4MS5zIGIvbXNkb3MvcGt0X3J4MS5zCmluZGV4IGIyOTRhMzYuLjY1NGU2NTcgMTAwNjQ0Ci0tLSBhL21zZG9zL3BrdF9yeDEucworKysgYi9tc2Rvcy9wa3RfcngxLnMKQEAgLTEsMTU1ICsxLDE1NSBAQAotOw0KLTsgVGhpcyBmaWxlIHJlcXVpcmVzIE5BU00gMC45NysgdG8gYXNzZW1ibGUNCi07DQotOyBDdXJyZW50bHkgdXNlZCBvbmx5IGZvciBkamdwcCArIERPUzRHVyB0YXJnZXRzDQotOw0KLTsgdGhlc2Ugc2l6ZXMgTVVTVCBiZSBlcXVhbCB0byB0aGUgc2l6ZXMgaW4gUEtURFJWUi5IDQotOw0KLSVkZWZpbmUgIEVUSF9NVFUgICAgIDE1MDAgICAgICAgICAgICAgICAgICA7IG1heCBkYXRhIHNpemUgb24gRXRoZXJuZXQNCi0lZGVmaW5lICBFVEhfTUlOICAgICA2MCAgICAgICAgICAgICAgICAgICAgOyBtaW4vbWF4IHRvdGFsIGZyYW1lIHNpemUNCi0lZGVmaW5lICBFVEhfTUFYICAgICAoRVRIX01UVSsyKjYrMikNCi0lZGVmaW5lICBOVU1fUlhfQlVGICAzMiAgICAgICAgICAgICAgICAgICAgOyAjIG9mIFJYIGVsZW1lbnQgYnVmZmVycw0KLSVkZWZpbmUgIFJYX1NJWkUgICAgIChFVEhfTUFYKzYpICAgICAgICAgICA7IHNpemVvZihSWF9FTEVNRU5UKSA9IDE1MTQrNg0KLSVpZGVmaW5lIG9mZnNldA0KLQ0KLXN0cnVjIFJYX0VMRU1FTlQNCi0gICAgICAuZmlyc3RDb3VudCAgcmVzdyAxICAgICAgICAgICAgICAgICAgOyAjIG9mIGJ5dGVzIG9uIDFzdCBjYWxsDQotICAgICAgLnNlY29uZENvdW50IHJlc3cgMSAgICAgICAgICAgICAgICAgIDsgIyBvZiBieXRlcyBvbiAybmQgY2FsbA0KLSAgICAgIC5oYW5kbGUgICAgICByZXN3IDEgICAgICAgICAgICAgICAgICA7IGhhbmRsZSBmb3IgdXBjYWxsDQotICAgIDsgLnRpbWVTdGFtcCAgIHJlc3cgNCAgICAgICAgICAgICAgICAgIDsgNjQtYml0IFJEVFNDIHZhbHVlDQotICAgICAgLmRlc3RpbkFkciAgIHJlc2IgNiAgICAgICAgICAgICAgICAgIDsgcGFja2V0IGRlc3RpbmF0aW9uIGFkZHJlc3MNCi0gICAgICAuc291cmNlQWRyICAgcmVzYiA2ICAgICAgICAgICAgICAgICAgOyBwYWNrZXQgc291cmNlIGFkZHJlc3MNCi0gICAgICAucHJvdG9jb2wgICAgcmVzdyAxICAgICAgICAgICAgICAgICAgOyBwYWNrZXQgcHJvdG9jb2wgbnVtYmVyDQotICAgICAgLnJ4QnVmZmVyICAgIHJlc2IgRVRIX01UVSAgICAgICAgICAgIDsgUlggYnVmZmVyDQotZW5kc3RydWMNCi0NCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLVtvcmcgMF0gIDsgYXNzZW1ibGUgdG8gLmJpbiBmaWxlDQotDQotX3J4T3V0T2ZzICAgZHcgICBvZmZzZXQgX3BrdFJ4QnVmICAgICAgICAgIDsgcmluZyBidWZmZXIgb2Zmc2V0cw0KLV9yeEluT2ZzICAgIGR3ICAgb2Zmc2V0IF9wa3RSeEJ1ZiAgICAgICAgICA7IGludG8gX3BrdFJ4QnVmDQotX3BrdERyb3AgICAgZHcgICAwLDAgICAgICAgICAgICAgICAgICAgICAgIDsgcGFja2V0IGRyb3AgY291bnRlcg0KLV9wa3RUZW1wICAgIHJlc2IgMjAgICAgICAgICAgICAgICAgICAgICAgICA7IHRlbXAgd29yayBhcmVhDQotX3BrdFR4QnVmICAgcmVzYiAoRVRIX01BWCkgICAgICAgICAgICAgICAgIDsgVFggYnVmZmVyDQotX3BrdFJ4QnVmICAgcmVzYiAoUlhfU0laRSpOVU1fUlhfQlVGKSAgICAgIDsgUlggc3RydWN0dXJlcw0KLSBMQVNUX09GUyAgIGVxdSAgJA0KLQ0KLXNjcmVlblNlZyAgIGR3ICAwQjgwMGgNCi1uZXdJbk9mZnNldCBkdyAgMA0KLQ0KLWZhbkNoYXJzICAgIGRiICAnLVx8LycNCi1mYW5JbmRleCAgICBkdyAgMA0KLQ0KLSVtYWNybyBTSE9XX1JYIDANCi0gICAgICAgcHVzaCBlcw0KLSAgICAgICBwdXNoIGJ4DQotICAgICAgIG1vdiBieCwgW3NjcmVlblNlZ10NCi0gICAgICAgbW92IGVzLCBieCAgICAgICAgICAgICAgICAgICAgOzsgci1tb2RlIHNlZ21lbnQgb2YgY29sb3VyIHNjcmVlbg0KLSAgICAgICBtb3YgZGksIDE1OCAgICAgICAgICAgICAgICAgICA7OyB1cHBlciByaWdodCBjb3JuZXIgLSAxDQotICAgICAgIG1vdiBieCwgW2ZhbkluZGV4XQ0KLSAgICAgICBtb3YgYWwsIFtmYW5DaGFycytieF0gICAgICAgICA7OyBnZXQgd3JpdGUgY2hhcg0KLSAgICAgICBtb3YgYWgsIDE1ICAgICAgICAgICAgICAgICAgICA7OyAgYW5kIHdoaXRlIGNvbG91cg0KLSAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBOZWVkZWQ/DQotICAgICAgIHN0b3N3ICAgICAgICAgICAgICAgICAgICAgICAgIDs7IHdyaXRlIHRvIHNjcmVlbiBhdCBFUzpFREkNCi0gICAgICAgaW5jIHdvcmQgW2ZhbkluZGV4XSAgICAgICAgICAgOzsgdXBkYXRlIG5leHQgaW5kZXgNCi0gICAgICAgYW5kIHdvcmQgW2ZhbkluZGV4XSwgMw0KLSAgICAgICBwb3AgYngNCi0gICAgICAgcG9wIGVzDQotJWVuZG1hY3JvDQotDQotO1B1dFRpbWVTdGFtcA0KLTsgICAgICAgcmR0c2MNCi07ICAgICAgIG1vdiBbc2ldLnRpbWVTdGFtcCwgZWF4DQotOyAgICAgICBtb3YgW3NpKzRdLnRpbWVTdGFtcCwgZWR4DQotOyAgICAgICByZXQNCi0NCi0NCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotOw0KLTsgVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGJ5IHRoZSBwYWNrZXQgZHJpdmVyIHR3aWNlOg0KLTsgICAxc3QgdGltZSAoQVg9MCkgaXQgcmVxdWVzdHMgYW4gYWRkcmVzcyB3aGVyZSB0byBwdXQgdGhlIHBhY2tldA0KLTsNCi07ICAgMm5kIHRpbWUgKEFYPTEpIHRoZSBwYWNrZXQgaGFzIGJlZW4gY29waWVkIHRvIHRoaXMgbG9jYXRpb24gKERTOlNJKQ0KLTsgICBCWCBoYXMgY2xpZW50IGhhbmRsZSAoc3RvcmVkIGluIFJYX0VMRU1FTlQuaGFuZGxlKS4NCi07ICAgQ1ggaGFzICMgb2YgYnl0ZXMgaW4gcGFja2V0IG9uIGJvdGggY2FsbC4gVGhleSBzaG91bGQgYmUgZXF1YWwuDQotOyBBIHRlc3QgZm9yIGVxdWFsaXR5IGlzIGRvbmUgYnkgcHV0dGluZyBDWCBpbiBfcGt0UnhCdWYgW25dLmZpcnN0Q291bnQNCi07IGFuZCBfcGt0UnhCdWZbbl0uc2Vjb25kQ291bnQsIGFuZCBDTCBvbiBmaXJzdCBjYWxsIGluDQotOyBfcGt0UnhCdWZbbl0ucnhCdWZmZXJbQ1hdLiBUaGVzZSB2YWx1ZXMgYXJlIGNoZWNrZWQgaW4gIlBrdFJlY2VpdmUiDQotOyAoUEtURFJWUi5DKQ0KLTsNCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotX1BrdFJlY2VpdmVyOg0KLSAgICAgICAgIHB1c2hmDQotICAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgICAgIDsgbm8gZGlzdHJhY3Rpb24gd2FudGVkICENCi0gICAgICAgICBwdXNoIGRzDQotICAgICAgICAgcHVzaCBieA0KLSAgICAgICAgIG1vdiBieCwgY3MNCi0gICAgICAgICBtb3YgZHMsIGJ4DQotICAgICAgICAgbW92IGVzLCBieCAgICAgICAgICAgICAgICAgIDsgRVMgPSBEUyA9IENTIG9yIHNlZyBfREFUQQ0KLSAgICAgICAgIHBvcCBieCAgICAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgaGFuZGxlDQotDQotICAgICAgICAgY21wIGF4LCAwICAgICAgICAgICAgICAgICAgIDsgZmlyc3QgY2FsbD8gKEFYPTApDQotICAgICAgICAgam5lIEBwb3N0ICAgICAgICAgICAgICAgICAgIDsgQVg9MTogc2Vjb25kIGNhbGwsIGRvIHBvc3QgcHJvY2Vzcw0KLQ0KLSVpZmRlZiBERUJVRw0KLSAgICAgICAgIFNIT1dfUlggICAgICAgICAgICAgICAgICAgICA7IHNob3cgdGhhdCBhIHBhY2tldCBpcyByZWNlaXZlZA0KLSVlbmRpZg0KLQ0KLSAgICAgICAgIGNtcCBjeCwgRVRIX01BWCAgICAgICAgICAgICA7IHNpemUgT0sgPw0KLSAgICAgICAgIGphICBAc2tpcCAgICAgICAgICAgICAgICAgICA7IG5vLCB0b28gYmlnDQotDQotICAgICAgICAgbW92IGF4LCBbX3J4SW5PZnNdDQotICAgICAgICAgYWRkIGF4LCBSWF9TSVpFDQotICAgICAgICAgY21wIGF4LCBMQVNUX09GUw0KLSAgICAgICAgIGpiICBAbm9XcmFwDQotICAgICAgICAgbW92IGF4LCBvZmZzZXQgX3BrdFJ4QnVmDQotQG5vV3JhcDoNCi0gICAgICAgICBjbXAgYXgsIFtfcnhPdXRPZnNdDQotICAgICAgICAgamUgIEBkdW1wDQotICAgICAgICAgbW92IGRpLCBbX3J4SW5PZnNdICAgICAgICAgIDsgRVM6REkgLT4gX3BrdFJ4QnVmW25dDQotICAgICAgICAgbW92IFtuZXdJbk9mZnNldF0sIGF4DQotDQotICAgICAgICAgbW92IFtkaV0sIGN4ICAgICAgICAgICAgICAgIDsgcmVtZW1iZXIgZmlyc3RDb3VudC4NCi0gICAgICAgICBtb3YgW2RpKzRdLCBieCAgICAgICAgICAgICAgOyByZW1lbWJlciBoYW5kbGUuDQotICAgICAgICAgYWRkIGRpLCA2ICAgICAgICAgICAgICAgICAgIDsgRVM6REkgLT4gX3BrdFJ4QnVmW25dLmRlc3RpbkFkcg0KLSAgICAgICAgIHBvcCBkcw0KLSAgICAgICAgIHBvcGYNCi0gICAgICAgICByZXRmICAgICAgICAgICAgICAgICAgICAgICAgOyBmYXIgcmV0dXJuIHRvIGRyaXZlciB3aXRoIEVTOkRJDQotDQotQGR1bXA6ICAgYWRkIHdvcmQgW19wa3REcm9wKzBdLCAxICAgIDsgZGlzY2FyZCB0aGUgcGFja2V0IG9uIDFzdCBjYWxsDQotICAgICAgICAgYWRjIHdvcmQgW19wa3REcm9wKzJdLCAwICAgIDsgaW5jcmVtZW50IHBhY2tldHMgbG9zdA0KLQ0KLUBza2lwOiAgIHhvciBkaSwgZGkgICAgICAgICAgICAgICAgICA7IHJldHVybiBFUzpESSA9IE5JTCBwb2ludGVyDQotICAgICAgICAgeG9yIGF4LCBheA0KLSAgICAgICAgIG1vdiBlcywgYXgNCi0gICAgICAgICBwb3AgZHMNCi0gICAgICAgICBwb3BmDQotICAgICAgICAgcmV0Zg0KLQ0KLUBwb3N0OiAgIG9yIHNpLCBzaSAgICAgICAgICAgICAgICAgICA7IERTOlNJLT5fcGt0UnhCdWZbbl1bbl0uZGVzdGluQWRyDQotICAgICAgICAganogQGRpc2NhcmQgICAgICAgICAgICAgICAgIDsgbWFrZSBzdXJlIHdlIGRvbid0IHVzZSBOVUxMLXBvaW50ZXINCi0NCi0gICAgICAgOw0KLSAgICAgICA7IHB1c2ggc2kNCi0gICAgICAgOyBjYWxsIGJwZl9maWx0ZXJfbWF0Y2ggICAgICAgOyBydW4gdGhlIGZpbHRlciBoZXJlIHNvbWUgZGF5DQotICAgICAgIDsgcG9wIHNpDQotICAgICAgIDsgY21wIGF4LCAwDQotICAgICAgIDsgamUgIEBkaXNjYXJkDQotDQotICAgICAgICAgbW92IFtzaS02KzJdLCBjeCAgICAgICAgICAgIDsgc3RvcmUgX3BrdFJ4QnVmW25dLnNlY29uZENvdW50DQotICAgICAgICAgbW92IGF4LCBbbmV3SW5PZmZzZXRdDQotICAgICAgICAgbW92IFtfcnhJbk9mc10sIGF4ICAgICAgICAgIDsgdXBkYXRlIF9wa3RSeEJ1ZiBpbnB1dCBvZmZzZXQNCi0NCi0gICAgICAgOyBjYWxsIFB1dFRpbWVTdGFtcA0KLQ0KLUBkaXNjYXJkOg0KLSAgICAgICAgIHBvcCBkcw0KLSAgICAgICAgIHBvcGYNCi0gICAgICAgICByZXRmDQotDQotX3BrdFJ4RW5kICBkYiAwICAgICAgICAgICAgICAgICAgICAgIDsgbWFya2VyIGZvciBlbmQgb2Ygci1tb2RlIGNvZGUvZGF0YQ0KLQ0KLUVORA0KLQ0KKzsKKzsgVGhpcyBmaWxlIHJlcXVpcmVzIE5BU00gMC45NysgdG8gYXNzZW1ibGUKKzsKKzsgQ3VycmVudGx5IHVzZWQgb25seSBmb3IgZGpncHAgKyBET1M0R1cgdGFyZ2V0cworOworOyB0aGVzZSBzaXplcyBNVVNUIGJlIGVxdWFsIHRvIHRoZSBzaXplcyBpbiBQS1REUlZSLkgKKzsKKyVkZWZpbmUgIEVUSF9NVFUgICAgIDE1MDAgICAgICAgICAgICAgICAgICA7IG1heCBkYXRhIHNpemUgb24gRXRoZXJuZXQKKyVkZWZpbmUgIEVUSF9NSU4gICAgIDYwICAgICAgICAgICAgICAgICAgICA7IG1pbi9tYXggdG90YWwgZnJhbWUgc2l6ZQorJWRlZmluZSAgRVRIX01BWCAgICAgKEVUSF9NVFUrMio2KzIpICAgICAgIDsgPTE1MTQKKyVkZWZpbmUgIE5VTV9SWF9CVUYgIDMyICAgICAgICAgICAgICAgICAgICA7ICMgb2YgUlggZWxlbWVudCBidWZmZXJzCislZGVmaW5lICBSWF9TSVpFICAgICAoRVRIX01BWCs2KSAgICAgICAgICAgOyBzaXplb2YoUlhfRUxFTUVOVCkgPSAxNTE0KzYKKyVpZGVmaW5lIG9mZnNldAorCitzdHJ1YyBSWF9FTEVNRU5UCisgICAgICAuZmlyc3RDb3VudCAgcmVzdyAxICAgICAgICAgICAgICAgICAgOyAjIG9mIGJ5dGVzIG9uIDFzdCBjYWxsCisgICAgICAuc2Vjb25kQ291bnQgcmVzdyAxICAgICAgICAgICAgICAgICAgOyAjIG9mIGJ5dGVzIG9uIDJuZCBjYWxsCisgICAgICAuaGFuZGxlICAgICAgcmVzdyAxICAgICAgICAgICAgICAgICAgOyBoYW5kbGUgZm9yIHVwY2FsbAorICAgIDsgLnRpbWVTdGFtcCAgIHJlc3cgNCAgICAgICAgICAgICAgICAgIDsgNjQtYml0IFJEVFNDIHZhbHVlCisgICAgICAuZGVzdGluQWRyICAgcmVzYiA2ICAgICAgICAgICAgICAgICAgOyBwYWNrZXQgZGVzdGluYXRpb24gYWRkcmVzcworICAgICAgLnNvdXJjZUFkciAgIHJlc2IgNiAgICAgICAgICAgICAgICAgIDsgcGFja2V0IHNvdXJjZSBhZGRyZXNzCisgICAgICAucHJvdG9jb2wgICAgcmVzdyAxICAgICAgICAgICAgICAgICAgOyBwYWNrZXQgcHJvdG9jb2wgbnVtYmVyCisgICAgICAucnhCdWZmZXIgICAgcmVzYiBFVEhfTVRVICAgICAgICAgICAgOyBSWCBidWZmZXIKK2VuZHN0cnVjCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tvcmcgMF0gIDsgYXNzZW1ibGUgdG8gLmJpbiBmaWxlCisKK19yeE91dE9mcyAgIGR3ICAgb2Zmc2V0IF9wa3RSeEJ1ZiAgICAgICAgICA7IHJpbmcgYnVmZmVyIG9mZnNldHMKK19yeEluT2ZzICAgIGR3ICAgb2Zmc2V0IF9wa3RSeEJ1ZiAgICAgICAgICA7IGludG8gX3BrdFJ4QnVmCitfcGt0RHJvcCAgICBkdyAgIDAsMCAgICAgICAgICAgICAgICAgICAgICAgOyBwYWNrZXQgZHJvcCBjb3VudGVyCitfcGt0VGVtcCAgICByZXNiIDIwICAgICAgICAgICAgICAgICAgICAgICAgOyB0ZW1wIHdvcmsgYXJlYQorX3BrdFR4QnVmICAgcmVzYiAoRVRIX01BWCkgICAgICAgICAgICAgICAgIDsgVFggYnVmZmVyCitfcGt0UnhCdWYgICByZXNiIChSWF9TSVpFKk5VTV9SWF9CVUYpICAgICAgOyBSWCBzdHJ1Y3R1cmVzCisgTEFTVF9PRlMgICBlcXUgICQKKworc2NyZWVuU2VnICAgZHcgIDBCODAwaAorbmV3SW5PZmZzZXQgZHcgIDAKKworZmFuQ2hhcnMgICAgZGIgICctXHwvJworZmFuSW5kZXggICAgZHcgIDAKKworJW1hY3JvIFNIT1dfUlggMAorICAgICAgIHB1c2ggZXMKKyAgICAgICBwdXNoIGJ4CisgICAgICAgbW92IGJ4LCBbc2NyZWVuU2VnXQorICAgICAgIG1vdiBlcywgYnggICAgICAgICAgICAgICAgICAgIDs7IHItbW9kZSBzZWdtZW50IG9mIGNvbG91ciBzY3JlZW4KKyAgICAgICBtb3YgZGksIDE1OCAgICAgICAgICAgICAgICAgICA7OyB1cHBlciByaWdodCBjb3JuZXIgLSAxCisgICAgICAgbW92IGJ4LCBbZmFuSW5kZXhdCisgICAgICAgbW92IGFsLCBbZmFuQ2hhcnMrYnhdICAgICAgICAgOzsgZ2V0IHdyaXRlIGNoYXIKKyAgICAgICBtb3YgYWgsIDE1ICAgICAgICAgICAgICAgICAgICA7OyAgYW5kIHdoaXRlIGNvbG91cgorICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IE5lZWRlZD8KKyAgICAgICBzdG9zdyAgICAgICAgICAgICAgICAgICAgICAgICA7OyB3cml0ZSB0byBzY3JlZW4gYXQgRVM6RURJCisgICAgICAgaW5jIHdvcmQgW2ZhbkluZGV4XSAgICAgICAgICAgOzsgdXBkYXRlIG5leHQgaW5kZXgKKyAgICAgICBhbmQgd29yZCBbZmFuSW5kZXhdLCAzCisgICAgICAgcG9wIGJ4CisgICAgICAgcG9wIGVzCislZW5kbWFjcm8KKworO1B1dFRpbWVTdGFtcAorOyAgICAgICByZHRzYworOyAgICAgICBtb3YgW3NpXS50aW1lU3RhbXAsIGVheAorOyAgICAgICBtb3YgW3NpKzRdLnRpbWVTdGFtcCwgZWR4Cis7ICAgICAgIHJldAorCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGJ5IHRoZSBwYWNrZXQgZHJpdmVyIHR3aWNlOgorOyAgIDFzdCB0aW1lIChBWD0wKSBpdCByZXF1ZXN0cyBhbiBhZGRyZXNzIHdoZXJlIHRvIHB1dCB0aGUgcGFja2V0Cis7Cis7ICAgMm5kIHRpbWUgKEFYPTEpIHRoZSBwYWNrZXQgaGFzIGJlZW4gY29waWVkIHRvIHRoaXMgbG9jYXRpb24gKERTOlNJKQorOyAgIEJYIGhhcyBjbGllbnQgaGFuZGxlIChzdG9yZWQgaW4gUlhfRUxFTUVOVC5oYW5kbGUpLgorOyAgIENYIGhhcyAjIG9mIGJ5dGVzIGluIHBhY2tldCBvbiBib3RoIGNhbGwuIFRoZXkgc2hvdWxkIGJlIGVxdWFsLgorOyBBIHRlc3QgZm9yIGVxdWFsaXR5IGlzIGRvbmUgYnkgcHV0dGluZyBDWCBpbiBfcGt0UnhCdWYgW25dLmZpcnN0Q291bnQKKzsgYW5kIF9wa3RSeEJ1ZltuXS5zZWNvbmRDb3VudCwgYW5kIENMIG9uIGZpcnN0IGNhbGwgaW4KKzsgX3BrdFJ4QnVmW25dLnJ4QnVmZmVyW0NYXS4gVGhlc2UgdmFsdWVzIGFyZSBjaGVja2VkIGluICJQa3RSZWNlaXZlIgorOyAoUEtURFJWUi5DKQorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitfUGt0UmVjZWl2ZXI6CisgICAgICAgICBwdXNoZgorICAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgICAgIDsgbm8gZGlzdHJhY3Rpb24gd2FudGVkICEKKyAgICAgICAgIHB1c2ggZHMKKyAgICAgICAgIHB1c2ggYngKKyAgICAgICAgIG1vdiBieCwgY3MKKyAgICAgICAgIG1vdiBkcywgYngKKyAgICAgICAgIG1vdiBlcywgYnggICAgICAgICAgICAgICAgICA7IEVTID0gRFMgPSBDUyBvciBzZWcgX0RBVEEKKyAgICAgICAgIHBvcCBieCAgICAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgaGFuZGxlCisKKyAgICAgICAgIGNtcCBheCwgMCAgICAgICAgICAgICAgICAgICA7IGZpcnN0IGNhbGw/IChBWD0wKQorICAgICAgICAgam5lIEBwb3N0ICAgICAgICAgICAgICAgICAgIDsgQVg9MTogc2Vjb25kIGNhbGwsIGRvIHBvc3QgcHJvY2VzcworCislaWZkZWYgREVCVUcKKyAgICAgICAgIFNIT1dfUlggICAgICAgICAgICAgICAgICAgICA7IHNob3cgdGhhdCBhIHBhY2tldCBpcyByZWNlaXZlZAorJWVuZGlmCisKKyAgICAgICAgIGNtcCBjeCwgRVRIX01BWCAgICAgICAgICAgICA7IHNpemUgT0sgPworICAgICAgICAgamEgIEBza2lwICAgICAgICAgICAgICAgICAgIDsgbm8sIHRvbyBiaWcKKworICAgICAgICAgbW92IGF4LCBbX3J4SW5PZnNdCisgICAgICAgICBhZGQgYXgsIFJYX1NJWkUKKyAgICAgICAgIGNtcCBheCwgTEFTVF9PRlMKKyAgICAgICAgIGpiICBAbm9XcmFwCisgICAgICAgICBtb3YgYXgsIG9mZnNldCBfcGt0UnhCdWYKK0Bub1dyYXA6CisgICAgICAgICBjbXAgYXgsIFtfcnhPdXRPZnNdCisgICAgICAgICBqZSAgQGR1bXAKKyAgICAgICAgIG1vdiBkaSwgW19yeEluT2ZzXSAgICAgICAgICA7IEVTOkRJIC0+IF9wa3RSeEJ1ZltuXQorICAgICAgICAgbW92IFtuZXdJbk9mZnNldF0sIGF4CisKKyAgICAgICAgIG1vdiBbZGldLCBjeCAgICAgICAgICAgICAgICA7IHJlbWVtYmVyIGZpcnN0Q291bnQuCisgICAgICAgICBtb3YgW2RpKzRdLCBieCAgICAgICAgICAgICAgOyByZW1lbWJlciBoYW5kbGUuCisgICAgICAgICBhZGQgZGksIDYgICAgICAgICAgICAgICAgICAgOyBFUzpESSAtPiBfcGt0UnhCdWZbbl0uZGVzdGluQWRyCisgICAgICAgICBwb3AgZHMKKyAgICAgICAgIHBvcGYKKyAgICAgICAgIHJldGYgICAgICAgICAgICAgICAgICAgICAgICA7IGZhciByZXR1cm4gdG8gZHJpdmVyIHdpdGggRVM6REkKKworQGR1bXA6ICAgYWRkIHdvcmQgW19wa3REcm9wKzBdLCAxICAgIDsgZGlzY2FyZCB0aGUgcGFja2V0IG9uIDFzdCBjYWxsCisgICAgICAgICBhZGMgd29yZCBbX3BrdERyb3ArMl0sIDAgICAgOyBpbmNyZW1lbnQgcGFja2V0cyBsb3N0CisKK0Bza2lwOiAgIHhvciBkaSwgZGkgICAgICAgICAgICAgICAgICA7IHJldHVybiBFUzpESSA9IE5JTCBwb2ludGVyCisgICAgICAgICB4b3IgYXgsIGF4CisgICAgICAgICBtb3YgZXMsIGF4CisgICAgICAgICBwb3AgZHMKKyAgICAgICAgIHBvcGYKKyAgICAgICAgIHJldGYKKworQHBvc3Q6ICAgb3Igc2ksIHNpICAgICAgICAgICAgICAgICAgIDsgRFM6U0ktPl9wa3RSeEJ1ZltuXVtuXS5kZXN0aW5BZHIKKyAgICAgICAgIGp6IEBkaXNjYXJkICAgICAgICAgICAgICAgICA7IG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgTlVMTC1wb2ludGVyCisKKyAgICAgICA7CisgICAgICAgOyBwdXNoIHNpCisgICAgICAgOyBjYWxsIGJwZl9maWx0ZXJfbWF0Y2ggICAgICAgOyBydW4gdGhlIGZpbHRlciBoZXJlIHNvbWUgZGF5CisgICAgICAgOyBwb3Agc2kKKyAgICAgICA7IGNtcCBheCwgMAorICAgICAgIDsgamUgIEBkaXNjYXJkCisKKyAgICAgICAgIG1vdiBbc2ktNisyXSwgY3ggICAgICAgICAgICA7IHN0b3JlIF9wa3RSeEJ1ZltuXS5zZWNvbmRDb3VudAorICAgICAgICAgbW92IGF4LCBbbmV3SW5PZmZzZXRdCisgICAgICAgICBtb3YgW19yeEluT2ZzXSwgYXggICAgICAgICAgOyB1cGRhdGUgX3BrdFJ4QnVmIGlucHV0IG9mZnNldAorCisgICAgICAgOyBjYWxsIFB1dFRpbWVTdGFtcAorCitAZGlzY2FyZDoKKyAgICAgICAgIHBvcCBkcworICAgICAgICAgcG9wZgorICAgICAgICAgcmV0ZgorCitfcGt0UnhFbmQgIGRiIDAgICAgICAgICAgICAgICAgICAgICAgOyBtYXJrZXIgZm9yIGVuZCBvZiByLW1vZGUgY29kZS9kYXRhCisKK0VORAorCmRpZmYgLS1naXQgYS9tc2Rvcy9wa3RkcnZyLmMgYi9tc2Rvcy9wa3RkcnZyLmMKaW5kZXggY2QyMmVlNi4uMzdmYzhhNCAxMDA2NDQKLS0tIGEvbXNkb3MvcGt0ZHJ2ci5jCisrKyBiL21zZG9zL3BrdGRydnIuYwpAQCAtMSwxNDM2ICsxLDE0MzYgQEAKLS8qDQotICogIEZpbGUuLi4uLi4uLi46IHBrdGRydnIuYw0KLSAqDQotICogIFJlc3BvbnNpYmxlLi46IEdpc2xlIFZhbmVtLCAgZ2l2YUBiZ25ldHQubm8NCi0gKg0KLSAqICBDcmVhdGVkLi4uLi4uOiAyNi5TZXB0IDE5OTUNCi0gKg0KLSAqICBEZXNjcmlwdGlvbi4uOiBQYWNrZXQtZHJpdmVyIGludGVyZmFjZSBmb3IgMTYvMzItYml0IEMgOg0KLSAqICAgICAgICAgICAgICAgICBCb3JsYW5kIEMvQysrIDMuMCsgc21hbGwvbGFyZ2UgbW9kZWwNCi0gKiAgICAgICAgICAgICAgICAgV2F0Y29tIEMvQysrIDExKywgRE9TNEdXIGZsYXQgbW9kZWwNCi0gKiAgICAgICAgICAgICAgICAgTWV0YXdhcmUgSGlnaEMgMy4xKyBhbmQgUGhhckxhcCAzODZ8RG9zWA0KLSAqICAgICAgICAgICAgICAgICBHTlUgQy9DKysgMi43KyBhbmQgZGpncHAgMi54IGV4dGVuZGVyDQotICoNCi0gKiAgUmVmZXJlbmNlcy4uLjogUEMvVENQIFBhY2tldCBkcml2ZXIgU3BlY2lmaWNhdGlvbi4gcmV2IDEuMDkNCi0gKiAgICAgICAgICAgICAgICAgRlRQIFNvZnR3YXJlIEluYy4NCi0gKg0KLSAqLw0KLQ0KLSNpbmNsdWRlIDxzdGRpby5oPg0KLSNpbmNsdWRlIDxzdGRsaWIuaD4NCi0jaW5jbHVkZSA8c3RyaW5nLmg+DQotI2luY2x1ZGUgPGRvcy5oPg0KLQ0KLSNpbmNsdWRlICJwY2FwLWRvcy5oIg0KLSNpbmNsdWRlICJwY2FwLWludC5oIg0KLSNpbmNsdWRlICJtc2Rvcy9wa3RkcnZyLmgiDQotDQotI2lmIChET1NYKQ0KLSNkZWZpbmUgTlVNX1JYX0JVRiAgMzIgICAgICAvKiAjIG9mIGJ1ZmZlcnMgaW4gUnggRklGTyBxdWV1ZSAqLw0KLSNlbHNlDQotI2RlZmluZSBOVU1fUlhfQlVGICAxMA0KLSNlbmRpZg0KLQ0KLSNkZWZpbmUgRElNKHgpICAgKHNpemVvZigoeCkpIC8gc2l6ZW9mKHhbMF0pKQ0KLSNkZWZpbmUgUFVUUyhzKSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQotICAgICAgICAgICAgICAgICAgIGlmICghcGt0SW5mby5xdWlldCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgcGt0SW5mby5lcnJvciA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiVzOiAlc1xuIiwgcywgcGt0SW5mby5lcnJvcikgOiBcDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIHBrdEluZm8uZXJyb3IgPSBzKTsgICAgIFwNCi0gICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApDQotDQotI2lmIGRlZmluZWQoX19ISUdIQ19fKQ0KLSAgZXh0ZXJuIFVJTlQgX213ZW52Ow0KLQ0KLSNlbGlmIGRlZmluZWQoX19ESkdQUF9fKQ0KLSAgI2luY2x1ZGUgPHN0ZGRlZi5oPg0KLSAgI2luY2x1ZGUgPGRwbWkuaD4NCi0gICNpbmNsdWRlIDxnbzMyLmg+DQotICAjaW5jbHVkZSA8cGMuaD4NCi0gICNpbmNsdWRlIDxzeXMvZmFycHRyLmg+DQotDQotI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykNCi0gICNpbmNsdWRlIDxpODYuaD4NCi0gICNpbmNsdWRlIDxzdGRkZWYuaD4NCi0gIGV4dGVybiBjaGFyIF9FeHRlbmRlcjsNCi0NCi0jZWxzZQ0KLSAgZXh0ZXJuIHZvaWQgZmFyIFBrdFJlY2VpdmVyICh2b2lkKTsNCi0jZW5kaWYNCi0NCi0NCi0jaWYgKERPU1ggJiAoREpHUFB8RE9TNEdXKSkNCi0gICNpbmNsdWRlIDxzeXMvcGFja19vbi5oPg0KLQ0KLSAgc3RydWN0IERQTUlfcmVncyB7DQotICAgICAgICAgRFdPUkQgIHJfZGk7DQotICAgICAgICAgRFdPUkQgIHJfc2k7DQotICAgICAgICAgRFdPUkQgIHJfYnA7DQotICAgICAgICAgRFdPUkQgIHJlc2VydmVkOw0KLSAgICAgICAgIERXT1JEICByX2J4Ow0KLSAgICAgICAgIERXT1JEICByX2R4Ow0KLSAgICAgICAgIERXT1JEICByX2N4Ow0KLSAgICAgICAgIERXT1JEICByX2F4Ow0KLSAgICAgICAgIFdPUkQgICByX2ZsYWdzOw0KLSAgICAgICAgIFdPUkQgICByX2VzLCByX2RzLCByX2ZzLCByX2dzOw0KLSAgICAgICAgIFdPUkQgICByX2lwLCByX2NzLCByX3NwLCByX3NzOw0KLSAgICAgICB9Ow0KLQ0KLSAgLyogRGF0YSBsb2NhdGVkIGluIGEgcmVhbC1tb2RlIHNlZ21lbnQuIFRoaXMgYmVjb21lcyBmYXIgYXQgcnVudGltZQ0KLSAgICovDQotICB0eXBlZGVmIHN0cnVjdCAgeyAgICAgICAgICAvKiBtdXN0IG1hdGNoIGRhdGEvY29kZSBpbiBwa3RfcngxLnMgKi8NCi0gICAgICAgICAgV09SRCAgICAgICBfcnhPdXRPZnM7DQotICAgICAgICAgIFdPUkQgICAgICAgX3J4SW5PZnM7DQotICAgICAgICAgIERXT1JEICAgICAgX3BrdERyb3A7DQotICAgICAgICAgIEJZVEUgICAgICAgX3BrdFRlbXAgWzIwXTsNCi0gICAgICAgICAgVFhfRUxFTUVOVCBfcGt0VHhCdWZbMV07DQotICAgICAgICAgIFJYX0VMRU1FTlQgX3BrdFJ4QnVmW05VTV9SWF9CVUZdOw0KLSAgICAgICAgICBXT1JEICAgICAgIF9kdW1teVsyXTsgICAgICAgIC8qIHNjcmVlblNlZyxuZXdJbk9mZnNldCAqLw0KLSAgICAgICAgICBCWVRFICAgICAgIF9mYW5DaGFyc1s0XTsNCi0gICAgICAgICAgV09SRCAgICAgICBfZmFuSW5kZXg7DQotICAgICAgICAgIEJZVEUgICAgICAgX1BrdFJlY2VpdmVyWzE1XTsgLyogc3RhcnRzIG9uIGEgcGFyYWdyYXBoICgxNmJ5dGUpICovDQotICAgICAgICB9IFBrdFJlYWxTdHViOw0KLSAgI2luY2x1ZGUgPHN5cy9wYWNrX29mZi5oPg0KLQ0KLSAgc3RhdGljIEJZVEUgcmVhbF9zdHViX2FycmF5IFtdID0gew0KLSAgICAgICAgICNpbmNsdWRlICJwa3Rfc3R1Yi5pbmMiICAgICAgIC8qIGdlbmVyYXRlZCBvcGNvZGUgYXJyYXkgKi8NCi0gICAgICAgfTsNCi0NCi0gICNkZWZpbmUgcnhPdXRPZnMgICAgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3J4T3V0T2ZzKQ0KLSAgI2RlZmluZSByeEluT2ZzICAgICAgIG9mZnNldG9mIChQa3RSZWFsU3R1YixfcnhJbk9mcykNCi0gICNkZWZpbmUgUGt0UmVjZWl2ZXIgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX1BrdFJlY2VpdmVyIFtwYXJhX3NraXBdKQ0KLSAgI2RlZmluZSBwa3REcm9wICAgICAgIG9mZnNldG9mIChQa3RSZWFsU3R1YixfcGt0RHJvcCkNCi0gICNkZWZpbmUgcGt0VGVtcCAgICAgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdFRlbXApDQotICAjZGVmaW5lIHBrdFR4QnVmICAgICAgb2Zmc2V0b2YgKFBrdFJlYWxTdHViLF9wa3RUeEJ1ZikNCi0gICNkZWZpbmUgRklSU1RfUlhfQlVGICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdFJ4QnVmIFswXSkNCi0gICNkZWZpbmUgTEFTVF9SWF9CVUYgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdFJ4QnVmIFtOVU1fUlhfQlVGLTFdKQ0KLQ0KLSNlbHNlDQotICBleHRlcm4gV09SRCAgICAgICByeE91dE9mczsgICAgLyogb2Zmc2V0cyBpbnRvIHBrdFJ4QnVmIEZJRk8gcXVldWUgICAqLw0KLSAgZXh0ZXJuIFdPUkQgICAgICAgcnhJbk9mczsNCi0gIGV4dGVybiBEV09SRCAgICAgIHBrdERyb3A7ICAgICAvKiAjIHBhY2tldHMgZHJvcHBlZCBpbiBQa3RSZWNlaXZlcigpICovDQotICBleHRlcm4gQllURSAgICAgICBwa3RSeEVuZDsgICAgLyogbWFya3MgdGhlIGVuZCBvZiByLW1vZGUgY29kZS9kYXRhICAqLw0KLQ0KLSAgZXh0ZXJuIFJYX0VMRU1FTlQgcGt0UnhCdWYgW05VTV9SWF9CVUZdOyAgICAgICAvKiBQa3REcnZyIFJ4IGJ1ZmZlcnMgKi8NCi0gIGV4dGVybiBUWF9FTEVNRU5UIHBrdFR4QnVmOyAgICAgICAgICAgICAgICAgICAgLyogUGt0RHJ2ciBUeCBidWZmZXIgICovDQotICBleHRlcm4gY2hhciAgICAgICBwa3RUZW1wWzIwXTsgICAgICAgICAgICAgICAgIC8qIFBrdERydnIgdGVtcCBhcmVhICAqLw0KLQ0KLSAgI2RlZmluZSBGSVJTVF9SWF9CVUYgKFdPUkQpICZwa3RSeEJ1ZiBbMF0NCi0gICNkZWZpbmUgTEFTVF9SWF9CVUYgIChXT1JEKSAmcGt0UnhCdWYgW05VTV9SWF9CVUYtMV0NCi0jZW5kaWYNCi0NCi0NCi0jaWZkZWYgX19CT1JMQU5EQ19fICAgICAgICAgICAvKiBVc2UgQm9ybGFuZCdzIGlubGluZSBmdW5jdGlvbnMgKi8NCi0gICNkZWZpbmUgbWVtY3B5ICBfX21lbWNweV9fDQotICAjZGVmaW5lIG1lbWNtcCAgX19tZW1jbXBfXw0KLSAgI2RlZmluZSBtZW1zZXQgIF9fbWVtc2V0X18NCi0jZW5kaWYNCi0NCi0NCi0jaWYgKERPU1ggJiBQSEFSTEFQKQ0KLSAgZXh0ZXJuIHZvaWQgUGt0UmVjZWl2ZXIgKHZvaWQpOyAgICAgLyogaW4gcGt0X3J4MC5hc20gKi8NCi0gIHN0YXRpYyBpbnQgIFJlYWxDb3B5ICAgIChVTE9ORywgVUxPTkcsIFJFQUxQVFIqLCBGQVJQVFIqLCBVU0hPUlQqKTsNCi0NCi0gICN1bmRlZiAgRlBfU0VHDQotICAjdW5kZWYgIEZQX09GRg0KLSAgI2RlZmluZSBGUF9PRkYoeCkgICAgICgoV09SRCkoeCkpDQotICAjZGVmaW5lIEZQX1NFRyh4KSAgICAgKChXT1JEKShyZWFsQmFzZSA+PiAxNikpDQotICAjZGVmaW5lIERPU19BRERSKHMsbykgKCgoRFdPUkQpKHMpIDw8IDE2KSArIChXT1JEKShvKSkNCi0gICNkZWZpbmUgcl9heCAgICAgICAgICBlYXgNCi0gICNkZWZpbmUgcl9ieCAgICAgICAgICBlYngNCi0gICNkZWZpbmUgcl9keCAgICAgICAgICBlZHgNCi0gICNkZWZpbmUgcl9jeCAgICAgICAgICBlY3gNCi0gICNkZWZpbmUgcl9zaSAgICAgICAgICBlc2kNCi0gICNkZWZpbmUgcl9kaSAgICAgICAgICBlZGkNCi0gICNkZWZpbmUgcl9kcyAgICAgICAgICBkcw0KLSAgI2RlZmluZSByX2VzICAgICAgICAgIGVzDQotICBMT0NBTCBGQVJQVFIgICAgICAgICAgcHJvdEJhc2U7DQotICBMT0NBTCBSRUFMUFRSICAgICAgICAgcmVhbEJhc2U7DQotICBMT0NBTCBXT1JEICAgICAgICAgICAgcmVhbFNlZzsgICAvKiBET1MgcGFyYS1hZGRyZXNzIG9mIGFsbG9jYXRlZCBhcmVhICovDQotICBMT0NBTCBTV0lfUkVHUyAgICAgICAgcmVnOw0KLQ0KLSAgc3RhdGljIFdPUkQgX2ZhciAqcnhPdXRPZnNGcCwgKnJ4SW5PZnNGcDsNCi0NCi0jZWxpZiAoRE9TWCAmIERKR1BQKQ0KLSAgc3RhdGljIF9nbzMyX2RwbWlfc2VnaW5mbyBybV9tZW07DQotICBzdGF0aWMgX19kcG1pX3JlZ3MgICAgICAgIHJlZzsNCi0gIHN0YXRpYyBEV09SRCAgICAgICAgICAgICAgcmVhbEJhc2U7DQotICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgIHBhcmFfc2tpcCA9IDA7DQotDQotICAjZGVmaW5lIERPU19BRERSKHMsbykgICAgICgoKFdPUkQpKHMpIDw8IDQpICsgKG8pKQ0KLSAgI2RlZmluZSByX2F4ICAgICAgICAgICAgICB4LmF4DQotICAjZGVmaW5lIHJfYnggICAgICAgICAgICAgIHguYngNCi0gICNkZWZpbmUgcl9keCAgICAgICAgICAgICAgeC5keA0KLSAgI2RlZmluZSByX2N4ICAgICAgICAgICAgICB4LmN4DQotICAjZGVmaW5lIHJfc2kgICAgICAgICAgICAgIHguc2kNCi0gICNkZWZpbmUgcl9kaSAgICAgICAgICAgICAgeC5kaQ0KLSAgI2RlZmluZSByX2RzICAgICAgICAgICAgICB4LmRzDQotICAjZGVmaW5lIHJfZXMgICAgICAgICAgICAgIHguZXMNCi0NCi0jZWxpZiAoRE9TWCAmIERPUzRHVykNCi0gIExPQ0FMIHN0cnVjdCBEUE1JX3JlZ3MgICAgcmVnOw0KLSAgTE9DQUwgV09SRCAgICAgICAgICAgICAgICBybV9iYXNlX3NlZywgcm1fYmFzZV9zZWw7DQotICBMT0NBTCBEV09SRCAgICAgICAgICAgICAgIHJlYWxCYXNlOw0KLSAgTE9DQUwgaW50ICAgICAgICAgICAgICAgICBwYXJhX3NraXAgPSAwOw0KLQ0KLSAgTE9DQUwgRFdPUkQgZHBtaV9nZXRfcmVhbF92ZWN0b3IgKGludCBpbnRyKTsNCi0gIExPQ0FMIFdPUkQgIGRwbWlfcmVhbF9tYWxsb2MgICAgIChpbnQgc2l6ZSwgV09SRCAqc2VsZWN0b3IpOw0KLSAgTE9DQUwgdm9pZCAgZHBtaV9yZWFsX2ZyZWUgICAgICAgKFdPUkQgc2VsZWN0b3IpOw0KLSAgI2RlZmluZSBET1NfQUREUihzLG8pICgoKERXT1JEKShzKSA8PCA0KSArIChXT1JEKShvKSkNCi0NCi0jZWxzZSAgICAgICAgICAgICAgLyogcmVhbC1tb2RlIEJvcmxhbmQgZXRjLiAqLw0KLSAgc3RhdGljIHN0cnVjdCAgew0KLSAgICAgICAgIFdPUkQgcl9heCwgcl9ieCwgcl9jeCwgcl9keCwgcl9icDsNCi0gICAgICAgICBXT1JEIHJfc2ksIHJfZGksIHJfZHMsIHJfZXMsIHJfZmxhZ3M7DQotICAgICAgIH0gcmVnOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBfX0hJR0hDX18NCi0gICNwcmFnbWEgQWxpYXMgKHBrdERyb3AsICAgICJfcGt0RHJvcCIpDQotICAjcHJhZ21hIEFsaWFzIChwa3RSeEJ1ZiwgICAiX3BrdFJ4QnVmIikNCi0gICNwcmFnbWEgQWxpYXMgKHBrdFR4QnVmLCAgICJfcGt0VHhCdWYiKQ0KLSAgI3ByYWdtYSBBbGlhcyAocGt0VGVtcCwgICAgIl9wa3RUZW1wIikNCi0gICNwcmFnbWEgQWxpYXMgKHJ4T3V0T2ZzLCAgICJfcnhPdXRPZnMiKQ0KLSAgI3ByYWdtYSBBbGlhcyAocnhJbk9mcywgICAgIl9yeEluT2ZzIikNCi0gICNwcmFnbWEgQWxpYXMgKHBrdFJ4RW5kLCAgICJfcGt0UnhFbmQiKQ0KLSAgI3ByYWdtYSBBbGlhcyAoUGt0UmVjZWl2ZXIsIl9Qa3RSZWNlaXZlciIpDQotI2VuZGlmDQotDQotDQotUFVCTElDIFBLVF9TVEFUICAgIHBrdFN0YXQ7ICAgIC8qIHN0YXRpc3RpY3MgZm9yIHBhY2tldHMgICAgKi8NCi1QVUJMSUMgUEtUX0lORk8gICAgcGt0SW5mbzsgICAgLyogcGFja2V0LWRyaXZlciBpbmZvcm1hdGlvbiAqLw0KLQ0KLVBVQkxJQyBQS1RfUlhfTU9ERSByZWNlaXZlTW9kZSAgPSBQRFJYX0RJUkVDVDsNCi1QVUJMSUMgRVRIRVIgICAgICAgbXlBZGRyZXNzICAgID0geyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCB9Ow0KLVBVQkxJQyBFVEhFUiAgICAgICBldGhCcm9hZGNhc3QgPSB7IDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1IH07DQotDQotTE9DQUwgIHN0cnVjdCB7ICAgICAgICAgICAgIC8qIGludGVybmFsIHN0YXRpc3RpY3MgKi8NCi0gICAgICAgRFdPUkQgIHRvb1NtYWxsOyAgICAgLyogc2l6ZSA8IEVUSF9NSU4gKi8NCi0gICAgICAgRFdPUkQgIHRvb0xhcmdlOyAgICAgLyogc2l6ZSA+IEVUSF9NQVggKi8NCi0gICAgICAgRFdPUkQgIGJhZFN5bmM7ICAgICAgLyogY291bnRfMSAhPSBjb3VudF8yICovDQotICAgICAgIERXT1JEICB3cm9uZ0hhbmRsZTsgIC8qIHVwY2FsbCB0byB3cm9uZyBoYW5kbGUgKi8NCi0gICAgIH0gaW50U3RhdDsgIA0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotUFVCTElDIGNvbnN0IGNoYXIgKlBrdEdldEVycm9yU3RyIChpbnQgZXJyTnVtKQ0KLXsNCi0gIHN0YXRpYyBjb25zdCBjaGFyICplcnJTdHJbXSA9IHsNCi0gICAgICAgICAgICAgICAgICAgICIiLA0KLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaGFuZGxlIG51bWJlciIsDQotICAgICAgICAgICAgICAgICAgICAiTm8gaW50ZXJmYWNlcyBvZiBzcGVjaWZpZWQgY2xhc3MgZm91bmQiLA0KLSAgICAgICAgICAgICAgICAgICAgIk5vIGludGVyZmFjZXMgb2Ygc3BlY2lmaWVkIHR5cGUgZm91bmQiLA0KLSAgICAgICAgICAgICAgICAgICAgIk5vIGludGVyZmFjZXMgb2Ygc3BlY2lmaWVkIG51bWJlciBmb3VuZCIsDQotICAgICAgICAgICAgICAgICAgICAiQmFkIHBhY2tldCB0eXBlIHNwZWNpZmllZCIsDQotICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlIGRvZXMgbm90IHN1cHBvcnQgbXVsdGljYXN0IiwNCi0gICAgICAgICAgICAgICAgICAgICJQYWNrZXQgZHJpdmVyIGNhbm5vdCB0ZXJtaW5hdGUiLA0KLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVjZWl2ZXIgbW9kZSBzcGVjaWZpZWQiLA0KLSAgICAgICAgICAgICAgICAgICAgIkluc3VmZmljaWVudCBtZW1vcnkgc3BhY2UiLA0KLSAgICAgICAgICAgICAgICAgICAgIlR5cGUgcHJldmlvdXNseSBhY2Nlc3NlZCwgYW5kIG5vdCByZWxlYXNlZCIsDQotICAgICAgICAgICAgICAgICAgICAiQ29tbWFuZCBvdXQgb2YgcmFuZ2UsIG9yIG5vdCBpbXBsZW1lbnRlZCIsDQotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHNlbmQgcGFja2V0ICh1c3VhbGx5IGhhcmR3YXJlIGVycm9yKSIsDQotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNoYW5nZSBoYXJkd2FyZSBhZGRyZXNzICggPiAxIGhhbmRsZSBvcGVuKSIsDQotICAgICAgICAgICAgICAgICAgICAiSGFyZHdhcmUgYWRkcmVzcyBoYXMgYmFkIGxlbmd0aCBvciBmb3JtYXQiLA0KLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZXNldCBpbnRlcmZhY2UgKG1vcmUgdGhhbiAxIGhhbmRsZSBvcGVuKSIsDQotICAgICAgICAgICAgICAgICAgICAiQmFkIENoZWNrLXN1bSIsDQotICAgICAgICAgICAgICAgICAgICAiQmFkIHNpemUiLA0KLSAgICAgICAgICAgICAgICAgICAgIkJhZCBzeW5jIiAsDQotICAgICAgICAgICAgICAgICAgICAiU291cmNlIGhpdCINCi0gICAgICAgICAgICAgICAgICB9Ow0KLQ0KLSAgaWYgKGVyck51bSA8IDAgfHwgZXJyTnVtID49IERJTShlcnJTdHIpKQ0KLSAgICAgcmV0dXJuICgiVW5rbm93biBkcml2ZXIgZXJyb3IuIik7DQotICByZXR1cm4gKGVyclN0ciBbZXJyTnVtXSk7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1QVUJMSUMgY29uc3QgY2hhciAqUGt0R2V0Q2xhc3NOYW1lIChXT1JEIGNsYXNzKQ0KLXsNCi0gIHN3aXRjaCAoY2xhc3MpDQotICB7IA0KLSAgICBjYXNlIFBEX0VUSEVSOg0KLSAgICAgICAgIHJldHVybiAoIkRJWC1FdGhlciIpOw0KLSAgICBjYXNlIFBEX1BST05FVDEwOg0KLSAgICAgICAgIHJldHVybiAoIlByb05FVC0xMCIpOw0KLSAgICBjYXNlIFBEX0lFRUU4MDI1Og0KLSAgICAgICAgIHJldHVybiAoIklFRUUgODAyLjUiKTsNCi0gICAgY2FzZSBQRF9PTU5JTkVUOg0KLSAgICAgICAgIHJldHVybiAoIk9tbmlOZXQiKTsNCi0gICAgY2FzZSBQRF9BUFBMRVRBTEs6DQotICAgICAgICAgcmV0dXJuICgiQXBwbGVUYWxrIik7DQotICAgIGNhc2UgUERfU0xJUDoNCi0gICAgICAgICByZXR1cm4gKCJTTElQIik7DQotICAgIGNhc2UgUERfU1RBUlRMQU46DQotICAgICAgICAgcmV0dXJuICgiU3RhcnRMQU4iKTsNCi0gICAgY2FzZSBQRF9BUkNORVQ6DQotICAgICAgICAgcmV0dXJuICgiQXJjTmV0Iik7DQotICAgIGNhc2UgUERfQVgyNToNCi0gICAgICAgICByZXR1cm4gKCJBWC4yNSIpOw0KLSAgICBjYXNlIFBEX0tJU1M6DQotICAgICAgICAgcmV0dXJuICgiS0lTUyIpOw0KLSAgICBjYXNlIFBEX0lFRUU4MDIzXzI6DQotICAgICAgICAgcmV0dXJuICgiSUVFRSA4MDIuMyB3LzgwMi4yIGhkciIpOw0KLSAgICBjYXNlIFBEX0ZEREk4MDIyOg0KLSAgICAgICAgIHJldHVybiAoIkZEREkgdy84MDIuMiBoZHIiKTsNCi0gICAgY2FzZSBQRF9YMjU6DQotICAgICAgICAgcmV0dXJuICgiWC4yNSIpOw0KLSAgICBjYXNlIFBEX0xBTnN0YXI6DQotICAgICAgICAgcmV0dXJuICgiTEFOc3RhciIpOw0KLSAgICBjYXNlIFBEX1BQUDoNCi0gICAgICAgICByZXR1cm4gKCJQUFAiKTsNCi0gICAgZGVmYXVsdDoNCi0gICAgICAgICByZXR1cm4gKCJ1bmtub3duIik7DQotICB9DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1QVUJMSUMgY2hhciBjb25zdCAqUGt0Ulhtb2RlU3RyIChQS1RfUlhfTU9ERSBtb2RlKQ0KLXsNCi0gIHN0YXRpYyBjb25zdCBjaGFyICptb2RlU3RyIFtdID0gew0KLSAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVyIHR1cm5lZCBvZmYiLA0KLSAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmUgb25seSBkaXJlY3RseSBhZGRyZXNzZWQgcGFja2V0cyIsDQotICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZSBkaXJlY3QgJiBicm9hZGNhc3QgcGFja2V0cyIsDQotICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZSBkaXJlY3QsYnJvYWRjYXN0IGFuZCBsaW1pdGVkIG11bHRpY2FzdCBwYWNrZXRzIiwNCi0gICAgICAgICAgICAgICAgICAgICJSZWNlaXZlIGRpcmVjdCxicm9hZGNhc3QgYW5kIGFsbCBtdWx0aWNhc3QgcGFja2V0cyIsDQotICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZSBhbGwgcGFja2V0cyAocHJvbWlzY3VvdW9zIG1vZGUpIg0KLSAgICAgICAgICAgICAgICAgIH07DQotDQotICBpZiAobW9kZSA+IERJTShtb2RlU3RyKSkNCi0gICAgIHJldHVybiAoIj8/Iik7DQotICByZXR1cm4gKG1vZGVTdHIgW21vZGUtMV0pOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotTE9DQUwgX19pbmxpbmUgQk9PTCBQa3RJbnRlcnJ1cHQgKHZvaWQpDQotew0KLSAgQk9PTCBva2F5Ow0KLQ0KLSNpZiAoRE9TWCAmIFBIQVJMQVApDQotICBfZHhfcmVhbF9pbnQgKChVSU5UKXBrdEluZm8uaW50ciwgJnJlZyk7DQotICBva2F5ID0gKChyZWcuZmxhZ3MgJiAxKSA9PSAwKTsgIC8qIE9LIGlmIGNhcnJ5IGNsZWFyICovDQotDQotI2VsaWYgKERPU1ggJiBESkdQUCkNCi0gIF9fZHBtaV9pbnQgKChpbnQpcGt0SW5mby5pbnRyLCAmcmVnKTsNCi0gIG9rYXkgPSAoKHJlZy54LmZsYWdzICYgMSkgPT0gMCk7DQotDQotI2VsaWYgKERPU1ggJiBET1M0R1cpDQotICB1bmlvbiAgUkVHUyAgcjsNCi0gIHN0cnVjdCBTUkVHUyBzOw0KLQ0KLSAgbWVtc2V0ICgmciwgMCwgc2l6ZW9mKHIpKTsNCi0gIHNlZ3JlYWQgKCZzKTsNCi0gIHIudy5heCAgPSAweDMwMDsNCi0gIHIueC5lYnggPSBwa3RJbmZvLmludHI7DQotICByLncuY3ggID0gMDsNCi0gIHMuZXMgICAgPSBGUF9TRUcgKCZyZWcpOw0KLSAgci54LmVkaSA9IEZQX09GRiAoJnJlZyk7DQotICByZWcucl9mbGFncyA9IDA7DQotICByZWcucl9zcyA9IHJlZy5yX3NwID0gMDsgICAgIC8qIERQTUkgaG9zdCBwcm92aWRlcyBzdGFjayAqLw0KLQ0KLSAgaW50Mzg2eCAoMHgzMSwgJnIsICZyLCAmcyk7DQotICBva2F5ID0gKCFyLncuY2ZsYWcpOw0KLQ0KLSNlbHNlDQotICByZWcucl9mbGFncyA9IDA7DQotICBpbnRyIChwa3RJbmZvLmludHIsIChzdHJ1Y3QgUkVHUEFDSyopJnJlZyk7DQotICBva2F5ID0gKChyZWcucl9mbGFncyAmIDEpID09IDApOw0KLSNlbmRpZg0KLQ0KLSAgaWYgKG9rYXkpDQotICAgICAgIHBrdEluZm8uZXJyb3IgPSBOVUxMOw0KLSAgZWxzZSBwa3RJbmZvLmVycm9yID0gUGt0R2V0RXJyb3JTdHIgKHJlZy5yX2R4ID4+IDgpOw0KLSAgcmV0dXJuIChva2F5KTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qDQotICogU2VhcmNoIGZvciBwYWNrZXQgZHJpdmVyIGF0IGludGVycnVwdCA2MGggdGhyb3VnaCA4MGguIElmIEFTQ0lJWg0KLSAqIHN0cmluZyAiUEtUIERSVlIiIGZvdW5kIGF0IG9mZnNldCAzIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgcmV0dXJuDQotICogaW50ZXJydXB0IG51bWJlciwgZWxzZSByZXR1cm4gemVybyBpbiBwa3RJbmZvLmludHINCi0gKi8NCi1QVUJMSUMgQk9PTCBQa3RTZWFyY2hEcml2ZXIgKHZvaWQpDQotew0KLSAgQllURSBpbnRyICA9IDB4MjA7DQotICBCT09MIGZvdW5kID0gRkFMU0U7DQotDQotICB3aGlsZSAoIWZvdW5kICYmIGludHIgPCAweEZGKQ0KLSAgew0KLSAgICBzdGF0aWMgY2hhciBzdHJbMTJdOyAgICAgICAgICAgICAgICAgLyogMyArIHN0cmxlbigiUEtUIERSVlIiKSAqLw0KLSAgICBzdGF0aWMgY2hhciBwa3RTdHJbOV0gPSAiUEtUIERSVlIiOyAgLyogQVNDSUlaIHN0cmluZyBhdCBvZnMgMyAqLw0KLSAgICBEV09SRCAgcnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gaW50ZXJydXB0ICByb3V0aW5lICAqLw0KLQ0KLSNpZiAoRE9TWCAmIFBIQVJMQVApDQotICAgIF9keF9ybWl2X2dldCAoaW50ciwgJnJwKTsNCi0gICAgUmVhZFJlYWxNZW0gKCZzdHIsIChSRUFMUFRSKXJwLCBzaXplb2Yoc3RyKSk7DQotDQotI2VsaWYgKERPU1ggJiBESkdQUCkNCi0gICAgX19kcG1pX3JhZGRyIHJlYWxBZHI7DQotICAgIF9fZHBtaV9nZXRfcmVhbF9tb2RlX2ludGVycnVwdF92ZWN0b3IgKGludHIsICZyZWFsQWRyKTsNCi0gICAgcnAgPSAocmVhbEFkci5zZWdtZW50IDw8IDQpICsgcmVhbEFkci5vZmZzZXQxNjsNCi0gICAgZG9zbWVtZ2V0IChycCwgc2l6ZW9mKHN0ciksICZzdHIpOw0KLQ0KLSNlbGlmIChET1NYICYgRE9TNEdXKQ0KLSAgICBycCA9IGRwbWlfZ2V0X3JlYWxfdmVjdG9yIChpbnRyKTsNCi0gICAgbWVtY3B5ICgmc3RyLCAodm9pZCopcnAsIHNpemVvZihzdHIpKTsNCi0NCi0jZWxzZQ0KLSAgICBfZm1lbWNweSAoJnN0ciwgZ2V0dmVjdChpbnRyKSwgc2l6ZW9mKHN0cikpOw0KLSNlbmRpZg0KLQ0KLSAgICBmb3VuZCA9IG1lbWNtcCAoJnN0clszXSwmcGt0U3RyLHNpemVvZihwa3RTdHIpKSA9PSAwOw0KLSAgICBpbnRyKys7DQotICB9DQotICBwa3RJbmZvLmludHIgPSAoZm91bmQgPyBpbnRyLTEgOiAwKTsNCi0gIHJldHVybiAoZm91bmQpOw0KLX0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotc3RhdGljIEJPT0wgUGt0U2V0QWNjZXNzICh2b2lkKQ0KLXsNCi0gIHJlZy5yX2F4ID0gMHgwMjAwICsgcGt0SW5mby5jbGFzczsNCi0gIHJlZy5yX2J4ID0gMHhGRkZGOw0KLSAgcmVnLnJfZHggPSAwOw0KLSAgcmVnLnJfY3ggPSAwOw0KLQ0KLSNpZiAoRE9TWCAmIFBIQVJMQVApDQotICByZWcuZHMgID0gMDsNCi0gIHJlZy5lc2kgPSAwOw0KLSAgcmVnLmVzICA9IFJQX1NFRyAocmVhbEJhc2UpOw0KLSAgcmVnLmVkaSA9IChXT1JEKSAmUGt0UmVjZWl2ZXI7DQotDQotI2VsaWYgKERPU1ggJiBESkdQUCkNCi0gIHJlZy54LmRzID0gMDsNCi0gIHJlZy54LnNpID0gMDsNCi0gIHJlZy54LmVzID0gcm1fbWVtLnJtX3NlZ21lbnQ7DQotICByZWcueC5kaSA9IFBrdFJlY2VpdmVyOw0KLQ0KLSNlbGlmIChET1NYICYgRE9TNEdXKQ0KLSAgcmVnLnJfZHMgPSAwOw0KLSAgcmVnLnJfc2kgPSAwOw0KLSAgcmVnLnJfZXMgPSBybV9iYXNlX3NlZzsNCi0gIHJlZy5yX2RpID0gUGt0UmVjZWl2ZXI7DQotDQotI2Vsc2UNCi0gIHJlZy5yX2RzID0gMDsNCi0gIHJlZy5yX3NpID0gMDsNCi0gIHJlZy5yX2VzID0gRlBfU0VHICgmUGt0UmVjZWl2ZXIpOw0KLSAgcmVnLnJfZGkgPSBGUF9PRkYgKCZQa3RSZWNlaXZlcik7DQotI2VuZGlmDQotDQotICBpZiAoIVBrdEludGVycnVwdCgpKQ0KLSAgICAgcmV0dXJuIChGQUxTRSk7DQotDQotICBwa3RJbmZvLmhhbmRsZSA9IHJlZy5yX2F4Ow0KLSAgcmV0dXJuIChUUlVFKTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLVBVQkxJQyBCT09MIFBrdFJlbGVhc2VIYW5kbGUgKFdPUkQgaGFuZGxlKQ0KLXsNCi0gIHJlZy5yX2F4ID0gMHgwMzAwOw0KLSAgcmVnLnJfYnggPSBoYW5kbGU7DQotICByZXR1cm4gUGt0SW50ZXJydXB0KCk7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1QVUJMSUMgQk9PTCBQa3RUcmFuc21pdCAoY29uc3Qgdm9pZCAqZXRoLCBpbnQgbGVuKQ0KLXsNCi0gIGlmIChsZW4gPiBFVEhfTVRVKQ0KLSAgICAgcmV0dXJuIChGQUxTRSk7DQotDQotICByZWcucl9heCA9IDB4MDQwMDsgICAgICAgICAgICAgLyogRnVuY3Rpb24gNCwgc2VuZCBwa3QgKi8NCi0gIHJlZy5yX2N4ID0gbGVuOyAgICAgICAgICAgICAgICAvKiB0b3RhbCBzaXplIG9mIGZyYW1lICAqLw0KLQ0KLSNpZiAoRE9TWCAmIERKR1BQKQ0KLSAgZG9zbWVtcHV0IChldGgsIGxlbiwgcmVhbEJhc2UrcGt0VHhCdWYpOw0KLSAgcmVnLnguZHMgPSBybV9tZW0ucm1fc2VnbWVudDsgIC8qIERPUyBkYXRhIHNlZ21lbnQgYW5kICovDQotICByZWcueC5zaSA9IHBrdFR4QnVmOyAgICAgICAgICAgLyogRE9TIG9mZnNldCB0byBidWZmZXIgKi8NCi0NCi0jZWxpZiAoRE9TWCAmIERPUzRHVykNCi0gIG1lbWNweSAoKHZvaWQqKShyZWFsQmFzZStwa3RUeEJ1ZiksIGV0aCwgbGVuKTsNCi0gIHJlZy5yX2RzID0gcm1fYmFzZV9zZWc7DQotICByZWcucl9zaSA9IHBrdFR4QnVmOw0KLQ0KLSNlbGlmIChET1NYICYgUEhBUkxBUCkNCi0gIG1lbWNweSAoJnBrdFR4QnVmLCBldGgsIGxlbik7DQotICByZWcucl9kcyA9IEZQX1NFRyAoJnBrdFR4QnVmKTsNCi0gIHJlZy5yX3NpID0gRlBfT0ZGICgmcGt0VHhCdWYpOw0KLQ0KLSNlbHNlDQotICByZWcucl9kcyA9IEZQX1NFRyAoZXRoKTsNCi0gIHJlZy5yX3NpID0gRlBfT0ZGIChldGgpOw0KLSNlbmRpZg0KLQ0KLSAgcmV0dXJuIFBrdEludGVycnVwdCgpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2lmIChET1NYICYgKERKR1BQfERPUzRHVykpDQotTE9DQUwgX19pbmxpbmUgQk9PTCBDaGVja0VsZW1lbnQgKFJYX0VMRU1FTlQgKnJ4KQ0KLSNlbHNlDQotTE9DQUwgX19pbmxpbmUgQk9PTCBDaGVja0VsZW1lbnQgKFJYX0VMRU1FTlQgX2ZhciAqcngpDQotI2VuZGlmDQotew0KLSAgV09SRCBjb3VudF8xLCBjb3VudF8yOw0KLQ0KLSAgLyoNCi0gICAqIFdlIGdvdCBhbiB1cGNhbGwgdG8gdGhlIHNhbWUgUk1DQiB3aXRoIHdyb25nIGhhbmRsZS4NCi0gICAqIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBmYWlsZWQgdG8gcmVsZWFzZSBoYW5kbGUgYXQgcHJvZ3JhbSBleGl0DQotICAgKi8NCi0gIGlmIChyeC0+aGFuZGxlICE9IHBrdEluZm8uaGFuZGxlKQ0KLSAgew0KLSAgICBwa3RJbmZvLmVycm9yID0gIldyb25nIGhhbmRsZSI7DQotICAgIGludFN0YXQud3JvbmdIYW5kbGUrKzsNCi0gICAgUGt0UmVsZWFzZUhhbmRsZSAocngtPmhhbmRsZSk7DQotICAgIHJldHVybiAoRkFMU0UpOw0KLSAgfQ0KLSAgY291bnRfMSA9IHJ4LT5maXJzdENvdW50Ow0KLSAgY291bnRfMiA9IHJ4LT5zZWNvbmRDb3VudDsNCi0NCi0gIGlmIChjb3VudF8xICE9IGNvdW50XzIpDQotICB7DQotICAgIHBrdEluZm8uZXJyb3IgPSAiQmFkIHN5bmMiOw0KLSAgICBpbnRTdGF0LmJhZFN5bmMrKzsNCi0gICAgcmV0dXJuIChGQUxTRSk7DQotICB9DQotICBpZiAoY291bnRfMSA+IEVUSF9NQVgpDQotICB7DQotICAgIHBrdEluZm8uZXJyb3IgPSAiTGFyZ2UgZXNpemUiOw0KLSAgICBpbnRTdGF0LnRvb0xhcmdlKys7DQotICAgIHJldHVybiAoRkFMU0UpOw0KLSAgfQ0KLSNpZiAwDQotICBpZiAoY291bnRfMSA8IEVUSF9NSU4pDQotICB7DQotICAgIHBrdEluZm8uZXJyb3IgPSAiU21hbGwgZXNpemUiOw0KLSAgICBpbnRTdGF0LnRvb1NtYWxsKys7DQotICAgIHJldHVybiAoRkFMU0UpOw0KLSAgfQ0KLSNlbmRpZg0KLSAgcmV0dXJuIChUUlVFKTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLVBVQkxJQyBCT09MIFBrdFRlcm1pbkhhbmRsZSAoV09SRCBoYW5kbGUpDQotew0KLSAgcmVnLnJfYXggPSAweDA1MDA7DQotICByZWcucl9ieCA9IGhhbmRsZTsNCi0gIHJldHVybiBQa3RJbnRlcnJ1cHQoKTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLVBVQkxJQyBCT09MIFBrdFJlc2V0SW50ZXJmYWNlIChXT1JEIGhhbmRsZSkNCi17DQotICByZWcucl9heCA9IDB4MDcwMDsNCi0gIHJlZy5yX2J4ID0gaGFuZGxlOw0KLSAgcmV0dXJuIFBrdEludGVycnVwdCgpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotUFVCTElDIEJPT0wgUGt0U2V0UmVjZWl2ZXJNb2RlIChQS1RfUlhfTU9ERSBtb2RlKQ0KLXsNCi0gIGlmIChwa3RJbmZvLmNsYXNzID09IFBEX1NMSVAgfHwgcGt0SW5mby5jbGFzcyA9PSBQRF9QUFApDQotICAgICByZXR1cm4gKFRSVUUpOw0KLQ0KLSAgcmVnLnJfYXggPSAweDE0MDA7DQotICByZWcucl9ieCA9IHBrdEluZm8uaGFuZGxlOw0KLSAgcmVnLnJfY3ggPSAoV09SRCltb2RlOw0KLQ0KLSAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkNCi0gICAgIHJldHVybiAoRkFMU0UpOw0KLQ0KLSAgcmVjZWl2ZU1vZGUgPSBtb2RlOw0KLSAgcmV0dXJuIChUUlVFKTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLVBVQkxJQyBCT09MIFBrdEdldFJlY2VpdmVyTW9kZSAoUEtUX1JYX01PREUgKm1vZGUpDQotew0KLSAgcmVnLnJfYXggPSAweDE1MDA7DQotICByZWcucl9ieCA9IHBrdEluZm8uaGFuZGxlOw0KLQ0KLSAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkNCi0gICAgIHJldHVybiAoRkFMU0UpOw0KLQ0KLSAgKm1vZGUgPSByZWcucl9heDsNCi0gIHJldHVybiAoVFJVRSk7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1zdGF0aWMgUEtUX1NUQVQgaW5pdGlhbFN0YXQ7ICAgICAgICAgLyogc3RhdGlzdGljcyBhdCBzdGFydHVwICovDQotc3RhdGljIEJPT0wgICAgIHJlc2V0U3RhdCA9IEZBTFNFOyAgIC8qIHN0YXRpc3RpY3MgcmVzZXQgPyAqLw0KLQ0KLVBVQkxJQyBCT09MIFBrdEdldFN0YXRpc3RpY3MgKFdPUkQgaGFuZGxlKQ0KLXsNCi0gIHJlZy5yX2F4ID0gMHgxODAwOw0KLSAgcmVnLnJfYnggPSBoYW5kbGU7DQotDQotICBpZiAoIVBrdEludGVycnVwdCgpKQ0KLSAgICAgcmV0dXJuIChGQUxTRSk7DQotDQotI2lmIChET1NYICYgUEhBUkxBUCkNCi0gIFJlYWRSZWFsTWVtICgmcGt0U3RhdCwgRE9TX0FERFIocmVnLmRzLHJlZy5lc2kpLCBzaXplb2YocGt0U3RhdCkpOw0KLQ0KLSNlbGlmIChET1NYICYgREpHUFApDQotICBkb3NtZW1nZXQgKERPU19BRERSKHJlZy54LmRzLHJlZy54LnNpKSwgc2l6ZW9mKHBrdFN0YXQpLCAmcGt0U3RhdCk7DQotDQotI2VsaWYgKERPU1ggJiBET1M0R1cpDQotICBtZW1jcHkgKCZwa3RTdGF0LCAodm9pZCopRE9TX0FERFIocmVnLnJfZHMscmVnLnJfc2kpLCBzaXplb2YocGt0U3RhdCkpOw0KLQ0KLSNlbHNlDQotICBfZm1lbWNweSAoJnBrdFN0YXQsIE1LX0ZQKHJlZy5yX2RzLHJlZy5yX3NpKSwgc2l6ZW9mKHBrdFN0YXQpKTsNCi0jZW5kaWYNCi0NCi0gIHJldHVybiAoVFJVRSk7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1QVUJMSUMgQk9PTCBQa3RTZXNzU3RhdGlzdGljcyAoV09SRCBoYW5kbGUpDQotew0KLSAgaWYgKCFQa3RHZXRTdGF0aXN0aWNzKHBrdEluZm8uaGFuZGxlKSkNCi0gICAgIHJldHVybiAoRkFMU0UpOw0KLQ0KLSAgaWYgKHJlc2V0U3RhdCkNCi0gIHsNCi0gICAgcGt0U3RhdC5pblBhY2tldHMgIC09IGluaXRpYWxTdGF0LmluUGFja2V0czsNCi0gICAgcGt0U3RhdC5vdXRQYWNrZXRzIC09IGluaXRpYWxTdGF0Lm91dFBhY2tldHM7DQotICAgIHBrdFN0YXQuaW5CeXRlcyAgICAtPSBpbml0aWFsU3RhdC5pbkJ5dGVzOw0KLSAgICBwa3RTdGF0Lm91dEJ5dGVzICAgLT0gaW5pdGlhbFN0YXQub3V0Qnl0ZXM7DQotICAgIHBrdFN0YXQuaW5FcnJvcnMgICAtPSBpbml0aWFsU3RhdC5pbkVycm9yczsNCi0gICAgcGt0U3RhdC5vdXRFcnJvcnMgIC09IGluaXRpYWxTdGF0Lm91dEVycm9yczsNCi0gICAgcGt0U3RhdC5vdXRFcnJvcnMgIC09IGluaXRpYWxTdGF0Lm91dEVycm9yczsNCi0gICAgcGt0U3RhdC5sb3N0ICAgICAgIC09IGluaXRpYWxTdGF0Lmxvc3Q7DQotICB9DQotICByZXR1cm4gKFRSVUUpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotUFVCTElDIEJPT0wgUGt0UmVzZXRTdGF0aXN0aWNzIChXT1JEIGhhbmRsZSkNCi17DQotICBpZiAoIVBrdEdldFN0YXRpc3RpY3MocGt0SW5mby5oYW5kbGUpKQ0KLSAgICAgcmV0dXJuIChGQUxTRSk7DQotDQotICBtZW1jcHkgKCZpbml0aWFsU3RhdCwgJnBrdFN0YXQsIHNpemVvZihpbml0aWFsU3RhdCkpOw0KLSAgcmVzZXRTdGF0ID0gVFJVRTsNCi0gIHJldHVybiAoVFJVRSk7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1QVUJMSUMgQk9PTCBQa3RHZXRBZGRyZXNzIChFVEhFUiAqYWRkcikNCi17DQotICByZWcucl9heCA9IDB4MDYwMDsNCi0gIHJlZy5yX2J4ID0gcGt0SW5mby5oYW5kbGU7DQotICByZWcucl9jeCA9IHNpemVvZiAoKmFkZHIpOw0KLQ0KLSNpZiAoRE9TWCAmIERKR1BQKQ0KLSAgcmVnLnguZXMgPSBybV9tZW0ucm1fc2VnbWVudDsNCi0gIHJlZy54LmRpID0gcGt0VGVtcDsNCi0jZWxpZiAoRE9TWCAmIERPUzRHVykNCi0gIHJlZy5yX2VzID0gcm1fYmFzZV9zZWc7DQotICByZWcucl9kaSA9IHBrdFRlbXA7DQotI2Vsc2UNCi0gIHJlZy5yX2VzID0gRlBfU0VHICgmcGt0VGVtcCk7DQotICByZWcucl9kaSA9IEZQX09GRiAoJnBrdFRlbXApOyAgLyogRVM6REkgPSBhZGRyZXNzIGZvciByZXN1bHQgKi8NCi0jZW5kaWYNCi0NCi0gIGlmICghUGt0SW50ZXJydXB0KCkpDQotICAgICByZXR1cm4gKEZBTFNFKTsNCi0NCi0jaWYgKERPU1ggJiBQSEFSTEFQKQ0KLSAgUmVhZFJlYWxNZW0gKGFkZHIsIHJlYWxCYXNlICsgKFdPUkQpJnBrdFRlbXAsIHNpemVvZigqYWRkcikpOw0KLQ0KLSNlbGlmIChET1NYICYgREpHUFApDQotICBkb3NtZW1nZXQgKHJlYWxCYXNlK3BrdFRlbXAsIHNpemVvZigqYWRkciksIGFkZHIpOw0KLQ0KLSNlbGlmIChET1NYICYgRE9TNEdXKQ0KLSAgbWVtY3B5IChhZGRyLCAodm9pZCopKHJlYWxCYXNlK3BrdFRlbXApLCBzaXplb2YoKmFkZHIpKTsNCi0NCi0jZWxzZQ0KLSAgbWVtY3B5ICgodm9pZCopYWRkciwgJnBrdFRlbXAsIHNpemVvZigqYWRkcikpOw0KLSNlbmRpZg0KLQ0KLSAgcmV0dXJuIChUUlVFKTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLVBVQkxJQyBCT09MIFBrdFNldEFkZHJlc3MgKGNvbnN0IEVUSEVSICphZGRyKQ0KLXsNCi0gIC8qIGNvcHkgYWRkciB0byByZWFsLW1vZGUgc2NyYXRoIGFyZWEgKi8NCi0NCi0jaWYgKERPU1ggJiBQSEFSTEFQKQ0KLSAgV3JpdGVSZWFsTWVtIChyZWFsQmFzZSArIChXT1JEKSZwa3RUZW1wLCAodm9pZCopYWRkciwgc2l6ZW9mKCphZGRyKSk7DQotDQotI2VsaWYgKERPU1ggJiBESkdQUCkNCi0gIGRvc21lbXB1dCAoYWRkciwgc2l6ZW9mKCphZGRyKSwgcmVhbEJhc2UrcGt0VGVtcCk7DQotDQotI2VsaWYgKERPU1ggJiBET1M0R1cpDQotICBtZW1jcHkgKCh2b2lkKikocmVhbEJhc2UrcGt0VGVtcCksIGFkZHIsIHNpemVvZigqYWRkcikpOw0KLQ0KLSNlbHNlDQotICBtZW1jcHkgKCZwa3RUZW1wLCAodm9pZCopYWRkciwgc2l6ZW9mKCphZGRyKSk7DQotI2VuZGlmDQotDQotICByZWcucl9heCA9IDB4MTkwMDsNCi0gIHJlZy5yX2N4ID0gc2l6ZW9mICgqYWRkcik7ICAgICAgLyogYWRkcmVzcyBsZW5ndGggICAgICAgKi8NCi0NCi0jaWYgKERPU1ggJiBESkdQUCkNCi0gIHJlZy54LmVzID0gcm1fbWVtLnJtX3NlZ21lbnQ7ICAgLyogRE9TIG9mZnNldCB0byBwYXJhbSAgKi8NCi0gIHJlZy54LmRpID0gcGt0VGVtcDsgICAgICAgICAgICAgLyogRE9TIHNlZ21lbnQgdG8gcGFyYW0gKi8NCi0jZWxpZiAoRE9TWCAmIERPUzRHVykNCi0gIHJlZy5yX2VzID0gcm1fYmFzZV9zZWc7DQotICByZWcucl9kaSA9IHBrdFRlbXA7DQotI2Vsc2UNCi0gIHJlZy5yX2VzID0gRlBfU0VHICgmcGt0VGVtcCk7DQotICByZWcucl9kaSA9IEZQX09GRiAoJnBrdFRlbXApOw0KLSNlbmRpZg0KLQ0KLSAgcmV0dXJuIFBrdEludGVycnVwdCgpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotUFVCTElDIEJPT0wgUGt0R2V0RHJpdmVySW5mbyAodm9pZCkNCi17DQotICBwa3RJbmZvLm1halZlciA9IDA7DQotICBwa3RJbmZvLm1pblZlciA9IDA7DQotICBtZW1zZXQgKCZwa3RJbmZvLm5hbWUsIDAsIHNpemVvZihwa3RJbmZvLm5hbWUpKTsNCi0gIHJlZy5yX2F4ID0gMHgwMUZGOw0KLSAgcmVnLnJfYnggPSAwOw0KLQ0KLSAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkNCi0gICAgIHJldHVybiAoRkFMU0UpOw0KLQ0KLSAgcGt0SW5mby5udW1iZXIgPSByZWcucl9jeCAmIDB4RkY7DQotICBwa3RJbmZvLmNsYXNzICA9IHJlZy5yX2N4ID4+IDg7DQotI2lmIDANCi0gIHBrdEluZm8ubWluVmVyID0gcmVnLnJfYnggJSAxMDsNCi0gIHBrdEluZm8ubWFqVmVyID0gcmVnLnJfYnggLyAxMDsNCi0jZWxzZQ0KLSAgcGt0SW5mby5tYWpWZXIgPSByZWcucl9ieDsgIC8vICEhDQotI2VuZGlmDQotICBwa3RJbmZvLmZ1bmNzICA9IHJlZy5yX2F4ICYgMHhGRjsNCi0gIHBrdEluZm8udHlwZSAgID0gcmVnLnJfZHggJiAweEZGOw0KLQ0KLSNpZiAoRE9TWCAmIFBIQVJMQVApDQotICBSZWFkUmVhbE1lbSAoJnBrdEluZm8ubmFtZSwgRE9TX0FERFIocmVnLmRzLHJlZy5lc2kpLCBzaXplb2YocGt0SW5mby5uYW1lKSk7DQotDQotI2VsaWYgKERPU1ggJiBESkdQUCkNCi0gIGRvc21lbWdldCAoRE9TX0FERFIocmVnLnguZHMscmVnLnguc2kpLCBzaXplb2YocGt0SW5mby5uYW1lKSwgJnBrdEluZm8ubmFtZSk7DQotDQotI2VsaWYgKERPU1ggJiBET1M0R1cpDQotICBtZW1jcHkgKCZwa3RJbmZvLm5hbWUsICh2b2lkKilET1NfQUREUihyZWcucl9kcyxyZWcucl9zaSksIHNpemVvZihwa3RJbmZvLm5hbWUpKTsNCi0NCi0jZWxzZQ0KLSAgX2ZtZW1jcHkgKCZwa3RJbmZvLm5hbWUsIE1LX0ZQKHJlZy5yX2RzLHJlZy5yX3NpKSwgc2l6ZW9mKHBrdEluZm8ubmFtZSkpOw0KLSNlbmRpZg0KLSAgcmV0dXJuIChUUlVFKTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLVBVQkxJQyBCT09MIFBrdEdldERyaXZlclBhcmFtICh2b2lkKQ0KLXsNCi0gIHJlZy5yX2F4ID0gMHgwQTAwOw0KLQ0KLSAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkNCi0gICAgIHJldHVybiAoRkFMU0UpOw0KLQ0KLSNpZiAoRE9TWCAmIFBIQVJMQVApDQotICBSZWFkUmVhbE1lbSAoJnBrdEluZm8ubWFqVmVyLCBET1NfQUREUihyZWcuZXMscmVnLmVkaSksIFBLVF9QQVJBTV9TSVpFKTsNCi0NCi0jZWxpZiAoRE9TWCAmIERKR1BQKQ0KLSAgZG9zbWVtZ2V0IChET1NfQUREUihyZWcueC5lcyxyZWcueC5kaSksIFBLVF9QQVJBTV9TSVpFLCAmcGt0SW5mby5tYWpWZXIpOw0KLQ0KLSNlbGlmIChET1NYICYgRE9TNEdXKQ0KLSAgbWVtY3B5ICgmcGt0SW5mby5tYWpWZXIsICh2b2lkKilET1NfQUREUihyZWcucl9lcyxyZWcucl9kaSksIFBLVF9QQVJBTV9TSVpFKTsNCi0NCi0jZWxzZQ0KLSAgX2ZtZW1jcHkgKCZwa3RJbmZvLm1halZlciwgTUtfRlAocmVnLnJfZXMscmVnLnJfZGkpLCBQS1RfUEFSQU1fU0laRSk7DQotI2VuZGlmDQotICByZXR1cm4gKFRSVUUpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2lmIChET1NYICYgUEhBUkxBUCkNCi0gIFBVQkxJQyBpbnQgUGt0UmVjZWl2ZSAoQllURSAqYnVmLCBpbnQgbWF4KQ0KLSAgew0KLSAgICBXT1JEIGluT2ZzICA9ICpyeEluT2ZzRnA7DQotICAgIFdPUkQgb3V0T2ZzID0gKnJ4T3V0T2ZzRnA7DQotDQotICAgIGlmIChvdXRPZnMgIT0gaW5PZnMpDQotICAgIHsNCi0gICAgICBSWF9FTEVNRU5UIF9mYXIgKmhlYWQgPSAoUlhfRUxFTUVOVCBfZmFyKikocHJvdEJhc2Urb3V0T2ZzKTsNCi0gICAgICBpbnQgc2l6ZSwgbGVuID0gbWF4Ow0KLQ0KLSAgICAgIGlmIChDaGVja0VsZW1lbnQoaGVhZCkpDQotICAgICAgew0KLSAgICAgICAgc2l6ZSA9IG1pbiAoaGVhZC0+Zmlyc3RDb3VudCwgc2l6ZW9mKFJYX0VMRU1FTlQpKTsNCi0gICAgICAgIGxlbiAgPSBtaW4gKHNpemUsIG1heCk7DQotICAgICAgICBfZm1lbWNweSAoYnVmLCAmaGVhZC0+ZGVzdGluLCBsZW4pOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgICBzaXplID0gLTE7DQotDQotICAgICAgb3V0T2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7DQotICAgICAgaWYgKG91dE9mcyA+IExBU1RfUlhfQlVGKQ0KLSAgICAgICAgICBvdXRPZnMgPSBGSVJTVF9SWF9CVUY7DQotICAgICAgKnJ4T3V0T2ZzRnAgPSBvdXRPZnM7DQotICAgICAgcmV0dXJuIChzaXplKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gKDApOw0KLSAgfQ0KLQ0KLSAgUFVCTElDIHZvaWQgUGt0UXVldWVCdXN5IChCT09MIGJ1c3kpDQotICB7DQotICAgICpyeE91dE9mc0ZwID0gYnVzeSA/ICgqcnhJbk9mc0ZwICsgc2l6ZW9mKFJYX0VMRU1FTlQpKSA6ICpyeEluT2ZzRnA7DQotICAgIGlmICgqcnhPdXRPZnNGcCA+IExBU1RfUlhfQlVGKQ0KLSAgICAgICAgKnJ4T3V0T2ZzRnAgPSBGSVJTVF9SWF9CVUY7DQotICAgICooRFdPUkQgX2ZhciopKHByb3RCYXNlICsgKFdPUkQpJnBrdERyb3ApID0gMDsNCi0gIH0NCi0NCi0gIFBVQkxJQyBXT1JEIFBrdEJ1ZmZlcnNVc2VkICh2b2lkKQ0KLSAgew0KLSAgICBXT1JEIGluT2ZzICA9ICpyeEluT2ZzRnA7DQotICAgIFdPUkQgb3V0T2ZzID0gKnJ4T3V0T2ZzRnA7DQotDQotICAgIGlmIChpbk9mcyA+PSBvdXRPZnMpDQotICAgICAgIHJldHVybiAoaW5PZnMgLSBvdXRPZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpOw0KLSAgICByZXR1cm4gKE5VTV9SWF9CVUYgLSAob3V0T2ZzIC0gaW5PZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpKTsNCi0gIH0NCi0NCi0gIFBVQkxJQyBEV09SRCBQa3RSeERyb3BwZWQgKHZvaWQpDQotICB7DQotICAgIHJldHVybiAoKihEV09SRCBfZmFyKikocHJvdEJhc2UgKyAoV09SRCkmcGt0RHJvcCkpOw0KLSAgfQ0KLQ0KLSNlbGlmIChET1NYICYgREpHUFApDQotICBQVUJMSUMgaW50IFBrdFJlY2VpdmUgKEJZVEUgKmJ1ZiwgaW50IG1heCkNCi0gIHsNCi0gICAgV09SRCBvZnMgPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK3J4T3V0T2ZzKTsNCi0NCi0gICAgaWYgKG9mcyAhPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK3J4SW5PZnMpKQ0KLSAgICB7DQotICAgICAgUlhfRUxFTUVOVCBoZWFkOw0KLSAgICAgIGludCAgc2l6ZSwgbGVuID0gbWF4Ow0KLQ0KLSAgICAgIGhlYWQuZmlyc3RDb3VudCAgPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK29mcyk7DQotICAgICAgaGVhZC5zZWNvbmRDb3VudCA9IF9mYXJwZWVrdyAoX2Rvc19kcywgcmVhbEJhc2Urb2ZzKzIpOw0KLSAgICAgIGhlYWQuaGFuZGxlICAgICAgPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK29mcys0KTsNCi0NCi0gICAgICBpZiAoQ2hlY2tFbGVtZW50KCZoZWFkKSkNCi0gICAgICB7DQotICAgICAgICBzaXplID0gbWluIChoZWFkLmZpcnN0Q291bnQsIHNpemVvZihSWF9FTEVNRU5UKSk7DQotICAgICAgICBsZW4gID0gbWluIChzaXplLCBtYXgpOw0KLSAgICAgICAgZG9zbWVtZ2V0IChyZWFsQmFzZStvZnMrNiwgbGVuLCBidWYpOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgICBzaXplID0gLTE7DQotDQotICAgICAgb2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7DQotICAgICAgaWYgKG9mcyA+IExBU1RfUlhfQlVGKQ0KLSAgICAgICAgICAgX2ZhcnBva2V3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcywgRklSU1RfUlhfQlVGKTsNCi0gICAgICBlbHNlIF9mYXJwb2tldyAoX2Rvc19kcywgcmVhbEJhc2UrcnhPdXRPZnMsIG9mcyk7DQotICAgICAgcmV0dXJuIChzaXplKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gKDApOw0KLSAgfQ0KLQ0KLSAgUFVCTElDIHZvaWQgUGt0UXVldWVCdXN5IChCT09MIGJ1c3kpDQotICB7DQotICAgIFdPUkQgb2ZzOw0KLQ0KLSAgICBkaXNhYmxlKCk7DQotICAgIG9mcyA9IF9mYXJwZWVrdyAoX2Rvc19kcywgcmVhbEJhc2UrcnhJbk9mcyk7DQotICAgIGlmIChidXN5KQ0KLSAgICAgICBvZnMgKz0gc2l6ZW9mIChSWF9FTEVNRU5UKTsNCi0NCi0gICAgaWYgKG9mcyA+IExBU1RfUlhfQlVGKQ0KLSAgICAgICAgIF9mYXJwb2tldyAoX2Rvc19kcywgcmVhbEJhc2UrcnhPdXRPZnMsIEZJUlNUX1JYX0JVRik7DQotICAgIGVsc2UgX2ZhcnBva2V3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcywgb2ZzKTsNCi0gICAgX2ZhcnBva2VsIChfZG9zX2RzLCByZWFsQmFzZStwa3REcm9wLCAwVUwpOw0KLSAgICBlbmFibGUoKTsNCi0gIH0NCi0NCi0gIFBVQkxJQyBXT1JEIFBrdEJ1ZmZlcnNVc2VkICh2b2lkKQ0KLSAgew0KLSAgICBXT1JEIGluT2ZzLCBvdXRPZnM7DQotDQotICAgIGRpc2FibGUoKTsNCi0gICAgaW5PZnMgID0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStyeEluT2ZzKTsNCi0gICAgb3V0T2ZzID0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcyk7DQotICAgIGVuYWJsZSgpOw0KLSAgICBpZiAoaW5PZnMgPj0gb3V0T2ZzKQ0KLSAgICAgICByZXR1cm4gKGluT2ZzIC0gb3V0T2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKTsNCi0gICAgcmV0dXJuIChOVU1fUlhfQlVGIC0gKG91dE9mcyAtIGluT2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKSk7DQotICB9DQotDQotICBQVUJMSUMgRFdPUkQgUGt0UnhEcm9wcGVkICh2b2lkKQ0KLSAgew0KLSAgICByZXR1cm4gX2ZhcnBlZWtsIChfZG9zX2RzLCByZWFsQmFzZStwa3REcm9wKTsNCi0gIH0NCi0NCi0jZWxpZiAoRE9TWCAmIERPUzRHVykNCi0gIFBVQkxJQyBpbnQgUGt0UmVjZWl2ZSAoQllURSAqYnVmLCBpbnQgbWF4KQ0KLSAgew0KLSAgICBXT1JEIG9mcyA9ICooV09SRCopIChyZWFsQmFzZStyeE91dE9mcyk7DQotDQotICAgIGlmIChvZnMgIT0gKihXT1JEKikgKHJlYWxCYXNlK3J4SW5PZnMpKQ0KLSAgICB7DQotICAgICAgUlhfRUxFTUVOVCBoZWFkOw0KLSAgICAgIGludCAgc2l6ZSwgbGVuID0gbWF4Ow0KLQ0KLSAgICAgIGhlYWQuZmlyc3RDb3VudCAgPSAqKFdPUkQqKSAocmVhbEJhc2Urb2ZzKTsNCi0gICAgICBoZWFkLnNlY29uZENvdW50ID0gKihXT1JEKikgKHJlYWxCYXNlK29mcysyKTsNCi0gICAgICBoZWFkLmhhbmRsZSAgICAgID0gKihXT1JEKikgKHJlYWxCYXNlK29mcys0KTsNCi0NCi0gICAgICBpZiAoQ2hlY2tFbGVtZW50KCZoZWFkKSkNCi0gICAgICB7DQotICAgICAgICBzaXplID0gbWluIChoZWFkLmZpcnN0Q291bnQsIHNpemVvZihSWF9FTEVNRU5UKSk7DQotICAgICAgICBsZW4gID0gbWluIChzaXplLCBtYXgpOw0KLSAgICAgICAgbWVtY3B5IChidWYsIChjb25zdCB2b2lkKikocmVhbEJhc2Urb2ZzKzYpLCBsZW4pOw0KLSAgICAgIH0NCi0gICAgICBlbHNlDQotICAgICAgICBzaXplID0gLTE7DQotDQotICAgICAgb2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7DQotICAgICAgaWYgKG9mcyA+IExBU1RfUlhfQlVGKQ0KLSAgICAgICAgICAgKihXT1JEKikgKHJlYWxCYXNlK3J4T3V0T2ZzKSA9IEZJUlNUX1JYX0JVRjsNCi0gICAgICBlbHNlICooV09SRCopIChyZWFsQmFzZStyeE91dE9mcykgPSBvZnM7DQotICAgICAgcmV0dXJuIChzaXplKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gKDApOw0KLSAgfQ0KLQ0KLSAgUFVCTElDIHZvaWQgUGt0UXVldWVCdXN5IChCT09MIGJ1c3kpDQotICB7DQotICAgIFdPUkQgb2ZzOw0KLQ0KLSAgICBfZGlzYWJsZSgpOw0KLSAgICBvZnMgPSAqKFdPUkQqKSAocmVhbEJhc2UrcnhJbk9mcyk7DQotICAgIGlmIChidXN5KQ0KLSAgICAgICBvZnMgKz0gc2l6ZW9mIChSWF9FTEVNRU5UKTsNCi0NCi0gICAgaWYgKG9mcyA+IExBU1RfUlhfQlVGKQ0KLSAgICAgICAgICooV09SRCopIChyZWFsQmFzZStyeE91dE9mcykgPSBGSVJTVF9SWF9CVUY7DQotICAgIGVsc2UgKihXT1JEKikgKHJlYWxCYXNlK3J4T3V0T2ZzKSA9IG9mczsNCi0gICAgKihEV09SRCopIChyZWFsQmFzZStwa3REcm9wKSA9IDBVTDsNCi0gICAgX2VuYWJsZSgpOw0KLSAgfQ0KLQ0KLSAgUFVCTElDIFdPUkQgUGt0QnVmZmVyc1VzZWQgKHZvaWQpDQotICB7DQotICAgIFdPUkQgaW5PZnMsIG91dE9mczsNCi0NCi0gICAgX2Rpc2FibGUoKTsNCi0gICAgaW5PZnMgID0gKihXT1JEKikgKHJlYWxCYXNlK3J4SW5PZnMpOw0KLSAgICBvdXRPZnMgPSAqKFdPUkQqKSAocmVhbEJhc2UrcnhPdXRPZnMpOw0KLSAgICBfZW5hYmxlKCk7DQotICAgIGlmIChpbk9mcyA+PSBvdXRPZnMpDQotICAgICAgIHJldHVybiAoaW5PZnMgLSBvdXRPZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpOw0KLSAgICByZXR1cm4gKE5VTV9SWF9CVUYgLSAob3V0T2ZzIC0gaW5PZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpKTsNCi0gIH0NCi0NCi0gIFBVQkxJQyBEV09SRCBQa3RSeERyb3BwZWQgKHZvaWQpDQotICB7DQotICAgIHJldHVybiAqKERXT1JEKikgKHJlYWxCYXNlK3BrdERyb3ApOw0KLSAgfQ0KLQ0KLSNlbHNlICAgICAvKiByZWFsLW1vZGUgc21hbGwvbGFyZ2UgbW9kZWwgKi8NCi0NCi0gIFBVQkxJQyBpbnQgUGt0UmVjZWl2ZSAoQllURSAqYnVmLCBpbnQgbWF4KQ0KLSAgew0KLSAgICBpZiAocnhPdXRPZnMgIT0gcnhJbk9mcykNCi0gICAgew0KLSAgICAgIFJYX0VMRU1FTlQgZmFyICpoZWFkID0gKFJYX0VMRU1FTlQgZmFyKikgTUtfRlAgKF9EUyxyeE91dE9mcyk7DQotICAgICAgaW50ICBzaXplLCBsZW4gPSBtYXg7DQotDQotICAgICAgaWYgKENoZWNrRWxlbWVudChoZWFkKSkNCi0gICAgICB7DQotICAgICAgICBzaXplID0gbWluIChoZWFkLT5maXJzdENvdW50LCBzaXplb2YoUlhfRUxFTUVOVCkpOw0KLSAgICAgICAgbGVuICA9IG1pbiAoc2l6ZSwgbWF4KTsNCi0gICAgICAgIF9mbWVtY3B5IChidWYsICZoZWFkLT5kZXN0aW4sIGxlbik7DQotICAgICAgfQ0KLSAgICAgIGVsc2UNCi0gICAgICAgIHNpemUgPSAtMTsNCi0NCi0gICAgICByeE91dE9mcyArPSBzaXplb2YgKFJYX0VMRU1FTlQpOw0KLSAgICAgIGlmIChyeE91dE9mcyA+IExBU1RfUlhfQlVGKQ0KLSAgICAgICAgICByeE91dE9mcyA9IEZJUlNUX1JYX0JVRjsNCi0gICAgICByZXR1cm4gKHNpemUpOw0KLSAgICB9DQotICAgIHJldHVybiAoMCk7DQotICB9DQotDQotICBQVUJMSUMgdm9pZCBQa3RRdWV1ZUJ1c3kgKEJPT0wgYnVzeSkNCi0gIHsNCi0gICAgcnhPdXRPZnMgPSBidXN5ID8gKHJ4SW5PZnMgKyBzaXplb2YoUlhfRUxFTUVOVCkpIDogcnhJbk9mczsNCi0gICAgaWYgKHJ4T3V0T2ZzID4gTEFTVF9SWF9CVUYpDQotICAgICAgICByeE91dE9mcyA9IEZJUlNUX1JYX0JVRjsNCi0gICAgcGt0RHJvcCA9IDBMOw0KLSAgfQ0KLQ0KLSAgUFVCTElDIFdPUkQgUGt0QnVmZmVyc1VzZWQgKHZvaWQpDQotICB7DQotICAgIFdPUkQgaW5PZnMgID0gcnhJbk9mczsNCi0gICAgV09SRCBvdXRPZnMgPSByeE91dE9mczsNCi0NCi0gICAgaWYgKGluT2ZzID49IG91dE9mcykNCi0gICAgICAgcmV0dXJuICgoaW5PZnMgLSBvdXRPZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpKTsNCi0gICAgcmV0dXJuIChOVU1fUlhfQlVGIC0gKG91dE9mcyAtIGluT2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKSk7DQotICB9DQotDQotICBQVUJMSUMgRFdPUkQgUGt0UnhEcm9wcGVkICh2b2lkKQ0KLSAgew0KLSAgICByZXR1cm4gKHBrdERyb3ApOw0KLSAgfQ0KLSNlbmRpZg0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1MT0NBTCBfX2lubGluZSB2b2lkIFBrdEZyZWVNZW0gKHZvaWQpDQotew0KLSNpZiAoRE9TWCAmIFBIQVJMQVApDQotICBpZiAocmVhbFNlZykNCi0gIHsNCi0gICAgX2R4X3JlYWxfZnJlZSAocmVhbFNlZyk7DQotICAgIHJlYWxTZWcgPSAwOw0KLSAgfQ0KLSNlbGlmIChET1NYICYgREpHUFApDQotICBpZiAocm1fbWVtLnJtX3NlZ21lbnQpDQotICB7DQotICAgIHVuc2lnbmVkIG9mczsgIC8qIGNsZWFyIHRoZSBET1MtbWVtIHRvIHByZXZlbnQgZnVydGhlciB1cGNhbGxzICovDQotDQotICAgIGZvciAob2ZzID0gMDsgb2ZzIDwgMTYgKiBybV9tZW0uc2l6ZSAvIDQ7IG9mcyArPSA0KQ0KLSAgICAgICBfZmFycG9rZWwgKF9kb3NfZHMsIHJlYWxCYXNlICsgb2ZzLCAwKTsNCi0gICAgX2dvMzJfZHBtaV9mcmVlX2Rvc19tZW1vcnkgKCZybV9tZW0pOw0KLSAgICBybV9tZW0ucm1fc2VnbWVudCA9IDA7DQotICB9DQotI2VsaWYgKERPU1ggJiBET1M0R1cpDQotICBpZiAocm1fYmFzZV9zZWwpDQotICB7DQotICAgIGRwbWlfcmVhbF9mcmVlIChybV9iYXNlX3NlbCk7DQotICAgIHJtX2Jhc2Vfc2VsID0gMDsNCi0gIH0NCi0jZW5kaWYNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLVBVQkxJQyBCT09MIFBrdEV4aXREcml2ZXIgKHZvaWQpDQoteyAgICAgICAgICAgDQotICBpZiAocGt0SW5mby5oYW5kbGUpDQotICB7DQotICAgIGlmICghUGt0U2V0UmVjZWl2ZXJNb2RlKFBEUlhfQlJPQURDQVNUKSkNCi0gICAgICAgUFVUUyAoIkVycm9yIHJlc3RvcmluZyByZWNlaXZlciBtb2RlLiIpOw0KLQ0KLSAgICBpZiAoIVBrdFJlbGVhc2VIYW5kbGUocGt0SW5mby5oYW5kbGUpKQ0KLSAgICAgICBQVVRTICgiRXJyb3IgcmVsZWFzaW5nIFBLVC1EUlZSIGhhbmRsZS4iKTsNCi0NCi0gICAgUGt0RnJlZU1lbSgpOw0KLSAgICBwa3RJbmZvLmhhbmRsZSA9IDA7DQotICB9DQotDQotICBpZiAocGNhcF9wa3RfZGVidWcgPj0gMSkNCi0gICAgIHByaW50ZiAoIkludGVybmFsIHN0YXRzOiB0b28tc21hbGwgJWx1LCB0b28tbGFyZ2UgJWx1LCBiYWQtc3luYyAlbHUsICINCi0gICAgICAgICAgICAgIndyb25nLWhhbmRsZSAlbHVcbiIsDQotICAgICAgICAgICAgIGludFN0YXQudG9vU21hbGwsIGludFN0YXQudG9vTGFyZ2UsDQotICAgICAgICAgICAgIGludFN0YXQuYmFkU3luYywgaW50U3RhdC53cm9uZ0hhbmRsZSk7DQotICByZXR1cm4gKFRSVUUpOw0KLX0NCi0NCi0jaWYgKERPU1ggJiAoREpHUFB8RE9TNEdXKSkNCi1zdGF0aWMgdm9pZCBkdW1wX3BrdF9zdHViICh2b2lkKQ0KLXsNCi0gIGludCBpOw0KLQ0KLSAgZnByaW50ZiAoc3RkZXJyLCAiUGt0UmVjZWl2ZXIgJWx1LCBwa3Rfc3R1YltQa3RSZWNlaXZlcl0gPVxuIiwNCi0gICAgICAgICAgIFBrdFJlY2VpdmVyKTsNCi0gIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQ0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiUwMlgsICIsIHJlYWxfc3R1Yl9hcnJheVtpK1BrdFJlY2VpdmVyXSk7DQotICBmcHV0cyAoIlxuIiwgc3RkZXJyKTsNCi19DQotI2VuZGlmDQotDQotLyoNCi0gKiBGcm9udCBlbmQgaW5pdGlhbGl6YXRpb24gcm91dGluZQ0KLSAqLw0KLVBVQkxJQyBCT09MIFBrdEluaXREcml2ZXIgKFBLVF9SWF9NT0RFIG1vZGUpDQotew0KLSAgUEtUX1JYX01PREUgcnhNb2RlOw0KLSAgQk9PTCAgIHdyaXRlSW5mbyA9IChwY2FwX3BrdF9kZWJ1ZyA+PSAzKTsNCi0NCi0gIHBrdEluZm8ucXVpZXQgPSAocGNhcF9wa3RfZGVidWcgPCAzKTsNCi0NCi0jaWYgKERPU1ggJiBQSEFSTEFQKSAmJiBkZWZpbmVkKF9fSElHSENfXykNCi0gIGlmIChfbXdlbnYgIT0gMikNCi0gIHsNCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiT25seSBQaGFybGFwIERPUyBleHRlbmRlciBzdXBwb3J0ZWQuXG4iKTsNCi0gICAgcmV0dXJuIChGQUxTRSk7DQotICB9DQotI2VuZGlmDQotDQotI2lmIChET1NYICYgUEhBUkxBUCkgJiYgZGVmaW5lZChfX1dBVENPTUNfXykNCi0gIGlmIChfRXh0ZW5kZXIgIT0gMSkNCi0gIHsNCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiT25seSBET1M0R1cgc3R5bGUgZXh0ZW5kZXJzIHN1cHBvcnRlZC5cbiIpOw0KLSAgICByZXR1cm4gKEZBTFNFKTsNCi0gIH0NCi0jZW5kaWYNCi0NCi0gIGlmICghUGt0U2VhcmNoRHJpdmVyKCkpDQotICB7DQotICAgIFBVVFMgKCJQYWNrZXQgZHJpdmVyIG5vdCBmb3VuZC4iKTsNCi0gICAgUGt0RnJlZU1lbSgpOw0KLSAgICByZXR1cm4gKEZBTFNFKTsNCi0gIH0NCi0NCi0gIGlmICghUGt0R2V0RHJpdmVySW5mbygpKQ0KLSAgew0KLSAgICBQVVRTICgiRXJyb3IgZ2V0dGluZyBwa3QtZHJ2ciBpbmZvcm1hdGlvbi4iKTsNCi0gICAgUGt0RnJlZU1lbSgpOw0KLSAgICByZXR1cm4gKEZBTFNFKTsNCi0gIH0NCi0NCi0jaWYgKERPU1ggJiBQSEFSTEFQKQ0KLSAgaWYgKFJlYWxDb3B5KChVTE9ORykmcnhPdXRPZnMsIChVTE9ORykmcGt0UnhFbmQsDQotICAgICAgICAgICAgICAgJnJlYWxCYXNlLCAmcHJvdEJhc2UsIChVU0hPUlQqKSZyZWFsU2VnKSkNCi0gIHsNCi0gICAgcnhPdXRPZnNGcCAgPSAoV09SRCBfZmFyICopIChwcm90QmFzZSArIChXT1JEKSAmcnhPdXRPZnMpOw0KLSAgICByeEluT2ZzRnAgICA9IChXT1JEIF9mYXIgKikgKHByb3RCYXNlICsgKFdPUkQpICZyeEluT2ZzKTsNCi0gICAgKnJ4T3V0T2ZzRnAgPSBGSVJTVF9SWF9CVUY7DQotICAgICpyeEluT2ZzRnAgID0gRklSU1RfUlhfQlVGOw0KLSAgfQ0KLSAgZWxzZQ0KLSAgew0KLSAgICBQVVRTICgiQ2Fubm90IGFsbG9jYXRlIHJlYWwtbW9kZSBzdHViLiIpOw0KLSAgICByZXR1cm4gKEZBTFNFKTsNCi0gIH0NCi0NCi0jZWxpZiAoRE9TWCAmIChESkdQUHxET1M0R1cpKQ0KLSAgaWYgKHNpemVvZihyZWFsX3N0dWJfYXJyYXkpID4gMHhGRkZGKQ0KLSAgew0KLSAgICBmcHJpbnRmIChzdGRlcnIsICJgcmVhbF9zdHViX2FycmF5W10nIHRvbyBiaWcuXG4iKTsNCi0gICAgcmV0dXJuIChGQUxTRSk7DQotICB9DQotI2lmIChET1NYICYgREpHUFApDQotICBybV9tZW0uc2l6ZSA9IChzaXplb2YocmVhbF9zdHViX2FycmF5KSArIDE1KSAvIDE2Ow0KLQ0KLSAgaWYgKF9nbzMyX2RwbWlfYWxsb2NhdGVfZG9zX21lbW9yeSgmcm1fbWVtKSB8fCBybV9tZW0ucm1fb2Zmc2V0ICE9IDApDQotICB7DQotICAgIFBVVFMgKCJyZWFsLW1vZGUgaW5pdCBmYWlsZWQuIik7DQotICAgIHJldHVybiAoRkFMU0UpOw0KLSAgfQ0KLSAgcmVhbEJhc2UgPSAocm1fbWVtLnJtX3NlZ21lbnQgPDwgNCk7DQotICBkb3NtZW1wdXQgKCZyZWFsX3N0dWJfYXJyYXksIHNpemVvZihyZWFsX3N0dWJfYXJyYXkpLCByZWFsQmFzZSk7DQotICBfZmFycG9rZWwgKF9kb3NfZHMsIHJlYWxCYXNlK3J4T3V0T2ZzLCBGSVJTVF9SWF9CVUYpOw0KLSAgX2ZhcnBva2VsIChfZG9zX2RzLCByZWFsQmFzZStyeEluT2ZzLCAgRklSU1RfUlhfQlVGKTsNCi0NCi0jZWxpZiAoRE9TWCAmIERPUzRHVykNCi0gIHJtX2Jhc2Vfc2VnID0gZHBtaV9yZWFsX21hbGxvYyAoc2l6ZW9mKHJlYWxfc3R1Yl9hcnJheSksICZybV9iYXNlX3NlbCk7DQotICBpZiAoIXJtX2Jhc2Vfc2VnKQ0KLSAgew0KLSAgICBQVVRTICgicmVhbC1tb2RlIGluaXQgZmFpbGVkLiIpOw0KLSAgICByZXR1cm4gKEZBTFNFKTsNCi0gIH0NCi0gIHJlYWxCYXNlID0gKHJtX2Jhc2Vfc2VnIDw8IDQpOw0KLSAgbWVtY3B5ICgodm9pZCopcmVhbEJhc2UsICZyZWFsX3N0dWJfYXJyYXksIHNpemVvZihyZWFsX3N0dWJfYXJyYXkpKTsNCi0gICooV09SRCopIChyZWFsQmFzZStyeE91dE9mcykgPSBGSVJTVF9SWF9CVUY7DQotICAqKFdPUkQqKSAocmVhbEJhc2UrcnhJbk9mcykgID0gRklSU1RfUlhfQlVGOw0KLQ0KLSNlbmRpZg0KLSAgew0KLSAgICBpbnQgcHVzaGYgPSBQa3RSZWNlaXZlcjsNCi0NCi0gICAgd2hpbGUgKHJlYWxfc3R1Yl9hcnJheVtwdXNoZisrXSAhPSAweDlDICYmICAgIC8qIHB1c2hmICovDQotICAgICAgICAgICByZWFsX3N0dWJfYXJyYXlbcHVzaGZdICAgIT0gMHhGQSkgICAgICAvKiBjbGkgICAqLw0KLSAgICB7DQotICAgICAgaWYgKCsrcGFyYV9za2lwID4gMTYpDQotICAgICAgew0KLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiU29tZXRoaW5nIHdyb25nIHdpdGggYHBrdF9zdHViLmluYycuXG4iKTsNCi0gICAgICAgIHBhcmFfc2tpcCA9IDA7DQotICAgICAgICBkdW1wX3BrdF9zdHViKCk7DQotICAgICAgICByZXR1cm4gKEZBTFNFKTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgaWYgKCooV09SRCopKHJlYWxfc3R1Yl9hcnJheSArIG9mZnNldG9mKFBrdFJlYWxTdHViLF9kdW1teSkpICE9IDB4QjgwMCkNCi0gICAgew0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgImByZWFsX3N0dWJfYXJyYXlbXScgaXMgbWlzYWxpZ25lZC5cbiIpOw0KLSAgICAgIHJldHVybiAoRkFMU0UpOw0KLSAgICB9DQotICB9DQotDQotICBpZiAocGNhcF9wa3RfZGVidWcgPiAyKQ0KLSAgICAgIGR1bXBfcGt0X3N0dWIoKTsNCi0NCi0jZWxzZQ0KLSAgcnhPdXRPZnMgPSBGSVJTVF9SWF9CVUY7DQotICByeEluT2ZzICA9IEZJUlNUX1JYX0JVRjsNCi0jZW5kaWYNCi0NCi0gIGlmICghUGt0U2V0QWNjZXNzKCkpDQotICB7DQotICAgIFBVVFMgKCJFcnJvciBzZXR0aW5nIHBrdC1kcnZyIGFjY2Vzcy4iKTsNCi0gICAgUGt0RnJlZU1lbSgpOw0KLSAgICByZXR1cm4gKEZBTFNFKTsNCi0gIH0NCi0NCi0gIGlmICghUGt0R2V0QWRkcmVzcygmbXlBZGRyZXNzKSkNCi0gIHsNCi0gICAgUFVUUyAoIkVycm9yIGZldGNoaW5nIGFkYXB0ZXIgYWRkcmVzcy4iKTsNCi0gICAgUGt0RnJlZU1lbSgpOw0KLSAgICByZXR1cm4gKEZBTFNFKTsNCi0gIH0NCi0NCi0gIGlmICghUGt0U2V0UmVjZWl2ZXJNb2RlKG1vZGUpKQ0KLSAgew0KLSAgICBQVVRTICgiRXJyb3Igc2V0dGluZyByZWNlaXZlciBtb2RlLiIpOw0KLSAgICBQa3RGcmVlTWVtKCk7DQotICAgIHJldHVybiAoRkFMU0UpOw0KLSAgfQ0KLQ0KLSAgaWYgKCFQa3RHZXRSZWNlaXZlck1vZGUoJnJ4TW9kZSkpDQotICB7DQotICAgIFBVVFMgKCJFcnJvciBnZXR0aW5nIHJlY2VpdmVyIG1vZGUuIik7DQotICAgIFBrdEZyZWVNZW0oKTsNCi0gICAgcmV0dXJuIChGQUxTRSk7DQotICB9DQotDQotICBpZiAod3JpdGVJbmZvKQ0KLSAgICAgcHJpbnRmICgiUGt0LWRyaXZlciBpbmZvcm1hdGlvbjpcbiINCi0gICAgICAgICAgICAgIiAgVmVyc2lvbiAgOiAlZC4lZFxuIg0KLSAgICAgICAgICAgICAiICBOYW1lICAgICA6ICUuMTVzXG4iDQotICAgICAgICAgICAgICIgIENsYXNzICAgIDogJXUgKCVzKVxuIg0KLSAgICAgICAgICAgICAiICBUeXBlICAgICA6ICV1XG4iDQotICAgICAgICAgICAgICIgIE51bWJlciAgIDogJXVcbiINCi0gICAgICAgICAgICAgIiAgRnVuY3MgICAgOiAldVxuIg0KLSAgICAgICAgICAgICAiICBJbnRyICAgICA6ICVYaFxuIg0KLSAgICAgICAgICAgICAiICBIYW5kbGUgICA6ICV1XG4iDQotICAgICAgICAgICAgICIgIEV4dGVuZGVkIDogJXNcbiINCi0gICAgICAgICAgICAgIiAgSGktcGVyZiAgOiAlc1xuIg0KLSAgICAgICAgICAgICAiICBSWCBtb2RlICA6ICVzXG4iDQotICAgICAgICAgICAgICIgIEV0aC1hZGRyIDogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsDQotDQotICAgICAgICAgICAgIHBrdEluZm8ubWFqVmVyLCBwa3RJbmZvLm1pblZlciwgcGt0SW5mby5uYW1lLA0KLSAgICAgICAgICAgICBwa3RJbmZvLmNsYXNzLCAgUGt0R2V0Q2xhc3NOYW1lKHBrdEluZm8uY2xhc3MpLA0KLSAgICAgICAgICAgICBwa3RJbmZvLnR5cGUsICAgcGt0SW5mby5udW1iZXIsDQotICAgICAgICAgICAgIHBrdEluZm8uZnVuY3MsICBwa3RJbmZvLmludHIsICAgcGt0SW5mby5oYW5kbGUsDQotICAgICAgICAgICAgIHBrdEluZm8uZnVuY3MgPT0gMiB8fCBwa3RJbmZvLmZ1bmNzID09IDYgPyAiWWVzIiA6ICJObyIsDQotICAgICAgICAgICAgIHBrdEluZm8uZnVuY3MgPT0gNSB8fCBwa3RJbmZvLmZ1bmNzID09IDYgPyAiWWVzIiA6ICJObyIsDQotICAgICAgICAgICAgIFBrdFJYbW9kZVN0cihyeE1vZGUpLA0KLSAgICAgICAgICAgICBteUFkZHJlc3NbMF0sIG15QWRkcmVzc1sxXSwgbXlBZGRyZXNzWzJdLA0KLSAgICAgICAgICAgICBteUFkZHJlc3NbM10sIG15QWRkcmVzc1s0XSwgbXlBZGRyZXNzWzVdKTsNCi0NCi0jaWYgZGVmaW5lZChERUJVRykgJiYgKERPU1ggJiBQSEFSTEFQKQ0KLSAgaWYgKHdyaXRlSW5mbykNCi0gIHsNCi0gICAgRFdPUkQgICAgckFkciA9IHJlYWxCYXNlICsgKFdPUkQpJlBrdFJlY2VpdmVyOw0KLSAgICB1bnNpZ25lZCBzZWwsIG9mczsNCi0NCi0gICAgcHJpbnRmICgiXG5SZWNlaXZlciBhdCAgICUwNFg6JTA0WFxuIiwgUlBfU0VHKHJBZHIpLCAgICBSUF9PRkYockFkcikpOw0KLSAgICBwcmludGYgKCJSZWFsYmFzZSAgICA9ICUwNFg6JTA0WFxuIiwgICBSUF9TRUcocmVhbEJhc2UpLFJQX09GRihyZWFsQmFzZSkpOw0KLQ0KLSAgICBzZWwgPSBfRlBfU0VHIChwcm90QmFzZSk7DQotICAgIG9mcyA9IF9GUF9PRkYgKHByb3RCYXNlKTsNCi0gICAgcHJpbnRmICgiUHJvdGJhc2UgICAgPSAlMDRYOiUwOFhcbiIsIHNlbCxvZnMpOw0KLSAgICBwcmludGYgKCJSZWFsU2VnICAgICA9ICUwNFhcbiIsIHJlYWxTZWcpOw0KLQ0KLSAgICBzZWwgPSBfRlBfU0VHIChyeE91dE9mc0ZwKTsNCi0gICAgb2ZzID0gX0ZQX09GRiAocnhPdXRPZnNGcCk7DQotICAgIHByaW50ZiAoInJ4T3V0T2ZzRnAgID0gJTA0WDolMDhYXG4iLCBzZWwsb2ZzKTsNCi0NCi0gICAgc2VsID0gX0ZQX1NFRyAocnhJbk9mc0ZwKTsNCi0gICAgb2ZzID0gX0ZQX09GRiAocnhJbk9mc0ZwKTsNCi0gICAgcHJpbnRmICgicnhJbk9mc0ZwICAgPSAlMDRYOiUwOFhcbiIsIHNlbCxvZnMpOw0KLQ0KLSAgICBwcmludGYgKCJSZWFkeTogKnJ4T3V0T2ZzRnAgPSAlMDRYICpyeEluT2ZzRnAgPSAlMDRYXG4iLA0KLSAgICAgICAgICAgICpyeE91dE9mc0ZwLCAqcnhJbk9mc0ZwKTsNCi0NCi0gICAgUGt0UXVldWVCdXN5IChUUlVFKTsNCi0gICAgcHJpbnRmICgiQnVzeTogICpyeE91dE9mc0ZwID0gJTA0WCAqcnhJbk9mc0ZwID0gJTA0WFxuIiwNCi0gICAgICAgICAgICAqcnhPdXRPZnNGcCwgKnJ4SW5PZnNGcCk7DQotICB9DQotI2VuZGlmDQotDQotICBtZW1zZXQgKCZwa3RTdGF0LCAwLCBzaXplb2YocGt0U3RhdCkpOyAgLyogY2xlYXIgc3RhdGlzdGljcyAqLw0KLSAgUGt0UXVldWVCdXN5IChUUlVFKTsNCi0gIHJldHVybiAoVFJVRSk7DQotfQ0KLQ0KLQ0KLS8qDQotICogRFBNSSBmdW5jdGlvbnMgb25seSBmb3IgV2F0Y29tICsgRE9TNEdXIGV4dGVuZGVycw0KLSAqLw0KLSNpZiAoRE9TWCAmIERPUzRHVykNCi1MT0NBTCBEV09SRCBkcG1pX2dldF9yZWFsX3ZlY3RvciAoaW50IGludHIpDQotew0KLSAgdW5pb24gUkVHUyByOw0KLQ0KLSAgci54LmVheCA9IDB4MjAwOw0KLSAgci54LmVieCA9IChEV09SRCkgaW50cjsNCi0gIGludDM4NiAoMHgzMSwgJnIsICZyKTsNCi0gIHJldHVybiAoKHIudy5jeCA8PCA0KSArIHIudy5keCk7DQotfQ0KLQ0KLUxPQ0FMIFdPUkQgZHBtaV9yZWFsX21hbGxvYyAoaW50IHNpemUsIFdPUkQgKnNlbGVjdG9yKQ0KLXsNCi0gIHVuaW9uIFJFR1MgcjsNCi0NCi0gIHIueC5lYXggPSAweDAxMDA7ICAgICAgICAgICAgIC8qIERQTUkgYWxsb2NhdGUgRE9TIG1lbW9yeSAqLw0KLSAgci54LmVieCA9IChzaXplICsgMTUpIC8gMTY7ICAgLyogTnVtYmVyIG9mIHBhcmFncmFwaHMgcmVxdWVzdGVkICovDQotICBpbnQzODYgKDB4MzEsICZyLCAmcik7DQotICBpZiAoci53LmNmbGFnICYgMSkNCi0gICAgIHJldHVybiAoMCk7DQotDQotICAqc2VsZWN0b3IgPSByLncuZHg7DQotICByZXR1cm4gKHIudy5heCk7ICAgICAgICAgICAgICAvKiBSZXR1cm4gc2VnbWVudCBhZGRyZXNzICovDQotfQ0KLQ0KLUxPQ0FMIHZvaWQgZHBtaV9yZWFsX2ZyZWUgKFdPUkQgc2VsZWN0b3IpDQotew0KLSAgdW5pb24gUkVHUyByOw0KLQ0KLSAgci54LmVheCA9IDB4MTAxOyAgICAgICAgICAgICAgLyogRFBNSSBmcmVlIERPUyBtZW1vcnkgKi8NCi0gIHIueC5lYnggPSBzZWxlY3RvcjsgICAgICAgICAgIC8qIFNlbGVjdG9yIHRvIGZyZWUgKi8NCi0gIGludDM4NiAoMHgzMSwgJnIsICZyKTsNCi19DQotI2VuZGlmDQotDQotDQotI2lmIGRlZmluZWQoRE9TWCkgJiYgKERPU1ggJiBQSEFSTEFQKQ0KLS8qDQotICogRGVzY3JpcHRpb246DQotICogICAgIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgY29udmVudGlvbmFsIG1lbW9yeSBmb3IgdGhlIHNwZWNpZmllZCBibG9jaw0KLSAqICAgICBvZiBjb2RlICh3aGljaCBtdXN0IGJlIHdpdGhpbiB0aGUgZmlyc3QgNjRLIG9mIHRoZSBwcm90ZWN0ZWQgbW9kZQ0KLSAqICAgICBwcm9ncmFtIHNlZ21lbnQpIGFuZCBjb3BpZXMgdGhlIGNvZGUgdG8gaXQuDQotICoNCi0gKiAgICAgVGhlIGNhbGxlciBzaG91bGQgZnJlZSB1cCB0aGUgY29udmVudGlvbmFsIG1lbW9yeSBibG9jayB3aGVuIGl0DQotICogICAgIGlzIGRvbmUgd2l0aCB0aGUgY29udmVudGlvbmFsIG1lbW9yeS4NCi0gKg0KLSAqICAgICBOT1RFIFRISVMgUk9VVElORSBSRVFVSVJFUyAzODZ8RE9TLUVYVEVOREVSIDMuMCBPUiBMQVRFUi4NCi0gKg0KLSAqIENhbGxpbmcgYXJndW1lbnRzOg0KLSAqICAgICBzdGFydF9vZmZzICAgICAgc3RhcnQgb2YgcmVhbCBtb2RlIGNvZGUgaW4gcHJvZ3JhbSBzZWdtZW50DQotICogICAgIGVuZF9vZmZzICAgICAgICAxIGJ5dGUgcGFzdCBlbmQgb2YgcmVhbCBtb2RlIGNvZGUgaW4gcHJvZ3JhbSBzZWdtZW50DQotICogICAgIHJlYWxfYmFzZXAgICAgICByZXR1cm5lZDsgIHJlYWwgbW9kZSBwdHIgdG8gdXNlIGFzIGEgYmFzZSBmb3IgdGhlDQotICogICAgICAgICAgICAgICAgICAgICAgICByZWFsIG1vZGUgY29kZSAoZWcsIHRvIGdldCB0aGUgcmVhbCBtb2RlIEZBUg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgYWRkciBvZiBhIGZ1bmN0aW9uIGZvbygpLCB0YWtlDQotICogICAgICAgICAgICAgICAgICAgICAgICByZWFsX2Jhc2VwICsgKFVMT05HKSBmb28pLg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwb2ludGVyIGlzIGNvbnN0cnVjdGVkIHN1Y2ggdGhhdA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0cyB3aXRoaW4gdGhlIHJlYWwgbW9kZSBzZWdtZW50IGFyZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgYXMgdGhlIGxpbmstdGltZSBvZmZzZXRzIGluIHRoZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG1vZGUgcHJvZ3JhbSBzZWdtZW50DQotICogICAgIHByb3RfYmFzZXAgICAgICByZXR1cm5lZDsgIHByb3QgbW9kZSBwdHIgdG8gdXNlIGFzIGEgYmFzZSBmb3IgZ2V0dGluZw0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNvbnZlbnRpb25hbCBtZW1vcnksIGFsc28gY29uc3RydWN0ZWQNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgYWRkaW5nIHRoZSBwcm90IG1vZGUgb2Zmc2V0IG9mIGENCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIHRvIHRoZSBiYXNlIGdldHMgeW91IGENCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHB0ciB0byB0aGUgZnVuY3Rpb24gb3IgdmFyaWFibGUgaW4gdGhlDQotICogICAgICAgICAgICAgICAgICAgICAgICBjb252ZW50aW9uYWwgbWVtb3J5IGJsb2NrLg0KLSAqICAgICBybWVtX2FkcnAgICAgICAgcmV0dXJuZWQ7ICByZWFsIG1vZGUgcGFyYSBhZGRyIG9mIGFsbG9jYXRlZA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgY29udmVudGlvbmFsIG1lbW9yeSBibG9jaywgdG8gYmUgdXNlZCB0byBmcmVlDQotICogICAgICAgICAgICAgICAgICAgICAgICB1cCB0aGUgY29udmVudGlvbmFsIG1lbW9yeSB3aGVuIGRvbmUuICBETyBOT1QNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFVTRSBUSElTIFRPIENPTlNUUlVDVCBBIFJFQUwgTU9ERSBQVFIsIFVTRQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgUkVBTF9CQVNFUCBJTlNURUFEIFNPIFRIQVQgT0ZGU0VUUyBXT1JLIE9VVA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SUkVDVExZLg0KLSAqDQotICogUmV0dXJuZWQgdmFsdWVzOg0KLSAqICAgICAwICAgICAgaWYgZXJyb3INCi0gKiAgICAgMSAgICAgIGlmIHN1Y2Nlc3MNCi0gKi8NCi1pbnQgUmVhbENvcHkgKFVMT05HICAgIHN0YXJ0X29mZnMsDQotICAgICAgICAgICAgICBVTE9ORyAgICBlbmRfb2ZmcywNCi0gICAgICAgICAgICAgIFJFQUxQVFIgKnJlYWxfYmFzZXAsDQotICAgICAgICAgICAgICBGQVJQVFIgICpwcm90X2Jhc2VwLA0KLSAgICAgICAgICAgICAgVVNIT1JUICAqcm1lbV9hZHJwKQ0KLXsNCi0gIFVMT05HICAgcm1fYmFzZTsgICAgLyogYmFzZSByZWFsIG1vZGUgcGFyYSBhZGRyIGZvciBhY2Nlc3NpbmcgKi8NCi0gICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIGNvbnZlbnRpb25hbCBtZW1vcnkgICAgICAgICAgKi8NCi0gIFVDSEFSICAqc291cmNlOyAgICAgLyogc291cmNlIHBvaW50ZXIgZm9yIGNvcHkgICAgICAgICAgICAgICAgKi8NCi0gIEZBUlBUUiAgZGVzdGluOyAgICAgLyogZGVzdGluYXRpb24gcG9pbnRlciBmb3IgY29weSAgICAgICAgICAgKi8NCi0gIFVMT05HICAgbGVuOyAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgICAgICAgICAgICAgICAgKi8NCi0gIFVMT05HICAgdGVtcDsNCi0gIFVTSE9SVCAgc3RlbXA7DQotDQotICAvKiBGaXJzdCBjaGVjayBmb3IgdmFsaWQgaW5wdXRzDQotICAgKi8NCi0gIGlmIChzdGFydF9vZmZzID49IGVuZF9vZmZzIHx8IGVuZF9vZmZzID4gMHgxMDAwMCkNCi0gICAgIHJldHVybiAoRkFMU0UpOw0KLQ0KLSAgLyogUm91bmQgc3RhcnRfb2ZmcyBkb3duIHRvIGEgcGFyYWdyYXBoICgxNi1ieXRlKSBib3VuZGFyeSBzbyB3ZSBjYW4gc2V0IHVwDQotICAgKiB0aGUgcmVhbCBtb2RlIHBvaW50ZXIgZWFzaWx5LiBSb3VuZCB1cCBlbmRfb2ZmcyB0byBtYWtlIHN1cmUgd2UgYWxsb2NhdGUNCi0gICAqIGVub3VnaCBwYXJhZ3JhcGhzDQotICAgKi8NCi0gIHN0YXJ0X29mZnMgJj0gfjE1Ow0KLSAgZW5kX29mZnMgPSAoMTUgKyAoZW5kX29mZnMgPDwgNCkpID4+IDQ7DQotDQotICAvKiBBbGxvY2F0ZSB0aGUgY29udmVudGlvbmFsIG1lbW9yeSBmb3Igb3VyIHJlYWwgbW9kZSBjb2RlLiAgUmVtZW1iZXIgdG8NCi0gICAqIHJvdW5kIGJ5dGUgY291bnQgVVAgdG8gMTYtYnl0ZSBwYXJhZ3JhcGggc2l6ZS4gIFdlIGFsbG9jIGl0DQotICAgKiBhYm92ZSB0aGUgRE9TIGRhdGEgYnVmZmVyIHNvIGJvdGggdGhlIERPUyBkYXRhIGJ1ZmZlciBhbmQgdGhlIGFwcGwNCi0gICAqIGNvbnZlbnRpb25hbCBtZW0gYmxvY2sgY2FuIHN0aWxsIGJlIHJlc2l6ZWQuDQotICAgKg0KLSAgICogRmlyc3QganVzdCB0cnkgdG8gYWxsb2MgaXQ7ICBpZiB3ZSBjYW4ndCBnZXQgaXQsIHNocmluayB0aGUgYXBwbCBtZW0NCi0gICAqIGJsb2NrIGRvd24gdG8gdGhlIG1pbmltdW0sIHRyeSB0byBhbGxvYyB0aGUgbWVtb3J5IGFnYWluLCB0aGVuIGdyb3cgdGhlDQotICAgKiBhcHBsIG1lbSBibG9jayBiYWNrIHRvIHRoZSBtYXhpbXVtLiAgKERvbid0IHRyeSB0byBzaHJpbmsgdGhlIERPUyBkYXRhDQotICAgKiBidWZmZXIgdG8gZnJlZSBjb252ZW50aW9uYWwgbWVtb3J5OyAgaXQgd291bGRuJ3QgYmUgZ29vZCBmb3IgdGhpcyByb3V0aW5lDQotICAgKiB0byBoYXZlIHRoZSBwb3NzaWJsZSBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgZmlsZSBJL08gcnVuIHNsb3dlci4pDQotICAgKi8NCi0gIGxlbiA9ICgoZW5kX29mZnMgLSBzdGFydF9vZmZzKSArIDE1KSA+PiA0Ow0KLSAgaWYgKF9keF9yZWFsX2Fib3ZlKGxlbiwgcm1lbV9hZHJwLCAmc3RlbXApICE9IF9ET1NFX05PTkUpDQotICB7DQotICAgIGlmIChfZHhfY21lbV91c2FnZSgwLCAwLCAmdGVtcCwgJnRlbXApICE9IF9ET1NFX05PTkUpDQotICAgICAgIHJldHVybiAoRkFMU0UpOw0KLQ0KLSAgICBpZiAoX2R4X3JlYWxfYWJvdmUobGVuLCBybWVtX2FkcnAsICZzdGVtcCkgIT0gX0RPU0VfTk9ORSkNCi0gICAgICAgKnJtZW1fYWRycCA9IDA7DQotDQotICAgIGlmIChfZHhfY21lbV91c2FnZSgwLCAxLCAmdGVtcCwgJnRlbXApICE9IF9ET1NFX05PTkUpDQotICAgIHsNCi0gICAgICBpZiAoKnJtZW1fYWRycCAhPSAwKQ0KLSAgICAgICAgIF9keF9yZWFsX2ZyZWUgKCpybWVtX2FkcnApOw0KLSAgICAgIHJldHVybiAoRkFMU0UpOw0KLSAgICB9DQotDQotICAgIGlmICgqcm1lbV9hZHJwID09IDApDQotICAgICAgIHJldHVybiAoRkFMU0UpOw0KLSAgfQ0KLQ0KLSAgLyogQ29uc3RydWN0IHJlYWwgbW9kZSAmIHByb3RlY3RlZCBtb2RlIHBvaW50ZXJzIHRvIGFjY2VzcyB0aGUgYWxsb2NhdGVkDQotICAgKiBtZW1vcnkuICBOb3RlIHdlIGtub3cgc3RhcnRfb2ZmcyBpcyBhbGlnbmVkIG9uIGEgcGFyYWdyYXBoICgxNi1ieXRlKQ0KLSAgICogYm91bmRhcnksIGJlY2F1c2Ugd2Ugcm91bmRlZCBpdCBkb3duLg0KLSAgICoNCi0gICAqIFdlIG1ha2UgdGhlIG9mZnNldHMgY29tZSBvdXQgcmlnaHRzIGJ5IGJhY2tpbmcgb2ZmIHRoZSByZWFsIG1vZGUgc2VsZWN0b3INCi0gICAqIGJ5IHN0YXJ0X29mZnMuDQotICAgKi8NCi0gIHJtX2Jhc2UgPSAoKFVMT05HKSAqcm1lbV9hZHJwKSAtIChzdGFydF9vZmZzID4+IDQpOw0KLSAgUlBfU0VUICgqcmVhbF9iYXNlcCwgMCwgcm1fYmFzZSk7DQotICBGUF9TRVQgKCpwcm90X2Jhc2VwLCBybV9iYXNlIDw8IDQsIFNTX0RPU01FTSk7DQotDQotICAvKiBDb3B5IHRoZSByZWFsIG1vZGUgY29kZS9kYXRhIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5DQotICAgKi8NCi0gIHNvdXJjZSA9IChVQ0hBUiAqKSBzdGFydF9vZmZzOw0KLSAgZGVzdGluID0gKnByb3RfYmFzZXA7DQotICBGUF9TRVQgKGRlc3RpbiwgRlBfT0ZGKCpwcm90X2Jhc2VwKSArIHN0YXJ0X29mZnMsIEZQX1NFTCgqcHJvdF9iYXNlcCkpOw0KLSAgbGVuID0gZW5kX29mZnMgLSBzdGFydF9vZmZzOw0KLSAgV3JpdGVGYXJNZW0gKGRlc3Rpbiwgc291cmNlLCBsZW4pOw0KLQ0KLSAgcmV0dXJuIChUUlVFKTsNCi19DQotI2VuZGlmIC8qIERPU1ggJiYgKERPU1ggJiBQSEFSTEFQKSAqLw0KKy8qCisgKiAgRmlsZS4uLi4uLi4uLjogcGt0ZHJ2ci5jCisgKgorICogIFJlc3BvbnNpYmxlLi46IEdpc2xlIFZhbmVtLCAgZ2l2YUBiZ25ldHQubm8KKyAqCisgKiAgQ3JlYXRlZC4uLi4uLjogMjYuU2VwdCAxOTk1CisgKgorICogIERlc2NyaXB0aW9uLi46IFBhY2tldC1kcml2ZXIgaW50ZXJmYWNlIGZvciAxNi8zMi1iaXQgQyA6CisgKiAgICAgICAgICAgICAgICAgQm9ybGFuZCBDL0MrKyAzLjArIHNtYWxsL2xhcmdlIG1vZGVsCisgKiAgICAgICAgICAgICAgICAgV2F0Y29tIEMvQysrIDExKywgRE9TNEdXIGZsYXQgbW9kZWwKKyAqICAgICAgICAgICAgICAgICBNZXRhd2FyZSBIaWdoQyAzLjErIGFuZCBQaGFyTGFwIDM4NnxEb3NYCisgKiAgICAgICAgICAgICAgICAgR05VIEMvQysrIDIuNysgYW5kIGRqZ3BwIDIueCBleHRlbmRlcgorICoKKyAqICBSZWZlcmVuY2VzLi4uOiBQQy9UQ1AgUGFja2V0IGRyaXZlciBTcGVjaWZpY2F0aW9uLiByZXYgMS4wOQorICogICAgICAgICAgICAgICAgIEZUUCBTb2Z0d2FyZSBJbmMuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRvcy5oPgorCisjaW5jbHVkZSAicGNhcC1kb3MuaCIKKyNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgIm1zZG9zL3BrdGRydnIuaCIKKworI2lmIChET1NYKQorI2RlZmluZSBOVU1fUlhfQlVGICAzMiAgICAgIC8qICMgb2YgYnVmZmVycyBpbiBSeCBGSUZPIHF1ZXVlICovCisjZWxzZQorI2RlZmluZSBOVU1fUlhfQlVGICAxMAorI2VuZGlmCisKKyNkZWZpbmUgRElNKHgpICAgKHNpemVvZigoeCkpIC8gc2l6ZW9mKHhbMF0pKQorI2RlZmluZSBQVVRTKHMpICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBpZiAoIXBrdEluZm8ucXVpZXQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgcGt0SW5mby5lcnJvciA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiJXM6ICVzXG4iLCBzLCBwa3RJbmZvLmVycm9yKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiVzXG4iLCBwa3RJbmZvLmVycm9yID0gcyk7ICAgICBcCisgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCisKKyNpZiBkZWZpbmVkKF9fSElHSENfXykKKyAgZXh0ZXJuIFVJTlQgX213ZW52OworCisjZWxpZiBkZWZpbmVkKF9fREpHUFBfXykKKyAgI2luY2x1ZGUgPHN0ZGRlZi5oPgorICAjaW5jbHVkZSA8ZHBtaS5oPgorICAjaW5jbHVkZSA8Z28zMi5oPgorICAjaW5jbHVkZSA8cGMuaD4KKyAgI2luY2x1ZGUgPHN5cy9mYXJwdHIuaD4KKworI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKKyAgI2luY2x1ZGUgPGk4Ni5oPgorICAjaW5jbHVkZSA8c3RkZGVmLmg+CisgIGV4dGVybiBjaGFyIF9FeHRlbmRlcjsKKworI2Vsc2UKKyAgZXh0ZXJuIHZvaWQgZmFyIFBrdFJlY2VpdmVyICh2b2lkKTsKKyNlbmRpZgorCisKKyNpZiAoRE9TWCAmIChESkdQUHxET1M0R1cpKQorICAjaW5jbHVkZSA8c3lzL3BhY2tfb24uaD4KKworICBzdHJ1Y3QgRFBNSV9yZWdzIHsKKyAgICAgICAgIERXT1JEICByX2RpOworICAgICAgICAgRFdPUkQgIHJfc2k7CisgICAgICAgICBEV09SRCAgcl9icDsKKyAgICAgICAgIERXT1JEICByZXNlcnZlZDsKKyAgICAgICAgIERXT1JEICByX2J4OworICAgICAgICAgRFdPUkQgIHJfZHg7CisgICAgICAgICBEV09SRCAgcl9jeDsKKyAgICAgICAgIERXT1JEICByX2F4OworICAgICAgICAgV09SRCAgIHJfZmxhZ3M7CisgICAgICAgICBXT1JEICAgcl9lcywgcl9kcywgcl9mcywgcl9nczsKKyAgICAgICAgIFdPUkQgICByX2lwLCByX2NzLCByX3NwLCByX3NzOworICAgICAgIH07CisKKyAgLyogRGF0YSBsb2NhdGVkIGluIGEgcmVhbC1tb2RlIHNlZ21lbnQuIFRoaXMgYmVjb21lcyBmYXIgYXQgcnVudGltZQorICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIHsgICAgICAgICAgLyogbXVzdCBtYXRjaCBkYXRhL2NvZGUgaW4gcGt0X3J4MS5zICovCisgICAgICAgICAgV09SRCAgICAgICBfcnhPdXRPZnM7CisgICAgICAgICAgV09SRCAgICAgICBfcnhJbk9mczsKKyAgICAgICAgICBEV09SRCAgICAgIF9wa3REcm9wOworICAgICAgICAgIEJZVEUgICAgICAgX3BrdFRlbXAgWzIwXTsKKyAgICAgICAgICBUWF9FTEVNRU5UIF9wa3RUeEJ1ZlsxXTsKKyAgICAgICAgICBSWF9FTEVNRU5UIF9wa3RSeEJ1ZltOVU1fUlhfQlVGXTsKKyAgICAgICAgICBXT1JEICAgICAgIF9kdW1teVsyXTsgICAgICAgIC8qIHNjcmVlblNlZyxuZXdJbk9mZnNldCAqLworICAgICAgICAgIEJZVEUgICAgICAgX2ZhbkNoYXJzWzRdOworICAgICAgICAgIFdPUkQgICAgICAgX2ZhbkluZGV4OworICAgICAgICAgIEJZVEUgICAgICAgX1BrdFJlY2VpdmVyWzE1XTsgLyogc3RhcnRzIG9uIGEgcGFyYWdyYXBoICgxNmJ5dGUpICovCisgICAgICAgIH0gUGt0UmVhbFN0dWI7CisgICNpbmNsdWRlIDxzeXMvcGFja19vZmYuaD4KKworICBzdGF0aWMgQllURSByZWFsX3N0dWJfYXJyYXkgW10gPSB7CisgICAgICAgICAjaW5jbHVkZSAicGt0X3N0dWIuaW5jIiAgICAgICAvKiBnZW5lcmF0ZWQgb3Bjb2RlIGFycmF5ICovCisgICAgICAgfTsKKworICAjZGVmaW5lIHJ4T3V0T2ZzICAgICAgb2Zmc2V0b2YgKFBrdFJlYWxTdHViLF9yeE91dE9mcykKKyAgI2RlZmluZSByeEluT2ZzICAgICAgIG9mZnNldG9mIChQa3RSZWFsU3R1YixfcnhJbk9mcykKKyAgI2RlZmluZSBQa3RSZWNlaXZlciAgIG9mZnNldG9mIChQa3RSZWFsU3R1YixfUGt0UmVjZWl2ZXIgW3BhcmFfc2tpcF0pCisgICNkZWZpbmUgcGt0RHJvcCAgICAgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdERyb3ApCisgICNkZWZpbmUgcGt0VGVtcCAgICAgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdFRlbXApCisgICNkZWZpbmUgcGt0VHhCdWYgICAgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdFR4QnVmKQorICAjZGVmaW5lIEZJUlNUX1JYX0JVRiAgb2Zmc2V0b2YgKFBrdFJlYWxTdHViLF9wa3RSeEJ1ZiBbMF0pCisgICNkZWZpbmUgTEFTVF9SWF9CVUYgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdFJ4QnVmIFtOVU1fUlhfQlVGLTFdKQorCisjZWxzZQorICBleHRlcm4gV09SRCAgICAgICByeE91dE9mczsgICAgLyogb2Zmc2V0cyBpbnRvIHBrdFJ4QnVmIEZJRk8gcXVldWUgICAqLworICBleHRlcm4gV09SRCAgICAgICByeEluT2ZzOworICBleHRlcm4gRFdPUkQgICAgICBwa3REcm9wOyAgICAgLyogIyBwYWNrZXRzIGRyb3BwZWQgaW4gUGt0UmVjZWl2ZXIoKSAqLworICBleHRlcm4gQllURSAgICAgICBwa3RSeEVuZDsgICAgLyogbWFya3MgdGhlIGVuZCBvZiByLW1vZGUgY29kZS9kYXRhICAqLworCisgIGV4dGVybiBSWF9FTEVNRU5UIHBrdFJ4QnVmIFtOVU1fUlhfQlVGXTsgICAgICAgLyogUGt0RHJ2ciBSeCBidWZmZXJzICovCisgIGV4dGVybiBUWF9FTEVNRU5UIHBrdFR4QnVmOyAgICAgICAgICAgICAgICAgICAgLyogUGt0RHJ2ciBUeCBidWZmZXIgICovCisgIGV4dGVybiBjaGFyICAgICAgIHBrdFRlbXBbMjBdOyAgICAgICAgICAgICAgICAgLyogUGt0RHJ2ciB0ZW1wIGFyZWEgICovCisKKyAgI2RlZmluZSBGSVJTVF9SWF9CVUYgKFdPUkQpICZwa3RSeEJ1ZiBbMF0KKyAgI2RlZmluZSBMQVNUX1JYX0JVRiAgKFdPUkQpICZwa3RSeEJ1ZiBbTlVNX1JYX0JVRi0xXQorI2VuZGlmCisKKworI2lmZGVmIF9fQk9STEFORENfXyAgICAgICAgICAgLyogVXNlIEJvcmxhbmQncyBpbmxpbmUgZnVuY3Rpb25zICovCisgICNkZWZpbmUgbWVtY3B5ICBfX21lbWNweV9fCisgICNkZWZpbmUgbWVtY21wICBfX21lbWNtcF9fCisgICNkZWZpbmUgbWVtc2V0ICBfX21lbXNldF9fCisjZW5kaWYKKworCisjaWYgKERPU1ggJiBQSEFSTEFQKQorICBleHRlcm4gdm9pZCBQa3RSZWNlaXZlciAodm9pZCk7ICAgICAvKiBpbiBwa3RfcngwLmFzbSAqLworICBzdGF0aWMgaW50ICBSZWFsQ29weSAgICAoVUxPTkcsIFVMT05HLCBSRUFMUFRSKiwgRkFSUFRSKiwgVVNIT1JUKik7CisKKyAgI3VuZGVmICBGUF9TRUcKKyAgI3VuZGVmICBGUF9PRkYKKyAgI2RlZmluZSBGUF9PRkYoeCkgICAgICgoV09SRCkoeCkpCisgICNkZWZpbmUgRlBfU0VHKHgpICAgICAoKFdPUkQpKHJlYWxCYXNlID4+IDE2KSkKKyAgI2RlZmluZSBET1NfQUREUihzLG8pICgoKERXT1JEKShzKSA8PCAxNikgKyAoV09SRCkobykpCisgICNkZWZpbmUgcl9heCAgICAgICAgICBlYXgKKyAgI2RlZmluZSByX2J4ICAgICAgICAgIGVieAorICAjZGVmaW5lIHJfZHggICAgICAgICAgZWR4CisgICNkZWZpbmUgcl9jeCAgICAgICAgICBlY3gKKyAgI2RlZmluZSByX3NpICAgICAgICAgIGVzaQorICAjZGVmaW5lIHJfZGkgICAgICAgICAgZWRpCisgICNkZWZpbmUgcl9kcyAgICAgICAgICBkcworICAjZGVmaW5lIHJfZXMgICAgICAgICAgZXMKKyAgTE9DQUwgRkFSUFRSICAgICAgICAgIHByb3RCYXNlOworICBMT0NBTCBSRUFMUFRSICAgICAgICAgcmVhbEJhc2U7CisgIExPQ0FMIFdPUkQgICAgICAgICAgICByZWFsU2VnOyAgIC8qIERPUyBwYXJhLWFkZHJlc3Mgb2YgYWxsb2NhdGVkIGFyZWEgKi8KKyAgTE9DQUwgU1dJX1JFR1MgICAgICAgIHJlZzsKKworICBzdGF0aWMgV09SRCBfZmFyICpyeE91dE9mc0ZwLCAqcnhJbk9mc0ZwOworCisjZWxpZiAoRE9TWCAmIERKR1BQKQorICBzdGF0aWMgX2dvMzJfZHBtaV9zZWdpbmZvIHJtX21lbTsKKyAgc3RhdGljIF9fZHBtaV9yZWdzICAgICAgICByZWc7CisgIHN0YXRpYyBEV09SRCAgICAgICAgICAgICAgcmVhbEJhc2U7CisgIHN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcGFyYV9za2lwID0gMDsKKworICAjZGVmaW5lIERPU19BRERSKHMsbykgICAgICgoKFdPUkQpKHMpIDw8IDQpICsgKG8pKQorICAjZGVmaW5lIHJfYXggICAgICAgICAgICAgIHguYXgKKyAgI2RlZmluZSByX2J4ICAgICAgICAgICAgICB4LmJ4CisgICNkZWZpbmUgcl9keCAgICAgICAgICAgICAgeC5keAorICAjZGVmaW5lIHJfY3ggICAgICAgICAgICAgIHguY3gKKyAgI2RlZmluZSByX3NpICAgICAgICAgICAgICB4LnNpCisgICNkZWZpbmUgcl9kaSAgICAgICAgICAgICAgeC5kaQorICAjZGVmaW5lIHJfZHMgICAgICAgICAgICAgIHguZHMKKyAgI2RlZmluZSByX2VzICAgICAgICAgICAgICB4LmVzCisKKyNlbGlmIChET1NYICYgRE9TNEdXKQorICBMT0NBTCBzdHJ1Y3QgRFBNSV9yZWdzICAgIHJlZzsKKyAgTE9DQUwgV09SRCAgICAgICAgICAgICAgICBybV9iYXNlX3NlZywgcm1fYmFzZV9zZWw7CisgIExPQ0FMIERXT1JEICAgICAgICAgICAgICAgcmVhbEJhc2U7CisgIExPQ0FMIGludCAgICAgICAgICAgICAgICAgcGFyYV9za2lwID0gMDsKKworICBMT0NBTCBEV09SRCBkcG1pX2dldF9yZWFsX3ZlY3RvciAoaW50IGludHIpOworICBMT0NBTCBXT1JEICBkcG1pX3JlYWxfbWFsbG9jICAgICAoaW50IHNpemUsIFdPUkQgKnNlbGVjdG9yKTsKKyAgTE9DQUwgdm9pZCAgZHBtaV9yZWFsX2ZyZWUgICAgICAgKFdPUkQgc2VsZWN0b3IpOworICAjZGVmaW5lIERPU19BRERSKHMsbykgKCgoRFdPUkQpKHMpIDw8IDQpICsgKFdPUkQpKG8pKQorCisjZWxzZSAgICAgICAgICAgICAgLyogcmVhbC1tb2RlIEJvcmxhbmQgZXRjLiAqLworICBzdGF0aWMgc3RydWN0ICB7CisgICAgICAgICBXT1JEIHJfYXgsIHJfYngsIHJfY3gsIHJfZHgsIHJfYnA7CisgICAgICAgICBXT1JEIHJfc2ksIHJfZGksIHJfZHMsIHJfZXMsIHJfZmxhZ3M7CisgICAgICAgfSByZWc7CisjZW5kaWYKKworI2lmZGVmIF9fSElHSENfXworICAjcHJhZ21hIEFsaWFzIChwa3REcm9wLCAgICAiX3BrdERyb3AiKQorICAjcHJhZ21hIEFsaWFzIChwa3RSeEJ1ZiwgICAiX3BrdFJ4QnVmIikKKyAgI3ByYWdtYSBBbGlhcyAocGt0VHhCdWYsICAgIl9wa3RUeEJ1ZiIpCisgICNwcmFnbWEgQWxpYXMgKHBrdFRlbXAsICAgICJfcGt0VGVtcCIpCisgICNwcmFnbWEgQWxpYXMgKHJ4T3V0T2ZzLCAgICJfcnhPdXRPZnMiKQorICAjcHJhZ21hIEFsaWFzIChyeEluT2ZzLCAgICAiX3J4SW5PZnMiKQorICAjcHJhZ21hIEFsaWFzIChwa3RSeEVuZCwgICAiX3BrdFJ4RW5kIikKKyAgI3ByYWdtYSBBbGlhcyAoUGt0UmVjZWl2ZXIsIl9Qa3RSZWNlaXZlciIpCisjZW5kaWYKKworCitQVUJMSUMgUEtUX1NUQVQgICAgcGt0U3RhdDsgICAgLyogc3RhdGlzdGljcyBmb3IgcGFja2V0cyAgICAqLworUFVCTElDIFBLVF9JTkZPICAgIHBrdEluZm87ICAgIC8qIHBhY2tldC1kcml2ZXIgaW5mb3JtYXRpb24gKi8KKworUFVCTElDIFBLVF9SWF9NT0RFIHJlY2VpdmVNb2RlICA9IFBEUlhfRElSRUNUOworUFVCTElDIEVUSEVSICAgICAgIG15QWRkcmVzcyAgICA9IHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfTsKK1BVQkxJQyBFVEhFUiAgICAgICBldGhCcm9hZGNhc3QgPSB7IDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1IH07CisKK0xPQ0FMICBzdHJ1Y3QgeyAgICAgICAgICAgICAvKiBpbnRlcm5hbCBzdGF0aXN0aWNzICovCisgICAgICAgRFdPUkQgIHRvb1NtYWxsOyAgICAgLyogc2l6ZSA8IEVUSF9NSU4gKi8KKyAgICAgICBEV09SRCAgdG9vTGFyZ2U7ICAgICAvKiBzaXplID4gRVRIX01BWCAqLworICAgICAgIERXT1JEICBiYWRTeW5jOyAgICAgIC8qIGNvdW50XzEgIT0gY291bnRfMiAqLworICAgICAgIERXT1JEICB3cm9uZ0hhbmRsZTsgIC8qIHVwY2FsbCB0byB3cm9uZyBoYW5kbGUgKi8KKyAgICAgfSBpbnRTdGF0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitQVUJMSUMgY29uc3QgY2hhciAqUGt0R2V0RXJyb3JTdHIgKGludCBlcnJOdW0pCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICplcnJTdHJbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGhhbmRsZSBudW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAiTm8gaW50ZXJmYWNlcyBvZiBzcGVjaWZpZWQgY2xhc3MgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAiTm8gaW50ZXJmYWNlcyBvZiBzcGVjaWZpZWQgdHlwZSBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICJObyBpbnRlcmZhY2VzIG9mIHNwZWNpZmllZCBudW1iZXIgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAiQmFkIHBhY2tldCB0eXBlIHNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgICJJbnRlcmZhY2UgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aWNhc3QiLAorICAgICAgICAgICAgICAgICAgICAiUGFja2V0IGRyaXZlciBjYW5ub3QgdGVybWluYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVjZWl2ZXIgbW9kZSBzcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICAiSW5zdWZmaWNpZW50IG1lbW9yeSBzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgICJUeXBlIHByZXZpb3VzbHkgYWNjZXNzZWQsIGFuZCBub3QgcmVsZWFzZWQiLAorICAgICAgICAgICAgICAgICAgICAiQ29tbWFuZCBvdXQgb2YgcmFuZ2UsIG9yIG5vdCBpbXBsZW1lbnRlZCIsCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc2VuZCBwYWNrZXQgKHVzdWFsbHkgaGFyZHdhcmUgZXJyb3IpIiwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjaGFuZ2UgaGFyZHdhcmUgYWRkcmVzcyAoID4gMSBoYW5kbGUgb3BlbikiLAorICAgICAgICAgICAgICAgICAgICAiSGFyZHdhcmUgYWRkcmVzcyBoYXMgYmFkIGxlbmd0aCBvciBmb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlc2V0IGludGVyZmFjZSAobW9yZSB0aGFuIDEgaGFuZGxlIG9wZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgIkJhZCBDaGVjay1zdW0iLAorICAgICAgICAgICAgICAgICAgICAiQmFkIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAiQmFkIHN5bmMiICwKKyAgICAgICAgICAgICAgICAgICAgIlNvdXJjZSBoaXQiCisgICAgICAgICAgICAgICAgICB9OworCisgIGlmIChlcnJOdW0gPCAwIHx8IGVyck51bSA+PSBESU0oZXJyU3RyKSkKKyAgICAgcmV0dXJuICgiVW5rbm93biBkcml2ZXIgZXJyb3IuIik7CisgIHJldHVybiAoZXJyU3RyIFtlcnJOdW1dKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitQVUJMSUMgY29uc3QgY2hhciAqUGt0R2V0Q2xhc3NOYW1lIChXT1JEIGNsYXNzKQoreworICBzd2l0Y2ggKGNsYXNzKQorICB7CisgICAgY2FzZSBQRF9FVEhFUjoKKyAgICAgICAgIHJldHVybiAoIkRJWC1FdGhlciIpOworICAgIGNhc2UgUERfUFJPTkVUMTA6CisgICAgICAgICByZXR1cm4gKCJQcm9ORVQtMTAiKTsKKyAgICBjYXNlIFBEX0lFRUU4MDI1OgorICAgICAgICAgcmV0dXJuICgiSUVFRSA4MDIuNSIpOworICAgIGNhc2UgUERfT01OSU5FVDoKKyAgICAgICAgIHJldHVybiAoIk9tbmlOZXQiKTsKKyAgICBjYXNlIFBEX0FQUExFVEFMSzoKKyAgICAgICAgIHJldHVybiAoIkFwcGxlVGFsayIpOworICAgIGNhc2UgUERfU0xJUDoKKyAgICAgICAgIHJldHVybiAoIlNMSVAiKTsKKyAgICBjYXNlIFBEX1NUQVJUTEFOOgorICAgICAgICAgcmV0dXJuICgiU3RhcnRMQU4iKTsKKyAgICBjYXNlIFBEX0FSQ05FVDoKKyAgICAgICAgIHJldHVybiAoIkFyY05ldCIpOworICAgIGNhc2UgUERfQVgyNToKKyAgICAgICAgIHJldHVybiAoIkFYLjI1Iik7CisgICAgY2FzZSBQRF9LSVNTOgorICAgICAgICAgcmV0dXJuICgiS0lTUyIpOworICAgIGNhc2UgUERfSUVFRTgwMjNfMjoKKyAgICAgICAgIHJldHVybiAoIklFRUUgODAyLjMgdy84MDIuMiBoZHIiKTsKKyAgICBjYXNlIFBEX0ZEREk4MDIyOgorICAgICAgICAgcmV0dXJuICgiRkRESSB3LzgwMi4yIGhkciIpOworICAgIGNhc2UgUERfWDI1OgorICAgICAgICAgcmV0dXJuICgiWC4yNSIpOworICAgIGNhc2UgUERfTEFOc3RhcjoKKyAgICAgICAgIHJldHVybiAoIkxBTnN0YXIiKTsKKyAgICBjYXNlIFBEX1BQUDoKKyAgICAgICAgIHJldHVybiAoIlBQUCIpOworICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4gKCJ1bmtub3duIik7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitQVUJMSUMgY2hhciBjb25zdCAqUGt0Ulhtb2RlU3RyIChQS1RfUlhfTU9ERSBtb2RlKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqbW9kZVN0ciBbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVyIHR1cm5lZCBvZmYiLAorICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZSBvbmx5IGRpcmVjdGx5IGFkZHJlc3NlZCBwYWNrZXRzIiwKKyAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmUgZGlyZWN0ICYgYnJvYWRjYXN0IHBhY2tldHMiLAorICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZSBkaXJlY3QsYnJvYWRjYXN0IGFuZCBsaW1pdGVkIG11bHRpY2FzdCBwYWNrZXRzIiwKKyAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmUgZGlyZWN0LGJyb2FkY2FzdCBhbmQgYWxsIG11bHRpY2FzdCBwYWNrZXRzIiwKKyAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmUgYWxsIHBhY2tldHMgKHByb21pc2N1b3VvcyBtb2RlKSIKKyAgICAgICAgICAgICAgICAgIH07CisKKyAgaWYgKG1vZGUgPiBESU0obW9kZVN0cikpCisgICAgIHJldHVybiAoIj8/Iik7CisgIHJldHVybiAobW9kZVN0ciBbbW9kZS0xXSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTE9DQUwgX19pbmxpbmUgQk9PTCBQa3RJbnRlcnJ1cHQgKHZvaWQpCit7CisgIEJPT0wgb2theTsKKworI2lmIChET1NYICYgUEhBUkxBUCkKKyAgX2R4X3JlYWxfaW50ICgoVUlOVClwa3RJbmZvLmludHIsICZyZWcpOworICBva2F5ID0gKChyZWcuZmxhZ3MgJiAxKSA9PSAwKTsgIC8qIE9LIGlmIGNhcnJ5IGNsZWFyICovCisKKyNlbGlmIChET1NYICYgREpHUFApCisgIF9fZHBtaV9pbnQgKChpbnQpcGt0SW5mby5pbnRyLCAmcmVnKTsKKyAgb2theSA9ICgocmVnLnguZmxhZ3MgJiAxKSA9PSAwKTsKKworI2VsaWYgKERPU1ggJiBET1M0R1cpCisgIHVuaW9uICBSRUdTICByOworICBzdHJ1Y3QgU1JFR1MgczsKKworICBtZW1zZXQgKCZyLCAwLCBzaXplb2YocikpOworICBzZWdyZWFkICgmcyk7CisgIHIudy5heCAgPSAweDMwMDsKKyAgci54LmVieCA9IHBrdEluZm8uaW50cjsKKyAgci53LmN4ICA9IDA7CisgIHMuZXMgICAgPSBGUF9TRUcgKCZyZWcpOworICByLnguZWRpID0gRlBfT0ZGICgmcmVnKTsKKyAgcmVnLnJfZmxhZ3MgPSAwOworICByZWcucl9zcyA9IHJlZy5yX3NwID0gMDsgICAgIC8qIERQTUkgaG9zdCBwcm92aWRlcyBzdGFjayAqLworCisgIGludDM4NnggKDB4MzEsICZyLCAmciwgJnMpOworICBva2F5ID0gKCFyLncuY2ZsYWcpOworCisjZWxzZQorICByZWcucl9mbGFncyA9IDA7CisgIGludHIgKHBrdEluZm8uaW50ciwgKHN0cnVjdCBSRUdQQUNLKikmcmVnKTsKKyAgb2theSA9ICgocmVnLnJfZmxhZ3MgJiAxKSA9PSAwKTsKKyNlbmRpZgorCisgIGlmIChva2F5KQorICAgICAgIHBrdEluZm8uZXJyb3IgPSBOVUxMOworICBlbHNlIHBrdEluZm8uZXJyb3IgPSBQa3RHZXRFcnJvclN0ciAocmVnLnJfZHggPj4gOCk7CisgIHJldHVybiAob2theSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNlYXJjaCBmb3IgcGFja2V0IGRyaXZlciBhdCBpbnRlcnJ1cHQgNjBoIHRocm91Z2ggODBoLiBJZiBBU0NJSVoKKyAqIHN0cmluZyAiUEtUIERSVlIiIGZvdW5kIGF0IG9mZnNldCAzIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgcmV0dXJuCisgKiBpbnRlcnJ1cHQgbnVtYmVyLCBlbHNlIHJldHVybiB6ZXJvIGluIHBrdEluZm8uaW50cgorICovCitQVUJMSUMgQk9PTCBQa3RTZWFyY2hEcml2ZXIgKHZvaWQpCit7CisgIEJZVEUgaW50ciAgPSAweDIwOworICBCT09MIGZvdW5kID0gRkFMU0U7CisKKyAgd2hpbGUgKCFmb3VuZCAmJiBpbnRyIDwgMHhGRikKKyAgeworICAgIHN0YXRpYyBjaGFyIHN0clsxMl07ICAgICAgICAgICAgICAgICAvKiAzICsgc3RybGVuKCJQS1QgRFJWUiIpICovCisgICAgc3RhdGljIGNoYXIgcGt0U3RyWzldID0gIlBLVCBEUlZSIjsgIC8qIEFTQ0lJWiBzdHJpbmcgYXQgb2ZzIDMgKi8KKyAgICBEV09SRCAgcnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gaW50ZXJydXB0ICByb3V0aW5lICAqLworCisjaWYgKERPU1ggJiBQSEFSTEFQKQorICAgIF9keF9ybWl2X2dldCAoaW50ciwgJnJwKTsKKyAgICBSZWFkUmVhbE1lbSAoJnN0ciwgKFJFQUxQVFIpcnAsIHNpemVvZihzdHIpKTsKKworI2VsaWYgKERPU1ggJiBESkdQUCkKKyAgICBfX2RwbWlfcmFkZHIgcmVhbEFkcjsKKyAgICBfX2RwbWlfZ2V0X3JlYWxfbW9kZV9pbnRlcnJ1cHRfdmVjdG9yIChpbnRyLCAmcmVhbEFkcik7CisgICAgcnAgPSAocmVhbEFkci5zZWdtZW50IDw8IDQpICsgcmVhbEFkci5vZmZzZXQxNjsKKyAgICBkb3NtZW1nZXQgKHJwLCBzaXplb2Yoc3RyKSwgJnN0cik7CisKKyNlbGlmIChET1NYICYgRE9TNEdXKQorICAgIHJwID0gZHBtaV9nZXRfcmVhbF92ZWN0b3IgKGludHIpOworICAgIG1lbWNweSAoJnN0ciwgKHZvaWQqKXJwLCBzaXplb2Yoc3RyKSk7CisKKyNlbHNlCisgICAgX2ZtZW1jcHkgKCZzdHIsIGdldHZlY3QoaW50ciksIHNpemVvZihzdHIpKTsKKyNlbmRpZgorCisgICAgZm91bmQgPSBtZW1jbXAgKCZzdHJbM10sJnBrdFN0cixzaXplb2YocGt0U3RyKSkgPT0gMDsKKyAgICBpbnRyKys7CisgIH0KKyAgcGt0SW5mby5pbnRyID0gKGZvdW5kID8gaW50ci0xIDogMCk7CisgIHJldHVybiAoZm91bmQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEJPT0wgUGt0U2V0QWNjZXNzICh2b2lkKQoreworICByZWcucl9heCA9IDB4MDIwMCArIHBrdEluZm8uY2xhc3M7CisgIHJlZy5yX2J4ID0gMHhGRkZGOworICByZWcucl9keCA9IDA7CisgIHJlZy5yX2N4ID0gMDsKKworI2lmIChET1NYICYgUEhBUkxBUCkKKyAgcmVnLmRzICA9IDA7CisgIHJlZy5lc2kgPSAwOworICByZWcuZXMgID0gUlBfU0VHIChyZWFsQmFzZSk7CisgIHJlZy5lZGkgPSAoV09SRCkgJlBrdFJlY2VpdmVyOworCisjZWxpZiAoRE9TWCAmIERKR1BQKQorICByZWcueC5kcyA9IDA7CisgIHJlZy54LnNpID0gMDsKKyAgcmVnLnguZXMgPSBybV9tZW0ucm1fc2VnbWVudDsKKyAgcmVnLnguZGkgPSBQa3RSZWNlaXZlcjsKKworI2VsaWYgKERPU1ggJiBET1M0R1cpCisgIHJlZy5yX2RzID0gMDsKKyAgcmVnLnJfc2kgPSAwOworICByZWcucl9lcyA9IHJtX2Jhc2Vfc2VnOworICByZWcucl9kaSA9IFBrdFJlY2VpdmVyOworCisjZWxzZQorICByZWcucl9kcyA9IDA7CisgIHJlZy5yX3NpID0gMDsKKyAgcmVnLnJfZXMgPSBGUF9TRUcgKCZQa3RSZWNlaXZlcik7CisgIHJlZy5yX2RpID0gRlBfT0ZGICgmUGt0UmVjZWl2ZXIpOworI2VuZGlmCisKKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkKKyAgICAgcmV0dXJuIChGQUxTRSk7CisKKyAgcGt0SW5mby5oYW5kbGUgPSByZWcucl9heDsKKyAgcmV0dXJuIChUUlVFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitQVUJMSUMgQk9PTCBQa3RSZWxlYXNlSGFuZGxlIChXT1JEIGhhbmRsZSkKK3sKKyAgcmVnLnJfYXggPSAweDAzMDA7CisgIHJlZy5yX2J4ID0gaGFuZGxlOworICByZXR1cm4gUGt0SW50ZXJydXB0KCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworUFVCTElDIEJPT0wgUGt0VHJhbnNtaXQgKGNvbnN0IHZvaWQgKmV0aCwgaW50IGxlbikKK3sKKyAgaWYgKGxlbiA+IEVUSF9NVFUpCisgICAgIHJldHVybiAoRkFMU0UpOworCisgIHJlZy5yX2F4ID0gMHgwNDAwOyAgICAgICAgICAgICAvKiBGdW5jdGlvbiA0LCBzZW5kIHBrdCAqLworICByZWcucl9jeCA9IGxlbjsgICAgICAgICAgICAgICAgLyogdG90YWwgc2l6ZSBvZiBmcmFtZSAgKi8KKworI2lmIChET1NYICYgREpHUFApCisgIGRvc21lbXB1dCAoZXRoLCBsZW4sIHJlYWxCYXNlK3BrdFR4QnVmKTsKKyAgcmVnLnguZHMgPSBybV9tZW0ucm1fc2VnbWVudDsgIC8qIERPUyBkYXRhIHNlZ21lbnQgYW5kICovCisgIHJlZy54LnNpID0gcGt0VHhCdWY7ICAgICAgICAgICAvKiBET1Mgb2Zmc2V0IHRvIGJ1ZmZlciAqLworCisjZWxpZiAoRE9TWCAmIERPUzRHVykKKyAgbWVtY3B5ICgodm9pZCopKHJlYWxCYXNlK3BrdFR4QnVmKSwgZXRoLCBsZW4pOworICByZWcucl9kcyA9IHJtX2Jhc2Vfc2VnOworICByZWcucl9zaSA9IHBrdFR4QnVmOworCisjZWxpZiAoRE9TWCAmIFBIQVJMQVApCisgIG1lbWNweSAoJnBrdFR4QnVmLCBldGgsIGxlbik7CisgIHJlZy5yX2RzID0gRlBfU0VHICgmcGt0VHhCdWYpOworICByZWcucl9zaSA9IEZQX09GRiAoJnBrdFR4QnVmKTsKKworI2Vsc2UKKyAgcmVnLnJfZHMgPSBGUF9TRUcgKGV0aCk7CisgIHJlZy5yX3NpID0gRlBfT0ZGIChldGgpOworI2VuZGlmCisKKyAgcmV0dXJuIFBrdEludGVycnVwdCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoRE9TWCAmIChESkdQUHxET1M0R1cpKQorTE9DQUwgX19pbmxpbmUgQk9PTCBDaGVja0VsZW1lbnQgKFJYX0VMRU1FTlQgKnJ4KQorI2Vsc2UKK0xPQ0FMIF9faW5saW5lIEJPT0wgQ2hlY2tFbGVtZW50IChSWF9FTEVNRU5UIF9mYXIgKnJ4KQorI2VuZGlmCit7CisgIFdPUkQgY291bnRfMSwgY291bnRfMjsKKworICAvKgorICAgKiBXZSBnb3QgYW4gdXBjYWxsIHRvIHRoZSBzYW1lIFJNQ0Igd2l0aCB3cm9uZyBoYW5kbGUuCisgICAqIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBmYWlsZWQgdG8gcmVsZWFzZSBoYW5kbGUgYXQgcHJvZ3JhbSBleGl0CisgICAqLworICBpZiAocngtPmhhbmRsZSAhPSBwa3RJbmZvLmhhbmRsZSkKKyAgeworICAgIHBrdEluZm8uZXJyb3IgPSAiV3JvbmcgaGFuZGxlIjsKKyAgICBpbnRTdGF0Lndyb25nSGFuZGxlKys7CisgICAgUGt0UmVsZWFzZUhhbmRsZSAocngtPmhhbmRsZSk7CisgICAgcmV0dXJuIChGQUxTRSk7CisgIH0KKyAgY291bnRfMSA9IHJ4LT5maXJzdENvdW50OworICBjb3VudF8yID0gcngtPnNlY29uZENvdW50OworCisgIGlmIChjb3VudF8xICE9IGNvdW50XzIpCisgIHsKKyAgICBwa3RJbmZvLmVycm9yID0gIkJhZCBzeW5jIjsKKyAgICBpbnRTdGF0LmJhZFN5bmMrKzsKKyAgICByZXR1cm4gKEZBTFNFKTsKKyAgfQorICBpZiAoY291bnRfMSA+IEVUSF9NQVgpCisgIHsKKyAgICBwa3RJbmZvLmVycm9yID0gIkxhcmdlIGVzaXplIjsKKyAgICBpbnRTdGF0LnRvb0xhcmdlKys7CisgICAgcmV0dXJuIChGQUxTRSk7CisgIH0KKyNpZiAwCisgIGlmIChjb3VudF8xIDwgRVRIX01JTikKKyAgeworICAgIHBrdEluZm8uZXJyb3IgPSAiU21hbGwgZXNpemUiOworICAgIGludFN0YXQudG9vU21hbGwrKzsKKyAgICByZXR1cm4gKEZBTFNFKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiAoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworUFVCTElDIEJPT0wgUGt0VGVybWluSGFuZGxlIChXT1JEIGhhbmRsZSkKK3sKKyAgcmVnLnJfYXggPSAweDA1MDA7CisgIHJlZy5yX2J4ID0gaGFuZGxlOworICByZXR1cm4gUGt0SW50ZXJydXB0KCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworUFVCTElDIEJPT0wgUGt0UmVzZXRJbnRlcmZhY2UgKFdPUkQgaGFuZGxlKQoreworICByZWcucl9heCA9IDB4MDcwMDsKKyAgcmVnLnJfYnggPSBoYW5kbGU7CisgIHJldHVybiBQa3RJbnRlcnJ1cHQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitQVUJMSUMgQk9PTCBQa3RTZXRSZWNlaXZlck1vZGUgKFBLVF9SWF9NT0RFIG1vZGUpCit7CisgIGlmIChwa3RJbmZvLmNsYXNzID09IFBEX1NMSVAgfHwgcGt0SW5mby5jbGFzcyA9PSBQRF9QUFApCisgICAgIHJldHVybiAoVFJVRSk7CisKKyAgcmVnLnJfYXggPSAweDE0MDA7CisgIHJlZy5yX2J4ID0gcGt0SW5mby5oYW5kbGU7CisgIHJlZy5yX2N4ID0gKFdPUkQpbW9kZTsKKworICBpZiAoIVBrdEludGVycnVwdCgpKQorICAgICByZXR1cm4gKEZBTFNFKTsKKworICByZWNlaXZlTW9kZSA9IG1vZGU7CisgIHJldHVybiAoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworUFVCTElDIEJPT0wgUGt0R2V0UmVjZWl2ZXJNb2RlIChQS1RfUlhfTU9ERSAqbW9kZSkKK3sKKyAgcmVnLnJfYXggPSAweDE1MDA7CisgIHJlZy5yX2J4ID0gcGt0SW5mby5oYW5kbGU7CisKKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkKKyAgICAgcmV0dXJuIChGQUxTRSk7CisKKyAgKm1vZGUgPSByZWcucl9heDsKKyAgcmV0dXJuIChUUlVFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgUEtUX1NUQVQgaW5pdGlhbFN0YXQ7ICAgICAgICAgLyogc3RhdGlzdGljcyBhdCBzdGFydHVwICovCitzdGF0aWMgQk9PTCAgICAgcmVzZXRTdGF0ID0gRkFMU0U7ICAgLyogc3RhdGlzdGljcyByZXNldCA/ICovCisKK1BVQkxJQyBCT09MIFBrdEdldFN0YXRpc3RpY3MgKFdPUkQgaGFuZGxlKQoreworICByZWcucl9heCA9IDB4MTgwMDsKKyAgcmVnLnJfYnggPSBoYW5kbGU7CisKKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkKKyAgICAgcmV0dXJuIChGQUxTRSk7CisKKyNpZiAoRE9TWCAmIFBIQVJMQVApCisgIFJlYWRSZWFsTWVtICgmcGt0U3RhdCwgRE9TX0FERFIocmVnLmRzLHJlZy5lc2kpLCBzaXplb2YocGt0U3RhdCkpOworCisjZWxpZiAoRE9TWCAmIERKR1BQKQorICBkb3NtZW1nZXQgKERPU19BRERSKHJlZy54LmRzLHJlZy54LnNpKSwgc2l6ZW9mKHBrdFN0YXQpLCAmcGt0U3RhdCk7CisKKyNlbGlmIChET1NYICYgRE9TNEdXKQorICBtZW1jcHkgKCZwa3RTdGF0LCAodm9pZCopRE9TX0FERFIocmVnLnJfZHMscmVnLnJfc2kpLCBzaXplb2YocGt0U3RhdCkpOworCisjZWxzZQorICBfZm1lbWNweSAoJnBrdFN0YXQsIE1LX0ZQKHJlZy5yX2RzLHJlZy5yX3NpKSwgc2l6ZW9mKHBrdFN0YXQpKTsKKyNlbmRpZgorCisgIHJldHVybiAoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworUFVCTElDIEJPT0wgUGt0U2Vzc1N0YXRpc3RpY3MgKFdPUkQgaGFuZGxlKQoreworICBpZiAoIVBrdEdldFN0YXRpc3RpY3MocGt0SW5mby5oYW5kbGUpKQorICAgICByZXR1cm4gKEZBTFNFKTsKKworICBpZiAocmVzZXRTdGF0KQorICB7CisgICAgcGt0U3RhdC5pblBhY2tldHMgIC09IGluaXRpYWxTdGF0LmluUGFja2V0czsKKyAgICBwa3RTdGF0Lm91dFBhY2tldHMgLT0gaW5pdGlhbFN0YXQub3V0UGFja2V0czsKKyAgICBwa3RTdGF0LmluQnl0ZXMgICAgLT0gaW5pdGlhbFN0YXQuaW5CeXRlczsKKyAgICBwa3RTdGF0Lm91dEJ5dGVzICAgLT0gaW5pdGlhbFN0YXQub3V0Qnl0ZXM7CisgICAgcGt0U3RhdC5pbkVycm9ycyAgIC09IGluaXRpYWxTdGF0LmluRXJyb3JzOworICAgIHBrdFN0YXQub3V0RXJyb3JzICAtPSBpbml0aWFsU3RhdC5vdXRFcnJvcnM7CisgICAgcGt0U3RhdC5vdXRFcnJvcnMgIC09IGluaXRpYWxTdGF0Lm91dEVycm9yczsKKyAgICBwa3RTdGF0Lmxvc3QgICAgICAgLT0gaW5pdGlhbFN0YXQubG9zdDsKKyAgfQorICByZXR1cm4gKFRSVUUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1BVQkxJQyBCT09MIFBrdFJlc2V0U3RhdGlzdGljcyAoV09SRCBoYW5kbGUpCit7CisgIGlmICghUGt0R2V0U3RhdGlzdGljcyhwa3RJbmZvLmhhbmRsZSkpCisgICAgIHJldHVybiAoRkFMU0UpOworCisgIG1lbWNweSAoJmluaXRpYWxTdGF0LCAmcGt0U3RhdCwgc2l6ZW9mKGluaXRpYWxTdGF0KSk7CisgIHJlc2V0U3RhdCA9IFRSVUU7CisgIHJldHVybiAoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworUFVCTElDIEJPT0wgUGt0R2V0QWRkcmVzcyAoRVRIRVIgKmFkZHIpCit7CisgIHJlZy5yX2F4ID0gMHgwNjAwOworICByZWcucl9ieCA9IHBrdEluZm8uaGFuZGxlOworICByZWcucl9jeCA9IHNpemVvZiAoKmFkZHIpOworCisjaWYgKERPU1ggJiBESkdQUCkKKyAgcmVnLnguZXMgPSBybV9tZW0ucm1fc2VnbWVudDsKKyAgcmVnLnguZGkgPSBwa3RUZW1wOworI2VsaWYgKERPU1ggJiBET1M0R1cpCisgIHJlZy5yX2VzID0gcm1fYmFzZV9zZWc7CisgIHJlZy5yX2RpID0gcGt0VGVtcDsKKyNlbHNlCisgIHJlZy5yX2VzID0gRlBfU0VHICgmcGt0VGVtcCk7CisgIHJlZy5yX2RpID0gRlBfT0ZGICgmcGt0VGVtcCk7ICAvKiBFUzpESSA9IGFkZHJlc3MgZm9yIHJlc3VsdCAqLworI2VuZGlmCisKKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkKKyAgICAgcmV0dXJuIChGQUxTRSk7CisKKyNpZiAoRE9TWCAmIFBIQVJMQVApCisgIFJlYWRSZWFsTWVtIChhZGRyLCByZWFsQmFzZSArIChXT1JEKSZwa3RUZW1wLCBzaXplb2YoKmFkZHIpKTsKKworI2VsaWYgKERPU1ggJiBESkdQUCkKKyAgZG9zbWVtZ2V0IChyZWFsQmFzZStwa3RUZW1wLCBzaXplb2YoKmFkZHIpLCBhZGRyKTsKKworI2VsaWYgKERPU1ggJiBET1M0R1cpCisgIG1lbWNweSAoYWRkciwgKHZvaWQqKShyZWFsQmFzZStwa3RUZW1wKSwgc2l6ZW9mKCphZGRyKSk7CisKKyNlbHNlCisgIG1lbWNweSAoKHZvaWQqKWFkZHIsICZwa3RUZW1wLCBzaXplb2YoKmFkZHIpKTsKKyNlbmRpZgorCisgIHJldHVybiAoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworUFVCTElDIEJPT0wgUGt0U2V0QWRkcmVzcyAoY29uc3QgRVRIRVIgKmFkZHIpCit7CisgIC8qIGNvcHkgYWRkciB0byByZWFsLW1vZGUgc2NyYXRoIGFyZWEgKi8KKworI2lmIChET1NYICYgUEhBUkxBUCkKKyAgV3JpdGVSZWFsTWVtIChyZWFsQmFzZSArIChXT1JEKSZwa3RUZW1wLCAodm9pZCopYWRkciwgc2l6ZW9mKCphZGRyKSk7CisKKyNlbGlmIChET1NYICYgREpHUFApCisgIGRvc21lbXB1dCAoYWRkciwgc2l6ZW9mKCphZGRyKSwgcmVhbEJhc2UrcGt0VGVtcCk7CisKKyNlbGlmIChET1NYICYgRE9TNEdXKQorICBtZW1jcHkgKCh2b2lkKikocmVhbEJhc2UrcGt0VGVtcCksIGFkZHIsIHNpemVvZigqYWRkcikpOworCisjZWxzZQorICBtZW1jcHkgKCZwa3RUZW1wLCAodm9pZCopYWRkciwgc2l6ZW9mKCphZGRyKSk7CisjZW5kaWYKKworICByZWcucl9heCA9IDB4MTkwMDsKKyAgcmVnLnJfY3ggPSBzaXplb2YgKCphZGRyKTsgICAgICAvKiBhZGRyZXNzIGxlbmd0aCAgICAgICAqLworCisjaWYgKERPU1ggJiBESkdQUCkKKyAgcmVnLnguZXMgPSBybV9tZW0ucm1fc2VnbWVudDsgICAvKiBET1Mgb2Zmc2V0IHRvIHBhcmFtICAqLworICByZWcueC5kaSA9IHBrdFRlbXA7ICAgICAgICAgICAgIC8qIERPUyBzZWdtZW50IHRvIHBhcmFtICovCisjZWxpZiAoRE9TWCAmIERPUzRHVykKKyAgcmVnLnJfZXMgPSBybV9iYXNlX3NlZzsKKyAgcmVnLnJfZGkgPSBwa3RUZW1wOworI2Vsc2UKKyAgcmVnLnJfZXMgPSBGUF9TRUcgKCZwa3RUZW1wKTsKKyAgcmVnLnJfZGkgPSBGUF9PRkYgKCZwa3RUZW1wKTsKKyNlbmRpZgorCisgIHJldHVybiBQa3RJbnRlcnJ1cHQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitQVUJMSUMgQk9PTCBQa3RHZXREcml2ZXJJbmZvICh2b2lkKQoreworICBwa3RJbmZvLm1halZlciA9IDA7CisgIHBrdEluZm8ubWluVmVyID0gMDsKKyAgbWVtc2V0ICgmcGt0SW5mby5uYW1lLCAwLCBzaXplb2YocGt0SW5mby5uYW1lKSk7CisgIHJlZy5yX2F4ID0gMHgwMUZGOworICByZWcucl9ieCA9IDA7CisKKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkKKyAgICAgcmV0dXJuIChGQUxTRSk7CisKKyAgcGt0SW5mby5udW1iZXIgPSByZWcucl9jeCAmIDB4RkY7CisgIHBrdEluZm8uY2xhc3MgID0gcmVnLnJfY3ggPj4gODsKKyNpZiAwCisgIHBrdEluZm8ubWluVmVyID0gcmVnLnJfYnggJSAxMDsKKyAgcGt0SW5mby5tYWpWZXIgPSByZWcucl9ieCAvIDEwOworI2Vsc2UKKyAgcGt0SW5mby5tYWpWZXIgPSByZWcucl9ieDsgIC8vICEhCisjZW5kaWYKKyAgcGt0SW5mby5mdW5jcyAgPSByZWcucl9heCAmIDB4RkY7CisgIHBrdEluZm8udHlwZSAgID0gcmVnLnJfZHggJiAweEZGOworCisjaWYgKERPU1ggJiBQSEFSTEFQKQorICBSZWFkUmVhbE1lbSAoJnBrdEluZm8ubmFtZSwgRE9TX0FERFIocmVnLmRzLHJlZy5lc2kpLCBzaXplb2YocGt0SW5mby5uYW1lKSk7CisKKyNlbGlmIChET1NYICYgREpHUFApCisgIGRvc21lbWdldCAoRE9TX0FERFIocmVnLnguZHMscmVnLnguc2kpLCBzaXplb2YocGt0SW5mby5uYW1lKSwgJnBrdEluZm8ubmFtZSk7CisKKyNlbGlmIChET1NYICYgRE9TNEdXKQorICBtZW1jcHkgKCZwa3RJbmZvLm5hbWUsICh2b2lkKilET1NfQUREUihyZWcucl9kcyxyZWcucl9zaSksIHNpemVvZihwa3RJbmZvLm5hbWUpKTsKKworI2Vsc2UKKyAgX2ZtZW1jcHkgKCZwa3RJbmZvLm5hbWUsIE1LX0ZQKHJlZy5yX2RzLHJlZy5yX3NpKSwgc2l6ZW9mKHBrdEluZm8ubmFtZSkpOworI2VuZGlmCisgIHJldHVybiAoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworUFVCTElDIEJPT0wgUGt0R2V0RHJpdmVyUGFyYW0gKHZvaWQpCit7CisgIHJlZy5yX2F4ID0gMHgwQTAwOworCisgIGlmICghUGt0SW50ZXJydXB0KCkpCisgICAgIHJldHVybiAoRkFMU0UpOworCisjaWYgKERPU1ggJiBQSEFSTEFQKQorICBSZWFkUmVhbE1lbSAoJnBrdEluZm8ubWFqVmVyLCBET1NfQUREUihyZWcuZXMscmVnLmVkaSksIFBLVF9QQVJBTV9TSVpFKTsKKworI2VsaWYgKERPU1ggJiBESkdQUCkKKyAgZG9zbWVtZ2V0IChET1NfQUREUihyZWcueC5lcyxyZWcueC5kaSksIFBLVF9QQVJBTV9TSVpFLCAmcGt0SW5mby5tYWpWZXIpOworCisjZWxpZiAoRE9TWCAmIERPUzRHVykKKyAgbWVtY3B5ICgmcGt0SW5mby5tYWpWZXIsICh2b2lkKilET1NfQUREUihyZWcucl9lcyxyZWcucl9kaSksIFBLVF9QQVJBTV9TSVpFKTsKKworI2Vsc2UKKyAgX2ZtZW1jcHkgKCZwa3RJbmZvLm1halZlciwgTUtfRlAocmVnLnJfZXMscmVnLnJfZGkpLCBQS1RfUEFSQU1fU0laRSk7CisjZW5kaWYKKyAgcmV0dXJuIChUUlVFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKERPU1ggJiBQSEFSTEFQKQorICBQVUJMSUMgaW50IFBrdFJlY2VpdmUgKEJZVEUgKmJ1ZiwgaW50IG1heCkKKyAgeworICAgIFdPUkQgaW5PZnMgID0gKnJ4SW5PZnNGcDsKKyAgICBXT1JEIG91dE9mcyA9ICpyeE91dE9mc0ZwOworCisgICAgaWYgKG91dE9mcyAhPSBpbk9mcykKKyAgICB7CisgICAgICBSWF9FTEVNRU5UIF9mYXIgKmhlYWQgPSAoUlhfRUxFTUVOVCBfZmFyKikocHJvdEJhc2Urb3V0T2ZzKTsKKyAgICAgIGludCBzaXplLCBsZW4gPSBtYXg7CisKKyAgICAgIGlmIChDaGVja0VsZW1lbnQoaGVhZCkpCisgICAgICB7CisgICAgICAgIHNpemUgPSBtaW4gKGhlYWQtPmZpcnN0Q291bnQsIHNpemVvZihSWF9FTEVNRU5UKSk7CisgICAgICAgIGxlbiAgPSBtaW4gKHNpemUsIG1heCk7CisgICAgICAgIF9mbWVtY3B5IChidWYsICZoZWFkLT5kZXN0aW4sIGxlbik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNpemUgPSAtMTsKKworICAgICAgb3V0T2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7CisgICAgICBpZiAob3V0T2ZzID4gTEFTVF9SWF9CVUYpCisgICAgICAgICAgb3V0T2ZzID0gRklSU1RfUlhfQlVGOworICAgICAgKnJ4T3V0T2ZzRnAgPSBvdXRPZnM7CisgICAgICByZXR1cm4gKHNpemUpOworICAgIH0KKyAgICByZXR1cm4gKDApOworICB9CisKKyAgUFVCTElDIHZvaWQgUGt0UXVldWVCdXN5IChCT09MIGJ1c3kpCisgIHsKKyAgICAqcnhPdXRPZnNGcCA9IGJ1c3kgPyAoKnJ4SW5PZnNGcCArIHNpemVvZihSWF9FTEVNRU5UKSkgOiAqcnhJbk9mc0ZwOworICAgIGlmICgqcnhPdXRPZnNGcCA+IExBU1RfUlhfQlVGKQorICAgICAgICAqcnhPdXRPZnNGcCA9IEZJUlNUX1JYX0JVRjsKKyAgICAqKERXT1JEIF9mYXIqKShwcm90QmFzZSArIChXT1JEKSZwa3REcm9wKSA9IDA7CisgIH0KKworICBQVUJMSUMgV09SRCBQa3RCdWZmZXJzVXNlZCAodm9pZCkKKyAgeworICAgIFdPUkQgaW5PZnMgID0gKnJ4SW5PZnNGcDsKKyAgICBXT1JEIG91dE9mcyA9ICpyeE91dE9mc0ZwOworCisgICAgaWYgKGluT2ZzID49IG91dE9mcykKKyAgICAgICByZXR1cm4gKGluT2ZzIC0gb3V0T2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKTsKKyAgICByZXR1cm4gKE5VTV9SWF9CVUYgLSAob3V0T2ZzIC0gaW5PZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpKTsKKyAgfQorCisgIFBVQkxJQyBEV09SRCBQa3RSeERyb3BwZWQgKHZvaWQpCisgIHsKKyAgICByZXR1cm4gKCooRFdPUkQgX2ZhciopKHByb3RCYXNlICsgKFdPUkQpJnBrdERyb3ApKTsKKyAgfQorCisjZWxpZiAoRE9TWCAmIERKR1BQKQorICBQVUJMSUMgaW50IFBrdFJlY2VpdmUgKEJZVEUgKmJ1ZiwgaW50IG1heCkKKyAgeworICAgIFdPUkQgb2ZzID0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcyk7CisKKyAgICBpZiAob2ZzICE9IF9mYXJwZWVrdyAoX2Rvc19kcywgcmVhbEJhc2UrcnhJbk9mcykpCisgICAgeworICAgICAgUlhfRUxFTUVOVCBoZWFkOworICAgICAgaW50ICBzaXplLCBsZW4gPSBtYXg7CisKKyAgICAgIGhlYWQuZmlyc3RDb3VudCAgPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK29mcyk7CisgICAgICBoZWFkLnNlY29uZENvdW50ID0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStvZnMrMik7CisgICAgICBoZWFkLmhhbmRsZSAgICAgID0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStvZnMrNCk7CisKKyAgICAgIGlmIChDaGVja0VsZW1lbnQoJmhlYWQpKQorICAgICAgeworICAgICAgICBzaXplID0gbWluIChoZWFkLmZpcnN0Q291bnQsIHNpemVvZihSWF9FTEVNRU5UKSk7CisgICAgICAgIGxlbiAgPSBtaW4gKHNpemUsIG1heCk7CisgICAgICAgIGRvc21lbWdldCAocmVhbEJhc2Urb2ZzKzYsIGxlbiwgYnVmKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc2l6ZSA9IC0xOworCisgICAgICBvZnMgKz0gc2l6ZW9mIChSWF9FTEVNRU5UKTsKKyAgICAgIGlmIChvZnMgPiBMQVNUX1JYX0JVRikKKyAgICAgICAgICAgX2ZhcnBva2V3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcywgRklSU1RfUlhfQlVGKTsKKyAgICAgIGVsc2UgX2ZhcnBva2V3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcywgb2ZzKTsKKyAgICAgIHJldHVybiAoc2l6ZSk7CisgICAgfQorICAgIHJldHVybiAoMCk7CisgIH0KKworICBQVUJMSUMgdm9pZCBQa3RRdWV1ZUJ1c3kgKEJPT0wgYnVzeSkKKyAgeworICAgIFdPUkQgb2ZzOworCisgICAgZGlzYWJsZSgpOworICAgIG9mcyA9IF9mYXJwZWVrdyAoX2Rvc19kcywgcmVhbEJhc2UrcnhJbk9mcyk7CisgICAgaWYgKGJ1c3kpCisgICAgICAgb2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7CisKKyAgICBpZiAob2ZzID4gTEFTVF9SWF9CVUYpCisgICAgICAgICBfZmFycG9rZXcgKF9kb3NfZHMsIHJlYWxCYXNlK3J4T3V0T2ZzLCBGSVJTVF9SWF9CVUYpOworICAgIGVsc2UgX2ZhcnBva2V3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcywgb2ZzKTsKKyAgICBfZmFycG9rZWwgKF9kb3NfZHMsIHJlYWxCYXNlK3BrdERyb3AsIDBVTCk7CisgICAgZW5hYmxlKCk7CisgIH0KKworICBQVUJMSUMgV09SRCBQa3RCdWZmZXJzVXNlZCAodm9pZCkKKyAgeworICAgIFdPUkQgaW5PZnMsIG91dE9mczsKKworICAgIGRpc2FibGUoKTsKKyAgICBpbk9mcyAgPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK3J4SW5PZnMpOworICAgIG91dE9mcyA9IF9mYXJwZWVrdyAoX2Rvc19kcywgcmVhbEJhc2UrcnhPdXRPZnMpOworICAgIGVuYWJsZSgpOworICAgIGlmIChpbk9mcyA+PSBvdXRPZnMpCisgICAgICAgcmV0dXJuIChpbk9mcyAtIG91dE9mcykgLyBzaXplb2YoUlhfRUxFTUVOVCk7CisgICAgcmV0dXJuIChOVU1fUlhfQlVGIC0gKG91dE9mcyAtIGluT2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKSk7CisgIH0KKworICBQVUJMSUMgRFdPUkQgUGt0UnhEcm9wcGVkICh2b2lkKQorICB7CisgICAgcmV0dXJuIF9mYXJwZWVrbCAoX2Rvc19kcywgcmVhbEJhc2UrcGt0RHJvcCk7CisgIH0KKworI2VsaWYgKERPU1ggJiBET1M0R1cpCisgIFBVQkxJQyBpbnQgUGt0UmVjZWl2ZSAoQllURSAqYnVmLCBpbnQgbWF4KQorICB7CisgICAgV09SRCBvZnMgPSAqKFdPUkQqKSAocmVhbEJhc2UrcnhPdXRPZnMpOworCisgICAgaWYgKG9mcyAhPSAqKFdPUkQqKSAocmVhbEJhc2UrcnhJbk9mcykpCisgICAgeworICAgICAgUlhfRUxFTUVOVCBoZWFkOworICAgICAgaW50ICBzaXplLCBsZW4gPSBtYXg7CisKKyAgICAgIGhlYWQuZmlyc3RDb3VudCAgPSAqKFdPUkQqKSAocmVhbEJhc2Urb2ZzKTsKKyAgICAgIGhlYWQuc2Vjb25kQ291bnQgPSAqKFdPUkQqKSAocmVhbEJhc2Urb2ZzKzIpOworICAgICAgaGVhZC5oYW5kbGUgICAgICA9ICooV09SRCopIChyZWFsQmFzZStvZnMrNCk7CisKKyAgICAgIGlmIChDaGVja0VsZW1lbnQoJmhlYWQpKQorICAgICAgeworICAgICAgICBzaXplID0gbWluIChoZWFkLmZpcnN0Q291bnQsIHNpemVvZihSWF9FTEVNRU5UKSk7CisgICAgICAgIGxlbiAgPSBtaW4gKHNpemUsIG1heCk7CisgICAgICAgIG1lbWNweSAoYnVmLCAoY29uc3Qgdm9pZCopKHJlYWxCYXNlK29mcys2KSwgbGVuKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc2l6ZSA9IC0xOworCisgICAgICBvZnMgKz0gc2l6ZW9mIChSWF9FTEVNRU5UKTsKKyAgICAgIGlmIChvZnMgPiBMQVNUX1JYX0JVRikKKyAgICAgICAgICAgKihXT1JEKikgKHJlYWxCYXNlK3J4T3V0T2ZzKSA9IEZJUlNUX1JYX0JVRjsKKyAgICAgIGVsc2UgKihXT1JEKikgKHJlYWxCYXNlK3J4T3V0T2ZzKSA9IG9mczsKKyAgICAgIHJldHVybiAoc2l6ZSk7CisgICAgfQorICAgIHJldHVybiAoMCk7CisgIH0KKworICBQVUJMSUMgdm9pZCBQa3RRdWV1ZUJ1c3kgKEJPT0wgYnVzeSkKKyAgeworICAgIFdPUkQgb2ZzOworCisgICAgX2Rpc2FibGUoKTsKKyAgICBvZnMgPSAqKFdPUkQqKSAocmVhbEJhc2UrcnhJbk9mcyk7CisgICAgaWYgKGJ1c3kpCisgICAgICAgb2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7CisKKyAgICBpZiAob2ZzID4gTEFTVF9SWF9CVUYpCisgICAgICAgICAqKFdPUkQqKSAocmVhbEJhc2UrcnhPdXRPZnMpID0gRklSU1RfUlhfQlVGOworICAgIGVsc2UgKihXT1JEKikgKHJlYWxCYXNlK3J4T3V0T2ZzKSA9IG9mczsKKyAgICAqKERXT1JEKikgKHJlYWxCYXNlK3BrdERyb3ApID0gMFVMOworICAgIF9lbmFibGUoKTsKKyAgfQorCisgIFBVQkxJQyBXT1JEIFBrdEJ1ZmZlcnNVc2VkICh2b2lkKQorICB7CisgICAgV09SRCBpbk9mcywgb3V0T2ZzOworCisgICAgX2Rpc2FibGUoKTsKKyAgICBpbk9mcyAgPSAqKFdPUkQqKSAocmVhbEJhc2UrcnhJbk9mcyk7CisgICAgb3V0T2ZzID0gKihXT1JEKikgKHJlYWxCYXNlK3J4T3V0T2ZzKTsKKyAgICBfZW5hYmxlKCk7CisgICAgaWYgKGluT2ZzID49IG91dE9mcykKKyAgICAgICByZXR1cm4gKGluT2ZzIC0gb3V0T2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKTsKKyAgICByZXR1cm4gKE5VTV9SWF9CVUYgLSAob3V0T2ZzIC0gaW5PZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpKTsKKyAgfQorCisgIFBVQkxJQyBEV09SRCBQa3RSeERyb3BwZWQgKHZvaWQpCisgIHsKKyAgICByZXR1cm4gKihEV09SRCopIChyZWFsQmFzZStwa3REcm9wKTsKKyAgfQorCisjZWxzZSAgICAgLyogcmVhbC1tb2RlIHNtYWxsL2xhcmdlIG1vZGVsICovCisKKyAgUFVCTElDIGludCBQa3RSZWNlaXZlIChCWVRFICpidWYsIGludCBtYXgpCisgIHsKKyAgICBpZiAocnhPdXRPZnMgIT0gcnhJbk9mcykKKyAgICB7CisgICAgICBSWF9FTEVNRU5UIGZhciAqaGVhZCA9IChSWF9FTEVNRU5UIGZhciopIE1LX0ZQIChfRFMscnhPdXRPZnMpOworICAgICAgaW50ICBzaXplLCBsZW4gPSBtYXg7CisKKyAgICAgIGlmIChDaGVja0VsZW1lbnQoaGVhZCkpCisgICAgICB7CisgICAgICAgIHNpemUgPSBtaW4gKGhlYWQtPmZpcnN0Q291bnQsIHNpemVvZihSWF9FTEVNRU5UKSk7CisgICAgICAgIGxlbiAgPSBtaW4gKHNpemUsIG1heCk7CisgICAgICAgIF9mbWVtY3B5IChidWYsICZoZWFkLT5kZXN0aW4sIGxlbik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHNpemUgPSAtMTsKKworICAgICAgcnhPdXRPZnMgKz0gc2l6ZW9mIChSWF9FTEVNRU5UKTsKKyAgICAgIGlmIChyeE91dE9mcyA+IExBU1RfUlhfQlVGKQorICAgICAgICAgIHJ4T3V0T2ZzID0gRklSU1RfUlhfQlVGOworICAgICAgcmV0dXJuIChzaXplKTsKKyAgICB9CisgICAgcmV0dXJuICgwKTsKKyAgfQorCisgIFBVQkxJQyB2b2lkIFBrdFF1ZXVlQnVzeSAoQk9PTCBidXN5KQorICB7CisgICAgcnhPdXRPZnMgPSBidXN5ID8gKHJ4SW5PZnMgKyBzaXplb2YoUlhfRUxFTUVOVCkpIDogcnhJbk9mczsKKyAgICBpZiAocnhPdXRPZnMgPiBMQVNUX1JYX0JVRikKKyAgICAgICAgcnhPdXRPZnMgPSBGSVJTVF9SWF9CVUY7CisgICAgcGt0RHJvcCA9IDBMOworICB9CisKKyAgUFVCTElDIFdPUkQgUGt0QnVmZmVyc1VzZWQgKHZvaWQpCisgIHsKKyAgICBXT1JEIGluT2ZzICA9IHJ4SW5PZnM7CisgICAgV09SRCBvdXRPZnMgPSByeE91dE9mczsKKworICAgIGlmIChpbk9mcyA+PSBvdXRPZnMpCisgICAgICAgcmV0dXJuICgoaW5PZnMgLSBvdXRPZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpKTsKKyAgICByZXR1cm4gKE5VTV9SWF9CVUYgLSAob3V0T2ZzIC0gaW5PZnMpIC8gc2l6ZW9mKFJYX0VMRU1FTlQpKTsKKyAgfQorCisgIFBVQkxJQyBEV09SRCBQa3RSeERyb3BwZWQgKHZvaWQpCisgIHsKKyAgICByZXR1cm4gKHBrdERyb3ApOworICB9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMT0NBTCBfX2lubGluZSB2b2lkIFBrdEZyZWVNZW0gKHZvaWQpCit7CisjaWYgKERPU1ggJiBQSEFSTEFQKQorICBpZiAocmVhbFNlZykKKyAgeworICAgIF9keF9yZWFsX2ZyZWUgKHJlYWxTZWcpOworICAgIHJlYWxTZWcgPSAwOworICB9CisjZWxpZiAoRE9TWCAmIERKR1BQKQorICBpZiAocm1fbWVtLnJtX3NlZ21lbnQpCisgIHsKKyAgICB1bnNpZ25lZCBvZnM7ICAvKiBjbGVhciB0aGUgRE9TLW1lbSB0byBwcmV2ZW50IGZ1cnRoZXIgdXBjYWxscyAqLworCisgICAgZm9yIChvZnMgPSAwOyBvZnMgPCAxNiAqIHJtX21lbS5zaXplIC8gNDsgb2ZzICs9IDQpCisgICAgICAgX2ZhcnBva2VsIChfZG9zX2RzLCByZWFsQmFzZSArIG9mcywgMCk7CisgICAgX2dvMzJfZHBtaV9mcmVlX2Rvc19tZW1vcnkgKCZybV9tZW0pOworICAgIHJtX21lbS5ybV9zZWdtZW50ID0gMDsKKyAgfQorI2VsaWYgKERPU1ggJiBET1M0R1cpCisgIGlmIChybV9iYXNlX3NlbCkKKyAgeworICAgIGRwbWlfcmVhbF9mcmVlIChybV9iYXNlX3NlbCk7CisgICAgcm1fYmFzZV9zZWwgPSAwOworICB9CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitQVUJMSUMgQk9PTCBQa3RFeGl0RHJpdmVyICh2b2lkKQoreworICBpZiAocGt0SW5mby5oYW5kbGUpCisgIHsKKyAgICBpZiAoIVBrdFNldFJlY2VpdmVyTW9kZShQRFJYX0JST0FEQ0FTVCkpCisgICAgICAgUFVUUyAoIkVycm9yIHJlc3RvcmluZyByZWNlaXZlciBtb2RlLiIpOworCisgICAgaWYgKCFQa3RSZWxlYXNlSGFuZGxlKHBrdEluZm8uaGFuZGxlKSkKKyAgICAgICBQVVRTICgiRXJyb3IgcmVsZWFzaW5nIFBLVC1EUlZSIGhhbmRsZS4iKTsKKworICAgIFBrdEZyZWVNZW0oKTsKKyAgICBwa3RJbmZvLmhhbmRsZSA9IDA7CisgIH0KKworICBpZiAocGNhcF9wa3RfZGVidWcgPj0gMSkKKyAgICAgcHJpbnRmICgiSW50ZXJuYWwgc3RhdHM6IHRvby1zbWFsbCAlbHUsIHRvby1sYXJnZSAlbHUsIGJhZC1zeW5jICVsdSwgIgorICAgICAgICAgICAgICJ3cm9uZy1oYW5kbGUgJWx1XG4iLAorICAgICAgICAgICAgIGludFN0YXQudG9vU21hbGwsIGludFN0YXQudG9vTGFyZ2UsCisgICAgICAgICAgICAgaW50U3RhdC5iYWRTeW5jLCBpbnRTdGF0Lndyb25nSGFuZGxlKTsKKyAgcmV0dXJuIChUUlVFKTsKK30KKworI2lmIChET1NYICYgKERKR1BQfERPUzRHVykpCitzdGF0aWMgdm9pZCBkdW1wX3BrdF9zdHViICh2b2lkKQoreworICBpbnQgaTsKKworICBmcHJpbnRmIChzdGRlcnIsICJQa3RSZWNlaXZlciAlbHUsIHBrdF9zdHViW1BrdFJlY2VpdmVyXSA9XG4iLAorICAgICAgICAgICBQa3RSZWNlaXZlcik7CisgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJTAyWCwgIiwgcmVhbF9zdHViX2FycmF5W2krUGt0UmVjZWl2ZXJdKTsKKyAgZnB1dHMgKCJcbiIsIHN0ZGVycik7Cit9CisjZW5kaWYKKworLyoKKyAqIEZyb250IGVuZCBpbml0aWFsaXphdGlvbiByb3V0aW5lCisgKi8KK1BVQkxJQyBCT09MIFBrdEluaXREcml2ZXIgKFBLVF9SWF9NT0RFIG1vZGUpCit7CisgIFBLVF9SWF9NT0RFIHJ4TW9kZTsKKyAgQk9PTCAgIHdyaXRlSW5mbyA9IChwY2FwX3BrdF9kZWJ1ZyA+PSAzKTsKKworICBwa3RJbmZvLnF1aWV0ID0gKHBjYXBfcGt0X2RlYnVnIDwgMyk7CisKKyNpZiAoRE9TWCAmIFBIQVJMQVApICYmIGRlZmluZWQoX19ISUdIQ19fKQorICBpZiAoX213ZW52ICE9IDIpCisgIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJPbmx5IFBoYXJsYXAgRE9TIGV4dGVuZGVyIHN1cHBvcnRlZC5cbiIpOworICAgIHJldHVybiAoRkFMU0UpOworICB9CisjZW5kaWYKKworI2lmIChET1NYICYgUEhBUkxBUCkgJiYgZGVmaW5lZChfX1dBVENPTUNfXykKKyAgaWYgKF9FeHRlbmRlciAhPSAxKQorICB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiT25seSBET1M0R1cgc3R5bGUgZXh0ZW5kZXJzIHN1cHBvcnRlZC5cbiIpOworICAgIHJldHVybiAoRkFMU0UpOworICB9CisjZW5kaWYKKworICBpZiAoIVBrdFNlYXJjaERyaXZlcigpKQorICB7CisgICAgUFVUUyAoIlBhY2tldCBkcml2ZXIgbm90IGZvdW5kLiIpOworICAgIFBrdEZyZWVNZW0oKTsKKyAgICByZXR1cm4gKEZBTFNFKTsKKyAgfQorCisgIGlmICghUGt0R2V0RHJpdmVySW5mbygpKQorICB7CisgICAgUFVUUyAoIkVycm9yIGdldHRpbmcgcGt0LWRydnIgaW5mb3JtYXRpb24uIik7CisgICAgUGt0RnJlZU1lbSgpOworICAgIHJldHVybiAoRkFMU0UpOworICB9CisKKyNpZiAoRE9TWCAmIFBIQVJMQVApCisgIGlmIChSZWFsQ29weSgoVUxPTkcpJnJ4T3V0T2ZzLCAoVUxPTkcpJnBrdFJ4RW5kLAorICAgICAgICAgICAgICAgJnJlYWxCYXNlLCAmcHJvdEJhc2UsIChVU0hPUlQqKSZyZWFsU2VnKSkKKyAgeworICAgIHJ4T3V0T2ZzRnAgID0gKFdPUkQgX2ZhciAqKSAocHJvdEJhc2UgKyAoV09SRCkgJnJ4T3V0T2ZzKTsKKyAgICByeEluT2ZzRnAgICA9IChXT1JEIF9mYXIgKikgKHByb3RCYXNlICsgKFdPUkQpICZyeEluT2ZzKTsKKyAgICAqcnhPdXRPZnNGcCA9IEZJUlNUX1JYX0JVRjsKKyAgICAqcnhJbk9mc0ZwICA9IEZJUlNUX1JYX0JVRjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBQVVRTICgiQ2Fubm90IGFsbG9jYXRlIHJlYWwtbW9kZSBzdHViLiIpOworICAgIHJldHVybiAoRkFMU0UpOworICB9CisKKyNlbGlmIChET1NYICYgKERKR1BQfERPUzRHVykpCisgIGlmIChzaXplb2YocmVhbF9zdHViX2FycmF5KSA+IDB4RkZGRikKKyAgeworICAgIGZwcmludGYgKHN0ZGVyciwgImByZWFsX3N0dWJfYXJyYXlbXScgdG9vIGJpZy5cbiIpOworICAgIHJldHVybiAoRkFMU0UpOworICB9CisjaWYgKERPU1ggJiBESkdQUCkKKyAgcm1fbWVtLnNpemUgPSAoc2l6ZW9mKHJlYWxfc3R1Yl9hcnJheSkgKyAxNSkgLyAxNjsKKworICBpZiAoX2dvMzJfZHBtaV9hbGxvY2F0ZV9kb3NfbWVtb3J5KCZybV9tZW0pIHx8IHJtX21lbS5ybV9vZmZzZXQgIT0gMCkKKyAgeworICAgIFBVVFMgKCJyZWFsLW1vZGUgaW5pdCBmYWlsZWQuIik7CisgICAgcmV0dXJuIChGQUxTRSk7CisgIH0KKyAgcmVhbEJhc2UgPSAocm1fbWVtLnJtX3NlZ21lbnQgPDwgNCk7CisgIGRvc21lbXB1dCAoJnJlYWxfc3R1Yl9hcnJheSwgc2l6ZW9mKHJlYWxfc3R1Yl9hcnJheSksIHJlYWxCYXNlKTsKKyAgX2ZhcnBva2VsIChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcywgRklSU1RfUlhfQlVGKTsKKyAgX2ZhcnBva2VsIChfZG9zX2RzLCByZWFsQmFzZStyeEluT2ZzLCAgRklSU1RfUlhfQlVGKTsKKworI2VsaWYgKERPU1ggJiBET1M0R1cpCisgIHJtX2Jhc2Vfc2VnID0gZHBtaV9yZWFsX21hbGxvYyAoc2l6ZW9mKHJlYWxfc3R1Yl9hcnJheSksICZybV9iYXNlX3NlbCk7CisgIGlmICghcm1fYmFzZV9zZWcpCisgIHsKKyAgICBQVVRTICgicmVhbC1tb2RlIGluaXQgZmFpbGVkLiIpOworICAgIHJldHVybiAoRkFMU0UpOworICB9CisgIHJlYWxCYXNlID0gKHJtX2Jhc2Vfc2VnIDw8IDQpOworICBtZW1jcHkgKCh2b2lkKilyZWFsQmFzZSwgJnJlYWxfc3R1Yl9hcnJheSwgc2l6ZW9mKHJlYWxfc3R1Yl9hcnJheSkpOworICAqKFdPUkQqKSAocmVhbEJhc2UrcnhPdXRPZnMpID0gRklSU1RfUlhfQlVGOworICAqKFdPUkQqKSAocmVhbEJhc2UrcnhJbk9mcykgID0gRklSU1RfUlhfQlVGOworCisjZW5kaWYKKyAgeworICAgIGludCBwdXNoZiA9IFBrdFJlY2VpdmVyOworCisgICAgd2hpbGUgKHJlYWxfc3R1Yl9hcnJheVtwdXNoZisrXSAhPSAweDlDICYmICAgIC8qIHB1c2hmICovCisgICAgICAgICAgIHJlYWxfc3R1Yl9hcnJheVtwdXNoZl0gICAhPSAweEZBKSAgICAgIC8qIGNsaSAgICovCisgICAgeworICAgICAgaWYgKCsrcGFyYV9za2lwID4gMTYpCisgICAgICB7CisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlNvbWV0aGluZyB3cm9uZyB3aXRoIGBwa3Rfc3R1Yi5pbmMnLlxuIik7CisgICAgICAgIHBhcmFfc2tpcCA9IDA7CisgICAgICAgIGR1bXBfcGt0X3N0dWIoKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgICB9CisgICAgfQorICAgIGlmICgqKFdPUkQqKShyZWFsX3N0dWJfYXJyYXkgKyBvZmZzZXRvZihQa3RSZWFsU3R1YixfZHVtbXkpKSAhPSAweEI4MDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiYHJlYWxfc3R1Yl9hcnJheVtdJyBpcyBtaXNhbGlnbmVkLlxuIik7CisgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisgIH0KKworICBpZiAocGNhcF9wa3RfZGVidWcgPiAyKQorICAgICAgZHVtcF9wa3Rfc3R1YigpOworCisjZWxzZQorICByeE91dE9mcyA9IEZJUlNUX1JYX0JVRjsKKyAgcnhJbk9mcyAgPSBGSVJTVF9SWF9CVUY7CisjZW5kaWYKKworICBpZiAoIVBrdFNldEFjY2VzcygpKQorICB7CisgICAgUFVUUyAoIkVycm9yIHNldHRpbmcgcGt0LWRydnIgYWNjZXNzLiIpOworICAgIFBrdEZyZWVNZW0oKTsKKyAgICByZXR1cm4gKEZBTFNFKTsKKyAgfQorCisgIGlmICghUGt0R2V0QWRkcmVzcygmbXlBZGRyZXNzKSkKKyAgeworICAgIFBVVFMgKCJFcnJvciBmZXRjaGluZyBhZGFwdGVyIGFkZHJlc3MuIik7CisgICAgUGt0RnJlZU1lbSgpOworICAgIHJldHVybiAoRkFMU0UpOworICB9CisKKyAgaWYgKCFQa3RTZXRSZWNlaXZlck1vZGUobW9kZSkpCisgIHsKKyAgICBQVVRTICgiRXJyb3Igc2V0dGluZyByZWNlaXZlciBtb2RlLiIpOworICAgIFBrdEZyZWVNZW0oKTsKKyAgICByZXR1cm4gKEZBTFNFKTsKKyAgfQorCisgIGlmICghUGt0R2V0UmVjZWl2ZXJNb2RlKCZyeE1vZGUpKQorICB7CisgICAgUFVUUyAoIkVycm9yIGdldHRpbmcgcmVjZWl2ZXIgbW9kZS4iKTsKKyAgICBQa3RGcmVlTWVtKCk7CisgICAgcmV0dXJuIChGQUxTRSk7CisgIH0KKworICBpZiAod3JpdGVJbmZvKQorICAgICBwcmludGYgKCJQa3QtZHJpdmVyIGluZm9ybWF0aW9uOlxuIgorICAgICAgICAgICAgICIgIFZlcnNpb24gIDogJWQuJWRcbiIKKyAgICAgICAgICAgICAiICBOYW1lICAgICA6ICUuMTVzXG4iCisgICAgICAgICAgICAgIiAgQ2xhc3MgICAgOiAldSAoJXMpXG4iCisgICAgICAgICAgICAgIiAgVHlwZSAgICAgOiAldVxuIgorICAgICAgICAgICAgICIgIE51bWJlciAgIDogJXVcbiIKKyAgICAgICAgICAgICAiICBGdW5jcyAgICA6ICV1XG4iCisgICAgICAgICAgICAgIiAgSW50ciAgICAgOiAlWGhcbiIKKyAgICAgICAgICAgICAiICBIYW5kbGUgICA6ICV1XG4iCisgICAgICAgICAgICAgIiAgRXh0ZW5kZWQgOiAlc1xuIgorICAgICAgICAgICAgICIgIEhpLXBlcmYgIDogJXNcbiIKKyAgICAgICAgICAgICAiICBSWCBtb2RlICA6ICVzXG4iCisgICAgICAgICAgICAgIiAgRXRoLWFkZHIgOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKworICAgICAgICAgICAgIHBrdEluZm8ubWFqVmVyLCBwa3RJbmZvLm1pblZlciwgcGt0SW5mby5uYW1lLAorICAgICAgICAgICAgIHBrdEluZm8uY2xhc3MsICBQa3RHZXRDbGFzc05hbWUocGt0SW5mby5jbGFzcyksCisgICAgICAgICAgICAgcGt0SW5mby50eXBlLCAgIHBrdEluZm8ubnVtYmVyLAorICAgICAgICAgICAgIHBrdEluZm8uZnVuY3MsICBwa3RJbmZvLmludHIsICAgcGt0SW5mby5oYW5kbGUsCisgICAgICAgICAgICAgcGt0SW5mby5mdW5jcyA9PSAyIHx8IHBrdEluZm8uZnVuY3MgPT0gNiA/ICJZZXMiIDogIk5vIiwKKyAgICAgICAgICAgICBwa3RJbmZvLmZ1bmNzID09IDUgfHwgcGt0SW5mby5mdW5jcyA9PSA2ID8gIlllcyIgOiAiTm8iLAorICAgICAgICAgICAgIFBrdFJYbW9kZVN0cihyeE1vZGUpLAorICAgICAgICAgICAgIG15QWRkcmVzc1swXSwgbXlBZGRyZXNzWzFdLCBteUFkZHJlc3NbMl0sCisgICAgICAgICAgICAgbXlBZGRyZXNzWzNdLCBteUFkZHJlc3NbNF0sIG15QWRkcmVzc1s1XSk7CisKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiAoRE9TWCAmIFBIQVJMQVApCisgIGlmICh3cml0ZUluZm8pCisgIHsKKyAgICBEV09SRCAgICByQWRyID0gcmVhbEJhc2UgKyAoV09SRCkmUGt0UmVjZWl2ZXI7CisgICAgdW5zaWduZWQgc2VsLCBvZnM7CisKKyAgICBwcmludGYgKCJcblJlY2VpdmVyIGF0ICAgJTA0WDolMDRYXG4iLCBSUF9TRUcockFkciksICAgIFJQX09GRihyQWRyKSk7CisgICAgcHJpbnRmICgiUmVhbGJhc2UgICAgPSAlMDRYOiUwNFhcbiIsICAgUlBfU0VHKHJlYWxCYXNlKSxSUF9PRkYocmVhbEJhc2UpKTsKKworICAgIHNlbCA9IF9GUF9TRUcgKHByb3RCYXNlKTsKKyAgICBvZnMgPSBfRlBfT0ZGIChwcm90QmFzZSk7CisgICAgcHJpbnRmICgiUHJvdGJhc2UgICAgPSAlMDRYOiUwOFhcbiIsIHNlbCxvZnMpOworICAgIHByaW50ZiAoIlJlYWxTZWcgICAgID0gJTA0WFxuIiwgcmVhbFNlZyk7CisKKyAgICBzZWwgPSBfRlBfU0VHIChyeE91dE9mc0ZwKTsKKyAgICBvZnMgPSBfRlBfT0ZGIChyeE91dE9mc0ZwKTsKKyAgICBwcmludGYgKCJyeE91dE9mc0ZwICA9ICUwNFg6JTA4WFxuIiwgc2VsLG9mcyk7CisKKyAgICBzZWwgPSBfRlBfU0VHIChyeEluT2ZzRnApOworICAgIG9mcyA9IF9GUF9PRkYgKHJ4SW5PZnNGcCk7CisgICAgcHJpbnRmICgicnhJbk9mc0ZwICAgPSAlMDRYOiUwOFhcbiIsIHNlbCxvZnMpOworCisgICAgcHJpbnRmICgiUmVhZHk6ICpyeE91dE9mc0ZwID0gJTA0WCAqcnhJbk9mc0ZwID0gJTA0WFxuIiwKKyAgICAgICAgICAgICpyeE91dE9mc0ZwLCAqcnhJbk9mc0ZwKTsKKworICAgIFBrdFF1ZXVlQnVzeSAoVFJVRSk7CisgICAgcHJpbnRmICgiQnVzeTogICpyeE91dE9mc0ZwID0gJTA0WCAqcnhJbk9mc0ZwID0gJTA0WFxuIiwKKyAgICAgICAgICAgICpyeE91dE9mc0ZwLCAqcnhJbk9mc0ZwKTsKKyAgfQorI2VuZGlmCisKKyAgbWVtc2V0ICgmcGt0U3RhdCwgMCwgc2l6ZW9mKHBrdFN0YXQpKTsgIC8qIGNsZWFyIHN0YXRpc3RpY3MgKi8KKyAgUGt0UXVldWVCdXN5IChUUlVFKTsKKyAgcmV0dXJuIChUUlVFKTsKK30KKworCisvKgorICogRFBNSSBmdW5jdGlvbnMgb25seSBmb3IgV2F0Y29tICsgRE9TNEdXIGV4dGVuZGVycworICovCisjaWYgKERPU1ggJiBET1M0R1cpCitMT0NBTCBEV09SRCBkcG1pX2dldF9yZWFsX3ZlY3RvciAoaW50IGludHIpCit7CisgIHVuaW9uIFJFR1MgcjsKKworICByLnguZWF4ID0gMHgyMDA7CisgIHIueC5lYnggPSAoRFdPUkQpIGludHI7CisgIGludDM4NiAoMHgzMSwgJnIsICZyKTsKKyAgcmV0dXJuICgoci53LmN4IDw8IDQpICsgci53LmR4KTsKK30KKworTE9DQUwgV09SRCBkcG1pX3JlYWxfbWFsbG9jIChpbnQgc2l6ZSwgV09SRCAqc2VsZWN0b3IpCit7CisgIHVuaW9uIFJFR1MgcjsKKworICByLnguZWF4ID0gMHgwMTAwOyAgICAgICAgICAgICAvKiBEUE1JIGFsbG9jYXRlIERPUyBtZW1vcnkgKi8KKyAgci54LmVieCA9IChzaXplICsgMTUpIC8gMTY7ICAgLyogTnVtYmVyIG9mIHBhcmFncmFwaHMgcmVxdWVzdGVkICovCisgIGludDM4NiAoMHgzMSwgJnIsICZyKTsKKyAgaWYgKHIudy5jZmxhZyAmIDEpCisgICAgIHJldHVybiAoMCk7CisKKyAgKnNlbGVjdG9yID0gci53LmR4OworICByZXR1cm4gKHIudy5heCk7ICAgICAgICAgICAgICAvKiBSZXR1cm4gc2VnbWVudCBhZGRyZXNzICovCit9CisKK0xPQ0FMIHZvaWQgZHBtaV9yZWFsX2ZyZWUgKFdPUkQgc2VsZWN0b3IpCit7CisgIHVuaW9uIFJFR1MgcjsKKworICByLnguZWF4ID0gMHgxMDE7ICAgICAgICAgICAgICAvKiBEUE1JIGZyZWUgRE9TIG1lbW9yeSAqLworICByLnguZWJ4ID0gc2VsZWN0b3I7ICAgICAgICAgICAvKiBTZWxlY3RvciB0byBmcmVlICovCisgIGludDM4NiAoMHgzMSwgJnIsICZyKTsKK30KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKERPU1gpICYmIChET1NYICYgUEhBUkxBUCkKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIGNvbnZlbnRpb25hbCBtZW1vcnkgZm9yIHRoZSBzcGVjaWZpZWQgYmxvY2sKKyAqICAgICBvZiBjb2RlICh3aGljaCBtdXN0IGJlIHdpdGhpbiB0aGUgZmlyc3QgNjRLIG9mIHRoZSBwcm90ZWN0ZWQgbW9kZQorICogICAgIHByb2dyYW0gc2VnbWVudCkgYW5kIGNvcGllcyB0aGUgY29kZSB0byBpdC4KKyAqCisgKiAgICAgVGhlIGNhbGxlciBzaG91bGQgZnJlZSB1cCB0aGUgY29udmVudGlvbmFsIG1lbW9yeSBibG9jayB3aGVuIGl0CisgKiAgICAgaXMgZG9uZSB3aXRoIHRoZSBjb252ZW50aW9uYWwgbWVtb3J5LgorICoKKyAqICAgICBOT1RFIFRISVMgUk9VVElORSBSRVFVSVJFUyAzODZ8RE9TLUVYVEVOREVSIDMuMCBPUiBMQVRFUi4KKyAqCisgKiBDYWxsaW5nIGFyZ3VtZW50czoKKyAqICAgICBzdGFydF9vZmZzICAgICAgc3RhcnQgb2YgcmVhbCBtb2RlIGNvZGUgaW4gcHJvZ3JhbSBzZWdtZW50CisgKiAgICAgZW5kX29mZnMgICAgICAgIDEgYnl0ZSBwYXN0IGVuZCBvZiByZWFsIG1vZGUgY29kZSBpbiBwcm9ncmFtIHNlZ21lbnQKKyAqICAgICByZWFsX2Jhc2VwICAgICAgcmV0dXJuZWQ7ICByZWFsIG1vZGUgcHRyIHRvIHVzZSBhcyBhIGJhc2UgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICByZWFsIG1vZGUgY29kZSAoZWcsIHRvIGdldCB0aGUgcmVhbCBtb2RlIEZBUgorICogICAgICAgICAgICAgICAgICAgICAgICBhZGRyIG9mIGEgZnVuY3Rpb24gZm9vKCksIHRha2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgcmVhbF9iYXNlcCArIChVTE9ORykgZm9vKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwb2ludGVyIGlzIGNvbnN0cnVjdGVkIHN1Y2ggdGhhdAorICogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzIHdpdGhpbiB0aGUgcmVhbCBtb2RlIHNlZ21lbnQgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGFzIHRoZSBsaW5rLXRpbWUgb2Zmc2V0cyBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG1vZGUgcHJvZ3JhbSBzZWdtZW50CisgKiAgICAgcHJvdF9iYXNlcCAgICAgIHJldHVybmVkOyAgcHJvdCBtb2RlIHB0ciB0byB1c2UgYXMgYSBiYXNlIGZvciBnZXR0aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjb252ZW50aW9uYWwgbWVtb3J5LCBhbHNvIGNvbnN0cnVjdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgYWRkaW5nIHRoZSBwcm90IG1vZGUgb2Zmc2V0IG9mIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb3IgdmFyaWFibGUgdG8gdGhlIGJhc2UgZ2V0cyB5b3UgYQorICogICAgICAgICAgICAgICAgICAgICAgICBwdHIgdG8gdGhlIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBjb252ZW50aW9uYWwgbWVtb3J5IGJsb2NrLgorICogICAgIHJtZW1fYWRycCAgICAgICByZXR1cm5lZDsgIHJlYWwgbW9kZSBwYXJhIGFkZHIgb2YgYWxsb2NhdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlbnRpb25hbCBtZW1vcnkgYmxvY2ssIHRvIGJlIHVzZWQgdG8gZnJlZQorICogICAgICAgICAgICAgICAgICAgICAgICB1cCB0aGUgY29udmVudGlvbmFsIG1lbW9yeSB3aGVuIGRvbmUuICBETyBOT1QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVVNFIFRISVMgVE8gQ09OU1RSVUNUIEEgUkVBTCBNT0RFIFBUUiwgVVNFCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFJFQUxfQkFTRVAgSU5TVEVBRCBTTyBUSEFUIE9GRlNFVFMgV09SSyBPVVQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SUkVDVExZLgorICoKKyAqIFJldHVybmVkIHZhbHVlczoKKyAqICAgICAwICAgICAgaWYgZXJyb3IKKyAqICAgICAxICAgICAgaWYgc3VjY2VzcworICovCitpbnQgUmVhbENvcHkgKFVMT05HICAgIHN0YXJ0X29mZnMsCisgICAgICAgICAgICAgIFVMT05HICAgIGVuZF9vZmZzLAorICAgICAgICAgICAgICBSRUFMUFRSICpyZWFsX2Jhc2VwLAorICAgICAgICAgICAgICBGQVJQVFIgICpwcm90X2Jhc2VwLAorICAgICAgICAgICAgICBVU0hPUlQgICpybWVtX2FkcnApCit7CisgIFVMT05HICAgcm1fYmFzZTsgICAgLyogYmFzZSByZWFsIG1vZGUgcGFyYSBhZGRyIGZvciBhY2Nlc3NpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgY29udmVudGlvbmFsIG1lbW9yeSAgICAgICAgICAqLworICBVQ0hBUiAgKnNvdXJjZTsgICAgIC8qIHNvdXJjZSBwb2ludGVyIGZvciBjb3B5ICAgICAgICAgICAgICAgICovCisgIEZBUlBUUiAgZGVzdGluOyAgICAgLyogZGVzdGluYXRpb24gcG9pbnRlciBmb3IgY29weSAgICAgICAgICAgKi8KKyAgVUxPTkcgICBsZW47ICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSAgICAgICAgICAgICAgICAqLworICBVTE9ORyAgIHRlbXA7CisgIFVTSE9SVCAgc3RlbXA7CisKKyAgLyogRmlyc3QgY2hlY2sgZm9yIHZhbGlkIGlucHV0cworICAgKi8KKyAgaWYgKHN0YXJ0X29mZnMgPj0gZW5kX29mZnMgfHwgZW5kX29mZnMgPiAweDEwMDAwKQorICAgICByZXR1cm4gKEZBTFNFKTsKKworICAvKiBSb3VuZCBzdGFydF9vZmZzIGRvd24gdG8gYSBwYXJhZ3JhcGggKDE2LWJ5dGUpIGJvdW5kYXJ5IHNvIHdlIGNhbiBzZXQgdXAKKyAgICogdGhlIHJlYWwgbW9kZSBwb2ludGVyIGVhc2lseS4gUm91bmQgdXAgZW5kX29mZnMgdG8gbWFrZSBzdXJlIHdlIGFsbG9jYXRlCisgICAqIGVub3VnaCBwYXJhZ3JhcGhzCisgICAqLworICBzdGFydF9vZmZzICY9IH4xNTsKKyAgZW5kX29mZnMgPSAoMTUgKyAoZW5kX29mZnMgPDwgNCkpID4+IDQ7CisKKyAgLyogQWxsb2NhdGUgdGhlIGNvbnZlbnRpb25hbCBtZW1vcnkgZm9yIG91ciByZWFsIG1vZGUgY29kZS4gIFJlbWVtYmVyIHRvCisgICAqIHJvdW5kIGJ5dGUgY291bnQgVVAgdG8gMTYtYnl0ZSBwYXJhZ3JhcGggc2l6ZS4gIFdlIGFsbG9jIGl0CisgICAqIGFib3ZlIHRoZSBET1MgZGF0YSBidWZmZXIgc28gYm90aCB0aGUgRE9TIGRhdGEgYnVmZmVyIGFuZCB0aGUgYXBwbAorICAgKiBjb252ZW50aW9uYWwgbWVtIGJsb2NrIGNhbiBzdGlsbCBiZSByZXNpemVkLgorICAgKgorICAgKiBGaXJzdCBqdXN0IHRyeSB0byBhbGxvYyBpdDsgIGlmIHdlIGNhbid0IGdldCBpdCwgc2hyaW5rIHRoZSBhcHBsIG1lbQorICAgKiBibG9jayBkb3duIHRvIHRoZSBtaW5pbXVtLCB0cnkgdG8gYWxsb2MgdGhlIG1lbW9yeSBhZ2FpbiwgdGhlbiBncm93IHRoZQorICAgKiBhcHBsIG1lbSBibG9jayBiYWNrIHRvIHRoZSBtYXhpbXVtLiAgKERvbid0IHRyeSB0byBzaHJpbmsgdGhlIERPUyBkYXRhCisgICAqIGJ1ZmZlciB0byBmcmVlIGNvbnZlbnRpb25hbCBtZW1vcnk7ICBpdCB3b3VsZG4ndCBiZSBnb29kIGZvciB0aGlzIHJvdXRpbmUKKyAgICogdG8gaGF2ZSB0aGUgcG9zc2libGUgc2lkZSBlZmZlY3Qgb2YgbWFraW5nIGZpbGUgSS9PIHJ1biBzbG93ZXIuKQorICAgKi8KKyAgbGVuID0gKChlbmRfb2ZmcyAtIHN0YXJ0X29mZnMpICsgMTUpID4+IDQ7CisgIGlmIChfZHhfcmVhbF9hYm92ZShsZW4sIHJtZW1fYWRycCwgJnN0ZW1wKSAhPSBfRE9TRV9OT05FKQorICB7CisgICAgaWYgKF9keF9jbWVtX3VzYWdlKDAsIDAsICZ0ZW1wLCAmdGVtcCkgIT0gX0RPU0VfTk9ORSkKKyAgICAgICByZXR1cm4gKEZBTFNFKTsKKworICAgIGlmIChfZHhfcmVhbF9hYm92ZShsZW4sIHJtZW1fYWRycCwgJnN0ZW1wKSAhPSBfRE9TRV9OT05FKQorICAgICAgICpybWVtX2FkcnAgPSAwOworCisgICAgaWYgKF9keF9jbWVtX3VzYWdlKDAsIDEsICZ0ZW1wLCAmdGVtcCkgIT0gX0RPU0VfTk9ORSkKKyAgICB7CisgICAgICBpZiAoKnJtZW1fYWRycCAhPSAwKQorICAgICAgICAgX2R4X3JlYWxfZnJlZSAoKnJtZW1fYWRycCk7CisgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBpZiAoKnJtZW1fYWRycCA9PSAwKQorICAgICAgIHJldHVybiAoRkFMU0UpOworICB9CisKKyAgLyogQ29uc3RydWN0IHJlYWwgbW9kZSAmIHByb3RlY3RlZCBtb2RlIHBvaW50ZXJzIHRvIGFjY2VzcyB0aGUgYWxsb2NhdGVkCisgICAqIG1lbW9yeS4gIE5vdGUgd2Uga25vdyBzdGFydF9vZmZzIGlzIGFsaWduZWQgb24gYSBwYXJhZ3JhcGggKDE2LWJ5dGUpCisgICAqIGJvdW5kYXJ5LCBiZWNhdXNlIHdlIHJvdW5kZWQgaXQgZG93bi4KKyAgICoKKyAgICogV2UgbWFrZSB0aGUgb2Zmc2V0cyBjb21lIG91dCByaWdodHMgYnkgYmFja2luZyBvZmYgdGhlIHJlYWwgbW9kZSBzZWxlY3RvcgorICAgKiBieSBzdGFydF9vZmZzLgorICAgKi8KKyAgcm1fYmFzZSA9ICgoVUxPTkcpICpybWVtX2FkcnApIC0gKHN0YXJ0X29mZnMgPj4gNCk7CisgIFJQX1NFVCAoKnJlYWxfYmFzZXAsIDAsIHJtX2Jhc2UpOworICBGUF9TRVQgKCpwcm90X2Jhc2VwLCBybV9iYXNlIDw8IDQsIFNTX0RPU01FTSk7CisKKyAgLyogQ29weSB0aGUgcmVhbCBtb2RlIGNvZGUvZGF0YSB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeQorICAgKi8KKyAgc291cmNlID0gKFVDSEFSICopIHN0YXJ0X29mZnM7CisgIGRlc3RpbiA9ICpwcm90X2Jhc2VwOworICBGUF9TRVQgKGRlc3RpbiwgRlBfT0ZGKCpwcm90X2Jhc2VwKSArIHN0YXJ0X29mZnMsIEZQX1NFTCgqcHJvdF9iYXNlcCkpOworICBsZW4gPSBlbmRfb2ZmcyAtIHN0YXJ0X29mZnM7CisgIFdyaXRlRmFyTWVtIChkZXN0aW4sIHNvdXJjZSwgbGVuKTsKKworICByZXR1cm4gKFRSVUUpOworfQorI2VuZGlmIC8qIERPU1ggJiYgKERPU1ggJiBQSEFSTEFQKSAqLwpkaWZmIC0tZ2l0IGEvbXNkb3MvcGt0ZHJ2ci5oIGIvbXNkb3MvcGt0ZHJ2ci5oCmluZGV4IDA4ODk4YWUuLjNlMGNmZTAgMTAwNjQ0Ci0tLSBhL21zZG9zL3BrdGRydnIuaAorKysgYi9tc2Rvcy9wa3RkcnZyLmgKQEAgLTEsMTUzICsxLDE1MyBAQAotI2lmbmRlZiBfX1BLVERSVlJfSA0KLSNkZWZpbmUgX19QS1REUlZSX0gNCi0NCi0jZGVmaW5lIFBVQkxJQw0KLSNkZWZpbmUgTE9DQUwgICAgICAgIHN0YXRpYw0KLQ0KLSNkZWZpbmUgUlhfQlVGX1NJWkUgIEVUSF9NVFUgICAvKiBidWZmZXIgc2l6ZSB2YXJpYWJsZXMuIE5CICEhICovDQotI2RlZmluZSBUWF9CVUZfU0laRSAgRVRIX01UVSAgIC8qIG11c3QgYmUgc2FtZSBhcyBpbiBwa3RfcngqLiogKi8NCi0NCi0jaWZkZWYgX19ISUdIQ19fDQotI3ByYWdtYSBPZmYoQWxpZ25fbWVtYmVycykNCi0jZWxzZQ0KLSNwcmFnbWEgcGFjaygxKQ0KLSNlbmRpZg0KLQ0KLXR5cGVkZWYgZW51bSAgeyAgICAgICAgICAgICAgICAvKiBQYWNrZXQtZHJpdmVyIGNsYXNzZXMgKi8NCi0gICAgICAgIFBEX0VUSEVSICAgICAgPSAxLA0KLSAgICAgICAgUERfUFJPTkVUMTAgICA9IDIsDQotICAgICAgICBQRF9JRUVFODAyNSAgID0gMywNCi0gICAgICAgIFBEX09NTklORVQgICAgPSA0LA0KLSAgICAgICAgUERfQVBQTEVUQUxLICA9IDUsDQotICAgICAgICBQRF9TTElQICAgICAgID0gNiwNCi0gICAgICAgIFBEX1NUQVJUTEFOICAgPSA3LA0KLSAgICAgICAgUERfQVJDTkVUICAgICA9IDgsDQotICAgICAgICBQRF9BWDI1ICAgICAgID0gOSwNCi0gICAgICAgIFBEX0tJU1MgICAgICAgPSAxMCwNCi0gICAgICAgIFBEX0lFRUU4MDIzXzIgPSAxMSwNCi0gICAgICAgIFBEX0ZEREk4MDIyICAgPSAxMiwNCi0gICAgICAgIFBEX1gyNSAgICAgICAgPSAxMywNCi0gICAgICAgIFBEX0xBTnN0YXIgICAgPSAxNCwNCi0gICAgICAgIFBEX1BQUCAgICAgICAgPSAxOA0KLSAgICAgIH0gUEtUX0NMQVNTOw0KLQ0KLXR5cGVkZWYgZW51bSAgeyAgICAgICAgICAgICAvKiBQYWNrZXQtZHJpdmVyIHJlY2VpdmUgbW9kZXMgICAgKi8NCi0gICAgICAgIFBEUlhfT0ZGICAgID0gMSwgICAgLyogdHVybiBvZmYgcmVjZWl2ZXIgICAgICAgICAgICAgICovDQotICAgICAgICBQRFJYX0RJUkVDVCwgICAgICAgIC8qIHJlY2VpdmUgb25seSB0byB0aGlzIGludGVyZmFjZSAqLw0KLSAgICAgICAgUERSWF9CUk9BRENBU1QsICAgICAvKiBESVJFQ1QgKyBicm9hZGNhc3QgcGFja2V0cyAgICAgKi8NCi0gICAgICAgIFBEUlhfTVVMVElDQVNUMSwgICAgLyogQlJPQURDQVNUICsgbGltaXRlZCBtdWx0aWNhc3QgICovDQotICAgICAgICBQRFJYX01VTFRJQ0FTVDIsICAgIC8qIEJST0FEQ0FTVCArIGFsbCBtdWx0aWNhc3QgICAgICAqLw0KLSAgICAgICAgUERSWF9BTExfUEFDS0VUUywgICAvKiByZWNlaXZlIGFsbCBwYWNrZXRzIG9uIG5ldHdvcmsgKi8NCi0gICAgICB9IFBLVF9SWF9NT0RFOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgICAgIGNoYXIgdHlwZVs4XTsNCi0gICAgICAgIGNoYXIgbGVuOw0KLSAgICAgIH0gUEtUX0ZSQU1FOw0KLQ0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgICAgIEJZVEUgIGNsYXNzOyAgICAgICAgLyogPSAxIGZvciBERUMvSW50ZXJsL1hlcm94IEV0aGVybmV0ICovDQotICAgICAgICBCWVRFICBudW1iZXI7ICAgICAgIC8qID0gMCBmb3Igc2luZ2xlIExBTiBhZGFwdGVyICAgICAgICAqLw0KLSAgICAgICAgV09SRCAgdHlwZTsgICAgICAgICAvKiA9IDEzIGZvciAzQzUyMyAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgIEJZVEUgIGZ1bmNzOyAgICAgICAgLyogQmFzaWMvRXh0ZW5kZWQvSGlQZXJmIGZ1bmN0aW9ucyAgICovDQotICAgICAgICBXT1JEICBpbnRyOyAgICAgICAgIC8qIHVzZXIgaW50ZXJydXB0IHZlY3RvciBudW1iZXIgICAgICAqLw0KLSAgICAgICAgV09SRCAgaGFuZGxlOyAgICAgICAvKiBIYW5kbGUgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gICAgKi8NCi0gICAgICAgIEJZVEUgIG5hbWUgWzE1XTsgICAgLyogTmFtZSBvZiBhZGFwdGVyIGludGVyZmFjZSxpZS4zQzUyMyovDQotICAgICAgICBCT09MICBxdWlldDsgICAgICAgIC8qIChkb24ndCkgcHJpbnQgZXJyb3JzIHRvIHN0ZG91dCAgICAqLw0KLSAgICAgICAgY29uc3QgY2hhciAqZXJyb3I7ICAvKiBhZGRyZXNzIG9mIGVycm9yIHN0cmluZyAgICAgICAgICAgKi8NCi0gICAgICAgIEJZVEUgIG1halZlcjsgICAgICAgLyogTWFqb3IgZHJpdmVyIGltcGxlbWVudGF0aW9uIHZlci4gICovDQotICAgICAgICBCWVRFICBtaW5WZXI7ICAgICAgIC8qIE1pbm9yIGRyaXZlciBpbXBsZW1lbnRhdGlvbiB2ZXIuICAqLw0KLSAgICAgICAgQllURSAgZHVtbXlMZW47ICAgICAvKiBsZW5ndGggb2YgZm9sbG93aW5nIGRhdGEgICAgICAgICAgKi8NCi0gICAgICAgIFdPUkQgIE1BQ2xlbmd0aDsgICAgLyogSGlQZXJmb3JtYW5jZSBkYXRhLCBOL0EgICAgICAgICAgICovDQotICAgICAgICBXT1JEICBNVFU7ICAgICAgICAgIC8qIEhpUGVyZm9ybWFuY2UgZGF0YSwgTi9BICAgICAgICAgICAqLw0KLSAgICAgICAgV09SRCAgbXVsdGljYXN0OyAgICAvKiBIaVBlcmZvcm1hbmNlIGRhdGEsIE4vQSAgICAgICAgICAgKi8NCi0gICAgICAgIFdPUkQgIHJjdnJCdWZmZXJzOyAgLyogdmFsaWQgZm9yICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICBXT1JEICBVTVRidWZzOyAgICAgIC8qICAgSGlnaCBQZXJmb3JtYW5jZSBkcml2ZXJzIG9ubHkgICAqLw0KLSAgICAgICAgV09SRCAgcG9zdEVPSWludHI7ICAvKiAgICAgICAgICAgICAgICAgIFVzYWdlID8/ICAgICAgICAgKi8NCi0gICAgICB9IFBLVF9JTkZPOw0KLQ0KLSNkZWZpbmUgUEtUX1BBUkFNX1NJWkUgIDE0ICAgIC8qIG1lbWJlcnMgbWFqVmVyIC0gcG9zdEVPSWludHIgKi8NCi0NCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgICAgICBEV09SRCBpblBhY2tldHM7ICAgICAgICAgIC8qICMgb2YgcGFja2V0cyByZWNlaXZlZCAgICAqLw0KLSAgICAgICAgRFdPUkQgb3V0UGFja2V0czsgICAgICAgICAvKiAjIG9mIHBhY2tldHMgdHJhbnNtaXR0ZWQgKi8NCi0gICAgICAgIERXT1JEIGluQnl0ZXM7ICAgICAgICAgICAgLyogIyBvZiBieXRlcyByZWNlaXZlZCAgICAgICovDQotICAgICAgICBEV09SRCBvdXRCeXRlczsgICAgICAgICAgIC8qICMgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgICAqLw0KLSAgICAgICAgRFdPUkQgaW5FcnJvcnM7ICAgICAgICAgICAvKiAjIG9mIHJlY2VwdGlvbiBlcnJvcnMgICAgKi8NCi0gICAgICAgIERXT1JEIG91dEVycm9yczsgICAgICAgICAgLyogIyBvZiB0cmFuc21pc3Npb24gZXJyb3JzICovDQotICAgICAgICBEV09SRCBsb3N0OyAgICAgICAgICAgICAgIC8qICMgb2YgcGFja2V0cyBsb3N0IChSWCkgICAqLw0KLSAgICAgIH0gUEtUX1NUQVQ7DQotICAgICAgICAgICAgICAgICAgIA0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgICAgIEVUSEVSIGRlc3RpbjsNCi0gICAgICAgIEVUSEVSIHNvdXJjZTsNCi0gICAgICAgIFdPUkQgIHByb3RvOw0KLSAgICAgICAgQllURSAgZGF0YSBbVFhfQlVGX1NJWkVdOw0KLSAgICAgIH0gVFhfRUxFTUVOVDsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgICAgICBXT1JEICBmaXJzdENvdW50OyAgICAgICAgIC8qICMgb2YgYnl0ZXMgb24gMXN0ICAgICAgICAgKi8NCi0gICAgICAgIFdPUkQgIHNlY29uZENvdW50OyAgICAgICAgLyogYW5kIDJuZCB1cGNhbGwgICAgICAgICAgICAqLw0KLSAgICAgICAgV09SRCAgaGFuZGxlOyAgICAgICAgICAgICAvKiBpbnN0YW5jZSB0aGF0IHVwY2FsbGVkICAgICovDQotICAgICAgICBFVEhFUiBkZXN0aW47ICAgICAgICAgICAgIC8qIEUtbmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8NCi0gICAgICAgIEVUSEVSIHNvdXJjZTsgICAgICAgICAgICAgLyogRS1uZXQgc291cmNlIGFkZHJlc3MgICAgICAqLw0KLSAgICAgICAgV09SRCAgcHJvdG87ICAgICAgICAgICAgICAvKiBwcm90b2NvbCBudW1iZXIgICAgICAgICAgICovDQotICAgICAgICBCWVRFICBkYXRhIFtSWF9CVUZfU0laRV07DQotICAgICAgfSBSWF9FTEVNRU5UOw0KLQ0KLQ0KLSNpZmRlZiBfX0hJR0hDX18NCi0jcHJhZ21hIHBvcChBbGlnbl9tZW1iZXJzKQ0KLSNlbHNlDQotI3ByYWdtYSBwYWNrKCkNCi0jZW5kaWYNCi0NCi0NCi0vKg0KLSAqIFByb3RvdHlwZXMgZm9yIHB1YmxpY3MNCi0gKi8NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0NCi1leHRlcm4gUEtUX1NUQVQgICAgcGt0U3RhdDsgICAgIC8qIHN0YXRpc3RpY3MgZm9yIHBhY2tldHMgKi8NCi1leHRlcm4gUEtUX0lORk8gICAgcGt0SW5mbzsgICAgIC8qIHBhY2tldC1kcml2ZXIgaW5mb3JtYXRpb24gKi8NCi0NCi1leHRlcm4gUEtUX1JYX01PREUgcmVjZWl2ZU1vZGU7DQotZXh0ZXJuIEVUSEVSICAgICAgIG15QWRkcmVzcywgZXRoQnJvYWRjYXN0Ow0KLQ0KLWV4dGVybiBCT09MICBQa3RJbml0RHJpdmVyIChQS1RfUlhfTU9ERSBtb2RlKTsNCi1leHRlcm4gQk9PTCAgUGt0RXhpdERyaXZlciAodm9pZCk7DQotDQotZXh0ZXJuIGNvbnN0IGNoYXIgKlBrdEdldEVycm9yU3RyICAgIChpbnQgZXJyTnVtKTsNCi1leHRlcm4gY29uc3QgY2hhciAqUGt0R2V0Q2xhc3NOYW1lICAgKFdPUkQgY2xhc3MpOw0KLWV4dGVybiBjb25zdCBjaGFyICpQa3RSWG1vZGVTdHIgICAgICAoUEtUX1JYX01PREUgbW9kZSk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdFNlYXJjaERyaXZlciAgICh2b2lkKTsNCi1leHRlcm4gaW50ICAgICAgICAgUGt0UmVjZWl2ZSAgICAgICAgKEJZVEUgKmJ1ZiwgaW50IG1heCk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdFRyYW5zbWl0ICAgICAgIChjb25zdCB2b2lkICpldGgsIGludCBsZW4pOw0KLWV4dGVybiBEV09SRCAgICAgICBQa3RSeERyb3BwZWQgICAgICAodm9pZCk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdFJlbGVhc2VIYW5kbGUgIChXT1JEIGhhbmRsZSk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdFRlcm1pbkhhbmRsZSAgIChXT1JEIGhhbmRsZSk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdFJlc2V0SW50ZXJmYWNlIChXT1JEIGhhbmRsZSk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdFNldFJlY2VpdmVyTW9kZShQS1RfUlhfTU9ERSAgbW9kZSk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdEdldFJlY2VpdmVyTW9kZShQS1RfUlhfTU9ERSAqbW9kZSk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdEdldFN0YXRpc3RpY3MgIChXT1JEIGhhbmRsZSk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdFNlc3NTdGF0aXN0aWNzIChXT1JEIGhhbmRsZSk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdFJlc2V0U3RhdGlzdGljcyhXT1JEIGhhbmRsZSk7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdEdldEFkZHJlc3MgICAgIChFVEhFUiAqYWRkcik7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdFNldEFkZHJlc3MgICAgIChjb25zdCBFVEhFUiAqYWRkcik7DQotZXh0ZXJuIEJPT0wgICAgICAgIFBrdEdldERyaXZlckluZm8gICh2b2lkKTsNCi1leHRlcm4gQk9PTCAgICAgICAgUGt0R2V0RHJpdmVyUGFyYW0gKHZvaWQpOw0KLWV4dGVybiB2b2lkICAgICAgICBQa3RRdWV1ZUJ1c3kgICAgICAoQk9PTCBidXN5KTsNCi1leHRlcm4gV09SRCAgICAgICAgUGt0QnVmZmVyc1VzZWQgICAgKHZvaWQpOw0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogX19QS1REUlZSX0ggKi8NCi0NCisjaWZuZGVmIF9fUEtURFJWUl9ICisjZGVmaW5lIF9fUEtURFJWUl9ICisKKyNkZWZpbmUgUFVCTElDCisjZGVmaW5lIExPQ0FMICAgICAgICBzdGF0aWMKKworI2RlZmluZSBSWF9CVUZfU0laRSAgRVRIX01UVSAgIC8qIGJ1ZmZlciBzaXplIHZhcmlhYmxlcy4gTkIgISEgKi8KKyNkZWZpbmUgVFhfQlVGX1NJWkUgIEVUSF9NVFUgICAvKiBtdXN0IGJlIHNhbWUgYXMgaW4gcGt0X3J4Ki4qICovCisKKyNpZmRlZiBfX0hJR0hDX18KKyNwcmFnbWEgT2ZmKEFsaWduX21lbWJlcnMpCisjZWxzZQorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYKKwordHlwZWRlZiBlbnVtICB7ICAgICAgICAgICAgICAgIC8qIFBhY2tldC1kcml2ZXIgY2xhc3NlcyAqLworICAgICAgICBQRF9FVEhFUiAgICAgID0gMSwKKyAgICAgICAgUERfUFJPTkVUMTAgICA9IDIsCisgICAgICAgIFBEX0lFRUU4MDI1ICAgPSAzLAorICAgICAgICBQRF9PTU5JTkVUICAgID0gNCwKKyAgICAgICAgUERfQVBQTEVUQUxLICA9IDUsCisgICAgICAgIFBEX1NMSVAgICAgICAgPSA2LAorICAgICAgICBQRF9TVEFSVExBTiAgID0gNywKKyAgICAgICAgUERfQVJDTkVUICAgICA9IDgsCisgICAgICAgIFBEX0FYMjUgICAgICAgPSA5LAorICAgICAgICBQRF9LSVNTICAgICAgID0gMTAsCisgICAgICAgIFBEX0lFRUU4MDIzXzIgPSAxMSwKKyAgICAgICAgUERfRkRESTgwMjIgICA9IDEyLAorICAgICAgICBQRF9YMjUgICAgICAgID0gMTMsCisgICAgICAgIFBEX0xBTnN0YXIgICAgPSAxNCwKKyAgICAgICAgUERfUFBQICAgICAgICA9IDE4CisgICAgICB9IFBLVF9DTEFTUzsKKwordHlwZWRlZiBlbnVtICB7ICAgICAgICAgICAgIC8qIFBhY2tldC1kcml2ZXIgcmVjZWl2ZSBtb2RlcyAgICAqLworICAgICAgICBQRFJYX09GRiAgICA9IDEsICAgIC8qIHR1cm4gb2ZmIHJlY2VpdmVyICAgICAgICAgICAgICAqLworICAgICAgICBQRFJYX0RJUkVDVCwgICAgICAgIC8qIHJlY2VpdmUgb25seSB0byB0aGlzIGludGVyZmFjZSAqLworICAgICAgICBQRFJYX0JST0FEQ0FTVCwgICAgIC8qIERJUkVDVCArIGJyb2FkY2FzdCBwYWNrZXRzICAgICAqLworICAgICAgICBQRFJYX01VTFRJQ0FTVDEsICAgIC8qIEJST0FEQ0FTVCArIGxpbWl0ZWQgbXVsdGljYXN0ICAqLworICAgICAgICBQRFJYX01VTFRJQ0FTVDIsICAgIC8qIEJST0FEQ0FTVCArIGFsbCBtdWx0aWNhc3QgICAgICAqLworICAgICAgICBQRFJYX0FMTF9QQUNLRVRTLCAgIC8qIHJlY2VpdmUgYWxsIHBhY2tldHMgb24gbmV0d29yayAqLworICAgICAgfSBQS1RfUlhfTU9ERTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjaGFyIHR5cGVbOF07CisgICAgICAgIGNoYXIgbGVuOworICAgICAgfSBQS1RfRlJBTUU7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBCWVRFICBjbGFzczsgICAgICAgIC8qID0gMSBmb3IgREVDL0ludGVybC9YZXJveCBFdGhlcm5ldCAqLworICAgICAgICBCWVRFICBudW1iZXI7ICAgICAgIC8qID0gMCBmb3Igc2luZ2xlIExBTiBhZGFwdGVyICAgICAgICAqLworICAgICAgICBXT1JEICB0eXBlOyAgICAgICAgIC8qID0gMTMgZm9yIDNDNTIzICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBCWVRFICBmdW5jczsgICAgICAgIC8qIEJhc2ljL0V4dGVuZGVkL0hpUGVyZiBmdW5jdGlvbnMgICAqLworICAgICAgICBXT1JEICBpbnRyOyAgICAgICAgIC8qIHVzZXIgaW50ZXJydXB0IHZlY3RvciBudW1iZXIgICAgICAqLworICAgICAgICBXT1JEICBoYW5kbGU7ICAgICAgIC8qIEhhbmRsZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAgICAqLworICAgICAgICBCWVRFICBuYW1lIFsxNV07ICAgIC8qIE5hbWUgb2YgYWRhcHRlciBpbnRlcmZhY2UsaWUuM0M1MjMqLworICAgICAgICBCT09MICBxdWlldDsgICAgICAgIC8qIChkb24ndCkgcHJpbnQgZXJyb3JzIHRvIHN0ZG91dCAgICAqLworICAgICAgICBjb25zdCBjaGFyICplcnJvcjsgIC8qIGFkZHJlc3Mgb2YgZXJyb3Igc3RyaW5nICAgICAgICAgICAqLworICAgICAgICBCWVRFICBtYWpWZXI7ICAgICAgIC8qIE1ham9yIGRyaXZlciBpbXBsZW1lbnRhdGlvbiB2ZXIuICAqLworICAgICAgICBCWVRFICBtaW5WZXI7ICAgICAgIC8qIE1pbm9yIGRyaXZlciBpbXBsZW1lbnRhdGlvbiB2ZXIuICAqLworICAgICAgICBCWVRFICBkdW1teUxlbjsgICAgIC8qIGxlbmd0aCBvZiBmb2xsb3dpbmcgZGF0YSAgICAgICAgICAqLworICAgICAgICBXT1JEICBNQUNsZW5ndGg7ICAgIC8qIEhpUGVyZm9ybWFuY2UgZGF0YSwgTi9BICAgICAgICAgICAqLworICAgICAgICBXT1JEICBNVFU7ICAgICAgICAgIC8qIEhpUGVyZm9ybWFuY2UgZGF0YSwgTi9BICAgICAgICAgICAqLworICAgICAgICBXT1JEICBtdWx0aWNhc3Q7ICAgIC8qIEhpUGVyZm9ybWFuY2UgZGF0YSwgTi9BICAgICAgICAgICAqLworICAgICAgICBXT1JEICByY3ZyQnVmZmVyczsgIC8qIHZhbGlkIGZvciAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBXT1JEICBVTVRidWZzOyAgICAgIC8qICAgSGlnaCBQZXJmb3JtYW5jZSBkcml2ZXJzIG9ubHkgICAqLworICAgICAgICBXT1JEICBwb3N0RU9JaW50cjsgIC8qICAgICAgICAgICAgICAgICAgVXNhZ2UgPz8gICAgICAgICAqLworICAgICAgfSBQS1RfSU5GTzsKKworI2RlZmluZSBQS1RfUEFSQU1fU0laRSAgMTQgICAgLyogbWVtYmVycyBtYWpWZXIgLSBwb3N0RU9JaW50ciAqLworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgRFdPUkQgaW5QYWNrZXRzOyAgICAgICAgICAvKiAjIG9mIHBhY2tldHMgcmVjZWl2ZWQgICAgKi8KKyAgICAgICAgRFdPUkQgb3V0UGFja2V0czsgICAgICAgICAvKiAjIG9mIHBhY2tldHMgdHJhbnNtaXR0ZWQgKi8KKyAgICAgICAgRFdPUkQgaW5CeXRlczsgICAgICAgICAgICAvKiAjIG9mIGJ5dGVzIHJlY2VpdmVkICAgICAgKi8KKyAgICAgICAgRFdPUkQgb3V0Qnl0ZXM7ICAgICAgICAgICAvKiAjIG9mIGJ5dGVzIHRyYW5zbWl0dGVkICAgKi8KKyAgICAgICAgRFdPUkQgaW5FcnJvcnM7ICAgICAgICAgICAvKiAjIG9mIHJlY2VwdGlvbiBlcnJvcnMgICAgKi8KKyAgICAgICAgRFdPUkQgb3V0RXJyb3JzOyAgICAgICAgICAvKiAjIG9mIHRyYW5zbWlzc2lvbiBlcnJvcnMgKi8KKyAgICAgICAgRFdPUkQgbG9zdDsgICAgICAgICAgICAgICAvKiAjIG9mIHBhY2tldHMgbG9zdCAoUlgpICAgKi8KKyAgICAgIH0gUEtUX1NUQVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBFVEhFUiBkZXN0aW47CisgICAgICAgIEVUSEVSIHNvdXJjZTsKKyAgICAgICAgV09SRCAgcHJvdG87CisgICAgICAgIEJZVEUgIGRhdGEgW1RYX0JVRl9TSVpFXTsKKyAgICAgIH0gVFhfRUxFTUVOVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBXT1JEICBmaXJzdENvdW50OyAgICAgICAgIC8qICMgb2YgYnl0ZXMgb24gMXN0ICAgICAgICAgKi8KKyAgICAgICAgV09SRCAgc2Vjb25kQ291bnQ7ICAgICAgICAvKiBhbmQgMm5kIHVwY2FsbCAgICAgICAgICAgICovCisgICAgICAgIFdPUkQgIGhhbmRsZTsgICAgICAgICAgICAgLyogaW5zdGFuY2UgdGhhdCB1cGNhbGxlZCAgICAqLworICAgICAgICBFVEhFUiBkZXN0aW47ICAgICAgICAgICAgIC8qIEUtbmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyAgICAgICAgRVRIRVIgc291cmNlOyAgICAgICAgICAgICAvKiBFLW5ldCBzb3VyY2UgYWRkcmVzcyAgICAgICovCisgICAgICAgIFdPUkQgIHByb3RvOyAgICAgICAgICAgICAgLyogcHJvdG9jb2wgbnVtYmVyICAgICAgICAgICAqLworICAgICAgICBCWVRFICBkYXRhIFtSWF9CVUZfU0laRV07CisgICAgICB9IFJYX0VMRU1FTlQ7CisKKworI2lmZGVmIF9fSElHSENfXworI3ByYWdtYSBwb3AoQWxpZ25fbWVtYmVycykKKyNlbHNlCisjcHJhZ21hIHBhY2soKQorI2VuZGlmCisKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIHB1YmxpY3MKKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBQS1RfU1RBVCAgICBwa3RTdGF0OyAgICAgLyogc3RhdGlzdGljcyBmb3IgcGFja2V0cyAqLworZXh0ZXJuIFBLVF9JTkZPICAgIHBrdEluZm87ICAgICAvKiBwYWNrZXQtZHJpdmVyIGluZm9ybWF0aW9uICovCisKK2V4dGVybiBQS1RfUlhfTU9ERSByZWNlaXZlTW9kZTsKK2V4dGVybiBFVEhFUiAgICAgICBteUFkZHJlc3MsIGV0aEJyb2FkY2FzdDsKKworZXh0ZXJuIEJPT0wgIFBrdEluaXREcml2ZXIgKFBLVF9SWF9NT0RFIG1vZGUpOworZXh0ZXJuIEJPT0wgIFBrdEV4aXREcml2ZXIgKHZvaWQpOworCitleHRlcm4gY29uc3QgY2hhciAqUGt0R2V0RXJyb3JTdHIgICAgKGludCBlcnJOdW0pOworZXh0ZXJuIGNvbnN0IGNoYXIgKlBrdEdldENsYXNzTmFtZSAgIChXT1JEIGNsYXNzKTsKK2V4dGVybiBjb25zdCBjaGFyICpQa3RSWG1vZGVTdHIgICAgICAoUEtUX1JYX01PREUgbW9kZSk7CitleHRlcm4gQk9PTCAgICAgICAgUGt0U2VhcmNoRHJpdmVyICAgKHZvaWQpOworZXh0ZXJuIGludCAgICAgICAgIFBrdFJlY2VpdmUgICAgICAgIChCWVRFICpidWYsIGludCBtYXgpOworZXh0ZXJuIEJPT0wgICAgICAgIFBrdFRyYW5zbWl0ICAgICAgIChjb25zdCB2b2lkICpldGgsIGludCBsZW4pOworZXh0ZXJuIERXT1JEICAgICAgIFBrdFJ4RHJvcHBlZCAgICAgICh2b2lkKTsKK2V4dGVybiBCT09MICAgICAgICBQa3RSZWxlYXNlSGFuZGxlICAoV09SRCBoYW5kbGUpOworZXh0ZXJuIEJPT0wgICAgICAgIFBrdFRlcm1pbkhhbmRsZSAgIChXT1JEIGhhbmRsZSk7CitleHRlcm4gQk9PTCAgICAgICAgUGt0UmVzZXRJbnRlcmZhY2UgKFdPUkQgaGFuZGxlKTsKK2V4dGVybiBCT09MICAgICAgICBQa3RTZXRSZWNlaXZlck1vZGUoUEtUX1JYX01PREUgIG1vZGUpOworZXh0ZXJuIEJPT0wgICAgICAgIFBrdEdldFJlY2VpdmVyTW9kZShQS1RfUlhfTU9ERSAqbW9kZSk7CitleHRlcm4gQk9PTCAgICAgICAgUGt0R2V0U3RhdGlzdGljcyAgKFdPUkQgaGFuZGxlKTsKK2V4dGVybiBCT09MICAgICAgICBQa3RTZXNzU3RhdGlzdGljcyAoV09SRCBoYW5kbGUpOworZXh0ZXJuIEJPT0wgICAgICAgIFBrdFJlc2V0U3RhdGlzdGljcyhXT1JEIGhhbmRsZSk7CitleHRlcm4gQk9PTCAgICAgICAgUGt0R2V0QWRkcmVzcyAgICAgKEVUSEVSICphZGRyKTsKK2V4dGVybiBCT09MICAgICAgICBQa3RTZXRBZGRyZXNzICAgICAoY29uc3QgRVRIRVIgKmFkZHIpOworZXh0ZXJuIEJPT0wgICAgICAgIFBrdEdldERyaXZlckluZm8gICh2b2lkKTsKK2V4dGVybiBCT09MICAgICAgICBQa3RHZXREcml2ZXJQYXJhbSAodm9pZCk7CitleHRlcm4gdm9pZCAgICAgICAgUGt0UXVldWVCdXN5ICAgICAgKEJPT0wgYnVzeSk7CitleHRlcm4gV09SRCAgICAgICAgUGt0QnVmZmVyc1VzZWQgICAgKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19QS1REUlZSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbXNkb3MvcmVhZG1lLmRvcyBiL21zZG9zL3JlYWRtZS5kb3MKaW5kZXggMzUzZDBjYy4uOTkwYTJlOCAxMDA2NDQKLS0tIGEvbXNkb3MvcmVhZG1lLmRvcworKysgYi9tc2Rvcy9yZWFkbWUuZG9zCkBAIC0xMCwxOSArMTAsMjEgQEAKICAtIEdOVSBDIDIuNysgd2l0aCBkamdwcCAyLjAxKyBET1MgZXh0ZW5kZXIKICAtIFdhdGNvbSBDIDExLnggd2l0aCBET1M0R1cgZXh0ZW5kZXIKIAotTm90ZTogdGhlIGZpbGVzIGluIHRoZSBsaWJwY2FwLnppcCBjb250YWlucyBzaG9ydCB0cnVjYXRlZCBmaWxlbmFtZXMuCitOb3RlOiB0aGUgZmlsZXMgaW4gdGhlIGxpYnBjYXAuemlwIGNvbnRhaW5zIHNob3J0IHRydW5jYXRlZCBmaWxlbmFtZXMuCiAgIFNvIGZvciBkamdwcCB0byB3b3JrIHdpdGggdGhlc2UsIGRpc2FibGUgdGhlIHVzZSBvZiBsb25nIGZpbGUgbmFtZXMgYnkKLSAgc2V0dGluZyAiTEZOPW4iIGluIHRoZSBlbnZpcm9ubWVudC4KKyAgc2V0dGluZyAiTEZOPW4iIGluIHRoZSBlbnZpcm9ubWVudC4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBnZXQgbGlicGNhcAorICBmcm9tIEdpdGh1YiBvciB0aGUgb2ZmaWNpYWwgbGlicGNhcC50YXIuZ3osIHNvbWUgZmlsZW5hbWVzIGFyZSBiZXlvbmQgOCszLgorICBJbiB0aGlzIGNhc2Ugc2V0ICJMRk49eSIuCiAKIEZpbGVzIHNwZWNpZmljIHRvIERPUyBhcmUgcGNhcC1kb3MuW2NoXSBhbmQgdGhlIGFzc2VtYmx5IGFuZCBDIGZpbGVzIGluCi10aGUgTVNET1Mgc3ViLWRpcmVjdG9yeS4gUmVtZW1iZXIgdG8gYnVpbHQgbGlwY2FwIGxpYnJhcmllcyBmcm9tIHRoZSB0b3AKK3RoZSBNU0RPUyBzdWItZGlyZWN0b3J5LiBSZW1lbWJlciB0byBidWlsdCB0aGUgbGlicGNhcCBsaWJyYXJ5IGZyb20gdGhlIHRvcAogaW5zdGFsbCBkaXJlY3RvcnkuIEFuZCBub3QgZnJvbSB0aGUgTVNET1Mgc3ViLWRpcmVjdG9yeS4KIAogTm90ZSBmb3IgZGpncHAgdXNlcnM6CiAgIElmIHlvdSBnb3QgdGhlIGxpYnBjYXAgZnJvbSB0aGUgb2ZmaWNpYWwgc2l0ZSB3d3cudGNwZHVtcCwgdGhlbiB0aGF0CiAgIGRpc3RyaWJ1dGlvbiBkb2VzIE5PVCBjb250YWluIGFueSBzb3VyY2VzIGZvciBidWlsZGluZyAzMi1iaXQgZHJpdmVycy4KICAgSW5zdGVhZCBnZXQgdGhlIGZ1bGwgdmVyc2lvbiBhdAotICAgICBodHRwOi8vd3d3LmJnbmV0dC5uby9+Z2l2YS9wY2FwL2xpYnBjYXAuemlwCisgICAgIGh0dHA6Ly93d3cud2F0dC0zMi5uZXQvcGNhcC9saWJwY2FwLnppcAogCiAgIGFuZCBzZXQgIlVTRV8zMkJJVF9EUklWRVJTID0gMSIgaW4gbXNkb3NcY29tbW9uLmRqLgogCkBAIC00OSwzMCArNTEsMjggQEAKICAgIHJlY2VpdmUgbmV0d29yayBkYXRhLiBJdCdzIG1vc3RseSB1c2VkIHRvIGFjY2VzcyB0aGUgJ2hvc3RzJwogICAgZmlsZSBhbmQgb3RoZXIgPG5ldGRiLmg+IGZlYXR1cmVzLiBHZXQgJ3dhdHQzMnMqLnppcCcgYXQ6CiAKLSAgICAgaHR0cDovL3d3dy5iZ25ldHQubm8vfmdpdmEvCisgICAgIGh0dHA6Ly93d3cud2F0dC0zMi5uZXQKIAogMi4gRXhjZXB0aW9uIGhhbmRsZXIgYW5kIGRpc2Fzc2VtYmVyIGxpYnJhcnkgKGxpYmV4Yy5hKSBpcyBuZWVkZWQgaWYKICAgICJVU0VfRVhDRVBUID0gMSIgaW4gY29tbW9uLmRqLiBBdmFpbGFibGUgYXQ6CiAKLSAgICAgaHR0cDovL3d3dy5iZ25ldHQubm8vfmdpdmEvbWlzYy9leGNfZHgwNy56aXAKKyAgICAgaHR0cDovL3d3dy53YXR0LTMyLm5ldC9taXNjL2V4Y19keDA3LnppcAogCiAzLiBGbGV4ICYgQmlzb24gaXMgdXNlZCB0byBnZW5lcmF0ZSBwYXJzZXIgZm9yIHRoZSBmaWx0ZXIgaGFuZGxlcgogICAgcGNhcF9jb21waWxlOgotCi0gICAgIGZ0cDovL2Z0cC5zaW10ZWwubmV0L3B1Yi9zaW10ZWxuZXQvZ251L2RqZ3BwL3YyZ251L2ZseDI1NGIuemlwCi0gICAgIGZ0cDovL2Z0cC5zaW10ZWwubmV0L3B1Yi9zaW10ZWxuZXQvZ251L2RqZ3BwL3YyZ251L2JzbjEyOGIuemlwCisgICAgIGZ0cDovL2Z0cC5kZWxvcmllLmNvbS9wdWIvZGpncHAvY3VycmVudC92MmdudS9mbHgyNTRiLnppcAorICAgICBmdHA6Ly9mdHAuZGVsb3JpZS5jb20vcHViL2RqZ3BwL2N1cnJlbnQvdjJnbnUvYnNuMjQxYi56aXAKIAogNC4gTkFTTSBhc3NlbWJsZXIgdiAwLjk4IG9yIGxhdGVyIGlzIHJlcXVpcmVkIHdoZW4gYnVpbGRpbmcgZGpncHAgYW5kCiAgICBXYXRjb20gdGFyZ2V0czoKLQotICAgICBmdHA6Ly9mdHAuc2ltdGVsLm5ldC9wdWIvc2ltdGVsbmV0L2dudS9kamdwcC92MnRrL25hc20wOThwLnppcAorICAgICBodHRwOi8vd3d3Lm5hc20udXMvCiAKIDUuIHNlZCAoU3RyZWFtIEVkaXRvcikgaXMgcmVxdWlyZWQgZm9yIGRvaW5nIGBtYWtlIGRlcGVuZCcuCi0gICBJdCdzIGF2YWlsYWJsZSBhdAotICAgICBmdHA6Ly9mdHAuc2ltdGVsLm5ldC9wdWIvc2ltdGVsbmV0L2dudS9kamdwcC92MmdudS9zZWQqLnppcAorICAgSXQncyBhdmFpbGFibGUgYXQ6CisgICAgIGZ0cDovL2Z0cC5kZWxvcmllLmNvbS9wdWIvZGpncHAvY3VycmVudC92MmdudS9zZWQ0MjJiLnppcAogCi0gICBBIHRvdWNoIHRvb2wgdG8gdXBkYXRlIHRoZSB0aW1lLXN0YW1wIG9mIGEgZmlsZS4gRS5nLgotICAgICBmdHA6Ly9mdHAuc2ltdGVsLm5ldC9wdWIvc2ltdGVsbmV0L2dudS9kamdwcC92MmdudS9ncmVwKi56aXAKKyAgIEEgdG91Y2ggdG9vbCB0byB1cGRhdGUgdGhlIHRpbWUtc3RhbXAgb2YgYSBmaWxlLiBFLmcuOgorICAgICBmdHA6Ly9mdHAuZGVsb3JpZS5jb20vcHViL2RqZ3BwL2N1cnJlbnQvdjJnbnUvZ3JlcDI5Yi56aXAKIAogNi4gRm9yIGRqZ3BwIHJtLmV4ZSBhbmQgY3AuZXhlIGFyZSByZXF1aXJlZC4gVGhlc2Ugc2hvdWxkIGFscmVhZHkgYmUKICAgIHBhcnQgb2YgeW91ciBkamdwcCBpbnN0YWxsYXRpb24uIEFsc28gcmVxdWlyZWQgKGV4cGVyaW1lbnRhbCBhdCB0aGUKQEAgLTEyMSwxMCArMTIxLDE3IEBACiAKICAgIE5vdGU6IENvZGUgaW4gYFVTRV9ORElTMicgZG9lcyBub3Qgd29yayBhdCB0aGUgbW9tZW50LgogCi00LiBUaGUgcmVzdWx0aW5nIGxpYnJhcmllcyBhcmUgcHV0IGluIGN1cnJlbnQgZGlyZWN0b3J5LiBUaGVyZSdzIG5vCi0gICB0ZXN0LXByb2dyYW0gZm9yIGBsaWJwY2FwJy4gTGlua2luZyB0aGUgbGlicmFyeSB3aXRoIGB0Y3BkdW1wJyBpcwotICAgdGhlIHVsdGltYXRlIHRlc3QgYW55d2F5LgorNC4gVGhlIHJlc3VsdGluZyBsaWJyYXJ5IGlzIHB1dCBpbiBjdXJyZW50IGRpcmVjdG9yeS4gVGhlcmUncyBzb21lCisgICB0ZXN0LXByb2dyYW0gZm9yIGBsaWJwY2FwJzogYGZpbHRlcnRlc3QuZXhlJywgYGZpbmRhbGxkZXZzdGVzdC5leGUnLAorICAgICBgbm9uYmxvY2t0ZXN0LmV4ZScgYW5kIGBvcGVudGVzdC5leGUnLgogCisgICBCdXQgbGlua2luZyB0aGUgbGlicmFyeSB3aXRoIGB0Y3BkdW1wJyBpcyB0aGUgdWx0aW1hdGUgdGVzdC4gRE9TL2RqZ3BwCisgICBzaG91bGQgbm93IGhvcGVmdWxseSBiZSBhIHN1cHBvcnRlZCB0YXJnZXQuIEdldCB0aGUgc291cmNlcyBhdDoKKyAgICAgaHR0cDovL3d3dy50Y3BkdW1wLm9yZy8KKyAgIG9yCisgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS90aGUtdGNwZHVtcC1ncm91cC90Y3BkdW1wLworCisgICAoY2xpY2sgb24gdGhlICdEb3dubG9hZCBaSVAnIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoYXQgcGFnZS4pCiAKIAogRXh0ZW5zaW9ucyB0byBsaWJwY2FwCkBAIC0xMzIsMTQgKzEzOSwxNCBAQAogCiBJJ3ZlIGluY2x1ZGVkIHNvbWUgZXh0cmEgZnVuY3Rpb25zIHRvIERPUy1saWJwY2FwOgogCi0gIGBwY2FwX2NvbmZpZ19ob29rIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSknCisgIGBwY2FwX2NvbmZpZ19ob29rIChjb25zdCBjaGFyICprZXl3b3JkLCBjb25zdCBjaGFyICp2YWx1ZSknIDoKIAogICAgIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzZXQgdmFsdWVzIG9mIGludGVybmFsIGxpYnBjYXAgdmFyaWFibGVzLgotICAgIGBuYW1lJyBpcyB0eXBpY2FsbHkgYSBsZWZ0LXNpZGUga2V5d29yZCB3aXRoIGFuIGFzc29jaWF0ZWQgYHZhbHVlJwotICAgIHRoYXQgaXMgY2FsbGVkIGZyb20gYXBwbGljYXRpb24ncyBjb25maWd1cmUgcHJvY2VzcyAoc2VlIHRjcGR1bXAncwotICAgIGNvbmZpZy5jIGZpbGUpLiBsaWJwY2FwIGtlZXBzIGEgc2V0IG9mIHRhYmxlcyB0aGF0IGFyZSBzZWFyY2hlZCBmb3IKLSAgICBhIG5hbWUvdmFsdWUgbWF0Y2guIEN1cnJlbnRseSBvbmx5IHVzZWQgdG8gc2V0IGRlYnVnLWxldmVscyBhbmQKLSAgICBwYXJhbWV0ZXJzIGZvciB0aGUgMzItYml0IG5ldHdvcmsgZHJpdmVycy4KKyAgICBga2V5d29yZCcgYW5kIGFuIGFzc29jaWF0ZWQgYHZhbHVlJyBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUgYGRlYnVnX3RhYltdJworICAgIGFycmF5IGluIHBjYXAtZG9zLmMgKGN1cnJlbnRseSBvbmx5IHVzZWQgdG8gc2V0IGRlYnVnLWxldmVscyBhbmQgcGFyYW1ldGVycworICAgIGZvciB0aGUgMzItYml0IG5ldHdvcmsgZHJpdmVycy4pIFRodXMgYW4gYXBwbGljYXRpb24gdXNpbmcgRE9TLWxpYnBjYXAgY2FuCisgICAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWUgZHVyaW5nIGl0J3MgY29uZmlndXJlIHByb2Nlc3MgKHNlZSB0Y3BkdW1wJ3MKKyAgICBtc2Rvcy9jb25maWcuYyBmaWxlIGZvciBhbiBleHRlbmRlZCBleGFtcGxlKS4KIAogICBgcGNhcF9zZXRfd2FpdCAocGNhcF90ICosIHZvaWQgKCopKHZvaWQpLCBpbnQpJyA6CiAKQEAgLTE1Myw4ICsxNjAsNyBAQAogSGFwcHkgc25pZmZpbmcgIQogCiAKLUdpc2xlIFZhbmVtIDxnaXZhQGJnbmV0dC5ubz4KLSAgICAgICAgICAgIDxndmFuZW1AYnJvYWRwYXJrLm5vPgorR2lzbGUgVmFuZW0gPGd2YW5lbUB5YWhvby5ubz4KIAotT2N0b2JlciAxOTk5LCAyMDA0CitPY3RvYmVyIDE5OTksIDIwMDQsIDIwMDYsIDIwMTMKIApkaWZmIC0tZ2l0IGEvbmFtZXRvYWRkci5jIGIvbmFtZXRvYWRkci5jCmluZGV4IGU2NDgzYTMuLjcxMjgwYjMgMTAwNjQ0Ci0tLSBhL25hbWV0b2FkZHIuYworKysgYi9uYW1ldG9hZGRyLmMKQEAgLTMxLDEwICszMSwzNiBAQAogI2luY2x1ZGUgPG5ldGRuZXQvZG5ldGRiLmg+CiAjZW5kaWYKIAotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCiAjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KIAotI2Vsc2UgLyogV0lOMzIgKi8KKyNpZmRlZiBJTkVUNgorLyoKKyAqIFRvIHF1b3RlIHRoZSBNU0ROIHBhZ2UgZm9yIGdldGFkZHJpbmZvKCkgYXQKKyAqCisgKiAgICBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczczODUyMCh2PXZzLjg1KS5hc3B4CisgKgorICogIlN1cHBvcnQgZm9yIGdldGFkZHJpbmZvIG9uIFdpbmRvd3MgMjAwMCBhbmQgb2xkZXIgdmVyc2lvbnMKKyAqIFRoZSBnZXRhZGRyaW5mbyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gdGhlIFdzMl8zMi5kbGwgb24gV2luZG93cyBYUCBhbmQKKyAqIGxhdGVyLiBUbyBleGVjdXRlIGFuIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGlzIGZ1bmN0aW9uIG9uIGVhcmxpZXIKKyAqIHZlcnNpb25zIG9mIFdpbmRvd3MsIHRoZW4geW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgV3MydGNwaXAuaCBhbmQKKyAqIFdzcGlhcGkuaCBmaWxlcy4gV2hlbiB0aGUgV3NwaWFwaS5oIGluY2x1ZGUgZmlsZSBpcyBhZGRlZCwgdGhlCisgKiBnZXRhZGRyaW5mbyBmdW5jdGlvbiBpcyBkZWZpbmVkIHRvIHRoZSBXc3BpYXBpR2V0QWRkckluZm8gaW5saW5lCisgKiBmdW5jdGlvbiBpbiB0aGUgV3NwaWFwaS5oIGZpbGUuIEF0IHJ1bnRpbWUsIHRoZSBXc3BpYXBpR2V0QWRkckluZm8KKyAqIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHN1Y2ggYSB3YXkgdGhhdCBpZiB0aGUgV3MyXzMyLmRsbCBvciB0aGUKKyAqIFdzaGlwNi5kbGwgKHRoZSBmaWxlIGNvbnRhaW5pbmcgZ2V0YWRkcmluZm8gaW4gdGhlIElQdjYgVGVjaG5vbG9neQorICogUHJldmlldyBmb3IgV2luZG93cyAyMDAwKSBkb2VzIG5vdCBpbmNsdWRlIGdldGFkZHJpbmZvLCB0aGVuIGEKKyAqIHZlcnNpb24gb2YgZ2V0YWRkcmluZm8gaXMgaW1wbGVtZW50ZWQgaW5saW5lIGJhc2VkIG9uIGNvZGUgaW4gdGhlCisgKiBXc3BpYXBpLmggaGVhZGVyIGZpbGUuIFRoaXMgaW5saW5lIGNvZGUgd2lsbCBiZSB1c2VkIG9uIG9sZGVyIFdpbmRvd3MKKyAqIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBuYXRpdmVseSBzdXBwb3J0IHRoZSBnZXRhZGRyaW5mbyBmdW5jdGlvbi4iCisgKgorICogV2UgdXNlIGdldGFkZHJpbmZvKCksIHNvIHdlIGluY2x1ZGUgV3NwaWFwaS5oIGhlcmUuICBwY2FwLXN0ZGluYy5oCisgKiBpbmNsdWRlcyBXczJ0Y3BpcC5oLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGluY2x1ZGUgaXQgb3Vyc2VsdmVzLgorICovCisjaW5jbHVkZSA8V3NwaWFwaS5oPgorI2VuZGlmCisKKyNlbHNlIC8qIF9XSU4zMiAqLwogCiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CQkJCS8qIGNvbmNlc3Npb24gdG8gQUlYICovCkBAIC00Miw5ICs2OCw5IEBACiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIF9XSU4zMiAqLwogCi0jaWZuZGVmIFdJTjMyCisjaWZuZGVmIF9XSU4zMgogI2lmZGVmIEhBVkVfRVRIRVJfSE9TVFRPTgogLyoKICAqIFhYWCAtIGRvIHdlIG5lZWQgYW55IG9mIHRoaXMgaWYgPG5ldGluZXQvaWZfZXRoZXIuaD4gZG9lc24ndCBkZWNsYXJlCkBAIC02Miw3ICs4OCw3IEBACiAjZW5kaWYgLyogSEFWRV9FVEhFUl9IT1NUVE9OICovCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KLSNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIF9XSU4zMiAqLwogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxlcnJuby5oPgpAQCAtNzQsNiArMTAwLDcgQEAKIAogI2luY2x1ZGUgImdlbmNvZGUuaCIKICNpbmNsdWRlIDxwY2FwL25hbWVkYi5oPgorI2luY2x1ZGUgIm5hbWV0b2FkZHIuaCIKIAogI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAogI2luY2x1ZGUgIm9zLXByb3RvLmgiCkBAIC0xNDAsNyArMTY3LDcgQEAKIGJwZl91X2ludDMyCiBwY2FwX25hbWV0b25ldGFkZHIoY29uc3QgY2hhciAqbmFtZSkKIHsKLSNpZm5kZWYgV0lOMzIKKyNpZm5kZWYgX1dJTjMyCiAJc3RydWN0IG5ldGVudCAqbnA7CiAKIAlpZiAoKG5wID0gZ2V0bmV0YnluYW1lKG5hbWUpKSAhPSBOVUxMKQpAQCAtMTUwLDYgKzE3NywxNSBAQAogI2Vsc2UKIAkvKgogCSAqIFRoZXJlJ3Mgbm8gImdldG5ldGJ5bmFtZSgpIiBvbiBXaW5kb3dzLgorCSAqCisJICogWFhYIC0gSSBndWVzcyB3ZSBjb3VsZCB1c2UgdGhlIEJTRCBjb2RlIHRvIHJlYWQKKwkgKiBDOlxXaW5kb3dzXFN5c3RlbTMyXGRyaXZlcnNcZXRjL25ldHdvcmtzLCBhc3N1bWluZworCSAqIHRoYXQncyBpdHMgaG9tZSBvbiBhbGwgdGhlIHZlcnNpb25zIG9mIFdpbmRvd3MKKwkgKiB3ZSB1c2UsIGJ1dCB0aGF0IGZpbGUgcHJvYmFibHkganVzdCBoYXMgdGhlIGxvb3BiYWNrCisJICogbmV0d29yayBvbiAxMjcvMjQgb24gOTkgNDQvMTAwJSBvZiBXaW5kb3dzIG1hY2hpbmVzLgorCSAqCisJICogKEhlY2ssIHRoZXNlIGRheXMgaXQgcHJvYmFibHkganVzdCBoYXMgdGhhdCBvbiA5OSA0NC8xMDAlCisJICogb2YgKlVOKlgqIG1hY2hpbmVzLikKIAkgKi8KIAlyZXR1cm4gMDsKICNlbmRpZgpAQCAtMjc0LDggKzMxMCwxNCBAQAogCXVfc2hvcnQgcDsKIH07CiAKLS8qIFN0YXRpYyBkYXRhIGJhc2Ugb2YgZXRoZXIgcHJvdG9jb2wgdHlwZXMuICovCi1zdHJ1Y3QgZXByb3RvIGVwcm90b19kYltdID0geworLyoKKyAqIFN0YXRpYyBkYXRhIGJhc2Ugb2YgZXRoZXIgcHJvdG9jb2wgdHlwZXMuCisgKiB0Y3BkdW1wIHVzZWQgdG8gaW1wb3J0IHRoaXMsIGFuZCBpdCdzIGRlY2xhcmVkIGFzIGFuIGV4cG9ydCBvbgorICogRGViaWFuLCBhdCBsZWFzdCwgc28gbWFrZSBpdCBhIHB1YmxpYyBzeW1ib2wsIGV2ZW4gdGhvdWdoIHdlCisgKiBkb24ndCBvZmZpY2lhbGx5IGV4cG9ydCBpdCBieSBkZWNsYXJpbmcgaXQgaW4gYSBoZWFkZXIgZmlsZS4KKyAqIChQcm9ncmFtcyAqc2hvdWxkKiBkbyB0aGlzIHRoZW1zZWx2ZXMsIGFzIHRjcGR1bXAgbm93IGRvZXMuKQorICovCitQQ0FQX0FQSV9ERUYgc3RydWN0IGVwcm90byBlcHJvdG9fZGJbXSA9IHsKIAl7ICJwdXAiLCBFVEhFUlRZUEVfUFVQIH0sCiAJeyAieG5zIiwgRVRIRVJUWVBFX05TIH0sCiAJeyAiaXAiLCBFVEhFUlRZUEVfSVAgfSwKQEAgLTM4Myw3ICs0MjUsNyBAQAogCXVfaW50IG5vZGUsIGFyZWE7CiAKIAlpZiAoc3NjYW5mKHMsICIlZC4lZCIsICZhcmVhLCAmbm9kZSkgIT0gMikKLQkJYnBmX2Vycm9yKCJtYWxmb3JtZWQgZGVjbmV0IGFkZHJlc3MgJyVzJyIsIHMpOworCQlyZXR1cm4oMCk7CiAKIAkqYWRkciA9IChhcmVhIDw8IEFSRUFTSElGVCkgJiBBUkVBTUFTSzsKIAkqYWRkciB8PSAobm9kZSAmIE5PREVNQVNLKTsKQEAgLTQ4NywyMyArNTI5LDIwIEBACiB9CiAjZW5kaWYKIAotdV9zaG9ydAotX19wY2FwX25hbWV0b2RuYWRkcihjb25zdCBjaGFyICpuYW1lKQoraW50CitfX3BjYXBfbmFtZXRvZG5hZGRyKGNvbnN0IGNoYXIgKm5hbWUsIHVfc2hvcnQgKnJlcykKIHsKICNpZmRlZglERUNORVRMSUIKIAlzdHJ1Y3Qgbm9kZWVudCAqZ2V0bm9kZWJ5bmFtZSgpOwogCXN0cnVjdCBub2RlZW50ICpuZXA7Ci0JdW5zaWduZWQgc2hvcnQgcmVzOwogCiAJbmVwID0gZ2V0bm9kZWJ5bmFtZShuYW1lKTsKIAlpZiAobmVwID09ICgoc3RydWN0IG5vZGVlbnQgKikwKSkKLQkJYnBmX2Vycm9yKCJ1bmtub3duIGRlY25ldCBob3N0IG5hbWUgJyVzJ1xuIiwgbmFtZSk7CisJCXJldHVybigwKTsKIAotCW1lbWNweSgoY2hhciAqKSZyZXMsIChjaGFyICopbmVwLT5uX2FkZHIsIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwotCXJldHVybihyZXMpOworCW1lbWNweSgoY2hhciAqKXJlcywgKGNoYXIgKiluZXAtPm5fYWRkciwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisJcmV0dXJuKDEpOwogI2Vsc2UKLQlicGZfZXJyb3IoImRlY25ldCBuYW1lIHN1cHBvcnQgbm90IGluY2x1ZGVkLCAnJXMnIGNhbm5vdCBiZSB0cmFuc2xhdGVkXG4iLAotCQluYW1lKTsKIAlyZXR1cm4oMCk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2ZhZC1udWxsLmMgYi9uYW1ldG9hZGRyLmgKc2ltaWxhcml0eSBpbmRleCA3MCUKcmVuYW1lIGZyb20gZmFkLW51bGwuYwpyZW5hbWUgdG8gbmFtZXRvYWRkci5oCmluZGV4IGNlY2ZiY2IuLmZkNmI3ZTEgMTAwNjQ0Ci0tLSBhL2ZhZC1udWxsLmMKKysrIGIvbmFtZXRvYWRkci5oCkBAIC0xLDYgKzEsNSBAQAotLyogLSotIE1vZGU6IGM7IHRhYi13aWR0aDogODsgaW5kZW50LXRhYnMtbW9kZTogMTsgYy1iYXNpYy1vZmZzZXQ6IDg7IC0qLSAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OAorICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2CiAgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMyLDI5ICszMSwxOCBAQAogICogU1VDSCBEQU1BR0UuCiAgKi8KIAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotI2luY2x1ZGUgPHBjYXAuaD4KLQogLyoKLSAqIEdldCBhIGxpc3Qgb2YgYWxsIGludGVyZmFjZXMgdGhhdCBhcmUgdXAgYW5kIHRoYXQgd2UgY2FuIG9wZW4uCi0gKiBSZXR1cm5zIC0xIG9uIGVycm9yLCAwIG90aGVyd2lzZS4KLSAqIFRoZSBsaXN0LCBhcyByZXR1cm5lZCB0aHJvdWdoICJhbGxkZXZzcCIsIG1heSBiZSBudWxsIGlmIG5vIGludGVyZmFjZXMKLSAqIHdlcmUgdXAgYW5kIGNvdWxkIGJlIG9wZW5lZC4KLSAqCi0gKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIG9uIHBsYXRmb3JtcyB0aGF0IGhhdmUgbm8gc3VwcG9ydCBmb3IKLSAqIHBhY2tldCBjYXB0dXJlLgorICogUm91dGluZXMgdXNlZCBmb3IgbmFtZS1vci1hZGRyZXNzLXN0cmluZy10by1hZGRyZXNzIHJlc29sdXRpb24KKyAqIHRoYXQgYXJlICpub3QqIGV4cG9ydGVkIHRvIGNvZGUgdXNpbmcgbGlicGNhcC4KICAqLwotaW50Ci1wY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKLXsKLQkvKgotCSAqIFN1Y2NlZWQsIGJ1dCBkb24ndCByZXR1cm4gYW55IGludGVyZmFjZXM7IHdlIHJldHVybiBvbmx5IHRob3NlCi0JICogd2UgY2FuIG9wZW4sIGFuZCB3ZSBjYW4ndCBvcGVuIGFueSBpZiB0aGVyZSdzIG5vIHN1cHBvcnQKLQkgKiBmb3IgcGFja2V0IGNhcHR1cmUuCi0JICovCi0JKmFsbGRldnNwID0gTlVMTDsKLQlyZXR1cm4gKDApOworaW50IF9fcGNhcF9hdG9kbihjb25zdCBjaGFyICosIGJwZl91X2ludDMyICopOworaW50IF9fcGNhcF9hdG9pbihjb25zdCBjaGFyICosIGJwZl91X2ludDMyICopOworaW50IF9fcGNhcF9uYW1ldG9kbmFkZHIoY29uc3QgY2hhciAqLCB1X3Nob3J0ICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0IGIvbmV0Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmIzZWFjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQKQEAgLTAsMCArMSBAQAorLi9icGYvbmV0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3B0aW1pemUuYyBiL29wdGltaXplLmMKaW5kZXggYWRhMjAxOS4uMTk5ODBkYyAxMDA2NDQKLS0tIGEvb3B0aW1pemUuYworKysgYi9vcHRpbWl6ZS5jCkBAIC0yNSw5ICsyNSw5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKIAotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCiAjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KLSNlbHNlIC8qIFdJTjMyICovCisjZWxzZSAvKiBfV0lOMzIgKi8KICNpZiBIQVZFX0lOVFRZUEVTX0gKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2VsaWYgSEFWRV9TVERJTlRfSApAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIF9XSU4zMiAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTU1LDcgKzU1LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQkRFQlVHCi1leHRlcm4gaW50IGRmbGFnOworaW50IHBjYXBfb3B0aW1pemVyX2RlYnVnOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKE1TRE9TKSAmJiAhZGVmaW5lZChfX0RKR1BQX18pCkBAIC02Myw4ICs2MywyNiBAQAogI2RlZmluZSBmZnMgX3czMl9mZnMKICNlbmRpZgogCi0jaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZCAoX01TQ19WRVIpCi1pbnQgZmZzKGludCBtYXNrKTsKKy8qCisgKiBTbyBpcyB0aGUgY2hlY2sgZm9yIF9NU0NfVkVSIGRvbmUgYmVjYXVzZSBNaW5HVyBoYXMgdGhpcz8KKyAqLworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkIChfTVNDX1ZFUikKKy8qCisgKiBmZnMgLS0gdmF4IGZmcyBpbnN0cnVjdGlvbgorICoKKyAqIFhYWCAtIHdpdGggdmVyc2lvbnMgb2YgVlMgdGhhdCBoYXZlIGl0LCB1c2UgX0JpdFNjYW5Gb3J3YXJkKCk/CisgKi8KK3N0YXRpYyBpbnQKK2ZmcyhpbnQgbWFzaykKK3sKKwlpbnQgYml0OworCisJaWYgKG1hc2sgPT0gMCkKKwkJcmV0dXJuKDApOworCWZvciAoYml0ID0gMTsgIShtYXNrICYgMSk7IGJpdCsrKQorCQltYXNrID4+PSAxOworCXJldHVybihiaXQpOworfQogI2VuZGlmCiAKIC8qCkBAIC04OSw0NSArMTA3LDQ4IEBACiAjZGVmaW5lIEFYX0FUT00gTl9BVE9NUwogCiAvKgotICogQSBmbGFnIHRvIGluZGljYXRlIHRoYXQgZnVydGhlciBvcHRpbWl6YXRpb24gaXMgbmVlZGVkLgotICogSXRlcmF0aXZlIHBhc3NlcyBhcmUgY29udGludWVkIHVudGlsIGEgZ2l2ZW4gcGFzcyB5aWVsZHMgbm8KLSAqIGJyYW5jaCBtb3ZlbWVudC4KKyAqIFRoZXNlIGRhdGEgc3RydWN0dXJlcyBhcmUgdXNlZCBpbiBhIENvY2tlIGFuZCBTaHdhcnogc3R5bGUKKyAqIHZhbHVlIG51bWJlcmluZyBzY2hlbWUuICBTaW5jZSB0aGUgZmxvd2dyYXBoIGlzIGFjeWNsaWMsCisgKiBleGl0IHZhbHVlcyBjYW4gYmUgcHJvcGFnYXRlZCBmcm9tIGEgbm9kZSdzIHByZWRlY2Vzc29ycworICogcHJvdmlkZWQgaXQgaXMgdW5pcXVlbHkgZGVmaW5lZC4KICAqLwotc3RhdGljIGludCBkb25lOworc3RydWN0IHZhbG5vZGUgeworCWludCBjb2RlOworCWludCB2MCwgdjE7CisJaW50IHZhbDsKKwlzdHJ1Y3QgdmFsbm9kZSAqbmV4dDsKK307CiAKLS8qCi0gKiBBIGJsb2NrIGlzIG1hcmtlZCBpZiBvbmx5IGlmIGl0cyBtYXJrIGVxdWFscyB0aGUgY3VycmVudCBtYXJrLgotICogUmF0aGVyIHRoYW4gdHJhdmVyc2UgdGhlIGNvZGUgYXJyYXksIG1hcmtpbmcgZWFjaCBpdGVtLCAnY3VyX21hcmsnIGlzCi0gKiBpbmNyZW1lbnRlZC4gIFRoaXMgYXV0b21hdGljYWxseSBtYWtlcyBlYWNoIGVsZW1lbnQgdW5tYXJrZWQuCi0gKi8KLXN0YXRpYyBpbnQgY3VyX21hcms7Ci0jZGVmaW5lIGlzTWFya2VkKHApICgocCktPm1hcmsgPT0gY3VyX21hcmspCi0jZGVmaW5lIHVuTWFya0FsbCgpIGN1cl9tYXJrICs9IDEKLSNkZWZpbmUgTWFyayhwKSAoKHApLT5tYXJrID0gY3VyX21hcmspCisvKiBJbnRlZ2VyIGNvbnN0YW50cyBtYXBwZWQgd2l0aCB0aGUgbG9hZCBpbW1lZGlhdGUgb3Bjb2RlLiAqLworI2RlZmluZSBLKGkpIEYob3B0X3N0YXRlLCBCUEZfTER8QlBGX0lNTXxCUEZfVywgaSwgMEwpCiAKLXN0YXRpYyB2b2lkIG9wdF9pbml0KHN0cnVjdCBibG9jayAqKTsKLXN0YXRpYyB2b2lkIG9wdF9jbGVhbnVwKHZvaWQpOworc3RydWN0IHZtYXBpbmZvIHsKKwlpbnQgaXNfY29uc3Q7CisJYnBmX2ludDMyIGNvbnN0X3ZhbDsKK307CiAKLXN0YXRpYyB2b2lkIGludGVybl9ibG9ja3Moc3RydWN0IGJsb2NrICopOworc3RydWN0IF9vcHRfc3RhdGUgeworCS8qCisJICogQSBmbGFnIHRvIGluZGljYXRlIHRoYXQgZnVydGhlciBvcHRpbWl6YXRpb24gaXMgbmVlZGVkLgorCSAqIEl0ZXJhdGl2ZSBwYXNzZXMgYXJlIGNvbnRpbnVlZCB1bnRpbCBhIGdpdmVuIHBhc3MgeWllbGRzIG5vCisJICogYnJhbmNoIG1vdmVtZW50LgorCSAqLworCWludCBkb25lOwogCi1zdGF0aWMgdm9pZCBmaW5kX2luZWRnZXMoc3RydWN0IGJsb2NrICopOwotI2lmZGVmIEJERUJVRwotc3RhdGljIHZvaWQgb3B0X2R1bXAoc3RydWN0IGJsb2NrICopOwotI2VuZGlmCisJaW50IG5fYmxvY2tzOworCXN0cnVjdCBibG9jayAqKmJsb2NrczsKKwlpbnQgbl9lZGdlczsKKwlzdHJ1Y3QgZWRnZSAqKmVkZ2VzOwogCi1zdGF0aWMgaW50IG5fYmxvY2tzOwotc3RydWN0IGJsb2NrICoqYmxvY2tzOwotc3RhdGljIGludCBuX2VkZ2VzOwotc3RydWN0IGVkZ2UgKiplZGdlczsKKwkvKgorCSAqIEEgYml0IHZlY3RvciBzZXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRvbWluYXRvcnMuCisJICogV2Ugcm91bmQgdXAgdGhlIHNldCBzaXplIHRvIHRoZSBuZXh0IHBvd2VyIG9mIHR3by4KKwkgKi8KKwlpbnQgbm9kZXdvcmRzOworCWludCBlZGdld29yZHM7CisJc3RydWN0IGJsb2NrICoqbGV2ZWxzOworCWJwZl91X2ludDMyICpzcGFjZTsKIAotLyoKLSAqIEEgYml0IHZlY3RvciBzZXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRvbWluYXRvcnMuCi0gKiBXZSByb3VuZCB1cCB0aGUgc2V0IHNpemUgdG8gdGhlIG5leHQgcG93ZXIgb2YgdHdvLgotICovCi1zdGF0aWMgaW50IG5vZGV3b3JkczsKLXN0YXRpYyBpbnQgZWRnZXdvcmRzOwotc3RydWN0IGJsb2NrICoqbGV2ZWxzOwotYnBmX3VfaW50MzIgKnNwYWNlOwogI2RlZmluZSBCSVRTX1BFUl9XT1JEICg4KnNpemVvZihicGZfdV9pbnQzMikpCiAvKgogICogVHJ1ZSBpZiBhIGlzIGluIHVzZXQge3B9CkBAIC0xNzcsNDggKzE5OCw3OSBAQAogCXdoaWxlICgtLV9uID49IDApICpfeCsrIHw9ICpfeSsrO1wKIH0KIAotc3RhdGljIHVzZXQgYWxsX2RvbV9zZXRzOwotc3RhdGljIHVzZXQgYWxsX2Nsb3N1cmVfc2V0czsKLXN0YXRpYyB1c2V0IGFsbF9lZGdlX3NldHM7CisJdXNldCBhbGxfZG9tX3NldHM7CisJdXNldCBhbGxfY2xvc3VyZV9zZXRzOworCXVzZXQgYWxsX2VkZ2Vfc2V0czsKKworI2RlZmluZSBNT0RVTFVTIDIxMworCXN0cnVjdCB2YWxub2RlICpoYXNodGJsW01PRFVMVVNdOworCWludCBjdXJ2YWw7CisJaW50IG1heHZhbDsKKworCXN0cnVjdCB2bWFwaW5mbyAqdm1hcDsKKwlzdHJ1Y3QgdmFsbm9kZSAqdm5vZGVfYmFzZTsKKwlzdHJ1Y3QgdmFsbm9kZSAqbmV4dF92bm9kZTsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIFNvbWUgcG9pbnRlcnMgdXNlZCB0byBjb252ZXJ0IHRoZSBiYXNpYyBibG9jayBmb3JtIG9mIHRoZSBjb2RlLAorCSAqIGludG8gdGhlIGFycmF5IGZvcm0gdGhhdCBCUEYgcmVxdWlyZXMuICAnZnN0YXJ0JyB3aWxsIHBvaW50IHRvCisJICogdGhlIG1hbGxvYydkIGFycmF5IHdoaWxlICdmdGFpbCcgaXMgdXNlZCBkdXJpbmcgdGhlIHJlY3Vyc2l2ZQorCSAqIHRyYXZlcnNhbC4KKwkgKi8KKwlzdHJ1Y3QgYnBmX2luc24gKmZzdGFydDsKKwlzdHJ1Y3QgYnBmX2luc24gKmZ0YWlsOworfSBjb252X3N0YXRlX3Q7CisKK3N0YXRpYyB2b2lkIG9wdF9pbml0KGNvbXBpbGVyX3N0YXRlX3QgKiwgb3B0X3N0YXRlX3QgKiwgc3RydWN0IGljb2RlICopOworc3RhdGljIHZvaWQgb3B0X2NsZWFudXAob3B0X3N0YXRlX3QgKik7CisKK3N0YXRpYyB2b2lkIGludGVybl9ibG9ja3Mob3B0X3N0YXRlX3QgKiwgc3RydWN0IGljb2RlICopOworCitzdGF0aWMgdm9pZCBmaW5kX2luZWRnZXMob3B0X3N0YXRlX3QgKiwgc3RydWN0IGJsb2NrICopOworI2lmZGVmIEJERUJVRworc3RhdGljIHZvaWQgb3B0X2R1bXAoY29tcGlsZXJfc3RhdGVfdCAqLCBzdHJ1Y3QgaWNvZGUgKik7CisjZW5kaWYKIAogI2lmbmRlZiBNQVgKICNkZWZpbmUgTUFYKGEsYikgKChhKT4oYik/KGEpOihiKSkKICNlbmRpZgogCiBzdGF0aWMgdm9pZAotZmluZF9sZXZlbHNfcihzdHJ1Y3QgYmxvY2sgKmIpCitmaW5kX2xldmVsc19yKG9wdF9zdGF0ZV90ICpvcHRfc3RhdGUsIHN0cnVjdCBpY29kZSAqaWMsIHN0cnVjdCBibG9jayAqYikKIHsKIAlpbnQgbGV2ZWw7CiAKLQlpZiAoaXNNYXJrZWQoYikpCisJaWYgKGlzTWFya2VkKGljLCBiKSkKIAkJcmV0dXJuOwogCi0JTWFyayhiKTsKKwlNYXJrKGljLCBiKTsKIAliLT5saW5rID0gMDsKIAogCWlmIChKVChiKSkgewotCQlmaW5kX2xldmVsc19yKEpUKGIpKTsKLQkJZmluZF9sZXZlbHNfcihKRihiKSk7CisJCWZpbmRfbGV2ZWxzX3Iob3B0X3N0YXRlLCBpYywgSlQoYikpOworCQlmaW5kX2xldmVsc19yKG9wdF9zdGF0ZSwgaWMsIEpGKGIpKTsKIAkJbGV2ZWwgPSBNQVgoSlQoYiktPmxldmVsLCBKRihiKS0+bGV2ZWwpICsgMTsKIAl9IGVsc2UKIAkJbGV2ZWwgPSAwOwogCWItPmxldmVsID0gbGV2ZWw7Ci0JYi0+bGluayA9IGxldmVsc1tsZXZlbF07Ci0JbGV2ZWxzW2xldmVsXSA9IGI7CisJYi0+bGluayA9IG9wdF9zdGF0ZS0+bGV2ZWxzW2xldmVsXTsKKwlvcHRfc3RhdGUtPmxldmVsc1tsZXZlbF0gPSBiOwogfQogCiAvKgogICogTGV2ZWwgZ3JhcGguICBUaGUgbGV2ZWxzIGdvIGZyb20gMCBhdCB0aGUgbGVhdmVzIHRvCi0gKiBOX0xFVkVMUyBhdCB0aGUgcm9vdC4gIFRoZSBsZXZlbHNbXSBhcnJheSBwb2ludHMgdG8gdGhlCisgKiBOX0xFVkVMUyBhdCB0aGUgcm9vdC4gIFRoZSBvcHRfc3RhdGUtPmxldmVsc1tdIGFycmF5IHBvaW50cyB0byB0aGUKICAqIGZpcnN0IG5vZGUgb2YgdGhlIGxldmVsIGxpc3QsIHdob3NlIGVsZW1lbnRzIGFyZSBsaW5rZWQKICAqIHdpdGggdGhlICdsaW5rJyBmaWVsZCBvZiB0aGUgc3RydWN0IGJsb2NrLgogICovCiBzdGF0aWMgdm9pZAotZmluZF9sZXZlbHMoc3RydWN0IGJsb2NrICpyb290KQorZmluZF9sZXZlbHMob3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSwgc3RydWN0IGljb2RlICppYykKIHsKLQltZW1zZXQoKGNoYXIgKilsZXZlbHMsIDAsIG5fYmxvY2tzICogc2l6ZW9mKCpsZXZlbHMpKTsKLQl1bk1hcmtBbGwoKTsKLQlmaW5kX2xldmVsc19yKHJvb3QpOworCW1lbXNldCgoY2hhciAqKW9wdF9zdGF0ZS0+bGV2ZWxzLCAwLCBvcHRfc3RhdGUtPm5fYmxvY2tzICogc2l6ZW9mKCpvcHRfc3RhdGUtPmxldmVscykpOworCXVuTWFya0FsbChpYyk7CisJZmluZF9sZXZlbHNfcihvcHRfc3RhdGUsIGljLCBpYy0+cm9vdCk7CiB9CiAKIC8qCkBAIC0yMjYsNyArMjc4LDcgQEAKICAqIEFzc3VtZXMgZ3JhcGggaGFzIGJlZW4gbGV2ZWxlZC4KICAqLwogc3RhdGljIHZvaWQKLWZpbmRfZG9tKHN0cnVjdCBibG9jayAqcm9vdCkKK2ZpbmRfZG9tKG9wdF9zdGF0ZV90ICpvcHRfc3RhdGUsIHN0cnVjdCBibG9jayAqcm9vdCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgYmxvY2sgKmI7CkBAIC0yMzUsMzMgKzI4NywzMyBAQAogCS8qCiAJICogSW5pdGlhbGl6ZSBzZXRzIHRvIGNvbnRhaW4gYWxsIG5vZGVzLgogCSAqLwotCXggPSBhbGxfZG9tX3NldHM7Ci0JaSA9IG5fYmxvY2tzICogbm9kZXdvcmRzOworCXggPSBvcHRfc3RhdGUtPmFsbF9kb21fc2V0czsKKwlpID0gb3B0X3N0YXRlLT5uX2Jsb2NrcyAqIG9wdF9zdGF0ZS0+bm9kZXdvcmRzOwogCXdoaWxlICgtLWkgPj0gMCkKIAkJKngrKyA9IH4wOwogCS8qIFJvb3Qgc3RhcnRzIG9mZiBlbXB0eS4gKi8KLQlmb3IgKGkgPSBub2Rld29yZHM7IC0taSA+PSAwOykKKwlmb3IgKGkgPSBvcHRfc3RhdGUtPm5vZGV3b3JkczsgLS1pID49IDA7KQogCQlyb290LT5kb21baV0gPSAwOwogCiAJLyogcm9vdC0+bGV2ZWwgaXMgdGhlIGhpZ2hlc3QgbGV2ZWwgbm8gZm91bmQuICovCiAJZm9yIChpID0gcm9vdC0+bGV2ZWw7IGkgPj0gMDsgLS1pKSB7Ci0JCWZvciAoYiA9IGxldmVsc1tpXTsgYjsgYiA9IGItPmxpbmspIHsKKwkJZm9yIChiID0gb3B0X3N0YXRlLT5sZXZlbHNbaV07IGI7IGIgPSBiLT5saW5rKSB7CiAJCQlTRVRfSU5TRVJUKGItPmRvbSwgYi0+aWQpOwogCQkJaWYgKEpUKGIpID09IDApCiAJCQkJY29udGludWU7Ci0JCQlTRVRfSU5URVJTRUNUKEpUKGIpLT5kb20sIGItPmRvbSwgbm9kZXdvcmRzKTsKLQkJCVNFVF9JTlRFUlNFQ1QoSkYoYiktPmRvbSwgYi0+ZG9tLCBub2Rld29yZHMpOworCQkJU0VUX0lOVEVSU0VDVChKVChiKS0+ZG9tLCBiLT5kb20sIG9wdF9zdGF0ZS0+bm9kZXdvcmRzKTsKKwkJCVNFVF9JTlRFUlNFQ1QoSkYoYiktPmRvbSwgYi0+ZG9tLCBvcHRfc3RhdGUtPm5vZGV3b3Jkcyk7CiAJCX0KIAl9CiB9CiAKIHN0YXRpYyB2b2lkCi1wcm9wZWRvbShzdHJ1Y3QgZWRnZSAqZXApCitwcm9wZWRvbShvcHRfc3RhdGVfdCAqb3B0X3N0YXRlLCBzdHJ1Y3QgZWRnZSAqZXApCiB7CiAJU0VUX0lOU0VSVChlcC0+ZWRvbSwgZXAtPmlkKTsKIAlpZiAoZXAtPnN1Y2MpIHsKLQkJU0VUX0lOVEVSU0VDVChlcC0+c3VjYy0+ZXQuZWRvbSwgZXAtPmVkb20sIGVkZ2V3b3Jkcyk7Ci0JCVNFVF9JTlRFUlNFQ1QoZXAtPnN1Y2MtPmVmLmVkb20sIGVwLT5lZG9tLCBlZGdld29yZHMpOworCQlTRVRfSU5URVJTRUNUKGVwLT5zdWNjLT5ldC5lZG9tLCBlcC0+ZWRvbSwgb3B0X3N0YXRlLT5lZGdld29yZHMpOworCQlTRVRfSU5URVJTRUNUKGVwLT5zdWNjLT5lZi5lZG9tLCBlcC0+ZWRvbSwgb3B0X3N0YXRlLT5lZGdld29yZHMpOwogCX0KIH0KIApAQCAtMjcwLDIzICszMjIsMjMgQEAKICAqIEFzc3VtZXMgZ3JhcGggaGFzIGJlZW4gbGV2ZWxlZCBhbmQgcHJlZGVjZXNzb3JzIGVzdGFibGlzaGVkLgogICovCiBzdGF0aWMgdm9pZAotZmluZF9lZG9tKHN0cnVjdCBibG9jayAqcm9vdCkKK2ZpbmRfZWRvbShvcHRfc3RhdGVfdCAqb3B0X3N0YXRlLCBzdHJ1Y3QgYmxvY2sgKnJvb3QpCiB7CiAJaW50IGk7CiAJdXNldCB4OwogCXN0cnVjdCBibG9jayAqYjsKIAotCXggPSBhbGxfZWRnZV9zZXRzOwotCWZvciAoaSA9IG5fZWRnZXMgKiBlZGdld29yZHM7IC0taSA+PSAwOyApCisJeCA9IG9wdF9zdGF0ZS0+YWxsX2VkZ2Vfc2V0czsKKwlmb3IgKGkgPSBvcHRfc3RhdGUtPm5fZWRnZXMgKiBvcHRfc3RhdGUtPmVkZ2V3b3JkczsgLS1pID49IDA7ICkKIAkJeFtpXSA9IH4wOwogCiAJLyogcm9vdC0+bGV2ZWwgaXMgdGhlIGhpZ2hlc3QgbGV2ZWwgbm8gZm91bmQuICovCi0JbWVtc2V0KHJvb3QtPmV0LmVkb20sIDAsIGVkZ2V3b3JkcyAqIHNpemVvZigqKHVzZXQpMCkpOwotCW1lbXNldChyb290LT5lZi5lZG9tLCAwLCBlZGdld29yZHMgKiBzaXplb2YoKih1c2V0KTApKTsKKwltZW1zZXQocm9vdC0+ZXQuZWRvbSwgMCwgb3B0X3N0YXRlLT5lZGdld29yZHMgKiBzaXplb2YoKih1c2V0KTApKTsKKwltZW1zZXQocm9vdC0+ZWYuZWRvbSwgMCwgb3B0X3N0YXRlLT5lZGdld29yZHMgKiBzaXplb2YoKih1c2V0KTApKTsKIAlmb3IgKGkgPSByb290LT5sZXZlbDsgaSA+PSAwOyAtLWkpIHsKLQkJZm9yIChiID0gbGV2ZWxzW2ldOyBiICE9IDA7IGIgPSBiLT5saW5rKSB7Ci0JCQlwcm9wZWRvbSgmYi0+ZXQpOwotCQkJcHJvcGVkb20oJmItPmVmKTsKKwkJZm9yIChiID0gb3B0X3N0YXRlLT5sZXZlbHNbaV07IGIgIT0gMDsgYiA9IGItPmxpbmspIHsKKwkJCXByb3BlZG9tKG9wdF9zdGF0ZSwgJmItPmV0KTsKKwkJCXByb3BlZG9tKG9wdF9zdGF0ZSwgJmItPmVmKTsKIAkJfQogCX0KIH0KQEAgLTI5OSw3ICszNTEsNyBAQAogICogQXNzdW1lcyBncmFwaCBoYXMgYmVlbiBsZXZlbGVkLgogICovCiBzdGF0aWMgdm9pZAotZmluZF9jbG9zdXJlKHN0cnVjdCBibG9jayAqcm9vdCkKK2ZpbmRfY2xvc3VyZShvcHRfc3RhdGVfdCAqb3B0X3N0YXRlLCBzdHJ1Y3QgYmxvY2sgKnJvb3QpCiB7CiAJaW50IGk7CiAJc3RydWN0IGJsb2NrICpiOwpAQCAtMzA3LDE3ICszNTksMTcgQEAKIAkvKgogCSAqIEluaXRpYWxpemUgc2V0cyB0byBjb250YWluIG5vIG5vZGVzLgogCSAqLwotCW1lbXNldCgoY2hhciAqKWFsbF9jbG9zdXJlX3NldHMsIDAsCi0JICAgICAgbl9ibG9ja3MgKiBub2Rld29yZHMgKiBzaXplb2YoKmFsbF9jbG9zdXJlX3NldHMpKTsKKwltZW1zZXQoKGNoYXIgKilvcHRfc3RhdGUtPmFsbF9jbG9zdXJlX3NldHMsIDAsCisJICAgICAgb3B0X3N0YXRlLT5uX2Jsb2NrcyAqIG9wdF9zdGF0ZS0+bm9kZXdvcmRzICogc2l6ZW9mKCpvcHRfc3RhdGUtPmFsbF9jbG9zdXJlX3NldHMpKTsKIAogCS8qIHJvb3QtPmxldmVsIGlzIHRoZSBoaWdoZXN0IGxldmVsIG5vIGZvdW5kLiAqLwogCWZvciAoaSA9IHJvb3QtPmxldmVsOyBpID49IDA7IC0taSkgewotCQlmb3IgKGIgPSBsZXZlbHNbaV07IGI7IGIgPSBiLT5saW5rKSB7CisJCWZvciAoYiA9IG9wdF9zdGF0ZS0+bGV2ZWxzW2ldOyBiOyBiID0gYi0+bGluaykgewogCQkJU0VUX0lOU0VSVChiLT5jbG9zdXJlLCBiLT5pZCk7CiAJCQlpZiAoSlQoYikgPT0gMCkKIAkJCQljb250aW51ZTsKLQkJCVNFVF9VTklPTihKVChiKS0+Y2xvc3VyZSwgYi0+Y2xvc3VyZSwgbm9kZXdvcmRzKTsKLQkJCVNFVF9VTklPTihKRihiKS0+Y2xvc3VyZSwgYi0+Y2xvc3VyZSwgbm9kZXdvcmRzKTsKKwkJCVNFVF9VTklPTihKVChiKS0+Y2xvc3VyZSwgYi0+Y2xvc3VyZSwgb3B0X3N0YXRlLT5ub2Rld29yZHMpOworCQkJU0VUX1VOSU9OKEpGKGIpLT5jbG9zdXJlLCBiLT5jbG9zdXJlLCBvcHRfc3RhdGUtPm5vZGV3b3Jkcyk7CiAJCX0KIAl9CiB9CkBAIC00MTMsNyArNDY1LDcgQEAKIGNvbXB1dGVfbG9jYWxfdWQoc3RydWN0IGJsb2NrICpiKQogewogCXN0cnVjdCBzbGlzdCAqczsKLQlhdG9tc2V0IGRlZiA9IDAsIHVzZSA9IDAsIGtpbGwgPSAwOworCWF0b21zZXQgZGVmID0gMCwgdXNlID0gMCwga2lsbGVkID0gMDsKIAlpbnQgYXRvbTsKIAogCWZvciAocyA9IGItPnN0bXRzOyBzOyBzID0gcy0+bmV4dCkgewpAQCAtNDM3LDcgKzQ4OSw3IEBACiAJCWF0b20gPSBhdG9tZGVmKCZzLT5zKTsKIAkJaWYgKGF0b20gPj0gMCkgewogCQkJaWYgKCFBVE9NRUxFTSh1c2UsIGF0b20pKQotCQkJCWtpbGwgfD0gQVRPTU1BU0soYXRvbSk7CisJCQkJa2lsbGVkIHw9IEFUT01NQVNLKGF0b20pOwogCQkJZGVmIHw9IEFUT01NQVNLKGF0b20pOwogCQl9CiAJfQpAQCAtNDYzLDcgKzUxNSw3IEBACiAJfQogCiAJYi0+ZGVmID0gZGVmOwotCWItPmtpbGwgPSBraWxsOworCWItPmtpbGwgPSBraWxsZWQ7CiAJYi0+aW5fdXNlID0gdXNlOwogfQogCkBAIC00NzEsNyArNTIzLDcgQEAKICAqIEFzc3VtZSBncmFwaCBpcyBhbHJlYWR5IGxldmVsZWQuCiAgKi8KIHN0YXRpYyB2b2lkCi1maW5kX3VkKHN0cnVjdCBibG9jayAqcm9vdCkKK2ZpbmRfdWQob3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSwgc3RydWN0IGJsb2NrICpyb290KQogewogCWludCBpLCBtYXhsZXZlbDsKIAlzdHJ1Y3QgYmxvY2sgKnA7CkBAIC00ODIsNjEgKzUzNCwzMCBAQAogCSAqLwogCW1heGxldmVsID0gcm9vdC0+bGV2ZWw7CiAJZm9yIChpID0gbWF4bGV2ZWw7IGkgPj0gMDsgLS1pKQotCQlmb3IgKHAgPSBsZXZlbHNbaV07IHA7IHAgPSBwLT5saW5rKSB7CisJCWZvciAocCA9IG9wdF9zdGF0ZS0+bGV2ZWxzW2ldOyBwOyBwID0gcC0+bGluaykgewogCQkJY29tcHV0ZV9sb2NhbF91ZChwKTsKIAkJCXAtPm91dF91c2UgPSAwOwogCQl9CiAKIAlmb3IgKGkgPSAxOyBpIDw9IG1heGxldmVsOyArK2kpIHsKLQkJZm9yIChwID0gbGV2ZWxzW2ldOyBwOyBwID0gcC0+bGluaykgeworCQlmb3IgKHAgPSBvcHRfc3RhdGUtPmxldmVsc1tpXTsgcDsgcCA9IHAtPmxpbmspIHsKIAkJCXAtPm91dF91c2UgfD0gSlQocCktPmluX3VzZSB8IEpGKHApLT5pbl91c2U7CiAJCQlwLT5pbl91c2UgfD0gcC0+b3V0X3VzZSAmfiBwLT5raWxsOwogCQl9CiAJfQogfQotCi0vKgotICogVGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGluIGEgQ29ja2UgYW5kIFNod2FyeiBzdHlsZQotICogdmFsdWUgbnVtYmVyaW5nIHNjaGVtZS4gIFNpbmNlIHRoZSBmbG93Z3JhcGggaXMgYWN5Y2xpYywKLSAqIGV4aXQgdmFsdWVzIGNhbiBiZSBwcm9wYWdhdGVkIGZyb20gYSBub2RlJ3MgcHJlZGVjZXNzb3JzCi0gKiBwcm92aWRlZCBpdCBpcyB1bmlxdWVseSBkZWZpbmVkLgotICovCi1zdHJ1Y3QgdmFsbm9kZSB7Ci0JaW50IGNvZGU7Ci0JaW50IHYwLCB2MTsKLQlpbnQgdmFsOwotCXN0cnVjdCB2YWxub2RlICpuZXh0OwotfTsKLQotI2RlZmluZSBNT0RVTFVTIDIxMwotc3RhdGljIHN0cnVjdCB2YWxub2RlICpoYXNodGJsW01PRFVMVVNdOwotc3RhdGljIGludCBjdXJ2YWw7Ci1zdGF0aWMgaW50IG1heHZhbDsKLQotLyogSW50ZWdlciBjb25zdGFudHMgbWFwcGVkIHdpdGggdGhlIGxvYWQgaW1tZWRpYXRlIG9wY29kZS4gKi8KLSNkZWZpbmUgSyhpKSBGKEJQRl9MRHxCUEZfSU1NfEJQRl9XLCBpLCAwTCkKLQotc3RydWN0IHZtYXBpbmZvIHsKLQlpbnQgaXNfY29uc3Q7Ci0JYnBmX2ludDMyIGNvbnN0X3ZhbDsKLX07Ci0KLXN0cnVjdCB2bWFwaW5mbyAqdm1hcDsKLXN0cnVjdCB2YWxub2RlICp2bm9kZV9iYXNlOwotc3RydWN0IHZhbG5vZGUgKm5leHRfdm5vZGU7Ci0KIHN0YXRpYyB2b2lkCi1pbml0X3ZhbCh2b2lkKQoraW5pdF92YWwob3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSkKIHsKLQljdXJ2YWwgPSAwOwotCW5leHRfdm5vZGUgPSB2bm9kZV9iYXNlOwotCW1lbXNldCgoY2hhciAqKXZtYXAsIDAsIG1heHZhbCAqIHNpemVvZigqdm1hcCkpOwotCW1lbXNldCgoY2hhciAqKWhhc2h0YmwsIDAsIHNpemVvZiBoYXNodGJsKTsKKwlvcHRfc3RhdGUtPmN1cnZhbCA9IDA7CisJb3B0X3N0YXRlLT5uZXh0X3Zub2RlID0gb3B0X3N0YXRlLT52bm9kZV9iYXNlOworCW1lbXNldCgoY2hhciAqKW9wdF9zdGF0ZS0+dm1hcCwgMCwgb3B0X3N0YXRlLT5tYXh2YWwgKiBzaXplb2YoKm9wdF9zdGF0ZS0+dm1hcCkpOworCW1lbXNldCgoY2hhciAqKW9wdF9zdGF0ZS0+aGFzaHRibCwgMCwgc2l6ZW9mIG9wdF9zdGF0ZS0+aGFzaHRibCk7CiB9CiAKIC8qIEJlY2F1c2Ugd2UgcmVhbGx5IGRvbid0IGhhdmUgYW4gSVIsIHRoaXMgc3R1ZmYgaXMgYSBsaXR0bGUgbWVzc3kuICovCiBzdGF0aWMgaW50Ci1GKGludCBjb2RlLCBpbnQgdjAsIGludCB2MSkKK0Yob3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSwgaW50IGNvZGUsIGludCB2MCwgaW50IHYxKQogewogCXVfaW50IGhhc2g7CiAJaW50IHZhbDsKQEAgLTU0NSwyMyArNTY2LDIzIEBACiAJaGFzaCA9ICh1X2ludCljb2RlIF4gKHYwIDw8IDQpIF4gKHYxIDw8IDgpOwogCWhhc2ggJT0gTU9EVUxVUzsKIAotCWZvciAocCA9IGhhc2h0YmxbaGFzaF07IHA7IHAgPSBwLT5uZXh0KQorCWZvciAocCA9IG9wdF9zdGF0ZS0+aGFzaHRibFtoYXNoXTsgcDsgcCA9IHAtPm5leHQpCiAJCWlmIChwLT5jb2RlID09IGNvZGUgJiYgcC0+djAgPT0gdjAgJiYgcC0+djEgPT0gdjEpCiAJCQlyZXR1cm4gcC0+dmFsOwogCi0JdmFsID0gKytjdXJ2YWw7CisJdmFsID0gKytvcHRfc3RhdGUtPmN1cnZhbDsKIAlpZiAoQlBGX01PREUoY29kZSkgPT0gQlBGX0lNTSAmJgogCSAgICAoQlBGX0NMQVNTKGNvZGUpID09IEJQRl9MRCB8fCBCUEZfQ0xBU1MoY29kZSkgPT0gQlBGX0xEWCkpIHsKLQkJdm1hcFt2YWxdLmNvbnN0X3ZhbCA9IHYwOwotCQl2bWFwW3ZhbF0uaXNfY29uc3QgPSAxOworCQlvcHRfc3RhdGUtPnZtYXBbdmFsXS5jb25zdF92YWwgPSB2MDsKKwkJb3B0X3N0YXRlLT52bWFwW3ZhbF0uaXNfY29uc3QgPSAxOwogCX0KLQlwID0gbmV4dF92bm9kZSsrOworCXAgPSBvcHRfc3RhdGUtPm5leHRfdm5vZGUrKzsKIAlwLT52YWwgPSB2YWw7CiAJcC0+Y29kZSA9IGNvZGU7CiAJcC0+djAgPSB2MDsKIAlwLT52MSA9IHYxOwotCXAtPm5leHQgPSBoYXNodGJsW2hhc2hdOwotCWhhc2h0YmxbaGFzaF0gPSBwOworCXAtPm5leHQgPSBvcHRfc3RhdGUtPmhhc2h0YmxbaGFzaF07CisJb3B0X3N0YXRlLT5oYXNodGJsW2hhc2hdID0gcDsKIAogCXJldHVybiB2YWw7CiB9CkBAIC01ODAsMTIgKzYwMSwxMyBAQAogICogKFVuYXJ5IG9wZXJhdG9ycyBhcmUgaGFuZGxlZCBlbHNld2hlcmUuKQogICovCiBzdGF0aWMgdm9pZAotZm9sZF9vcChzdHJ1Y3Qgc3RtdCAqcywgaW50IHYwLCBpbnQgdjEpCitmb2xkX29wKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgc3RydWN0IGljb2RlICppYywgb3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSwKKyAgICBzdHJ1Y3Qgc3RtdCAqcywgaW50IHYwLCBpbnQgdjEpCiB7CiAJYnBmX3VfaW50MzIgYSwgYjsKIAotCWEgPSB2bWFwW3YwXS5jb25zdF92YWw7Ci0JYiA9IHZtYXBbdjFdLmNvbnN0X3ZhbDsKKwlhID0gb3B0X3N0YXRlLT52bWFwW3YwXS5jb25zdF92YWw7CisJYiA9IG9wdF9zdGF0ZS0+dm1hcFt2MV0uY29uc3RfdmFsOwogCiAJc3dpdGNoIChCUEZfT1Aocy0+Y29kZSkpIHsKIAljYXNlIEJQRl9BREQ6CkBAIC02MDIsMTMgKzYyNCwxMyBAQAogCiAJY2FzZSBCUEZfRElWOgogCQlpZiAoYiA9PSAwKQotCQkJYnBmX2Vycm9yKCJkaXZpc2lvbiBieSB6ZXJvIik7CisJCQlicGZfZXJyb3IoY3N0YXRlLCAiZGl2aXNpb24gYnkgemVybyIpOwogCQlhIC89IGI7CiAJCWJyZWFrOwogCiAJY2FzZSBCUEZfTU9EOgogCQlpZiAoYiA9PSAwKQotCQkJYnBmX2Vycm9yKCJtb2R1bHVzIGJ5IHplcm8iKTsKKwkJCWJwZl9lcnJvcihjc3RhdGUsICJtb2R1bHVzIGJ5IHplcm8iKTsKIAkJYSAlPSBiOwogCQlicmVhazsKIApAQCAtNjM3LDcgKzY1OSw3IEBACiAJfQogCXMtPmsgPSBhOwogCXMtPmNvZGUgPSBCUEZfTER8QlBGX0lNTTsKLQlkb25lID0gMDsKKwlvcHRfc3RhdGUtPmRvbmUgPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzbGlzdCAqCkBAIC02NTgsNyArNjgwLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW9wdF9wZWVwKHN0cnVjdCBibG9jayAqYikKK29wdF9wZWVwKG9wdF9zdGF0ZV90ICpvcHRfc3RhdGUsIHN0cnVjdCBibG9jayAqYikKIHsKIAlzdHJ1Y3Qgc2xpc3QgKnM7CiAJc3RydWN0IHNsaXN0ICpuZXh0LCAqbGFzdDsKQEAgLTY5Myw3ICs3MTUsNyBAQAogCQlpZiAocy0+cy5jb2RlID09IEJQRl9TVCAmJgogCQkgICAgbmV4dC0+cy5jb2RlID09IChCUEZfTERYfEJQRl9NRU0pICYmCiAJCSAgICBzLT5zLmsgPT0gbmV4dC0+cy5rKSB7Ci0JCQlkb25lID0gMDsKKwkJCW9wdF9zdGF0ZS0+ZG9uZSA9IDA7CiAJCQluZXh0LT5zLmNvZGUgPSBCUEZfTUlTQ3xCUEZfVEFYOwogCQl9CiAJCS8qCkBAIC03MDQsNyArNzI2LDcgQEAKIAkJICAgIG5leHQtPnMuY29kZSA9PSAoQlBGX01JU0N8QlBGX1RBWCkpIHsKIAkJCXMtPnMuY29kZSA9IEJQRl9MRFh8QlBGX0lNTTsKIAkJCW5leHQtPnMuY29kZSA9IEJQRl9NSVNDfEJQRl9UWEE7Ci0JCQlkb25lID0gMDsKKwkJCW9wdF9zdGF0ZS0+ZG9uZSA9IDA7CiAJCX0KIAkJLyoKIAkJICogVGhpcyBpcyBhbiB1Z2x5IHNwZWNpYWwgY2FzZSwgYnV0IGl0IGhhcHBlbnMKQEAgLTc4Myw3ICs4MDUsNyBAQAogCQkJcy0+cy5jb2RlID0gTk9QOwogCQkJYWRkLT5zLmNvZGUgPSBOT1A7CiAJCQl0YXgtPnMuY29kZSA9IE5PUDsKLQkJCWRvbmUgPSAwOworCQkJb3B0X3N0YXRlLT5kb25lID0gMDsKIAkJfQogCX0KIAkvKgpAQCAtODAxLDcgKzgyMyw3IEBACiAJICAgIAkgKi8KIAkJaWYgKGxhc3QtPnMuY29kZSA9PSAoQlBGX0FMVXxCUEZfU1VCfEJQRl9YKSkgewogCQkJdmFsID0gYi0+dmFsW1hfQVRPTV07Ci0JCQlpZiAodm1hcFt2YWxdLmlzX2NvbnN0KSB7CisJCQlpZiAob3B0X3N0YXRlLT52bWFwW3ZhbF0uaXNfY29uc3QpIHsKIAkJCQkvKgogCQkJCSAqIElmIHdlIGhhdmUgYSBzdWJ0cmFjdCB0byBkbyBhIGNvbXBhcmlzb24sCiAJCQkJICogYW5kIHRoZSBYIHJlZ2lzdGVyIGlzIGEga25vd24gY29uc3RhbnQsCkBAIC04MTEsOSArODMzLDkgQEAKIAkJCQkgKiBzdWIgeCAgLT4Jbm9wCiAJCQkJICogamVxICN5CWplcSAjKHgreSkKIAkJCQkgKi8KLQkJCQliLT5zLmsgKz0gdm1hcFt2YWxdLmNvbnN0X3ZhbDsKKwkJCQliLT5zLmsgKz0gb3B0X3N0YXRlLT52bWFwW3ZhbF0uY29uc3RfdmFsOwogCQkJCWxhc3QtPnMuY29kZSA9IE5PUDsKLQkJCQlkb25lID0gMDsKKwkJCQlvcHRfc3RhdGUtPmRvbmUgPSAwOwogCQkJfSBlbHNlIGlmIChiLT5zLmsgPT0gMCkgewogCQkJCS8qCiAJCQkJICogSWYgdGhlIFggcmVnaXN0ZXIgaXNuJ3QgYSBjb25zdGFudCwKQEAgLTgyNiw3ICs4NDgsNyBAQAogCQkJCSAqLwogCQkJCWxhc3QtPnMuY29kZSA9IE5PUDsKIAkJCQliLT5zLmNvZGUgPSBCUEZfSk1QfEJQRl9KRVF8QlBGX1g7Ci0JCQkJZG9uZSA9IDA7CisJCQkJb3B0X3N0YXRlLT5kb25lID0gMDsKIAkJCX0KIAkJfQogCQkvKgpAQCAtODM4LDcgKzg2MCw3IEBACiAJCWVsc2UgaWYgKGxhc3QtPnMuY29kZSA9PSAoQlBGX0FMVXxCUEZfU1VCfEJQRl9LKSkgewogCQkJbGFzdC0+cy5jb2RlID0gTk9QOwogCQkJYi0+cy5rICs9IGxhc3QtPnMuazsKLQkJCWRvbmUgPSAwOworCQkJb3B0X3N0YXRlLT5kb25lID0gMDsKIAkJfQogCQkvKgogCQkgKiBBbmQsIHNpbWlsYXJseSwgYSBjb25zdGFudCBBTkQgY2FuIGJlIHNpbXBsaWZpZWQKQEAgLTg1Miw3ICs4NzQsNyBAQAogCQkJYi0+cy5rID0gbGFzdC0+cy5rOwogCQkJYi0+cy5jb2RlID0gQlBGX0pNUHxCUEZfS3xCUEZfSlNFVDsKIAkJCWxhc3QtPnMuY29kZSA9IE5PUDsKLQkJCWRvbmUgPSAwOworCQkJb3B0X3N0YXRlLT5kb25lID0gMDsKIAkJCW9wdF9ub3QoYik7CiAJCX0KIAl9CkBAIC04NjMsNyArODg1LDcgQEAKIAlpZiAoYi0+cy5jb2RlID09IChCUEZfSk1QfEJQRl9LfEJQRl9KU0VUKSkgewogCQlpZiAoYi0+cy5rID09IDApCiAJCQlKVChiKSA9IEpGKGIpOwotCQlpZiAoYi0+cy5rID09IDB4ZmZmZmZmZmYpCisJCWlmICgodV9pbnQpYi0+cy5rID09IDB4ZmZmZmZmZmZVKQogCQkJSkYoYikgPSBKVChiKTsKIAl9CiAJLyoKQEAgLTg3Miw4ICs4OTQsOCBAQAogCSAqIGNvbnN0YW50LgogCSAqLwogCXZhbCA9IGItPnZhbFtYX0FUT01dOwotCWlmICh2bWFwW3ZhbF0uaXNfY29uc3QgJiYgQlBGX1NSQyhiLT5zLmNvZGUpID09IEJQRl9YKSB7Ci0JCWJwZl9pbnQzMiB2ID0gdm1hcFt2YWxdLmNvbnN0X3ZhbDsKKwlpZiAob3B0X3N0YXRlLT52bWFwW3ZhbF0uaXNfY29uc3QgJiYgQlBGX1NSQyhiLT5zLmNvZGUpID09IEJQRl9YKSB7CisJCWJwZl9pbnQzMiB2ID0gb3B0X3N0YXRlLT52bWFwW3ZhbF0uY29uc3RfdmFsOwogCQliLT5zLmNvZGUgJj0gfkJQRl9YOwogCQliLT5zLmsgPSB2OwogCX0KQEAgLTg4Miw4ICs5MDQsOCBAQAogCSAqIGNvbXBhcmlzb24gcmVzdWx0LgogCSAqLwogCXZhbCA9IGItPnZhbFtBX0FUT01dOwotCWlmICh2bWFwW3ZhbF0uaXNfY29uc3QgJiYgQlBGX1NSQyhiLT5zLmNvZGUpID09IEJQRl9LKSB7Ci0JCWJwZl9pbnQzMiB2ID0gdm1hcFt2YWxdLmNvbnN0X3ZhbDsKKwlpZiAob3B0X3N0YXRlLT52bWFwW3ZhbF0uaXNfY29uc3QgJiYgQlBGX1NSQyhiLT5zLmNvZGUpID09IEJQRl9LKSB7CisJCWJwZl9pbnQzMiB2ID0gb3B0X3N0YXRlLT52bWFwW3ZhbF0uY29uc3RfdmFsOwogCQlzd2l0Y2ggKEJQRl9PUChiLT5zLmNvZGUpKSB7CiAKIAkJY2FzZSBCUEZfSkVROgpAQCAtODkxLDExICs5MTMsMTEgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgQlBGX0pHVDoKLQkJCXYgPSAodW5zaWduZWQpdiA+IGItPnMuazsKKwkJCXYgPSAodW5zaWduZWQpdiA+ICh1bnNpZ25lZCliLT5zLms7CiAJCQlicmVhazsKIAogCQljYXNlIEJQRl9KR0U6Ci0JCQl2ID0gKHVuc2lnbmVkKXYgPj0gYi0+cy5rOworCQkJdiA9ICh1bnNpZ25lZCl2ID49ICh1bnNpZ25lZCliLT5zLms7CiAJCQlicmVhazsKIAogCQljYXNlIEJQRl9KU0VUOgpAQCAtOTA2LDcgKzkyOCw3IEBACiAJCQlhYm9ydCgpOwogCQl9CiAJCWlmIChKRihiKSAhPSBKVChiKSkKLQkJCWRvbmUgPSAwOworCQkJb3B0X3N0YXRlLT5kb25lID0gMDsKIAkJaWYgKHYpCiAJCQlKRihiKSA9IEpUKGIpOwogCQllbHNlCkBAIC05MjEsNyArOTQzLDggQEAKICAqIGV2YWx1YXRpb24gYW5kIGNvZGUgdHJhbnNmb3JtYXRpb25zIHdlcmVuJ3QgZm9sZGVkIHRvZ2V0aGVyLgogICovCiBzdGF0aWMgdm9pZAotb3B0X3N0bXQoc3RydWN0IHN0bXQgKnMsIGludCB2YWxbXSwgaW50IGFsdGVyKQorb3B0X3N0bXQoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBzdHJ1Y3QgaWNvZGUgKmljLCBvcHRfc3RhdGVfdCAqb3B0X3N0YXRlLAorICAgIHN0cnVjdCBzdG10ICpzLCBpbnQgdmFsW10sIGludCBhbHRlcikKIHsKIAlpbnQgb3A7CiAJaW50IHY7CkBAIC05MzEsNyArOTU0LDcgQEAKIAljYXNlIEJQRl9MRHxCUEZfQUJTfEJQRl9XOgogCWNhc2UgQlBGX0xEfEJQRl9BQlN8QlBGX0g6CiAJY2FzZSBCUEZfTER8QlBGX0FCU3xCUEZfQjoKLQkJdiA9IEYocy0+Y29kZSwgcy0+aywgMEwpOworCQl2ID0gRihvcHRfc3RhdGUsIHMtPmNvZGUsIHMtPmssIDBMKTsKIAkJdnN0b3JlKHMsICZ2YWxbQV9BVE9NXSwgdiwgYWx0ZXIpOwogCQlicmVhazsKIApAQCAtOTM5LDE5ICs5NjIsMTkgQEAKIAljYXNlIEJQRl9MRHxCUEZfSU5EfEJQRl9IOgogCWNhc2UgQlBGX0xEfEJQRl9JTkR8QlBGX0I6CiAJCXYgPSB2YWxbWF9BVE9NXTsKLQkJaWYgKGFsdGVyICYmIHZtYXBbdl0uaXNfY29uc3QpIHsKKwkJaWYgKGFsdGVyICYmIG9wdF9zdGF0ZS0+dm1hcFt2XS5pc19jb25zdCkgewogCQkJcy0+Y29kZSA9IEJQRl9MRHxCUEZfQUJTfEJQRl9TSVpFKHMtPmNvZGUpOwotCQkJcy0+ayArPSB2bWFwW3ZdLmNvbnN0X3ZhbDsKLQkJCXYgPSBGKHMtPmNvZGUsIHMtPmssIDBMKTsKLQkJCWRvbmUgPSAwOworCQkJcy0+ayArPSBvcHRfc3RhdGUtPnZtYXBbdl0uY29uc3RfdmFsOworCQkJdiA9IEYob3B0X3N0YXRlLCBzLT5jb2RlLCBzLT5rLCAwTCk7CisJCQlvcHRfc3RhdGUtPmRvbmUgPSAwOwogCQl9CiAJCWVsc2UKLQkJCXYgPSBGKHMtPmNvZGUsIHMtPmssIHYpOworCQkJdiA9IEYob3B0X3N0YXRlLCBzLT5jb2RlLCBzLT5rLCB2KTsKIAkJdnN0b3JlKHMsICZ2YWxbQV9BVE9NXSwgdiwgYWx0ZXIpOwogCQlicmVhazsKIAogCWNhc2UgQlBGX0xEfEJQRl9MRU46Ci0JCXYgPSBGKHMtPmNvZGUsIDBMLCAwTCk7CisJCXYgPSBGKG9wdF9zdGF0ZSwgcy0+Y29kZSwgMEwsIDBMKTsKIAkJdnN0b3JlKHMsICZ2YWxbQV9BVE9NXSwgdiwgYWx0ZXIpOwogCQlicmVhazsKIApAQCAtOTY2LDE4ICs5ODksMTggQEAKIAkJYnJlYWs7CiAKIAljYXNlIEJQRl9MRFh8QlBGX01TSHxCUEZfQjoKLQkJdiA9IEYocy0+Y29kZSwgcy0+aywgMEwpOworCQl2ID0gRihvcHRfc3RhdGUsIHMtPmNvZGUsIHMtPmssIDBMKTsKIAkJdnN0b3JlKHMsICZ2YWxbWF9BVE9NXSwgdiwgYWx0ZXIpOwogCQlicmVhazsKIAogCWNhc2UgQlBGX0FMVXxCUEZfTkVHOgotCQlpZiAoYWx0ZXIgJiYgdm1hcFt2YWxbQV9BVE9NXV0uaXNfY29uc3QpIHsKKwkJaWYgKGFsdGVyICYmIG9wdF9zdGF0ZS0+dm1hcFt2YWxbQV9BVE9NXV0uaXNfY29uc3QpIHsKIAkJCXMtPmNvZGUgPSBCUEZfTER8QlBGX0lNTTsKLQkJCXMtPmsgPSAtdm1hcFt2YWxbQV9BVE9NXV0uY29uc3RfdmFsOworCQkJcy0+ayA9IC1vcHRfc3RhdGUtPnZtYXBbdmFsW0FfQVRPTV1dLmNvbnN0X3ZhbDsKIAkJCXZhbFtBX0FUT01dID0gSyhzLT5rKTsKIAkJfQogCQllbHNlCi0JCQl2YWxbQV9BVE9NXSA9IEYocy0+Y29kZSwgdmFsW0FfQVRPTV0sIDBMKTsKKwkJCXZhbFtBX0FUT01dID0gRihvcHRfc3RhdGUsIHMtPmNvZGUsIHZhbFtBX0FUT01dLCAwTCk7CiAJCWJyZWFrOwogCiAJY2FzZSBCUEZfQUxVfEJQRl9BRER8QlBGX0s6CkBAIC0xMDA4LDEzICsxMDMxLDEzIEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KLQkJCWlmICh2bWFwW3ZhbFtBX0FUT01dXS5pc19jb25zdCkgewotCQkJCWZvbGRfb3AocywgdmFsW0FfQVRPTV0sIEsocy0+aykpOworCQkJaWYgKG9wdF9zdGF0ZS0+dm1hcFt2YWxbQV9BVE9NXV0uaXNfY29uc3QpIHsKKwkJCQlmb2xkX29wKGNzdGF0ZSwgaWMsIG9wdF9zdGF0ZSwgcywgdmFsW0FfQVRPTV0sIEsocy0+aykpOwogCQkJCXZhbFtBX0FUT01dID0gSyhzLT5rKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCQl2YWxbQV9BVE9NXSA9IEYocy0+Y29kZSwgdmFsW0FfQVRPTV0sIEsocy0+aykpOworCQl2YWxbQV9BVE9NXSA9IEYob3B0X3N0YXRlLCBzLT5jb2RlLCB2YWxbQV9BVE9NXSwgSyhzLT5rKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCUEZfQUxVfEJQRl9BRER8QlBGX1g6CkBAIC0xMDI4LDE3ICsxMDUxLDE3IEBACiAJY2FzZSBCUEZfQUxVfEJQRl9MU0h8QlBGX1g6CiAJY2FzZSBCUEZfQUxVfEJQRl9SU0h8QlBGX1g6CiAJCW9wID0gQlBGX09QKHMtPmNvZGUpOwotCQlpZiAoYWx0ZXIgJiYgdm1hcFt2YWxbWF9BVE9NXV0uaXNfY29uc3QpIHsKLQkJCWlmICh2bWFwW3ZhbFtBX0FUT01dXS5pc19jb25zdCkgewotCQkJCWZvbGRfb3AocywgdmFsW0FfQVRPTV0sIHZhbFtYX0FUT01dKTsKKwkJaWYgKGFsdGVyICYmIG9wdF9zdGF0ZS0+dm1hcFt2YWxbWF9BVE9NXV0uaXNfY29uc3QpIHsKKwkJCWlmIChvcHRfc3RhdGUtPnZtYXBbdmFsW0FfQVRPTV1dLmlzX2NvbnN0KSB7CisJCQkJZm9sZF9vcChjc3RhdGUsIGljLCBvcHRfc3RhdGUsIHMsIHZhbFtBX0FUT01dLCB2YWxbWF9BVE9NXSk7CiAJCQkJdmFsW0FfQVRPTV0gPSBLKHMtPmspOwogCQkJfQogCQkJZWxzZSB7CiAJCQkJcy0+Y29kZSA9IEJQRl9BTFV8QlBGX0t8b3A7Ci0JCQkJcy0+ayA9IHZtYXBbdmFsW1hfQVRPTV1dLmNvbnN0X3ZhbDsKLQkJCQlkb25lID0gMDsKKwkJCQlzLT5rID0gb3B0X3N0YXRlLT52bWFwW3ZhbFtYX0FUT01dXS5jb25zdF92YWw7CisJCQkJb3B0X3N0YXRlLT5kb25lID0gMDsKIAkJCQl2YWxbQV9BVE9NXSA9Ci0JCQkJCUYocy0+Y29kZSwgdmFsW0FfQVRPTV0sIEsocy0+aykpOworCQkJCQlGKG9wdF9zdGF0ZSwgcy0+Y29kZSwgdmFsW0FfQVRPTV0sIEsocy0+aykpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KQEAgLTEwNDksOCArMTA3Miw4IEBACiAJCSAqIG9wdGltaXphdGlvbnMuCiAJCSAqIFhYWCBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtdWwgYnkgMSwgZXRjLgogCQkgKi8KLQkJaWYgKGFsdGVyICYmIHZtYXBbdmFsW0FfQVRPTV1dLmlzX2NvbnN0Ci0JCSAgICAmJiB2bWFwW3ZhbFtBX0FUT01dXS5jb25zdF92YWwgPT0gMCkgeworCQlpZiAoYWx0ZXIgJiYgb3B0X3N0YXRlLT52bWFwW3ZhbFtBX0FUT01dXS5pc19jb25zdAorCQkgICAgJiYgb3B0X3N0YXRlLT52bWFwW3ZhbFtBX0FUT01dXS5jb25zdF92YWwgPT0gMCkgewogCQkJaWYgKG9wID09IEJQRl9BREQgfHwgb3AgPT0gQlBGX09SIHx8IG9wID09IEJQRl9YT1IpIHsKIAkJCQlzLT5jb2RlID0gQlBGX01JU0N8QlBGX1RYQTsKIAkJCQl2c3RvcmUocywgJnZhbFtBX0FUT01dLCB2YWxbWF9BVE9NXSwgYWx0ZXIpOwpAQCAtMTA2OCw3ICsxMDkxLDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCQl2YWxbQV9BVE9NXSA9IEYocy0+Y29kZSwgdmFsW0FfQVRPTV0sIHZhbFtYX0FUT01dKTsKKwkJdmFsW0FfQVRPTV0gPSBGKG9wdF9zdGF0ZSwgcy0+Y29kZSwgdmFsW0FfQVRPTV0sIHZhbFtYX0FUT01dKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJQRl9NSVNDfEJQRl9UWEE6CkBAIC0xMDc3LDEwICsxMTAwLDEwIEBACiAKIAljYXNlIEJQRl9MRHxCUEZfTUVNOgogCQl2ID0gdmFsW3MtPmtdOwotCQlpZiAoYWx0ZXIgJiYgdm1hcFt2XS5pc19jb25zdCkgeworCQlpZiAoYWx0ZXIgJiYgb3B0X3N0YXRlLT52bWFwW3ZdLmlzX2NvbnN0KSB7CiAJCQlzLT5jb2RlID0gQlBGX0xEfEJQRl9JTU07Ci0JCQlzLT5rID0gdm1hcFt2XS5jb25zdF92YWw7Ci0JCQlkb25lID0gMDsKKwkJCXMtPmsgPSBvcHRfc3RhdGUtPnZtYXBbdl0uY29uc3RfdmFsOworCQkJb3B0X3N0YXRlLT5kb25lID0gMDsKIAkJfQogCQl2c3RvcmUocywgJnZhbFtBX0FUT01dLCB2LCBhbHRlcik7CiAJCWJyZWFrOwpAQCAtMTA5MSwxMCArMTExNCwxMCBAQAogCiAJY2FzZSBCUEZfTERYfEJQRl9NRU06CiAJCXYgPSB2YWxbcy0+a107Ci0JCWlmIChhbHRlciAmJiB2bWFwW3ZdLmlzX2NvbnN0KSB7CisJCWlmIChhbHRlciAmJiBvcHRfc3RhdGUtPnZtYXBbdl0uaXNfY29uc3QpIHsKIAkJCXMtPmNvZGUgPSBCUEZfTERYfEJQRl9JTU07Ci0JCQlzLT5rID0gdm1hcFt2XS5jb25zdF92YWw7Ci0JCQlkb25lID0gMDsKKwkJCXMtPmsgPSBvcHRfc3RhdGUtPnZtYXBbdl0uY29uc3RfdmFsOworCQkJb3B0X3N0YXRlLT5kb25lID0gMDsKIAkJfQogCQl2c3RvcmUocywgJnZhbFtYX0FUT01dLCB2LCBhbHRlcik7CiAJCWJyZWFrOwpAQCAtMTExMCw3ICsxMTMzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWRlYWRzdG10KHJlZ2lzdGVyIHN0cnVjdCBzdG10ICpzLCByZWdpc3RlciBzdHJ1Y3Qgc3RtdCAqbGFzdFtdKQorZGVhZHN0bXQob3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSwgcmVnaXN0ZXIgc3RydWN0IHN0bXQgKnMsIHJlZ2lzdGVyIHN0cnVjdCBzdG10ICpsYXN0W10pCiB7CiAJcmVnaXN0ZXIgaW50IGF0b207CiAKQEAgLTExMjYsNyArMTE0OSw3IEBACiAJYXRvbSA9IGF0b21kZWYocyk7CiAJaWYgKGF0b20gPj0gMCkgewogCQlpZiAobGFzdFthdG9tXSkgewotCQkJZG9uZSA9IDA7CisJCQlvcHRfc3RhdGUtPmRvbmUgPSAwOwogCQkJbGFzdFthdG9tXS0+Y29kZSA9IE5PUDsKIAkJfQogCQlsYXN0W2F0b21dID0gczsKQEAgLTExMzQsNyArMTE1Nyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1vcHRfZGVhZHN0b3JlcyhyZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmIpCitvcHRfZGVhZHN0b3JlcyhvcHRfc3RhdGVfdCAqb3B0X3N0YXRlLCByZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmIpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IHNsaXN0ICpzOwogCXJlZ2lzdGVyIGludCBhdG9tOwpAQCAtMTE0MywxOCArMTE2NiwxOSBAQAogCW1lbXNldCgoY2hhciAqKWxhc3QsIDAsIHNpemVvZiBsYXN0KTsKIAogCWZvciAocyA9IGItPnN0bXRzOyBzICE9IDA7IHMgPSBzLT5uZXh0KQotCQlkZWFkc3RtdCgmcy0+cywgbGFzdCk7Ci0JZGVhZHN0bXQoJmItPnMsIGxhc3QpOworCQlkZWFkc3RtdChvcHRfc3RhdGUsICZzLT5zLCBsYXN0KTsKKwlkZWFkc3RtdChvcHRfc3RhdGUsICZiLT5zLCBsYXN0KTsKIAogCWZvciAoYXRvbSA9IDA7IGF0b20gPCBOX0FUT01TOyArK2F0b20pCiAJCWlmIChsYXN0W2F0b21dICYmICFBVE9NRUxFTShiLT5vdXRfdXNlLCBhdG9tKSkgewogCQkJbGFzdFthdG9tXS0+Y29kZSA9IE5PUDsKLQkJCWRvbmUgPSAwOworCQkJb3B0X3N0YXRlLT5kb25lID0gMDsKIAkJfQogfQogCiBzdGF0aWMgdm9pZAotb3B0X2JsayhzdHJ1Y3QgYmxvY2sgKmIsIGludCBkb19zdG10cykKK29wdF9ibGsoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBzdHJ1Y3QgaWNvZGUgKmljLCBvcHRfc3RhdGVfdCAqb3B0X3N0YXRlLAorICAgIHN0cnVjdCBibG9jayAqYiwgaW50IGRvX3N0bXRzKQogewogCXN0cnVjdCBzbGlzdCAqczsKIAlzdHJ1Y3QgZWRnZSAqcDsKQEAgLTEyMDQsNyArMTIyOCw3IEBACiAJYXZhbCA9IGItPnZhbFtBX0FUT01dOwogCXh2YWwgPSBiLT52YWxbWF9BVE9NXTsKIAlmb3IgKHMgPSBiLT5zdG10czsgczsgcyA9IHMtPm5leHQpCi0JCW9wdF9zdG10KCZzLT5zLCBiLT52YWwsIGRvX3N0bXRzKTsKKwkJb3B0X3N0bXQoY3N0YXRlLCBpYywgb3B0X3N0YXRlLCAmcy0+cywgYi0+dmFsLCBkb19zdG10cyk7CiAKIAkvKgogCSAqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2U6IGlmIHdlIGRvbid0IHVzZSBhbnl0aGluZyBmcm9tIHRoaXMKQEAgLTEyMzUsMTEgKzEyNTksMTEgQEAKIAkgICAgIEJQRl9DTEFTUyhiLT5zLmNvZGUpID09IEJQRl9SRVQpKSB7CiAJCWlmIChiLT5zdG10cyAhPSAwKSB7CiAJCQliLT5zdG10cyA9IDA7Ci0JCQlkb25lID0gMDsKKwkJCW9wdF9zdGF0ZS0+ZG9uZSA9IDA7CiAJCX0KIAl9IGVsc2UgewotCQlvcHRfcGVlcChiKTsKLQkJb3B0X2RlYWRzdG9yZXMoYik7CisJCW9wdF9wZWVwKG9wdF9zdGF0ZSwgYik7CisJCW9wdF9kZWFkc3RvcmVzKG9wdF9zdGF0ZSwgYik7CiAJfQogCS8qCiAJICogU2V0IHVwIHZhbHVlcyBmb3IgYnJhbmNoIG9wdGltaXplci4KQEAgLTEzMjYsNyArMTM1MCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1vcHRfaihzdHJ1Y3QgZWRnZSAqZXApCitvcHRfaihvcHRfc3RhdGVfdCAqb3B0X3N0YXRlLCBzdHJ1Y3QgZWRnZSAqZXApCiB7CiAJcmVnaXN0ZXIgaW50IGksIGs7CiAJcmVnaXN0ZXIgc3RydWN0IGJsb2NrICp0YXJnZXQ7CkBAIC0xMzQwLDcgKzEzNjQsNyBAQAogCQkgKiB0aGVyZSBpcyBubyBkYXRhIGRlcGVuZGVuY3kuCiAJCSAqLwogCQlpZiAoIXVzZV9jb25mbGljdChlcC0+cHJlZCwgZXAtPnN1Y2MtPmV0LnN1Y2MpKSB7Ci0JCQlkb25lID0gMDsKKwkJCW9wdF9zdGF0ZS0+ZG9uZSA9IDA7CiAJCQllcC0+c3VjYyA9IEpUKGVwLT5zdWNjKTsKIAkJfQogCX0KQEAgLTEzNTIsNyArMTM3Niw3IEBACiAJICogZWZmaWNpZW50IGxvb3AuCiAJICovCiAgdG9wOgotCWZvciAoaSA9IDA7IGkgPCBlZGdld29yZHM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBvcHRfc3RhdGUtPmVkZ2V3b3JkczsgKytpKSB7CiAJCXJlZ2lzdGVyIGJwZl91X2ludDMyIHggPSBlcC0+ZWRvbVtpXTsKIAogCQl3aGlsZSAoeCAhPSAwKSB7CkBAIC0xMzYwLDEzICsxMzg0LDEzIEBACiAJCQl4ICY9fiAoMSA8PCBrKTsKIAkJCWsgKz0gaSAqIEJJVFNfUEVSX1dPUkQ7CiAKLQkJCXRhcmdldCA9IGZvbGRfZWRnZShlcC0+c3VjYywgZWRnZXNba10pOworCQkJdGFyZ2V0ID0gZm9sZF9lZGdlKGVwLT5zdWNjLCBvcHRfc3RhdGUtPmVkZ2VzW2tdKTsKIAkJCS8qCiAJCQkgKiBDaGVjayB0aGF0IHRoZXJlIGlzIG5vIGRhdGEgZGVwZW5kZW5jeSBiZXR3ZWVuCiAJCQkgKiBub2RlcyB0aGF0IHdpbGwgYmUgdmlvbGF0ZWQgaWYgd2UgbW92ZSB0aGUgZWRnZS4KIAkJCSAqLwogCQkJaWYgKHRhcmdldCAhPSAwICYmICF1c2VfY29uZmxpY3QoZXAtPnByZWQsIHRhcmdldCkpIHsKLQkJCQlkb25lID0gMDsKKwkJCQlvcHRfc3RhdGUtPmRvbmUgPSAwOwogCQkJCWVwLT5zdWNjID0gdGFyZ2V0OwogCQkJCWlmIChKVCh0YXJnZXQpICE9IDApCiAJCQkJCS8qCkBAIC0xMzgxLDcgKzE0MDUsNyBAQAogCiAKIHN0YXRpYyB2b2lkCi1vcl9wdWxsdXAoc3RydWN0IGJsb2NrICpiKQorb3JfcHVsbHVwKG9wdF9zdGF0ZV90ICpvcHRfc3RhdGUsIHN0cnVjdCBibG9jayAqYikKIHsKIAlpbnQgdmFsLCBhdF90b3A7CiAJc3RydWN0IGJsb2NrICpwdWxsOwpAQCAtMTQ2OSwxMSArMTQ5MywxMSBAQAogCWVsc2UKIAkJKmRpZmZwID0gcHVsbDsKIAotCWRvbmUgPSAwOworCW9wdF9zdGF0ZS0+ZG9uZSA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkCi1hbmRfcHVsbHVwKHN0cnVjdCBibG9jayAqYikKK2FuZF9wdWxsdXAob3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSwgc3RydWN0IGJsb2NrICpiKQogewogCWludCB2YWwsIGF0X3RvcDsKIAlzdHJ1Y3QgYmxvY2sgKnB1bGw7CkBAIC0xNTYwLDIyICsxNTg0LDIzIEBACiAJZWxzZQogCQkqZGlmZnAgPSBwdWxsOwogCi0JZG9uZSA9IDA7CisJb3B0X3N0YXRlLT5kb25lID0gMDsKIH0KIAogc3RhdGljIHZvaWQKLW9wdF9ibGtzKHN0cnVjdCBibG9jayAqcm9vdCwgaW50IGRvX3N0bXRzKQorb3B0X2Jsa3MoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBvcHRfc3RhdGVfdCAqb3B0X3N0YXRlLCBzdHJ1Y3QgaWNvZGUgKmljLAorICAgIGludCBkb19zdG10cykKIHsKIAlpbnQgaSwgbWF4bGV2ZWw7CiAJc3RydWN0IGJsb2NrICpwOwogCi0JaW5pdF92YWwoKTsKLQltYXhsZXZlbCA9IHJvb3QtPmxldmVsOworCWluaXRfdmFsKG9wdF9zdGF0ZSk7CisJbWF4bGV2ZWwgPSBpYy0+cm9vdC0+bGV2ZWw7CiAKLQlmaW5kX2luZWRnZXMocm9vdCk7CisJZmluZF9pbmVkZ2VzKG9wdF9zdGF0ZSwgaWMtPnJvb3QpOwogCWZvciAoaSA9IG1heGxldmVsOyBpID49IDA7IC0taSkKLQkJZm9yIChwID0gbGV2ZWxzW2ldOyBwOyBwID0gcC0+bGluaykKLQkJCW9wdF9ibGsocCwgZG9fc3RtdHMpOworCQlmb3IgKHAgPSBvcHRfc3RhdGUtPmxldmVsc1tpXTsgcDsgcCA9IHAtPmxpbmspCisJCQlvcHRfYmxrKGNzdGF0ZSwgaWMsIG9wdF9zdGF0ZSwgcCwgZG9fc3RtdHMpOwogCiAJaWYgKGRvX3N0bXRzKQogCQkvKgpAQCAtMTU4NSwxNyArMTYxMCwxNyBAQAogCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAxOyBpIDw9IG1heGxldmVsOyArK2kpIHsKLQkJZm9yIChwID0gbGV2ZWxzW2ldOyBwOyBwID0gcC0+bGluaykgewotCQkJb3B0X2ooJnAtPmV0KTsKLQkJCW9wdF9qKCZwLT5lZik7CisJCWZvciAocCA9IG9wdF9zdGF0ZS0+bGV2ZWxzW2ldOyBwOyBwID0gcC0+bGluaykgeworCQkJb3B0X2oob3B0X3N0YXRlLCAmcC0+ZXQpOworCQkJb3B0X2oob3B0X3N0YXRlLCAmcC0+ZWYpOwogCQl9CiAJfQogCi0JZmluZF9pbmVkZ2VzKHJvb3QpOworCWZpbmRfaW5lZGdlcyhvcHRfc3RhdGUsIGljLT5yb290KTsKIAlmb3IgKGkgPSAxOyBpIDw9IG1heGxldmVsOyArK2kpIHsKLQkJZm9yIChwID0gbGV2ZWxzW2ldOyBwOyBwID0gcC0+bGluaykgewotCQkJb3JfcHVsbHVwKHApOwotCQkJYW5kX3B1bGx1cChwKTsKKwkJZm9yIChwID0gb3B0X3N0YXRlLT5sZXZlbHNbaV07IHA7IHAgPSBwLT5saW5rKSB7CisJCQlvcl9wdWxsdXAob3B0X3N0YXRlLCBwKTsKKwkJCWFuZF9wdWxsdXAob3B0X3N0YXRlLCBwKTsKIAkJfQogCX0KIH0KQEAgLTE2MDgsMjAgKzE2MzMsMjAgQEAKIH0KIAogc3RhdGljIHZvaWQKLWZpbmRfaW5lZGdlcyhzdHJ1Y3QgYmxvY2sgKnJvb3QpCitmaW5kX2luZWRnZXMob3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSwgc3RydWN0IGJsb2NrICpyb290KQogewogCWludCBpOwogCXN0cnVjdCBibG9jayAqYjsKIAotCWZvciAoaSA9IDA7IGkgPCBuX2Jsb2NrczsgKytpKQotCQlibG9ja3NbaV0tPmluX2VkZ2VzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgb3B0X3N0YXRlLT5uX2Jsb2NrczsgKytpKQorCQlvcHRfc3RhdGUtPmJsb2Nrc1tpXS0+aW5fZWRnZXMgPSAwOwogCiAJLyoKIAkgKiBUcmF2ZXJzZSB0aGUgZ3JhcGgsIGFkZGluZyBlYWNoIGVkZ2UgdG8gdGhlIHByZWRlY2Vzc29yCiAJICogbGlzdCBvZiBpdHMgc3VjY2Vzc29ycy4gIFNraXAgdGhlIGxlYXZlcyAoaS5lLiBsZXZlbCAwKS4KIAkgKi8KIAlmb3IgKGkgPSByb290LT5sZXZlbDsgaSA+IDA7IC0taSkgewotCQlmb3IgKGIgPSBsZXZlbHNbaV07IGIgIT0gMDsgYiA9IGItPmxpbmspIHsKKwkJZm9yIChiID0gb3B0X3N0YXRlLT5sZXZlbHNbaV07IGIgIT0gMDsgYiA9IGItPmxpbmspIHsKIAkJCWxpbmtfaW5lZGdlKCZiLT5ldCwgSlQoYikpOwogCQkJbGlua19pbmVkZ2UoJmItPmVmLCBKRihiKSk7CiAJCX0KQEAgLTE2NTMsODMgKzE2NzgsODIgQEAKIH0KIAogc3RhdGljIHZvaWQKLW9wdF9sb29wKHN0cnVjdCBibG9jayAqcm9vdCwgaW50IGRvX3N0bXRzKQorb3B0X2xvb3AoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBvcHRfc3RhdGVfdCAqb3B0X3N0YXRlLCBzdHJ1Y3QgaWNvZGUgKmljLAorICAgIGludCBkb19zdG10cykKIHsKIAogI2lmZGVmIEJERUJVRwotCWlmIChkZmxhZyA+IDEpIHsKKwlpZiAocGNhcF9vcHRpbWl6ZXJfZGVidWcgPiAxKSB7CiAJCXByaW50Zigib3B0X2xvb3Aocm9vdCwgJWQpIGJlZ2luXG4iLCBkb19zdG10cyk7Ci0JCW9wdF9kdW1wKHJvb3QpOworCQlvcHRfZHVtcChjc3RhdGUsIGljKTsKIAl9CiAjZW5kaWYKIAlkbyB7Ci0JCWRvbmUgPSAxOwotCQlmaW5kX2xldmVscyhyb290KTsKLQkJZmluZF9kb20ocm9vdCk7Ci0JCWZpbmRfY2xvc3VyZShyb290KTsKLQkJZmluZF91ZChyb290KTsKLQkJZmluZF9lZG9tKHJvb3QpOwotCQlvcHRfYmxrcyhyb290LCBkb19zdG10cyk7CisJCW9wdF9zdGF0ZS0+ZG9uZSA9IDE7CisJCWZpbmRfbGV2ZWxzKG9wdF9zdGF0ZSwgaWMpOworCQlmaW5kX2RvbShvcHRfc3RhdGUsIGljLT5yb290KTsKKwkJZmluZF9jbG9zdXJlKG9wdF9zdGF0ZSwgaWMtPnJvb3QpOworCQlmaW5kX3VkKG9wdF9zdGF0ZSwgaWMtPnJvb3QpOworCQlmaW5kX2Vkb20ob3B0X3N0YXRlLCBpYy0+cm9vdCk7CisJCW9wdF9ibGtzKGNzdGF0ZSwgb3B0X3N0YXRlLCBpYywgZG9fc3RtdHMpOwogI2lmZGVmIEJERUJVRwotCQlpZiAoZGZsYWcgPiAxKSB7Ci0JCQlwcmludGYoIm9wdF9sb29wKHJvb3QsICVkKSBib3R0b20sIGRvbmU9JWRcbiIsIGRvX3N0bXRzLCBkb25lKTsKLQkJCW9wdF9kdW1wKHJvb3QpOworCQlpZiAocGNhcF9vcHRpbWl6ZXJfZGVidWcgPiAxKSB7CisJCQlwcmludGYoIm9wdF9sb29wKHJvb3QsICVkKSBib3R0b20sIGRvbmU9JWRcbiIsIGRvX3N0bXRzLCBvcHRfc3RhdGUtPmRvbmUpOworCQkJb3B0X2R1bXAoY3N0YXRlLCBpYyk7CiAJCX0KICNlbmRpZgotCX0gd2hpbGUgKCFkb25lKTsKKwl9IHdoaWxlICghb3B0X3N0YXRlLT5kb25lKTsKIH0KIAogLyoKICAqIE9wdGltaXplIHRoZSBmaWx0ZXIgY29kZSBpbiBpdHMgZGFnIHJlcHJlc2VudGF0aW9uLgogICovCiB2b2lkCi1icGZfb3B0aW1pemUoc3RydWN0IGJsb2NrICoqcm9vdHApCiticGZfb3B0aW1pemUoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBzdHJ1Y3QgaWNvZGUgKmljKQogewotCXN0cnVjdCBibG9jayAqcm9vdDsKKwlvcHRfc3RhdGVfdCBvcHRfc3RhdGU7CiAKLQlyb290ID0gKnJvb3RwOwotCi0Jb3B0X2luaXQocm9vdCk7Ci0Jb3B0X2xvb3Aocm9vdCwgMCk7Ci0Jb3B0X2xvb3Aocm9vdCwgMSk7Ci0JaW50ZXJuX2Jsb2Nrcyhyb290KTsKKwlvcHRfaW5pdChjc3RhdGUsICZvcHRfc3RhdGUsIGljKTsKKwlvcHRfbG9vcChjc3RhdGUsICZvcHRfc3RhdGUsIGljLCAwKTsKKwlvcHRfbG9vcChjc3RhdGUsICZvcHRfc3RhdGUsIGljLCAxKTsKKwlpbnRlcm5fYmxvY2tzKCZvcHRfc3RhdGUsIGljKTsKICNpZmRlZiBCREVCVUcKLQlpZiAoZGZsYWcgPiAxKSB7CisJaWYgKHBjYXBfb3B0aW1pemVyX2RlYnVnID4gMSkgewogCQlwcmludGYoImFmdGVyIGludGVybl9ibG9ja3MoKVxuIik7Ci0JCW9wdF9kdW1wKHJvb3QpOworCQlvcHRfZHVtcChjc3RhdGUsIGljKTsKIAl9CiAjZW5kaWYKLQlvcHRfcm9vdChyb290cCk7CisJb3B0X3Jvb3QoJmljLT5yb290KTsKICNpZmRlZiBCREVCVUcKLQlpZiAoZGZsYWcgPiAxKSB7CisJaWYgKHBjYXBfb3B0aW1pemVyX2RlYnVnID4gMSkgewogCQlwcmludGYoImFmdGVyIG9wdF9yb290KClcbiIpOwotCQlvcHRfZHVtcChyb290KTsKKwkJb3B0X2R1bXAoY3N0YXRlLCBpYyk7CiAJfQogI2VuZGlmCi0Jb3B0X2NsZWFudXAoKTsKKwlvcHRfY2xlYW51cCgmb3B0X3N0YXRlKTsKIH0KIAogc3RhdGljIHZvaWQKLW1ha2VfbWFya3Moc3RydWN0IGJsb2NrICpwKQorbWFrZV9tYXJrcyhzdHJ1Y3QgaWNvZGUgKmljLCBzdHJ1Y3QgYmxvY2sgKnApCiB7Ci0JaWYgKCFpc01hcmtlZChwKSkgewotCQlNYXJrKHApOworCWlmICghaXNNYXJrZWQoaWMsIHApKSB7CisJCU1hcmsoaWMsIHApOwogCQlpZiAoQlBGX0NMQVNTKHAtPnMuY29kZSkgIT0gQlBGX1JFVCkgewotCQkJbWFrZV9tYXJrcyhKVChwKSk7Ci0JCQltYWtlX21hcmtzKEpGKHApKTsKKwkJCW1ha2VfbWFya3MoaWMsIEpUKHApKTsKKwkJCW1ha2VfbWFya3MoaWMsIEpGKHApKTsKIAkJfQogCX0KIH0KIAogLyoKLSAqIE1hcmsgY29kZSBhcnJheSBzdWNoIHRoYXQgaXNNYXJrZWQoaSkgaXMgdHJ1ZQorICogTWFyayBjb2RlIGFycmF5IHN1Y2ggdGhhdCBpc01hcmtlZChpYy0+Y3VyX21hcmssIGkpIGlzIHRydWUKICAqIG9ubHkgZm9yIG5vZGVzIHRoYXQgYXJlIGFsaXZlLgogICovCiBzdGF0aWMgdm9pZAotbWFya19jb2RlKHN0cnVjdCBibG9jayAqcCkKK21hcmtfY29kZShzdHJ1Y3QgaWNvZGUgKmljKQogewotCWN1cl9tYXJrICs9IDE7Ci0JbWFrZV9tYXJrcyhwKTsKKwlpYy0+Y3VyX21hcmsgKz0gMTsKKwltYWtlX21hcmtzKGljLCBpYy0+cm9vdCk7CiB9CiAKIC8qCkBAIC0xNzY3LDMzICsxNzkxLDMzIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1pbnRlcm5fYmxvY2tzKHN0cnVjdCBibG9jayAqcm9vdCkKK2ludGVybl9ibG9ja3Mob3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSwgc3RydWN0IGljb2RlICppYykKIHsKIAlzdHJ1Y3QgYmxvY2sgKnA7CiAJaW50IGksIGo7CiAJaW50IGRvbmUxOyAvKiBkb24ndCBzaGFkb3cgZ2xvYmFsICovCiAgdG9wOgogCWRvbmUxID0gMTsKLQlmb3IgKGkgPSAwOyBpIDwgbl9ibG9ja3M7ICsraSkKLQkJYmxvY2tzW2ldLT5saW5rID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgb3B0X3N0YXRlLT5uX2Jsb2NrczsgKytpKQorCQlvcHRfc3RhdGUtPmJsb2Nrc1tpXS0+bGluayA9IDA7CiAKLQltYXJrX2NvZGUocm9vdCk7CisJbWFya19jb2RlKGljKTsKIAotCWZvciAoaSA9IG5fYmxvY2tzIC0gMTsgLS1pID49IDA7ICkgewotCQlpZiAoIWlzTWFya2VkKGJsb2Nrc1tpXSkpCisJZm9yIChpID0gb3B0X3N0YXRlLT5uX2Jsb2NrcyAtIDE7IC0taSA+PSAwOyApIHsKKwkJaWYgKCFpc01hcmtlZChpYywgb3B0X3N0YXRlLT5ibG9ja3NbaV0pKQogCQkJY29udGludWU7Ci0JCWZvciAoaiA9IGkgKyAxOyBqIDwgbl9ibG9ja3M7ICsraikgewotCQkJaWYgKCFpc01hcmtlZChibG9ja3Nbal0pKQorCQlmb3IgKGogPSBpICsgMTsgaiA8IG9wdF9zdGF0ZS0+bl9ibG9ja3M7ICsraikgeworCQkJaWYgKCFpc01hcmtlZChpYywgb3B0X3N0YXRlLT5ibG9ja3Nbal0pKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKGVxX2JsayhibG9ja3NbaV0sIGJsb2Nrc1tqXSkpIHsKLQkJCQlibG9ja3NbaV0tPmxpbmsgPSBibG9ja3Nbal0tPmxpbmsgPwotCQkJCQlibG9ja3Nbal0tPmxpbmsgOiBibG9ja3Nbal07CisJCQlpZiAoZXFfYmxrKG9wdF9zdGF0ZS0+YmxvY2tzW2ldLCBvcHRfc3RhdGUtPmJsb2Nrc1tqXSkpIHsKKwkJCQlvcHRfc3RhdGUtPmJsb2Nrc1tpXS0+bGluayA9IG9wdF9zdGF0ZS0+YmxvY2tzW2pdLT5saW5rID8KKwkJCQkJb3B0X3N0YXRlLT5ibG9ja3Nbal0tPmxpbmsgOiBvcHRfc3RhdGUtPmJsb2Nrc1tqXTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCX0KLQlmb3IgKGkgPSAwOyBpIDwgbl9ibG9ja3M7ICsraSkgewotCQlwID0gYmxvY2tzW2ldOworCWZvciAoaSA9IDA7IGkgPCBvcHRfc3RhdGUtPm5fYmxvY2tzOyArK2kpIHsKKwkJcCA9IG9wdF9zdGF0ZS0+YmxvY2tzW2ldOwogCQlpZiAoSlQocCkgPT0gMCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoSlQocCktPmxpbmspIHsKQEAgLTE4MTAsMTQgKzE4MzQsMTQgQEAKIH0KIAogc3RhdGljIHZvaWQKLW9wdF9jbGVhbnVwKHZvaWQpCitvcHRfY2xlYW51cChvcHRfc3RhdGVfdCAqb3B0X3N0YXRlKQogewotCWZyZWUoKHZvaWQgKil2bm9kZV9iYXNlKTsKLQlmcmVlKCh2b2lkICopdm1hcCk7Ci0JZnJlZSgodm9pZCAqKWVkZ2VzKTsKLQlmcmVlKCh2b2lkICopc3BhY2UpOwotCWZyZWUoKHZvaWQgKilsZXZlbHMpOwotCWZyZWUoKHZvaWQgKilibG9ja3MpOworCWZyZWUoKHZvaWQgKilvcHRfc3RhdGUtPnZub2RlX2Jhc2UpOworCWZyZWUoKHZvaWQgKilvcHRfc3RhdGUtPnZtYXApOworCWZyZWUoKHZvaWQgKilvcHRfc3RhdGUtPmVkZ2VzKTsKKwlmcmVlKCh2b2lkICopb3B0X3N0YXRlLT5zcGFjZSk7CisJZnJlZSgodm9pZCAqKW9wdF9zdGF0ZS0+bGV2ZWxzKTsKKwlmcmVlKCh2b2lkICopb3B0X3N0YXRlLT5ibG9ja3MpOwogfQogCiAvKgpAQCAtMTgzOSwxMiArMTg2MywxMiBAQAogICogQWxsIG5vZGVzIHNob3VsZCBiZSBpbml0aWFsbHkgdW5tYXJrZWQuCiAgKi8KIHN0YXRpYyBpbnQKLWNvdW50X2Jsb2NrcyhzdHJ1Y3QgYmxvY2sgKnApCitjb3VudF9ibG9ja3Moc3RydWN0IGljb2RlICppYywgc3RydWN0IGJsb2NrICpwKQogewotCWlmIChwID09IDAgfHwgaXNNYXJrZWQocCkpCisJaWYgKHAgPT0gMCB8fCBpc01hcmtlZChpYywgcCkpCiAJCXJldHVybiAwOwotCU1hcmsocCk7Ci0JcmV0dXJuIGNvdW50X2Jsb2NrcyhKVChwKSkgKyBjb3VudF9ibG9ja3MoSkYocCkpICsgMTsKKwlNYXJrKGljLCBwKTsKKwlyZXR1cm4gY291bnRfYmxvY2tzKGljLCBKVChwKSkgKyBjb3VudF9ibG9ja3MoaWMsIEpGKHApKSArIDE7CiB9CiAKIC8qCkBAIC0xODUyLDIwICsxODc2LDIwIEBACiAgKiB0aGUgYmFzaWMgYmxvY2tzLCBhbmQgZW50ZXJpbmcgdGhlbSBpbnRvIHRoZSAnYmxvY2tzJyBhcnJheS5gCiAgKi8KIHN0YXRpYyB2b2lkCi1udW1iZXJfYmxrc19yKHN0cnVjdCBibG9jayAqcCkKK251bWJlcl9ibGtzX3Iob3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSwgc3RydWN0IGljb2RlICppYywgc3RydWN0IGJsb2NrICpwKQogewogCWludCBuOwogCi0JaWYgKHAgPT0gMCB8fCBpc01hcmtlZChwKSkKKwlpZiAocCA9PSAwIHx8IGlzTWFya2VkKGljLCBwKSkKIAkJcmV0dXJuOwogCi0JTWFyayhwKTsKLQluID0gbl9ibG9ja3MrKzsKKwlNYXJrKGljLCBwKTsKKwluID0gb3B0X3N0YXRlLT5uX2Jsb2NrcysrOwogCXAtPmlkID0gbjsKLQlibG9ja3Nbbl0gPSBwOworCW9wdF9zdGF0ZS0+YmxvY2tzW25dID0gcDsKIAotCW51bWJlcl9ibGtzX3IoSlQocCkpOwotCW51bWJlcl9ibGtzX3IoSkYocCkpOworCW51bWJlcl9ibGtzX3Iob3B0X3N0YXRlLCBpYywgSlQocCkpOworCW51bWJlcl9ibGtzX3Iob3B0X3N0YXRlLCBpYywgSkYocCkpOwogfQogCiAvKgpAQCAtMTg4NywxNCArMTkxMSwxNCBAQAogICoJYW4gZXh0cmEgbG9uZyBqdW1wIGlmIHRoZSBmYWxzZSBicmFuY2ggcmVxdWlyZXMgaXQgKHAtPmxvbmdqZikuCiAgKi8KIHN0YXRpYyB1X2ludAotY291bnRfc3RtdHMoc3RydWN0IGJsb2NrICpwKQorY291bnRfc3RtdHMoc3RydWN0IGljb2RlICppYywgc3RydWN0IGJsb2NrICpwKQogewogCXVfaW50IG47CiAKLQlpZiAocCA9PSAwIHx8IGlzTWFya2VkKHApKQorCWlmIChwID09IDAgfHwgaXNNYXJrZWQoaWMsIHApKQogCQlyZXR1cm4gMDsKLQlNYXJrKHApOwotCW4gPSBjb3VudF9zdG10cyhKVChwKSkgKyBjb3VudF9zdG10cyhKRihwKSk7CisJTWFyayhpYywgcCk7CisJbiA9IGNvdW50X3N0bXRzKGljLCBKVChwKSkgKyBjb3VudF9zdG10cyhpYywgSkYocCkpOwogCXJldHVybiBzbGVuZ3RoKHAtPnN0bXRzKSArIG4gKyAxICsgcC0+bG9uZ2p0ICsgcC0+bG9uZ2pmOwogfQogCkBAIC0xOTA0LDcgKzE5MjgsNyBAQAogICogZnJvbSB0aGUgdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBhbmQvb3Igc3RhdGVtZW50cy4KICAqLwogc3RhdGljIHZvaWQKLW9wdF9pbml0KHN0cnVjdCBibG9jayAqcm9vdCkKK29wdF9pbml0KGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgb3B0X3N0YXRlX3QgKm9wdF9zdGF0ZSwgc3RydWN0IGljb2RlICppYykKIHsKIAlicGZfdV9pbnQzMiAqcDsKIAlpbnQgaSwgbiwgbWF4X3N0bXRzOwpAQCAtMTkxMyw4NCArMTkzNyw4MSBAQAogCSAqIEZpcnN0LCBjb3VudCB0aGUgYmxvY2tzLCBzbyB3ZSBjYW4gbWFsbG9jIGFuIGFycmF5IHRvIG1hcAogCSAqIGJsb2NrIG51bWJlciB0byBibG9jay4gIFRoZW4sIHB1dCB0aGUgYmxvY2tzIGludG8gdGhlIGFycmF5LgogCSAqLwotCXVuTWFya0FsbCgpOwotCW4gPSBjb3VudF9ibG9ja3Mocm9vdCk7Ci0JYmxvY2tzID0gKHN0cnVjdCBibG9jayAqKiljYWxsb2Mobiwgc2l6ZW9mKCpibG9ja3MpKTsKLQlpZiAoYmxvY2tzID09IE5VTEwpCi0JCWJwZl9lcnJvcigibWFsbG9jIik7Ci0JdW5NYXJrQWxsKCk7Ci0Jbl9ibG9ja3MgPSAwOwotCW51bWJlcl9ibGtzX3Iocm9vdCk7CisJdW5NYXJrQWxsKGljKTsKKwluID0gY291bnRfYmxvY2tzKGljLCBpYy0+cm9vdCk7CisJb3B0X3N0YXRlLT5ibG9ja3MgPSAoc3RydWN0IGJsb2NrICoqKWNhbGxvYyhuLCBzaXplb2YoKm9wdF9zdGF0ZS0+YmxvY2tzKSk7CisJaWYgKG9wdF9zdGF0ZS0+YmxvY2tzID09IE5VTEwpCisJCWJwZl9lcnJvcihjc3RhdGUsICJtYWxsb2MiKTsKKwl1bk1hcmtBbGwoaWMpOworCW9wdF9zdGF0ZS0+bl9ibG9ja3MgPSAwOworCW51bWJlcl9ibGtzX3Iob3B0X3N0YXRlLCBpYywgaWMtPnJvb3QpOwogCi0Jbl9lZGdlcyA9IDIgKiBuX2Jsb2NrczsKLQllZGdlcyA9IChzdHJ1Y3QgZWRnZSAqKiljYWxsb2Mobl9lZGdlcywgc2l6ZW9mKCplZGdlcykpOwotCWlmIChlZGdlcyA9PSBOVUxMKQotCQlicGZfZXJyb3IoIm1hbGxvYyIpOworCW9wdF9zdGF0ZS0+bl9lZGdlcyA9IDIgKiBvcHRfc3RhdGUtPm5fYmxvY2tzOworCW9wdF9zdGF0ZS0+ZWRnZXMgPSAoc3RydWN0IGVkZ2UgKiopY2FsbG9jKG9wdF9zdGF0ZS0+bl9lZGdlcywgc2l6ZW9mKCpvcHRfc3RhdGUtPmVkZ2VzKSk7CisJaWYgKG9wdF9zdGF0ZS0+ZWRnZXMgPT0gTlVMTCkKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIm1hbGxvYyIpOwogCiAJLyoKIAkgKiBUaGUgbnVtYmVyIG9mIGxldmVscyBpcyBib3VuZGVkIGJ5IHRoZSBudW1iZXIgb2Ygbm9kZXMuCiAJICovCi0JbGV2ZWxzID0gKHN0cnVjdCBibG9jayAqKiljYWxsb2Mobl9ibG9ja3MsIHNpemVvZigqbGV2ZWxzKSk7Ci0JaWYgKGxldmVscyA9PSBOVUxMKQotCQlicGZfZXJyb3IoIm1hbGxvYyIpOworCW9wdF9zdGF0ZS0+bGV2ZWxzID0gKHN0cnVjdCBibG9jayAqKiljYWxsb2Mob3B0X3N0YXRlLT5uX2Jsb2Nrcywgc2l6ZW9mKCpvcHRfc3RhdGUtPmxldmVscykpOworCWlmIChvcHRfc3RhdGUtPmxldmVscyA9PSBOVUxMKQorCQlicGZfZXJyb3IoY3N0YXRlLCAibWFsbG9jIik7CiAKLQllZGdld29yZHMgPSBuX2VkZ2VzIC8gKDggKiBzaXplb2YoYnBmX3VfaW50MzIpKSArIDE7Ci0Jbm9kZXdvcmRzID0gbl9ibG9ja3MgLyAoOCAqIHNpemVvZihicGZfdV9pbnQzMikpICsgMTsKKwlvcHRfc3RhdGUtPmVkZ2V3b3JkcyA9IG9wdF9zdGF0ZS0+bl9lZGdlcyAvICg4ICogc2l6ZW9mKGJwZl91X2ludDMyKSkgKyAxOworCW9wdF9zdGF0ZS0+bm9kZXdvcmRzID0gb3B0X3N0YXRlLT5uX2Jsb2NrcyAvICg4ICogc2l6ZW9mKGJwZl91X2ludDMyKSkgKyAxOwogCiAJLyogWFhYICovCi0Jc3BhY2UgPSAoYnBmX3VfaW50MzIgKiltYWxsb2MoMiAqIG5fYmxvY2tzICogbm9kZXdvcmRzICogc2l6ZW9mKCpzcGFjZSkKLQkJCQkgKyBuX2VkZ2VzICogZWRnZXdvcmRzICogc2l6ZW9mKCpzcGFjZSkpOwotCWlmIChzcGFjZSA9PSBOVUxMKQotCQlicGZfZXJyb3IoIm1hbGxvYyIpOwotCXAgPSBzcGFjZTsKLQlhbGxfZG9tX3NldHMgPSBwOworCW9wdF9zdGF0ZS0+c3BhY2UgPSAoYnBmX3VfaW50MzIgKiltYWxsb2MoMiAqIG9wdF9zdGF0ZS0+bl9ibG9ja3MgKiBvcHRfc3RhdGUtPm5vZGV3b3JkcyAqIHNpemVvZigqb3B0X3N0YXRlLT5zcGFjZSkKKwkJCQkgKyBvcHRfc3RhdGUtPm5fZWRnZXMgKiBvcHRfc3RhdGUtPmVkZ2V3b3JkcyAqIHNpemVvZigqb3B0X3N0YXRlLT5zcGFjZSkpOworCWlmIChvcHRfc3RhdGUtPnNwYWNlID09IE5VTEwpCisJCWJwZl9lcnJvcihjc3RhdGUsICJtYWxsb2MiKTsKKwlwID0gb3B0X3N0YXRlLT5zcGFjZTsKKwlvcHRfc3RhdGUtPmFsbF9kb21fc2V0cyA9IHA7CiAJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlibG9ja3NbaV0tPmRvbSA9IHA7Ci0JCXAgKz0gbm9kZXdvcmRzOworCQlvcHRfc3RhdGUtPmJsb2Nrc1tpXS0+ZG9tID0gcDsKKwkJcCArPSBvcHRfc3RhdGUtPm5vZGV3b3JkczsKIAl9Ci0JYWxsX2Nsb3N1cmVfc2V0cyA9IHA7CisJb3B0X3N0YXRlLT5hbGxfY2xvc3VyZV9zZXRzID0gcDsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCWJsb2Nrc1tpXS0+Y2xvc3VyZSA9IHA7Ci0JCXAgKz0gbm9kZXdvcmRzOworCQlvcHRfc3RhdGUtPmJsb2Nrc1tpXS0+Y2xvc3VyZSA9IHA7CisJCXAgKz0gb3B0X3N0YXRlLT5ub2Rld29yZHM7CiAJfQotCWFsbF9lZGdlX3NldHMgPSBwOworCW9wdF9zdGF0ZS0+YWxsX2VkZ2Vfc2V0cyA9IHA7CiAJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlyZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmIgPSBibG9ja3NbaV07CisJCXJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYiA9IG9wdF9zdGF0ZS0+YmxvY2tzW2ldOwogCiAJCWItPmV0LmVkb20gPSBwOwotCQlwICs9IGVkZ2V3b3JkczsKKwkJcCArPSBvcHRfc3RhdGUtPmVkZ2V3b3JkczsKIAkJYi0+ZWYuZWRvbSA9IHA7Ci0JCXAgKz0gZWRnZXdvcmRzOworCQlwICs9IG9wdF9zdGF0ZS0+ZWRnZXdvcmRzOwogCQliLT5ldC5pZCA9IGk7Ci0JCWVkZ2VzW2ldID0gJmItPmV0OwotCQliLT5lZi5pZCA9IG5fYmxvY2tzICsgaTsKLQkJZWRnZXNbbl9ibG9ja3MgKyBpXSA9ICZiLT5lZjsKKwkJb3B0X3N0YXRlLT5lZGdlc1tpXSA9ICZiLT5ldDsKKwkJYi0+ZWYuaWQgPSBvcHRfc3RhdGUtPm5fYmxvY2tzICsgaTsKKwkJb3B0X3N0YXRlLT5lZGdlc1tvcHRfc3RhdGUtPm5fYmxvY2tzICsgaV0gPSAmYi0+ZWY7CiAJCWItPmV0LnByZWQgPSBiOwogCQliLT5lZi5wcmVkID0gYjsKIAl9CiAJbWF4X3N0bXRzID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCQltYXhfc3RtdHMgKz0gc2xlbmd0aChibG9ja3NbaV0tPnN0bXRzKSArIDE7CisJCW1heF9zdG10cyArPSBzbGVuZ3RoKG9wdF9zdGF0ZS0+YmxvY2tzW2ldLT5zdG10cykgKyAxOwogCS8qCiAJICogV2UgYWxsb2NhdGUgYXQgbW9zdCAzIHZhbHVlIG51bWJlcnMgcGVyIHN0YXRlbWVudCwKIAkgKiBzbyB0aGlzIGlzIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgdmFsbm9kZXMKIAkgKiB3ZSdsbCBuZWVkLgogCSAqLwotCW1heHZhbCA9IDMgKiBtYXhfc3RtdHM7Ci0Jdm1hcCA9IChzdHJ1Y3Qgdm1hcGluZm8gKiljYWxsb2MobWF4dmFsLCBzaXplb2YoKnZtYXApKTsKLQl2bm9kZV9iYXNlID0gKHN0cnVjdCB2YWxub2RlICopY2FsbG9jKG1heHZhbCwgc2l6ZW9mKCp2bm9kZV9iYXNlKSk7Ci0JaWYgKHZtYXAgPT0gTlVMTCB8fCB2bm9kZV9iYXNlID09IE5VTEwpCi0JCWJwZl9lcnJvcigibWFsbG9jIik7CisJb3B0X3N0YXRlLT5tYXh2YWwgPSAzICogbWF4X3N0bXRzOworCW9wdF9zdGF0ZS0+dm1hcCA9IChzdHJ1Y3Qgdm1hcGluZm8gKiljYWxsb2Mob3B0X3N0YXRlLT5tYXh2YWwsIHNpemVvZigqb3B0X3N0YXRlLT52bWFwKSk7CisJb3B0X3N0YXRlLT52bm9kZV9iYXNlID0gKHN0cnVjdCB2YWxub2RlICopY2FsbG9jKG9wdF9zdGF0ZS0+bWF4dmFsLCBzaXplb2YoKm9wdF9zdGF0ZS0+dm5vZGVfYmFzZSkpOworCWlmIChvcHRfc3RhdGUtPnZtYXAgPT0gTlVMTCB8fCBvcHRfc3RhdGUtPnZub2RlX2Jhc2UgPT0gTlVMTCkKKwkJYnBmX2Vycm9yKGNzdGF0ZSwgIm1hbGxvYyIpOwogfQogCiAvKgotICogU29tZSBwb2ludGVycyB1c2VkIHRvIGNvbnZlcnQgdGhlIGJhc2ljIGJsb2NrIGZvcm0gb2YgdGhlIGNvZGUsCi0gKiBpbnRvIHRoZSBhcnJheSBmb3JtIHRoYXQgQlBGIHJlcXVpcmVzLiAgJ2ZzdGFydCcgd2lsbCBwb2ludCB0bwotICogdGhlIG1hbGxvYydkIGFycmF5IHdoaWxlICdmdGFpbCcgaXMgdXNlZCBkdXJpbmcgdGhlIHJlY3Vyc2l2ZSB0cmF2ZXJzYWwuCisgKiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHN1cHBvcnRpbmcgb3B0aW1pemVyIGRlYnVnZ2luZy4gIEl0IGlzCisgKiBnbG9iYWwgc3RhdGUsIHNvIGRvICpub3QqIGRvIG1vcmUgdGhhbiBvbmUgY29tcGlsZSBpbiBwYXJhbGxlbAorICogYW5kIGV4cGVjdCBpdCB0byBwcm92aWRlIG1lYW5pbmdmdWwgaW5mb3JtYXRpb24uCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYnBmX2luc24gKmZzdGFydDsKLXN0YXRpYyBzdHJ1Y3QgYnBmX2luc24gKmZ0YWlsOwotCiAjaWZkZWYgQkRFQlVHCiBpbnQgYmlkc1sxMDAwXTsKICNlbmRpZgpAQCAtMjAwMiwzNSArMjAyMywzNiBAQAogICogcHJvcGVybHkuCiAgKi8KIHN0YXRpYyBpbnQKLWNvbnZlcnRfY29kZV9yKHN0cnVjdCBibG9jayAqcCkKK2NvbnZlcnRfY29kZV9yKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgY29udl9zdGF0ZV90ICpjb252X3N0YXRlLAorICAgIHN0cnVjdCBpY29kZSAqaWMsIHN0cnVjdCBibG9jayAqcCkKIHsKIAlzdHJ1Y3QgYnBmX2luc24gKmRzdDsKIAlzdHJ1Y3Qgc2xpc3QgKnNyYzsKLQlpbnQgc2xlbjsKKwl1X2ludCBzbGVuOwogCXVfaW50IG9mZjsKIAlpbnQgZXh0cmFqbXBzOwkJLyogbnVtYmVyIG9mIGV4dHJhIGp1bXBzIGluc2VydGVkICovCiAJc3RydWN0IHNsaXN0ICoqb2Zmc2V0ID0gTlVMTDsKIAotCWlmIChwID09IDAgfHwgaXNNYXJrZWQocCkpCisJaWYgKHAgPT0gMCB8fCBpc01hcmtlZChpYywgcCkpCiAJCXJldHVybiAoMSk7Ci0JTWFyayhwKTsKKwlNYXJrKGljLCBwKTsKIAotCWlmIChjb252ZXJ0X2NvZGVfcihKRihwKSkgPT0gMCkKKwlpZiAoY29udmVydF9jb2RlX3IoY3N0YXRlLCBjb252X3N0YXRlLCBpYywgSkYocCkpID09IDApCiAJCXJldHVybiAoMCk7Ci0JaWYgKGNvbnZlcnRfY29kZV9yKEpUKHApKSA9PSAwKQorCWlmIChjb252ZXJ0X2NvZGVfcihjc3RhdGUsIGNvbnZfc3RhdGUsIGljLCBKVChwKSkgPT0gMCkKIAkJcmV0dXJuICgwKTsKIAogCXNsZW4gPSBzbGVuZ3RoKHAtPnN0bXRzKTsKLQlkc3QgPSBmdGFpbCAtPSAoc2xlbiArIDEgKyBwLT5sb25nanQgKyBwLT5sb25namYpOworCWRzdCA9IGNvbnZfc3RhdGUtPmZ0YWlsIC09IChzbGVuICsgMSArIHAtPmxvbmdqdCArIHAtPmxvbmdqZik7CiAJCS8qIGluZmxhdGUgbGVuZ3RoIGJ5IGFueSBleHRyYSBqdW1wcyAqLwogCi0JcC0+b2Zmc2V0ID0gZHN0IC0gZnN0YXJ0OworCXAtPm9mZnNldCA9IChpbnQpKGRzdCAtIGNvbnZfc3RhdGUtPmZzdGFydCk7CiAKIAkvKiBnZW5lcmF0ZSBvZmZzZXRbXSBmb3IgY29udmVuaWVuY2UgICovCiAJaWYgKHNsZW4pIHsKIAkJb2Zmc2V0ID0gKHN0cnVjdCBzbGlzdCAqKiljYWxsb2Moc2xlbiwgc2l6ZW9mKHN0cnVjdCBzbGlzdCAqKSk7CiAJCWlmICghb2Zmc2V0KSB7Ci0JCQlicGZfZXJyb3IoIm5vdCBlbm91Z2ggY29yZSIpOworCQkJYnBmX2Vycm9yKGNzdGF0ZSwgIm5vdCBlbm91Z2ggY29yZSIpOwogCQkJLypOT1RSRUFDSEVEKi8KIAkJfQogCX0KQEAgLTIwNTQsNyArMjA3Niw3IEBACiAJCWlmIChCUEZfQ0xBU1Moc3JjLT5zLmNvZGUpICE9IEJQRl9KTVAgfHwgc3JjLT5zLmNvZGUgPT0gKEJQRl9KTVB8QlBGX0pBKSkgewogI2lmIDAKIAkJCWlmIChzcmMtPnMuanQgfHwgc3JjLT5zLmpmKSB7Ci0JCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIGptcCBkZXN0aW5hdGlvbiIpOworCQkJCWJwZl9lcnJvcihjc3RhdGUsICJpbGxlZ2FsIGptcCBkZXN0aW5hdGlvbiIpOwogCQkJCS8qTk9UUkVBQ0hFRCovCiAJCQl9CiAjZW5kaWYKQEAgLTIwNjQsNyArMjA4Niw3IEBACiAJCQlnb3RvIGZpbGxlZDsKIAogCSAgICB7Ci0JCWludCBpOworCQl1X2ludCBpOwogCQlpbnQganQsIGpmOwogCQljb25zdCBjaGFyICpsamVyciA9ICIlcyBmb3IgYmxvY2stbG9jYWwgcmVsYXRpdmUganVtcDogb2ZmPSVkIjsKIApAQCAtMjA3NCw3ICsyMDk2LDcgQEAKICNlbmRpZgogCiAJCWlmICghc3JjLT5zLmp0IHx8ICFzcmMtPnMuamYpIHsKLQkJCWJwZl9lcnJvcihsamVyciwgIm5vIGptcCBkZXN0aW5hdGlvbiIsIG9mZik7CisJCQlicGZfZXJyb3IoY3N0YXRlLCBsamVyciwgIm5vIGptcCBkZXN0aW5hdGlvbiIsIG9mZik7CiAJCQkvKk5PVFJFQUNIRUQqLwogCQl9CiAKQEAgLTIwODIsNyArMjEwNCw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBzbGVuOyBpKyspIHsKIAkJCWlmIChvZmZzZXRbaV0gPT0gc3JjLT5zLmp0KSB7CiAJCQkJaWYgKGp0KSB7Ci0JCQkJCWJwZl9lcnJvcihsamVyciwgIm11bHRpcGxlIG1hdGNoZXMiLCBvZmYpOworCQkJCQlicGZfZXJyb3IoY3N0YXRlLCBsamVyciwgIm11bHRpcGxlIG1hdGNoZXMiLCBvZmYpOwogCQkJCQkvKk5PVFJFQUNIRUQqLwogCQkJCX0KIApAQCAtMjA5MSw3ICsyMTEzLDcgQEAKIAkJCX0KIAkJCWlmIChvZmZzZXRbaV0gPT0gc3JjLT5zLmpmKSB7CiAJCQkJaWYgKGpmKSB7Ci0JCQkJCWJwZl9lcnJvcihsamVyciwgIm11bHRpcGxlIG1hdGNoZXMiLCBvZmYpOworCQkJCQlicGZfZXJyb3IoY3N0YXRlLCBsamVyciwgIm11bHRpcGxlIG1hdGNoZXMiLCBvZmYpOwogCQkJCQkvKk5PVFJFQUNIRUQqLwogCQkJCX0KIAkJCQlkc3QtPmpmID0gaSAtIG9mZiAtIDE7CkBAIC0yMDk5LDcgKzIxMjEsNyBAQAogCQkJfQogCQl9CiAJCWlmICghanQgfHwgIWpmKSB7Ci0JCQlicGZfZXJyb3IobGplcnIsICJubyBkZXN0aW5hdGlvbiBmb3VuZCIsIG9mZik7CisJCQlicGZfZXJyb3IoY3N0YXRlLCBsamVyciwgIm5vIGRlc3RpbmF0aW9uIGZvdW5kIiwgb2ZmKTsKIAkJCS8qTk9UUkVBQ0hFRCovCiAJCX0KIAkgICAgfQpAQCAtMjExMSw3ICsyMTMzLDcgQEAKIAkJZnJlZShvZmZzZXQpOwogCiAjaWZkZWYgQkRFQlVHCi0JYmlkc1tkc3QgLSBmc3RhcnRdID0gcC0+aWQgKyAxOworCWJpZHNbZHN0IC0gY29udl9zdGF0ZS0+ZnN0YXJ0XSA9IHAtPmlkICsgMTsKICNlbmRpZgogCWRzdC0+Y29kZSA9ICh1X3Nob3J0KXAtPnMuY29kZTsKIAlkc3QtPmsgPSBwLT5zLms7CkBAIC0yMTc0LDI4ICsyMTk2LDMwIEBACiAgKiBkb25lIHdpdGggdGhlIGZpbHRlciBwcm9ncmFtLiAgU2VlIHRoZSBwY2FwIG1hbiBwYWdlLgogICovCiBzdHJ1Y3QgYnBmX2luc24gKgotaWNvZGVfdG9fZmNvZGUoc3RydWN0IGJsb2NrICpyb290LCB1X2ludCAqbGVucCkKK2ljb2RlX3RvX2Zjb2RlKGNvbXBpbGVyX3N0YXRlX3QgKmNzdGF0ZSwgc3RydWN0IGljb2RlICppYywKKyAgICBzdHJ1Y3QgYmxvY2sgKnJvb3QsIHVfaW50ICpsZW5wKQogewogCXVfaW50IG47CiAJc3RydWN0IGJwZl9pbnNuICpmcDsKKwljb252X3N0YXRlX3QgY29udl9zdGF0ZTsKIAogCS8qCiAJICogTG9vcCBkb2luZyBjb252ZXJ0X2NvZGVfcigpIHVudGlsIG5vIGJyYW5jaGVzIHJlbWFpbgogCSAqIHdpdGggdG9vLWxhcmdlIG9mZnNldHMuCiAJICovCiAJd2hpbGUgKDEpIHsKLQkgICAgdW5NYXJrQWxsKCk7Ci0JICAgIG4gPSAqbGVucCA9IGNvdW50X3N0bXRzKHJvb3QpOworCSAgICB1bk1hcmtBbGwoaWMpOworCSAgICBuID0gKmxlbnAgPSBjb3VudF9zdG10cyhpYywgcm9vdCk7CiAKIAkgICAgZnAgPSAoc3RydWN0IGJwZl9pbnNuICopbWFsbG9jKHNpemVvZigqZnApICogbik7CiAJICAgIGlmIChmcCA9PSBOVUxMKQotCQkgICAgYnBmX2Vycm9yKCJtYWxsb2MiKTsKKwkJICAgIGJwZl9lcnJvcihjc3RhdGUsICJtYWxsb2MiKTsKIAkgICAgbWVtc2V0KChjaGFyICopZnAsIDAsIHNpemVvZigqZnApICogbik7Ci0JICAgIGZzdGFydCA9IGZwOwotCSAgICBmdGFpbCA9IGZwICsgbjsKKwkgICAgY29udl9zdGF0ZS5mc3RhcnQgPSBmcDsKKwkgICAgY29udl9zdGF0ZS5mdGFpbCA9IGZwICsgbjsKIAotCSAgICB1bk1hcmtBbGwoKTsKLQkgICAgaWYgKGNvbnZlcnRfY29kZV9yKHJvb3QpKQorCSAgICB1bk1hcmtBbGwoaWMpOworCSAgICBpZiAoY29udmVydF9jb2RlX3IoY3N0YXRlLCAmY29udl9zdGF0ZSwgaWMsIHJvb3QpKQogCQlicmVhazsKIAkgICAgZnJlZShmcCk7CiAJfQpAQCAtMjIyMCw3ICsyMjQ0LDcgQEAKIAkgKiBWYWxpZGF0ZSB0aGUgcHJvZ3JhbS4KIAkgKi8KIAlpZiAoIWJwZl92YWxpZGF0ZShmcC0+YmZfaW5zbnMsIGZwLT5iZl9sZW4pKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKIAkJCSJCUEYgcHJvZ3JhbSBpcyBub3QgdmFsaWQiKTsKIAkJcmV0dXJuICgtMSk7CiAJfQpAQCAtMjIzNCw3ICsyMjU4LDcgQEAKIAlwLT5mY29kZS5iZl9sZW4gPSBmcC0+YmZfbGVuOwogCXAtPmZjb2RlLmJmX2luc25zID0gKHN0cnVjdCBicGZfaW5zbiAqKW1hbGxvYyhwcm9nX3NpemUpOwogCWlmIChwLT5mY29kZS5iZl9pbnNucyA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKIAkJCSAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQpAQCAtMjI0NCwxNCArMjI2OCwxNSBAQAogCiAjaWZkZWYgQkRFQlVHCiBzdGF0aWMgdm9pZAotZG90X2R1bXBfbm9kZShzdHJ1Y3QgYmxvY2sgKmJsb2NrLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnByb2csIEZJTEUgKm91dCkKK2RvdF9kdW1wX25vZGUoc3RydWN0IGljb2RlICppYywgc3RydWN0IGJsb2NrICpibG9jaywgc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nLAorICAgIEZJTEUgKm91dCkKIHsKIAlpbnQgaWNvdW50LCBub2Zmc2V0OwogCWludCBpOwogCi0JaWYgKGJsb2NrID09IE5VTEwgfHwgaXNNYXJrZWQoYmxvY2spKQorCWlmIChibG9jayA9PSBOVUxMIHx8IGlzTWFya2VkKGljLCBibG9jaykpCiAJCXJldHVybjsKLQlNYXJrKGJsb2NrKTsKKwlNYXJrKGljLCBibG9jayk7CiAKIAlpY291bnQgPSBzbGVuZ3RoKGJsb2NrLT5zdG10cykgKyAxICsgYmxvY2stPmxvbmdqdCArIGJsb2NrLT5sb25namY7CiAJbm9mZnNldCA9IG1pbihibG9jay0+b2Zmc2V0ICsgaWNvdW50LCAoaW50KXByb2ctPmJmX2xlbik7CkBAIC0yMjcxLDE1ICsyMjk2LDE2IEBACiAJCWZwcmludGYob3V0LCAiLCBwZXJpcGhlcmllcz0yIik7CiAJZnByaW50ZihvdXQsICJdO1xuIik7CiAKLQlkb3RfZHVtcF9ub2RlKEpUKGJsb2NrKSwgcHJvZywgb3V0KTsKLQlkb3RfZHVtcF9ub2RlKEpGKGJsb2NrKSwgcHJvZywgb3V0KTsKKwlkb3RfZHVtcF9ub2RlKGljLCBKVChibG9jayksIHByb2csIG91dCk7CisJZG90X2R1bXBfbm9kZShpYywgSkYoYmxvY2spLCBwcm9nLCBvdXQpOwogfQorCiBzdGF0aWMgdm9pZAotZG90X2R1bXBfZWRnZShzdHJ1Y3QgYmxvY2sgKmJsb2NrLCBGSUxFICpvdXQpCitkb3RfZHVtcF9lZGdlKHN0cnVjdCBpY29kZSAqaWMsIHN0cnVjdCBibG9jayAqYmxvY2ssIEZJTEUgKm91dCkKIHsKLQlpZiAoYmxvY2sgPT0gTlVMTCB8fCBpc01hcmtlZChibG9jaykpCisJaWYgKGJsb2NrID09IE5VTEwgfHwgaXNNYXJrZWQoaWMsIGJsb2NrKSkKIAkJcmV0dXJuOwotCU1hcmsoYmxvY2spOworCU1hcmsoaWMsIGJsb2NrKTsKIAogCWlmIChKVChibG9jaykpIHsKIAkJZnByaW50ZihvdXQsICJcdFwiYmxvY2slZFwiOnNlIC0+IFwiYmxvY2slZFwiOm4gW2xhYmVsPVwiVFwiXTsgXG4iLApAQCAtMjI4Nyw5ICsyMzEzLDEwIEBACiAJCWZwcmludGYob3V0LCAiXHRcImJsb2NrJWRcIjpzdyAtPiBcImJsb2NrJWRcIjpuIFtsYWJlbD1cIkZcIl07IFxuIiwKIAkJCSAgIGJsb2NrLT5pZCwgSkYoYmxvY2spLT5pZCk7CiAJfQotCWRvdF9kdW1wX2VkZ2UoSlQoYmxvY2spLCBvdXQpOwotCWRvdF9kdW1wX2VkZ2UoSkYoYmxvY2spLCBvdXQpOworCWRvdF9kdW1wX2VkZ2UoaWMsIEpUKGJsb2NrKSwgb3V0KTsKKwlkb3RfZHVtcF9lZGdlKGljLCBKRihibG9jayksIG91dCk7CiB9CisKIC8qIE91dHB1dCB0aGUgYmxvY2sgQ0ZHIHVzaW5nIGdyYXBodml6L0RPVCBsYW5ndWFnZQogICogSW4gdGhlIENGRywgYmxvY2sncyBjb2RlLCB2YWx1ZSBpbmRleCBmb3IgZWFjaCByZWdpc3RlcnMgYXQgRVhJVCwKICAqIGFuZCB0aGUganVtcCByZWxhdGlvbnNoaXAgaXMgc2hvdy4KQEAgLTIzMTAsNDYgKzIzMzcsNDggQEAKICAqICBhbmQgcnVuIGBkb3QgLVRwbmcgLU8gYnBmLmRvdCcgdG8gZHJhdyB0aGUgZ3JhcGguCiAgKi8KIHN0YXRpYyB2b2lkCi1kb3RfZHVtcChzdHJ1Y3QgYmxvY2sgKnJvb3QpCitkb3RfZHVtcChjb21waWxlcl9zdGF0ZV90ICpjc3RhdGUsIHN0cnVjdCBpY29kZSAqaWMpCiB7CiAJc3RydWN0IGJwZl9wcm9ncmFtIGY7CiAJRklMRSAqb3V0ID0gc3Rkb3V0OwogCiAJbWVtc2V0KGJpZHMsIDAsIHNpemVvZiBiaWRzKTsKLQlmLmJmX2luc25zID0gaWNvZGVfdG9fZmNvZGUocm9vdCwgJmYuYmZfbGVuKTsKKwlmLmJmX2luc25zID0gaWNvZGVfdG9fZmNvZGUoY3N0YXRlLCBpYywgaWMtPnJvb3QsICZmLmJmX2xlbik7CiAKIAlmcHJpbnRmKG91dCwgImRpZ3JhcGggQlBGIHtcbiIpOwotCXVuTWFya0FsbCgpOwotCWRvdF9kdW1wX25vZGUocm9vdCwgJmYsIG91dCk7Ci0JdW5NYXJrQWxsKCk7Ci0JZG90X2R1bXBfZWRnZShyb290LCBvdXQpOworCWljLT5jdXJfbWFyayA9IDA7CisJdW5NYXJrQWxsKGljKTsKKwlkb3RfZHVtcF9ub2RlKGljLCBpYy0+cm9vdCwgJmYsIG91dCk7CisJaWMtPmN1cl9tYXJrID0gMDsKKwl1bk1hcmtBbGwoaWMpOworCWRvdF9kdW1wX2VkZ2UoaWMsIGljLT5yb290LCBvdXQpOwogCWZwcmludGYob3V0LCAifVxuIik7CiAKIAlmcmVlKChjaGFyICopZi5iZl9pbnNucyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1wbGFpbl9kdW1wKHN0cnVjdCBibG9jayAqcm9vdCkKK3BsYWluX2R1bXAoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBzdHJ1Y3QgaWNvZGUgKmljKQogewogCXN0cnVjdCBicGZfcHJvZ3JhbSBmOwogCiAJbWVtc2V0KGJpZHMsIDAsIHNpemVvZiBiaWRzKTsKLQlmLmJmX2luc25zID0gaWNvZGVfdG9fZmNvZGUocm9vdCwgJmYuYmZfbGVuKTsKKwlmLmJmX2luc25zID0gaWNvZGVfdG9fZmNvZGUoY3N0YXRlLCBpYywgaWMtPnJvb3QsICZmLmJmX2xlbik7CiAJYnBmX2R1bXAoJmYsIDEpOwogCXB1dGNoYXIoJ1xuJyk7CiAJZnJlZSgoY2hhciAqKWYuYmZfaW5zbnMpOwogfQorCiBzdGF0aWMgdm9pZAotb3B0X2R1bXAoc3RydWN0IGJsb2NrICpyb290KQorb3B0X2R1bXAoY29tcGlsZXJfc3RhdGVfdCAqY3N0YXRlLCBzdHJ1Y3QgaWNvZGUgKmljKQogewogCS8qIGlmIG9wdGltaXplciBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCwgb3V0cHV0IERPVCBncmFwaAotCSAqIGBkZmxhZz00JyBpcyBlcXVpdmFsZW50IHRvIC1kZGRkIHRvIGZvbGxvdyAtZC8tZGQvLWRkZAotICAgICAqIGNvbnZlbnRpb24gaW4gdGNwZHVtcCBjb21tYW5kIGxpbmUKKwkgKiBgcGNhcF9vcHRpbWl6ZXJfZGVidWc9NCcgaXMgZXF1aXZhbGVudCB0byAtZGRkZCB0byBmb2xsb3cgLWQvLWRkLy1kZGQKKwkgKiBjb252ZW50aW9uIGluIHRjcGR1bXAgY29tbWFuZCBsaW5lCiAJICovCi0JaWYgKGRmbGFnID4gMykKLQkJZG90X2R1bXAocm9vdCk7CisJaWYgKHBjYXBfb3B0aW1pemVyX2RlYnVnID4gMykKKwkJZG90X2R1bXAoY3N0YXRlLCBpYyk7CiAJZWxzZQotCQlwbGFpbl9kdW1wKHJvb3QpOworCQlwbGFpbl9kdW1wKGNzdGF0ZSwgaWMpOwogfQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3BjYXAtYnBmLmMgYi9wY2FwLWJwZi5jCmluZGV4IGIxZGExYTAuLmI3NjU5MDQgMTAwNjQ0Ci0tLSBhL3BjYXAtYnBmLmMKKysrIGIvcGNhcC1icGYuYwpAQCAtNDgsNiArNDgsMTUgQEAKICNlbmRpZgogI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiAKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiBkZWZpbmVkKFNJT0NJRkNSRUFURTIpCisvKgorICogQWRkIHN1cHBvcnQgZm9yIGNhcHR1cmluZyBvbiBGcmVlQlNEIHVzYnVzTiBpbnRlcmZhY2VzLgorICovCitzdGF0aWMgY29uc3QgY2hhciB1c2J1c19wcmVmaXhbXSA9ICJ1c2J1cyI7CisjZGVmaW5lIFVTQlVTX1BSRUZJWF9MRU4JKHNpemVvZih1c2J1c19wcmVmaXgpIC0gMSkKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNlbmRpZgorCiAjaWZkZWYgSEFWRV9aRVJPQ09QWV9CUEYKICNpbmNsdWRlIDxtYWNoaW5lL2F0b21pYy5oPgogI2VuZGlmCkBAIC0xMzQsMTAgKzE0Myw2IEBACiAgKiBQcml2YXRlIGRhdGEgZm9yIGNhcHR1cmluZyBvbiBCUEYgZGV2aWNlcy4KICAqLwogc3RydWN0IHBjYXBfYnBmIHsKLSNpZmRlZiBQQ0FQX0ZERElQQUQKLQlpbnQgZmRkaXBhZDsKLSNlbmRpZgotCiAjaWZkZWYgSEFWRV9aRVJPQ09QWV9CUEYKIAkvKgogCSAqIFplcm8tY29weSByZWFkIGJ1ZmZlciAtLSBmb3IgemVyby1jb3B5IEJQRi4gICdidWZmZXInIGFib3ZlIHdpbGwKQEAgLTE3MSwxMCArMTc2LDIzIEBACiAgKiBTdHVmZiB0byBkbyB3aGVuIHdlIGNsb3NlLgogICovCiAjZGVmaW5lIE1VU1RfQ0xFQVJfUkZNT04JMHgwMDAwMDAwMQkvKiBjbGVhciByZm1vbiAobW9uaXRvcikgbW9kZSAqLworI2RlZmluZSBNVVNUX0RFU1RST1lfVVNCVVMJMHgwMDAwMDAwMgkvKiBkZXN0cm95IHVzYnVzTiBpbnRlcmZhY2UgKi8KIAogI2lmZGVmIEJJT0NHRExUTElTVAogIyBpZiAoZGVmaW5lZChIQVZFX05FVF9JRl9NRURJQV9IKSAmJiBkZWZpbmVkKElGTV9JRUVFODAyMTEpKSAmJiAhZGVmaW5lZChfX0FQUExFX18pCiAjZGVmaW5lIEhBVkVfQlNEX0lFRUU4MDIxMQorCisvKgorICogVGhlIGlmbV91bGlzdCBtZW1iZXIgb2YgYSBzdHJ1Y3QgaWZtZWRpYXJlcSBpcyBhbiBpbnQgKiBvbiBtb3N0IHN5c3RlbXMsCisgKiBidXQgaXQncyBhIHVpbnQ2NF90IG9uIG5ld2VyIHZlcnNpb25zIG9mIE9wZW5CU0QuCisgKgorICogV2UgY2hlY2sgdGhpcyBieSBjaGVja2luZyB3aGV0aGVyIElGTV9HTUFTSyBpcyBkZWZpbmVkIGFuZCA+IDJeMzItMS4KKyAqLworIyAgaWYgZGVmaW5lZChJRk1fR01BU0spICYmIElGTV9HTUFTSyA+IDB4RkZGRkZGRkYKKyMgICAgZGVmaW5lIElGTV9VTElTVF9UWVBFCXVpbnQ2NF90CisjICBlbHNlCisjICAgIGRlZmluZSBJRk1fVUxJU1RfVFlQRQlpbnQKKyMgIGVuZGlmCiAjIGVuZGlmCiAKICMgaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoSEFWRV9CU0RfSUVFRTgwMjExKQpAQCAtMzQ3LDcgKzM2NSw3IEBACiAJCQlpZiAoZGF0YSkKIAkJCQlyZXR1cm4gKGRhdGEpOwogCQkJaWYgKGlvY3RsKHAtPmZkLCBCSU9DUk9UWkJVRiwgJmJ6KSA8IDApIHsKLQkJCQkodm9pZCkgc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSh2b2lkKSBwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgIkJJT0NST1RaQlVGOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAJCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAkJCX0KQEAgLTM3NSw3ICszOTMsNyBAQAogCQkJfQogCQkJcmV0dXJuICgwKTsKIAkJfSBlbHNlIGlmIChyIDwgMCkgewotCQkJKHZvaWQpIHNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSh2b2lkKSBwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAic2VsZWN0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CkBAIC0zOTQsNyArNDEyLDcgQEAKIAkgKiBkYXRhLgogCSAqLwogCWlmIChpb2N0bChwLT5mZCwgQklPQ1JPVFpCVUYsICZieikgPCAwKSB7Ci0JCSh2b2lkKSBzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSh2b2lkKSBwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJCSU9DUk9UWkJVRjogJXMiLCBzdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KQEAgLTQxOSwxNiArNDM3LDMyIEBACiAjZW5kaWYgLyogSEFWRV9aRVJPQ09QWV9CUEYgKi8KIAogcGNhcF90ICoKLXBjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCitwY2FwX2NyZWF0ZV9pbnRlcmZhY2UoY29uc3QgY2hhciAqZGV2aWNlIF9VXywgY2hhciAqZWJ1ZikKIHsKIAlwY2FwX3QgKnA7CiAKLQlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9icGYpKTsKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfYnBmKSk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIChOVUxMKTsKIAogCXAtPmFjdGl2YXRlX29wID0gcGNhcF9hY3RpdmF0ZV9icGY7CiAJcC0+Y2FuX3NldF9yZm1vbl9vcCA9IHBjYXBfY2FuX3NldF9yZm1vbl9icGY7CisjaWZkZWYgQklPQ1NUU1RBTVAKKwkvKgorCSAqIFdlIGNsYWltIHRoYXQgd2Ugc3VwcG9ydCBtaWNyb3NlY29uZCBhbmQgbmFub3NlY29uZCB0aW1lCisJICogc3RhbXBzLgorCSAqLworCXAtPnRzdGFtcF9wcmVjaXNpb25fY291bnQgPSAyOworCXAtPnRzdGFtcF9wcmVjaXNpb25fbGlzdCA9IG1hbGxvYygyICogc2l6ZW9mKHVfaW50KSk7CisJaWYgKHAtPnRzdGFtcF9wcmVjaXNpb25fbGlzdCA9PSBOVUxMKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZnJlZShwKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJcC0+dHN0YW1wX3ByZWNpc2lvbl9saXN0WzBdID0gUENBUF9UU1RBTVBfUFJFQ0lTSU9OX01JQ1JPOworCXAtPnRzdGFtcF9wcmVjaXNpb25fbGlzdFsxXSA9IFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9OQU5POworI2VuZGlmIC8qIEJJT0NTVFNUQU1QICovCiAJcmV0dXJuIChwKTsKIH0KIApAQCAtNDM3LDcgKzQ3MSw3IEBACiAgKiBPbiBmYWlsdXJlLCByZXR1cm5zIGEgUENBUF9FUlJPUl8gdmFsdWUsIGFuZCBzZXRzIHAtPmVycmJ1Zi4KICAqLwogc3RhdGljIGludAotYnBmX29wZW4ocGNhcF90ICpwKQorYnBmX29wZW4oY2hhciAqZXJyYnVmKQogewogCWludCBmZDsKICNpZmRlZiBIQVZFX0NMT05JTkdfQlBGCkBAIC00NTMsNyArNDg3LDcgQEAKIAkgKiBhbmQgY3JlYXRlIHRoZSBCUEYgZGV2aWNlIGVudHJpZXMsIGlmIHRoZXkgZG9uJ3QKIAkgKiBhbHJlYWR5IGV4aXN0LgogCSAqLwotCWlmIChicGZfbG9hZChwLT5lcnJidWYpID09IFBDQVBfRVJST1IpCisJaWYgKGJwZl9sb2FkKGVycmJ1ZikgPT0gUENBUF9FUlJPUikKIAkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKICNlbmRpZgogCkBAIC00NjQsNyArNDk4LDcgQEAKIAkJCWZkID0gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKIAkJZWxzZQogCQkJZmQgPSBQQ0FQX0VSUk9SOwotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICIoY2Fubm90IG9wZW4gZGV2aWNlKSAlczogJXMiLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAl9CiAjZWxzZQpAQCAtNDcyLDcgKzUwNiw3IEBACiAJICogR28gdGhyb3VnaCBhbGwgdGhlIG1pbm9ycyBhbmQgZmluZCBvbmUgdGhhdCBpc24ndCBpbiB1c2UuCiAJICovCiAJZG8gewotCQkodm9pZClzbnByaW50ZihkZXZpY2UsIHNpemVvZihkZXZpY2UpLCAiL2Rldi9icGYlZCIsIG4rKyk7CisJCSh2b2lkKXBjYXBfc25wcmludGYoZGV2aWNlLCBzaXplb2YoZGV2aWNlKSwgIi9kZXYvYnBmJWQiLCBuKyspOwogCQkvKgogCQkgKiBJbml0aWFsbHkgdHJ5IGEgcmVhZC93cml0ZSBvcGVuICh0byBhbGxvdyB0aGUgaW5qZWN0CiAJCSAqIG1ldGhvZCB0byB3b3JrKS4gIElmIHRoYXQgZmFpbHMgZHVlIHRvIHBlcm1pc3Npb24KQEAgLTUwNiw3ICs1NDAsNyBAQAogCQkJCSAqIG1lYW5zIHdlIHByb2JhYmx5IGhhdmUgbm8gQlBGCiAJCQkJICogZGV2aWNlcy4KIAkJCQkgKi8KLQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICAgICIodGhlcmUgYXJlIG5vIEJQRiBkZXZpY2VzKSIpOwogCQkJfSBlbHNlIHsKIAkJCQkvKgpAQCAtNTE1LDcgKzU0OSw3IEBACiAJCQkJICogZGV2aWNlcywgYnV0IGFsbCB0aGUgb25lcwogCQkJCSAqIHRoYXQgZXhpc3QgYXJlIGJ1c3kuCiAJCQkJICovCi0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAgICAiKGFsbCBCUEYgZGV2aWNlcyBhcmUgYnVzeSkiKTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNTI3LDcgKzU2MSw3IEBACiAJCQkgKiBpZiBhbnkuCiAJCQkgKi8KIAkJCWZkID0gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICIoY2Fubm90IG9wZW4gQlBGIGRldmljZSkgJXM6ICVzIiwgZGV2aWNlLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWJyZWFrOwpAQCAtNTM3LDcgKzU3MSw3IEBACiAJCQkgKiBTb21lIG90aGVyIHByb2JsZW0uCiAJCQkgKi8KIAkJCWZkID0gUENBUF9FUlJPUjsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICIoY2Fubm90IG9wZW4gQlBGIGRldmljZSkgJXM6ICVzIiwgZGV2aWNlLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWJyZWFrOwpAQCAtNTQ4LDYgKzU4Miw2NiBAQAogCXJldHVybiAoZmQpOwogfQogCisvKgorICogT3BlbiBhbmQgYmluZCB0byBhIGRldmljZTsgdXNlZCBpZiB3ZSdyZSBub3QgYWN0dWFsbHkgZ29pbmcgdG8gdXNlCisgKiB0aGUgZGV2aWNlLCBidXQgYXJlIGp1c3QgdGVzdGluZyB3aGV0aGVyIGl0IGNhbiBiZSBvcGVuZWQsIG9yIG9wZW5pbmcKKyAqIGl0IHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBpdC4KKyAqCisgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgb24gZmFpbHVyZSAoYWx3YXlzIG5lZ2F0aXZlKSwgYW5kIGFuIEZEIGZvcgorICogdGhlIG5vdy1ib3VuZCBCUEYgZGV2aWNlIG9uIHN1Y2Nlc3MgKGFsd2F5cyBub24tbmVnYXRpdmUpLgorICovCitzdGF0aWMgaW50CiticGZfb3Blbl9hbmRfYmluZChjb25zdCBjaGFyICpuYW1lLCBjaGFyICplcnJidWYpCit7CisJaW50IGZkOworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwkvKgorCSAqIEZpcnN0LCBvcGVuIGEgQlBGIGRldmljZS4KKwkgKi8KKwlmZCA9IGJwZl9vcGVuKGVycmJ1Zik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIChmZCk7CS8qIGZkIGlzIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlICovCisKKwkvKgorCSAqIE5vdyBiaW5kIHRvIHRoZSBkZXZpY2UuCisJICovCisJKHZvaWQpc3RybmNweShpZnIuaWZyX25hbWUsIG5hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwlpZiAoaW9jdGwoZmQsIEJJT0NTRVRJRiwgKGNhZGRyX3QpJmlmcikgPCAwKSB7CisJCXN3aXRjaCAoZXJybm8pIHsKKworCQljYXNlIEVOWElPOgorCQkJLyoKKwkJCSAqIFRoZXJlJ3Mgbm8gc3VjaCBkZXZpY2UuCisJCQkgKi8KKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSk7CisKKwkJY2FzZSBFTkVURE9XTjoKKwkJCS8qCisJCQkgKiBSZXR1cm4gYSAibmV0d29yayBkb3duIiBpbmRpY2F0aW9uLCBzbyB0aGF0CisJCQkgKiB0aGUgYXBwbGljYXRpb24gY2FuIHJlcG9ydCB0aGF0IHJhdGhlciB0aGFuCisJCQkgKiBzYXlpbmcgd2UgaGFkIGEgbXlzdGVyaW91cyBmYWlsdXJlIGFuZAorCQkJICogc3VnZ2VzdCB0aGF0IHRoZXkgcmVwb3J0IGEgcHJvYmxlbSB0byB0aGUKKwkJCSAqIGxpYnBjYXAgZGV2ZWxvcGVycy4KKwkJCSAqLworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCk7CisKKwkJZGVmYXVsdDoKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJCSU9DU0VUSUY6ICVzOiAlcyIsIG5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCX0KKwl9CisKKwkvKgorCSAqIFN1Y2Nlc3MuCisJICovCisJcmV0dXJuIChmZCk7Cit9CisKICNpZmRlZiBCSU9DR0RMVExJU1QKIHN0YXRpYyBpbnQKIGdldF9kbHRfbGlzdChpbnQgZmQsIGludCB2LCBzdHJ1Y3QgYnBmX2RsdGxpc3QgKmJkbHAsIGNoYXIgKmVidWYpCkBAIC01NTksMTMgKzY1MywxMyBAQAogCiAJCWJkbHAtPmJmbF9saXN0ID0gKHVfaW50ICopIG1hbGxvYyhzaXplb2YodV9pbnQpICogKGJkbHAtPmJmbF9sZW4gKyAxKSk7CiAJCWlmIChiZGxwLT5iZmxfbGlzdCA9PSBOVUxMKSB7Ci0JCQkodm9pZClzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKIAkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CiAKIAkJaWYgKGlvY3RsKGZkLCBCSU9DR0RMVExJU1QsIChjYWRkcl90KWJkbHApIDwgMCkgewotCQkJKHZvaWQpc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSh2b2lkKXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiQklPQ0dETFRMSVNUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWZyZWUoYmRscC0+YmZsX2xpc3QpOwogCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKQEAgLTYyMCw3ICs3MTQsNyBAQAogCQkgKiB0aGlzIGRldmljZSI7IGRvbid0IHRyZWF0IGl0IGFzIGFuIGVycm9yLgogCQkgKi8KIAkJaWYgKGVycm5vICE9IEVJTlZBTCkgewotCQkJKHZvaWQpc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSh2b2lkKXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiQklPQ0dETFRMSVNUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAoUENBUF9FUlJPUik7CiAJCX0KQEAgLTY3OSw3ICs3NzMsNyBAQAogCQkgKiAxMC40IChEYXJ3aW4gOC54KS4gIHMvZW4vd2x0LywgYW5kIGNoZWNrCiAJCSAqIHdoZXRoZXIgdGhlIGRldmljZSBleGlzdHMuCiAJCSAqLwotCQlpZiAoc3RybmNtcChwLT5vcHQuc291cmNlLCAiZW4iLCAyKSAhPSAwKSB7CisJCWlmIChzdHJuY21wKHAtPm9wdC5kZXZpY2UsICJlbiIsIDIpICE9IDApIHsKIAkJCS8qCiAJCQkgKiBOb3QgYW4gZW5OIGRldmljZTsgbm8gbW9uaXRvciBtb2RlLgogCQkJICovCkBAIC02ODcsMTIgKzc4MSwxMiBAQAogCQl9CiAJCWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwogCQlpZiAoZmQgPT0gLTEpIHsKLQkJCSh2b2lkKXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSh2b2lkKXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAkJfQogCQlzdHJsY3B5KGlmci5pZnJfbmFtZSwgIndsdCIsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKLQkJc3RybGNhdChpZnIuaWZyX25hbWUsIHAtPm9wdC5zb3VyY2UgKyAyLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJCXN0cmxjYXQoaWZyLmlmcl9uYW1lLCBwLT5vcHQuZGV2aWNlICsgMiwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwogCQlpZiAoaW9jdGwoZmQsIFNJT0NHSUZGTEFHUywgKGNoYXIgKikmaWZyKSA8IDApIHsKIAkJCS8qCiAJCQkgKiBObyBzdWNoIGRldmljZT8KQEAgLTcxMiwxNCArODA2LDE0IEBACiAJICoKIAkgKiBGaXJzdCwgb3BlbiBhIEJQRiBkZXZpY2UuCiAJICovCi0JZmQgPSBicGZfb3BlbihwKTsKKwlmZCA9IGJwZl9vcGVuKHAtPmVycmJ1Zik7CiAJaWYgKGZkIDwgMCkKIAkJcmV0dXJuIChmZCk7CS8qIGZkIGlzIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlICovCiAKIAkvKgogCSAqIE5vdyBiaW5kIHRvIHRoZSBkZXZpY2UuCiAJICovCi0JKHZvaWQpc3RybmNweShpZnIuaWZyX25hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkodm9pZClzdHJuY3B5KGlmci5pZnJfbmFtZSwgcC0+b3B0LmRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwogCWlmIChpb2N0bChmZCwgQklPQ1NFVElGLCAoY2FkZHJfdCkmaWZyKSA8IDApIHsKIAkJc3dpdGNoIChlcnJubykgewogCkBAIC03NDIsOSArODM2LDkgQEAKIAkJCXJldHVybiAoUENBUF9FUlJPUl9JRkFDRV9OT1RfVVApOwogCiAJCWRlZmF1bHQ6Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiQklPQ1NFVElGOiAlczogJXMiLAotCQkJICAgIHAtPm9wdC5zb3VyY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCSAgICBwLT5vcHQuZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQljbG9zZShmZCk7CiAJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CkBAIC03NzAsNiArODY0LDcgQEAKIAkJcmV0dXJuICgxKTsKIAl9CiAJZnJlZShiZGwuYmZsX2xpc3QpOworCWNsb3NlKGZkKTsKICNlbmRpZiAvKiBCSU9DR0RMVExJU1QgKi8KIAlyZXR1cm4gKDApOwogI2VsaWYgZGVmaW5lZChIQVZFX0JTRF9JRUVFODAyMTEpCkBAIC04MDUsNyArOTAwLDcgQEAKIAkgKiBieSBsaWJwY2FwLCBhbmQgdGh1cyBub3QgeWV0IHNlZW4gYnkgdGhlIGFwcGxpY2F0aW9uLgogCSAqLwogCWlmIChpb2N0bChwLT5mZCwgQklPQ0dTVEFUUywgKGNhZGRyX3QpJnMpIDwgMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DR1NUQVRTOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ0dTVEFUUzogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KQEAgLTgyNSw3ICs5MjAsNyBAQAogCXJlZ2lzdGVyIHVfY2hhciAqYnAsICplcDsKIAl1X2NoYXIgKmRhdGFwOwogI2lmZGVmIFBDQVBfRkRESVBBRAotCXJlZ2lzdGVyIGludCBwYWQ7CisJcmVnaXN0ZXIgdV9pbnQgcGFkOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9aRVJPQ09QWV9CUEYKIAlpbnQgaTsKQEAgLTg2Niw3ICs5NjEsNyBAQAogCQl9IGVsc2UKICNlbmRpZgogCQl7Ci0JCQljYyA9IHJlYWQocC0+ZmQsIChjaGFyICopcC0+YnVmZmVyLCBwLT5idWZzaXplKTsKKwkJCWNjID0gcmVhZChwLT5mZCwgcC0+YnVmZmVyLCBwLT5idWZzaXplKTsKIAkJfQogCQlpZiAoY2MgPCAwKSB7CiAJCQkvKiBEb24ndCBjaG9rZSB3aGVuIHdlIGdldCBwdHJhY2VkICovCkBAIC05MTQsNyArMTAwOSw3IEBACiAJCQkJICogcGNhcF9kaXNwYXRjaCgpIGV0Yy4gYXJlbid0CiAJCQkJICogZGVmaW5lZCB0byByZXR1ciB0aGF0LgogCQkJCSAqLwotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgIlRoZSBpbnRlcmZhY2Ugd2VudCBkb3duIik7CiAJCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIApAQCAtOTMzLDI0ICsxMDI4LDI4IEBACiAJCQkJLyogZmFsbCB0aHJvdWdoICovCiAjZW5kaWYKIAkJCX0KLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlYWQ6ICVzIiwKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAicmVhZDogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAoUENBUF9FUlJPUik7CiAJCX0KLQkJYnAgPSBwLT5idWZmZXI7CisJCWJwID0gKHVfY2hhciAqKXAtPmJ1ZmZlcjsKIAl9IGVsc2UKIAkJYnAgPSBwLT5icDsKIAogCS8qCiAJICogTG9vcCB0aHJvdWdoIGVhY2ggcGFja2V0LgogCSAqLworI2lmZGVmIEJJT0NTVFNUQU1QCisjZGVmaW5lIGJocCAoKHN0cnVjdCBicGZfeGhkciAqKWJwKQorI2Vsc2UKICNkZWZpbmUgYmhwICgoc3RydWN0IGJwZl9oZHIgKilicCkKKyNlbmRpZgogCWVwID0gYnAgKyBjYzsKICNpZmRlZiBQQ0FQX0ZERElQQUQKIAlwYWQgPSBwLT5mZGRpcGFkOwogI2VuZGlmCiAJd2hpbGUgKGJwIDwgZXApIHsKLQkJcmVnaXN0ZXIgaW50IGNhcGxlbiwgaGRybGVuOworCQlyZWdpc3RlciB1X2ludCBjYXBsZW4sIGhkcmxlbjsKIAogCQkvKgogCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPwpAQCAtMTAwNiw3ICsxMTA1LDI1IEBACiAJCWlmIChwYi0+ZmlsdGVyaW5nX2luX2tlcm5lbCB8fAogCQkgICAgYnBmX2ZpbHRlcihwLT5mY29kZS5iZl9pbnNucywgZGF0YXAsIGJocC0+YmhfZGF0YWxlbiwgY2FwbGVuKSkgewogCQkJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGhkcjsKKyNpZmRlZiBCSU9DU1RTVEFNUAorCQkJc3RydWN0IGJpbnRpbWUgYnQ7CiAKKwkJCWJ0LnNlYyA9IGJocC0+YmhfdHN0YW1wLmJ0X3NlYzsKKwkJCWJ0LmZyYWMgPSBiaHAtPmJoX3RzdGFtcC5idF9mcmFjOworCQkJaWYgKHAtPm9wdC50c3RhbXBfcHJlY2lzaW9uID09IFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9OQU5PKSB7CisJCQkJc3RydWN0IHRpbWVzcGVjIHRzOworCisJCQkJYmludGltZTJ0aW1lc3BlYygmYnQsICZ0cyk7CisJCQkJcGt0aGRyLnRzLnR2X3NlYyA9IHRzLnR2X3NlYzsKKwkJCQlwa3RoZHIudHMudHZfdXNlYyA9IHRzLnR2X25zZWM7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCQkJYmludGltZTJ0aW1ldmFsKCZidCwgJnR2KTsKKwkJCQlwa3RoZHIudHMudHZfc2VjID0gdHYudHZfc2VjOworCQkJCXBrdGhkci50cy50dl91c2VjID0gdHYudHZfdXNlYzsKKwkJCX0KKyNlbHNlCiAJCQlwa3RoZHIudHMudHZfc2VjID0gYmhwLT5iaF90c3RhbXAudHZfc2VjOwogI2lmZGVmIF9BSVgKIAkJCS8qCkBAIC0xMDE3LDYgKzExMzQsNyBAQAogI2Vsc2UKIAkJCXBrdGhkci50cy50dl91c2VjID0gYmhwLT5iaF90c3RhbXAudHZfdXNlYzsKICNlbmRpZgorI2VuZGlmIC8qIEJJT0NTVFNUQU1QICovCiAjaWZkZWYgUENBUF9GRERJUEFECiAJCQlpZiAoY2FwbGVuID4gcGFkKQogCQkJCXBrdGhkci5jYXBsZW4gPSBjYXBsZW4gLSBwYWQ7CkBAIC0xMDg0LDcgKzEyMDIsNyBAQAogCQl1X2ludCBzcG9vZl9ldGhfc3JjID0gMDsKIAogCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTSERSQ01QTFQsICZzcG9vZl9ldGhfc3JjKSA9PSAtMSkgewotCQkJKHZvaWQpc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJKHZvaWQpcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgInNlbmQ6IGNhbid0IHR1cm4gb2ZmIEJJT0NTSERSQ01QTFQ6ICVzIiwKIAkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwpAQCAtMTA5Nyw3ICsxMjE1LDcgQEAKIAl9CiAjZW5kaWYgLyogX19BUFBMRV9fICovCiAJaWYgKHJldCA9PSAtMSkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzZW5kOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZDogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KQEAgLTExMTMsNyArMTIzMSw3IEBACiAJaWYgKG9kbV9pbml0aWFsaXplKCkgPT0gLTEpIHsKIAkJaWYgKG9kbV9lcnJfbXNnKG9kbWVycm5vLCAmZXJyc3RyKSA9PSAtMSkKIAkJCWVycnN0ciA9ICJVbmtub3duIGVycm9yIjsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJicGZfbG9hZDogb2RtX2luaXRpYWxpemUgZmFpbGVkOiAlcyIsCiAJCSAgICBlcnJzdHIpOwogCQlyZXR1cm4gKFBDQVBfRVJST1IpOwpAQCAtMTEyMiw3ICsxMjQwLDcgQEAKIAlpZiAoKG9kbWxvY2tpZCA9IG9kbV9sb2NrKCIvZXRjL29ianJlcG9zL2NvbmZpZ19sb2NrIiwgT0RNX1dBSVQpKSA9PSAtMSkgewogCQlpZiAob2RtX2Vycl9tc2cob2RtZXJybm8sICZlcnJzdHIpID09IC0xKQogCQkJZXJyc3RyID0gIlVua25vd24gZXJyb3IiOwotCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgImJwZl9sb2FkOiBvZG1fbG9jayBvZiAvZXRjL29ianJlcG9zL2NvbmZpZ19sb2NrIGZhaWxlZDogJXMiLAogCQkgICAgZXJyc3RyKTsKIAkJKHZvaWQpb2RtX3Rlcm1pbmF0ZSgpOwpAQCAtMTE0MSw3ICsxMjU5LDcgQEAKIAkJaWYgKGVycmJ1ZiAhPSBOVUxMKSB7CiAJCQlpZiAob2RtX2Vycl9tc2cob2RtZXJybm8sICZlcnJzdHIpID09IC0xKQogCQkJCWVycnN0ciA9ICJVbmtub3duIGVycm9yIjsKLQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJicGZfbG9hZDogb2RtX3VubG9jayBmYWlsZWQ6ICVzIiwKIAkJCSAgICBlcnJzdHIpOwogCQl9CkBAIC0xMTUyLDcgKzEyNzAsNyBAQAogCQlpZiAoZXJyYnVmICE9IE5VTEwpIHsKIAkJCWlmIChvZG1fZXJyX21zZyhvZG1lcnJubywgJmVycnN0cikgPT0gLTEpCiAJCQkJZXJyc3RyID0gIlVua25vd24gZXJyb3IiOwotCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgImJwZl9sb2FkOiBvZG1fdGVybWluYXRlIGZhaWxlZDogJXMiLAogCQkJICAgIGVycnN0cik7CiAJCX0KQEAgLTExODYsNyArMTMwNCw3IEBACiAKIAltYWpvciA9IGdlbm1ham9yKEJQRl9OQU1FKTsKIAlpZiAobWFqb3IgPT0gLTEpIHsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJicGZfbG9hZDogZ2VubWFqb3IgZmFpbGVkOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJKHZvaWQpYnBmX29kbWNsZWFudXAoTlVMTCk7CiAJCXJldHVybiAoUENBUF9FUlJPUik7CkBAIC0xMTk2LDcgKzEzMTQsNyBAQAogCWlmICghbWlub3JzKSB7CiAJCW1pbm9ycyA9IGdlbm1pbm9yKCJicGYiLCBtYWpvciwgMCwgQlBGX01JTk9SUywgMSwgMSk7CiAJCWlmICghbWlub3JzKSB7Ci0JCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiYnBmX2xvYWQ6IGdlbm1pbm9yIGZhaWxlZDogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCSh2b2lkKWJwZl9vZG1jbGVhbnVwKE5VTEwpOwpAQCAtMTIwOSw3ICsxMzI3LDcgQEAKIAogCXJjID0gc3RhdChCUEZfTk9ERSAiMCIsICZzYnVmKTsKIAlpZiAocmMgPT0gLTEgJiYgZXJybm8gIT0gRU5PRU5UKSB7Ci0JCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiYnBmX2xvYWQ6IGNhbid0IHN0YXQgJXM6ICVzIiwKIAkJICAgIEJQRl9OT0RFICIwIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKFBDQVBfRVJST1IpOwpAQCAtMTIyMCw3ICsxMzM4LDcgQEAKIAkJCXNwcmludGYoYnVmLCAiJXMlZCIsIEJQRl9OT0RFLCBpKTsKIAkJCXVubGluayhidWYpOwogCQkJaWYgKG1rbm9kKGJ1ZiwgU19JUlVTUiB8IFNfSUZDSFIsIGRvbWFrZWRldihtYWpvciwgaSkpID09IC0xKSB7Ci0JCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAgICAiYnBmX2xvYWQ6IGNhbid0IG1rbm9kICVzOiAlcyIsCiAJCQkJICAgIGJ1ZiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJCXJldHVybiAoUENBUF9FUlJPUik7CkBAIC0xMjM2LDcgKzEzNTQsNyBAQAogCSAgICAoY2ZnX2xkLmttaWQgPT0gMCkpIHsKIAkJLyogRHJpdmVyIGlzbid0IGxvYWRlZCwgbG9hZCBpdCBub3cgKi8KIAkJaWYgKHN5c2NvbmZpZyhTWVNfU0lOR0xFTE9BRCwgKHZvaWQgKikmY2ZnX2xkLCBzaXplb2YoY2ZnX2xkKSkgPT0gLTEpIHsKLQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJicGZfbG9hZDogY291bGQgbm90IGxvYWQgZHJpdmVyOiAlcyIsCiAJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAoUENBUF9FUlJPUik7CkBAIC0xMjUxLDcgKzEzNjksNyBAQAogCWZvciAoaSA9IDA7IGkgPCBCUEZfTUlOT1JTOyBpKyspIHsKIAkJY2ZnX2JwZi5kZXZubyA9IGRvbWFrZWRldihtYWpvciwgaSk7CiAJCWlmIChzeXNjb25maWcoU1lTX0NGR0tNT0QsICh2b2lkICopJmNmZ19rbSwgc2l6ZW9mKGNmZ19rbSkpID09IC0xKSB7Ci0JCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiYnBmX2xvYWQ6IGNvdWxkIG5vdCBjb25maWd1cmUgZHJpdmVyOiAlcyIsCiAJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAoUENBUF9FUlJPUik7CkBAIC0xMjY1LDcgKzEzODMsNyBAQAogI2VuZGlmCiAKIC8qCi0gKiBUdXJuIG9mZiByZm1vbiBtb2RlIGlmIG5lY2Vzc2FyeS4KKyAqIFVuZG8gYW55IG9wZXJhdGlvbnMgZG9uZSB3aGVuIG9wZW5pbmcgdGhlIGRldmljZSB3aGVuIG5lY2Vzc2FyeS4KICAqLwogc3RhdGljIHZvaWQKIHBjYXBfY2xlYW51cF9icGYocGNhcF90ICpwKQpAQCAtMTMzMyw2ICsxNDUxLDI0IEBACiAJCX0KICNlbmRpZiAvKiBIQVZFX0JTRF9JRUVFODAyMTEgKi8KIAorI2lmIGRlZmluZWQoX19GcmVlQlNEX18pICYmIGRlZmluZWQoU0lPQ0lGQ1JFQVRFMikKKwkJLyoKKwkJICogQXR0ZW1wdCB0byBkZXN0cm95IHRoZSB1c2J1c04gaW50ZXJmYWNlIHRoYXQgd2UgY3JlYXRlZC4KKwkJICovCisJCWlmIChwYi0+bXVzdF9kb19vbl9jbG9zZSAmIE1VU1RfREVTVFJPWV9VU0JVUykgeworCQkJaWYgKGlmX25hbWV0b2luZGV4KHBiLT5kZXZpY2UpID4gMCkgeworCQkJCWludCBzOworCisJCQkJcyA9IHNvY2tldChBRl9MT0NBTCwgU09DS19ER1JBTSwgMCk7CisJCQkJaWYgKHMgPj0gMCkgeworCQkJCQlzdHJsY3B5KGlmci5pZnJfbmFtZSwgcGItPmRldmljZSwKKwkJCQkJICAgIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJCQkJaW9jdGwocywgU0lPQ0lGREVTVFJPWSwgJmlmcik7CisJCQkJCWNsb3NlKHMpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmIC8qIGRlZmluZWQoX19GcmVlQlNEX18pICYmIGRlZmluZWQoU0lPQ0lGQ1JFQVRFMikgKi8KIAkJLyoKIAkJICogVGFrZSB0aGlzIHBjYXAgb3V0IG9mIHRoZSBsaXN0IG9mIHBjYXBzIGZvciB3aGljaCB3ZQogCQkgKiBoYXZlIHRvIHRha2UgdGhlIGludGVyZmFjZSBvdXQgb2Ygc29tZSBtb2RlLgpAQCAtMTM3OCw3ICsxNTE0LDcgQEAKIAkJICogTm8gc3VjaCBkZXZpY2UgZXhpc3RzLgogCQkgKi8KICNpZmRlZiBfX0FQUExFX18KLQkJaWYgKHAtPm9wdC5yZm1vbiAmJiBzdHJuY21wKHAtPm9wdC5zb3VyY2UsICJ3bHQiLCAzKSA9PSAwKSB7CisJCWlmIChwLT5vcHQucmZtb24gJiYgc3RybmNtcChwLT5vcHQuZGV2aWNlLCAid2x0IiwgMykgPT0gMCkgewogCQkJLyoKIAkJCSAqIE1vbml0b3IgbW9kZSB3YXMgcmVxdWVzdGVkLCBhbmQgd2UncmUgdHJ5aW5nCiAJCQkgKiB0byBvcGVuIGEgIndsdE4iIGRldmljZS4gIEFzc3VtZSB0aGF0IHRoaXMKQEAgLTEzOTAsNyArMTUyNiw3IEBACiAJCQlpZiAoZmQgIT0gLTEpIHsKIAkJCQlzdHJsY3B5KGlmci5pZnJfbmFtZSwgImVuIiwKIAkJCQkgICAgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwotCQkJCXN0cmxjYXQoaWZyLmlmcl9uYW1lLCBwLT5vcHQuc291cmNlICsgMywKKwkJCQlzdHJsY2F0KGlmci5pZnJfbmFtZSwgcC0+b3B0LmRldmljZSArIDMsCiAJCQkJICAgIHNpemVvZihpZnIuaWZyX25hbWUpKTsKIAkJCQlpZiAoaW9jdGwoZmQsIFNJT0NHSUZGTEFHUywgKGNoYXIgKikmaWZyKSA8IDApIHsKIAkJCQkJLyoKQEAgLTEzOTksNyArMTUzNSw3IEBACiAJCQkJCSAqIGV4aXN0LgogCQkJCQkgKi8KIAkJCQkJZXJyID0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKLQkJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkJICAgICJTSU9DR0lGRkxBR1Mgb24gJXMgZmFpbGVkOiAlcyIsCiAJCQkJCSAgICBpZnIuaWZyX25hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQl9IGVsc2UgewpAQCAtMTQyMyw3ICsxNTU5LDcgQEAKIAkJCQkgKiBqdXN0IHJlcG9ydCAibm8gc3VjaCBkZXZpY2UiLgogCQkJCSAqLwogCQkJCWVyciA9IFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U7Ci0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAgICAic29ja2V0KCkgZmFpbGVkOiAlcyIsCiAJCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCX0KQEAgLTE0MzMsNyArMTU2OSw3IEBACiAJCS8qCiAJCSAqIE5vIHN1Y2ggZGV2aWNlLgogCQkgKi8KLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1NFVElGIGZhaWxlZDogJXMiLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRJRiBmYWlsZWQ6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIChQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFKTsKIAl9IGVsc2UgaWYgKGVycm5vID09IEVORVRET1dOKSB7CkBAIC0xNDUwLDggKzE1ODYsOCBAQAogCQkgKiBTb21lIG90aGVyIGVycm9yOyBmaWxsIGluIHRoZSBlcnJvciBzdHJpbmcsIGFuZAogCQkgKiByZXR1cm4gUENBUF9FUlJPUi4KIAkJICovCi0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRJRjogJXM6ICVzIiwKLQkJICAgIHAtPm9wdC5zb3VyY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DU0VUSUY6ICVzOiAlcyIsCisJCSAgICBwLT5vcHQuZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoUENBUF9FUlJPUik7CiAJfQogfQpAQCAtMTUxNCw3ICsxNjUwLDcgQEAKIAl1X2ludCBidWZtb2RlLCB6YnVmbWF4OwogI2VuZGlmCiAKLQlmZCA9IGJwZl9vcGVuKHApOworCWZkID0gYnBmX29wZW4ocC0+ZXJyYnVmKTsKIAlpZiAoZmQgPCAwKSB7CiAJCXN0YXR1cyA9IGZkOwogCQlnb3RvIGJhZDsKQEAgLTE1MjMsMTQgKzE2NTksMTQgQEAKIAlwLT5mZCA9IGZkOwogCiAJaWYgKGlvY3RsKGZkLCBCSU9DVkVSU0lPTiwgKGNhZGRyX3QpJmJ2KSA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1ZFUlNJT046ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DVkVSU0lPTjogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwogCQlnb3RvIGJhZDsKIAl9CiAJaWYgKGJ2LmJ2X21ham9yICE9IEJQRl9NQUpPUl9WRVJTSU9OIHx8CiAJICAgIGJ2LmJ2X21pbm9yIDwgQlBGX01JTk9SX1ZFUlNJT04pIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJrZXJuZWwgYnBmIGZpbHRlciBvdXQgb2YgZGF0ZSIpOwogCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwogCQlnb3RvIGJhZDsKQEAgLTE1NDEsNyArMTY3Nyw3IEBACiAJICogUmV0cmlldmUgdGhlIHpvbmVpZCBvZiB0aGUgem9uZSB3ZSBhcmUgY3VycmVudGx5IGV4ZWN1dGluZyBpbi4KIAkgKi8KIAlpZiAoKGlmci5saWZyX3pvbmVpZCA9IGdldHpvbmVpZCgpKSA9PSAtMSkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJnZXR6b25laWQoKTogJXMiLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImdldHpvbmVpZCgpOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCWdvdG8gYmFkOwpAQCAtMTU1MywzNiArMTY4OSw0MiBAQAogCSAqIHRyYWZmaWMgb24gZGF0YWxpbmtzIGluIG5vbi1nbG9iYWwgem9uZXMuICBOb24tZ2xvYmFsIHpvbmVzCiAJICogZG8gbm90IGhhdmUgYWNjZXNzIHRvIGRhdGFsaW5rcyBvdXRzaWRlIG9mIHRoZWlyIG93biBuYW1lc3BhY2UuCiAJICovCi0JaWYgKCh6b25lc2VwID0gc3RyY2hyKHAtPm9wdC5zb3VyY2UsICcvJykpICE9IE5VTEwpIHsKKwlpZiAoKHpvbmVzZXAgPSBzdHJjaHIocC0+b3B0LmRldmljZSwgJy8nKSkgIT0gTlVMTCkgewogCQljaGFyIHBhdGhfem5hbWVbWk9ORU5BTUVfTUFYXTsKIAkJaW50ICB6bmFtZWxlbjsKIAkJY2hhciAqbG5hbWVwOwogCiAJCWlmIChpZnIubGlmcl96b25laWQgIT0gR0xPQkFMX1pPTkVJRCkgewotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgInpvbmVuYW1lL2xpbmtuYW1lIG9ubHkgdmFsaWQgaW4gZ2xvYmFsIHpvbmUuIik7CiAJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwogCQkJZ290byBiYWQ7CiAJCX0KLQkJem5hbWVsZW4gPSB6b25lc2VwIC0gcC0+b3B0LnNvdXJjZTsKLQkJKHZvaWQpIHN0cmxjcHkocGF0aF96bmFtZSwgcC0+b3B0LnNvdXJjZSwgem5hbWVsZW4gKyAxKTsKKwkJem5hbWVsZW4gPSB6b25lc2VwIC0gcC0+b3B0LmRldmljZTsKKwkJKHZvaWQpIHN0cmxjcHkocGF0aF96bmFtZSwgcC0+b3B0LmRldmljZSwgem5hbWVsZW4gKyAxKTsKIAkJaWZyLmxpZnJfem9uZWlkID0gZ2V0em9uZWlkYnluYW1lKHBhdGhfem5hbWUpOwogCQlpZiAoaWZyLmxpZnJfem9uZWlkID09IC0xKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiZ2V0em9uZWlkYnluYW1lKCVzKTogJXMiLCBwYXRoX3puYW1lLAogCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJCWdvdG8gYmFkOwogCQl9CiAJCWxuYW1lcCA9IHN0cmR1cCh6b25lc2VwICsgMSk7Ci0JCWZyZWUocC0+b3B0LnNvdXJjZSk7Ci0JCXAtPm9wdC5zb3VyY2UgPSBsbmFtZXA7CisJCWlmIChsbmFtZXAgPT0gTlVMTCkgeworCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzdHJkdXA6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJZ290byBiYWQ7CisJCX0KKwkJZnJlZShwLT5vcHQuZGV2aWNlKTsKKwkJcC0+b3B0LmRldmljZSA9IGxuYW1lcDsKIAl9CiAjZW5kaWYKIAotCXBiLT5kZXZpY2UgPSBzdHJkdXAocC0+b3B0LnNvdXJjZSk7CisJcGItPmRldmljZSA9IHN0cmR1cChwLT5vcHQuZGV2aWNlKTsKIAlpZiAocGItPmRldmljZSA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInN0cmR1cDogJXMiLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInN0cmR1cDogJXMiLAogCQkgICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJZ290byBiYWQ7CkBAIC0xNjE4LDcgKzE3NjAsNyBAQAogCQkJCS8qCiAJCQkJICogMTAuNCAoRGFyd2luIDgueCkuICBzL2VuL3dsdC8KIAkJCQkgKi8KLQkJCQlpZiAoc3RybmNtcChwLT5vcHQuc291cmNlLCAiZW4iLCAyKSAhPSAwKSB7CisJCQkJaWYgKHN0cm5jbXAocC0+b3B0LmRldmljZSwgImVuIiwgMikgIT0gMCkgewogCQkJCQkvKgogCQkJCQkgKiBOb3QgYW4gZW5OIGRldmljZTsgY2hlY2sKIAkJCQkJICogd2hldGhlciB0aGUgZGV2aWNlIGV2ZW4gZXhpc3RzLgpAQCAtMTYyNiw3ICsxNzY4LDcgQEAKIAkJCQkJc29ja2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwogCQkJCQlpZiAoc29ja2ZkICE9IC0xKSB7CiAJCQkJCQlzdHJsY3B5KGlmcm5hbWUsCi0JCQkJCQkgICAgcC0+b3B0LnNvdXJjZSwgaWZuYW1zaXopOworCQkJCQkJICAgIHAtPm9wdC5kZXZpY2UsIGlmbmFtc2l6KTsKIAkJCQkJCWlmIChpb2N0bChzb2NrZmQsIFNJT0NHSUZGTEFHUywKIAkJCQkJCSAgICAoY2hhciAqKSZpZnIpIDwgMCkgewogCQkJCQkJCS8qCkBAIC0xNjM3LDcgKzE3NzksNyBAQAogCQkJCQkJCSAqIGV4aXN0LgogCQkJCQkJCSAqLwogCQkJCQkJCXN0YXR1cyA9IFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U7Ci0JCQkJCQkJc25wcmludGYocC0+ZXJyYnVmLAorCQkJCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLAogCQkJCQkJCSAgICBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCQkJCSAgICAiU0lPQ0dJRkZMQUdTIGZhaWxlZDogJXMiLAogCQkJCQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CkBAIC0xNjUxLDI1ICsxNzkzLDI1IEBACiAJCQkJCQkgKiByZXBvcnQgIm5vIHN1Y2ggZGV2aWNlIi4KIAkJCQkJCSAqLwogCQkJCQkJc3RhdHVzID0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKLQkJCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwKKwkJCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLAogCQkJCQkJICAgIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJCQkgICAgInNvY2tldCgpIGZhaWxlZDogJXMiLAogCQkJCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQkJfQogCQkJCQlnb3RvIGJhZDsKIAkJCQl9Ci0JCQkJd2x0ZGV2ID0gbWFsbG9jKHN0cmxlbihwLT5vcHQuc291cmNlKSArIDIpOworCQkJCXdsdGRldiA9IG1hbGxvYyhzdHJsZW4ocC0+b3B0LmRldmljZSkgKyAyKTsKIAkJCQlpZiAod2x0ZGV2ID09IE5VTEwpIHsKLQkJCQkJKHZvaWQpc25wcmludGYocC0+ZXJyYnVmLAorCQkJCQkodm9pZClwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwKIAkJCQkJICAgIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKIAkJCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJCQkJZ290byBiYWQ7CiAJCQkJfQogCQkJCXN0cmNweSh3bHRkZXYsICJ3bHQiKTsKLQkJCQlzdHJjYXQod2x0ZGV2LCBwLT5vcHQuc291cmNlICsgMik7Ci0JCQkJZnJlZShwLT5vcHQuc291cmNlKTsKLQkJCQlwLT5vcHQuc291cmNlID0gd2x0ZGV2OworCQkJCXN0cmNhdCh3bHRkZXYsIHAtPm9wdC5kZXZpY2UgKyAyKTsKKwkJCQlmcmVlKHAtPm9wdC5kZXZpY2UpOworCQkJCXAtPm9wdC5kZXZpY2UgPSB3bHRkZXY7CiAJCQl9CiAJCQkvKgogCQkJICogRXZlcnl0aGluZyBlbHNlIGlzIDEwLjUgb3IgbGF0ZXI7IGZvciB0aG9zZSwKQEAgLTE2NzgsNiArMTgyMCw4NSBAQAogCQl9CiAJfQogI2VuZGlmIC8qIF9fQVBQTEVfXyAqLworCisJLyoKKwkgKiBJZiB0aGlzIGlzIEZyZWVCU0QsIGFuZCB0aGUgZGV2aWNlIG5hbWUgYmVnaW5zIHdpdGggInVzYnVzIiwKKwkgKiB0cnkgdG8gY3JlYXRlIHRoZSBpbnRlcmZhY2UgaWYgaXQncyBub3QgYXZhaWxhYmxlLgorCSAqLworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pICYmIGRlZmluZWQoU0lPQ0lGQ1JFQVRFMikKKwlpZiAoc3RybmNtcChwLT5vcHQuZGV2aWNlLCB1c2J1c19wcmVmaXgsIFVTQlVTX1BSRUZJWF9MRU4pID09IDApIHsKKwkJLyoKKwkJICogRG8gd2UgYWxyZWFkeSBoYXZlIGFuIGludGVyZmFjZSB3aXRoIHRoYXQgbmFtZT8KKwkJICovCisJCWlmIChpZl9uYW1ldG9pbmRleChwLT5vcHQuZGV2aWNlKSA9PSAwKSB7CisJCQkvKgorCQkJICogTm8uICBXZSBuZWVkIHRvIGNyZWF0ZSBpdCwgYW5kLCBpZiB3ZQorCQkJICogc3VjY2VlZCwgcmVtZW1iZXIgdGhhdCB3ZSBzaG91bGQgZGVzdHJveQorCQkJICogaXQgd2hlbiB0aGUgcGNhcF90IGlzIGNsb3NlZC4KKwkJCSAqLworCQkJaW50IHM7CisKKwkJCS8qCisJCQkgKiBPcGVuIGEgc29ja2V0IHRvIHVzZSBmb3IgaW9jdGxzIHRvCisJCQkgKiBjcmVhdGUgdGhlIGludGVyZmFjZS4KKwkJCSAqLworCQkJcyA9IHNvY2tldChBRl9MT0NBTCwgU09DS19ER1JBTSwgMCk7CisJCQlpZiAocyA8IDApIHsKKwkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIkNhbid0IG9wZW4gc29ja2V0OiAlcyIsCisJCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJCWdvdG8gYmFkOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28sIGFycmFuZ2UgdG8gaGF2ZQorCQkJICogInBjYXBfY2xvc2VfYWxsKCkiIGNhbGxlZCB3aGVuIHdlIGV4aXQuCisJCQkgKi8KKwkJCWlmICghcGNhcF9kb19hZGRleGl0KHApKSB7CisJCQkJLyoKKwkJCQkgKiAiYXRleGl0KCkiIGZhaWxlZDsgZG9uJ3QgY3JlYXRlIHRoZQorCQkJCSAqIGludGVyZmFjZSwganVzdCBnaXZlIHVwLgorCQkJCSAqLworCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAgImF0ZXhpdCBmYWlsZWQiKTsKKwkJCQljbG9zZShzKTsKKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJCWdvdG8gYmFkOworCQkJfQorCisJCQkvKgorCQkJICogQ3JlYXRlIHRoZSBpbnRlcmZhY2UuCisJCQkgKi8KKwkJCXN0cmxjcHkoaWZyLmlmcl9uYW1lLCBwLT5vcHQuZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJCQlpZiAoaW9jdGwocywgU0lPQ0lGQ1JFQVRFMiwgJmlmcikgPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVJTlZBTCkgeworCQkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJICAgICJJbnZhbGlkIFVTQiBidXMgaW50ZXJmYWNlICVzIiwKKwkJCQkJICAgIHAtPm9wdC5kZXZpY2UpOworCQkJCX0gZWxzZSB7CisJCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkgICAgIkNhbid0IGNyZWF0ZSBpbnRlcmZhY2UgZm9yICVzOiAlcyIsCisJCQkJCSAgICBwLT5vcHQuZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJfQorCQkJCWNsb3NlKHMpOworCQkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQkJZ290byBiYWQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBNYWtlIHN1cmUgd2UgY2xlYW4gdGhpcyB1cCB3aGVuIHdlIGNsb3NlLgorCQkJICovCisJCQlwYi0+bXVzdF9kb19vbl9jbG9zZSB8PSBNVVNUX0RFU1RST1lfVVNCVVM7CisKKwkJCS8qCisJCQkgKiBBZGQgdGhpcyB0byB0aGUgbGlzdCBvZiBwY2FwcyB0byBjbG9zZSB3aGVuIHdlIGV4aXQuCisJCQkgKi8KKwkJCXBjYXBfYWRkX3RvX3BjYXBzX3RvX2Nsb3NlKHApOworCQl9CisJfQorI2VuZGlmIC8qIGRlZmluZWQoX19GcmVlQlNEX18pICYmIGRlZmluZWQoU0lPQ0lGQ1JFQVRFMikgKi8KKwogI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCiAJLyoKIAkgKiBJZiB0aGUgQlBGIGV4dGVuc2lvbiB0byBzZXQgYnVmZmVyIG1vZGUgaXMgcHJlc2VudCwgdHJ5IHNldHRpbmcKQEAgLTE3MDEsNyArMTkyMiw3IEBACiAJCSAqIHNpemUuCiAJCSAqLwogCQlpZiAoaW9jdGwoZmQsIEJJT0NHRVRaTUFYLCAoY2FkZHJfdCkmemJ1Zm1heCkgPCAwKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DR0VUWk1BWDogJXMiLAorCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DR0VUWk1BWDogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCQlnb3RvIGJhZDsKQEAgLTE3MjgsNyArMTk0OSw3IEBACiAJCXBiLT56YnVmMiA9IG1tYXAoTlVMTCwgcGItPnpidWZzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAogCQkgICAgTUFQX0FOT04sIC0xLCAwKTsKIAkJaWYgKHBiLT56YnVmMSA9PSBNQVBfRkFJTEVEIHx8IHBiLT56YnVmMiA9PSBNQVBfRkFJTEVEKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtbWFwOiAlcyIsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1tYXA6ICVzIiwKIAkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwogCQkJZ290byBiYWQ7CkBAIC0xNzM4LDE1ICsxOTU5LDE1IEBACiAJCWJ6LmJ6X2J1ZmIgPSBwYi0+emJ1ZjI7CiAJCWJ6LmJ6X2J1ZmxlbiA9IHBiLT56YnVmc2l6ZTsKIAkJaWYgKGlvY3RsKGZkLCBCSU9DU0VUWkJVRiwgKGNhZGRyX3QpJmJ6KSA8IDApIHsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRaQlVGOiAlcyIsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRaQlVGOiAlcyIsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJCWdvdG8gYmFkOwogCQl9Ci0JCSh2b2lkKXN0cm5jcHkoaWZybmFtZSwgcC0+b3B0LnNvdXJjZSwgaWZuYW1zaXopOworCQkodm9pZClzdHJuY3B5KGlmcm5hbWUsIHAtPm9wdC5kZXZpY2UsIGlmbmFtc2l6KTsKIAkJaWYgKGlvY3RsKGZkLCBCSU9DU0VUSUYsIChjYWRkcl90KSZpZnIpIDwgMCkgewotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1NFVElGOiAlczogJXMiLAotCQkJICAgIHAtPm9wdC5zb3VyY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1NFVElGOiAlczogJXMiLAorCQkJICAgIHAtPm9wdC5kZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCQlnb3RvIGJhZDsKIAkJfQpAQCAtMTc2NCw4ICsxOTg1LDggQEAKIAkJCSAqLwogCQkJaWYgKGlvY3RsKGZkLCBCSU9DU0JMRU4sCiAJCQkgICAgKGNhZGRyX3QpJnAtPm9wdC5idWZmZXJfc2l6ZSkgPCAwKSB7Ci0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCSAgICAiQklPQ1NCTEVOOiAlczogJXMiLCBwLT5vcHQuc291cmNlLAorCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiQklPQ1NCTEVOOiAlczogJXMiLCBwLT5vcHQuZGV2aWNlLAogCQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJCQlnb3RvIGJhZDsKQEAgLTE3NzQsNyArMTk5NSw3IEBACiAJCQkvKgogCQkJICogTm93IGJpbmQgdG8gdGhlIGRldmljZS4KIAkJCSAqLwotCQkJKHZvaWQpc3RybmNweShpZnJuYW1lLCBwLT5vcHQuc291cmNlLCBpZm5hbXNpeik7CisJCQkodm9pZClzdHJuY3B5KGlmcm5hbWUsIHAtPm9wdC5kZXZpY2UsIGlmbmFtc2l6KTsKICNpZmRlZiBCSU9DU0VUTElGCiAJCQlpZiAoaW9jdGwoZmQsIEJJT0NTRVRMSUYsIChjYWRkcl90KSZpZnIpIDwgMCkKICNlbHNlCkBAIC0xODA3LDcgKzIwMjgsNyBAQAogCQkJCSAqLwogCQkJCSh2b2lkKSBpb2N0bChmZCwgQklPQ1NCTEVOLCAoY2FkZHJfdCkmdik7CiAKLQkJCQkodm9pZClzdHJuY3B5KGlmcm5hbWUsIHAtPm9wdC5zb3VyY2UsIGlmbmFtc2l6KTsKKwkJCQkodm9pZClzdHJuY3B5KGlmcm5hbWUsIHAtPm9wdC5kZXZpY2UsIGlmbmFtc2l6KTsKICNpZmRlZiBCSU9DU0VUTElGCiAJCQkJaWYgKGlvY3RsKGZkLCBCSU9DU0VUTElGLCAoY2FkZHJfdCkmaWZyKSA+PSAwKQogI2Vsc2UKQEAgLTE4MjIsOSArMjA0Myw5IEBACiAJCQl9CiAKIAkJCWlmICh2ID09IDApIHsKLQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICAgICJCSU9DU0JMRU46ICVzOiBObyBidWZmZXIgc2l6ZSB3b3JrZWQiLAotCQkJCSAgICBwLT5vcHQuc291cmNlKTsKKwkJCQkgICAgcC0+b3B0LmRldmljZSk7CiAJCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJCQlnb3RvIGJhZDsKIAkJCX0KQEAgLTE4MzMsNyArMjA1NCw3IEBACiAKIAkvKiBHZXQgdGhlIGRhdGEgbGluayBsYXllciB0eXBlLiAqLwogCWlmIChpb2N0bChmZCwgQklPQ0dETFQsIChjYWRkcl90KSZ2KSA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ0dETFQ6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DR0RMVDogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwogCQlnb3RvIGJhZDsKQEAgLTE4NjYsNyArMjA4Nyw3IEBACiAJCS8qCiAJCSAqIFdlIGRvbid0IGtub3cgd2hhdCB0byBtYXAgdGhpcyB0byB5ZXQuCiAJCSAqLwotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJ1bmtub3duIGludGVyZmFjZSB0eXBlICV1IiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJ1bmtub3duIGludGVyZmFjZSB0eXBlICV1IiwKIAkJICAgIHYpOwogCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwogCQlnb3RvIGJhZDsKQEAgLTE5NTQsNyArMjE3NSw3IEBACiAJCQkJCSAqIHRoZSBkZWZhdWx0IG1vZGUsIGF0dGVtcHQgdG8KIAkJCQkJICogc2VsZWN0IHRoZSBuZXcgbW9kZS4KIAkJCQkJICovCi0JCQkJCWlmIChuZXdfZGx0ICE9IHYpIHsKKwkJCQkJaWYgKCh1X2ludCluZXdfZGx0ICE9IHYpIHsKIAkJCQkJCWlmIChpb2N0bChwLT5mZCwgQklPQ1NETFQsCiAJCQkJCQkgICAgJm5ld19kbHQpICE9IC0xKSB7CiAJCQkJCQkJLyoKQEAgLTIwMjYsNyArMjI0Nyw3IEBACiAJCQkgKiBJZiB0aGUgbmV3IG1vZGUgd2Ugd2FudCBpc24ndCB0aGUgZGVmYXVsdCBtb2RlLAogCQkJICogYXR0ZW1wdCB0byBzZWxlY3QgdGhlIG5ldyBtb2RlLgogCQkJICovCi0JCQlpZiAobmV3X2RsdCAhPSB2KSB7CisJCQlpZiAoKHVfaW50KW5ld19kbHQgIT0gdikgewogCQkJCWlmIChpb2N0bChwLT5mZCwgQklPQ1NETFQsICZuZXdfZGx0KSAhPSAtMSkgewogCQkJCQkvKgogCQkJCQkgKiBXZSBzdWNjZWVkZWQ7IG1ha2UgdGhpcyB0aGUKQEAgLTIwNzgsNyArMjI5OSw3IEBACiAJICogQlNEcyAtIGNoZWNrIENWUyBsb2cgZm9yICJicGYuYyI/CiAJICovCiAJaWYgKGlvY3RsKGZkLCBCSU9DU0hEUkNNUExULCAmc3Bvb2ZfZXRoX3NyYykgPT0gLTEpIHsKLQkJKHZvaWQpc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkodm9pZClwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJCSU9DU0hEUkNNUExUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJZ290byBiYWQ7CkBAIC0yMTIwLDcgKzIzNDEsNyBAQAogCQkJYnBmX3RvLnR2X3NlYyA9IHAtPm9wdC50aW1lb3V0IC8gMTAwMDsKIAkJCWJwZl90by50dl91c2VjID0gKHAtPm9wdC50aW1lb3V0ICogMTAwMCkgJSAxMDAwMDAwOwogCQkJaWYgKGlvY3RsKHAtPmZkLCBCSU9DU1JUSU1FT1VULCAoY2FkZHJfdCkmYnBmX3RvKSA8IDApIHsKLQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICAgICJCSU9DU1JUSU1FT1VUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwogCQkJCWdvdG8gYmFkOwpAQCAtMjEzMCw3ICsyMzUxLDcgQEAKIAkJCXRvLnR2X3NlYyA9IHAtPm9wdC50aW1lb3V0IC8gMTAwMDsKIAkJCXRvLnR2X3VzZWMgPSAocC0+b3B0LnRpbWVvdXQgKiAxMDAwKSAlIDEwMDAwMDA7CiAJCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTUlRJTUVPVVQsIChjYWRkcl90KSZ0bykgPCAwKSB7Ci0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAgICAiQklPQ1NSVElNRU9VVDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJCQlnb3RvIGJhZDsKQEAgLTIxNjUsNyArMjM4Niw3IEBACiAjZW5kaWYgLyogX0FJWCAqLwogCQl2ID0gMTsKIAkJaWYgKGlvY3RsKHAtPmZkLCBCSU9DSU1NRURJQVRFLCAmdikgPCAwKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiQklPQ0lNTUVESUFURTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwogCQkJZ290byBiYWQ7CkBAIC0yMTc4LDcgKzIzOTksNyBAQAogCQkvKgogCQkgKiBXZSBkb24ndCBzdXBwb3J0IGltbWVkaWF0ZSBtb2RlLiAgRmFpbC4KIAkJICovCi0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkltbWVkaWF0ZSBtb2RlIG5vdCBzdXBwb3J0ZWQiKTsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJJbW1lZGlhdGUgbW9kZSBub3Qgc3VwcG9ydGVkIik7CiAJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCWdvdG8gYmFkOwogCX0KQEAgLTIxODcsMTQgKzI0MDgsMjQgQEAKIAlpZiAocC0+b3B0LnByb21pc2MpIHsKIAkJLyogc2V0IHByb21pc2N1b3VzIG1vZGUsIGp1c3Qgd2FybiBpZiBpdCBmYWlscyAqLwogCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NQUk9NSVNDLCBOVUxMKSA8IDApIHsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NQUk9NSVNDOiAlcyIsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NQUk9NSVNDOiAlcyIsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJc3RhdHVzID0gUENBUF9XQVJOSU5HX1BST01JU0NfTk9UU1VQOwogCQl9CiAJfQogCisjaWZkZWYgQklPQ1NUU1RBTVAKKwl2ID0gQlBGX1RfQklOVElNRTsKKwlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTVFNUQU1QLCAmdikgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTVFNUQU1QOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCWdvdG8gYmFkOworCX0KKyNlbmRpZiAvKiBCSU9DU1RTVEFNUCAqLworCiAJaWYgKGlvY3RsKGZkLCBCSU9DR0JMRU4sIChjYWRkcl90KSZ2KSA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ0dCTEVOOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ0dCTEVOOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCWdvdG8gYmFkOwpAQCAtMjIwMyw5ICsyNDM0LDkgQEAKICNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgogCWlmICghcGItPnplcm9jb3B5KSB7CiAjZW5kaWYKLQlwLT5idWZmZXIgPSAodV9jaGFyICopbWFsbG9jKHAtPmJ1ZnNpemUpOworCXAtPmJ1ZmZlciA9IG1hbGxvYyhwLT5idWZzaXplKTsKIAlpZiAocC0+YnVmZmVyID09IE5VTEwpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCWdvdG8gYmFkOwpAQCAtMjIzNiw3ICsyNDY3LDcgQEAKIAl0b3RhbF9wcm9nLmJmX2xlbiA9IDE7CiAJdG90YWxfcHJvZy5iZl9pbnNucyA9ICZ0b3RhbF9pbnNuOwogCWlmIChpb2N0bChwLT5mZCwgQklPQ1NFVEYsIChjYWRkcl90KSZ0b3RhbF9wcm9nKSA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1NFVEY6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DU0VURjogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwogCQlnb3RvIGJhZDsKQEAgLTIzMDYsOSArMjUzNywxMzYgQEAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKKy8qCisgKiBOb3QgYWxsIGludGVyZmFjZXMgY2FuIGJlIGJvdW5kIHRvIGJ5IEJQRiwgc28gdHJ5IHRvIGJpbmQgdG8KKyAqIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlOyByZXR1cm4gMCBpZiB3ZSBmYWlsIHdpdGgKKyAqIFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0UgKHdoaWNoIG1lYW5zIHdlIGdvdCBhbiBFTlhJTyB3aGVuIHdlIHRyaWVkCisgKiB0byBiaW5kLCB3aGljaCBtZWFucyB0aGlzIGludGVyZmFjZSBpc24ndCBpbiB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzCisgKiBhdHRhY2hlZCB0byBCUEYpIGFuZCAxIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorY2hlY2tfYnBmX2JpbmRhYmxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGZkOworCWNoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworCisJZmQgPSBicGZfb3Blbl9hbmRfYmluZChuYW1lLCBlcnJidWYpOworCWlmIChmZCA8IDApIHsKKwkJLyoKKwkJICogRXJyb3IgLSB3YXMgaXQgUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRT8KKwkJICovCisJCWlmIChmZCA9PSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFKSB7CisJCQkvKgorCQkJICogWWVzLCBzbyB3ZSBjYW4ndCBiaW5kIHRvIHRoaXMgYmVjYXVzZSBpdCdzCisJCQkgKiBub3Qgc29tZXRoaW5nIHN1cHBvcnRlZCBieSBCUEYuCisJCQkgKi8KKwkJCXJldHVybiAoMCk7CisJCX0KKwkJLyoKKwkJICogTm8sIHNvIHdlIGRvbid0IGtub3cgd2hldGhlciBpdCdzIHN1cHBvcnRlZCBvciBub3Q7CisJCSAqIHNheSBpdCBpcywgc28gdGhhdCB0aGUgdXNlciBjYW4gYXQgbGVhc3QgdHJ5IHRvCisJCSAqIG9wZW4gaXQgYW5kIHJlcG9ydCB0aGUgZXJyb3IgKHdoaWNoIGlzIHByb2JhYmx5CisJCSAqICJ5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gQlBGIGRldmljZXMiOworCQkgKiByZXBvcnRpbmcgdGhvc2UgaW50ZXJmYWNlcyBtZWFucyB1c2VycyB3aWxsIGFzaworCQkgKiAid2h5IGFtIEkgZ2V0dGluZyBhIHBlcm1pc3Npb25zIGVycm9yIHdoZW4gSSB0cnkKKwkJICogdG8gY2FwdHVyZSIgcmF0aGVyIHRoYW4gIndoeSBhbSBJIG5vdCBzZWVpbmcgYW55CisJCSAqIGludGVyZmFjZXMiLCBtYWtpbmcgdGhlIHVuZGVybHlpbmcgcHJvYmxlbSBjbGVhcmVyKS4KKwkJICovCisJCXJldHVybiAoMSk7CisJfQorCisJLyoKKwkgKiBTdWNjZXNzLgorCSAqLworCWNsb3NlKGZkKTsKKwlyZXR1cm4gKDEpOworfQorCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgZGVmaW5lZChTSU9DSUZDUkVBVEUyKQorc3RhdGljIGludAorZmluZGRldnNfdXNiKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisJRElSICp1c2JkaXI7CisJc3RydWN0IGRpcmVudCAqdXNiaXRlbTsKKwlzaXplX3QgbmFtZV9tYXg7CisJY2hhciAqbmFtZTsKKworCS8qCisJICogV2UgbWlnaHQgaGF2ZSBVU0Igc25pZmZpbmcgc3VwcG9ydCwgc28gdHJ5IGxvb2tpbmcgZm9yIFVTQgorCSAqIGludGVyZmFjZXMuCisJICoKKwkgKiBXZSB3YW50IHRvIHJlcG9ydCBhIHVzYnVzTiBkZXZpY2UgZm9yIGVhY2ggVVNCIGJ1cywgYnV0CisJICogdXNidXNOIGludGVyZmFjZXMgbWlnaHQsIG9yIG1pZ2h0IG5vdCwgZXhpc3QgZm9yIHRoZW0gLQorCSAqIHdlIGNyZWF0ZSBvbmUgaWYgdGhlcmUgaXNuJ3QgYWxyZWFkeSBvbmUuCisJICoKKwkgKiBTbywgaW5zdGVhZCwgd2UgbG9vayBpbiAvZGV2L3VzYiBmb3IgYWxsIGJ1c2VzIGFuZCBjcmVhdGUKKwkgKiBhICJ1c2J1c04iIGRldmljZSBmb3IgZWFjaCBvbmUuCisJICovCisJdXNiZGlyID0gb3BlbmRpcigiL2Rldi91c2IiKTsKKwlpZiAodXNiZGlyID09IE5VTEwpIHsKKwkJLyoKKwkJICogSnVzdCBwdW50LgorCQkgKi8KKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqIExlYXZlIGVub3VnaCByb29tIGZvciBhIDMyLWJpdCAoMTAtZGlnaXQpIGJ1cyBudW1iZXIuCisJICogWWVzLCB0aGF0J3Mgb3ZlcmtpbGwsIGJ1dCB3ZSB3b24ndCBiZSB1c2luZworCSAqIHRoZSBidWZmZXIgdmVyeSBsb25nLgorCSAqLworCW5hbWVfbWF4ID0gVVNCVVNfUFJFRklYX0xFTiArIDEwICsgMTsKKwluYW1lID0gbWFsbG9jKG5hbWVfbWF4KTsKKwlpZiAobmFtZSA9PSBOVUxMKSB7CisJCWNsb3NlZGlyKHVzYmRpcik7CisJCXJldHVybiAoMCk7CisJfQorCXdoaWxlICgodXNiaXRlbSA9IHJlYWRkaXIodXNiZGlyKSkgIT0gTlVMTCkgeworCQljaGFyICpwOworCQlzaXplX3QgYnVzbnVtbGVuOworCQlpbnQgZXJyOworCisJCWlmIChzdHJjbXAodXNiaXRlbS0+ZF9uYW1lLCAiLiIpID09IDAgfHwKKwkJICAgIHN0cmNtcCh1c2JpdGVtLT5kX25hbWUsICIuLiIpID09IDApIHsKKwkJCS8qCisJCQkgKiBJZ25vcmUgdGhlc2UuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCXAgPSBzdHJjaHIodXNiaXRlbS0+ZF9uYW1lLCAnLicpOworCQlpZiAocCA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWJ1c251bWxlbiA9IHAgLSB1c2JpdGVtLT5kX25hbWU7CisJCW1lbWNweShuYW1lLCB1c2J1c19wcmVmaXgsIFVTQlVTX1BSRUZJWF9MRU4pOworCQltZW1jcHkobmFtZSArIFVTQlVTX1BSRUZJWF9MRU4sIHVzYml0ZW0tPmRfbmFtZSwgYnVzbnVtbGVuKTsKKwkJKihuYW1lICsgVVNCVVNfUFJFRklYX0xFTiArIGJ1c251bWxlbikgPSAnXDAnOworCQllcnIgPSBwY2FwX2FkZF9pZihhbGxkZXZzcCwgbmFtZSwgUENBUF9JRl9VUCwgTlVMTCwgZXJyYnVmKTsKKwkJaWYgKGVyciAhPSAwKSB7CisJCQlmcmVlKG5hbWUpOworCQkJY2xvc2VkaXIodXNiZGlyKTsKKwkJCXJldHVybiAoZXJyKTsKKwkJfQorCX0KKwlmcmVlKG5hbWUpOworCWNsb3NlZGlyKHVzYmRpcik7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCiBpbnQKIHBjYXBfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKIHsKKwkvKgorCSAqIEdldCB0aGUgbGlzdCBvZiByZWd1bGFyIGludGVyZmFjZXMgZmlyc3QuCisJICovCisJaWYgKHBjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhhbGxkZXZzcCwgZXJyYnVmLCBjaGVja19icGZfYmluZGFibGUpID09IC0xKQorCQlyZXR1cm4gKC0xKTsJLyogZmFpbHVyZSAqLworCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgZGVmaW5lZChTSU9DSUZDUkVBVEUyKQorCWlmIChmaW5kZGV2c191c2IoYWxsZGV2c3AsIGVycmJ1ZikgPT0gLTEpCisJCXJldHVybiAoLTEpOworI2VuZGlmCisKIAlyZXR1cm4gKDApOwogfQogCkBAIC0yMzE5LDIwICsyNjc3LDIwIEBACiAJc3RydWN0IHBjYXBfYnBmICpwYiA9IHAtPnByaXY7CiAJaW50IHNvY2s7CiAJc3RydWN0IGlmbWVkaWFyZXEgcmVxOwotCWludCAqbWVkaWFfbGlzdDsKKwlJRk1fVUxJU1RfVFlQRSAqbWVkaWFfbGlzdDsKIAlpbnQgaTsKIAlpbnQgY2FuX2RvOwogCXN0cnVjdCBpZnJlcSBpZnI7CiAKIAlzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwogCWlmIChzb2NrID09IC0xKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImNhbid0IG9wZW4gc29ja2V0OiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiY2FuJ3Qgb3BlbiBzb2NrZXQ6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAKIAltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mIHJlcSk7Ci0Jc3RybmNweShyZXEuaWZtX25hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZiByZXEuaWZtX25hbWUpOworCXN0cm5jcHkocmVxLmlmbV9uYW1lLCBwLT5vcHQuZGV2aWNlLCBzaXplb2YgcmVxLmlmbV9uYW1lKTsKIAogCS8qCiAJICogRmluZCBvdXQgaG93IG1hbnkgbWVkaWEgdHlwZXMgd2UgaGF2ZS4KQEAgLTIzNTgsNyArMjcxNiw3IEBACiAJCQlyZXR1cm4gKFBDQVBfRVJST1JfUkZNT05fTk9UU1VQKTsKIAogCQlkZWZhdWx0OgotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIlNJT0NHSUZNRURJQSAxOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWNsb3NlKHNvY2spOwogCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKQEAgLTIzNzYsMTYgKzI3MzQsMTYgQEAKIAkgKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBob2xkIGFsbCB0aGUgbWVkaWEgdHlwZXMsIGFuZAogCSAqIGdldCB0aGUgbWVkaWEgdHlwZXMuCiAJICovCi0JbWVkaWFfbGlzdCA9IG1hbGxvYyhyZXEuaWZtX2NvdW50ICogc2l6ZW9mKGludCkpOworCW1lZGlhX2xpc3QgPSBtYWxsb2MocmVxLmlmbV9jb3VudCAqIHNpemVvZigqbWVkaWFfbGlzdCkpOwogCWlmIChtZWRpYV9saXN0ID09IE5VTEwpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWNsb3NlKHNvY2spOwogCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KIAlyZXEuaWZtX3VsaXN0ID0gbWVkaWFfbGlzdDsKIAlpZiAoaW9jdGwoc29jaywgU0lPQ0dJRk1FRElBLCAmcmVxKSA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU0lPQ0dJRk1FRElBOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU0lPQ0dJRk1FRElBOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWZyZWUobWVkaWFfbGlzdCk7CiAJCWNsb3NlKHNvY2spOwpAQCAtMjQzOCwxNyArMjc5NiwxNSBAQAogCQkJCSAqICJhdGV4aXQoKSIgZmFpbGVkOyBkb24ndCBwdXQgdGhlIGludGVyZmFjZQogCQkJCSAqIGluIG1vbml0b3IgbW9kZSwganVzdCBnaXZlIHVwLgogCQkJCSAqLwotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCQkgICAgICJhdGV4aXQgZmFpbGVkIik7CiAJCQkJY2xvc2Uoc29jayk7CiAJCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAkJCX0KIAkJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7Ci0JCQkodm9pZClzdHJuY3B5KGlmci5pZnJfbmFtZSwgcC0+b3B0LnNvdXJjZSwKKwkJCSh2b2lkKXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBwLT5vcHQuZGV2aWNlLAogCQkJICAgIHNpemVvZihpZnIuaWZyX25hbWUpKTsKIAkJCWlmci5pZnJfbWVkaWEgPSByZXEuaWZtX2N1cnJlbnQgfCBJRk1fSUVFRTgwMjExX01PTklUT1I7CiAJCQlpZiAoaW9jdGwoc29jaywgU0lPQ1NJRk1FRElBLCAmaWZyKSA9PSAtMSkgewotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgICJTSU9DU0lGTUVESUE6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJCWNsb3NlKHNvY2spOwogCQkJCXJldHVybiAoUENBUF9FUlJPUik7CkBAIC0yNDgxLDcgKzI4MzcsNyBAQAogZmluZF84MDJfMTEoc3RydWN0IGJwZl9kbHRsaXN0ICpiZGxwKQogewogCWludCBuZXdfZGx0OwotCWludCBpOworCXVfaW50IGk7CiAKIAkvKgogCSAqIFNjYW4gdGhlIGxpc3Qgb2YgRExUXyB2YWx1ZXMsIGxvb2tpbmcgZm9yIDgwMi4xMSB2YWx1ZXMsCkBAIC0yNjczLDcgKzMwMjksNyBAQAogCSAqIHNvbWUga2VybmVscy4KIAkgKi8KIAlpZiAoZXJybm8gIT0gRUlOVkFMKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRGOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1NFVEY6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQpAQCAtMjcwMiw3ICszMDU4LDcgQEAKIAlkaXJlY3Rpb24gPSAoZCA9PSBQQ0FQX0RfSU4pID8gQlBGX0RfSU4gOgogCSAgICAoKGQgPT0gUENBUF9EX09VVCkgPyBCUEZfRF9PVVQgOiBCUEZfRF9JTk9VVCk7CiAJaWYgKGlvY3RsKHAtPmZkLCBCSU9DU0RJUkVDVElPTiwgJmRpcmVjdGlvbikgPT0gLTEpIHsKLQkJKHZvaWQpIHNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCSh2b2lkKSBwY2FwX3NucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCiAJCSAgICAiQ2Fubm90IHNldCBkaXJlY3Rpb24gdG8gJXM6ICVzIiwKIAkJICAgICAgICAoZCA9PSBQQ0FQX0RfSU4pID8gIlBDQVBfRF9JTiIgOgogCQkJKChkID09IFBDQVBfRF9PVVQpID8gIlBDQVBfRF9PVVQiIDogIlBDQVBfRF9JTk9VVCIpLApAQCAtMjcxNywxNCArMzA3MywxNCBAQAogCSAqIFdlIGRvbid0IHN1cHBvcnQgUENBUF9EX09VVC4KIAkgKi8KIAlpZiAoZCA9PSBQQ0FQX0RfT1VUKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKIAkJICAgICJTZXR0aW5nIGRpcmVjdGlvbiB0byBQQ0FQX0RfT1VUIGlzIG5vdCBzdXBwb3J0ZWQgb24gQlBGIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlzZWVzZW50ID0gKGQgPT0gUENBUF9EX0lOT1VUKTsKIAlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTU0VFU0VOVCwgJnNlZXNlbnQpID09IC0xKSB7Ci0JCSh2b2lkKSBzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkodm9pZCkgcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAogCQkgICAgIkNhbm5vdCBzZXQgZGlyZWN0aW9uIHRvICVzOiAlcyIsCiAJCSAgICAgICAgKGQgPT0gUENBUF9EX0lOT1VUKSA/ICJQQ0FQX0RfSU5PVVQiIDogIlBDQVBfRF9JTiIsCiAJCQlzdHJlcnJvcihlcnJubykpOwpAQCAtMjczMiw3ICszMDg4LDcgQEAKIAl9CiAJcmV0dXJuICgwKTsKICNlbHNlCi0JKHZvaWQpIHNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJKHZvaWQpIHBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKIAkgICAgIlRoaXMgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBCSU9DU1NFRVNFTlQsIHNvIHRoZSBkaXJlY3Rpb24gY2FuJ3QgYmUgc2V0Iik7CiAJcmV0dXJuICgtMSk7CiAjZW5kaWYKQEAgLTI3NDMsNyArMzA5OSw3IEBACiB7CiAjaWZkZWYgQklPQ1NETFQKIAlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTRExULCAmZGx0KSA9PSAtMSkgewotCQkodm9pZCkgc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKKwkJKHZvaWQpIHBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKIAkJICAgICJDYW5ub3Qgc2V0IERMVCAlZDogJXMiLCBkbHQsIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KZGlmZiAtLWdpdCBhL3BjYXAtYnQtbGludXguYyBiL3BjYXAtYnQtbGludXguYwppbmRleCA1NmRmNjg3Li40NDUyZmU0IDEwMDY0NAotLS0gYS9wY2FwLWJ0LWxpbnV4LmMKKysrIGIvcGNhcC1idC1saW51eC5jCkBAIC04Nyw3ICs4Nyw3IEBACiAJCS8qIGlmIGJsdWV0b290aCBpcyBub3Qgc3VwcG9ydGVkIHRoaXMgdGhpcyBpcyBub3QgZmF0YWwqLwogCQlpZiAoZXJybm8gPT0gRUFGTk9TVVBQT1JUKQogCQkJcmV0dXJuIDA7Ci0JCXNucHJpbnRmKGVycl9zdHIsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoZXJyX3N0ciwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJDYW4ndCBvcGVuIHJhdyBCbHVldG9vdGggc29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC05NSw3ICs5NSw3IEBACiAJZGV2X2xpc3QgPSBtYWxsb2MoSENJX01BWF9ERVYgKiBzaXplb2YoKmRldl9yZXEpICsgc2l6ZW9mKCpkZXZfbGlzdCkpOwogCWlmICghZGV2X2xpc3QpCiAJewotCQlzbnByaW50ZihlcnJfc3RyLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgJXp1IGJ5dGVzIGZvciBCbHVldG9vdGggZGV2aWNlIGxpc3QiLAorCQlwY2FwX3NucHJpbnRmKGVycl9zdHIsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMgZm9yIEJsdWV0b290aCBkZXZpY2UgbGlzdCIsCiAJCQlIQ0lfTUFYX0RFViAqIHNpemVvZigqZGV2X3JlcSkgKyBzaXplb2YoKmRldl9saXN0KSk7CiAJCXJldCA9IC0xOwogCQlnb3RvIGRvbmU7CkBAIC0xMDUsNyArMTA1LDcgQEAKIAogCWlmIChpb2N0bChzb2NrLCBIQ0lHRVRERVZMSVNULCAodm9pZCAqKSBkZXZfbGlzdCkgPCAwKQogCXsKLQkJc25wcmludGYoZXJyX3N0ciwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlcnJfc3RyLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIkNhbid0IGdldCBCbHVldG9vdGggZGV2aWNlIGxpc3QgdmlhIGlvY3RsOiAlcyIsCiAJCSAgICBzdHJlcnJvcihlcnJubykpOwogCQlyZXQgPSAtMTsKQEAgLTExNiw4ICsxMTYsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXZfbGlzdC0+ZGV2X251bTsgaSsrLCBkZXZfcmVxKyspIHsKIAkJY2hhciBkZXZfbmFtZVsyMF0sIGRldl9kZXNjclszMF07CiAKLQkJc25wcmludGYoZGV2X25hbWUsIDIwLCBCVF9JRkFDRSIlZCIsIGRldl9yZXEtPmRldl9pZCk7Ci0JCXNucHJpbnRmKGRldl9kZXNjciwgMzAsICJCbHVldG9vdGggYWRhcHRlciBudW1iZXIgJWQiLCBpKTsKKwkJcGNhcF9zbnByaW50ZihkZXZfbmFtZSwgMjAsIEJUX0lGQUNFIiVkIiwgZGV2X3JlcS0+ZGV2X2lkKTsKKwkJcGNhcF9zbnByaW50ZihkZXZfZGVzY3IsIDMwLCAiQmx1ZXRvb3RoIGFkYXB0ZXIgbnVtYmVyICVkIiwgaSk7CiAKIAkJaWYgKHBjYXBfYWRkX2lmKGFsbGRldnNwLCBkZXZfbmFtZSwgMCwKIAkJICAgICAgIGRldl9kZXNjciwgZXJyX3N0cikgPCAwKQpAQCAtMTcxLDcgKzE3MSw3IEBACiAJLyogT0ssIGl0J3MgcHJvYmFibHkgb3Vycy4gKi8KIAkqaXNfb3VycyA9IDE7CiAKLQlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9idCkpOworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9idCkpOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiAoTlVMTCk7CiAKQEAgLTE5MCwxNyArMTkwLDE2IEBACiAJaW50IGVyciA9IFBDQVBfRVJST1I7CiAKIAkvKiBnZXQgYnQgaW50ZXJmYWNlIGlkICovCi0JaWYgKHNzY2FuZihoYW5kbGUtPm9wdC5zb3VyY2UsIEJUX0lGQUNFIiVkIiwgJmRldl9pZCkgIT0gMSkKKwlpZiAoc3NjYW5mKGhhbmRsZS0+b3B0LmRldmljZSwgQlRfSUZBQ0UiJWQiLCAmZGV2X2lkKSAhPSAxKQogCXsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkiQ2FuJ3QgZ2V0IEJsdWV0b290aCBkZXZpY2UgaW5kZXggZnJvbSAlcyIsCi0JCQkgaGFuZGxlLT5vcHQuc291cmNlKTsKKwkJCSBoYW5kbGUtPm9wdC5kZXZpY2UpOwogCQlyZXR1cm4gUENBUF9FUlJPUjsKIAl9CiAKIAkvKiBJbml0aWFsaXplIHNvbWUgY29tcG9uZW50cyBvZiB0aGUgcGNhcCBzdHJ1Y3R1cmUuICovCi0JaGFuZGxlLT5idWZzaXplID0gaGFuZGxlLT5zbmFwc2hvdCtCVF9DVFJMX1NJWkUrc2l6ZW9mKHBjYXBfYmx1ZXRvb3RoX2g0X2hlYWRlcik7Ci0JaGFuZGxlLT5vZmZzZXQgPSBCVF9DVFJMX1NJWkU7CisJaGFuZGxlLT5idWZzaXplID0gQlRfQ1RSTF9TSVpFK3NpemVvZihwY2FwX2JsdWV0b290aF9oNF9oZWFkZXIpK2hhbmRsZS0+c25hcHNob3Q7CiAJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9CTFVFVE9PVEhfSENJX0g0X1dJVEhfUEhEUjsKIAogCWhhbmRsZS0+cmVhZF9vcCA9IGJ0X3JlYWRfbGludXg7CkBAIC0yMTYsMjggKzIxNSwyOCBAQAogCS8qIENyZWF0ZSBIQ0kgc29ja2V0ICovCiAJaGFuZGxlLT5mZCA9IHNvY2tldChBRl9CTFVFVE9PVEgsIFNPQ0tfUkFXLCBCVFBST1RPX0hDSSk7CiAJaWYgKGhhbmRsZS0+ZmQgPCAwKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIkNhbid0IGNyZWF0ZSByYXcgc29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiBQQ0FQX0VSUk9SOwogCX0KIAogCWhhbmRsZS0+YnVmZmVyID0gbWFsbG9jKGhhbmRsZS0+YnVmc2l6ZSk7CiAJaWYgKCFoYW5kbGUtPmJ1ZmZlcikgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGFsbG9jYXRlIGR1bXAgYnVmZmVyOiAlcyIsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBhbGxvY2F0ZSBkdW1wIGJ1ZmZlcjogJXMiLAogCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGNsb3NlX2ZhaWw7CiAJfQogCiAJb3B0ID0gMTsKIAlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfSENJLCBIQ0lfREFUQV9ESVIsICZvcHQsIHNpemVvZihvcHQpKSA8IDApIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiQ2FuJ3QgZW5hYmxlIGRhdGEgZGlyZWN0aW9uIGluZm86ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBjbG9zZV9mYWlsOwogCX0KIAogCW9wdCA9IDE7CiAJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX0hDSSwgSENJX1RJTUVfU1RBTVAsICZvcHQsIHNpemVvZihvcHQpKSA8IDApIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiQ2FuJ3QgZW5hYmxlIHRpbWUgc3RhbXA6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBjbG9zZV9mYWlsOwogCX0KQEAgLTI0OCw3ICsyNDcsNyBAQAogCW1lbXNldCgodm9pZCAqKSAmZmx0LnR5cGVfbWFzaywgMHhmZiwgc2l6ZW9mKGZsdC50eXBlX21hc2spKTsKIAltZW1zZXQoKHZvaWQgKikgJmZsdC5ldmVudF9tYXNrLCAweGZmLCBzaXplb2YoZmx0LmV2ZW50X21hc2spKTsKIAlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfSENJLCBIQ0lfRklMVEVSLCAmZmx0LCBzaXplb2YoZmx0KSkgPCAwKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIkNhbid0IHNldCBmaWx0ZXI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBjbG9zZV9mYWlsOwogCX0KQEAgLTI2MSw3ICsyNjAsNyBAQAogCWFkZHIuaGNpX2NoYW5uZWwgPSBIQ0lfQ0hBTk5FTF9SQVc7CiAjZW5kaWYKIAlpZiAoYmluZChoYW5kbGUtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJDYW4ndCBhdHRhY2ggdG8gZGV2aWNlICVkOiAlcyIsIGhhbmRsZXAtPmRldl9pZCwKIAkJICAgIHN0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gY2xvc2VfZmFpbDsKQEAgLTI4Miw3ICsyODEsNyBAQAogCQlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCiAJCSAgICAmaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUsCiAJCSAgICBzaXplb2YoaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUpKSA9PSAtMSkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAiU09fUkNWQlVGOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWdvdG8gY2xvc2VfZmFpbDsKIAkJfQpAQCAtMzA1LDE2ICszMDQsMTkgQEAKIAlzc2l6ZV90IHJldDsKIAlzdHJ1Y3QgcGNhcF9wa3RoZHIgcGt0aDsKIAlwY2FwX2JsdWV0b290aF9oNF9oZWFkZXIqIGJ0aGRyOworCXVfY2hhciAqcGt0ZDsKKwlpbnQgaW4gPSAwOwogCi0JYnRoZHIgPSAocGNhcF9ibHVldG9vdGhfaDRfaGVhZGVyKikgJmhhbmRsZS0+YnVmZmVyW2hhbmRsZS0+b2Zmc2V0XTsKLQlpdi5pb3ZfYmFzZSA9ICZoYW5kbGUtPmJ1ZmZlcltoYW5kbGUtPm9mZnNldCtzaXplb2YocGNhcF9ibHVldG9vdGhfaDRfaGVhZGVyKV07CisJcGt0ZCA9ICh1X2NoYXIgKiloYW5kbGUtPmJ1ZmZlciArIEJUX0NUUkxfU0laRTsKKwlidGhkciA9IChwY2FwX2JsdWV0b290aF9oNF9oZWFkZXIqKSh2b2lkICopcGt0ZDsKKwlpdi5pb3ZfYmFzZSA9IHBrdGQgKyBzaXplb2YocGNhcF9ibHVldG9vdGhfaDRfaGVhZGVyKTsKIAlpdi5pb3ZfbGVuICA9IGhhbmRsZS0+c25hcHNob3Q7CiAKIAltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOwogCW1zZy5tc2dfaW92ID0gJml2OwogCW1zZy5tc2dfaW92bGVuID0gMTsKIAltc2cubXNnX2NvbnRyb2wgPSBoYW5kbGUtPmJ1ZmZlcjsKLQltc2cubXNnX2NvbnRyb2xsZW4gPSBoYW5kbGUtPm9mZnNldDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSBCVF9DVFJMX1NJWkU7CiAKIAkvKiBpZ25vcmUgaW50ZXJydXB0IHN5c3RlbSBjYWxsIGVycm9yICovCiAJZG8gewpAQCAtMzI3LDcgKzMyOSw3IEBACiAJfSB3aGlsZSAoKHJldCA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJDYW4ndCByZWNlaXZlIHBhY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzM2LDcgKzMzOCw2IEBACiAKIAkvKiBnZXQgZGlyZWN0aW9uIGFuZCB0aW1lc3RhbXAqLwogCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOwotCWludCBpbj0wOwogCXdoaWxlIChjbXNnKSB7CiAJCXN3aXRjaCAoY21zZy0+Y21zZ190eXBlKSB7CiAJCQljYXNlIEhDSV9DTVNHX0RJUjoKQEAgLTM1Nyw5ICszNTgsOCBAQAogCXBrdGguY2FwbGVuKz1zaXplb2YocGNhcF9ibHVldG9vdGhfaDRfaGVhZGVyKTsKIAlwa3RoLmxlbiA9IHBrdGguY2FwbGVuOwogCWlmIChoYW5kbGUtPmZjb2RlLmJmX2luc25zID09IE5VTEwgfHwKLQkgICAgYnBmX2ZpbHRlcihoYW5kbGUtPmZjb2RlLmJmX2luc25zLCAmaGFuZGxlLT5idWZmZXJbaGFuZGxlLT5vZmZzZXRdLAotCSAgICAgIHBrdGgubGVuLCBwa3RoLmNhcGxlbikpIHsKLQkJY2FsbGJhY2sodXNlciwgJnBrdGgsICZoYW5kbGUtPmJ1ZmZlcltoYW5kbGUtPm9mZnNldF0pOworCSAgICBicGZfZmlsdGVyKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMsIHBrdGQsIHBrdGgubGVuLCBwa3RoLmNhcGxlbikpIHsKKwkJY2FsbGJhY2sodXNlciwgJnBrdGgsIHBrdGQpOwogCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CS8qIGRpZG4ndCBwYXNzIGZpbHRlciAqLwpAQCAtMzY4LDcgKzM2OCw3IEBACiBzdGF0aWMgaW50CiBidF9pbmplY3RfbGludXgocGNhcF90ICpoYW5kbGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0Jc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJpbmplY3Qgbm90IHN1cHBvcnRlZCBvbiAiCisJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImluamVjdCBub3Qgc3VwcG9ydGVkIG9uICIKICAgICAJCSJibHVldG9vdGggZGV2aWNlcyIpOwogCXJldHVybiAoLTEpOwogfQpAQCAtMzg5LDcgKzM4OSw3IEBACiAJfSB3aGlsZSAoKHJldCA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJDYW4ndCBnZXQgc3RhdHMgdmlhIGlvY3RsOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCmRpZmYgLS1naXQgYS9wY2FwLWJ0LW1vbml0b3ItbGludXguYyBiL3BjYXAtYnQtbW9uaXRvci1saW51eC5jCmluZGV4IGYxOTNlMjYuLjUyMWQ2ZDUgMTAwNjQ0Ci0tLSBhL3BjYXAtYnQtbW9uaXRvci1saW51eC5jCisrKyBiL3BjYXAtYnQtbW9uaXRvci1saW51eC5jCkBAIC0zNCwxMiArMzQsMTIgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgPGJsdWV0b290aC9ibHVldG9vdGguaD4KICNpbmNsdWRlIDxibHVldG9vdGgvaGNpLmg+Ci0jaW5jbHVkZSA8Ymx1ZXRvb3RoL21nbXQuaD4KIAogI2luY2x1ZGUgInBjYXAvYmx1ZXRvb3RoLmgiCiAjaW5jbHVkZSAicGNhcC1pbnQuaCIKQEAgLTQ5LDYgKzQ5LDE2IEBACiAjZGVmaW5lIEJUX0NPTlRST0xfU0laRSAzMgogI2RlZmluZSBJTlRFUkZBQ0VfTkFNRSAiYmx1ZXRvb3RoLW1vbml0b3IiCiAKKy8qCisgKiBGaWVsZHMgYW5kIGFsaWdubWVudCBtdXN0IG1hdGNoIHRoZSBkZWNsYXJhdGlvbiBpbiB0aGUgTGludXgga2VybmVsIDMuNCsuCisgKiBTZWUgc3RydWN0IGhjaV9tb25faGRyIGluIGluY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfbW9uLmguCisgKi8KK3N0cnVjdCBoY2lfbW9uX2hkciB7CisgICAgdWludDE2X3Qgb3Bjb2RlOworICAgIHVpbnQxNl90IGluZGV4OworICAgIHVpbnQxNl90IGxlbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKIGludAogYnRfbW9uaXRvcl9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyX3N0cikKIHsKQEAgLTcyLDEzICs4MiwxNSBAQAogICAgIHNzaXplX3QgcmV0OwogICAgIHN0cnVjdCBwY2FwX3BrdGhkciBwa3RoOwogICAgIHBjYXBfYmx1ZXRvb3RoX2xpbnV4X21vbml0b3JfaGVhZGVyICpidGhkcjsKLSAgICBzdHJ1Y3QgbWdtdF9oZHIgaGRyOworICAgIHVfY2hhciAqcGt0ZDsKKyAgICBzdHJ1Y3QgaGNpX21vbl9oZHIgaGRyOwogCi0gICAgYnRoZHIgPSAocGNhcF9ibHVldG9vdGhfbGludXhfbW9uaXRvcl9oZWFkZXIqKSAmaGFuZGxlLT5idWZmZXJbaGFuZGxlLT5vZmZzZXRdOworICAgIHBrdGQgPSAodV9jaGFyICopaGFuZGxlLT5idWZmZXIgKyBCVF9DT05UUk9MX1NJWkU7CisgICAgYnRoZHIgPSAocGNhcF9ibHVldG9vdGhfbGludXhfbW9uaXRvcl9oZWFkZXIqKSh2b2lkICopcGt0ZDsKIAogICAgIGl2WzBdLmlvdl9iYXNlID0gJmhkcjsKLSAgICBpdlswXS5pb3ZfbGVuID0gTUdNVF9IRFJfU0laRTsKLSAgICBpdlsxXS5pb3ZfYmFzZSA9ICZoYW5kbGUtPmJ1ZmZlcltoYW5kbGUtPm9mZnNldCArIHNpemVvZihwY2FwX2JsdWV0b290aF9saW51eF9tb25pdG9yX2hlYWRlcildOworICAgIGl2WzBdLmlvdl9sZW4gPSBzaXplb2YoaGRyKTsKKyAgICBpdlsxXS5pb3ZfYmFzZSA9IHBrdGQgKyBzaXplb2YocGNhcF9ibHVldG9vdGhfbGludXhfbW9uaXRvcl9oZWFkZXIpOwogICAgIGl2WzFdLmlvdl9sZW4gPSBoYW5kbGUtPnNuYXBzaG90OwogCiAgICAgbWVtc2V0KCZwa3RoLnRzLCAwLCBzaXplb2YocGt0aC50cykpOwpAQCAtODYsNyArOTgsNyBAQAogICAgIG1zZy5tc2dfaW92ID0gaXY7CiAgICAgbXNnLm1zZ19pb3ZsZW4gPSAyOwogICAgIG1zZy5tc2dfY29udHJvbCA9IGhhbmRsZS0+YnVmZmVyOwotICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IGhhbmRsZS0+b2Zmc2V0OworICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IEJUX0NPTlRST0xfU0laRTsKIAogICAgIGRvIHsKICAgICAgICAgcmV0ID0gcmVjdm1zZyhoYW5kbGUtPmZkLCAmbXNnLCAwKTsKQEAgLTk4LDEyICsxMTAsMTIgQEAKICAgICB9IHdoaWxlICgocmV0ID09IC0xKSAmJiAoZXJybm8gPT0gRUlOVFIpKTsKIAogICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorICAgICAgICBwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogICAgICAgICAgICAgIkNhbid0IHJlY2VpdmUgcGFja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBwa3RoLmNhcGxlbiA9IHJldCAtIE1HTVRfSERSX1NJWkUgKyBzaXplb2YocGNhcF9ibHVldG9vdGhfbGludXhfbW9uaXRvcl9oZWFkZXIpOworICAgIHBrdGguY2FwbGVuID0gcmV0IC0gc2l6ZW9mKGhkcikgKyBzaXplb2YocGNhcF9ibHVldG9vdGhfbGludXhfbW9uaXRvcl9oZWFkZXIpOwogICAgIHBrdGgubGVuID0gcGt0aC5jYXBsZW47CiAKICAgICBmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOyBjbXNnICE9IE5VTEw7IGNtc2cgPSBDTVNHX05YVEhEUigmbXNnLCBjbXNnKSkgewpAQCAtMTE4LDkgKzEzMCw4IEBACiAgICAgYnRoZHItPm9wY29kZSA9IGh0b25zKGhkci5vcGNvZGUpOwogCiAgICAgaWYgKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMgPT0gTlVMTCB8fAotICAgICAgICBicGZfZmlsdGVyKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMsICZoYW5kbGUtPmJ1ZmZlcltoYW5kbGUtPm9mZnNldF0sCi0gICAgICAgICAgcGt0aC5sZW4sIHBrdGguY2FwbGVuKSkgewotICAgICAgICBjYWxsYmFjayh1c2VyLCAmcGt0aCwgJmhhbmRsZS0+YnVmZmVyW2hhbmRsZS0+b2Zmc2V0XSk7CisgICAgICAgIGJwZl9maWx0ZXIoaGFuZGxlLT5mY29kZS5iZl9pbnNucywgcGt0ZCwgcGt0aC5sZW4sIHBrdGguY2FwbGVuKSkgeworICAgICAgICBjYWxsYmFjayh1c2VyLCAmcGt0aCwgcGt0ZCk7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICByZXR1cm4gMDsgICAvKiBkaWRuJ3QgcGFzcyBmaWx0ZXIgKi8KQEAgLTEyOSw3ICsxNDAsNyBAQAogc3RhdGljIGludAogYnRfbW9uaXRvcl9pbmplY3QocGNhcF90ICpoYW5kbGUsIGNvbnN0IHZvaWQgKmJ1ZiBfVV8sIHNpemVfdCBzaXplIF9VXykKIHsKLSAgICBzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImluamVjdCBub3Qgc3VwcG9ydGVkIHlldCIpOworICAgIHBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJpbmplY3Qgbm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICByZXR1cm4gLTE7CiB9CiAKQEAgLTE2Miw4ICsxNzMsNyBAQAogICAgICAgICByZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CiAgICAgfQogCi0gICAgaGFuZGxlLT5idWZzaXplID0gaGFuZGxlLT5zbmFwc2hvdCArIEJUX0NPTlRST0xfU0laRSArIHNpemVvZihwY2FwX2JsdWV0b290aF9saW51eF9tb25pdG9yX2hlYWRlcik7Ci0gICAgaGFuZGxlLT5vZmZzZXQgPSBCVF9DT05UUk9MX1NJWkU7CisgICAgaGFuZGxlLT5idWZzaXplID0gQlRfQ09OVFJPTF9TSVpFICsgc2l6ZW9mKHBjYXBfYmx1ZXRvb3RoX2xpbnV4X21vbml0b3JfaGVhZGVyKSArIGhhbmRsZS0+c25hcHNob3Q7CiAgICAgaGFuZGxlLT5saW5rdHlwZSA9IERMVF9CTFVFVE9PVEhfTElOVVhfTU9OSVRPUjsKIAogICAgIGhhbmRsZS0+cmVhZF9vcCA9IGJ0X21vbml0b3JfcmVhZDsKQEAgLTE3NywxNCArMTg3LDE0IEBACiAKICAgICBoYW5kbGUtPmZkID0gc29ja2V0KEFGX0JMVUVUT09USCwgU09DS19SQVcsIEJUUFJPVE9fSENJKTsKICAgICBpZiAoaGFuZGxlLT5mZCA8IDApIHsKLSAgICAgICAgc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisgICAgICAgIHBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAgICAgICAgICAgICAiQ2FuJ3QgY3JlYXRlIHJhdyBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIFBDQVBfRVJST1I7CiAgICAgfQogCiAgICAgaGFuZGxlLT5idWZmZXIgPSBtYWxsb2MoaGFuZGxlLT5idWZzaXplKTsKICAgICBpZiAoIWhhbmRsZS0+YnVmZmVyKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgZHVtcCBidWZmZXI6ICVzIiwKKyAgICAgICAgcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGFsbG9jYXRlIGR1bXAgYnVmZmVyOiAlcyIsCiAgICAgICAgICAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIGdvdG8gY2xvc2VfZmFpbDsKICAgICB9CkBAIC0xOTUsMTQgKzIwNSwxNCBAQAogICAgIGFkZHIuaGNpX2NoYW5uZWwgPSBIQ0lfQ0hBTk5FTF9NT05JVE9SOwogCiAgICAgaWYgKGJpbmQoaGFuZGxlLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKLSAgICAgICAgc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisgICAgICAgIHBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAgICAgICAgICAgICAiQ2FuJ3QgYXR0YWNoIHRvIGludGVyZmFjZTogJXMiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICBnb3RvIGNsb3NlX2ZhaWw7CiAgICAgfQogCiAgICAgb3B0ID0gMTsKICAgICBpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfU09DS0VULCBTT19USU1FU1RBTVAsICZvcHQsIHNpemVvZihvcHQpKSA8IDApIHsKLSAgICAgICAgc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisgICAgICAgIHBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAgICAgICAgICAgICAiQ2FuJ3QgZW5hYmxlIHRpbWUgc3RhbXA6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgZ290byBjbG9zZV9mYWlsOwogICAgIH0KQEAgLTIzMiw3ICsyNDIsNyBAQAogICAgIH0KIAogICAgICppc19vdXJzID0gMTsKLSAgICBwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1ZiwgMCk7CisgICAgcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihlYnVmLCAwKTsKICAgICBpZiAocCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvcGNhcC1jYW4tbGludXguYyBiL3BjYXAtY2FuLWxpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTFlMzUuLjAwMDAwMDAKLS0tIGEvcGNhcC1jYW4tbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA5IEZlbGl4IE9iZW5odWJlcgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotICogcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqIFNvY2tldENhbiBzbmlmZmluZyBBUEkgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IHBsYXRmb3JtCi0gKiBCeSBGZWxpeCBPYmVuaHViZXIgPGZlbGl4QG9iZW5odWJlci5kZT4KLSAqCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAicGNhcC1pbnQuaCIKLSNpbmNsdWRlICJwY2FwLWNhbi1saW51eC5oIgotCi0jaWZkZWYgTkVFRF9TVFJFUlJPUl9ICi0jaW5jbHVkZSAic3RyZXJyb3IuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXQvaWYuaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Nhbi5oPgotI2luY2x1ZGUgPGxpbnV4L2Nhbi9yYXcuaD4KLQotLyogbm90IHlldCBkZWZpbmVkIGFueXdoZXJlICovCi0jaWZuZGVmIFBGX0NBTgotI2RlZmluZSBQRl9DQU4gMjkKLSNlbmRpZgotI2lmbmRlZiBBRl9DQU4KLSNkZWZpbmUgQUZfQ0FOIFBGX0NBTgotI2VuZGlmCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLXN0YXRpYyBpbnQgY2FuX2FjdGl2YXRlKHBjYXBfdCAqKTsKLXN0YXRpYyBpbnQgY2FuX3JlYWRfbGludXgocGNhcF90ICosIGludCAsIHBjYXBfaGFuZGxlciAsIHVfY2hhciAqKTsKLXN0YXRpYyBpbnQgY2FuX2luamVjdF9saW51eChwY2FwX3QgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwotc3RhdGljIGludCBjYW5fc2V0ZmlsdGVyX2xpbnV4KHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7Ci1zdGF0aWMgaW50IGNhbl9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICosIHBjYXBfZGlyZWN0aW9uX3QpOwotc3RhdGljIGludCBjYW5fc3RhdHNfbGludXgocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXQgKik7Ci0KLS8qCi0gKiBQcml2YXRlIGRhdGEgZm9yIGNhcHR1cmluZyBvbiBMaW51eCBDQU5idXMgZGV2aWNlcy4KLSAqLwotc3RydWN0IHBjYXBfY2FuIHsKLQlpbnQgaWZpbmRleDsJCS8qIGludGVyZmFjZSBpbmRleCBvZiBkZXZpY2Ugd2UncmUgYm91bmQgdG8gKi8KLX07Ci0KLWludAotY2FuX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmRldmxpc3RwLCBjaGFyICplcnJidWYpCi17Ci0JLyoKLQkgKiBUaGVyZSBhcmUgbm8gcGxhdGZvcm0tc3BlY2lmaWMgZGV2aWNlcyBzaW5jZSBlYWNoIGRldmljZQotCSAqIGV4aXN0cyBhcyBhIHJlZ3VsYXIgbmV0d29yayBpbnRlcmZhY2UuCi0JICoKLQkgKiBYWFggLSB0cnVlPwotCSAqLwotCXJldHVybiAwOwotfQotCi1wY2FwX3QgKgotY2FuX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYsIGludCAqaXNfb3VycykKLXsKLQljb25zdCBjaGFyICpjcDsKLQljaGFyICpjcGVuZDsKLQlsb25nIGRldm51bTsKLQlwY2FwX3QqIHA7Ci0KLQkvKiBEb2VzIHRoaXMgbG9vayBsaWtlIGEgQ0FOYnVzIGRldmljZT8gKi8KLQljcCA9IHN0cnJjaHIoZGV2aWNlLCAnLycpOwotCWlmIChjcCA9PSBOVUxMKQotCQljcCA9IGRldmljZTsKLQkvKiBEb2VzIGl0IGJlZ2luIHdpdGggImNhbiIgb3IgInZjYW4iPyAqLwotCWlmIChzdHJuY21wKGNwLCAiY2FuIiwgMykgPT0gMCkgewotCQkvKiBCZWdpbnMgd2l0aCAiY2FuIiAqLwotCQljcCArPSAzOwkvKiBza2lwIHBhc3QgImNhbiIgKi8KLQl9IGVsc2UgaWYgKHN0cm5jbXAoY3AsICJ2Y2FuIiwgNCkgPT0gMCkgewotCQkvKiBCZWdpbnMgd2l0aCAidmNhbiIgKi8KLQkJY3AgKz0gNDsKLQl9IGVsc2UgewotCQkvKiBOb3BlLCBkb2Vzbid0IGJlZ2luIHdpdGggImNhbiIgb3IgInZjYW4iICovCi0JCSppc19vdXJzID0gMDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFllcyAtIGlzICJjYW4iIG9yICJ2Y2FuIiBmb2xsb3dlZCBieSBhIG51bWJlciBmcm9tIDA/ICovCi0JZGV2bnVtID0gc3RydG9sKGNwLCAmY3BlbmQsIDEwKTsKLQlpZiAoY3BlbmQgPT0gY3AgfHwgKmNwZW5kICE9ICdcMCcpIHsKLQkJLyogTm90IGZvbGxvd2VkIGJ5IGEgbnVtYmVyLiAqLwotCQkqaXNfb3VycyA9IDA7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZGV2bnVtIDwgMCkgewotCQkvKiBGb2xsb3dlZCBieSBhIG5vbi12YWxpZCBudW1iZXIuICovCi0JCSppc19vdXJzID0gMDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogT0ssIGl0J3MgcHJvYmFibHkgb3Vycy4gKi8KLQkqaXNfb3VycyA9IDE7Ci0KLQlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9jYW4pKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOwotCi0JcC0+YWN0aXZhdGVfb3AgPSBjYW5fYWN0aXZhdGU7Ci0JcmV0dXJuIChwKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1jYW5fYWN0aXZhdGUocGNhcF90KiBoYW5kbGUpCi17Ci0Jc3RydWN0IHBjYXBfY2FuICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OwotCXN0cnVjdCBzb2NrYWRkcl9jYW4gYWRkcjsKLQlzdHJ1Y3QgaWZyZXEgaWZyOwotCi0JLyogSW5pdGlhbGl6ZSBzb21lIGNvbXBvbmVudHMgb2YgdGhlIHBjYXAgc3RydWN0dXJlLiAqLwotCWhhbmRsZS0+YnVmc2l6ZSA9IDI0OwotCWhhbmRsZS0+b2Zmc2V0ID0gODsKLQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0NBTl9TT0NLRVRDQU47Ci0JaGFuZGxlLT5yZWFkX29wID0gY2FuX3JlYWRfbGludXg7Ci0JaGFuZGxlLT5pbmplY3Rfb3AgPSBjYW5faW5qZWN0X2xpbnV4OwotCWhhbmRsZS0+c2V0ZmlsdGVyX29wID0gY2FuX3NldGZpbHRlcl9saW51eDsKLQloYW5kbGUtPnNldGRpcmVjdGlvbl9vcCA9IGNhbl9zZXRkaXJlY3Rpb25fbGludXg7Ci0JaGFuZGxlLT5zZXRfZGF0YWxpbmtfb3AgPSBOVUxMOwotCWhhbmRsZS0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOwotCWhhbmRsZS0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2ZkOwotCWhhbmRsZS0+c3RhdHNfb3AgPSBjYW5fc3RhdHNfbGludXg7Ci0KLQkvKiBDcmVhdGUgc29ja2V0ICovCi0JaGFuZGxlLT5mZCA9IHNvY2tldChQRl9DQU4sIFNPQ0tfUkFXLCBDQU5fUkFXKTsKLQlpZiAoaGFuZGxlLT5mZCA8IDApCi0JewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGNyZWF0ZSByYXcgc29ja2V0ICVkOiVzIiwKLQkJCWVycm5vLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gUENBUF9FUlJPUjsKLQl9Ci0KLQkvKiBnZXQgaW50ZXJmYWNlIGluZGV4ICovCi0JbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKLQlzdHJsY3B5KGlmci5pZnJfbmFtZSwgaGFuZGxlLT5vcHQuc291cmNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7Ci0JaWYgKGlvY3RsKGhhbmRsZS0+ZmQsIFNJT0NHSUZJTkRFWCwgJmlmcikgPCAwKQotCXsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkJIlVuYWJsZSB0byBnZXQgaW50ZXJmYWNlIGluZGV4OiAlcyIsCi0JCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihoYW5kbGUpOwotCQlyZXR1cm4gUENBUF9FUlJPUjsKLQl9Ci0JaGFuZGxlcC0+aWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKLQotCS8qIGFsbG9jYXRlIGJ1dHRlciAqLwotCWhhbmRsZS0+YnVmZmVyID0gbWFsbG9jKGhhbmRsZS0+YnVmc2l6ZSk7Ci0JaWYgKCFoYW5kbGUtPmJ1ZmZlcikKLQl7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgZHVtcCBidWZmZXI6ICVzIiwKLQkJCXBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7Ci0JCXJldHVybiBQQ0FQX0VSUk9SOwotCX0KLQotCS8qIEJpbmQgdG8gdGhlIHNvY2tldCAqLwotCWFkZHIuY2FuX2ZhbWlseSA9IEFGX0NBTjsKLQlhZGRyLmNhbl9pZmluZGV4ID0gaGFuZGxlcC0+aWZpbmRleDsKLQlpZiggYmluZCggaGFuZGxlLT5mZCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSApIDwgMCAgKQotCXsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBhdHRhY2ggdG8gZGV2aWNlICVkICVkOiVzIiwKLQkJCWhhbmRsZXAtPmlmaW5kZXgsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwotCQlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24oaGFuZGxlKTsKLQkJcmV0dXJuIFBDQVBfRVJST1I7Ci0JfQotCi0JaWYgKGhhbmRsZS0+b3B0LnJmbW9uKQotCXsKLQkJLyogTW9uaXRvciBtb2RlIGRvZXNuJ3QgYXBwbHkgdG8gQ0FOIGRldmljZXMuICovCi0JCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihoYW5kbGUpOwotCQlyZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7Ci0JfQotCi0JaGFuZGxlLT5zZWxlY3RhYmxlX2ZkID0gaGFuZGxlLT5mZDsKLQlyZXR1cm4gMDsKLQotfQotCi0KLXN0YXRpYyBpbnQKLWNhbl9yZWFkX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQotewotCXN0cnVjdCBtc2doZHIgbXNnOwotCXN0cnVjdCBwY2FwX3BrdGhkciBwa3RoOwotCXN0cnVjdCBpb3ZlYyBpdjsKLQlzdHJ1Y3QgY2FuX2ZyYW1lKiBjZjsKLQotCWl2Lmlvdl9iYXNlID0gJmhhbmRsZS0+YnVmZmVyW2hhbmRsZS0+b2Zmc2V0XTsKLQlpdi5pb3ZfbGVuID0gaGFuZGxlLT5zbmFwc2hvdDsKLQotCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7Ci0JbXNnLm1zZ19pb3YgPSAmaXY7Ci0JbXNnLm1zZ19pb3ZsZW4gPSAxOwotCW1zZy5tc2dfY29udHJvbCA9IGhhbmRsZS0+YnVmZmVyOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IGhhbmRsZS0+b2Zmc2V0OwotCi0JZG8KLQl7Ci0JCXBrdGguY2FwbGVuID0gcmVjdm1zZyhoYW5kbGUtPmZkLCAmbXNnLCAwKTsKLQkJaWYgKGhhbmRsZS0+YnJlYWtfbG9vcCkKLQkJewotCQkJaGFuZGxlLT5icmVha19sb29wID0gMDsKLQkJCXJldHVybiAtMjsKLQkJfQotCX0gd2hpbGUgKChwa3RoLmNhcGxlbiA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7Ci0KLQlpZiAocGt0aC5jYXBsZW4gPT0gLTEpCi0JewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IHJlY2VpdmUgcGFja2V0ICVkOiVzIiwKLQkJCWVycm5vLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogYWRqdXN0IGNhcHR1cmUgbGVuIGFjY29yZGluZyB0byBmcmFtZSBsZW4gKi8KLQljZiA9IChzdHJ1Y3QgY2FuX2ZyYW1lKikmaGFuZGxlLT5idWZmZXJbOF07Ci0JcGt0aC5jYXBsZW4gLT0gOCAtIGNmLT5jYW5fZGxjOwotCXBrdGgubGVuID0gcGt0aC5jYXBsZW47Ci0KLQljZi0+Y2FuX2lkID0gaHRvbmwoIGNmLT5jYW5faWQgKTsKLQotCWlmKCAtMSA9PSBnZXR0aW1lb2ZkYXkoJnBrdGgudHMsIE5VTEwpICkKLQl7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgZ2V0IHRpbWUgb2YgZGF5ICVkOiVzIiwKLQkJCWVycm5vLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2FsbGJhY2sodXNlciwgJnBrdGgsICZoYW5kbGUtPmJ1ZmZlcls4XSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1jYW5faW5qZWN0X2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKQotewotCS8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KLQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImluamVjdCBub3Qgc3VwcG9ydGVkIG9uICIKLQkJImNhbiBkZXZpY2VzIik7Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLQotc3RhdGljIGludAotY2FuX3N0YXRzX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgcGNhcF9zdGF0ICpzdGF0cykKLXsKLQkvKiBub3QgeWV0IGltcGxlbWVudGVkICovCi0Jc3RhdHMtPnBzX3JlY3YgPSAwOwkJCSAvKiBudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCAqLwotCXN0YXRzLT5wc19kcm9wID0gMDsJCQkgLyogbnVtYmVyIG9mIHBhY2tldHMgZHJvcHBlZCAqLwotCXN0YXRzLT5wc19pZmRyb3AgPSAwOwkJIC8qIGRyb3BzIGJ5IGludGVyZmFjZSAtLSBvbmx5IHN1cHBvcnRlZCBvbiBzb21lIHBsYXRmb3JtcyAqLwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLWNhbl9zZXRmaWx0ZXJfbGludXgocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKQotewotCS8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1jYW5fc2V0ZGlyZWN0aW9uX2xpbnV4KHBjYXBfdCAqcCwgcGNhcF9kaXJlY3Rpb25fdCBkKQotewotCS8qIG5vIHN1cHBvcnQgZm9yIFBDQVBfRF9PVVQgKi8KLQlpZiAoZCA9PSBQQ0FQX0RfT1VUKQotCXsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKLQkJCSJTZXR0aW5nIGRpcmVjdGlvbiB0byBQQ0FQX0RfT1VUIGlzIG5vdCBzdXBwb3J0ZWQgb24gY2FuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwLT5kaXJlY3Rpb24gPSBkOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyogZW9mICovCmRpZmYgLS1naXQgYS9wY2FwLWNhbi1saW51eC5oIGIvcGNhcC1jYW4tbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MDZmZi4uMDAwMDAwMAotLS0gYS9wY2FwLWNhbi1saW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBGZWxpeCBPYmVuaHViZXIKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAqIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotLyoKLSAqIFByb3RvdHlwZXMgZm9yIFNvY2tldENBTiByZWxhdGVkIGZ1bmN0aW9ucwotICovCi1wY2FwX3QqIGNhbl9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmLCBpbnQgKmlzX291cnMpOwotaW50IGNhbl9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKTsKZGlmZiAtLWdpdCBhL3BjYXAtY2FudXNiLWxpbnV4LmMgYi9wY2FwLWNhbnVzYi1saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDRjNDVlLi4wMDAwMDAwCi0tLSBhL3BjYXAtY2FudXNiLWxpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBGZWxpeCBPYmVuaHViZXIKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAqIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiBTb2NrZXR0cmFjZSBzbmlmZmluZyBBUEkgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IHBsYXRmb3JtCi0gKiBCeSBGZWxpeCBPYmVuaHViZXIgPGZlbGl4QG9iZW5odWJlci5kZT4KLSAqCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8bGlidXNiLTEuMC9saWJ1c2IuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlICJwY2FwLWludC5oIgotI2luY2x1ZGUgInBjYXAtY2FudXNiLWxpbnV4LmgiCi0KLSNkZWZpbmUgQ0FOVVNCX0lGQUNFICJjYW51c2IiCi0KLSNkZWZpbmUgQ0FOVVNCX1ZJRCAweDA0MDMKLSNkZWZpbmUgQ0FOVVNCX1BJRCAweDg5OTAKLQotI2RlZmluZSBVU0VfVEhSRUFEIDEKLQotI2lmIFVTRV9USFJFQUQgPT0gMAotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2VuZGlmCi0KLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotc3RhdGljIGludCBjYW51c2JfYWN0aXZhdGUocGNhcF90ICopOwotc3RhdGljIGludCBjYW51c2JfcmVhZF9saW51eChwY2FwX3QgKiwgaW50ICwgcGNhcF9oYW5kbGVyICwgdV9jaGFyICopOwotc3RhdGljIGludCBjYW51c2JfaW5qZWN0X2xpbnV4KHBjYXBfdCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7Ci1zdGF0aWMgaW50IGNhbnVzYl9zZXRmaWx0ZXJfbGludXgocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKLXN0YXRpYyBpbnQgY2FudXNiX3NldGRpcmVjdGlvbl9saW51eChwY2FwX3QgKiwgcGNhcF9kaXJlY3Rpb25fdCk7Ci1zdGF0aWMgaW50IGNhbnVzYl9zdGF0c19saW51eChwY2FwX3QgKiwgc3RydWN0IHBjYXBfc3RhdCAqKTsKLQotc3RydWN0IENBTl9Nc2cKLXsKLSAgICB1aW50MzJfdCB0aW1lc3RhbXA7Ci0gICAgdWludDMyX3QgaWQ7Ci0gICAgdWludDMyX3QgbGVuZ3RoOwotICAgIHVpbnQ4X3QgZGF0YVs4XTsKLX07Ci0KLS8qCi0gKiBQcml2YXRlIGRhdGEgZm9yIGNhcHR1cmluZyBvbiBMaW51eCBDQU5idXMgVVNCIGRldmljZXMuCi0gKi8KLXN0cnVjdCBwY2FwX2NhbnVzYiB7Ci0gICAgbGlidXNiX2NvbnRleHQgKmN0eDsKLSAgICBsaWJ1c2JfZGV2aWNlX2hhbmRsZSAqZGV2OwotICAgIHB0aHJlYWRfdCB3b3JrZXI7Ci0gICAgaW50IHJkcGlwZSwgd3JwaXBlOwotICAgIHZvbGF0aWxlIGludCBsb29wOwotfTsKLQotaW50IGNhbnVzYl9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyX3N0cikKLXsKLSAgICBsaWJ1c2JfY29udGV4dCAqZmRjdHg7Ci0gICAgbGlidXNiX2RldmljZSoqIGRldnM7Ci0gICAgdW5zaWduZWQgY2hhciBzZXJudW1bNjVdOwotICAgIGludCBjbnQsIGk7Ci0KLSAgICBpZiAobGlidXNiX2luaXQoJmZkY3R4KSAhPSAwKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFhYWCAtIGlmIHRoaXMgZG9lc24ndCBqdXN0IG1lYW4gIm5vIFVTQiBmaWxlIHN5c3RlbSBtb3VudGVkIiwKLSAgICAgICAgICogcGVyaGFwcyB3ZSBzaG91bGQgcmVwb3J0IGEgcmVhbCBlcnJvciByYXRoZXIgdGhhbiBqdXN0Ci0gICAgICAgICAqIHNheWluZyAibm8gQ0FOVVNCIGRldmljZXMiLgotICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY250ID0gbGlidXNiX2dldF9kZXZpY2VfbGlzdChmZGN0eCwmZGV2cyk7Ci0KLSAgICBmb3IoaT0wO2k8Y250O2krKykKLSAgICB7Ci0gICAgICAgIGludCByZXQ7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZGV2aWNlIGlzIGludGVyZXN0aW5nLgotICAgICAgICBzdHJ1Y3QgbGlidXNiX2RldmljZV9kZXNjcmlwdG9yIGRlc2M7Ci0gICAgICAgIGxpYnVzYl9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IoZGV2c1tpXSwmZGVzYyk7Ci0KLSAgICAgICAgaWYgKChkZXNjLmlkVmVuZG9yICE9IENBTlVTQl9WSUQpIHx8IChkZXNjLmlkUHJvZHVjdCAhPSBDQU5VU0JfUElEKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOyAvL0l0IGlzIG5vdCwgY2hlY2sgbmV4dCBkZXZpY2UKLQotICAgICAgICAvL0l0IGlzIQotICAgICAgICBsaWJ1c2JfZGV2aWNlX2hhbmRsZSAqZGggPSBOVUxMOwotCi0gICAgICAgIGlmICgocmV0ID0gbGlidXNiX29wZW4oZGV2c1tpXSwmZGgpKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGRldl9uYW1lWzMwXTsKLSAgICAgICAgICAgIGNoYXIgZGV2X2Rlc2NyWzUwXTsKLSAgICAgICAgICAgIGludCBuID0gbGlidXNiX2dldF9zdHJpbmdfZGVzY3JpcHRvcl9hc2NpaShkaCxkZXNjLmlTZXJpYWxOdW1iZXIsc2VybnVtLDY0KTsKLSAgICAgICAgICAgIHNlcm51bVtuXSA9IDA7Ci0KLSAgICAgICAgICAgIHNucHJpbnRmKGRldl9uYW1lLCAzMCwgQ0FOVVNCX0lGQUNFIiVzIiwgc2VybnVtKTsKLSAgICAgICAgICAgIHNucHJpbnRmKGRldl9kZXNjciwgNTAsICJDYW5VU0IgWyVzXSIsIHNlcm51bSk7Ci0KLSAgICAgICAgICAgIGxpYnVzYl9jbG9zZShkaCk7Ci0KLSAgICAgICAgICAgIGlmIChwY2FwX2FkZF9pZihhbGxkZXZzcCwgZGV2X25hbWUsIDAsIGRldl9kZXNjciwgZXJyX3N0cikgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpYnVzYl9mcmVlX2RldmljZV9saXN0KGRldnMsMSk7Ci0gICAgICAgICAgICAgICAgbGlidXNiX2V4aXQoZmRjdHgpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGxpYnVzYl9mcmVlX2RldmljZV9saXN0KGRldnMsMSk7Ci0gICAgbGlidXNiX2V4aXQoZmRjdHgpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgbGlidXNiX2RldmljZV9oYW5kbGUqIGNhbnVzYl9vcGVuZGV2aWNlKHN0cnVjdCBsaWJ1c2JfY29udGV4dCAqY3R4LCBjaGFyKiBkZXZzZXJpYWwpCi17Ci0gICAgbGlidXNiX2RldmljZSoqIGRldnM7Ci0gICAgdW5zaWduZWQgY2hhciBzZXJpYWxbNjVdOwotICAgIGludCBjbnQsaSxuOwotCi0gICAgY250ID0gbGlidXNiX2dldF9kZXZpY2VfbGlzdChjdHgsJmRldnMpOwotCi0gICAgZm9yKGk9MDtpPGNudDtpKyspCi0gICAgewotICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGRldmljZSBpcyBpbnRlcmVzdGluZy4KLSAgICAgICAgc3RydWN0IGxpYnVzYl9kZXZpY2VfZGVzY3JpcHRvciBkZXNjOwotICAgICAgICBsaWJ1c2JfZ2V0X2RldmljZV9kZXNjcmlwdG9yKGRldnNbaV0sJmRlc2MpOwotCi0gICAgICAgIGlmICgoZGVzYy5pZFZlbmRvciAhPSBDQU5VU0JfVklEKSB8fCAoZGVzYy5pZFByb2R1Y3QgIT0gQ0FOVVNCX1BJRCkpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy9Gb3VuZCBvbmUhCi0gICAgICAgIGxpYnVzYl9kZXZpY2VfaGFuZGxlICpkaCA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKGxpYnVzYl9vcGVuKGRldnNbaV0sJmRoKSAhPSAwKSBjb250aW51ZTsKLQotICAgICAgICBuID0gbGlidXNiX2dldF9zdHJpbmdfZGVzY3JpcHRvcl9hc2NpaShkaCxkZXNjLmlTZXJpYWxOdW1iZXIsc2VyaWFsLDY0KTsKLSAgICAgICAgc2VyaWFsW25dID0gMDsKLQotICAgICAgICBpZiAoKGRldnNlcmlhbCkgJiYgKHN0cmNtcCgoY2hhciAqKXNlcmlhbCxkZXZzZXJpYWwpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaWJ1c2JfY2xvc2UoZGgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGxpYnVzYl9rZXJuZWxfZHJpdmVyX2FjdGl2ZShkaCwwKSkgJiYgKGxpYnVzYl9kZXRhY2hfa2VybmVsX2RyaXZlcihkaCwwKSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbGlidXNiX2Nsb3NlKGRoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpYnVzYl9zZXRfY29uZmlndXJhdGlvbihkaCwxKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaWJ1c2JfY2xvc2UoZGgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlidXNiX2NsYWltX2ludGVyZmFjZShkaCwwKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaWJ1c2JfY2xvc2UoZGgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0ZvdW50IGl0IQotICAgICAgICBsaWJ1c2JfZnJlZV9kZXZpY2VfbGlzdChkZXZzLDEpOwotICAgICAgICByZXR1cm4gZGg7Ci0gICAgfQotCi0gICAgbGlidXNiX2ZyZWVfZGV2aWNlX2xpc3QoZGV2cywxKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi1wY2FwX3QgKgotY2FudXNiX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYsIGludCAqaXNfb3VycykKLXsKLSAgICBjb25zdCBjaGFyICpjcDsKLSAgICBjaGFyICpjcGVuZDsKLSAgICBsb25nIGRldm51bTsKLSAgICBwY2FwX3QqIHA7Ci0gICAgc3RydWN0IHBjYXBfY2FudXNiICpjYW51c2I7Ci0KLSAgICAvKiBEb2VzIHRoaXMgbG9vayBsaWtlIGEgREFHIGRldmljZT8gKi8KLSAgICBjcCA9IHN0cnJjaHIoZGV2aWNlLCAnLycpOwotICAgIGlmIChjcCA9PSBOVUxMKQotICAgICAgICBjcCA9IGRldmljZTsKLSAgICAvKiBEb2VzIGl0IGJlZ2luIHdpdGggImNhbnVzYiI/ICovCi0gICAgaWYgKHN0cm5jbXAoY3AsICJjYW51c2IiLCA2KSAhPSAwKSB7Ci0gICAgICAgIC8qIE5vcGUsIGRvZXNuJ3QgYmVnaW4gd2l0aCAiY2FudXNiIiAqLwotICAgICAgICAqaXNfb3VycyA9IDA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvKiBZZXMgLSBpcyAiY2FudXNiIiBmb2xsb3dlZCBieSBhIG51bWJlcj8gKi8KLSAgICBjcCArPSA2OwotICAgIGRldm51bSA9IHN0cnRvbChjcCwgJmNwZW5kLCAxMCk7Ci0gICAgaWYgKGNwZW5kID09IGNwIHx8ICpjcGVuZCAhPSAnXDAnKSB7Ci0gICAgICAgIC8qIE5vdCBmb2xsb3dlZCBieSBhIG51bWJlci4gKi8KLSAgICAgICAgKmlzX291cnMgPSAwOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGRldm51bSA8IDApIHsKLSAgICAgICAgLyogRm9sbG93ZWQgYnkgYSBub24tdmFsaWQgbnVtYmVyLiAqLwotICAgICAgICAqaXNfb3VycyA9IDA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIE9LLCBpdCdzIHByb2JhYmx5IG91cnMuICovCi0gICAgKmlzX291cnMgPSAxOwotCi0gICAgcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfY2FudXNiKSk7Ci0gICAgaWYgKHAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIChOVUxMKTsKLQotICAgIGNhbnVzYiA9IHAtPnByaXY7Ci0gICAgY2FudXNiLT5jdHggPSBOVUxMOwotICAgIGNhbnVzYi0+ZGV2ID0gTlVMTDsKLSAgICBjYW51c2ItPnJkcGlwZSA9IC0xOwotICAgIGNhbnVzYi0+d3JwaXBlID0gLTE7Ci0KLSAgICBwLT5hY3RpdmF0ZV9vcCA9IGNhbnVzYl9hY3RpdmF0ZTsKLQotICAgIHJldHVybiAocCk7Ci19Ci0KLQotc3RhdGljIHZvaWQqIGNhbnVzYl9jYXB0dXJlX3RocmVhZCh2b2lkICphcmcpCi17Ci0gICAgc3RydWN0IHBjYXBfY2FudXNiICpjYW51c2IgPSBhcmc7Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgdWludDhfdCByeHN6LCB0eHN6OwotICAgIH0gc3RhdHVzOwotCi0gICAgZmNudGwoY2FudXNiLT53cnBpcGUsIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotCi0gICAgd2hpbGUoY2FudXNiLT5sb29wKQotICAgIHsKLSAgICAgICAgaW50IHN6OwotICAgICAgICBzdHJ1Y3QgQ0FOX01zZyBtc2c7Ci0KLSAgICAgICAgbGlidXNiX2ludGVycnVwdF90cmFuc2ZlcihjYW51c2ItPmRldiwgMHg4MSwgKHVuc2lnbmVkIGNoYXIqKSZzdGF0dXMsIHNpemVvZihzdGF0dXMpLCAmc3osIDEwMCk7Ci0gICAgICAgIC8vSEFDSyEhISEhIC0+IGRyb3AgYnVmZmVyZWQgZGF0YSwgcmVhZCBuZXcgb25lIGJ5IHJlYWRpbmcgdHdpY2UuCi0gICAgICAgIGxpYnVzYl9pbnRlcnJ1cHRfdHJhbnNmZXIoY2FudXNiLT5kZXYsIDB4ODEsICh1bnNpZ25lZCBjaGFyKikmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSwgJnN6LCAxMDApOwotCi0gICAgICAgIGZvcihpID0gMDsgaTxzdGF0dXMucnhzejsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaWJ1c2JfYnVsa190cmFuc2ZlcihjYW51c2ItPmRldiwgMHg4NSwgKHVuc2lnbmVkIGNoYXIqKSZtc2csIHNpemVvZihtc2cpLCAmc3osIDEwMCk7Ci0gICAgICAgICAgICBpZih3cml0ZShjYW51c2ItPndycGlwZSwgJm1zZywgc2l6ZW9mKG1zZykpIDwgMCkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwid3JpdGUoKSBlcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGNhbnVzYl9zdGFydGNhcHR1cmUoc3RydWN0IHBjYXBfY2FudXNiKiB0aGlzKQotewotICAgIGludCBwaXBlZmRbMl07Ci0KLSAgICBpZiAocGlwZShwaXBlZmQpID09IC0xKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICB0aGlzLT5yZHBpcGUgPSBwaXBlZmRbMF07Ci0gICAgdGhpcy0+d3JwaXBlID0gcGlwZWZkWzFdOwotCi0gICAgdGhpcy0+bG9vcCA9IDE7Ci0gICAgcHRocmVhZF9jcmVhdGUoJnRoaXMtPndvcmtlciwgTlVMTCwgY2FudXNiX2NhcHR1cmVfdGhyZWFkLCB0aGlzKTsKLQotICAgIHJldHVybiB0aGlzLT5yZHBpcGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhbnVzYl9jbGVhcmJ1ZnMoc3RydWN0IHBjYXBfY2FudXNiKiB0aGlzKQotewotICAgIHVuc2lnbmVkIGNoYXIgY21kWzE2XTsKLSAgICBpbnQgYWw7Ci0KLSAgICBjbWRbMF0gPSAxOyAgLy9FbXB0eSBpbmNvbWluZyBidWZmZXIKLSAgICBjbWRbMV0gPSAxOyAgLy9FbXB0eSBvdXRnb2luZyBidWZmZXIKLSAgICBjbWRbM10gPSAwOyAgLy9Ob3QgYSB3cml0ZSB0byBzZXJpYWwgbnVtYmVyCi0gICAgbWVtc2V0KCZjbWRbNF0sMCwxNi00KTsKLQotICAgIGxpYnVzYl9pbnRlcnJ1cHRfdHJhbnNmZXIodGhpcy0+ZGV2LCAweDEsY21kLDE2LCZhbCwxMDApOwotfQotCi0KLXN0YXRpYyB2b2lkIGNhbnVzYl9jbG9zZShwY2FwX3QqIGhhbmRsZSkKLXsKLSAgICBzdHJ1Y3QgcGNhcF9jYW51c2IgKmNhbnVzYiA9IGhhbmRsZS0+cHJpdjsKLQotICAgIGNhbnVzYi0+bG9vcCA9IDA7Ci0gICAgcHRocmVhZF9qb2luKGNhbnVzYi0+d29ya2VyLCBOVUxMKTsKLQotICAgIGlmIChjYW51c2ItPmRldikKLSAgICB7Ci0gICAgICAgIGxpYnVzYl9jbG9zZShjYW51c2ItPmRldik7Ci0gICAgICAgIGNhbnVzYi0+ZGV2ID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGNhbnVzYi0+Y3R4KQotICAgIHsKLSAgICAgICAgbGlidXNiX2V4aXQoY2FudXNiLT5jdHgpOwotICAgICAgICBjYW51c2ItPmN0eCA9IE5VTEw7Ci0gICAgfQotfQotCi0KLQotc3RhdGljIGludCBjYW51c2JfYWN0aXZhdGUocGNhcF90KiBoYW5kbGUpCi17Ci0gICAgc3RydWN0IHBjYXBfY2FudXNiICpjYW51c2IgPSBoYW5kbGUtPnByaXY7Ci0gICAgY2hhciAqc2VyaWFsOwotCi0gICAgaWYgKGxpYnVzYl9pbml0KCZjYW51c2ItPmN0eCkgIT0gMCkgewotICAgICAgICAvKgotICAgICAgICAgKiBYWFggLSB3aGF0IGNhdXNlcyB0aGlzIHRvIGZhaWw/Ci0gICAgICAgICAqLwotICAgICAgICBzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImxpYnVzYl9pbml0KCkgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBQQ0FQX0VSUk9SOwotICAgIH0KLQotICAgIGhhbmRsZS0+cmVhZF9vcCA9IGNhbnVzYl9yZWFkX2xpbnV4OwotCi0gICAgaGFuZGxlLT5pbmplY3Rfb3AgPSBjYW51c2JfaW5qZWN0X2xpbnV4OwotICAgIGhhbmRsZS0+c2V0ZmlsdGVyX29wID0gY2FudXNiX3NldGZpbHRlcl9saW51eDsKLSAgICBoYW5kbGUtPnNldGRpcmVjdGlvbl9vcCA9IGNhbnVzYl9zZXRkaXJlY3Rpb25fbGludXg7Ci0gICAgaGFuZGxlLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7Ci0gICAgaGFuZGxlLT5zZXRub25ibG9ja19vcCA9IHBjYXBfc2V0bm9uYmxvY2tfZmQ7Ci0gICAgaGFuZGxlLT5zdGF0c19vcCA9IGNhbnVzYl9zdGF0c19saW51eDsKLSAgICBoYW5kbGUtPmNsZWFudXBfb3AgPSBjYW51c2JfY2xvc2U7Ci0KLSAgICAvKiBJbml0aWFsaXplIHNvbWUgY29tcG9uZW50cyBvZiB0aGUgcGNhcCBzdHJ1Y3R1cmUuICovCi0gICAgaGFuZGxlLT5idWZzaXplID0gMzI7Ci0gICAgaGFuZGxlLT5vZmZzZXQgPSA4OwotICAgIGhhbmRsZS0+bGlua3R5cGUgPSBETFRfQ0FOX1NPQ0tFVENBTjsKLSAgICBoYW5kbGUtPnNldF9kYXRhbGlua19vcCA9IE5VTEw7Ci0KLSAgICBzZXJpYWwgPSBoYW5kbGUtPm9wdC5zb3VyY2UgKyBzdHJsZW4oQ0FOVVNCX0lGQUNFKTsKLQotICAgIGNhbnVzYi0+ZGV2ID0gY2FudXNiX29wZW5kZXZpY2UoY2FudXNiLT5jdHgsIHNlcmlhbCk7Ci0gICAgaWYgKCFjYW51c2ItPmRldikKLSAgICB7Ci0gICAgICAgIGxpYnVzYl9leGl0KGNhbnVzYi0+Y3R4KTsKLSAgICAgICAgc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBvcGVuIFVTQiBEZXZpY2UiKTsKLSAgICAgICAgcmV0dXJuIFBDQVBfRVJST1I7Ci0gICAgfQotCi0gICAgY2FudXNiX2NsZWFyYnVmcyhjYW51c2IpOwotCi0gICAgaGFuZGxlLT5mZCA9IGNhbnVzYl9zdGFydGNhcHR1cmUoY2FudXNiKTsKLSAgICBoYW5kbGUtPnNlbGVjdGFibGVfZmQgPSBoYW5kbGUtPmZkOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLXN0YXRpYyBpbnQKLWNhbnVzYl9yZWFkX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQotewotICAgIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBmaXJzdHBhY2tldCA9IHsgLTEsIC0xfTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgc3RydWN0IENBTl9Nc2cgbXNnOwotICAgIHN0cnVjdCBwY2FwX3BrdGhkciBwa3RoOwotCi0gICAgd2hpbGUoaSA8IG1heF9wYWNrZXRzKQotICAgIHsKLSAgICAgICAgaW50IG47Ci0gICAgICAgIHVzbGVlcCgxMCAqIDEwMDApOwotICAgICAgICBuID0gcmVhZChoYW5kbGUtPmZkLCAmbXNnLCBzaXplb2YobXNnKSk7Ci0gICAgICAgIGlmIChuIDw9IDApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgcGt0aC5jYXBsZW4gPSBwa3RoLmxlbiA9IG47Ci0gICAgICAgIHBrdGguY2FwbGVuIC09IDQ7Ci0gICAgICAgIHBrdGguY2FwbGVuIC09IDggLSBtc2cubGVuZ3RoOwotCi0gICAgICAgIGlmICgoZmlyc3RwYWNrZXQudHZfc2VjID09IC0xKSAmJiAoZmlyc3RwYWNrZXQudHZfdXNlYyA9PSAtMSkpCi0gICAgICAgICAgICBnZXR0aW1lb2ZkYXkoJmZpcnN0cGFja2V0LCBOVUxMKTsKLQotICAgICAgICBwa3RoLnRzLnR2X3VzZWMgPSBmaXJzdHBhY2tldC50dl91c2VjICsgKG1zZy50aW1lc3RhbXAgJSAxMDApICogMTAwMDA7Ci0gICAgICAgIHBrdGgudHMudHZfc2VjID0gZmlyc3RwYWNrZXQudHZfdXNlYyArIChtc2cudGltZXN0YW1wIC8gMTAwKTsKLSAgICAgICAgaWYgKHBrdGgudHMudHZfdXNlYyA+IDEwMDAwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBrdGgudHMudHZfdXNlYyAtPSAxMDAwMDAwOwotICAgICAgICAgICAgcGt0aC50cy50dl9zZWMrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGNhbGxiYWNrKHVzZXIsICZwa3RoLCAodm9pZCopJm1zZy5pZCk7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gaTsKLX0KLQotCi1zdGF0aWMgaW50Ci1jYW51c2JfaW5qZWN0X2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKQotewotICAgIC8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KLSAgICBzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImluamVjdCBub3Qgc3VwcG9ydGVkIG9uIGNhbnVzYiBkZXZpY2VzIik7Ci0gICAgcmV0dXJuICgtMSk7Ci19Ci0KLQotc3RhdGljIGludAotY2FudXNiX3N0YXRzX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgcGNhcF9zdGF0ICpzdGF0cykKLXsKLSAgICAvKiBub3QgeWV0IGltcGxlbWVudGVkICovCi0gICAgc3RhdHMtPnBzX3JlY3YgPSAwOyAgICAgLyogbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgKi8KLSAgICBzdGF0cy0+cHNfZHJvcCA9IDA7ICAgICAvKiBudW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkICovCi0gICAgc3RhdHMtPnBzX2lmZHJvcCA9IDA7ICAgLyogZHJvcHMgYnkgaW50ZXJmYWNlIC0tIG9ubHkgc3VwcG9ydGVkIG9uIHNvbWUgcGxhdGZvcm1zICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotY2FudXNiX3NldGZpbHRlcl9saW51eChwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnApCi17Ci0gICAgLyogbm90IHlldCBpbXBsZW1lbnRlZCAqLwotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLWNhbnVzYl9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICpwLCBwY2FwX2RpcmVjdGlvbl90IGQpCi17Ci0gICAgLyogbm8gc3VwcG9ydCBmb3IgUENBUF9EX09VVCAqLwotICAgIGlmIChkID09IFBDQVBfRF9PVVQpCi0gICAgewotICAgICAgICBzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAotICAgICAgICAgICAgIlNldHRpbmcgZGlyZWN0aW9uIHRvIFBDQVBfRF9PVVQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGludGVyZmFjZSIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcC0+ZGlyZWN0aW9uID0gZDsKLQotICAgIHJldHVybiAwOwotfQotCi0KLS8qIGVvZiAqLwpkaWZmIC0tZ2l0IGEvcGNhcC1jb21tb24uYyBiL3BjYXAtY29tbW9uLmMKaW5kZXggYjZmMGM5Ny4uODQzNjhmNiAxMDA2NDQKLS0tIGEvcGNhcC1jb21tb24uYworKysgYi9wY2FwLWNvbW1vbi5jCkBAIC0yNSw5ICsyNSw5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKIAotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCiAjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KLSNlbHNlIC8qIFdJTjMyICovCisjZWxzZSAvKiBfV0lOMzIgKi8KICNpZiBIQVZFX0lOVFRZUEVTX0gKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2VsaWYgSEFWRV9TVERJTlRfSApAQCAtMzcsMTEgKzM3LDE0IEBACiAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KICNlbmRpZgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmIC8qIFdJTjMyICovCisjZW5kaWYgLyogX1dJTjMyICovCiAKICNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJwY2FwL3NsbC5oIgogI2luY2x1ZGUgInBjYXAvdXNiLmgiCiAjaW5jbHVkZSAicGNhcC9uZmxvZy5oIgorI2luY2x1ZGUgInBjYXAvY2FuX3NvY2tldGNhbi5oIgogCiAjaW5jbHVkZSAicGNhcC1jb21tb24uaCIKIApAQCAtMzUxLDcgKzM1NCw3IEBACiAKICNkZWZpbmUgTElOS1RZUEVfR1BSU19MTEMJMTY5CQkvKiBHUFJTIExMQyAqLwogI2RlZmluZSBMSU5LVFlQRV9HUEZfVAkJMTcwCQkvKiBHUEYtVCAoSVRVLVQgRy43MDQxL1kuMTMwMykgKi8KLSNkZWZpbmUgTElOS1RZUEVfR1BGX0YJCTE3MQkJLyogR1BGLVQgKElUVS1UIEcuNzA0MS9ZLjEzMDMpICovCisjZGVmaW5lIExJTktUWVBFX0dQRl9GCQkxNzEJCS8qIEdQRi1GIChJVFUtVCBHLjcwNDEvWS4xMzAzKSAqLwogCiAvKgogICogUmVxdWVzdGVkIGJ5IE9vbGFuIFppbW1lciA8b3pAZ2NvbS5jb20+IGZvciB1c2UgaW4gR2NvbSdzIFQxL0UxIGxpbmUKQEAgLTQyNiwxMCArNDI5LDE3IEBACiAjZGVmaW5lIExJTktUWVBFX0E2NTNfSUNNICAgICAgIDE4NQogCiAvKgotICogVVNCIHBhY2tldHMsIGJlZ2lubmluZyB3aXRoIGEgVVNCIHNldHVwIGhlYWRlcjsgcmVxdWVzdGVkIGJ5Ci0gKiBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+LgorICogVGhpcyB1c2VkIHRvIGJlICJVU0IgcGFja2V0cywgYmVnaW5uaW5nIHdpdGggYSBVU0Igc2V0dXAgaGVhZGVyOworICogcmVxdWVzdGVkIGJ5IFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4uIgorICoKKyAqIEhvd2V2ZXIsIHRoYXQgaGVhZGVyIGRpZG4ndCB3b3JrIGFsbCB0aGF0IHdlbGwgLSBpdCBsZWZ0IG91dCBzb21lCisgKiB1c2VmdWwgaW5mb3JtYXRpb24gLSBhbmQgd2FzIGFiYW5kb25lZCBpbiBmYXZvciBvZiB0aGUgRExUX1VTQl9MSU5VWAorICogaGVhZGVyLgorICoKKyAqIFRoaXMgaXMgbm93IHVzZWQgYnkgRnJlZUJTRCBmb3IgaXRzIEJQRiB0YXBzIGZvciBVU0I7IHRoYXQgaGFzIGl0cworICogb3duIGhlYWRlcnMuICBTbyBpdCBpcyB3cml0dGVuLCBzbyBpdCBpcyBkb25lLgogICovCi0jZGVmaW5lIExJTktUWVBFX1VTQgkJMTg2CisjZGVmaW5lIExJTktUWVBFX1VTQl9GUkVFQlNECTE4NgogCiAvKgogICogQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllciAocGFydCBIOjQpOyByZXF1ZXN0ZWQgYnkKQEAgLTczNiw4ICs3NDYsMTAgQEAKIAogLyoKICAqIENBTiAoQ29udHJvbGxlciBBcmVhIE5ldHdvcmspIGZyYW1lcywgd2l0aCBhIHBzZXVkby1oZWFkZXIgYXMgc3VwcGxpZWQKLSAqIGJ5IExpbnV4IFNvY2tldENBTi4gIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2FuLnR4dCBpbiB0aGUgTGludXgKLSAqIHNvdXJjZS4KKyAqIGJ5IExpbnV4IFNvY2tldENBTiwgYW5kIHdpdGggbXVsdGktYnl0ZSBudW1lcmljYWwgZmllbGRzIGluIHRoYXQgaGVhZGVyCisgKiBpbiBiaWctZW5kaWFuIGJ5dGUgb3JkZXIuCisgKgorICogU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYW4udHh0IGluIHRoZSBMaW51eCBzb3VyY2UuCiAgKgogICogUmVxdWVzdGVkIGJ5IEZlbGl4IE9iZW5odWJlciA8ZmVsaXhAb2Jlbmh1YmVyLmRlPi4KICAqLwpAQCAtOTU5LDcgKzk3MSw2IEBACiAgKi8KICNkZWZpbmUgTElOS1RZUEVfUFJPRklCVVNfREwJCTI1NwogCi0KIC8qCiAgKiBBcHBsZSdzIERMVF9QS1RBUCBoZWFkZXJzLgogICoKQEAgLTEwMDAsNyArMTAxMSwyNCBAQAogI2RlZmluZSBMSU5LVFlQRV9aV0FWRV9SMV9SMgkyNjEKICNkZWZpbmUgTElOS1RZUEVfWldBVkVfUjMJMjYyCiAKLSNkZWZpbmUgTElOS1RZUEVfTUFUQ0hJTkdfTUFYCTI2MgkJLyogaGlnaGVzdCB2YWx1ZSBpbiB0aGUgIm1hdGNoaW5nIiByYW5nZSAqLworLyoKKyAqIHBlciBTdGV2ZSBLYXJnIDxza2FyZ0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LCBmb3JtYXRzIGZvciBXYXR0c3RvcHBlcgorICogRGlnaXRhbCBMaWdodGluZyBNYW5hZ2VtZW50IHJvb20gYnVzIHNlcmlhbCBwcm90b2NvbCBjYXB0dXJlcy4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9XQVRUU1RPUFBFUl9ETE0gMjYzCisKKy8qCisgKiBJU08gMTQ0NDMgY29udGFjdGxlc3Mgc21hcnQgY2FyZCBtZXNzYWdlcy4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9JU09fMTQ0NDMgICAgICAyNjQKKworLyoKKyAqIFJhZGlvIGRhdGEgc3lzdGVtIChSRFMpIGdyb3Vwcy4gIElFQyA2MjEwNi4KKyAqIFBlciBKb25hdGhhbiBCcnVja2VyIDxqb25hdGhhbi5icnVja2VAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9SRFMJCTI2NQorCisjZGVmaW5lIExJTktUWVBFX01BVENISU5HX01BWAkyNjUJCS8qIGhpZ2hlc3QgdmFsdWUgaW4gdGhlICJtYXRjaGluZyIgcmFuZ2UgKi8KIAogc3RhdGljIHN0cnVjdCBsaW5rdHlwZV9tYXAgewogCWludAlkbHQ7CkBAIC0xMTQ3LDYgKzExNzUsNDggQEAKIAlyZXR1cm4gbGlua3R5cGU7CiB9CiAKKyNkZWZpbmUgRVhUUkFDVF8KKworLyoKKyAqIERMVF9MSU5VWF9TTEwgcGFja2V0cyB3aXRoIGEgcHJvdG9jb2wgdHlwZSBvZiBMSU5VWF9TTExfUF9DQU4gb3IKKyAqIExJTlVYX1NMTF9QX0NBTkZEIGhhdmUgU29ja2V0Q0FOIGhlYWRlcnMgaW4gZnJvbnQgb2YgdGhlIHBheWxvYWQsCisgKiB3aXRoIHRoZSBDQU4gSUQgYmVpbmcgaW4gaG9zdCBieXRlIG9yZGVyLgorICoKKyAqIFdoZW4gcmVhZGluZyBhIERMVF9MSU5VWF9TTEwgY2FwdHVyZSBmaWxlLCB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aG9zZQorICogcGFja2V0cyBhbmQgY29udmVydCB0aGUgQ0FOIElEIGZyb20gdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3QgdGhhdAorICogd3JvdGUgdGhlIGZpbGUgdG8gdGhpcyBob3N0J3MgYnl0ZSBvcmRlci4KKyAqLworc3RhdGljIHZvaWQKK3N3YXBfbGludXhfc2xsX2hlYWRlcihjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmhkciwgdV9jaGFyICpidWYpCit7CisJdV9pbnQgY2FwbGVuID0gaGRyLT5jYXBsZW47CisJdV9pbnQgbGVuZ3RoID0gaGRyLT5sZW47CisJc3RydWN0IHNsbF9oZWFkZXIgKnNoZHIgPSAoc3RydWN0IHNsbF9oZWFkZXIgKilidWY7CisJdV9pbnQxNl90IHByb3RvY29sOworCXBjYXBfY2FuX3NvY2tldGNhbl9oZHIgKmNoZHI7CisKKwlpZiAoY2FwbGVuIDwgKHVfaW50KSBzaXplb2Yoc3RydWN0IHNsbF9oZWFkZXIpIHx8CisJICAgIGxlbmd0aCA8ICh1X2ludCkgc2l6ZW9mKHN0cnVjdCBzbGxfaGVhZGVyKSkgeworCQkvKiBOb3QgZW5vdWdoIGRhdGEgdG8gaGF2ZSB0aGUgcHJvdG9jb2wgZmllbGQgKi8KKwkJcmV0dXJuOworCX0KKworCXByb3RvY29sID0gRVhUUkFDVF8xNkJJVFMoJnNoZHItPnNsbF9wcm90b2NvbCk7CisJaWYgKHByb3RvY29sICE9IExJTlVYX1NMTF9QX0NBTiAmJiBwcm90b2NvbCAhPSBMSU5VWF9TTExfUF9DQU5GRCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTb2NrZXRDQU4gcGFja2V0OyBmaXggdXAgdGhlIHBhY2tldCdzIGhlYWRlci4KKwkgKi8KKwljaGRyID0gKHBjYXBfY2FuX3NvY2tldGNhbl9oZHIgKikoYnVmICsgc2l6ZW9mKHN0cnVjdCBzbGxfaGVhZGVyKSk7CisJaWYgKGNhcGxlbiA8ICh1X2ludCkgc2l6ZW9mKHN0cnVjdCBzbGxfaGVhZGVyKSArIHNpemVvZihjaGRyLT5jYW5faWQpIHx8CisJICAgIGxlbmd0aCA8ICh1X2ludCkgc2l6ZW9mKHN0cnVjdCBzbGxfaGVhZGVyKSArIHNpemVvZihjaGRyLT5jYW5faWQpKSB7CisJCS8qIE5vdCBlbm91Z2ggZGF0YSB0byBoYXZlIHRoZSBDQU4gSUQgKi8KKwkJcmV0dXJuOworCX0KKwljaGRyLT5jYW5faWQgPSBTV0FQTE9ORyhjaGRyLT5jYW5faWQpOworfQorCiAvKgogICogVGhlIERMVF9VU0JfTElOVVggYW5kIERMVF9VU0JfTElOVVhfTU1BUFBFRCBoZWFkZXJzIGFyZSBpbiBob3N0CiAgKiBieXRlIG9yZGVyIHdoZW4gY2FwdHVyaW5nIChpdCdzIHN1cHBsaWVkIGRpcmVjdGx5IGZyb20gYQpAQCAtMTMxNiw3ICsxMzg2LDggQEAKIAl1X2ludCBsZW5ndGggPSBoZHItPmxlbjsKIAl1X2ludDE2X3Qgc2l6ZTsKIAotCWlmIChjYXBsZW4gPCAoaW50KSBzaXplb2YobmZsb2dfaGRyX3QpIHx8IGxlbmd0aCA8IChpbnQpIHNpemVvZihuZmxvZ19oZHJfdCkpIHsKKwlpZiAoY2FwbGVuIDwgKHVfaW50KSBzaXplb2YobmZsb2dfaGRyX3QpIHx8CisJICAgIGxlbmd0aCA8ICh1X2ludCkgc2l6ZW9mKG5mbG9nX2hkcl90KSkgewogCQkvKiBOb3QgZW5vdWdoIGRhdGEgdG8gaGF2ZSBhbnkgVExWcy4gKi8KIAkJcmV0dXJuOwogCX0KQEAgLTEzNzEsNiArMTQ0MiwxMCBAQAogCSAqLwogCXN3aXRjaCAobGlua3R5cGUpIHsKIAorCWNhc2UgRExUX0xJTlVYX1NMTDoKKwkJc3dhcF9saW51eF9zbGxfaGVhZGVyKGhkciwgZGF0YSk7CisJCWJyZWFrOworCiAJY2FzZSBETFRfVVNCX0xJTlVYOgogCQlzd2FwX2xpbnV4X3VzYl9oZWFkZXIoaGRyLCBkYXRhLCAwKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9wY2FwLWNvbmZpZyBiL3BjYXAtY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVjOTdiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLWNvbmZpZwpAQCAtMCwwICsxLDg5IEBACisjISAvYmluL3NoCisKKyMKKyMgU2NyaXB0IHRvIGdpdmUgdGhlIGFwcHJvcHJpYXRlIGNvbXBpbGVyIGZsYWdzIGFuZCBsaW5rZXIgZmxhZ3MKKyMgdG8gdXNlIHdoZW4gYnVpbGRpbmcgY29kZSB0aGF0IHVzZXMgbGlicGNhcC4KKyMKK3ByZWZpeD0iL3Vzci9sb2NhbCIKK2V4ZWNfcHJlZml4PSIke3ByZWZpeH0iCitpbmNsdWRlZGlyPSIke3ByZWZpeH0vaW5jbHVkZSIKK2xpYmRpcj0iJHtleGVjX3ByZWZpeH0vbGliIgorVl9SUEFUSF9PUFQ9Ii1XbCwtcnBhdGgsIgorTElCUz0iIgorCitzdGF0aWM9MAorc2hvd19jZmxhZ3M9MAorc2hvd19saWJzPTAKK3doaWxlIFsgIiQjIiAhPSAwIF0KK2RvCisJY2FzZSAiJDEiIGluCisKKwktLXN0YXRpYykKKwkJc3RhdGljPTEKKwkJOzsKKworCS0tY2ZsYWdzKQorCQlzaG93X2NmbGFncz0xCisJCTs7CisKKwktLWxpYnMpCisJCXNob3dfbGlicz0xCisJCTs7CisKKwktLWFkZGl0aW9uYWwtbGlicykKKwkJc2hvd19hZGRpdGlvbmFsX2xpYnM9MQorCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQoraWYgWyAiJFZfUlBBVEhfT1BUIiAhPSAiIiBdCit0aGVuCisJIworCSMgSWYgbGliZGlyIGlzbid0IC91c3IvbGliLCBhZGQgaXQgdG8gdGhlIHJ1bi10aW1lIGxpbmtlciBwYXRoLgorCSMKKwlpZiBbICIkbGliZGlyIiAhPSAiL3Vzci9saWIiIF0KKwl0aGVuCisJCVJQQVRIPSRWX1JQQVRIX09QVCRsaWJkaXIKKwlmaQorZmkKK2lmIFsgIiRzdGF0aWMiID0gMSBdCit0aGVuCisJIworCSMgSW5jbHVkZSBMSUJTIHNvIHRoYXQgdGhlIGZsYWdzIGluY2x1ZGUgbGlicmFyaWVzIGNvbnRhaW5pbmcKKwkjIHJvdXRpbmVzIHRoYXQgbGlicGNhcCB1c2VzLgorCSMKKwlpZiBbICIkc2hvd19jZmxhZ3MiID0gMSAtYSAiJHNob3dfbGlicyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1JJGluY2x1ZGVkaXIgLUwkbGliZGlyIC1scGNhcCAkTElCUyIKKwllbGlmIFsgIiRzaG93X2NmbGFncyIgPSAxIC1hICIkc2hvd19hZGRpdGlvbmFsX2xpYnMiID0gMSBdCisJdGhlbgorCQllY2hvICItSSRpbmNsdWRlZGlyIC1MJGxpYmRpciAkTElCUyIKKwllbGlmIFsgIiRzaG93X2NmbGFncyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1JJGluY2x1ZGVkaXIiCisJZWxpZiBbICIkc2hvd19saWJzIiA9IDEgXQorCXRoZW4KKwkJZWNobyAiLUwkbGliZGlyIC1scGNhcCAkTElCUyIKKwllbGlmIFsgIiRzaG93X2FkZGl0aW9uYWxfbGlicyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIiRMSUJTIgorCWZpCitlbHNlCisJIworCSMgT21pdCBMSUJTIC0gbGlicGNhcCBpcyBhc3N1bWVkIHRvIGJlIGxpbmtlZCB3aXRoIHRob3NlCisJIyBsaWJyYXJpZXMsIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBkbyBzbyBleHBsaWNpdGx5LgorCSMKKwlpZiBbICIkc2hvd19jZmxhZ3MiID0gMSAtYSAiJHNob3dfbGlicyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1JJGluY2x1ZGVkaXIgLUwkbGliZGlyICRSUEFUSCAtbHBjYXAiCisJZWxpZiBbICIkc2hvd19jZmxhZ3MiID0gMSAtYSAiJHNob3dfYWRkaXRpb25hbF9saWJzIiA9IDEgXQorCXRoZW4KKwkJZWNobyAiLUkkaW5jbHVkZWRpciIKKwllbGlmIFsgIiRzaG93X2NmbGFncyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1JJGluY2x1ZGVkaXIiCisJZWxpZiBbICIkc2hvd19saWJzIiA9IDEgXQorCXRoZW4KKwkJZWNobyAiLUwkbGliZGlyICRSUEFUSCAtbHBjYXAiCisJZmkKK2ZpCmRpZmYgLS1naXQgYS9wY2FwLWNvbmZpZy4xIGIvcGNhcC1jb25maWcuMQppbmRleCAyYTIyNzJiLi4wMzg4ZDBmIDEwMDY0NAotLS0gYS9wY2FwLWNvbmZpZy4xCisrKyBiL3BjYXAtY29uZmlnLjEKQEAgLTE4LDcgKzE4LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQLUNPTkZJRyAxICIyMiBNYXkgMjAwOSIKKy5USCBQQ0FQLUNPTkZJRyAxICIxNSBGZWJydWFyeSAyMDE1IgogLlNIIE5BTUUKIHBjYXAtY29uZmlnIFwtIHdyaXRlIGxpYnBjYXAgY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncyB0byBzdGFuZGFyZCBvdXRwdXQKIC5TSCBTWU5PUFNJUwpkaWZmIC0tZ2l0IGEvcGNhcC1kYWcuYyBiL3BjYXAtZGFnLmMKaW5kZXggNDkxNTI0OC4uMjAxNjk2YyAxMDA2NDQKLS0tIGEvcGNhcC1kYWcuYworKysgYi9wY2FwLWRhZy5jCkBAIC01Myw2ICs1Myw5OSBAQAogI2RlZmluZSBEQUdfTUFYX0JPQVJEUyAzMgogI2VuZGlmCiAKKworI2lmbmRlZiBUWVBFX0FBTDUKKyNkZWZpbmUgVFlQRV9BQUw1ICAgICAgICAgICAgICAgNAorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9NQ19IRExDCisjZGVmaW5lIFRZUEVfTUNfSERMQyAgICAgICAgICAgIDUKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfTUNfUkFXCisjZGVmaW5lIFRZUEVfTUNfUkFXICAgICAgICAgICAgIDYKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfTUNfQVRNCisjZGVmaW5lIFRZUEVfTUNfQVRNICAgICAgICAgICAgIDcKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfTUNfUkFXX0NIQU5ORUwKKyNkZWZpbmUgVFlQRV9NQ19SQVdfQ0hBTk5FTCAgICAgOAorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9NQ19BQUw1CisjZGVmaW5lIFRZUEVfTUNfQUFMNSAgICAgICAgICAgIDkKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfSERMQ19QT1MKKyNkZWZpbmUgVFlQRV9DT0xPUl9IRExDX1BPUyAgICAgMTAKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfRVRICisjZGVmaW5lIFRZUEVfQ09MT1JfRVRIICAgICAgICAgIDExCisjZW5kaWYKKworI2lmbmRlZiBUWVBFX01DX0FBTDIKKyNkZWZpbmUgVFlQRV9NQ19BQUwyICAgICAgICAgICAgMTIKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfSVBfQ09VTlRFUgorI2RlZmluZSBUWVBFX0lQX0NPVU5URVIgICAgICAgICAxMworI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9UQ1BfRkxPV19DT1VOVEVSCisjZGVmaW5lIFRZUEVfVENQX0ZMT1dfQ09VTlRFUiAgIDE0CisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUworI2RlZmluZSBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUyAxNQorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9EU01fQ09MT1JfRVRICisjZGVmaW5lIFRZUEVfRFNNX0NPTE9SX0VUSCAgICAgIDE2CisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0NPTE9SX01DX0hETENfUE9TCisjZGVmaW5lIFRZUEVfQ09MT1JfTUNfSERMQ19QT1MgIDE3CisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0FBTDIKKyNkZWZpbmUgVFlQRV9BQUwyICAgICAgICAgICAgICAgMTgKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfSEFTSF9QT1MKKyNkZWZpbmUgVFlQRV9DT0xPUl9IQVNIX1BPUyAgICAgMTkKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfSEFTSF9FVEgKKyNkZWZpbmUgVFlQRV9DT0xPUl9IQVNIX0VUSCAgICAgMjAKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfSU5GSU5JQkFORAorI2RlZmluZSBUWVBFX0lORklOSUJBTkQgICAgICAgICAyMQorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9JUFY0CisjZGVmaW5lIFRZUEVfSVBWNCAgICAgICAgICAgICAgIDIyCisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0lQVjYKKyNkZWZpbmUgVFlQRV9JUFY2ICAgICAgICAgICAgICAgMjMKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfUkFXX0xJTksKKyNkZWZpbmUgVFlQRV9SQVdfTElOSyAgICAgICAgICAgMjQKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfSU5GSU5JQkFORF9MSU5LCisjZGVmaW5lIFRZUEVfSU5GSU5JQkFORF9MSU5LICAgIDI1CisjZW5kaWYKKworI2lmbmRlZiBUWVBFX1BBRAorI2RlZmluZSBUWVBFX1BBRCAgICAgICAgICAgICAgICA0OAorI2VuZGlmCisKICNkZWZpbmUgQVRNX0NFTExfU0laRQkJNTIKICNkZWZpbmUgQVRNX0hEUl9TSVpFCQk0CiAKQEAgLTE0NCwyOCArMjM3LDI1IEBACiBzdGF0aWMgdm9pZAogZGFnX3BsYXRmb3JtX2NsZWFudXAocGNhcF90ICpwKQogewotCXN0cnVjdCBwY2FwX2RhZyAqcGQ7CisJc3RydWN0IHBjYXBfZGFnICpwZCA9IHAtPnByOwogCi0JaWYgKHAgIT0gTlVMTCkgewotCQlwZCA9IHAtPnByaXY7CiAjaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKLQkJaWYoZGFnX3N0b3Bfc3RyZWFtKHAtPmZkLCBwZC0+ZGFnX3N0cmVhbSkgPCAwKQotCQkJZnByaW50ZihzdGRlcnIsImRhZ19zdG9wX3N0cmVhbTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYoZGFnX3N0b3Bfc3RyZWFtKHAtPmZkLCBwZC0+ZGFnX3N0cmVhbSkgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwiZGFnX3N0b3Bfc3RyZWFtOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKIAotCQlpZihkYWdfZGV0YWNoX3N0cmVhbShwLT5mZCwgcGQtPmRhZ19zdHJlYW0pIDwgMCkKLQkJCWZwcmludGYoc3RkZXJyLCJkYWdfZGV0YWNoX3N0cmVhbTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYoZGFnX2RldGFjaF9zdHJlYW0ocC0+ZmQsIHBkLT5kYWdfc3RyZWFtKSA8IDApCisJCWZwcmludGYoc3RkZXJyLCJkYWdfZGV0YWNoX3N0cmVhbTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAjZWxzZQotCQlpZihkYWdfc3RvcChwLT5mZCkgPCAwKQotCQkJZnByaW50ZihzdGRlcnIsImRhZ19zdG9wOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZihkYWdfc3RvcChwLT5mZCkgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwiZGFnX3N0b3A6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwogI2VuZGlmIC8qIEhBVkVfREFHX1NUUkVBTVNfQVBJICovCi0JCWlmKHAtPmZkICE9IC0xKSB7Ci0JCQlpZihkYWdfY2xvc2UocC0+ZmQpIDwgMCkKLQkJCQlmcHJpbnRmKHN0ZGVyciwiZGFnX2Nsb3NlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCXAtPmZkID0gLTE7Ci0JCX0KLQkJZGVsZXRlX3BjYXBfZGFnKHApOwotCQlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24ocCk7CisJaWYocC0+ZmQgIT0gLTEpIHsKKwkJaWYoZGFnX2Nsb3NlKHAtPmZkKSA8IDApCisJCQlmcHJpbnRmKHN0ZGVyciwiZGFnX2Nsb3NlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcC0+ZmQgPSAtMTsKIAl9CisJZGVsZXRlX3BjYXBfZGFnKHApOworCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwKTsKIAkvKiBOb3RlOiBkb24ndCBuZWVkIHRvIGNhbGwgY2xvc2UocC0+ZmQpIGhlcmUgYXMgZGFnX2Nsb3NlKHAtPmZkKSBkb2VzIHRoaXMuICovCiB9CiAKQEAgLTE3NCw3ICsyNjQsOCBAQAogewogCXdoaWxlIChwY2FwX2RhZ3MgIT0gTlVMTCkgewogCQlpZiAocGNhcF9kYWdzLT5waWQgPT0gZ2V0cGlkKCkpIHsKLQkJCWRhZ19wbGF0Zm9ybV9jbGVhbnVwKHBjYXBfZGFncy0+cCk7CisJCQlpZiAocGNhcF9kYWdzLT5wICE9IE5VTEwpCisJCQkJZGFnX3BsYXRmb3JtX2NsZWFudXAocGNhcF9kYWdzLT5wKTsKIAkJfSBlbHNlIHsKIAkJCWRlbGV0ZV9wY2FwX2RhZyhwY2FwX2RhZ3MtPnApOwogCQl9CkBAIC02MzQsNyArNzI1LDcgQEAKIAlpbnQgbjsKIAlkYWdpbmZfdCogZGFnaW5mOwogCWNoYXIgKiBuZXdEZXYgPSBOVUxMOwotCWNoYXIgKiBkZXZpY2UgPSBoYW5kbGUtPm9wdC5zb3VyY2U7CisJY2hhciAqIGRldmljZSA9IGhhbmRsZS0+b3B0LmRldmljZTsKICNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQogCXVpbnQzMl90IG1pbmRhdGE7CiAJc3RydWN0IHRpbWV2YWwgbWF4d2FpdDsKQEAgLTY0Miw3ICs3MzMsNyBAQAogI2VuZGlmCiAKIAlpZiAoZGV2aWNlID09IE5VTEwpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkZXZpY2UgaXMgTlVMTDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkZXZpY2UgaXMgTlVMTDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY1MSwyNiArNzQyLDI2IEBACiAjaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKIAluZXdEZXYgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oZGV2aWNlKSArIDE2KTsKIAlpZiAobmV3RGV2ID09IE5VTEwpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBhbGxvY2F0ZSBzdHJpbmcgZm9yIGRldmljZSBuYW1lOiAlc1xuIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgc3RyaW5nIGZvciBkZXZpY2UgbmFtZTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAkvKiBQYXJzZSBpbnB1dCBuYW1lIHRvIGdldCBkYWcgZGV2aWNlIGFuZCBzdHJlYW0gbnVtYmVyIGlmIHByb3ZpZGVkICovCiAJaWYgKGRhZ19wYXJzZV9uYW1lKGRldmljZSwgbmV3RGV2LCBzdHJsZW4oZGV2aWNlKSArIDE2LCAmaGFuZGxlcC0+ZGFnX3N0cmVhbSkgPCAwKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX3BhcnNlX25hbWU6ICVzXG4iLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfcGFyc2VfbmFtZTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAJZGV2aWNlID0gbmV3RGV2OwogCiAJaWYgKGhhbmRsZXAtPmRhZ19zdHJlYW0lMikgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19wYXJzZV9uYW1lOiB0eCAoZXZlbiBudW1iZXJlZCkgc3RyZWFtcyBub3Qgc3VwcG9ydGVkIGZvciBjYXB0dXJlXG4iKTsKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19wYXJzZV9uYW1lOiB0eCAoZXZlbiBudW1iZXJlZCkgc3RyZWFtcyBub3Qgc3VwcG9ydGVkIGZvciBjYXB0dXJlIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAjZWxzZQogCWlmIChzdHJuY21wKGRldmljZSwgIi9kZXYvIiwgNSkgIT0gMCkgewogCQluZXdEZXYgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oZGV2aWNlKSArIDUpOwogCQlpZiAobmV3RGV2ID09IE5VTEwpIHsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgc3RyaW5nIGZvciBkZXZpY2UgbmFtZTogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBhbGxvY2F0ZSBzdHJpbmcgZm9yIGRldmljZSBuYW1lOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCQlzdHJjcHkobmV3RGV2LCAiL2Rldi8iKTsKQEAgLTY4MSwxNCArNzcyLDE0IEBACiAKIAkvKiBzZXR1cCBkZXZpY2UgcGFyYW1ldGVycyAqLwogCWlmKChoYW5kbGUtPmZkID0gZGFnX29wZW4oKGNoYXIgKilkZXZpY2UpKSA8IDApIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfb3BlbiAlczogJXMiLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19vcGVuICVzOiAlcyIsIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGZhaWw7CiAJfQogCiAjaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKIAkvKiBPcGVuIHJlcXVlc3RlZCBzdHJlYW0uIENhbiBmYWlsIGlmIGFscmVhZHkgbG9ja2VkIG9yIG9uIGVycm9yICovCiAJaWYgKGRhZ19hdHRhY2hfc3RyZWFtKGhhbmRsZS0+ZmQsIGhhbmRsZXAtPmRhZ19zdHJlYW0sIDAsIDApIDwgMCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19hdHRhY2hfc3RyZWFtOiAlc1xuIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX2F0dGFjaF9zdHJlYW06ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGZhaWxjbG9zZTsKIAl9CiAKQEAgLTY5Nyw3ICs3ODgsNyBAQAogCSAqLwogCWlmIChkYWdfZ2V0X3N0cmVhbV9wb2xsKGhhbmRsZS0+ZmQsIGhhbmRsZXAtPmRhZ19zdHJlYW0sCiAJCQkJJm1pbmRhdGEsICZtYXh3YWl0LCAmcG9sbCkgPCAwKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX2dldF9zdHJlYW1fcG9sbDogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19nZXRfc3RyZWFtX3BvbGw6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGZhaWxkZXRhY2g7CiAJfQogCkBAIC03MjIsMTMgKzgxMywxMyBAQAogCiAJaWYgKGRhZ19zZXRfc3RyZWFtX3BvbGwoaGFuZGxlLT5mZCwgaGFuZGxlcC0+ZGFnX3N0cmVhbSwKIAkJCQltaW5kYXRhLCAmbWF4d2FpdCwgJnBvbGwpIDwgMCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19zZXRfc3RyZWFtX3BvbGw6ICVzXG4iLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfc2V0X3N0cmVhbV9wb2xsOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBmYWlsZGV0YWNoOwogCX0KIAogI2Vsc2UKIAlpZigoaGFuZGxlcC0+ZGFnX21lbV9iYXNlID0gZGFnX21tYXAoaGFuZGxlLT5mZCkpID09IE1BUF9GQUlMRUQpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsImRhZ19tbWFwICVzOiAlc1xuIiwgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsImRhZ19tbWFwICVzOiAlcyIsIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGZhaWxjbG9zZTsKIAl9CiAKQEAgLTc0OCwyMiArODM5LDIyIEBACiAJCWhhbmRsZS0+c25hcHNob3QgPSBNSU5fREFHX1NOQVBMRU47CiAJfQogCS8qIHNuYXAgbGVuIGhhcyB0byBiZSBhIG11bHRpcGxlIG9mIDQgKi8KLQlzbnByaW50Zihjb25mLCAzMCwgInZhcmxlbiBzbGVuPSVkIiwgKHNuYXBsZW4gKyAzKSAmIH4zKTsKKwlwY2FwX3NucHJpbnRmKGNvbmYsIDMwLCAidmFybGVuIHNsZW49JWQiLCAoc25hcGxlbiArIDMpICYgfjMpOwogCiAJaWYoZGFnX2NvbmZpZ3VyZShoYW5kbGUtPmZkLCBjb25mKSA8IDApIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsImRhZ19jb25maWd1cmUgJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwiZGFnX2NvbmZpZ3VyZSAlczogJXMiLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBmYWlsZGV0YWNoOwogCX0KICNlbmRpZgogCiAjaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKIAlpZihkYWdfc3RhcnRfc3RyZWFtKGhhbmRsZS0+ZmQsIGhhbmRsZXAtPmRhZ19zdHJlYW0pIDwgMCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19zdGFydF9zdHJlYW0gJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19zdGFydF9zdHJlYW0gJXM6ICVzIiwgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gZmFpbGRldGFjaDsKIAl9CiAjZWxzZQogCWlmKGRhZ19zdGFydChoYW5kbGUtPmZkKSA8IDApIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfc3RhcnQgJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19zdGFydCAlczogJXMiLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBmYWlsY2xvc2U7CiAJfQogI2VuZGlmIC8qIEhBVkVfREFHX1NUUkVBTVNfQVBJICovCkBAIC03OTgsOCArODg5LDggQEAKIAkJCWlmICgobiA9IGF0b2kocykpID09IDAgfHwgbiA9PSAxNiB8fCBuID09IDMyKSB7CiAJCQkJaGFuZGxlcC0+ZGFnX2Zjc19iaXRzID0gbjsKIAkJCX0gZWxzZSB7Ci0JCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkJCSJwY2FwX2FjdGl2YXRlICVzOiBiYWQgRVJGX0ZDU19CSVRTIHZhbHVlICglZCkgaW4gZW52aXJvbm1lbnRcbiIsIGRldmljZSwgbik7CisJCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJInBjYXBfYWN0aXZhdGUgJXM6IGJhZCBFUkZfRkNTX0JJVFMgdmFsdWUgKCVkKSBpbiBlbnZpcm9ubWVudCIsIGRldmljZSwgbik7CiAJCQkJZ290byBmYWlsc3RvcDsKIAkJCX0KIAkJfQpAQCAtODI2LDcgKzkxNyw3IEBACiAJaGFuZGxlLT5idWZzaXplID0gMDsKIAogCWlmIChuZXdfcGNhcF9kYWcoaGFuZGxlKSA8IDApIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJuZXdfcGNhcF9kYWcgJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm5ld19wY2FwX2RhZyAlczogJXMiLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBmYWlsc3RvcDsKIAl9CiAKQEAgLTkzMiw3ICsxMDIzLDcgQEAKIAkvKiBPSywgaXQncyBwcm9iYWJseSBvdXJzLiAqLwogCSppc19vdXJzID0gMTsKIAotCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX2RhZykpOworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9kYWcpKTsKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtOTQ4LDExICsxMDM5LDkgQEAKIAlwLT50c3RhbXBfcHJlY2lzaW9uX2NvdW50ID0gMjsKIAlwLT50c3RhbXBfcHJlY2lzaW9uX2xpc3QgPSBtYWxsb2MoMiAqIHNpemVvZih1X2ludCkpOwogCWlmIChwLT50c3RhbXBfcHJlY2lzaW9uX2xpc3QgPT0gTlVMTCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQlpZiAocC0+dHN0YW1wX3R5cGVfbGlzdCAhPSBOVUxMKQotCQkJZnJlZShwLT50c3RhbXBfdHlwZV9saXN0KTsKLQkJZnJlZShwKTsKKwkJcGNhcF9jbG9zZShwKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXAtPnRzdGFtcF9wcmVjaXNpb25fbGlzdFswXSA9IFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9NSUNSTzsKQEAgLTk5OCw3ICsxMDg3LDcgQEAKIAogCS8qIFRyeSBhbGwgdGhlIERBR3MgMC1EQUdfTUFYX0JPQVJEUyAqLwogCWZvciAoYyA9IDA7IGMgPCBEQUdfTUFYX0JPQVJEUzsgYysrKSB7Ci0JCXNucHJpbnRmKG5hbWUsIDEyLCAiZGFnJWQiLCBjKTsKKwkJcGNhcF9zbnByaW50ZihuYW1lLCAxMiwgImRhZyVkIiwgYyk7CiAJCWlmICgtMSA9PSBkYWdfcGFyc2VfbmFtZShuYW1lLCBkYWduYW1lLCBEQUdOQU1FX0JVRlNJWkUsICZkYWdzdHJlYW0pKQogCQl7CiAJCQlyZXR1cm4gLTE7CkBAIC0xMDIxLDcgKzExMTAsNyBAQAogCQkJCQlpZiAoMCA9PSBkYWdfYXR0YWNoX3N0cmVhbShkYWdmZCwgc3RyZWFtLCAwLCAwKSkgewogCQkJCQkJZGFnX2RldGFjaF9zdHJlYW0oZGFnZmQsIHN0cmVhbSk7CiAKLQkJCQkJCXNucHJpbnRmKG5hbWUsICAxMCwgImRhZyVkOiVkIiwgYywgc3RyZWFtKTsKKwkJCQkJCXBjYXBfc25wcmludGYobmFtZSwgIDEwLCAiZGFnJWQ6JWQiLCBjLCBzdHJlYW0pOwogCQkJCQkJaWYgKHBjYXBfYWRkX2lmKGRldmxpc3RwLCBuYW1lLCAwLCBkZXNjcmlwdGlvbiwgZXJyYnVmKSA9PSAtMSkgewogCQkJCQkJCS8qCiAJCQkJCQkJICogRmFpbHVyZS4KQEAgLTEwOTcsNyArMTE4Niw3IEBACiAKIAkJaWYgKGRhZ19nZXRfc3RyZWFtX3BvbGwocC0+ZmQsIHBkLT5kYWdfc3RyZWFtLAogCQkJCQkmbWluZGF0YSwgJm1heHdhaXQsICZwb2xsKSA8IDApIHsKLQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19nZXRfc3RyZWFtX3BvbGw6ICVzXG4iLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19nZXRfc3RyZWFtX3BvbGw6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAKQEAgLTExMTIsNyArMTIwMSw3IEBACiAKIAkJaWYgKGRhZ19zZXRfc3RyZWFtX3BvbGwocC0+ZmQsIHBkLT5kYWdfc3RyZWFtLAogCQkJCQltaW5kYXRhLCAmbWF4d2FpdCwgJnBvbGwpIDwgMCkgewotCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX3NldF9zdHJlYW1fcG9sbDogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX3NldF9zdHJlYW1fcG9sbDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC0xMTM1LDcgKzEyMjQsNyBAQAogCW1lbXNldCh0eXBlcywgMCwgMjU1KTsKIAogCWlmIChwLT5kbHRfbGlzdCA9PSBOVUxMICYmIChwLT5kbHRfbGlzdCA9IG1hbGxvYygyNTUqc2l6ZW9mKCoocC0+ZGx0X2xpc3QpKSkpID09IE5VTEwpIHsKLQkJKHZvaWQpc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCSh2b2lkKXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KIApAQCAtMTE0NCw3ICsxMjMzLDcgQEAKICNpZmRlZiBIQVZFX0RBR19HRVRfU1RSRUFNX0VSRl9UWVBFUwogCS8qIEdldCBsaXN0IG9mIHBvc3NpYmxlIEVSRiB0eXBlcyBmb3IgdGhpcyBjYXJkICovCiAJaWYgKGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcyhwLT5mZCwgcGQtPmRhZ19zdHJlYW0sIHR5cGVzLCAyNTUpIDwgMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLCAiZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLCAiZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCkBAIC0xMTUzLDcgKzEyNDIsNyBAQAogI2VsaWYgZGVmaW5lZCBIQVZFX0RBR19HRVRfRVJGX1RZUEVTCiAJLyogR2V0IGxpc3Qgb2YgcG9zc2libGUgRVJGIHR5cGVzIGZvciB0aGlzIGNhcmQgKi8KIAlpZiAoZGFnX2dldF9lcmZfdHlwZXMocC0+ZmQsIHR5cGVzLCAyNTUpIDwgMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLCAiZGFnX2dldF9lcmZfdHlwZXM6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksICJkYWdfZ2V0X2VyZl90eXBlczogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KIApAQCAtMTI2MCwzICsxMzQ5LDMxIEBACiAKIAlyZXR1cm4gcC0+bGlua3R5cGU7CiB9CisKKyNpZmRlZiBEQUdfT05MWQorLyoKKyAqIFRoaXMgbGlicGNhcCBidWlsZCBzdXBwb3J0cyBvbmx5IERBRyBjYXJkcywgbm90IHJlZ3VsYXIgbmV0d29yaworICogaW50ZXJmYWNlcy4KKyAqLworCisvKgorICogVGhlcmUgYXJlIG5vIHJlZ3VsYXIgaW50ZXJmYWNlcywganVzdCBEQUcgaW50ZXJmYWNlcy4KKyAqLworaW50CitwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisJKmFsbGRldnNwID0gTlVMTDsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogQXR0ZW1wdHMgdG8gb3BlbiBhIHJlZ3VsYXIgaW50ZXJmYWNlIGZhaWwuCisgKi8KK3BjYXBfdCAqCitwY2FwX2NyZWF0ZV9pbnRlcmZhY2UoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplcnJidWYpCit7CisJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJUaGlzIHZlcnNpb24gb2YgbGlicGNhcCBvbmx5IHN1cHBvcnRzIERBRyBjYXJkcyIpOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9wY2FwLWRhZy5oIGIvcGNhcC1kYWcuaAppbmRleCA2ODUyMGRjLi5kZmVjY2Q4IDEwMDY0NAotLS0gYS9wY2FwLWRhZy5oCisrKyBiL3BjYXAtZGFnLmgKQEAgLTEwLDk3ICsxMCwzIEBACiAKIHBjYXBfdCAqZGFnX2NyZWF0ZShjb25zdCBjaGFyICosIGNoYXIgKiwgaW50ICopOwogaW50IGRhZ19maW5kYWxsZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKTsKLQotI2lmbmRlZiBUWVBFX0FBTDUKLSNkZWZpbmUgVFlQRV9BQUw1ICAgICAgICAgICAgICAgNAotI2VuZGlmCi0KLSNpZm5kZWYgVFlQRV9NQ19IRExDCi0jZGVmaW5lIFRZUEVfTUNfSERMQyAgICAgICAgICAgIDUKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfTUNfUkFXCi0jZGVmaW5lIFRZUEVfTUNfUkFXICAgICAgICAgICAgIDYKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfTUNfQVRNCi0jZGVmaW5lIFRZUEVfTUNfQVRNICAgICAgICAgICAgIDcKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfTUNfUkFXX0NIQU5ORUwKLSNkZWZpbmUgVFlQRV9NQ19SQVdfQ0hBTk5FTCAgICAgOAotI2VuZGlmCi0KLSNpZm5kZWYgVFlQRV9NQ19BQUw1Ci0jZGVmaW5lIFRZUEVfTUNfQUFMNSAgICAgICAgICAgIDkKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfQ09MT1JfSERMQ19QT1MKLSNkZWZpbmUgVFlQRV9DT0xPUl9IRExDX1BPUyAgICAgMTAKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfQ09MT1JfRVRICi0jZGVmaW5lIFRZUEVfQ09MT1JfRVRIICAgICAgICAgIDExCi0jZW5kaWYKLQotI2lmbmRlZiBUWVBFX01DX0FBTDIKLSNkZWZpbmUgVFlQRV9NQ19BQUwyICAgICAgICAgICAgMTIKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfSVBfQ09VTlRFUgotI2RlZmluZSBUWVBFX0lQX0NPVU5URVIgICAgICAgICAxMwotI2VuZGlmCi0KLSNpZm5kZWYgVFlQRV9UQ1BfRkxPV19DT1VOVEVSCi0jZGVmaW5lIFRZUEVfVENQX0ZMT1dfQ09VTlRFUiAgIDE0Ci0jZW5kaWYKLQotI2lmbmRlZiBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUwotI2RlZmluZSBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUyAxNQotI2VuZGlmCi0KLSNpZm5kZWYgVFlQRV9EU01fQ09MT1JfRVRICi0jZGVmaW5lIFRZUEVfRFNNX0NPTE9SX0VUSCAgICAgIDE2Ci0jZW5kaWYKLQotI2lmbmRlZiBUWVBFX0NPTE9SX01DX0hETENfUE9TCi0jZGVmaW5lIFRZUEVfQ09MT1JfTUNfSERMQ19QT1MgIDE3Ci0jZW5kaWYKLQotI2lmbmRlZiBUWVBFX0FBTDIKLSNkZWZpbmUgVFlQRV9BQUwyICAgICAgICAgICAgICAgMTgKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfQ09MT1JfSEFTSF9QT1MKLSNkZWZpbmUgVFlQRV9DT0xPUl9IQVNIX1BPUyAgICAgMTkKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfQ09MT1JfSEFTSF9FVEgKLSNkZWZpbmUgVFlQRV9DT0xPUl9IQVNIX0VUSCAgICAgMjAKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfSU5GSU5JQkFORAotI2RlZmluZSBUWVBFX0lORklOSUJBTkQgICAgICAgICAyMQotI2VuZGlmCi0KLSNpZm5kZWYgVFlQRV9JUFY0Ci0jZGVmaW5lIFRZUEVfSVBWNCAgICAgICAgICAgICAgIDIyCi0jZW5kaWYKLQotI2lmbmRlZiBUWVBFX0lQVjYKLSNkZWZpbmUgVFlQRV9JUFY2ICAgICAgICAgICAgICAgMjMKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfUkFXX0xJTksKLSNkZWZpbmUgVFlQRV9SQVdfTElOSyAgICAgICAgICAgMjQKLSNlbmRpZgotCi0jaWZuZGVmIFRZUEVfSU5GSU5JQkFORF9MSU5LCi0jZGVmaW5lIFRZUEVfSU5GSU5JQkFORF9MSU5LICAgIDI1Ci0jZW5kaWYKLQotCi0KLSNpZm5kZWYgVFlQRV9QQUQKLSNkZWZpbmUgVFlQRV9QQUQgICAgICAgICAgICAgICAgNDgKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvcGNhcC1kYnVzLmMgYi9wY2FwLWRidXMuYwppbmRleCBhYjNmMTI1Li44ZTkyMDkzIDEwMDY0NAotLS0gYS9wY2FwLWRidXMuYworKysgYi9wY2FwLWRidXMuYwpAQCAtNjYsOSArNjYsOSBAQAogCW1lc3NhZ2UgPSBkYnVzX2Nvbm5lY3Rpb25fcG9wX21lc3NhZ2UoaGFuZGxlcC0+Y29ubik7CiAKIAl3aGlsZSAoIW1lc3NhZ2UpIHsKLQkJLy8gWFhYIGhhbmRsZS0+b3B0LnRpbWVvdXQgPSB0aW1lb3V0X21zOworCQkvKiBYWFggaGFuZGxlLT5vcHQudGltZW91dCA9IHRpbWVvdXRfbXM7ICovCiAJCWlmICghZGJ1c19jb25uZWN0aW9uX3JlYWRfd3JpdGUoaGFuZGxlcC0+Y29ubiwgMTAwKSkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDb25uZWN0aW9uIGNsb3NlZCIpOworCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNvbm5lY3Rpb24gY2xvc2VkIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIApAQCAtODEsNyArODEsNyBAQAogCX0KIAogCWlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG1lc3NhZ2UsIERCVVNfSU5URVJGQUNFX0xPQ0FMLCAiRGlzY29ubmVjdGVkIikpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJEaXNjb25uZWN0ZWQiKTsKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkRpc2Nvbm5lY3RlZCIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xMTIsNyArMTEyLDcgQEAKIAlEQnVzTWVzc2FnZSAqbXNnOwogCiAJaWYgKCEobXNnID0gZGJ1c19tZXNzYWdlX2RlbWFyc2hhbChidWYsIHNpemUsICZlcnJvcikpKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGJ1c19tZXNzYWdlX2RlbWFyc2hhbCgpIGZhaWxlZDogJXMiLCBlcnJvci5tZXNzYWdlKTsKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRidXNfbWVzc2FnZV9kZW1hcnNoYWwoKSBmYWlsZWQ6ICVzIiwgZXJyb3IubWVzc2FnZSk7CiAJCWRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTYwLDIxICsxNjAsMjEgQEAKIAkjZGVmaW5lIE5fUlVMRVMgc2l6ZW9mKHJ1bGVzKS9zaXplb2YocnVsZXNbMF0pCiAKIAlzdHJ1Y3QgcGNhcF9kYnVzICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OwotCWNvbnN0IGNoYXIgKmRldiA9IGhhbmRsZS0+b3B0LnNvdXJjZTsKKwljb25zdCBjaGFyICpkZXYgPSBoYW5kbGUtPm9wdC5kZXZpY2U7CiAKIAlEQnVzRXJyb3IgZXJyb3IgPSBEQlVTX0VSUk9SX0lOSVQ7Ci0JaW50IGk7CisJdV9pbnQgaTsKIAogCWlmIChzdHJjbXAoZGV2LCAiZGJ1cy1zeXN0ZW0iKSA9PSAwKSB7CiAJCWlmICghKGhhbmRsZXAtPmNvbm4gPSBkYnVzX2J1c19nZXQoREJVU19CVVNfU1lTVEVNLCAmZXJyb3IpKSkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGYWlsZWQgdG8gZ2V0IHN5c3RlbSBidXM6ICVzIiwgZXJyb3IubWVzc2FnZSk7CisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRmFpbGVkIHRvIGdldCBzeXN0ZW0gYnVzOiAlcyIsIGVycm9yLm1lc3NhZ2UpOwogCQkJZGJ1c19lcnJvcl9mcmVlKCZlcnJvcik7CiAJCQlyZXR1cm4gUENBUF9FUlJPUjsKIAkJfQogCiAJfSBlbHNlIGlmIChzdHJjbXAoZGV2LCAiZGJ1cy1zZXNzaW9uIikgPT0gMCkgewogCQlpZiAoIShoYW5kbGVwLT5jb25uID0gZGJ1c19idXNfZ2V0KERCVVNfQlVTX1NFU1NJT04sICZlcnJvcikpKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkZhaWxlZCB0byBnZXQgc2Vzc2lvbiBidXM6ICVzIiwgZXJyb3IubWVzc2FnZSk7CisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRmFpbGVkIHRvIGdldCBzZXNzaW9uIGJ1czogJXMiLCBlcnJvci5tZXNzYWdlKTsKIAkJCWRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOwogCQkJcmV0dXJuIFBDQVBfRVJST1I7CiAJCX0KQEAgLTE4MywxOSArMTgzLDE5IEBACiAJCWNvbnN0IGNoYXIgKmFkZHIgPSBkZXYgKyA3OwogCiAJCWlmICghKGhhbmRsZXAtPmNvbm4gPSBkYnVzX2Nvbm5lY3Rpb25fb3BlbihhZGRyLCAmZXJyb3IpKSkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvOiAlczogJXMiLCBhZGRyLCBlcnJvci5tZXNzYWdlKTsKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uIHRvOiAlczogJXMiLCBhZGRyLCBlcnJvci5tZXNzYWdlKTsKIAkJCWRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOwogCQkJcmV0dXJuIFBDQVBfRVJST1I7CiAJCX0KIAogCQlpZiAoIWRidXNfYnVzX3JlZ2lzdGVyKGhhbmRsZXAtPmNvbm4sICZlcnJvcikpIHsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGJ1cyAlczogJXNcbiIsIGFkZHIsIGVycm9yLm1lc3NhZ2UpOworCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkZhaWxlZCB0byByZWdpc3RlciBidXMgJXM6ICVzXG4iLCBhZGRyLCBlcnJvci5tZXNzYWdlKTsKIAkJCWRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOwogCQkJcmV0dXJuIFBDQVBfRVJST1I7CiAJCX0KIAogCX0gZWxzZSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgZ2V0IGJ1cyBhZGRyZXNzIGZyb20gJXMiLCBoYW5kbGUtPm9wdC5zb3VyY2UpOworCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgZ2V0IGJ1cyBhZGRyZXNzIGZyb20gJXMiLCBoYW5kbGUtPm9wdC5kZXZpY2UpOwogCQlyZXR1cm4gUENBUF9FUlJPUjsKIAl9CiAKQEAgLTIzNCw3ICsyMzQsNyBAQAogCQkJLyogdHJ5IHdpdGhvdXQgZWF2ZXNkcm9wICovCiAJCQlkYnVzX2J1c19hZGRfbWF0Y2goaGFuZGxlcC0+Y29ubiwgcnVsZXNbaV0gKyBzdHJsZW4oRUFWRVNEUk9QUElOR19SVUxFKSwgJmVycm9yKTsKIAkJCWlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyb3IpKSB7Ci0JCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGYWlsZWQgdG8gYWRkIGJ1cyBtYXRjaDogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOworCQkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGYWlsZWQgdG8gYWRkIGJ1cyBtYXRjaDogJXNcbiIsIGVycm9yLm1lc3NhZ2UpOwogCQkJCWRidXNfZXJyb3JfZnJlZSgmZXJyb3IpOwogCQkJCWRidXNfY2xlYW51cChoYW5kbGUpOwogCQkJCXJldHVybiBQQ0FQX0VSUk9SOwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJfQogCiAJKmlzX291cnMgPSAxOwotCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX2RidXMpKTsKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfZGJ1cykpOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiAoTlVMTCk7CiAKZGlmZiAtLWdpdCBhL3BjYXAtZGxwaS5jIGIvcGNhcC1kbHBpLmMKaW5kZXggYzAwNzEzNS4uYTQzMWU3YyAxMDA2NDQKLS0tIGEvcGNhcC1kbHBpLmMKKysrIGIvcGNhcC1kbHBpLmMKQEAgLTE1MywxMCArMTUzLDEyIEBACiBzdGF0aWMgaW50IGRscmF3ZGF0YXJlcShpbnQsIGNvbnN0IHVfY2hhciAqLCBpbnQpOwogI2VuZGlmCiBzdGF0aWMgaW50IHJlY3ZfYWNrKGludCwgaW50LCBjb25zdCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKik7Ci1zdGF0aWMgY2hhciAqZGxzdHJlcnJvcihicGZfdV9pbnQzMik7Ci1zdGF0aWMgY2hhciAqZGxwcmltKGJwZl91X2ludDMyKTsKK3N0YXRpYyBjaGFyICpkbHN0cmVycm9yKGNoYXIgKiwgc2l6ZV90LCBicGZfdV9pbnQzMik7CitzdGF0aWMgY2hhciAqZGxwcmltKGNoYXIgKiwgc2l6ZV90LCBicGZfdV9pbnQzMik7CiAjaWYgZGVmaW5lZChIQVZFX1NPTEFSSVMpICYmIGRlZmluZWQoSEFWRV9TWVNfQlVGTU9EX0gpCi1zdGF0aWMgY2hhciAqZ2V0X3JlbGVhc2UoYnBmX3VfaW50MzIgKiwgYnBmX3VfaW50MzIgKiwgYnBmX3VfaW50MzIgKik7CisjZGVmaW5lIEdFVF9SRUxFQVNFX0JVRlNJWkUJMzIKK3N0YXRpYyB2b2lkIGdldF9yZWxlYXNlKGNoYXIgKiwgc2l6ZV90LCBicGZfdV9pbnQzMiAqLCBicGZfdV9pbnQzMiAqLAorICAgIGJwZl91X2ludDMyICopOwogI2VuZGlmCiBzdGF0aWMgaW50IHNlbmRfcmVxdWVzdChpbnQsIGNoYXIgKiwgaW50LCBjaGFyICosIGNoYXIgKik7CiAjaWZkZWYgSEFWRV9IUFVYOQpAQCAtMTY2LDE0ICsxNjgsNiBAQAogc3RhdGljIGludCBnZXRfZGxwaV9wcGEoaW50LCBjb25zdCBjaGFyICosIGludCwgY2hhciAqKTsKICNlbmRpZgogCi0vKiBYWFggTmVlZGVkIGJ5IEhQLVVYIChhdCBsZWFzdCkgKi8KLXN0YXRpYyBicGZfdV9pbnQzMiBjdGxidWZbTUFYRExCVUZdOwotc3RhdGljIHN0cnVjdCBzdHJidWYgY3RsID0gewotCU1BWERMQlVGLAotCTAsCi0JKGNoYXIgKiljdGxidWYKLX07Ci0KIC8qCiAgKiBDYXN0IGEgYnVmZmVyIHRvICJ1bmlvbiBETF9wcmltaXRpdmVzIiB3aXRob3V0IHByb3Zva2luZyB3YXJuaW5ncwogICogZnJvbSB0aGUgY29tcGlsZXIuCkBAIC0xODYsNiArMTgwLDEyIEBACiAJaW50IGNjOwogCXVfY2hhciAqYnA7CiAJaW50IGZsYWdzOworCWJwZl91X2ludDMyIGN0bGJ1ZltNQVhETEJVRl07CisJc3RydWN0IHN0cmJ1ZiBjdGwgPSB7CisJCU1BWERMQlVGLAorCQkwLAorCQkoY2hhciAqKWN0bGJ1ZgorCX07CiAJc3RydWN0IHN0cmJ1ZiBkYXRhOwogCiAJZmxhZ3MgPSAwOwpAQCAtMjEzLDYgKzIxMyw5IEBACiAJCQkgKiB3b3VsZCBiZSBETF9IUF9SQVdEQVRBX0lORCBvbiBIUC1VWAogCQkJICogaWYgd2UncmUgaW4gcmF3IG1vZGU/CiAJCQkgKi8KKwkJCWN0bC5idWYgPSAoY2hhciAqKWN0bGJ1ZjsKKwkJCWN0bC5tYXhsZW4gPSBNQVhETEJVRjsKKwkJCWN0bC5sZW4gPSAwOwogCQkJaWYgKGdldG1zZyhwLT5mZCwgJmN0bCwgJmRhdGEsICZmbGFncykgPCAwKSB7CiAJCQkJLyogRG9uJ3QgY2hva2Ugd2hlbiB3ZSBnZXQgcHRyYWNlZCAqLwogCQkJCXN3aXRjaCAoZXJybm8pIHsKQEAgLTIzMCw3ICsyMzMsNyBAQAogCQkJfQogCQkJY2MgPSBkYXRhLmxlbjsKIAkJfSB3aGlsZSAoY2MgPT0gMCk7Ci0JCWJwID0gcC0+YnVmZmVyICsgcC0+b2Zmc2V0OworCQlicCA9ICh1X2NoYXIgKilwLT5idWZmZXIgKyBwLT5vZmZzZXQ7CiAJfSBlbHNlCiAJCWJwID0gcC0+YnA7CiAKQEAgLTI0OCwxOSArMjUxLDE5IEBACiAjaWYgZGVmaW5lZChETElPQ1JBVykKIAlyZXQgPSB3cml0ZShwLT5mZCwgYnVmLCBzaXplKTsKIAlpZiAocmV0ID09IC0xKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzZW5kOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KICNlbGlmIGRlZmluZWQoRExfSFBfUkFXRExTKQogCWlmIChwZC0+c2VuZF9mZCA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJzZW5kOiBPdXRwdXQgRkQgY291bGRuJ3QgYmUgb3BlbmVkIik7CiAJCXJldHVybiAoLTEpOwogCX0KIAlyZXQgPSBkbHJhd2RhdGFyZXEocGQtPnNlbmRfZmQsIGJ1Ziwgc2l6ZSk7CiAJaWYgKHJldCA9PSAtMSkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzZW5kOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZDogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKC0xKTsKIAl9CkBAIC0zMzEsMjggKzMzNCwxMiBAQAogfQogCiBzdGF0aWMgaW50Ci1wY2FwX2FjdGl2YXRlX2RscGkocGNhcF90ICpwKQorb3Blbl9kbHBpX2RldmljZShjb25zdCBjaGFyICpuYW1lLCBpbnQgKnBwYSwgY2hhciAqZXJyYnVmKQogewotI2lmZGVmIERMX0hQX1JBV0RMUwotCXN0cnVjdCBwY2FwX2RscGkgKnBkID0gcC0+cHJpdjsKLSNlbmRpZgotCWludCBzdGF0dXMgPSAwOwotCWludCByZXR2OwotCXJlZ2lzdGVyIGNoYXIgKmNwOwotCWludCBwcGE7Ci0jaWZkZWYgSEFWRV9TT0xBUklTCi0JaW50IGlzYXRtID0gMDsKLSNlbmRpZgotCXJlZ2lzdGVyIGRsX2luZm9fYWNrX3QgKmluZm9wOwotI2lmZGVmIEhBVkVfU1lTX0JVRk1PRF9ICi0JYnBmX3VfaW50MzIgc3M7Ci0jaWZkZWYgSEFWRV9TT0xBUklTCi0JcmVnaXN0ZXIgY2hhciAqcmVsZWFzZTsKLQlicGZfdV9pbnQzMiBvc21ham9yLCBvc21pbm9yLCBvc21pY3JvOwotI2VuZGlmCi0jZW5kaWYKLQlicGZfdV9pbnQzMiBidWZbTUFYRExCVUZdOworCWludCBzdGF0dXM7CiAJY2hhciBkbmFtZVsxMDBdOworCWNoYXIgKmNwOworCWludCBmZDsKICNpZm5kZWYgSEFWRV9ERVZfRExQSQogCWNoYXIgZG5hbWUyWzEwMF07CiAjZW5kaWYKQEAgLTM2MSw5ICszNDgsOSBAQAogCS8qCiAJKiogUmVtb3ZlIGFueSAiL2Rldi8iIG9uIHRoZSBmcm9udCBvZiB0aGUgZGV2aWNlLgogCSovCi0JY3AgPSBzdHJyY2hyKHAtPm9wdC5zb3VyY2UsICcvJyk7CisJY3AgPSBzdHJyY2hyKG5hbWUsICcvJyk7CiAJaWYgKGNwID09IE5VTEwpCi0JCXN0cmxjcHkoZG5hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZihkbmFtZSkpOworCQlzdHJsY3B5KGRuYW1lLCBuYW1lLCBzaXplb2YoZG5hbWUpKTsKIAllbHNlCiAJCXN0cmxjcHkoZG5hbWUsIGNwICsgMSwgc2l6ZW9mKGRuYW1lKSk7CiAKQEAgLTM3MSwxMSArMzU4LDkgQEAKIAkgKiBTcGxpdCB0aGUgZGV2aWNlIG5hbWUgaW50byBhIGRldmljZSB0eXBlIG5hbWUgYW5kIGEgdW5pdCBudW1iZXI7CiAJICogY2hvcCBvZmYgdGhlIHVuaXQgbnVtYmVyLCBzbyAiZG5hbWUiIGlzIGp1c3QgYSBkZXZpY2UgdHlwZSBuYW1lLgogCSAqLwotCWNwID0gc3BsaXRfZG5hbWUoZG5hbWUsICZwcGEsIHAtPmVycmJ1Zik7Ci0JaWYgKGNwID09IE5VTEwpIHsKLQkJc3RhdHVzID0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKLQkJZ290byBiYWQ7Ci0JfQorCWNwID0gc3BsaXRfZG5hbWUoZG5hbWUsIHBwYSwgZXJyYnVmKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFKTsKIAkqY3AgPSAnXDAnOwogCiAJLyoKQEAgLTM5MCwxMyArMzc1LDEzNyBAQAogCSAqIGRldmljZSBudW1iZXIsIHJhdGhlciB0aGFuIGhhcmR3aXJpbmcgIi9kZXYvZGxwaSIuCiAJICovCiAJY3AgPSAiL2Rldi9kbHBpIjsKLQlpZiAoKHAtPmZkID0gb3BlbihjcCwgT19SRFdSKSkgPCAwKSB7CisJaWYgKChmZCA9IG9wZW4oY3AsIE9fUkRXUikpIDwgMCkgewogCQlpZiAoZXJybm8gPT0gRVBFUk0gfHwgZXJybm8gPT0gRUFDQ0VTKQogCQkJc3RhdHVzID0gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKIAkJZWxzZQogCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICIlczogJXMiLCBjcCwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBHZXQgYSB0YWJsZSBvZiBhbGwgUFBBcyBmb3IgdGhhdCBkZXZpY2UsIGFuZCBzZWFyY2ggdGhhdAorCSAqIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZSB0eXBlIG5hbWUgYW5kIHVuaXQgbnVtYmVyLgorCSAqLworCSpwcGEgPSBnZXRfZGxwaV9wcGEoZmQsIGRuYW1lLCAqcHBhLCBlcnJidWYpOworCWlmICgqcHBhIDwgMCkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAoKnBwYSk7CisJfQorI2Vsc2UKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgbmFtZSBiZWdpbnMgd2l0aCAiLyIsIGFzc3VtZSBpdCBiZWdpbnMgd2l0aAorCSAqIHRoZSBwYXRobmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGRldmljZSB0byBvcGVuOworCSAqIG90aGVyd2lzZSwgY29uY2F0ZW5hdGUgdGhlIGRldmljZSBkaXJlY3RvcnkgbmFtZSBhbmQgdGhlCisJICogZGV2aWNlIG5hbWUuCisJICovCisJaWYgKCpuYW1lID09ICcvJykKKwkJc3RybGNweShkbmFtZSwgbmFtZSwgc2l6ZW9mKGRuYW1lKSk7CisJZWxzZQorCQlwY2FwX3NucHJpbnRmKGRuYW1lLCBzaXplb2YoZG5hbWUpLCAiJXMvJXMiLCBQQ0FQX0RFVl9QUkVGSVgsCisJCSAgICBuYW1lKTsKKworCS8qCisJICogR2V0IHRoZSB1bml0IG51bWJlciwgYW5kIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBkZXZpY2UKKwkgKiB0eXBlIG5hbWUuCisJICovCisJY3AgPSBzcGxpdF9kbmFtZShkbmFtZSwgcHBhLCBlcnJidWYpOworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0UpOworCisJLyoKKwkgKiBNYWtlIGEgY29weSBvZiB0aGUgZGV2aWNlIHBhdGhuYW1lLCBhbmQgdGhlbiByZW1vdmUgdGhlIHVuaXQKKwkgKiBudW1iZXIgZnJvbSB0aGUgZGV2aWNlIHBhdGhuYW1lLgorCSAqLworCXN0cmxjcHkoZG5hbWUyLCBkbmFtZSwgc2l6ZW9mKGRuYW1lKSk7CisJKmNwID0gJ1wwJzsKKworCS8qIFRyeSBkZXZpY2Ugd2l0aG91dCB1bml0IG51bWJlciAqLworCWlmICgoZmQgPSBvcGVuKGRuYW1lLCBPX1JEV1IpKSA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJaWYgKGVycm5vID09IEVQRVJNIHx8IGVycm5vID09IEVBQ0NFUykKKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyIsIGRuYW1lLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAoc3RhdHVzKTsKKwkJfQorCisJCS8qIFRyeSBhZ2FpbiB3aXRoIHVuaXQgbnVtYmVyICovCisJCWlmICgoZmQgPSBvcGVuKGRuYW1lMiwgT19SRFdSKSkgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCQkJc3RhdHVzID0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKKworCQkJCS8qCisJCQkJICogV2UgcHJvdmlkZSBhbiBlcnJvciBtZXNzYWdlIGV2ZW4KKwkJCQkgKiBmb3IgdGhpcyBlcnJvciwgZm9yIGRpYWdub3N0aWMKKwkJCQkgKiBwdXJwb3NlcyAoc28gdGhhdCwgZm9yIGV4YW1wbGUsCisJCQkJICogdGhlIGFwcCBjYW4gc2hvdyB0aGUgbWVzc2FnZSBpZiB0aGUKKwkJCQkgKiB1c2VyIHJlcXVlc3RzIGl0KS4KKwkJCQkgKgorCQkJCSAqIEluIGl0LCB3ZSBqdXN0IHJlcG9ydCAiTm8gRExQSSBkZXZpY2UKKwkJCQkgKiBmb3VuZCIgd2l0aCB0aGUgZGV2aWNlIG5hbWUsIHNvIHBlb3BsZQorCQkJCSAqIGRvbid0IGdldCBjb25mdXNlZCBhbmQgdGhpbmssIGZvciBleGFtcGxlLAorCQkJCSAqIHRoYXQgaWYgdGhleSBjYW4ndCBjYXB0dXJlIG9uICJsbzAiCisJCQkJICogb24gU29sYXJpcyBwcmlvciB0byBTb2xhcmlzIDExIHRoZSBmaXgKKwkJCQkgKiBpcyB0byBjaGFuZ2UgbGlicGNhcCAob3IgdGhlIGFwcGxpY2F0aW9uCisJCQkJICogdGhhdCB1c2VzIGl0KSB0byBsb29rIGZvciBzb21ldGhpbmcgb3RoZXIKKwkJCQkgKiB0aGFuICIvZGV2L2xvMCIsIGFzIHRoZSBmaXggaXMgdG8gdXNlCisJCQkJICogU29sYXJpcyAxMSBvciBzb21lIG9wZXJhdGluZyBzeXN0ZW0KKwkJCQkgKiBvdGhlciB0aGFuIFNvbGFyaXMgLSB5b3UganVzdCAqY2FuJ3QqCisJCQkJICogY2FwdHVyZSBvbiBhIGxvb3BiYWNrIGludGVyZmFjZQorCQkJCSAqIG9uIFNvbGFyaXMgcHJpb3IgdG8gU29sYXJpcyAxMSwgdGhlIGxhY2sKKwkJCQkgKiBvZiBhIERMUEkgZGV2aWNlIGZvciB0aGUgbG9vcGJhY2sKKwkJCQkgKiBpbnRlcmZhY2UgaXMganVzdCBhIHN5bXB0b20gb2YgdGhhdAorCQkJCSAqIGluYWJpbGl0eS4KKwkJCQkgKi8KKwkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIiVzOiBObyBETFBJIGRldmljZSBmb3VuZCIsIG5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZXJybm8gPT0gRVBFUk0gfHwgZXJybm8gPT0gRUFDQ0VTKQorCQkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQkJCWVsc2UKKwkJCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyIsCisJCQkJICAgIGRuYW1lMiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJfQorCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisJCS8qIFhYWCBBc3N1bWUgdW5pdCB6ZXJvICovCisJCSpwcGEgPSAwOworCX0KKyNlbmRpZgorCXJldHVybiAoZmQpOworfQorCitzdGF0aWMgaW50CitwY2FwX2FjdGl2YXRlX2RscGkocGNhcF90ICpwKQoreworI2lmZGVmIERMX0hQX1JBV0RMUworCXN0cnVjdCBwY2FwX2RscGkgKnBkID0gcC0+cHJpdjsKKyNlbmRpZgorCWludCBzdGF0dXMgPSAwOworCWludCByZXR2OworCWludCBwcGE7CisjaWZkZWYgSEFWRV9TT0xBUklTCisJaW50IGlzYXRtID0gMDsKKyNlbmRpZgorCXJlZ2lzdGVyIGRsX2luZm9fYWNrX3QgKmluZm9wOworI2lmZGVmIEhBVkVfU1lTX0JVRk1PRF9ICisJYnBmX3VfaW50MzIgc3M7CisjaWZkZWYgSEFWRV9TT0xBUklTCisJY2hhciByZWxlYXNlW0dFVF9SRUxFQVNFX0JVRlNJWkVdOworCWJwZl91X2ludDMyIG9zbWFqb3IsIG9zbWlub3IsIG9zbWljcm87CisjZW5kaWYKKyNlbmRpZgorCWJwZl91X2ludDMyIGJ1ZltNQVhETEJVRl07CisKKwlwLT5mZCA9IG9wZW5fZGxwaV9kZXZpY2UocC0+b3B0LmRldmljZSwgJnBwYSwgcC0+ZXJyYnVmKTsKKwlpZiAocC0+ZmQgPCAwKSB7CisJCXN0YXR1cyA9IHAtPmZkOwogCQlnb3RvIGJhZDsKIAl9CiAKQEAgLTQxMiwxMDEgKzUyMSw3IEBACiAJICogdG8gb3BlbiBpdCBmb3IgcmVhZGluZyBvbmx5IGFuZCwgaWYgdGhhdCBzdWNjZWVkcywganVzdCBsZXQKIAkgKiB0aGUgc2VuZCBhdHRlbXB0cyBmYWlsLgogCSAqLwotCXBkLT5zZW5kX2ZkID0gb3BlbihjcCwgT19SRFdSKTsKLSNlbmRpZgotCi0JLyoKLQkgKiBHZXQgYSB0YWJsZSBvZiBhbGwgUFBBcyBmb3IgdGhhdCBkZXZpY2UsIGFuZCBzZWFyY2ggdGhhdAotCSAqIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZSB0eXBlIG5hbWUgYW5kIHVuaXQgbnVtYmVyLgotCSAqLwotCXBwYSA9IGdldF9kbHBpX3BwYShwLT5mZCwgZG5hbWUsIHBwYSwgcC0+ZXJyYnVmKTsKLQlpZiAocHBhIDwgMCkgewotCQlzdGF0dXMgPSBwcGE7Ci0JCWdvdG8gYmFkOwotCX0KLSNlbHNlCi0JLyoKLQkgKiBJZiB0aGUgZGV2aWNlIG5hbWUgYmVnaW5zIHdpdGggIi8iLCBhc3N1bWUgaXQgYmVnaW5zIHdpdGgKLQkgKiB0aGUgcGF0aG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBkZXZpY2UgdG8gb3BlbjsKLQkgKiBvdGhlcndpc2UsIGNvbmNhdGVuYXRlIHRoZSBkZXZpY2UgZGlyZWN0b3J5IG5hbWUgYW5kIHRoZQotCSAqIGRldmljZSBuYW1lLgotCSAqLwotCWlmICgqcC0+b3B0LnNvdXJjZSA9PSAnLycpCi0JCXN0cmxjcHkoZG5hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZihkbmFtZSkpOwotCWVsc2UKLQkJc25wcmludGYoZG5hbWUsIHNpemVvZihkbmFtZSksICIlcy8lcyIsIFBDQVBfREVWX1BSRUZJWCwKLQkJICAgIHAtPm9wdC5zb3VyY2UpOwotCi0JLyoKLQkgKiBHZXQgdGhlIHVuaXQgbnVtYmVyLCBhbmQgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGRldmljZQotCSAqIHR5cGUgbmFtZS4KLQkgKi8KLQljcCA9IHNwbGl0X2RuYW1lKGRuYW1lLCAmcHBhLCBwLT5lcnJidWYpOwotCWlmIChjcCA9PSBOVUxMKSB7Ci0JCXN0YXR1cyA9IFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U7Ci0JCWdvdG8gYmFkOwotCX0KLQotCS8qCi0JICogTWFrZSBhIGNvcHkgb2YgdGhlIGRldmljZSBwYXRobmFtZSwgYW5kIHRoZW4gcmVtb3ZlIHRoZSB1bml0Ci0JICogbnVtYmVyIGZyb20gdGhlIGRldmljZSBwYXRobmFtZS4KLQkgKi8KLQlzdHJsY3B5KGRuYW1lMiwgZG5hbWUsIHNpemVvZihkbmFtZSkpOwotCSpjcCA9ICdcMCc7Ci0KLQkvKiBUcnkgZGV2aWNlIHdpdGhvdXQgdW5pdCBudW1iZXIgKi8KLQlpZiAoKHAtPmZkID0gb3BlbihkbmFtZSwgT19SRFdSKSkgPCAwKSB7Ci0JCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKLQkJCWlmIChlcnJubyA9PSBFUEVSTSB8fCBlcnJubyA9PSBFQUNDRVMpCi0JCQkJc3RhdHVzID0gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKLQkJCWVsc2UKLQkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwgZG5hbWUsCi0JCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQkJZ290byBiYWQ7Ci0JCX0KLQotCQkvKiBUcnkgYWdhaW4gd2l0aCB1bml0IG51bWJlciAqLwotCQlpZiAoKHAtPmZkID0gb3BlbihkbmFtZTIsIE9fUkRXUikpIDwgMCkgewotCQkJaWYgKGVycm5vID09IEVOT0VOVCkgewotCQkJCXN0YXR1cyA9IFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U7Ci0KLQkJCQkvKgotCQkJCSAqIFdlIHByb3ZpZGUgYW4gZXJyb3IgbWVzc2FnZSBldmVuCi0JCQkJICogZm9yIHRoaXMgZXJyb3IsIGZvciBkaWFnbm9zdGljCi0JCQkJICogcHVycG9zZXMgKHNvIHRoYXQsIGZvciBleGFtcGxlLAotCQkJCSAqIHRoZSBhcHAgY2FuIHNob3cgdGhlIG1lc3NhZ2UgaWYgdGhlCi0JCQkJICogdXNlciByZXF1ZXN0cyBpdCkuCi0JCQkJICoKLQkJCQkgKiBJbiBpdCwgd2UganVzdCByZXBvcnQgIk5vIERMUEkgZGV2aWNlCi0JCQkJICogZm91bmQiIHdpdGggdGhlIGRldmljZSBuYW1lLCBzbyBwZW9wbGUKLQkJCQkgKiBkb24ndCBnZXQgY29uZnVzZWQgYW5kIHRoaW5rLCBmb3IgZXhhbXBsZSwKLQkJCQkgKiB0aGF0IGlmIHRoZXkgY2FuJ3QgY2FwdHVyZSBvbiAibG8wIgotCQkJCSAqIG9uIFNvbGFyaXMgdGhlIGZpeCBpcyB0byBjaGFuZ2UgbGlicGNhcAotCQkJCSAqIChvciB0aGUgYXBwbGljYXRpb24gdGhhdCB1c2VzIGl0KSB0bwotCQkJCSAqIGxvb2sgZm9yIHNvbWV0aGluZyBvdGhlciB0aGFuICIvZGV2L2xvMCIsCi0JCQkJICogYXMgdGhlIGZpeCBpcyB0byBsb29rIGZvciBhbiBvcGVyYXRpbmcKLQkJCQkgKiBzeXN0ZW0gb3RoZXIgdGhhbiBTb2xhcmlzIC0geW91IGp1c3QKLQkJCQkgKiAqY2FuJ3QqIGNhcHR1cmUgb24gYSBsb29wYmFjayBpbnRlcmZhY2UKLQkJCQkgKiBvbiBTb2xhcmlzLCB0aGUgbGFjayBvZiBhIERMUEkgZGV2aWNlCi0JCQkJICogZm9yIHRoZSBsb29wYmFjayBpbnRlcmZhY2UgaXMganVzdCBhCi0JCQkJICogc3ltcHRvbSBvZiB0aGF0IGluYWJpbGl0eS4KLQkJCQkgKi8KLQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCQkJICAgICIlczogTm8gRExQSSBkZXZpY2UgZm91bmQiLCBwLT5vcHQuc291cmNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGVycm5vID09IEVQRVJNIHx8IGVycm5vID09IEVBQ0NFUykKLQkJCQkJc3RhdHVzID0gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKLQkJCQllbHNlCi0JCQkJCXN0YXR1cyA9IFBDQVBfRVJST1I7Ci0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwKLQkJCQkgICAgZG5hbWUyLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQl9Ci0JCQlnb3RvIGJhZDsKLQkJfQotCQkvKiBYWFggQXNzdW1lIHVuaXQgemVybyAqLwotCQlwcGEgPSAwOwotCX0KKwlwZC0+c2VuZF9mZCA9IG9wZW4oIi9kZXYvZGxwaSIsIE9fUkRXUik7CiAjZW5kaWYKIAogCS8qCkBAIC02MjcsNyArNjQyLDcgQEAKIAkJKi8KIAkJaWYgKHN0cmlvY3RsKHAtPmZkLCBBX1BST01JU0NPTl9SRVEsIDAsIE5VTEwpIDwgMCkgewogCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJBX1BST01JU0NPTl9SRVE6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJZ290byBiYWQ7CiAJCX0KQEAgLTc0NSw3ICs3NjAsNyBAQAogCSovCiAJaWYgKHN0cmlvY3RsKHAtPmZkLCBETElPQ1JBVywgMCwgTlVMTCkgPCAwKSB7CiAJCXN0YXR1cyA9IFBDQVBfRVJST1I7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkRMSU9DUkFXOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRExJT0NSQVc6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtNzYzLDEwICs3NzgsMTAgQEAKIAkqKiBBc2sgZm9yIGJ1Z2lkIDExNDkwNjUuCiAJKi8KICNpZmRlZiBIQVZFX1NPTEFSSVMKLQlyZWxlYXNlID0gZ2V0X3JlbGVhc2UoJm9zbWFqb3IsICZvc21pbm9yLCAmb3NtaWNybyk7CisJZ2V0X3JlbGVhc2UocmVsZWFzZSwgc2l6ZW9mIChyZWxlYXNlKSwgJm9zbWFqb3IsICZvc21pbm9yLCAmb3NtaWNybyk7CiAJaWYgKG9zbWFqb3IgPT0gNSAmJiAob3NtaW5vciA8PSAyIHx8IChvc21pbm9yID09IDMgJiYgb3NtaWNybyA8IDIpKSAmJgogCSAgICBnZXRlbnYoIkJVRk1PRF9GSVhFRCIpID09IE5VTEwpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJIldBUk5JTkc6IGJ1Zm1vZCBpcyBicm9rZW4gaW4gU3VuT1MgJXM7IGlnbm9yaW5nIHNuYXBsZW4uIiwKIAkJICAgIHJlbGVhc2UpOwogCQlzcyA9IDA7CkBAIC03ODYsNyArODAxLDcgQEAKIAkqLwogCWlmIChpb2N0bChwLT5mZCwgSV9GTFVTSCwgRkxVU0hSKSAhPSAwKSB7CiAJCXN0YXR1cyA9IFBDQVBfRVJST1I7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkZMVVNIUjogJXMiLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkZMVVNIUjogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGJhZDsKIAl9CkBAIC04NDEsNyArODU2LDcgQEAKIAkgKi8KIAljcCA9IGRldmljZSArIHN0cmxlbihkZXZpY2UpIC0gMTsKIAlpZiAoKmNwIDwgJzAnIHx8ICpjcCA+ICc5JykgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMgbWlzc2luZyB1bml0IG51bWJlciIsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzIG1pc3NpbmcgdW5pdCBudW1iZXIiLAogCQkgICAgZGV2aWNlKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CkBAIC04NTMsMTYgKzg2OCwxNiBAQAogCWVycm5vID0gMDsKIAl1bml0ID0gc3RydG9sKGNwLCAmZW9zLCAxMCk7CiAJaWYgKCplb3MgIT0gJ1wwJykgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMgYmFkIHVuaXQgbnVtYmVyIiwgZGV2aWNlKTsKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMgYmFkIHVuaXQgbnVtYmVyIiwgZGV2aWNlKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAJaWYgKGVycm5vID09IEVSQU5HRSB8fCB1bml0ID4gSU5UX01BWCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMgdW5pdCBudW1iZXIgdG9vIGxhcmdlIiwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMgdW5pdCBudW1iZXIgdG9vIGxhcmdlIiwKIAkJICAgIGRldmljZSk7CiAJCXJldHVybiAoTlVMTCk7CiAJfQogCWlmICh1bml0IDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMgdW5pdCBudW1iZXIgaXMgbmVnYXRpdmUiLAorCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlcyB1bml0IG51bWJlciBpcyBuZWdhdGl2ZSIsCiAJCSAgICBkZXZpY2UpOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KQEAgLTk2MCw2ICs5NzUsNTYgQEAKIAlyZXR1cm4gKDApOwogfQogCisvKgorICogTm90IGFsbCBpbnRlcmZhY2VzIGFyZSBETFBJIGludGVyZmFjZXMsIGFuZCB0aHVzIG5vdCBhbGwgaW50ZXJmYWNlcworICogY2FuIGJlIG9wZW5lZCB3aXRoIERMUEkgKGZvciBleGFtcGxlLCB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIGlzIG5vdAorICogYSBETFBJIGludGVyZmFjZSBvbiBTb2xhcmlzIHByaW9yIHRvIFNvbGFyaXMgMTEpLCBzbyB0cnkgdG8gb3BlbgorICogdGhlIHNwZWNpZmllZCBpbnRlcmZhY2U7IHJldHVybiAwIGlmIHdlIGZhaWwgd2l0aCBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFCisgKiBhbmQgMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK2lzX2RscGlfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGZkOworCWludCBwcGE7CisJY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRV07CisKKwlmZCA9IG9wZW5fZGxwaV9kZXZpY2UobmFtZSwgJnBwYSwgZXJyYnVmKTsKKwlpZiAoZmQgPCAwKSB7CisJCS8qCisJCSAqIEVycm9yIC0gd2FzIGl0IFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U/CisJCSAqLworCQlpZiAoZmQgPT0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSkgeworCQkJLyoKKwkJCSAqIFllcywgc28gd2UgY2FuJ3Qgb3BlbiB0aGlzIGJlY2F1c2UgaXQncworCQkJICogbm90IGEgRExQSSBpbnRlcmZhY2UuCisJCQkgKi8KKwkJCXJldHVybiAoMCk7CisJCX0KKwkJLyoKKwkJICogTm8sIHNvLCBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSdzIGEgc2luZ2xlIERMUEkKKwkJICogZGV2aWNlIGZvciBhbGwgaW50ZXJmYWNlcyBvZiB0aGlzIHR5cGUgKCJzdHlsZQorCQkgKiAyIiBwcm92aWRlcnM/KSwgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIGl0J3MgYSBETFBJCisJCSAqIGludGVyZmFjZSBvciBub3QsIGFzIHdlIGRpZG4ndCB0cnkgYW4gYXR0YWNoLgorCQkgKiBTYXkgaXQgaXMgYSBETFBJIGRldmljZSwgc28gdGhhdCB0aGUgdXNlciBjYW4gYXQKKwkJICogbGVhc3QgdHJ5IHRvIG9wZW4gaXQgYW5kIHJlcG9ydCB0aGUgZXJyb3IgKHdoaWNoCisJCSAqIGlzIHByb2JhYmx5ICJ5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gdGhhdAorCQkgKiBETFBJIGRldmljZSI7IHJlcG9ydGluZyB0aG9zZSBpbnRlcmZhY2VzIG1lYW5zCisJCSAqIHVzZXJzIHdpbGwgYXNrICJ3aHkgYW0gSSBnZXR0aW5nIGEgcGVybWlzc2lvbnMgZXJyb3IKKwkJICogd2hlbiBJIHRyeSB0byBjYXB0dXJlIiByYXRoZXIgdGhhbiAid2h5IGFtIEkgbm90CisJCSAqIHNlZWluZyBhbnkgaW50ZXJmYWNlcyIsIG1ha2luZyB0aGUgdW5kZXJseWluZyBwcm9ibGVtCisJCSAqIGNsZWFyZXIpLgorCQkgKi8KKwkJcmV0dXJuICgxKTsKKwl9CisKKwkvKgorCSAqIFN1Y2Nlc3MuCisJICovCisJY2xvc2UoZmQpOworCXJldHVybiAoMSk7Cit9CisKIGludAogcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQogewpAQCAtOTcyLDggKzEwMzcsMTYgQEAKIAl9IGJ1ZjsKIAljaGFyIGJhbmFtZVsyKzErMV07CiAJdV9pbnQgaTsKKyNlbmRpZgogCiAJLyoKKwkgKiBHZXQgdGhlIGxpc3Qgb2YgcmVndWxhciBpbnRlcmZhY2VzIGZpcnN0LgorCSAqLworCWlmIChwY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMoYWxsZGV2c3AsIGVycmJ1ZiwgaXNfZGxwaV9pbnRlcmZhY2UpID09IC0xKQorCQlyZXR1cm4gKC0xKTsJLyogZmFpbHVyZSAqLworCisjaWZkZWYgSEFWRV9TT0xBUklTCisJLyoKIAkgKiBXZSBtYXkgaGF2ZSB0byBkbyBzcGVjaWFsIG1hZ2ljIHRvIGdldCBBVE0gZGV2aWNlcy4KIAkgKi8KIAlpZiAoKGZkID0gb3BlbigiL2Rldi9iYSIsIE9fUkRXUikpIDwgMCkgewpAQCAtOTg5LDEyICsxMDYyLDEyIEBACiAJfQogCiAJaWYgKHN0cmlvY3RsKGZkLCBBX0dFVF9VTklUUywgc2l6ZW9mKGJ1ZiksIChjaGFyICopJmJ1ZikgPCAwKSB7Ci0JCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkFfR0VUX1VOSVRTOiAlcyIsCisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQV9HRVRfVU5JVFM6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBidWYubnVuaXRzOyBpKyspIHsKLQkJc25wcmludGYoYmFuYW1lLCBzaXplb2YgYmFuYW1lLCAiYmEldSIsIGkpOworCQlwY2FwX3NucHJpbnRmKGJhbmFtZSwgc2l6ZW9mIGJhbmFtZSwgImJhJXUiLCBpKTsKIAkJaWYgKHBjYXBfYWRkX2lmKGFsbGRldnNwLCBiYW5hbWUsIDAsIE5VTEwsIGVycmJ1ZikgPCAwKQogCQkJcmV0dXJuICgtMSk7CiAJfQpAQCAtMTAxNSw3ICsxMDg4LDcgQEAKIAogCWZsYWdzID0gMDsKIAlpZiAocHV0bXNnKGZkLCAmY3RsLCAoc3RydWN0IHN0cmJ1ZiAqKSBOVUxMLCBmbGFncykgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJzZW5kX3JlcXVlc3Q6IHB1dG1zZyBcIiVzXCI6ICVzIiwKIAkJICAgIHdoYXQsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CkBAIC0xMDI5LDYgKzExMDIsOCBAQAogCXVuaW9uCURMX3ByaW1pdGl2ZXMJKmRscDsKIAlzdHJ1Y3QJc3RyYnVmCWN0bDsKIAlpbnQJZmxhZ3M7CisJY2hhcgllcnJtc2didWZbUENBUF9FUlJCVUZfU0laRV07CisJY2hhcglkbHByaW1idWZbNjRdOwogCiAJLyoKIAkgKiBDbGVhciBvdXQgIip1ZXJyb3IiLCBzbyBpdCdzIG9ubHkgc2V0IGZvciBETF9FUlJPUl9BQ0svRExfU1lTRVJSLApAQCAtMTA0Myw3ICsxMTE4LDcgQEAKIAogCWZsYWdzID0gMDsKIAlpZiAoZ2V0bXNnKGZkLCAmY3RsLCAoc3RydWN0IHN0cmJ1ZiopTlVMTCwgJmZsYWdzKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlY3ZfYWNrOiAlcyBnZXRtc2c6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAicmVjdl9hY2s6ICVzIGdldG1zZzogJXMiLAogCQkgICAgd2hhdCwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KQEAgLTEwNjYsNyArMTE0MSw3IEBACiAJCWNhc2UgRExfU1lTRVJSOgogCQkJaWYgKHVlcnJvciAhPSBOVUxMKQogCQkJCSp1ZXJyb3IgPSBkbHAtPmVycm9yX2Fjay5kbF91bml4X2Vycm5vOwotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAicmVjdl9hY2s6ICVzOiBVTklYIGVycm9yIC0gJXMiLAogCQkJICAgIHdoYXQsIHBjYXBfc3RyZXJyb3IoZGxwLT5lcnJvcl9hY2suZGxfdW5peF9lcnJubykpOwogCQkJaWYgKGRscC0+ZXJyb3JfYWNrLmRsX3VuaXhfZXJybm8gPT0gRVBFUk0gfHwKQEAgLTEwNzUsOCArMTE1MCw5IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlY3ZfYWNrOiAlczogJXMiLAotCQkJICAgIHdoYXQsIGRsc3RyZXJyb3IoZGxwLT5lcnJvcl9hY2suZGxfZXJybm8pKTsKKwkJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAicmVjdl9hY2s6ICVzOiAlcyIsIHdoYXQsCisJCQkgICAgZGxzdHJlcnJvcihlcnJtc2didWYsIHNpemVvZiAoZXJybXNnYnVmKSwgZGxwLT5lcnJvcl9hY2suZGxfZXJybm8pKTsKIAkJCWlmIChkbHAtPmVycm9yX2Fjay5kbF9lcnJubyA9PSBETF9CQURQUEEpCiAJCQkJcmV0dXJuIChQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFKTsKIAkJCWVsc2UgaWYgKGRscC0+ZXJyb3JfYWNrLmRsX2Vycm5vID09IERMX0FDQ0VTUykKQEAgLTEwODYsMTQgKzExNjIsMTQgQEAKIAkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAogCWRlZmF1bHQ6Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJyZWN2X2FjazogJXM6IFVuZXhwZWN0ZWQgcHJpbWl0aXZlIGFjayAlcyIsCi0JCSAgICB3aGF0LCBkbHByaW0oZGxwLT5kbF9wcmltaXRpdmUpKTsKKwkJICAgIHdoYXQsIGRscHJpbShkbHByaW1idWYsIHNpemVvZiAoZGxwcmltYnVmKSwgZGxwLT5kbF9wcmltaXRpdmUpKTsKIAkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAKIAlpZiAoY3RsLmxlbiA8IHNpemUpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgInJlY3ZfYWNrOiAlczogQWNrIHRvbyBzbWFsbCAoJWQgPCAlZCkiLAogCQkgICAgd2hhdCwgY3RsLmxlbiwgc2l6ZSk7CiAJCXJldHVybiAoUENBUF9FUlJPUik7CkBAIC0xMTAyLDEwICsxMTc4LDggQEAKIH0KIAogc3RhdGljIGNoYXIgKgotZGxzdHJlcnJvcihicGZfdV9pbnQzMiBkbF9lcnJubykKK2Rsc3RyZXJyb3IoY2hhciAqZXJyYnVmLCBzaXplX3QgZXJyYnVmc2l6ZSwgYnBmX3VfaW50MzIgZGxfZXJybm8pCiB7Ci0Jc3RhdGljIGNoYXIgZXJyc3RyaW5nWzYrMis4KzFdOwotCiAJc3dpdGNoIChkbF9lcnJubykgewogCiAJY2FzZSBETF9BQ0NFU1M6CkBAIC0xMjA2LDE2ICsxMjgwLDE0IEBACiAJCXJldHVybiAoIlBlbmRpbmcgb3V0c3RhbmRpbmcgY29ubmVjdCBpbmRpY2F0aW9ucyIpOwogCiAJZGVmYXVsdDoKLQkJc3ByaW50ZihlcnJzdHJpbmcsICJFcnJvciAlMDJ4IiwgZGxfZXJybm8pOwotCQlyZXR1cm4gKGVycnN0cmluZyk7CisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBlcnJidWZzaXplLCAiRXJyb3IgJTAyeCIsIGRsX2Vycm5vKTsKKwkJcmV0dXJuIChlcnJidWYpOwogCX0KIH0KIAogc3RhdGljIGNoYXIgKgotZGxwcmltKGJwZl91X2ludDMyIHByaW0pCitkbHByaW0oY2hhciAqcHJpbWJ1Ziwgc2l6ZV90IHByaW1idWZzaXplLCBicGZfdV9pbnQzMiBwcmltKQogewotCXN0YXRpYyBjaGFyIHByaW1idWZbODBdOwotCiAJc3dpdGNoIChwcmltKSB7CiAKIAljYXNlIERMX0lORk9fUkVROgpAQCAtMTMwMCw3ICsxMzcyLDggQEAKIAkJcmV0dXJuICgiRExfUkVTRVRfQ09OIik7CiAKIAlkZWZhdWx0OgotCQkodm9pZCkgc3ByaW50ZihwcmltYnVmLCAidW5rbm93biBwcmltaXRpdmUgMHgleCIsIHByaW0pOworCQlwY2FwX3NucHJpbnRmKHByaW1idWYsIHByaW1idWZzaXplLCAidW5rbm93biBwcmltaXRpdmUgMHgleCIsCisJCSAgICBwcmltKTsKIAkJcmV0dXJuIChwcmltYnVmKTsKIAl9CiB9CkBAIC0xNDEyLDI4ICsxNDg1LDI5IEBACiAjZW5kaWYgLyogRExfSFBfUkFXRExTICovCiAKICNpZiBkZWZpbmVkKEhBVkVfU09MQVJJUykgJiYgZGVmaW5lZChIQVZFX1NZU19CVUZNT0RfSCkKLXN0YXRpYyBjaGFyICoKLWdldF9yZWxlYXNlKGJwZl91X2ludDMyICptYWpvcnAsIGJwZl91X2ludDMyICptaW5vcnAsIGJwZl91X2ludDMyICptaWNyb3ApCitzdGF0aWMgdm9pZAorZ2V0X3JlbGVhc2UoY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSwgYnBmX3VfaW50MzIgKm1ham9ycCwKKyAgICBicGZfdV9pbnQzMiAqbWlub3JwLCBicGZfdV9pbnQzMiAqbWljcm9wKQogewogCWNoYXIgKmNwOwotCXN0YXRpYyBjaGFyIGJ1ZlszMl07CiAKIAkqbWFqb3JwID0gMDsKIAkqbWlub3JwID0gMDsKIAkqbWljcm9wID0gMDsKLQlpZiAoc3lzaW5mbyhTSV9SRUxFQVNFLCBidWYsIHNpemVvZihidWYpKSA8IDApCi0JCXJldHVybiAoIj8iKTsKKwlpZiAoc3lzaW5mbyhTSV9SRUxFQVNFLCBidWYsIGJ1ZnNpemUpIDwgMCkgeworCQlzdHJsY3B5KGJ1ZiwgIj8iLCBidWZzaXplKTsKKwkJcmV0dXJuOworCX0KIAljcCA9IGJ1ZjsKIAlpZiAoIWlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKmNwKSkKLQkJcmV0dXJuIChidWYpOworCQlyZXR1cm47CiAJKm1ham9ycCA9IHN0cnRvbChjcCwgJmNwLCAxMCk7CiAJaWYgKCpjcCsrICE9ICcuJykKLQkJcmV0dXJuIChidWYpOworCQlyZXR1cm47CiAJKm1pbm9ycCA9ICBzdHJ0b2woY3AsICZjcCwgMTApOwogCWlmICgqY3ArKyAhPSAnLicpCi0JCXJldHVybiAoYnVmKTsKKwkJcmV0dXJuOwogCSptaWNyb3AgPSAgc3RydG9sKGNwLCAmY3AsIDEwKTsKLQlyZXR1cm4gKGJ1Zik7CiB9CiAjZW5kaWYKIApAQCAtMTUyMSwyMSArMTU5NSwyMSBAQAogCSAqLwogCS8qIGdldCB0aGUgaGVhZCBmaXJzdCAqLwogCWlmIChnZXRtc2coZmQsICZjdGwsIChzdHJ1Y3Qgc3RyYnVmICopTlVMTCwgJmZsYWdzKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgImdldF9kbHBpX3BwYTogaHBwcGEgZ2V0bXNnOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAl9CiAKIAlkbHAgPSAoZGxfaHBfcHBhX2Fja190ICopY3RsLmJ1ZjsKIAlpZiAoZGxwLT5kbF9wcmltaXRpdmUgIT0gRExfSFBfUFBBX0FDSykgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiZ2V0X2RscGlfcHBhOiBocHBwYSB1bmV4cGVjdGVkIHByaW1pdGl2ZSBhY2sgMHgleCIsCiAJCSAgICAoYnBmX3VfaW50MzIpZGxwLT5kbF9wcmltaXRpdmUpOwogCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KIAogCWlmIChjdGwubGVuIDwgRExfSFBfUFBBX0FDS19TSVpFKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJnZXRfZGxwaV9wcGE6IGhwcHBhIGFjayB0b28gc21hbGwgKCVkIDwgJWx1KSIsCiAJCSAgICAgY3RsLmxlbiwgKHVuc2lnbmVkIGxvbmcpRExfSFBfUFBBX0FDS19TSVpFKTsKIAkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKQEAgLTE1NDMsNyArMTYxNyw3IEBACiAKIAkvKiBhbGxvY2F0ZSBidWZmZXIgKi8KIAlpZiAoKHBwYV9kYXRhX2J1ZiA9IChjaGFyICopbWFsbG9jKGRscC0+ZGxfbGVuZ3RoKSkgPT0gTlVMTCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiZ2V0X2RscGlfcHBhOiBocHBwYSBtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KQEAgLTE1NTIsMTMgKzE2MjYsMTMgQEAKIAljdGwuYnVmID0gKGNoYXIgKilwcGFfZGF0YV9idWY7CiAJLyogZ2V0IHRoZSBkYXRhICovCiAJaWYgKGdldG1zZyhmZCwgJmN0bCwgKHN0cnVjdCBzdHJidWYgKilOVUxMLCAmZmxhZ3MpIDwgMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiZ2V0X2RscGlfcHBhOiBocHBwYSBnZXRtc2c6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlmcmVlKHBwYV9kYXRhX2J1Zik7CiAJCXJldHVybiAoUENBUF9FUlJPUik7CiAJfQogCWlmIChjdGwubGVuIDwgZGxwLT5kbF9sZW5ndGgpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgImdldF9kbHBpX3BwYTogaHBwcGEgYWNrIHRvbyBzbWFsbCAoJWQgPCAlbHUpIiwKIAkJICAgIGN0bC5sZW4sICh1bnNpZ25lZCBsb25nKWRscC0+ZGxfbGVuZ3RoKTsKIAkJZnJlZShwcGFfZGF0YV9idWYpOwpAQCAtMTYxNSw5ICsxNjg5LDkgQEAKIAkJICogZGV2aWNlIG51bWJlciBvZiBhIGRldmljZSB3aXRoIHRoZSBuYW1lICIvZGV2LzxkZXY+PHVuaXQ+IiwKIAkJICogaWYgc3VjaCBhIGRldmljZSBleGlzdHMsIGFzIHRoZSBvbGQgY29kZSBkaWQuCiAJCSAqLwotCQlzbnByaW50ZihkbmFtZSwgc2l6ZW9mKGRuYW1lKSwgIi9kZXYvJXMlZCIsIGRldmljZSwgdW5pdCk7CisJCXBjYXBfc25wcmludGYoZG5hbWUsIHNpemVvZihkbmFtZSksICIvZGV2LyVzJWQiLCBkZXZpY2UsIHVuaXQpOwogCQlpZiAoc3RhdChkbmFtZSwgJnN0YXRidWYpIDwgMCkgewotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInN0YXQ6ICVzOiAlcyIsCisJCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzdGF0OiAlczogJXMiLAogCQkJICAgIGRuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CkBAIC0xNjM0LDEyICsxNzA4LDEyIEBACiAJCX0KIAl9CiAJaWYgKGkgPT0gYXAtPmRsX2NvdW50KSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJjYW4ndCBmaW5kIC9kZXYvZGxwaSBQUEEgZm9yICVzJWQiLCBkZXZpY2UsIHVuaXQpOwogCQlyZXR1cm4gKFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0UpOwogCX0KIAlpZiAoaXAtPmRsX2hkd19zdGF0ZSA9PSBIRFdfREVBRCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiJXMlZDogaGFyZHdhcmUgc3RhdGU6IERPV05cbiIsIGRldmljZSwgdW5pdCk7CiAJCWZyZWUocHBhX2RhdGFfYnVmKTsKIAkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKQEAgLTE2NzgsMTkgKzE3NTIsMTkgQEAKIAlpZiAoY3AgIT0gTlVMTCkKIAkJaWZuYW1lID0gY3AgKyAxOwogCWlmIChubGlzdChwYXRoX3ZtdW5peCwgJm5sKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm5saXN0ICVzIGZhaWxlZCIsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm5saXN0ICVzIGZhaWxlZCIsCiAJCSAgICBwYXRoX3ZtdW5peCk7CiAJCXJldHVybiAoLTEpOwogCX0KIAlpZiAobmxbTkxfSUZORVRdLm5fdmFsdWUgPT0gMCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiY291bGQndCBmaW5kICVzIGtlcm5lbCBzeW1ib2wiLAogCQkgICAgbmxbTkxfSUZORVRdLm5fbmFtZSk7CiAJCXJldHVybiAoLTEpOwogCX0KIAlrZCA9IG9wZW4oIi9kZXYva21lbSIsIE9fUkRPTkxZKTsKIAlpZiAoa2QgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJrbWVtIG9wZW46ICVzIiwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAia21lbSBvcGVuOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTE3MTIsNyArMTc4Niw3IEBACiAJCQlyZXR1cm4gKGlmbmV0LmlmX2luZGV4KTsKIAl9CiAKLQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgZmluZCAlcyIsIGlmbmFtZSk7CisJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgZmluZCAlcyIsIGlmbmFtZSk7CiAJcmV0dXJuICgtMSk7CiB9CiAKQEAgLTE3MjMsMTcgKzE3OTcsMTcgQEAKIAlyZWdpc3RlciBpbnQgY2M7CiAKIAlpZiAobHNlZWsoZmQsIGFkZHIsIFNFRUtfU0VUKSA8IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImxzZWVrOiAlcyIsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImxzZWVrOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KIAljYyA9IHJlYWQoZmQsIGJ1ZiwgbGVuKTsKIAlpZiAoY2MgPCAwKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJyZWFkOiAlcyIsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlYWQ6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfSBlbHNlIGlmIChjYyAhPSBsZW4pIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNob3J0IHJlYWQgKCVkICE9ICVkKSIsIGNjLAorCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzaG9ydCByZWFkICglZCAhPSAlZCkiLCBjYywKIAkJICAgIGxlbik7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTE3NDIsMTQgKzE4MTYsMTQgQEAKICNlbmRpZgogCiBwY2FwX3QgKgotcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3BjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UgX1VfLCBjaGFyICplYnVmKQogewogCXBjYXBfdCAqcDsKICNpZmRlZiBETF9IUF9SQVdETFMKIAlzdHJ1Y3QgcGNhcF9kbHBpICpwZDsKICNlbmRpZgogCi0JcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfZGxwaSkpOworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9kbHBpKSk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIChOVUxMKTsKIApkaWZmIC0tZ2l0IGEvcGNhcC1kb3MuYyBiL3BjYXAtZG9zLmMKaW5kZXggODYzMmNlZS4uZWE2YjIyNSAxMDA2NDQKLS0tIGEvcGNhcC1kb3MuYworKysgYi9wY2FwLWRvcy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiBET1MtbGlicGNhcAotICogIFBvcnRlZCB0byBET1MvRE9TWCBieSBHLiBWYW5lbSA8Z3ZhbmVtQGJyb2FkcGFyay5ubz4KKyAqICBQb3J0ZWQgdG8gRE9TL0RPU1ggYnkgRy4gVmFuZW0gPGd2YW5lbUB5YWhvby5ubz4KICAqCiAgKiAgcGNhcC1kb3MuYzogSW50ZXJmYWNlIHRvIFBLVERSVlIsIE5ESVMyIGFuZCAzMi1iaXQgcG1vZGUKICAqICAgICAgICAgICAgICBuZXR3b3JrIGRyaXZlcnMuCkBAIC0xNDUsMTUgKzE0NSwxNSBAQAogICogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gTVMtRE9TLgogICovCiBzdHJ1Y3QgcGNhcF9kb3MgewotCXZvaWQgKCp3YWl0X3Byb2MpKHZvaWQpOyAvKiAgICAgICAgICBjYWxsIHByb2Mgd2hpbGUgd2FpdGluZyAqLworCXZvaWQgKCp3YWl0X3Byb2MpKHZvaWQpOyAvKiBjYWxsIHByb2Mgd2hpbGUgd2FpdGluZyAqLwogCXN0cnVjdCBwY2FwX3N0YXQgc3RhdDsKIH07CiAKLXBjYXBfdCAqcGNhcF9jcmVhdGVfaW50ZXJmYWNlIChjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCitwY2FwX3QgKnBjYXBfY3JlYXRlX2ludGVyZmFjZSAoY29uc3QgY2hhciAqZGV2aWNlIF9VXywgY2hhciAqZWJ1ZikKIHsKIAlwY2FwX3QgKnA7CiAKLQlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9kb3MpKTsKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfZG9zKSk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIChOVUxMKTsKIApAQCAtMTY3LDggKzE2Nyw2IEBACiAgKi8KIHN0YXRpYyBpbnQgcGNhcF9hY3RpdmF0ZV9kb3MgKHBjYXBfdCAqcGNhcCkKIHsKLSAgc3RydWN0IHBjYXBfZG9zICpwY2FwZCA9IHBjYXAtPnByaXY7Ci0KICAgaWYgKHBjYXAtPm9wdC5yZm1vbikgewogICAgIC8qCiAgICAgICogTm8gbW9uaXRvciBtb2RlIG9uIERPUy4KQEAgLTE4OCwyMyArMTg2LDI2IEBACiAgIHBjYXAtPnN0YXRzX29wICAgICAgICAgID0gcGNhcF9zdGF0c19kb3M7CiAgIHBjYXAtPmluamVjdF9vcCAgICAgICAgID0gcGNhcF9zZW5kcGFja2V0X2RvczsKICAgcGNhcC0+c2V0ZmlsdGVyX29wICAgICAgPSBwY2FwX3NldGZpbHRlcl9kb3M7Ci0gIHBjYXAtPnNldGRpcmVjdGlvbl9vcCAgID0gTlVMTDsgLyogTm90IGltcGxlbWVudGVkLiovCisgIHBjYXAtPnNldGRpcmVjdGlvbl9vcCAgID0gTlVMTDsgIC8qIE5vdCBpbXBsZW1lbnRlZC4qLwogICBwY2FwLT5mZCAgICAgICAgICAgICAgICA9ICsrcmVmX2NvdW50OwogCisgIHBjYXAtPmJ1ZnNpemUgPSBFVEhfTUFYKzEwMDsgICAgIC8qIGFkZCBzb21lIG1hcmdpbiAqLworICBwY2FwLT5idWZmZXIgPSBjYWxsb2MgKHBjYXAtPmJ1ZnNpemUsIDEpOworCiAgIGlmIChwY2FwLT5mZCA9PSAxKSAgLyogZmlyc3QgdGltZSB3ZSdyZSBjYWxsZWQgKi8KICAgewotICAgIGlmICghaW5pdF93YXR0MzIocGNhcCwgcGNhcC0+b3B0LnNvdXJjZSwgcGNhcC0+ZXJyYnVmKSB8fAotICAgICAgICAhZmlyc3RfaW5pdChwY2FwLT5vcHQuc291cmNlLCBwY2FwLT5lcnJidWYsIHBjYXAtPm9wdC5wcm9taXNjKSkKKyAgICBpZiAoIWluaXRfd2F0dDMyKHBjYXAsIHBjYXAtPm9wdC5kZXZpY2UsIHBjYXAtPmVycmJ1ZikgfHwKKyAgICAgICAgIWZpcnN0X2luaXQocGNhcC0+b3B0LmRldmljZSwgcGNhcC0+ZXJyYnVmLCBwY2FwLT5vcHQucHJvbWlzYykpCiAgICAgewogICAgICAgcmV0dXJuIChQQ0FQX0VSUk9SKTsKICAgICB9CiAgICAgYXRleGl0IChjbG9zZV9kcml2ZXIpOwogICB9Ci0gIGVsc2UgaWYgKHN0cmljbXAoYWN0aXZlX2Rldi0+bmFtZSxwY2FwLT5vcHQuc291cmNlKSkKKyAgZWxzZSBpZiAoc3RyaWNtcChhY3RpdmVfZGV2LT5uYW1lLHBjYXAtPm9wdC5kZXZpY2UpKQogICB7Ci0gICAgc25wcmludGYgKHBjYXAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLSAgICAgICAgICAgICAgIkNhbm5vdCB1c2UgZGlmZmVyZW50IGRldmljZXMgc2ltdWx0YW5lb3VzbHkgIgotICAgICAgICAgICAgICAiKGAlcycgdnMuIGAlcycpIiwgYWN0aXZlX2Rldi0+bmFtZSwgcGNhcC0+b3B0LnNvdXJjZSk7CisgICAgcGNhcF9zbnByaW50ZiAocGNhcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorICAgICAgICAgICAgICAgICAgICJDYW5ub3QgdXNlIGRpZmZlcmVudCBkZXZpY2VzIHNpbXVsdGFuZW91c2x5ICIKKyAgICAgICAgICAgICAgICAgICAiKGAlcycgdnMuIGAlcycpIiwgYWN0aXZlX2Rldi0+bmFtZSwgcGNhcC0+b3B0LmRldmljZSk7CiAgICAgcmV0dXJuIChQQ0FQX0VSUk9SKTsKICAgfQogICBoYW5kbGVfdG9fZGV2aWNlIFtwY2FwLT5mZC0xXSA9IGFjdGl2ZV9kZXY7CkBAIC0yMjEsNyArMjIyLDYgQEAKICAgc3RydWN0IHBjYXBfZG9zICpwZCA9IHAtPnByaXY7CiAgIHN0cnVjdCBwY2FwX3BrdGhkciBwY2FwOwogICBzdHJ1Y3QgdGltZXZhbCAgICAgbm93LCBleHBpcnkgPSB7IDAsMCB9OwotICBCWVRFICAqcnhfYnVmOwogICBpbnQgICAgcnhfbGVuID0gMDsKIAogICBpZiAocC0+b3B0LnRpbWVvdXQgPiAwKQpAQCAtMjUzLDEzICsyNTMsMTEgQEAKICAgICBpZiAoZGV2LT5wZWVrX3J4X2J1ZikKICAgICB7CiAgICAgICBQQ0FQX0FTU0VSVCAoZGV2LT5yZWxlYXNlX3J4X2J1Zik7Ci0gICAgICByeF9sZW4gPSAoKmRldi0+cGVla19yeF9idWYpICgmcnhfYnVmKTsKKyAgICAgIHJ4X2xlbiA9ICgqZGV2LT5wZWVrX3J4X2J1ZikgKCZwLT5idWZmZXIpOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgQllURSBidWYgW0VUSF9NQVgrMTAwXTsgLyogYWRkIHNvbWUgbWFyZ2luICovCi0gICAgICByeF9sZW4gPSAoKmRldi0+Y29weV9yeF9idWYpIChidWYsIHAtPnNuYXBzaG90KTsKLSAgICAgIHJ4X2J1ZiA9IGJ1ZjsKKyAgICAgIHJ4X2xlbiA9ICgqZGV2LT5jb3B5X3J4X2J1ZikgKHAtPmJ1ZmZlciwgcC0+c25hcHNob3QpOwogICAgIH0KIAogICAgIGlmIChyeF9sZW4gPiAwKSAgLyogZ290IGEgcGFja2V0ICovCkBAIC0yNzIsNyArMjcwLDcgQEAKICAgICAgIHBjYXAubGVuICAgID0gcnhfbGVuOwogCiAgICAgICBpZiAoY2FsbGJhY2sgJiYKLSAgICAgICAgICAoIXAtPmZjb2RlLmJmX2luc25zIHx8IGJwZl9maWx0ZXIocC0+ZmNvZGUuYmZfaW5zbnMsIHJ4X2J1ZiwgcGNhcC5sZW4sIHBjYXAuY2FwbGVuKSkpCisgICAgICAgICAgKCFwLT5mY29kZS5iZl9pbnNucyB8fCBicGZfZmlsdGVyKHAtPmZjb2RlLmJmX2luc25zLCBwLT5idWZmZXIsIHBjYXAubGVuLCBwY2FwLmNhcGxlbikpKQogICAgICAgewogICAgICAgICBmaWx0ZXJfY291bnQrKzsKIApAQCAtMjgwLDExICsyNzgsMTEgQEAKICAgICAgICAgICogY2FwdHVyZS4KICAgICAgICAgICovCiAgICAgICAgIGdldHRpbWVvZmRheTIgKCZwY2FwLnRzLCBOVUxMKTsKLSAgICAgICAgKCpjYWxsYmFjaykgKGRhdGEsICZwY2FwLCByeF9idWYpOworICAgICAgICAoKmNhbGxiYWNrKSAoZGF0YSwgJnBjYXAsIHAtPmJ1ZmZlcik7CiAgICAgICB9CiAKICAgICAgIGlmIChkZXYtPnJlbGVhc2VfcnhfYnVmKQotICAgICAgICAoKmRldi0+cmVsZWFzZV9yeF9idWYpIChyeF9idWYpOworICAgICAgICAoKmRldi0+cmVsZWFzZV9yeF9idWYpIChwLT5idWZmZXIpOwogCiAgICAgICBpZiAocGNhcF9wa3RfZGVidWcgPiAwKQogICAgICAgewpAQCAtMjk2LDYgKzI5NCwxOCBAQAogICAgICAgcmV0dXJuICgxKTsKICAgICB9CiAKKyAgICAvKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworICAgICAqLworICAgIGlmIChwLT5icmVha19sb29wKSB7CisgICAgICAvKgorICAgICAgICogWWVzIC0gY2xlYXIgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBpdAorICAgICAgICogaGFzLCBhbmQgcmV0dXJuIC0yIHRvIGluZGljYXRlIHRoYXQgd2Ugd2VyZQorICAgICAgICogdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisgICAgICAgKi8KKyAgICAgIHAtPmJyZWFrX2xvb3AgPSAwOworICAgICAgcmV0dXJuICgtMik7CisgICAgfQorCiAgICAgLyogSWYgbm90IHRvIHdhaXQgZm9yIGEgcGFja2V0IG9yIHBjYXBfY2xlYW51cF9kb3MoKSBjYWxsZWQgZnJvbQogICAgICAqIGUuZy4gU0lHSU5UIGhhbmRsZXIsIGV4aXQgbG9vcCBub3cuCiAgICAgICovCkBAIC0zMTEsOCArMzIxLDggQEAKICAgICBrYmhpdCgpOyAgICAvKiBhIHJlYWwgQ1BVIGhvZyAqLwogI2VuZGlmCiAKLSAgICBpZiAocC0+d2FpdF9wcm9jKQotICAgICAgKCpwLT53YWl0X3Byb2MpKCk7ICAgICAvKiBjYWxsIHlpZWxkIGZ1bmMgKi8KKyAgICBpZiAocGQtPndhaXRfcHJvYykKKyAgICAgICgqcGQtPndhaXRfcHJvYykoKTsgICAgIC8qIGNhbGwgeWllbGQgZnVuYyAqLwogICB9CiAKICAgaWYgKHJ4X2xlbiA8IDApICAgICAgICAgICAgLyogcmVjZWl2ZSBlcnJvciAqLwpAQCAtMzMwLDcgKzM0MCw2IEBACiBzdGF0aWMgaW50CiBwY2FwX3JlYWRfZG9zIChwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICpkYXRhKQogewotICBzdHJ1Y3QgcGNhcF9kb3MgKnBkID0gcC0+cHJpdjsKICAgaW50IHJjLCBudW0gPSAwOwogCiAgIHdoaWxlIChudW0gPD0gY250IHx8IFBBQ0tFVF9DT1VOVF9JU19VTkxJTUlURUQoY250KSkKQEAgLTQ0Miw3ICs0NTEsNyBAQAogewogICBzdHJ1Y3QgcGNhcF9kb3MgKnBkOwogCi0gIGlmIChwICYmICFleGNfb2NjdXJlZCkKKyAgaWYgKCFleGNfb2NjdXJlZCkKICAgewogICAgIHBkID0gcC0+cHJpdjsKICAgICBpZiAocGNhcF9zdGF0cyhwLE5VTEwpIDwgMCkKQEAgLTQ5NSw2ICs1MDQsOCBAQAogaW50IHBjYXBfbG9va3VwbmV0IChjb25zdCBjaGFyICpkZXZpY2UsIGJwZl91X2ludDMyICpsb2NhbG5ldCwKICAgICAgICAgICAgICAgICAgICAgYnBmX3VfaW50MzIgKm5ldG1hc2ssIGNoYXIgKmVycmJ1ZikKIHsKKyAgRFdPUkQgbWFzaywgbmV0OworCiAgIGlmICghX3dhdHRfaXNfaW5pdCkKICAgewogICAgIHN0cmNweSAoZXJyYnVmLCAicGNhcF9vcGVuX29mZmxpbmUoKSBvciBwY2FwX2FjdGl2YXRlKCkgbXVzdCBiZSAiCkBAIC01MDIsMjIgKzUxMywyNSBAQAogICAgIHJldHVybiAoLTEpOwogICB9CiAKLSAgKm5ldG1hc2sgID0gX3czMl9zaW5fbWFzazsKLSAgKmxvY2FsbmV0ID0gbXlfaXBfYWRkciAmICpuZXRtYXNrOwotICBpZiAoKmxvY2FsbmV0ID09IDApCisgIG1hc2sgID0gX3czMl9zaW5fbWFzazsKKyAgbmV0ID0gbXlfaXBfYWRkciAmIG1hc2s7CisgIGlmIChuZXQgPT0gMCkKICAgewogICAgIGlmIChJTl9DTEFTU0EoKm5ldG1hc2spKQotICAgICAgICpsb2NhbG5ldCA9IElOX0NMQVNTQV9ORVQ7CisgICAgICAgbmV0ID0gSU5fQ0xBU1NBX05FVDsKICAgICBlbHNlIGlmIChJTl9DTEFTU0IoKm5ldG1hc2spKQotICAgICAgICpsb2NhbG5ldCA9IElOX0NMQVNTQl9ORVQ7CisgICAgICAgbmV0ID0gSU5fQ0xBU1NCX05FVDsKICAgICBlbHNlIGlmIChJTl9DTEFTU0MoKm5ldG1hc2spKQotICAgICAgICpsb2NhbG5ldCA9IElOX0NMQVNTQ19ORVQ7CisgICAgICAgbmV0ID0gSU5fQ0xBU1NDX05FVDsKICAgICBlbHNlCiAgICAgewotICAgICAgc3ByaW50ZiAoZXJyYnVmLCAiaW5ldCBjbGFzcyBmb3IgMHglbHggdW5rbm93biIsICpuZXRtYXNrKTsKKyAgICAgIHBjYXBfc25wcmludGYgKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImluZXQgY2xhc3MgZm9yIDB4JWx4IHVua25vd24iLCBtYXNrKTsKICAgICAgIHJldHVybiAoLTEpOwogICAgIH0KICAgfQorICAqbG9jYWxuZXQgPSBodG9ubCAobmV0KTsKKyAgKm5ldG1hc2sgPSBodG9ubCAobWFzayk7CisKICAgQVJHU1VTRUQgKGRldmljZSk7CiAgIHJldHVybiAoMCk7CiB9CkBAIC01MjUsMTcgKzUzOSwxNyBAQAogLyoKICAqIEdldCBhIGxpc3Qgb2YgYWxsIGludGVyZmFjZXMgdGhhdCBhcmUgcHJlc2VudCBhbmQgdGhhdCB3ZSBwcm9iZSBva2F5LgogICogUmV0dXJucyAtMSBvbiBlcnJvciwgMCBvdGhlcndpc2UuCi0gKiBUaGUgbGlzdCwgYXMgcmV0dXJuZWQgdGhyb3VnaCAiYWxsZGV2c3AiLCBtYXkgYmUgbnVsbCBpZiBubyBpbnRlcmZhY2VzCisgKiBUaGUgbGlzdCwgYXMgcmV0dXJuZWQgdGhyb3VnaCAiYWxsZGV2c3AiLCBtYXkgYmUgTlVMTCBpZiBubyBpbnRlcmZhY2VzCiAgKiB3ZXJlIHVwIGFuZCBjb3VsZCBiZSBvcGVuZWQuCiAgKi8KLWludCBwY2FwX2ZpbmRhbGxkZXZzIChwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoraW50IHBjYXBfcGxhdGZvcm1fZmluZGRldnMgIChwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQogewogICBzdHJ1Y3QgZGV2aWNlICAgICAqZGV2OwotICBzdHJ1Y3Qgc29ja2FkZHJfbGwgc2FfbGxfMSwgc2FfbGxfMjsKKyAgc3RydWN0IHNvY2thZGRyX2luIHNhX2xsXzEsIHNhX2xsXzI7CiAgIHN0cnVjdCBzb2NrYWRkciAgICphZGRyLCAqbmV0bWFzaywgKmJyb2FkYWRkciwgKmRzdGFkZHI7CiAgIHBjYXBfaWZfdCAqZGV2bGlzdCA9IE5VTEw7CiAgIGludCAgICAgICByZXQgPSAwOwotICBzaXplX3QgICAgYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCk7CisgIHNpemVfdCAgICBhZGRyX3NpemUgPSBzaXplb2YoKmFkZHIpOwogCiAgIGZvciAoZGV2ID0gKHN0cnVjdCBkZXZpY2UqKWRldl9iYXNlOyBkZXY7IGRldiA9IGRldi0+bmV4dCkKICAgewpAQCAtNTUwLDE0ICs1NjQsMTQgQEAKIAogICAgIG1lbXNldCAoJnNhX2xsXzEsIDAsIHNpemVvZihzYV9sbF8xKSk7CiAgICAgbWVtc2V0ICgmc2FfbGxfMiwgMCwgc2l6ZW9mKHNhX2xsXzIpKTsKLSAgICBzYV9sbF8xLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7Ci0gICAgc2FfbGxfMi5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworICAgIHNhX2xsXzEuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgc2FfbGxfMi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKIAogICAgIGFkZHIgICAgICA9IChzdHJ1Y3Qgc29ja2FkZHIqKSAmc2FfbGxfMTsKICAgICBuZXRtYXNrICAgPSAoc3RydWN0IHNvY2thZGRyKikgJnNhX2xsXzE7CiAgICAgZHN0YWRkciAgID0gKHN0cnVjdCBzb2NrYWRkciopICZzYV9sbF8xOwogICAgIGJyb2FkYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIqKSAmc2FfbGxfMjsKLSAgICBtZW1zZXQgKCZzYV9sbF8yLnNsbF9hZGRyLCAweEZGLCBzaXplb2Yoc2FfbGxfMi5zbGxfYWRkcikpOworICAgIG1lbXNldCAoJnNhX2xsXzIuc2luX2FkZHIsIDB4RkYsIHNpemVvZihzYV9sbF8yLnNpbl9hZGRyKSk7CiAKICAgICBpZiAocGNhcF9hZGRfaWYoJmRldmxpc3QsIGRldi0+bmFtZSwgZGV2LT5mbGFncywKICAgICAgICAgICAgICAgICAgICAgZGV2LT5sb25nX25hbWUsIGVycmJ1ZikgPCAwKQpAQCAtNTY1LDEzICs1NzksMTUgQEAKICAgICAgIHJldCA9IC0xOwogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmIChhZGRfYWRkcl90b19pZmxpc3QoJmRldmxpc3QsZGV2LT5uYW1lLCBkZXYtPmZsYWdzLCBhZGRyLCBhZGRyX3NpemUsCisjaWYgMCAgIC8qIFBrdCBkcml2ZXJzIHNob3VsZCBoYXZlIG5vIGFkZHJlc3NlcyAqLworICAgIGlmIChhZGRfYWRkcl90b19pZmxpc3QoJmRldmxpc3QsIGRldi0+bmFtZSwgZGV2LT5mbGFncywgYWRkciwgYWRkcl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0bWFzaywgYWRkcl9zaXplLCBicm9hZGFkZHIsIGFkZHJfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGFkZHIsIGFkZHJfc2l6ZSwgZXJyYnVmKSA8IDApCiAgICAgewogICAgICAgcmV0ID0gLTE7CiAgICAgICBicmVhazsKICAgICB9CisjZW5kaWYKICAgfQogCiAgIGlmIChkZXZsaXN0ICYmIHJldCA8IDApCkBAIC02MDUsMTIgKzYyMSwxMiBAQAogICovCiB2b2lkIHBjYXBfc2V0X3dhaXQgKHBjYXBfdCAqcCwgdm9pZCAoKnlpZWxkKSh2b2lkKSwgaW50IHdhaXQpCiB7Ci0gIHN0cnVjdCBwY2FwX2RvcyAqcGQ7CiAgIGlmIChwKQogICB7Ci0gICAgcGQgICAgICAgICAgICAgICAgICAgPSBwLT5wcml2OwotICAgIHBkLT53YWl0X3Byb2MgICAgICAgID0geWllbGQ7Ci0gICAgcC0+b3B0LnRpbWVvdXQgICAgICAgID0gd2FpdDsKKyAgICBzdHJ1Y3QgcGNhcF9kb3MgKnBkID0gcC0+cHJpdjsKKworICAgIHBkLT53YWl0X3Byb2MgID0geWllbGQ7CisgICAgcC0+b3B0LnRpbWVvdXQgPSB3YWl0OwogICB9CiB9CiAKQEAgLTYzNSw3ICs2NTEsNyBAQAogCiAgICAgICBpZiAoISgqZGV2LT5wcm9iZSkoZGV2KSkgICAgLyogY2FsbCB0aGUgeHhfcHJvYmUoKSBmdW5jdGlvbiAqLwogICAgICAgewotICAgICAgICBzcHJpbnRmIChlYnVmLCAiZmFpbGVkIHRvIGRldGVjdCBkZXZpY2UgYCVzJyIsIGRldl9uYW1lKTsKKyAgICAgICAgcGNhcF9zbnByaW50ZiAoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImZhaWxlZCB0byBkZXRlY3QgZGV2aWNlIGAlcyciLCBkZXZfbmFtZSk7CiAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICB9CiAgICAgICBwcm9iZWRfZGV2ID0gZGV2OyAgLyogZGV2aWNlIGlzIHByb2JlZCBva2F5IGFuZCBtYXkgYmUgdXNlZCAqLwpAQCAtNjU3LDcgKzY3Myw3IEBACiAKICAgICBpZiAoISgqZGV2LT5vcGVuKShkZXYpKQogICAgIHsKLSAgICAgIHNwcmludGYgKGVidWYsICJmYWlsZWQgdG8gYWN0aXZhdGUgZGV2aWNlIGAlcyciLCBkZXZfbmFtZSk7CisgICAgICBwY2FwX3NucHJpbnRmIChlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZmFpbGVkIHRvIGFjdGl2YXRlIGRldmljZSBgJXMnIiwgZGV2X25hbWUpOwogICAgICAgaWYgKHBrdEluZm8uZXJyb3IgJiYgIXN0cm5jbXAoZGV2LT5uYW1lLCJwa3QiLDMpKQogICAgICAgewogICAgICAgICBzdHJjYXQgKGVidWYsICI6ICIpOwpAQCAtNjc5LDE0ICs2OTUsMTQgQEAKICAgICovCiAgIGlmICghZGV2KQogICB7Ci0gICAgc3ByaW50ZiAoZWJ1ZiwgImRldmljZSBgJXMnIG5vdCBzdXBwb3J0ZWQiLCBkZXZfbmFtZSk7CisgICAgcGNhcF9zbnByaW50ZiAoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRldmljZSBgJXMnIG5vdCBzdXBwb3J0ZWQiLCBkZXZfbmFtZSk7CiAgICAgcmV0dXJuIChOVUxMKTsKICAgfQogCiBub3RfcHJvYmVkOgogICBpZiAoIXByb2JlZF9kZXYpCiAgIHsKLSAgICBzcHJpbnRmIChlYnVmLCAiZGV2aWNlIGAlcycgbm90IHByb2JlZCIsIGRldl9uYW1lKTsKKyAgICBwY2FwX3NucHJpbnRmIChlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGV2aWNlIGAlcycgbm90IHByb2JlZCIsIGRldl9uYW1lKTsKICAgICByZXR1cm4gKE5VTEwpOwogICB9CiAgIHJldHVybiAoZGV2KTsKQEAgLTc1Niw3ICs3NzIsNyBAQAogICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ2F0Y2hpbmcgc2lnbmFsICVkLlxuIiwgc2lnKTsKICAgfQogICBleGNfb2NjdXJlZCA9IDE7Ci0gIHBjYXBfY2xlYW51cF9kb3MgKE5VTEwpOworICBjbG9zZV9kcml2ZXIoKTsKIH0KICNlbmRpZiAgLyogX19ESkdQUF9fICovCiAKQEAgLTkzMyw3ICs5NDksNyBAQAogICBpZiAoX3dhdHRfaXNfaW5pdCkKICAgICAgc29ja19leGl0KCk7CiAKLSAgZW52ID0gZ2V0ZW52ICgiUENBUF9ERUJVRyIpOworICBlbnYgPSBnZXRlbnYgKCJQQ0FQX1RSQUNFIik7CiAgIGlmIChlbnYgJiYgYXRvaShlbnYpID4gMCAmJgogICAgICAgcGNhcF9wa3RfZGVidWcgPCAwKSAgIC8qIGlmIG5vdCBhbHJlYWR5IHNldCAqLwogICB7CkBAIC05NzMsNyArOTg5LDcgQEAKICAgfQogICBlbHNlIGlmIChyYyAmJiB1c2luZ19wa3RkcnYpCiAgIHsKLSAgICBzcHJpbnRmIChlcnJfYnVmLCAic29ja19pbml0KCkgZmFpbGVkLCBjb2RlICVkIiwgcmMpOworICAgIHBjYXBfc25wcmludGYgKGVycl9idWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzb2NrX2luaXQoKSBmYWlsZWQsIGNvZGUgJWQiLCByYyk7CiAgICAgcmV0dXJuICgwKTsKICAgfQogCkBAIC0xMDUzLDkgKzEwNjksOSBAQAogICogcGNhcF9jb25maWdfaG9vaygpIGlzIGFuIGV4dGVuc2lvbiB0byBhcHBsaWNhdGlvbidzIGNvbmZpZwogICogaGFuZGxpbmcuIFVzZXMgV2F0dC0zMidzIGNvbmZpZy10YWJsZSBmdW5jdGlvbi4KICAqLwotaW50IHBjYXBfY29uZmlnX2hvb2sgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoraW50IHBjYXBfY29uZmlnX2hvb2sgKGNvbnN0IGNoYXIgKmtleXdvcmQsIGNvbnN0IGNoYXIgKnZhbHVlKQogewotICByZXR1cm4gcGFyc2VfY29uZmlnX3RhYmxlIChkZWJ1Z190YWIsIE5VTEwsIG5hbWUsIHZhbHVlKTsKKyAgcmV0dXJuIHBhcnNlX2NvbmZpZ190YWJsZSAoZGVidWdfdGFiLCBOVUxMLCBrZXl3b3JkLCB2YWx1ZSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9wY2FwLWZpbHRlci5tYW5taXNjIGIvcGNhcC1maWx0ZXIubWFubWlzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWJmMzg3Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1maWx0ZXIubWFubWlzYwpAQCAtMCwwICsxLDEwMzIgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQLUZJTFRFUiA3ICIzIEF1Z3VzdCAyMDE1IgorLlNIIE5BTUUKK3BjYXAtZmlsdGVyIFwtIHBhY2tldCBmaWx0ZXIgc3ludGF4CisuYnIKKy5hZAorLlNIIERFU0NSSVBUSU9OCisuTFAKKy5CIHBjYXBfY29tcGlsZSgpCitpcyB1c2VkIHRvIGNvbXBpbGUgYSBzdHJpbmcgaW50byBhIGZpbHRlciBwcm9ncmFtLgorVGhlIHJlc3VsdGluZyBmaWx0ZXIgcHJvZ3JhbSBjYW4gdGhlbiBiZSBhcHBsaWVkIHRvCitzb21lIHN0cmVhbSBvZiBwYWNrZXRzIHRvIGRldGVybWluZSB3aGljaCBwYWNrZXRzIHdpbGwgYmUgc3VwcGxpZWQgdG8KKy5CUiBwY2FwX2xvb3AoKSAsCisuQlIgcGNhcF9kaXNwYXRjaCgpICwKKy5CUiBwY2FwX25leHQoKSAsCitvcgorLkJSIHBjYXBfbmV4dF9leCgpIC4KKy5MUAorVGhlIFxmSWZpbHRlciBleHByZXNzaW9uXGZQIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlCisuSVIgcHJpbWl0aXZlcyAuCitQcmltaXRpdmVzIHVzdWFsbHkgY29uc2lzdCBvZiBhbgorLkkgaWQKKyhuYW1lIG9yIG51bWJlcikgcHJlY2VkZWQgYnkgb25lIG9yIG1vcmUgcXVhbGlmaWVycy4KK1RoZXJlIGFyZSB0aHJlZQorZGlmZmVyZW50IGtpbmRzIG9mIHF1YWxpZmllcjoKKy5JUCBcZkl0eXBlXGZQCisuSSB0eXBlCitxdWFsaWZpZXJzIHNheSB3aGF0IGtpbmQgb2YgdGhpbmcgdGhlIGlkIG5hbWUgb3IgbnVtYmVyIHJlZmVycyB0by4KK1Bvc3NpYmxlIHR5cGVzIGFyZQorLkJSIGhvc3QgLAorLkIgbmV0ICwKKy5CIHBvcnQKK2FuZAorLkJSIHBvcnRyYW5nZSAuCitFLmcuLCBgaG9zdCBmb28nLCBgbmV0IDEyOC4zJywgYHBvcnQgMjAnLCBgcG9ydHJhbmdlIDYwMDAtNjAwOCcuCitJZiB0aGVyZSBpcyBubyB0eXBlCitxdWFsaWZpZXIsCisuQiBob3N0CitpcyBhc3N1bWVkLgorLklQIFxmSWRpclxmUAorLkkgZGlyCitxdWFsaWZpZXJzIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIHRyYW5zZmVyIGRpcmVjdGlvbiB0byBhbmQvb3IgZnJvbQorLklSIGlkIC4KK1Bvc3NpYmxlIGRpcmVjdGlvbnMgYXJlCisuQlIgc3JjICwKKy5CUiBkc3QgLAorLkJSICJzcmMgb3IgZHN0IiAsCisuQlIgInNyYyBhbmQgZHN0IiAsCisuQlIgcmEgLAorLkJSIHRhICwKKy5CUiBhZGRyMSAsCisuQlIgYWRkcjIgLAorLkJSIGFkZHIzICwKK2FuZAorLkJSIGFkZHI0IC4KK0UuZy4sIGBzcmMgZm9vJywgYGRzdCBuZXQgMTI4LjMnLCBgc3JjIG9yIGRzdCBwb3J0IGZ0cC1kYXRhJy4KK0lmCit0aGVyZSBpcyBubyBkaXIgcXVhbGlmaWVyLAorLkIgInNyYyBvciBkc3QiCitpcyBhc3N1bWVkLgorVGhlCisuQlIgcmEgLAorLkJSIHRhICwKKy5CUiBhZGRyMSAsCisuQlIgYWRkcjIgLAorLkJSIGFkZHIzICwKK2FuZAorLkIgYWRkcjQKK3F1YWxpZmllcnMgYXJlIG9ubHkgdmFsaWQgZm9yIElFRUUgODAyLjExIFdpcmVsZXNzIExBTiBsaW5rIGxheWVycy4KK0ZvciBzb21lIGxpbmsgbGF5ZXJzLCBzdWNoIGFzIFNMSVAgYW5kIHRoZSBgYGNvb2tlZCcnIExpbnV4IGNhcHR1cmUgbW9kZQordXNlZCBmb3IgdGhlIGBgYW55JycgZGV2aWNlIGFuZCBmb3Igc29tZSBvdGhlciBkZXZpY2UgdHlwZXMsIHRoZQorLkIgaW5ib3VuZAorYW5kCisuQiBvdXRib3VuZAorcXVhbGlmaWVycyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZGVzaXJlZCBkaXJlY3Rpb24uCisuSVAgXGZJcHJvdG9cZlAKKy5JIHByb3RvCitxdWFsaWZpZXJzIHJlc3RyaWN0IHRoZSBtYXRjaCB0byBhIHBhcnRpY3VsYXIgcHJvdG9jb2wuCitQb3NzaWJsZQorcHJvdG9zIGFyZToKKy5CUiBldGhlciAsCisuQlIgZmRkaSAsCisuQlIgdHIgLAorLkJSIHdsYW4gLAorLkJSIGlwICwKKy5CUiBpcDYgLAorLkJSIGFycCAsCisuQlIgcmFycCAsCisuQlIgZGVjbmV0ICwKKy5CIHRjcAorYW5kCisuQlIgdWRwIC4KK0UuZy4sIGBldGhlciBzcmMgZm9vJywgYGFycCBuZXQgMTI4LjMnLCBgdGNwIHBvcnQgMjEnLCBgdWRwIHBvcnRyYW5nZQorNzAwMC03MDA5JywgYHdsYW4gYWRkcjIgMDoyOjM6NDo1OjYnLgorSWYgdGhlcmUgaXMKK25vIHByb3RvIHF1YWxpZmllciwgYWxsIHByb3RvY29scyBjb25zaXN0ZW50IHdpdGggdGhlIHR5cGUgYXJlCithc3N1bWVkLgorRS5nLiwgYHNyYyBmb28nIG1lYW5zIGAoaXAgb3IgYXJwIG9yIHJhcnApIHNyYyBmb28nCisoZXhjZXB0IHRoZSBsYXR0ZXIgaXMgbm90IGxlZ2FsIHN5bnRheCksIGBuZXQgYmFyJyBtZWFucyBgKGlwIG9yCithcnAgb3IgcmFycCkgbmV0IGJhcicgYW5kIGBwb3J0IDUzJyBtZWFucyBgKHRjcCBvciB1ZHApIHBvcnQgNTMnLgorLkxQCitbYGZkZGknIGlzIGFjdHVhbGx5IGFuIGFsaWFzIGZvciBgZXRoZXInOyB0aGUgcGFyc2VyIHRyZWF0cyB0aGVtCitpZGVudGljYWxseSBhcyBtZWFuaW5nIGBgdGhlIGRhdGEgbGluayBsZXZlbCB1c2VkIG9uIHRoZSBzcGVjaWZpZWQKK25ldHdvcmsgaW50ZXJmYWNlLicnICBGRERJIGhlYWRlcnMgY29udGFpbiBFdGhlcm5ldC1saWtlIHNvdXJjZQorYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcywgYW5kIG9mdGVuIGNvbnRhaW4gRXRoZXJuZXQtbGlrZSBwYWNrZXQKK3R5cGVzLCBzbyB5b3UgY2FuIGZpbHRlciBvbiB0aGVzZSBGRERJIGZpZWxkcyBqdXN0IGFzIHdpdGggdGhlCithbmFsb2dvdXMgRXRoZXJuZXQgZmllbGRzLgorRkRESSBoZWFkZXJzIGFsc28gY29udGFpbiBvdGhlciBmaWVsZHMsCitidXQgeW91IGNhbm5vdCBuYW1lIHRoZW0gZXhwbGljaXRseSBpbiBhIGZpbHRlciBleHByZXNzaW9uLgorLkxQCitTaW1pbGFybHksIGB0cicgYW5kIGB3bGFuJyBhcmUgYWxpYXNlcyBmb3IgYGV0aGVyJzsgdGhlIHByZXZpb3VzCitwYXJhZ3JhcGgncyBzdGF0ZW1lbnRzIGFib3V0IEZEREkgaGVhZGVycyBhbHNvIGFwcGx5IHRvIFRva2VuIFJpbmcKK2FuZCA4MDIuMTEgd2lyZWxlc3MgTEFOIGhlYWRlcnMuICBGb3IgODAyLjExIGhlYWRlcnMsIHRoZSBkZXN0aW5hdGlvbgorYWRkcmVzcyBpcyB0aGUgREEgZmllbGQgYW5kIHRoZSBzb3VyY2UgYWRkcmVzcyBpcyB0aGUgU0EgZmllbGQ7IHRoZQorQlNTSUQsIFJBLCBhbmQgVEEgZmllbGRzIGFyZW4ndCB0ZXN0ZWQuXQorLkxQCitJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUsIHRoZXJlIGFyZSBzb21lIHNwZWNpYWwgYHByaW1pdGl2ZScga2V5d29yZHMKK3RoYXQgZG9uJ3QgZm9sbG93IHRoZSBwYXR0ZXJuOgorLkJSIGdhdGV3YXkgLAorLkJSIGJyb2FkY2FzdCAsCisuQlIgbGVzcyAsCisuQiBncmVhdGVyCithbmQgYXJpdGhtZXRpYyBleHByZXNzaW9ucy4KK0FsbCBvZiB0aGVzZSBhcmUgZGVzY3JpYmVkIGJlbG93LgorLkxQCitNb3JlIGNvbXBsZXggZmlsdGVyIGV4cHJlc3Npb25zIGFyZSBidWlsdCB1cCBieSB1c2luZyB0aGUgd29yZHMKKy5CUiBhbmQgLAorLkIgb3IKK2FuZAorLkIgbm90Cit0byBjb21iaW5lIHByaW1pdGl2ZXMuCitFLmcuLCBgaG9zdCBmb28gYW5kIG5vdCBwb3J0IGZ0cCBhbmQgbm90IHBvcnQgZnRwLWRhdGEnLgorVG8gc2F2ZSB0eXBpbmcsIGlkZW50aWNhbCBxdWFsaWZpZXIgbGlzdHMgY2FuIGJlIG9taXR0ZWQuCitFLmcuLAorYHRjcCBkc3QgcG9ydCBmdHAgb3IgZnRwLWRhdGEgb3IgZG9tYWluJyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzCitgdGNwIGRzdCBwb3J0IGZ0cCBvciB0Y3AgZHN0IHBvcnQgZnRwLWRhdGEgb3IgdGNwIGRzdCBwb3J0IGRvbWFpbicuCisuTFAKK0FsbG93YWJsZSBwcmltaXRpdmVzIGFyZToKKy5JUCAiXGZCZHN0IGhvc3QgXGZJaG9zdFxmUiIKK1RydWUgaWYgdGhlIElQdjQvdjYgZGVzdGluYXRpb24gZmllbGQgb2YgdGhlIHBhY2tldCBpcyBcZklob3N0XGZQLAord2hpY2ggbWF5IGJlIGVpdGhlciBhbiBhZGRyZXNzIG9yIGEgbmFtZS4KKy5JUCAiXGZCc3JjIGhvc3QgXGZJaG9zdFxmUiIKK1RydWUgaWYgdGhlIElQdjQvdjYgc291cmNlIGZpZWxkIG9mIHRoZSBwYWNrZXQgaXMgXGZJaG9zdFxmUC4KKy5JUCAiXGZCaG9zdCBcZklob3N0XGZQIgorVHJ1ZSBpZiBlaXRoZXIgdGhlIElQdjQvdjYgc291cmNlIG9yIGRlc3RpbmF0aW9uIG9mIHRoZSBwYWNrZXQgaXMgXGZJaG9zdFxmUC4KKy5JUAorQW55IG9mIHRoZSBhYm92ZSBob3N0IGV4cHJlc3Npb25zIGNhbiBiZSBwcmVwZW5kZWQgd2l0aCB0aGUga2V5d29yZHMsCitcZkJpcFxmUCwgXGZCYXJwXGZQLCBcZkJyYXJwXGZQLCBvciBcZkJpcDZcZlAgYXMgaW46CisuaW4gKy41aQorLm5mCitcZkJpcCBob3N0IFxmSWhvc3RcZlIKKy5maQorLmluIC0uNWkKK3doaWNoIGlzIGVxdWl2YWxlbnQgdG86CisuaW4gKy41aQorLm5mCitcZkJldGhlciBwcm90byBcZklcXGlwXGZCIGFuZCBob3N0IFxmSWhvc3RcZlIKKy5maQorLmluIC0uNWkKK0lmIFxmSWhvc3RcZlIgaXMgYSBuYW1lIHdpdGggbXVsdGlwbGUgSVAgYWRkcmVzc2VzLCBlYWNoIGFkZHJlc3Mgd2lsbAorYmUgY2hlY2tlZCBmb3IgYSBtYXRjaC4KKy5JUCAiXGZCZXRoZXIgZHN0IFxmSWVob3N0XGZQIgorVHJ1ZSBpZiB0aGUgRXRoZXJuZXQgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBcZkllaG9zdFxmUC4KK1xmSUVob3N0XGZQCittYXkgYmUgZWl0aGVyIGEgbmFtZSBmcm9tIC9ldGMvZXRoZXJzIG9yIGEgbnVtYmVyIChzZWUKKy5JUiBldGhlcnMgKDNOKQorZm9yIG51bWVyaWMgZm9ybWF0KS4KKy5JUCAiXGZCZXRoZXIgc3JjIFxmSWVob3N0XGZQIgorVHJ1ZSBpZiB0aGUgRXRoZXJuZXQgc291cmNlIGFkZHJlc3MgaXMgXGZJZWhvc3RcZlAuCisuSVAgIlxmQmV0aGVyIGhvc3QgXGZJZWhvc3RcZlAiCitUcnVlIGlmIGVpdGhlciB0aGUgRXRoZXJuZXQgc291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgXGZJZWhvc3RcZlAuCisuSVAgIlxmQmdhdGV3YXlcZlAgXGZJaG9zdFxmUCIKK1RydWUgaWYgdGhlIHBhY2tldCB1c2VkIFxmSWhvc3RcZlAgYXMgYSBnYXRld2F5LgorSS5lLiwgdGhlIEV0aGVybmV0Citzb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyB3YXMgXGZJaG9zdFxmUCBidXQgbmVpdGhlciB0aGUgSVAgc291cmNlCitub3IgdGhlIElQIGRlc3RpbmF0aW9uIHdhcyBcZklob3N0XGZQLgorXGZJSG9zdFxmUCBtdXN0IGJlIGEgbmFtZSBhbmQKK211c3QgYmUgZm91bmQgYm90aCBieSB0aGUgbWFjaGluZSdzIGhvc3QtbmFtZS10by1JUC1hZGRyZXNzIHJlc29sdXRpb24KK21lY2hhbmlzbXMgKGhvc3QgbmFtZSBmaWxlLCBETlMsIE5JUywgZXRjLikgYW5kIGJ5IHRoZSBtYWNoaW5lJ3MKK2hvc3QtbmFtZS10by1FdGhlcm5ldC1hZGRyZXNzIHJlc29sdXRpb24gbWVjaGFuaXNtICgvZXRjL2V0aGVycywgZXRjLikuCisoQW4gZXF1aXZhbGVudCBleHByZXNzaW9uIGlzCisuaW4gKy41aQorLm5mCitcZkJldGhlciBob3N0IFxmSWVob3N0IFxmQmFuZCBub3QgaG9zdCBcZklob3N0XGZSCisuZmkKKy5pbiAtLjVpCit3aGljaCBjYW4gYmUgdXNlZCB3aXRoIGVpdGhlciBuYW1lcyBvciBudW1iZXJzIGZvciBcZklob3N0IC8gZWhvc3RcZlAuKQorVGhpcyBzeW50YXggZG9lcyBub3Qgd29yayBpbiBJUHY2LWVuYWJsZWQgY29uZmlndXJhdGlvbiBhdCB0aGlzIG1vbWVudC4KKy5JUCAiXGZCZHN0IG5ldCBcZkluZXRcZlIiCitUcnVlIGlmIHRoZSBJUHY0L3Y2IGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHBhY2tldCBoYXMgYSBuZXR3b3JrCitudW1iZXIgb2YgXGZJbmV0XGZQLgorXGZJTmV0XGZQIG1heSBiZSBlaXRoZXIgYSBuYW1lIGZyb20gdGhlIG5ldHdvcmtzIGRhdGFiYXNlCisoL2V0Yy9uZXR3b3JrcywgZXRjLikgb3IgYSBuZXR3b3JrIG51bWJlci4KK0FuIElQdjQgbmV0d29yayBudW1iZXIgY2FuIGJlIHdyaXR0ZW4gYXMgYSBkb3R0ZWQgcXVhZCAoZS5nLiwgMTkyLjE2OC4xLjApLAorZG90dGVkIHRyaXBsZSAoZS5nLiwgMTkyLjE2OC4xKSwgZG90dGVkIHBhaXIgKGUuZywgMTcyLjE2KSwgb3Igc2luZ2xlCitudW1iZXIgKGUuZy4sIDEwKTsgdGhlIG5ldG1hc2sgaXMgMjU1LjI1NS4yNTUuMjU1IGZvciBhIGRvdHRlZCBxdWFkCisod2hpY2ggbWVhbnMgdGhhdCBpdCdzIHJlYWxseSBhIGhvc3QgbWF0Y2gpLCAyNTUuMjU1LjI1NS4wIGZvciBhIGRvdHRlZAordHJpcGxlLCAyNTUuMjU1LjAuMCBmb3IgYSBkb3R0ZWQgcGFpciwgb3IgMjU1LjAuMC4wIGZvciBhIHNpbmdsZSBudW1iZXIuCitBbiBJUHY2IG5ldHdvcmsgbnVtYmVyIG11c3QgYmUgd3JpdHRlbiBvdXQgZnVsbHk7IHRoZSBuZXRtYXNrIGlzCitmZjpmZjpmZjpmZjpmZjpmZjpmZjpmZiwgc28gSVB2NiAibmV0d29yayIgbWF0Y2hlcyBhcmUgcmVhbGx5IGFsd2F5cworaG9zdCBtYXRjaGVzLCBhbmQgYSBuZXR3b3JrIG1hdGNoIHJlcXVpcmVzIGEgbmV0bWFzayBsZW5ndGguCisuSVAgIlxmQnNyYyBuZXQgXGZJbmV0XGZSIgorVHJ1ZSBpZiB0aGUgSVB2NC92NiBzb3VyY2UgYWRkcmVzcyBvZiB0aGUgcGFja2V0IGhhcyBhIG5ldHdvcmsKK251bWJlciBvZiBcZkluZXRcZlAuCisuSVAgIlxmQm5ldCBcZkluZXRcZlIiCitUcnVlIGlmIGVpdGhlciB0aGUgSVB2NC92NiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgcGFja2V0IGhhcyBhIG5ldHdvcmsKK251bWJlciBvZiBcZkluZXRcZlAuCisuSVAgIlxmQm5ldCBcZkluZXRcZlIgXGZCbWFzayBcZkluZXRtYXNrXGZSIgorVHJ1ZSBpZiB0aGUgSVB2NCBhZGRyZXNzIG1hdGNoZXMgXGZJbmV0XGZSIHdpdGggdGhlIHNwZWNpZmljIFxmSW5ldG1hc2tcZlIuCitNYXkgYmUgcXVhbGlmaWVkIHdpdGggXGZCc3JjXGZSIG9yIFxmQmRzdFxmUi4KK05vdGUgdGhhdCB0aGlzIHN5bnRheCBpcyBub3QgdmFsaWQgZm9yIElQdjYgXGZJbmV0XGZSLgorLklQICJcZkJuZXQgXGZJbmV0XGZSL1xmSWxlblxmUiIKK1RydWUgaWYgdGhlIElQdjQvdjYgYWRkcmVzcyBtYXRjaGVzIFxmSW5ldFxmUiB3aXRoIGEgbmV0bWFzayBcZklsZW5cZlIKK2JpdHMgd2lkZS4KK01heSBiZSBxdWFsaWZpZWQgd2l0aCBcZkJzcmNcZlIgb3IgXGZCZHN0XGZSLgorLklQICJcZkJkc3QgcG9ydCBcZklwb3J0XGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGlwL3RjcCwgaXAvdWRwLCBpcDYvdGNwIG9yIGlwNi91ZHAgYW5kIGhhcyBhCitkZXN0aW5hdGlvbiBwb3J0IHZhbHVlIG9mIFxmSXBvcnRcZlAuCitUaGUgXGZJcG9ydFxmUCBjYW4gYmUgYSBudW1iZXIgb3IgYSBuYW1lIHVzZWQgaW4gL2V0Yy9zZXJ2aWNlcyAoc2VlCisuSVIgdGNwICg0UCkKK2FuZAorLklSIHVkcCAoNFApKS4KK0lmIGEgbmFtZSBpcyB1c2VkLCBib3RoIHRoZSBwb3J0CitudW1iZXIgYW5kIHByb3RvY29sIGFyZSBjaGVja2VkLgorSWYgYSBudW1iZXIgb3IgYW1iaWd1b3VzIG5hbWUgaXMgdXNlZCwKK29ubHkgdGhlIHBvcnQgbnVtYmVyIGlzIGNoZWNrZWQgKGUuZy4sIFxmQmRzdCBwb3J0IDUxM1xmUiB3aWxsIHByaW50IGJvdGgKK3RjcC9sb2dpbiB0cmFmZmljIGFuZCB1ZHAvd2hvIHRyYWZmaWMsIGFuZCBcZkJwb3J0IGRvbWFpblxmUiB3aWxsIHByaW50Citib3RoIHRjcC9kb21haW4gYW5kIHVkcC9kb21haW4gdHJhZmZpYykuCisuSVAgIlxmQnNyYyBwb3J0IFxmSXBvcnRcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaGFzIGEgc291cmNlIHBvcnQgdmFsdWUgb2YgXGZJcG9ydFxmUC4KKy5JUCAiXGZCcG9ydCBcZklwb3J0XGZSIgorVHJ1ZSBpZiBlaXRoZXIgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBwb3J0IG9mIHRoZSBwYWNrZXQgaXMgXGZJcG9ydFxmUC4KKy5JUCAiXGZCZHN0IHBvcnRyYW5nZSBcZklwb3J0MVxmQi1cZklwb3J0MlxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBpcC90Y3AsIGlwL3VkcCwgaXA2L3RjcCBvciBpcDYvdWRwIGFuZCBoYXMgYQorZGVzdGluYXRpb24gcG9ydCB2YWx1ZSBiZXR3ZWVuIFxmSXBvcnQxXGZQIGFuZCBcZklwb3J0MlxmUC4KKy5JIHBvcnQxCithbmQKKy5JIHBvcnQyCithcmUgaW50ZXJwcmV0ZWQgaW4gdGhlIHNhbWUgZmFzaGlvbiBhcyB0aGUKKy5JIHBvcnQKK3BhcmFtZXRlciBmb3IKKy5CUiBwb3J0IC4KKy5JUCAiXGZCc3JjIHBvcnRyYW5nZSBcZklwb3J0MVxmQi1cZklwb3J0MlxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBoYXMgYSBzb3VyY2UgcG9ydCB2YWx1ZSBiZXR3ZWVuIFxmSXBvcnQxXGZQIGFuZAorXGZJcG9ydDJcZlAuCisuSVAgIlxmQnBvcnRyYW5nZSBcZklwb3J0MVxmQi1cZklwb3J0MlxmUiIKK1RydWUgaWYgZWl0aGVyIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gcG9ydCBvZiB0aGUgcGFja2V0IGlzIGJldHdlZW4KK1xmSXBvcnQxXGZQIGFuZCBcZklwb3J0MlxmUC4KKy5JUAorQW55IG9mIHRoZSBhYm92ZSBwb3J0IG9yIHBvcnQgcmFuZ2UgZXhwcmVzc2lvbnMgY2FuIGJlIHByZXBlbmRlZCB3aXRoCit0aGUga2V5d29yZHMsIFxmQnRjcFxmUCBvciBcZkJ1ZHBcZlAsIGFzIGluOgorLmluICsuNWkKKy5uZgorXGZCdGNwIHNyYyBwb3J0IFxmSXBvcnRcZlIKKy5maQorLmluIC0uNWkKK3doaWNoIG1hdGNoZXMgb25seSB0Y3AgcGFja2V0cyB3aG9zZSBzb3VyY2UgcG9ydCBpcyBcZklwb3J0XGZQLgorLklQICJcZkJsZXNzIFxmSWxlbmd0aFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBoYXMgYSBsZW5ndGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFxmSWxlbmd0aFxmUC4KK1RoaXMgaXMgZXF1aXZhbGVudCB0bzoKKy5pbiArLjVpCisubmYKK1xmQmxlbiA8PSBcZklsZW5ndGhcZlAuCisuZmkKKy5pbiAtLjVpCisuSVAgIlxmQmdyZWF0ZXIgXGZJbGVuZ3RoXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyBhIGxlbmd0aCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXGZJbGVuZ3RoXGZQLgorVGhpcyBpcyBlcXVpdmFsZW50IHRvOgorLmluICsuNWkKKy5uZgorXGZCbGVuID49IFxmSWxlbmd0aFxmUC4KKy5maQorLmluIC0uNWkKKy5JUCAiXGZCaXAgcHJvdG8gXGZJcHJvdG9jb2xcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NCBwYWNrZXQgKHNlZQorLklSIGlwICg0UCkpCitvZiBwcm90b2NvbCB0eXBlIFxmSXByb3RvY29sXGZQLgorXGZJUHJvdG9jb2xcZlAgY2FuIGJlIGEgbnVtYmVyIG9yIG9uZSBvZiB0aGUgbmFtZXMKK1xmQmljbXBcZlAsIFxmQmljbXA2XGZQLCBcZkJpZ21wXGZQLCBcZkJpZ3JwXGZQLCBcZkJwaW1cZlAsIFxmQmFoXGZQLAorXGZCZXNwXGZQLCBcZkJ2cnJwXGZQLCBcZkJ1ZHBcZlAsIG9yIFxmQnRjcFxmUC4KK05vdGUgdGhhdCB0aGUgaWRlbnRpZmllcnMgXGZCdGNwXGZQLCBcZkJ1ZHBcZlAsIGFuZCBcZkJpY21wXGZQIGFyZSBhbHNvCitrZXl3b3JkcyBhbmQgbXVzdCBiZSBlc2NhcGVkIHZpYSBiYWNrc2xhc2ggKFxcKS4KK05vdGUgdGhhdCB0aGlzIHByaW1pdGl2ZSBkb2VzIG5vdCBjaGFzZSB0aGUgcHJvdG9jb2wgaGVhZGVyIGNoYWluLgorLklQICJcZkJpcDYgcHJvdG8gXGZJcHJvdG9jb2xcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NiBwYWNrZXQgb2YgcHJvdG9jb2wgdHlwZSBcZklwcm90b2NvbFxmUC4KK05vdGUgdGhhdCB0aGlzIHByaW1pdGl2ZSBkb2VzIG5vdCBjaGFzZSB0aGUgcHJvdG9jb2wgaGVhZGVyIGNoYWluLgorLklQICJcZkJwcm90byBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY0IG9yIElQdjYgcGFja2V0IG9mIHByb3RvY29sIHR5cGUKK1xmSXByb3RvY29sXGZQLiAgTm90ZSB0aGF0IHRoaXMgcHJpbWl0aXZlIGRvZXMgbm90IGNoYXNlIHRoZSBwcm90b2NvbAoraGVhZGVyIGNoYWluLgorLklQICAiXGZCdGNwXGZSLCBcZkJ1ZHBcZlIsIFxmQmljbXBcZlIiCitBYmJyZXZpYXRpb25zIGZvcjoKKy5pbiArLjVpCisubmYKK1xmQnByb3RvIFxmSXBcZlJcZkIKKy5maQorLmluIC0uNWkKK3doZXJlIFxmSXBcZlIgaXMgb25lIG9mIHRoZSBhYm92ZSBwcm90b2NvbHMuCisuSVAgIlxmQmlwNiBwcm90b2NoYWluIFxmSXByb3RvY29sXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIElQdjYgcGFja2V0LAorYW5kIGNvbnRhaW5zIHByb3RvY29sIGhlYWRlciB3aXRoIHR5cGUgXGZJcHJvdG9jb2xcZlIKK2luIGl0cyBwcm90b2NvbCBoZWFkZXIgY2hhaW4uCitGb3IgZXhhbXBsZSwKKy5pbiArLjVpCisubmYKK1xmQmlwNiBwcm90b2NoYWluIDZcZlIKKy5maQorLmluIC0uNWkKK21hdGNoZXMgYW55IElQdjYgcGFja2V0IHdpdGggVENQIHByb3RvY29sIGhlYWRlciBpbiB0aGUgcHJvdG9jb2wgaGVhZGVyIGNoYWluLgorVGhlIHBhY2tldCBtYXkgY29udGFpbiwgZm9yIGV4YW1wbGUsCithdXRoZW50aWNhdGlvbiBoZWFkZXIsIHJvdXRpbmcgaGVhZGVyLCBvciBob3AtYnktaG9wIG9wdGlvbiBoZWFkZXIsCitiZXR3ZWVuIElQdjYgaGVhZGVyIGFuZCBUQ1AgaGVhZGVyLgorVGhlIEJQRiBjb2RlIGVtaXR0ZWQgYnkgdGhpcyBwcmltaXRpdmUgaXMgY29tcGxleCBhbmQKK2Nhbm5vdCBiZSBvcHRpbWl6ZWQgYnkgdGhlIEJQRiBvcHRpbWl6ZXIgY29kZSwgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgYnkKK2ZpbHRlciBlbmdpbmVzIGluIHRoZSBrZXJuZWwsIHNvIHRoaXMgY2FuIGJlIHNvbWV3aGF0IHNsb3csIGFuZCBtYXkKK2NhdXNlIG1vcmUgcGFja2V0cyB0byBiZSBkcm9wcGVkLgorLklQICJcZkJpcCBwcm90b2NoYWluIFxmSXByb3RvY29sXGZSIgorRXF1aXZhbGVudCB0byBcZkJpcDYgcHJvdG9jaGFpbiBcZklwcm90b2NvbFxmUiwgYnV0IHRoaXMgaXMgZm9yIElQdjQuCisuSVAgIlxmQnByb3RvY2hhaW4gXGZJcHJvdG9jb2xcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NCBvciBJUHY2IHBhY2tldCBvZiBwcm90b2NvbCB0eXBlCitcZklwcm90b2NvbFxmUC4gIE5vdGUgdGhhdCB0aGlzIHByaW1pdGl2ZSBjaGFzZXMgdGhlIHByb3RvY29sCitoZWFkZXIgY2hhaW4uCisuSVAgIlxmQmV0aGVyIGJyb2FkY2FzdFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBFdGhlcm5ldCBicm9hZGNhc3QgcGFja2V0LgorVGhlIFxmSWV0aGVyXGZQCitrZXl3b3JkIGlzIG9wdGlvbmFsLgorLklQICJcZkJpcCBicm9hZGNhc3RcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NCBicm9hZGNhc3QgcGFja2V0LgorSXQgY2hlY2tzIGZvciBib3RoIHRoZSBhbGwtemVyb2VzIGFuZCBhbGwtb25lcyBicm9hZGNhc3QgY29udmVudGlvbnMsCithbmQgbG9va3MgdXAgdGhlIHN1Ym5ldCBtYXNrIG9uIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMKK2JlaW5nIGRvbmUuCisuSVAKK0lmIHRoZSBzdWJuZXQgbWFzayBvZiB0aGUgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUKK2lzIG5vdCBhdmFpbGFibGUsIGVpdGhlciBiZWNhdXNlIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggY2FwdHVyZSBpcyBiZWluZworZG9uZSBoYXMgbm8gbmV0bWFzayBvciBiZWNhdXNlIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUgb24gdGhlIExpbnV4CisiYW55IiBpbnRlcmZhY2UsIHdoaWNoIGNhbiBjYXB0dXJlIG9uIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlLCB0aGlzCitjaGVjayB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4KKy5JUCAiXGZCZXRoZXIgbXVsdGljYXN0XGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEV0aGVybmV0IG11bHRpY2FzdCBwYWNrZXQuCitUaGUgXGZCZXRoZXJcZlAKK2tleXdvcmQgaXMgb3B0aW9uYWwuCitUaGlzIGlzIHNob3J0aGFuZCBmb3IgYFxmQmV0aGVyWzBdICYgMSAhPSAwXGZQJy4KKy5JUCAiXGZCaXAgbXVsdGljYXN0XGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIElQdjQgbXVsdGljYXN0IHBhY2tldC4KKy5JUCAiXGZCaXA2IG11bHRpY2FzdFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY2IG11bHRpY2FzdCBwYWNrZXQuCisuSVAgICJcZkJldGhlciBwcm90byBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBvZiBldGhlciB0eXBlIFxmSXByb3RvY29sXGZSLgorXGZJUHJvdG9jb2xcZlAgY2FuIGJlIGEgbnVtYmVyIG9yIG9uZSBvZiB0aGUgbmFtZXMKK1xmQmlwXGZQLCBcZkJpcDZcZlAsIFxmQmFycFxmUCwgXGZCcmFycFxmUCwgXGZCYXRhbGtcZlAsIFxmQmFhcnBcZlAsCitcZkJkZWNuZXRcZlAsIFxmQnNjYVxmUCwgXGZCbGF0XGZQLCBcZkJtb3BkbFxmUCwgXGZCbW9wcmNcZlAsCitcZkJpc29cZlAsIFxmQnN0cFxmUCwgXGZCaXB4XGZQLCBvciBcZkJuZXRiZXVpXGZQLgorTm90ZSB0aGVzZSBpZGVudGlmaWVycyBhcmUgYWxzbyBrZXl3b3JkcworYW5kIG11c3QgYmUgZXNjYXBlZCB2aWEgYmFja3NsYXNoIChcXCkuCisuSVAKK1tJbiB0aGUgY2FzZSBvZiBGRERJIChlLmcuLCBgXGZCZmRkaSBwcm90byBhcnBcZlInKSwgVG9rZW4gUmluZworKGUuZy4sIGBcZkJ0ciBwcm90byBhcnBcZlInKSwgYW5kIElFRUUgODAyLjExIHdpcmVsZXNzIExBTlMgKGUuZy4sCitgXGZCd2xhbiBwcm90byBhcnBcZlInKSwgZm9yIG1vc3Qgb2YgdGhvc2UgcHJvdG9jb2xzLCB0aGUKK3Byb3RvY29sIGlkZW50aWZpY2F0aW9uIGNvbWVzIGZyb20gdGhlIDgwMi4yIExvZ2ljYWwgTGluayBDb250cm9sIChMTEMpCitoZWFkZXIsIHdoaWNoIGlzIHVzdWFsbHkgbGF5ZXJlZCBvbiB0b3Agb2YgdGhlIEZEREksIFRva2VuIFJpbmcsIG9yCis4MDIuMTEgaGVhZGVyLgorLklQCitXaGVuIGZpbHRlcmluZyBmb3IgbW9zdCBwcm90b2NvbCBpZGVudGlmaWVycyBvbiBGRERJLCBUb2tlbiBSaW5nLCBvcgorODAyLjExLCB0aGUgZmlsdGVyIGNoZWNrcyBvbmx5IHRoZSBwcm90b2NvbCBJRCBmaWVsZCBvZiBhbiBMTEMgaGVhZGVyCitpbiBzby1jYWxsZWQgU05BUCBmb3JtYXQgd2l0aCBhbiBPcmdhbml6YXRpb25hbCBVbml0IElkZW50aWZpZXIgKE9VSSkgb2YKKzB4MDAwMDAwLCBmb3IgZW5jYXBzdWxhdGVkIEV0aGVybmV0OyBpdCBkb2Vzbid0IGNoZWNrIHdoZXRoZXIgdGhlIHBhY2tldAoraXMgaW4gU05BUCBmb3JtYXQgd2l0aCBhbiBPVUkgb2YgMHgwMDAwMDAuCitUaGUgZXhjZXB0aW9ucyBhcmU6CisuUlMKKy5UUAorXGZCaXNvXGZQCit0aGUgZmlsdGVyIGNoZWNrcyB0aGUgRFNBUCAoRGVzdGluYXRpb24gU2VydmljZSBBY2Nlc3MgUG9pbnQpIGFuZAorU1NBUCAoU291cmNlIFNlcnZpY2UgQWNjZXNzIFBvaW50KSBmaWVsZHMgb2YgdGhlIExMQyBoZWFkZXI7CisuVFAKK1xmQnN0cFxmUCBhbmQgXGZCbmV0YmV1aVxmUAordGhlIGZpbHRlciBjaGVja3MgdGhlIERTQVAgb2YgdGhlIExMQyBoZWFkZXI7CisuVFAKK1xmQmF0YWxrXGZQCit0aGUgZmlsdGVyIGNoZWNrcyBmb3IgYSBTTkFQLWZvcm1hdCBwYWNrZXQgd2l0aCBhbiBPVUkgb2YgMHgwODAwMDcKK2FuZCB0aGUgQXBwbGVUYWxrIGV0eXBlLgorLlJFCisuSVAKK0luIHRoZSBjYXNlIG9mIEV0aGVybmV0LCB0aGUgZmlsdGVyIGNoZWNrcyB0aGUgRXRoZXJuZXQgdHlwZSBmaWVsZAorZm9yIG1vc3Qgb2YgdGhvc2UgcHJvdG9jb2xzLiAgVGhlIGV4Y2VwdGlvbnMgYXJlOgorLlJTCisuVFAKK1xmQmlzb1xmUCwgXGZCc3RwXGZQLCBhbmQgXGZCbmV0YmV1aVxmUAordGhlIGZpbHRlciBjaGVja3MgZm9yIGFuIDgwMi4zIGZyYW1lIGFuZCB0aGVuIGNoZWNrcyB0aGUgTExDIGhlYWRlciBhcworaXQgZG9lcyBmb3IgRkRESSwgVG9rZW4gUmluZywgYW5kIDgwMi4xMTsKKy5UUAorXGZCYXRhbGtcZlAKK3RoZSBmaWx0ZXIgY2hlY2tzIGJvdGggZm9yIHRoZSBBcHBsZVRhbGsgZXR5cGUgaW4gYW4gRXRoZXJuZXQgZnJhbWUgYW5kCitmb3IgYSBTTkFQLWZvcm1hdCBwYWNrZXQgYXMgaXQgZG9lcyBmb3IgRkRESSwgVG9rZW4gUmluZywgYW5kIDgwMi4xMTsKKy5UUAorXGZCYWFycFxmUAordGhlIGZpbHRlciBjaGVja3MgZm9yIHRoZSBBcHBsZVRhbGsgQVJQIGV0eXBlIGluIGVpdGhlciBhbiBFdGhlcm5ldAorZnJhbWUgb3IgYW4gODAyLjIgU05BUCBmcmFtZSB3aXRoIGFuIE9VSSBvZiAweDAwMDAwMDsKKy5UUAorXGZCaXB4XGZQCit0aGUgZmlsdGVyIGNoZWNrcyBmb3IgdGhlIElQWCBldHlwZSBpbiBhbiBFdGhlcm5ldCBmcmFtZSwgdGhlIElQWAorRFNBUCBpbiB0aGUgTExDIGhlYWRlciwgdGhlIDgwMi4zLXdpdGgtbm8tTExDLWhlYWRlciBlbmNhcHN1bGF0aW9uIG9mCitJUFgsIGFuZCB0aGUgSVBYIGV0eXBlIGluIGEgU05BUCBmcmFtZS4KKy5SRQorLklQICJcZkJpcFxmUiwgXGZCaXA2XGZSLCBcZkJhcnBcZlIsIFxmQnJhcnBcZlIsIFxmQmF0YWxrXGZSLCBcZkJhYXJwXGZSLCBcZkJkZWNuZXRcZlIsIFxmQmlzb1xmUiwgXGZCc3RwXGZSLCBcZkJpcHhcZlIsIFxmQm5ldGJldWlcZlAiCitBYmJyZXZpYXRpb25zIGZvcjoKKy5pbiArLjVpCisubmYKK1xmQmV0aGVyIHByb3RvIFxmSXBcZlIKKy5maQorLmluIC0uNWkKK3doZXJlIFxmSXBcZlIgaXMgb25lIG9mIHRoZSBhYm92ZSBwcm90b2NvbHMuCisuSVAgIlxmQmxhdFxmUiwgXGZCbW9wcmNcZlIsIFxmQm1vcGRsXGZSIgorQWJicmV2aWF0aW9ucyBmb3I6CisuaW4gKy41aQorLm5mCitcZkJldGhlciBwcm90byBcZklwXGZSCisuZmkKKy5pbiAtLjVpCit3aGVyZSBcZklwXGZSIGlzIG9uZSBvZiB0aGUgYWJvdmUgcHJvdG9jb2xzLgorTm90ZSB0aGF0IG5vdCBhbGwgYXBwbGljYXRpb25zIHVzaW5nCisuQlIgcGNhcCAoM1BDQVApCitjdXJyZW50bHkga25vdyBob3cgdG8gcGFyc2UgdGhlc2UgcHJvdG9jb2xzLgorLklQICJcZkJkZWNuZXQgc3JjIFxmSWhvc3RcZlIiCitUcnVlIGlmIHRoZSBERUNORVQgc291cmNlIGFkZHJlc3MgaXMKKy5JUiBob3N0ICwKK3doaWNoIG1heSBiZSBhbiBhZGRyZXNzIG9mIHRoZSBmb3JtIGBgMTAuMTIzJycsIG9yIGEgREVDTkVUIGhvc3QKK25hbWUuCitbREVDTkVUIGhvc3QgbmFtZSBzdXBwb3J0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIFVMVFJJWCBzeXN0ZW1zCit0aGF0IGFyZSBjb25maWd1cmVkIHRvIHJ1biBERUNORVQuXQorLklQICJcZkJkZWNuZXQgZHN0IFxmSWhvc3RcZlIiCitUcnVlIGlmIHRoZSBERUNORVQgZGVzdGluYXRpb24gYWRkcmVzcyBpcworLklSIGhvc3QgLgorLklQICJcZkJkZWNuZXQgaG9zdCBcZklob3N0XGZSIgorVHJ1ZSBpZiBlaXRoZXIgdGhlIERFQ05FVCBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyBpcworLklSIGhvc3QgLgorLklQIFxmQmxsY1xmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyBhbiA4MDIuMiBMTEMgaGVhZGVyLiAgVGhpcyBpbmNsdWRlczoKKy5JUAorRXRoZXJuZXQgcGFja2V0cyB3aXRoIGEgbGVuZ3RoIGZpZWxkIHJhdGhlciB0aGFuIGEgdHlwZSBmaWVsZCB0aGF0CithcmVuJ3QgcmF3IE5ldFdhcmUtb3Zlci04MDIuMyBwYWNrZXRzOworLklQCitJRUVFIDgwMi4xMSBkYXRhIHBhY2tldHM7CisuSVAKK1Rva2VuIFJpbmcgcGFja2V0cyAobm8gY2hlY2sgaXMgZG9uZSBmb3IgTExDIGZyYW1lcyk7CisuSVAKK0ZEREkgcGFja2V0cyAobm8gY2hlY2sgaXMgZG9uZSBmb3IgTExDIGZyYW1lcyk7CisuSVAKK0xMQy1lbmNhcHN1bGF0ZWQgQVRNIHBhY2tldHMsIGZvciBTdW5BVE0gb24gU29sYXJpcy4KKy5JUAorCisuSVAgIlxmQmxsY1xmUCBcRml0eXBlXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyBhbiA4MDIuMiBMTEMgaGVhZGVyIGFuZCBoYXMgdGhlIHNwZWNpZmllZAorLklSIHR5cGUgLgorLkkgdHlwZQorY2FuIGJlIG9uZSBvZjoKKy5SUworLlRQCitcZkJpXGZSCitJbmZvcm1hdGlvbiAoSSkgUERVcworLlRQCitcZkJzXGZSCitTdXBlcnZpc29yeSAoUykgUERVcworLlRQCitcZkJ1XGZSCitVbm51bWJlcmVkIChVKSBQRFVzCisuVFAKK1xmQnJyXGZSCitSZWNlaXZlciBSZWFkeSAoUlIpIFMgUERVcworLlRQCitcZkJybnJcZlIKK1JlY2VpdmVyIE5vdCBSZWFkeSAoUk5SKSBTIFBEVXMKKy5UUAorXGZCcmVqXGZSCitSZWplY3QgKFJFSikgUyBQRFVzCisuVFAKK1xmQnVpXGZSCitVbm51bWJlcmVkIEluZm9ybWF0aW9uIChVSSkgVSBQRFVzCisuVFAKK1xmQnVhXGZSCitVbm51bWJlcmVkIEFja25vd2xlZGdtZW50IChVQSkgVSBQRFVzCisuVFAKK1xmQmRpc2NcZlIKK0Rpc2Nvbm5lY3QgKERJU0MpIFUgUERVcworLlRQCitcZkJzYWJtZVxmUgorU2V0IEFzeW5jaHJvbm91cyBCYWxhbmNlZCBNb2RlIEV4dGVuZGVkIChTQUJNRSkgVSBQRFVzCisuVFAKK1xmQnRlc3RcZlIKK1Rlc3QgKFRFU1QpIFUgUERVcworLlRQCitcZkJ4aWRcZlIKK0V4Y2hhbmdlIElkZW50aWZpY2F0aW9uIChYSUQpIFUgUERVcworLlRQCitcZkJmcm1yXGZSCitGcmFtZSBSZWplY3QgKEZSTVIpIFUgUERVcworLlJFCisuSVAgIlxmQmlmbmFtZSBcZklpbnRlcmZhY2VcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgd2FzIGxvZ2dlZCBhcyBjb21pbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGludGVyZmFjZSAoYXBwbGllcworb25seSB0byBwYWNrZXRzIGxvZ2dlZCBieSBPcGVuQlNEJ3Mgb3IgRnJlZUJTRCdzCisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCb24gXGZJaW50ZXJmYWNlXGZSIgorU3lub255bW91cyB3aXRoIHRoZQorLkIgaWZuYW1lCittb2RpZmllci4KKy5JUCAiXGZCcm5yIFxmSW51bVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCB3YXMgbG9nZ2VkIGFzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgUEYgcnVsZSBudW1iZXIKKyhhcHBsaWVzIG9ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzIG9yIEZyZWVCU0QncworLkJSIHBmICg0KSkuCisuSVAgIlxmQnJ1bGVudW0gXGZJbnVtXGZSIgorU3lub255bW91cyB3aXRoIHRoZQorLkIgcm5yCittb2RpZmllci4KKy5JUCAiXGZCcmVhc29uIFxmSWNvZGVcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgd2FzIGxvZ2dlZCB3aXRoIHRoZSBzcGVjaWZpZWQgUEYgcmVhc29uIGNvZGUuICBUaGUga25vd24KK2NvZGVzIGFyZToKKy5CUiBtYXRjaCAsCisuQlIgYmFkLW9mZnNldCAsCisuQlIgZnJhZ21lbnQgLAorLkJSIHNob3J0ICwKKy5CUiBub3JtYWxpemUgLAorYW5kCisuQiBtZW1vcnkKKyhhcHBsaWVzIG9ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzIG9yIEZyZWVCU0QncworLkJSIHBmICg0KSkuCisuSVAgIlxmQnJzZXQgXGZJbmFtZVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCB3YXMgbG9nZ2VkIGFzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgUEYgcnVsZXNldAorbmFtZSBvZiBhbiBhbmNob3JlZCBydWxlc2V0IChhcHBsaWVzIG9ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzCitvciBGcmVlQlNEJ3MKKy5CUiBwZiAoNCkpLgorLklQICJcZkJydWxlc2V0IFxmSW5hbWVcZlIiCitTeW5vbnltb3VzIHdpdGggdGhlCisuQiByc2V0Cittb2RpZmllci4KKy5JUCAiXGZCc3JuciBcZkludW1cZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgd2FzIGxvZ2dlZCBhcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFBGIHJ1bGUgbnVtYmVyCitvZiBhbiBhbmNob3JlZCBydWxlc2V0IChhcHBsaWVzIG9ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzIG9yCitGcmVlQlNEJ3MKKy5CUiBwZiAoNCkpLgorLklQICJcZkJzdWJydWxlbnVtIFxmSW51bVxmUiIKK1N5bm9ueW1vdXMgd2l0aCB0aGUKKy5CIHNybnIKK21vZGlmaWVyLgorLklQICJcZkJhY3Rpb24gXGZJYWN0XGZSIgorVHJ1ZSBpZiBQRiB0b29rIHRoZSBzcGVjaWZpZWQgYWN0aW9uIHdoZW4gdGhlIHBhY2tldCB3YXMgbG9nZ2VkLiAgS25vd24gYWN0aW9ucworYXJlOgorLkIgcGFzcworYW5kCisuQiBibG9jaworYW5kLCB3aXRoIGxhdGVyIHZlcnNpb25zIG9mCisuQlIgcGYgKDQpKSwKKy5CUiBuYXQgLAorLkJSIHJkciAsCisuQiBiaW5hdAorYW5kCisuQiBzY3J1YgorKGFwcGxpZXMgb25seSB0byBwYWNrZXRzIGxvZ2dlZCBieSBPcGVuQlNEJ3Mgb3IgRnJlZUJTRCdzCisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCd2xhbiByYSBcZkllaG9zdFxmUiIKK1RydWUgaWYgdGhlIElFRUUgODAyLjExIFJBIGlzCisuSVIgZWhvc3QgLgorVGhlIFJBIGZpZWxkIGlzIHVzZWQgaW4gYWxsIGZyYW1lcyBleGNlcHQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzLgorLklQICJcZkJ3bGFuIHRhIFxmSWVob3N0XGZSIgorVHJ1ZSBpZiB0aGUgSUVFRSA4MDIuMTEgVEEgaXMKKy5JUiBlaG9zdCAuCitUaGUgVEEgZmllbGQgaXMgdXNlZCBpbiBhbGwgZnJhbWVzIGV4Y2VwdCBmb3IgbWFuYWdlbWVudCBmcmFtZXMgYW5kCitDVFMgKENsZWFyIFRvIFNlbmQpIGFuZCBBQ0sgKEFja25vd2xlZGdtZW50KSBjb250cm9sIGZyYW1lcy4KKy5JUCAiXGZCd2xhbiBhZGRyMSBcZkllaG9zdFxmUiIKK1RydWUgaWYgdGhlIGZpcnN0IElFRUUgODAyLjExIGFkZHJlc3MgaXMKKy5JUiBlaG9zdCAuCisuSVAgIlxmQndsYW4gYWRkcjIgXGZJZWhvc3RcZlIiCitUcnVlIGlmIHRoZSBzZWNvbmQgSUVFRSA4MDIuMTEgYWRkcmVzcywgaWYgcHJlc2VudCwgaXMKKy5JUiBlaG9zdCAuCitUaGUgc2Vjb25kIGFkZHJlc3MgZmllbGQgaXMgdXNlZCBpbiBhbGwgZnJhbWVzIGV4Y2VwdCBmb3IgQ1RTIChDbGVhciBUbworU2VuZCkgYW5kIEFDSyAoQWNrbm93bGVkZ21lbnQpIGNvbnRyb2wgZnJhbWVzLgorLklQICJcZkJ3bGFuIGFkZHIzIFxmSWVob3N0XGZSIgorVHJ1ZSBpZiB0aGUgdGhpcmQgSUVFRSA4MDIuMTEgYWRkcmVzcywgaWYgcHJlc2VudCwgaXMKKy5JUiBlaG9zdCAuCitUaGUgdGhpcmQgYWRkcmVzcyBmaWVsZCBpcyB1c2VkIGluIG1hbmFnZW1lbnQgYW5kIGRhdGEgZnJhbWVzLCBidXQgbm90CitpbiBjb250cm9sIGZyYW1lcy4KKy5JUCAiXGZCd2xhbiBhZGRyNCBcZkllaG9zdFxmUiIKK1RydWUgaWYgdGhlIGZvdXJ0aCBJRUVFIDgwMi4xMSBhZGRyZXNzLCBpZiBwcmVzZW50LCBpcworLklSIGVob3N0IC4KK1RoZSBmb3VydGggYWRkcmVzcyBmaWVsZCBpcyBvbmx5IHVzZWQgZm9yCitXRFMgKFdpcmVsZXNzIERpc3RyaWJ1dGlvbiBTeXN0ZW0pIGZyYW1lcy4KKy5JUCAiXGZCdHlwZSBcZkl3bGFuX3R5cGVcZlIiCitUcnVlIGlmIHRoZSBJRUVFIDgwMi4xMSBmcmFtZSB0eXBlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBcZkl3bGFuX3R5cGVcZlIuCitWYWxpZCBcZkl3bGFuX3R5cGVcZlJzIGFyZToKK1xmQm1ndFxmUCwKK1xmQmN0bFxmUAorYW5kIFxmQmRhdGFcZlAuCisuSVAgIlxmQnR5cGUgXGZJd2xhbl90eXBlIFxmQnN1YnR5cGUgXGZJd2xhbl9zdWJ0eXBlXGZSIgorVHJ1ZSBpZiB0aGUgSUVFRSA4MDIuMTEgZnJhbWUgdHlwZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl90eXBlXGZSCithbmQgZnJhbWUgc3VidHlwZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl9zdWJ0eXBlXGZSLgorLklQCitJZiB0aGUgc3BlY2lmaWVkIFxmSXdsYW5fdHlwZVxmUiBpcyBcZkJtZ3RcZlAsCit0aGVuIHZhbGlkIFxmSXdsYW5fc3VidHlwZVxmUnMgYXJlOgorXGZCYXNzb2MtcmVxXGZQLAorXGZCYXNzb2MtcmVzcFxmUCwKK1xmQnJlYXNzb2MtcmVxXGZQLAorXGZCcmVhc3NvYy1yZXNwXGZQLAorXGZCcHJvYmUtcmVxXGZQLAorXGZCcHJvYmUtcmVzcFxmUCwKK1xmQmJlYWNvblxmUCwKK1xmQmF0aW1cZlAsCitcZkJkaXNhc3NvY1xmUCwKK1xmQmF1dGhcZlAgYW5kCitcZkJkZWF1dGhcZlAuCisuSVAKK0lmIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl90eXBlXGZSIGlzIFxmQmN0bFxmUCwKK3RoZW4gdmFsaWQgXGZJd2xhbl9zdWJ0eXBlXGZScyBhcmU6CitcZkJwcy1wb2xsXGZQLAorXGZCcnRzXGZQLAorXGZCY3RzXGZQLAorXGZCYWNrXGZQLAorXGZCY2YtZW5kXGZQIGFuZAorXGZCY2YtZW5kLWFja1xmUC4KKy5JUAorSWYgdGhlIHNwZWNpZmllZCBcZkl3bGFuX3R5cGVcZlIgaXMgXGZCZGF0YVxmUCwKK3RoZW4gdmFsaWQgXGZJd2xhbl9zdWJ0eXBlXGZScyBhcmU6CitcZkJkYXRhXGZQLAorXGZCZGF0YS1jZi1hY2tcZlAsCitcZkJkYXRhLWNmLXBvbGxcZlAsCitcZkJkYXRhLWNmLWFjay1wb2xsXGZQLAorXGZCbnVsbFxmUCwKK1xmQmNmLWFja1xmUCwKK1xmQmNmLXBvbGxcZlAsCitcZkJjZi1hY2stcG9sbFxmUCwKK1xmQnFvcy1kYXRhXGZQLAorXGZCcW9zLWRhdGEtY2YtYWNrXGZQLAorXGZCcW9zLWRhdGEtY2YtcG9sbFxmUCwKK1xmQnFvcy1kYXRhLWNmLWFjay1wb2xsXGZQLAorXGZCcW9zXGZQLAorXGZCcW9zLWNmLXBvbGxcZlAgYW5kCitcZkJxb3MtY2YtYWNrLXBvbGxcZlAuCisuSVAgIlxmQnN1YnR5cGUgXGZJd2xhbl9zdWJ0eXBlXGZSIgorVHJ1ZSBpZiB0aGUgSUVFRSA4MDIuMTEgZnJhbWUgc3VidHlwZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl9zdWJ0eXBlXGZSCithbmQgZnJhbWUgaGFzIHRoZSB0eXBlIHRvIHdoaWNoIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl9zdWJ0eXBlXGZSIGJlbG9uZ3MuCisuSVAgIlxmQmRpciBcZklkaXJcZlIiCitUcnVlIGlmIHRoZSBJRUVFIDgwMi4xMSBmcmFtZSBkaXJlY3Rpb24gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCisuSVIgZGlyIC4KK1ZhbGlkIGRpcmVjdGlvbnMgYXJlOgorLkJSIG5vZHMgLAorLkJSIHRvZHMgLAorLkJSIGZyb21kcyAsCisuQlIgZHN0b2RzICwKK29yIGEgbnVtZXJpYyB2YWx1ZS4KKy5JUCAiXGZCdmxhbiBcZklbdmxhbl9pZF1cZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSUVFRSA4MDIuMVEgVkxBTiBwYWNrZXQuCitJZiBcZklbdmxhbl9pZF1cZlIgaXMgc3BlY2lmaWVkLCBvbmx5IHRydWUgaWYgdGhlIHBhY2tldCBoYXMgdGhlIHNwZWNpZmllZAorXGZJdmxhbl9pZFxmUi4KK05vdGUgdGhhdCB0aGUgZmlyc3QgXGZCdmxhblxmUiBrZXl3b3JkIGVuY291bnRlcmVkIGluIFxmSWV4cHJlc3Npb25cZlIKK2NoYW5nZXMgdGhlIGRlY29kaW5nIG9mZnNldHMgZm9yIHRoZSByZW1haW5kZXIgb2YgXGZJZXhwcmVzc2lvblxmUiBvbgordGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcGFja2V0IGlzIGEgVkxBTiBwYWNrZXQuICBUaGUgXGZCdmxhbgorXGZJW3ZsYW5faWRdXGZSIGV4cHJlc3Npb24gbWF5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UsIHRvIGZpbHRlciBvbiBWTEFOCitoaWVyYXJjaGllcy4gIEVhY2ggdXNlIG9mIHRoYXQgZXhwcmVzc2lvbiBpbmNyZW1lbnRzIHRoZSBmaWx0ZXIgb2Zmc2V0cworYnkgNC4KKy5JUAorRm9yIGV4YW1wbGU6CisuaW4gKy41aQorLm5mCitcZkJ2bGFuIDEwMCAmJiB2bGFuIDIwMFxmUgorLmZpCisuaW4gLS41aQorZmlsdGVycyBvbiBWTEFOIDIwMCBlbmNhcHN1bGF0ZWQgd2l0aGluIFZMQU4gMTAwLCBhbmQKKy5pbiArLjVpCisubmYKK1xmQnZsYW4gJiYgdmxhbiAzMDAgJiYgaXBcZlIKKy5maQorLmluIC0uNWkKK2ZpbHRlcnMgSVB2NCBwcm90b2NvbHMgZW5jYXBzdWxhdGVkIGluIFZMQU4gMzAwIGVuY2Fwc3VsYXRlZCB3aXRoaW4gYW55CitoaWdoZXIgb3JkZXIgVkxBTi4KKy5JUCAiXGZCbXBscyBcZklbbGFiZWxfbnVtXVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBNUExTIHBhY2tldC4KK0lmIFxmSVtsYWJlbF9udW1dXGZSIGlzIHNwZWNpZmllZCwgb25seSB0cnVlIGlzIHRoZSBwYWNrZXQgaGFzIHRoZSBzcGVjaWZpZWQKK1xmSWxhYmVsX251bVxmUi4KK05vdGUgdGhhdCB0aGUgZmlyc3QgXGZCbXBsc1xmUiBrZXl3b3JkIGVuY291bnRlcmVkIGluIFxmSWV4cHJlc3Npb25cZlIKK2NoYW5nZXMgdGhlIGRlY29kaW5nIG9mZnNldHMgZm9yIHRoZSByZW1haW5kZXIgb2YgXGZJZXhwcmVzc2lvblxmUiBvbgordGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcGFja2V0IGlzIGEgTVBMUy1lbmNhcHN1bGF0ZWQgSVAgcGFja2V0LiAgVGhlCitcZkJtcGxzIFxmSVtsYWJlbF9udW1dXGZSIGV4cHJlc3Npb24gbWF5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UsIHRvCitmaWx0ZXIgb24gTVBMUyBoaWVyYXJjaGllcy4gIEVhY2ggdXNlIG9mIHRoYXQgZXhwcmVzc2lvbiBpbmNyZW1lbnRzIHRoZQorZmlsdGVyIG9mZnNldHMgYnkgNC4KKy5JUAorRm9yIGV4YW1wbGU6CisuaW4gKy41aQorLm5mCitcZkJtcGxzIDEwMDAwMCAmJiBtcGxzIDEwMjRcZlIKKy5maQorLmluIC0uNWkKK2ZpbHRlcnMgcGFja2V0cyB3aXRoIGFuIG91dGVyIGxhYmVsIG9mIDEwMDAwMCBhbmQgYW4gaW5uZXIgbGFiZWwgb2YKKzEwMjQsIGFuZAorLmluICsuNWkKKy5uZgorXGZCbXBscyAmJiBtcGxzIDEwMjQgJiYgaG9zdCAxOTIuOS4yMDAuMVxmUgorLmZpCisuaW4gLS41aQorZmlsdGVycyBwYWNrZXRzIHRvIG9yIGZyb20gMTkyLjkuMjAwLjEgd2l0aCBhbiBpbm5lciBsYWJlbCBvZiAxMDI0IGFuZAorYW55IG91dGVyIGxhYmVsLgorLklQIFxmQnBwcG9lZFxmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGEgUFBQLW92ZXItRXRoZXJuZXQgRGlzY292ZXJ5IHBhY2tldCAoRXRoZXJuZXQKK3R5cGUgMHg4ODYzKS4KKy5JUCAiXGZCcHBwb2VzIFxmSVtzZXNzaW9uX2lkXVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhIFBQUC1vdmVyLUV0aGVybmV0IFNlc3Npb24gcGFja2V0IChFdGhlcm5ldAordHlwZSAweDg4NjQpLgorSWYgXGZJW3Nlc3Npb25faWRdXGZSIGlzIHNwZWNpZmllZCwgb25seSB0cnVlIGlmIHRoZSBwYWNrZXQgaGFzIHRoZSBzcGVjaWZpZWQKK1xmSXNlc3Npb25faWRcZlIuCitOb3RlIHRoYXQgdGhlIGZpcnN0IFxmQnBwcG9lc1xmUiBrZXl3b3JkIGVuY291bnRlcmVkIGluIFxmSWV4cHJlc3Npb25cZlIKK2NoYW5nZXMgdGhlIGRlY29kaW5nIG9mZnNldHMgZm9yIHRoZSByZW1haW5kZXIgb2YgXGZJZXhwcmVzc2lvblxmUiBvbgordGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcGFja2V0IGlzIGEgUFBQb0Ugc2Vzc2lvbiBwYWNrZXQuCisuSVAKK0ZvciBleGFtcGxlOgorLmluICsuNWkKKy5uZgorXGZCcHBwb2VzIDB4MjcgJiYgaXBcZlIKKy5maQorLmluIC0uNWkKK2ZpbHRlcnMgSVB2NCBwcm90b2NvbHMgZW5jYXBzdWxhdGVkIGluIFBQUG9FIHNlc3Npb24gaWQgMHgyNy4KKy5JUCAiXGZCZ2VuZXZlIFxmSVt2bmldXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGEgR2VuZXZlIHBhY2tldCAoVURQIHBvcnQgNjA4MSkuIElmIFxmSVt2bmldXGZSCitpcyBzcGVjaWZpZWQsIG9ubHkgdHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyB0aGUgc3BlY2lmaWVkIFxmSXZuaVxmUi4KK05vdGUgdGhhdCB3aGVuIHRoZSBcZkJnZW5ldmVcZlIga2V5d29yZCBpcyBlbmNvdW50ZXJlZCBpbgorXGZJZXhwcmVzc2lvblxmUiwgaXQgY2hhbmdlcyB0aGUgZGVjb2Rpbmcgb2Zmc2V0cyBmb3IgdGhlIHJlbWFpbmRlciBvZgorXGZJZXhwcmVzc2lvblxmUiBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgYSBHZW5ldmUgcGFja2V0LgorLklQCitGb3IgZXhhbXBsZToKKy5pbiArLjVpCisubmYKK1xmQmdlbmV2ZSAweGIgJiYgaXBcZlIKKy5maQorLmluIC0uNWkKK2ZpbHRlcnMgSVB2NCBwcm90b2NvbHMgZW5jYXBzdWxhdGVkIGluIEdlbmV2ZSB3aXRoIFZOSSAweGIuIFRoaXMgd2lsbAorbWF0Y2ggYm90aCBJUCBkaXJlY3RseSBlbmNhcHN1bGF0ZWQgaW4gR2VuZXZlIGFzIHdlbGwgYXMgSVAgY29udGFpbmVkCitpbnNpZGUgYW4gRXRoZXJuZXQgZnJhbWUuCisuSVAgIlxmQmlzbyBwcm90byBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBPU0kgcGFja2V0IG9mIHByb3RvY29sIHR5cGUgXGZJcHJvdG9jb2xcZlAuCitcZklQcm90b2NvbFxmUCBjYW4gYmUgYSBudW1iZXIgb3Igb25lIG9mIHRoZSBuYW1lcworXGZCY2xucFxmUCwgXGZCZXNpc1xmUCwgb3IgXGZCaXNpc1xmUC4KKy5JUCAiXGZCY2xucFxmUiwgXGZCZXNpc1xmUiwgXGZCaXNpc1xmUiIKK0FiYnJldmlhdGlvbnMgZm9yOgorLmluICsuNWkKKy5uZgorXGZCaXNvIHByb3RvIFxmSXBcZlIKKy5maQorLmluIC0uNWkKK3doZXJlIFxmSXBcZlIgaXMgb25lIG9mIHRoZSBhYm92ZSBwcm90b2NvbHMuCisuSVAgIlxmQmwxXGZSLCBcZkJsMlxmUiwgXGZCaWloXGZSLCBcZkJsc3BcZlIsIFxmQnNucFxmUiwgXGZCY3NucFxmUiwgXGZCcHNucFxmUiIKK0FiYnJldmlhdGlvbnMgZm9yIElTLUlTIFBEVSB0eXBlcy4KKy5JUCAiXGZCdnBpXGZQIFxmSW5cZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCB3aXRoIGEKK3ZpcnR1YWwgcGF0aCBpZGVudGlmaWVyIG9mCisuSVIgbiAuCisuSVAgIlxmQnZjaVxmUCBcZkluXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgd2l0aCBhCit2aXJ0dWFsIGNoYW5uZWwgaWRlbnRpZmllciBvZgorLklSIG4gLgorLklQIFxmQmxhbmVcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworYW4gQVRNIExBTkUgcGFja2V0LgorTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJsYW5lXGZSIGtleXdvcmQgZW5jb3VudGVyZWQgaW4gXGZJZXhwcmVzc2lvblxmUgorY2hhbmdlcyB0aGUgdGVzdHMgZG9uZSBpbiB0aGUgcmVtYWluZGVyIG9mIFxmSWV4cHJlc3Npb25cZlIKK29uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHBhY2tldCBpcyBlaXRoZXIgYSBMQU5FIGVtdWxhdGVkIEV0aGVybmV0CitwYWNrZXQgb3IgYSBMQU5FIExFIENvbnRyb2wgcGFja2V0LiAgSWYgXGZCbGFuZVxmUiBpc24ndCBzcGVjaWZpZWQsIHRoZQordGVzdHMgYXJlIGRvbmUgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcGFja2V0IGlzIGFuCitMTEMtZW5jYXBzdWxhdGVkIHBhY2tldC4KKy5JUCBcZkJvYW1mNHNcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworYSBzZWdtZW50IE9BTSBGNCBmbG93IGNlbGwgKFZQST0wICYgVkNJPTMpLgorLklQIFxmQm9hbWY0ZVxmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCithbiBlbmQtdG8tZW5kIE9BTSBGNCBmbG93IGNlbGwgKFZQST0wICYgVkNJPTQpLgorLklQIFxmQm9hbWY0XGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK2Egc2VnbWVudCBvciBlbmQtdG8tZW5kIE9BTSBGNCBmbG93IGNlbGwgKFZQST0wICYgKFZDST0zIHwgVkNJPTQpKS4KKy5JUCBcZkJvYW1cZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworYSBzZWdtZW50IG9yIGVuZC10by1lbmQgT0FNIEY0IGZsb3cgY2VsbCAoVlBJPTAgJiAoVkNJPTMgfCBWQ0k9NCkpLgorLklQIFxmQm1ldGFjXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK29uIGEgbWV0YSBzaWduYWxpbmcgY2lyY3VpdCAoVlBJPTAgJiBWQ0k9MSkuCisuSVAgXGZCYmNjXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK29uIGEgYnJvYWRjYXN0IHNpZ25hbGluZyBjaXJjdWl0IChWUEk9MCAmIFZDST0yKS4KKy5JUCBcZkJzY1xmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCitvbiBhIHNpZ25hbGluZyBjaXJjdWl0IChWUEk9MCAmIFZDST01KS4KKy5JUCBcZkJpbG1pY1xmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCitvbiBhbiBJTE1JIGNpcmN1aXQgKFZQST0wICYgVkNJPTE2KS4KKy5JUCBcZkJjb25uZWN0bXNnXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK29uIGEgc2lnbmFsaW5nIGNpcmN1aXQgYW5kIGlzIGEgUS4yOTMxIFNldHVwLCBDYWxsIFByb2NlZWRpbmcsIENvbm5lY3QsCitDb25uZWN0IEFjaywgUmVsZWFzZSwgb3IgUmVsZWFzZSBEb25lIG1lc3NhZ2UuCisuSVAgXGZCbWV0YWNvbm5lY3RcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworb24gYSBtZXRhIHNpZ25hbGluZyBjaXJjdWl0IGFuZCBpcyBhIFEuMjkzMSBTZXR1cCwgQ2FsbCBQcm9jZWVkaW5nLCBDb25uZWN0LAorUmVsZWFzZSwgb3IgUmVsZWFzZSBEb25lIG1lc3NhZ2UuCisuSVAgICJcZklleHByIHJlbG9wIGV4cHJcZlIiCitUcnVlIGlmIHRoZSByZWxhdGlvbiBob2xkcywgd2hlcmUgXGZJcmVsb3BcZlIgaXMgb25lIG9mID4sIDwsID49LCA8PSwgPSwKKyE9LCBhbmQgXGZJZXhwclxmUiBpcyBhbiBhcml0aG1ldGljIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgaW50ZWdlcgorY29uc3RhbnRzIChleHByZXNzZWQgaW4gc3RhbmRhcmQgQyBzeW50YXgpLCB0aGUgbm9ybWFsIGJpbmFyeSBvcGVyYXRvcnMKK1srLCAtLCAqLCAvLCAlLCAmLCB8LCBeLCA8PCwgPj5dLCBhIGxlbmd0aCBvcGVyYXRvciwgYW5kIHNwZWNpYWwgcGFja2V0IGRhdGEKK2FjY2Vzc29ycy4gIE5vdGUgdGhhdCBhbGwgY29tcGFyaXNvbnMgYXJlIHVuc2lnbmVkLCBzbyB0aGF0LCBmb3IgZXhhbXBsZSwKKzB4ODAwMDAwMDAgYW5kIDB4ZmZmZmZmZmYgYXJlID4gMC4KKy5JUAorVGhlICUgYW5kIF4gb3BlcmF0b3JzIGFyZSBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgZm9yIGZpbHRlcmluZyBpbiB0aGUKK2tlcm5lbCBvbiBMaW51eCB3aXRoIDMuNyBhbmQgbGF0ZXIga2VybmVsczsgb24gYWxsIG90aGVyIHN5c3RlbXMsIGlmCit0aG9zZSBvcGVyYXRvcnMgYXJlIHVzZWQsIGZpbHRlcmluZyB3aWxsIGJlIGRvbmUgaW4gdXNlciBtb2RlLCB3aGljaAord2lsbCBpbmNyZWFzZSB0aGUgb3ZlcmhlYWQgb2YgY2FwdHVyaW5nIHBhY2tldHMgYW5kIG1heSBjYXVzZSBtb3JlCitwYWNrZXRzIHRvIGJlIGRyb3BwZWQuCisuSVAKK1RvIGFjY2VzcyBkYXRhIGluc2lkZSB0aGUgcGFja2V0LCB1c2UgdGhlIGZvbGxvd2luZyBzeW50YXg6CisuaW4gKy41aQorLm5mCitcZklwcm90b1xmQiBbIFxmSWV4cHJcZkIgOiBcZklzaXplXGZCIF1cZlIKKy5maQorLmluIC0uNWkKK1xmSVByb3RvXGZSIGlzIG9uZSBvZiBcZkJldGhlciwgZmRkaSwgdHIsIHdsYW4sIHBwcCwgc2xpcCwgbGluaywKK2lwLCBhcnAsIHJhcnAsIHRjcCwgdWRwLCBpY21wLCBpcDZcZlIgb3IgXGZCcmFkaW9cZlIsIGFuZAoraW5kaWNhdGVzIHRoZSBwcm90b2NvbCBsYXllciBmb3IgdGhlIGluZGV4IG9wZXJhdGlvbi4KKyhcZkJldGhlciwgZmRkaSwgd2xhbiwgdHIsIHBwcCwgc2xpcFxmUiBhbmQgXGZCbGlua1xmUiBhbGwgcmVmZXIgdG8gdGhlCitsaW5rIGxheWVyLiBcZkJyYWRpb1xmUiByZWZlcnMgdG8gdGhlICJyYWRpbyBoZWFkZXIiIGFkZGVkIHRvIHNvbWUKKzgwMi4xMSBjYXB0dXJlcy4pCitOb3RlIHRoYXQgXGZJdGNwLCB1ZHBcZlIgYW5kIG90aGVyIHVwcGVyLWxheWVyIHByb3RvY29sIHR5cGVzIG9ubHkKK2FwcGx5IHRvIElQdjQsIG5vdCBJUHY2ICh0aGlzIHdpbGwgYmUgZml4ZWQgaW4gdGhlIGZ1dHVyZSkuCitUaGUgYnl0ZSBvZmZzZXQsIHJlbGF0aXZlIHRvIHRoZSBpbmRpY2F0ZWQgcHJvdG9jb2wgbGF5ZXIsIGlzCitnaXZlbiBieSBcZklleHByXGZSLgorXGZJU2l6ZVxmUiBpcyBvcHRpb25hbCBhbmQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCitmaWVsZCBvZiBpbnRlcmVzdDsgaXQgY2FuIGJlIGVpdGhlciBvbmUsIHR3bywgb3IgZm91ciwgYW5kIGRlZmF1bHRzIHRvIG9uZS4KK1RoZSBsZW5ndGggb3BlcmF0b3IsIGluZGljYXRlZCBieSB0aGUga2V5d29yZCBcZkJsZW5cZlAsIGdpdmVzIHRoZQorbGVuZ3RoIG9mIHRoZSBwYWNrZXQuCisKK0ZvciBleGFtcGxlLCBgXGZCZXRoZXJbMF0gJiAxICE9IDBcZlAnIGNhdGNoZXMgYWxsIG11bHRpY2FzdCB0cmFmZmljLgorVGhlIGV4cHJlc3Npb24gYFxmQmlwWzBdICYgMHhmICE9IDVcZlAnCitjYXRjaGVzIGFsbCBJUHY0IHBhY2tldHMgd2l0aCBvcHRpb25zLgorVGhlIGV4cHJlc3Npb24KK2BcZkJpcFs2OjJdICYgMHgxZmZmID0gMFxmUCcKK2NhdGNoZXMgb25seSB1bmZyYWdtZW50ZWQgSVB2NCBkYXRhZ3JhbXMgYW5kIGZyYWcgemVybyBvZiBmcmFnbWVudGVkCitJUHY0IGRhdGFncmFtcy4KK1RoaXMgY2hlY2sgaXMgaW1wbGljaXRseSBhcHBsaWVkIHRvIHRoZSBcZkJ0Y3BcZlAgYW5kIFxmQnVkcFxmUAoraW5kZXggb3BlcmF0aW9ucy4KK0ZvciBpbnN0YW5jZSwgXGZCdGNwWzBdXGZQIGFsd2F5cyBtZWFucyB0aGUgZmlyc3QKK2J5dGUgb2YgdGhlIFRDUCBcZkloZWFkZXJcZlAsIGFuZCBuZXZlciBtZWFucyB0aGUgZmlyc3QgYnl0ZSBvZiBhbgoraW50ZXJ2ZW5pbmcgZnJhZ21lbnQuCisKK1NvbWUgb2Zmc2V0cyBhbmQgZmllbGQgdmFsdWVzIG1heSBiZSBleHByZXNzZWQgYXMgbmFtZXMgcmF0aGVyIHRoYW4KK2FzIG51bWVyaWMgdmFsdWVzLgorVGhlIGZvbGxvd2luZyBwcm90b2NvbCBoZWFkZXIgZmllbGQgb2Zmc2V0cyBhcmUKK2F2YWlsYWJsZTogXGZCaWNtcHR5cGVcZlAgKElDTVAgdHlwZSBmaWVsZCksIFxmQmljbXBjb2RlXGZQIChJQ01QCitjb2RlIGZpZWxkKSwgYW5kIFxmQnRjcGZsYWdzXGZQIChUQ1AgZmxhZ3MgZmllbGQpLgorCitUaGUgZm9sbG93aW5nIElDTVAgdHlwZSBmaWVsZCB2YWx1ZXMgYXJlIGF2YWlsYWJsZTogXGZCaWNtcC1lY2hvcmVwbHlcZlAsCitcZkJpY21wLXVucmVhY2hcZlAsIFxmQmljbXAtc291cmNlcXVlbmNoXGZQLCBcZkJpY21wLXJlZGlyZWN0XGZQLAorXGZCaWNtcC1lY2hvXGZQLCBcZkJpY21wLXJvdXRlcmFkdmVydFxmUCwgXGZCaWNtcC1yb3V0ZXJzb2xpY2l0XGZQLAorXGZCaWNtcC10aW14Y2VlZFxmUCwgXGZCaWNtcC1wYXJhbXByb2JcZlAsIFxmQmljbXAtdHN0YW1wXGZQLAorXGZCaWNtcC10c3RhbXByZXBseVxmUCwgXGZCaWNtcC1pcmVxXGZQLCBcZkJpY21wLWlyZXFyZXBseVxmUCwKK1xmQmljbXAtbWFza3JlcVxmUCwgXGZCaWNtcC1tYXNrcmVwbHlcZlAuCisKK1RoZSBmb2xsb3dpbmcgVENQIGZsYWdzIGZpZWxkIHZhbHVlcyBhcmUgYXZhaWxhYmxlOiBcZkJ0Y3AtZmluXGZQLAorXGZCdGNwLXN5blxmUCwgXGZCdGNwLXJzdFxmUCwgXGZCdGNwLXB1c2hcZlAsCitcZkJ0Y3AtYWNrXGZQLCBcZkJ0Y3AtdXJnXGZQLgorLkxQCitQcmltaXRpdmVzIG1heSBiZSBjb21iaW5lZCB1c2luZzoKKy5JUAorQSBwYXJlbnRoZXNpemVkIGdyb3VwIG9mIHByaW1pdGl2ZXMgYW5kIG9wZXJhdG9ycy4KKy5JUAorTmVnYXRpb24gKGBcZkIhXGZQJyBvciBgXGZCbm90XGZQJykuCisuSVAKK0NvbmNhdGVuYXRpb24gKGBcZkImJlxmUCcgb3IgYFxmQmFuZFxmUCcpLgorLklQCitBbHRlcm5hdGlvbiAoYFxmQnx8XGZQJyBvciBgXGZCb3JcZlAnKS4KKy5MUAorTmVnYXRpb24gaGFzIGhpZ2hlc3QgcHJlY2VkZW5jZS4KK0FsdGVybmF0aW9uIGFuZCBjb25jYXRlbmF0aW9uIGhhdmUgZXF1YWwgcHJlY2VkZW5jZSBhbmQgYXNzb2NpYXRlCitsZWZ0IHRvIHJpZ2h0LgorTm90ZSB0aGF0IGV4cGxpY2l0IFxmQmFuZFxmUiB0b2tlbnMsIG5vdCBqdXh0YXBvc2l0aW9uLAorYXJlIG5vdyByZXF1aXJlZCBmb3IgY29uY2F0ZW5hdGlvbi4KKy5MUAorSWYgYW4gaWRlbnRpZmllciBpcyBnaXZlbiB3aXRob3V0IGEga2V5d29yZCwgdGhlIG1vc3QgcmVjZW50IGtleXdvcmQKK2lzIGFzc3VtZWQuCitGb3IgZXhhbXBsZSwKKy5pbiArLjVpCisubmYKK1xmQm5vdCBob3N0IHZzIGFuZCBhY2VcZlIKKy5maQorLmluIC0uNWkKK2lzIHNob3J0IGZvcgorLmluICsuNWkKKy5uZgorXGZCbm90IGhvc3QgdnMgYW5kIGhvc3QgYWNlXGZSCisuZmkKKy5pbiAtLjVpCit3aGljaCBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGgKKy5pbiArLjVpCisubmYKK1xmQm5vdCAoIGhvc3QgdnMgb3IgYWNlIClcZlIKKy5maQorLmluIC0uNWkKKy5TSCBFWEFNUExFUworLkxQCitUbyBzZWxlY3QgYWxsIHBhY2tldHMgYXJyaXZpbmcgYXQgb3IgZGVwYXJ0aW5nIGZyb20gXGZJc3VuZG93blxmUDoKKy5SUworLm5mCitcZkJob3N0IHN1bmRvd25cZlAKKy5maQorLlJFCisuTFAKK1RvIHNlbGVjdCB0cmFmZmljIGJldHdlZW4gXGZJaGVsaW9zXGZSIGFuZCBlaXRoZXIgXGZJaG90XGZSIG9yIFxmSWFjZVxmUjoKKy5SUworLm5mCitcZkJob3N0IGhlbGlvcyBhbmQgXFwoIGhvdCBvciBhY2UgXFwpXGZQCisuZmkKKy5SRQorLkxQCitUbyBzZWxlY3QgYWxsIElQIHBhY2tldHMgYmV0d2VlbiBcZklhY2VcZlIgYW5kIGFueSBob3N0IGV4Y2VwdCBcZkloZWxpb3NcZlI6CisuUlMKKy5uZgorXGZCaXAgaG9zdCBhY2UgYW5kIG5vdCBoZWxpb3NcZlAKKy5maQorLlJFCisuTFAKK1RvIHNlbGVjdCBhbGwgdHJhZmZpYyBiZXR3ZWVuIGxvY2FsIGhvc3RzIGFuZCBob3N0cyBhdCBCZXJrZWxleToKKy5SUworLm5mCisuQgorbmV0IHVjYi1ldGhlcgorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IGFsbCBmdHAgdHJhZmZpYyB0aHJvdWdoIGludGVybmV0IGdhdGV3YXkgXGZJc251cFxmUDoKKy5SUworLm5mCisuQgorZ2F0ZXdheSBzbnVwIGFuZCAocG9ydCBmdHAgb3IgZnRwLWRhdGEpCisuZmkKKy5SRQorLkxQCitUbyBzZWxlY3QgdHJhZmZpYyBuZWl0aGVyIHNvdXJjZWQgZnJvbSBub3IgZGVzdGluZWQgZm9yIGxvY2FsIGhvc3RzCisoaWYgeW91IGdhdGV3YXkgdG8gb25lIG90aGVyIG5ldCwgdGhpcyBzdHVmZiBzaG91bGQgbmV2ZXIgbWFrZSBpdAorb250byB5b3VyIGxvY2FsIG5ldCkuCisuUlMKKy5uZgorLkIKK2lwIGFuZCBub3QgbmV0IFxmSWxvY2FsbmV0XGZQCisuZmkKKy5SRQorLkxQCitUbyBzZWxlY3QgdGhlIHN0YXJ0IGFuZCBlbmQgcGFja2V0cyAodGhlIFNZTiBhbmQgRklOIHBhY2tldHMpIG9mIGVhY2gKK1RDUCBjb252ZXJzYXRpb24gdGhhdCBpbnZvbHZlcyBhIG5vbi1sb2NhbCBob3N0LgorLlJTCisubmYKKy5CCit0Y3BbdGNwZmxhZ3NdICYgKHRjcC1zeW58dGNwLWZpbikgIT0gMCBhbmQgbm90IHNyYyBhbmQgZHN0IG5ldCBcZklsb2NhbG5ldFxmUAorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IGFsbCBJUHY0IEhUVFAgcGFja2V0cyB0byBhbmQgZnJvbSBwb3J0IDgwLCBpLmUuIHByaW50IG9ubHkKK3BhY2tldHMgdGhhdCBjb250YWluIGRhdGEsIG5vdCwgZm9yIGV4YW1wbGUsIFNZTiBhbmQgRklOIHBhY2tldHMgYW5kCitBQ0stb25seSBwYWNrZXRzLiAgKElQdjYgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci4pCisuUlMKKy5uZgorLkIKK3RjcCBwb3J0IDgwIGFuZCAoKChpcFsyOjJdIC0gKChpcFswXSYweGYpPDwyKSkgLSAoKHRjcFsxMl0mMHhmMCk+PjIpKSAhPSAwKQorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IElQIHBhY2tldHMgbG9uZ2VyIHRoYW4gNTc2IGJ5dGVzIHNlbnQgdGhyb3VnaCBnYXRld2F5IFxmSXNudXBcZlA6CisuUlMKKy5uZgorLkIKK2dhdGV3YXkgc251cCBhbmQgaXBbMjoyXSA+IDU3NgorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IElQIGJyb2FkY2FzdCBvciBtdWx0aWNhc3QgcGFja2V0cyB0aGF0IHdlcmUKKy5JIG5vdAorc2VudCB2aWEgRXRoZXJuZXQgYnJvYWRjYXN0IG9yIG11bHRpY2FzdDoKKy5SUworLm5mCisuQgorZXRoZXJbMF0gJiAxID0gMCBhbmQgaXBbMTZdID49IDIyNAorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IGFsbCBJQ01QIHBhY2tldHMgdGhhdCBhcmUgbm90IGVjaG8gcmVxdWVzdHMvcmVwbGllcyAoaS5lLiwgbm90CitwaW5nIHBhY2tldHMpOgorLlJTCisubmYKKy5CCitpY21wW2ljbXB0eXBlXSAhPSBpY21wLWVjaG8gYW5kIGljbXBbaWNtcHR5cGVdICE9IGljbXAtZWNob3JlcGx5CisuZmkKKy5SRQorLlNIICJTRUUgQUxTTyIKK3BjYXAoM1BDQVApCisuU0ggQlVHUworUGxlYXNlIHNlbmQgcHJvYmxlbXMsIGJ1Z3MsIHF1ZXN0aW9ucywgZGVzaXJhYmxlIGVuaGFuY2VtZW50cywgZXRjLiB0bzoKKy5MUAorLlJTCit0Y3BkdW1wLXdvcmtlcnNAbGlzdHMudGNwZHVtcC5vcmcKKy5SRQorLkxQCitGaWx0ZXIgZXhwcmVzc2lvbnMgb24gZmllbGRzIG90aGVyIHRoYW4gdGhvc2UgaW4gVG9rZW4gUmluZyBoZWFkZXJzIHdpbGwKK25vdCBjb3JyZWN0bHkgaGFuZGxlIHNvdXJjZS1yb3V0ZWQgVG9rZW4gUmluZyBwYWNrZXRzLgorLkxQCitGaWx0ZXIgZXhwcmVzc2lvbnMgb24gZmllbGRzIG90aGVyIHRoYW4gdGhvc2UgaW4gODAyLjExIGhlYWRlcnMgd2lsbCBub3QKK2NvcnJlY3RseSBoYW5kbGUgODAyLjExIGRhdGEgcGFja2V0cyB3aXRoIGJvdGggVG8gRFMgYW5kIEZyb20gRFMgc2V0LgorLkxQCisuQlIgImlwNiBwcm90byIKK3Nob3VsZCBjaGFzZSBoZWFkZXIgY2hhaW4sIGJ1dCBhdCB0aGlzIG1vbWVudCBpdCBkb2VzIG5vdC4KKy5CUiAiaXA2IHByb3RvY2hhaW4iCitpcyBzdXBwbGllZCBmb3IgdGhpcyBiZWhhdmlvci4KKy5MUAorQXJpdGhtZXRpYyBleHByZXNzaW9uIGFnYWluc3QgdHJhbnNwb3J0IGxheWVyIGhlYWRlcnMsIGxpa2UgXGZCdGNwWzBdXGZQLAorZG9lcyBub3Qgd29yayBhZ2FpbnN0IElQdjYgcGFja2V0cy4KK0l0IG9ubHkgbG9va3MgYXQgSVB2NCBwYWNrZXRzLgpkaWZmIC0tZ2l0IGEvcGNhcC1maWx0ZXIubWFubWlzYy5pbiBiL3BjYXAtZmlsdGVyLm1hbm1pc2MuaW4KaW5kZXggZDc0MDE5NC4uOWQzZjM0YiAxMDA2NDQKLS0tIGEvcGNhcC1maWx0ZXIubWFubWlzYy5pbgorKysgYi9wY2FwLWZpbHRlci5tYW5taXNjLmluCkBAIC0xOCw3ICsxOCw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUC1GSUxURVIgQE1BTl9NSVNDX0lORk9AICIxNyBNYXkgMjAxMyIKKy5USCBQQ0FQLUZJTFRFUiBATUFOX01JU0NfSU5GT0AgIjMgQXVndXN0IDIwMTUiCiAuU0ggTkFNRQogcGNhcC1maWx0ZXIgXC0gcGFja2V0IGZpbHRlciBzeW50YXgKIC5icgpAQCAtMjk4LDcgKzI5OCw3IEBACiBcZkJpY21wXGZQLCBcZkJpY21wNlxmUCwgXGZCaWdtcFxmUCwgXGZCaWdycFxmUCwgXGZCcGltXGZQLCBcZkJhaFxmUCwKIFxmQmVzcFxmUCwgXGZCdnJycFxmUCwgXGZCdWRwXGZQLCBvciBcZkJ0Y3BcZlAuCiBOb3RlIHRoYXQgdGhlIGlkZW50aWZpZXJzIFxmQnRjcFxmUCwgXGZCdWRwXGZQLCBhbmQgXGZCaWNtcFxmUCBhcmUgYWxzbwota2V5d29yZHMgYW5kIG11c3QgYmUgZXNjYXBlZCB2aWEgYmFja3NsYXNoIChcXCksIHdoaWNoIGlzIFxcXFwgaW4gdGhlIEMtc2hlbGwuCitrZXl3b3JkcyBhbmQgbXVzdCBiZSBlc2NhcGVkIHZpYSBiYWNrc2xhc2ggKFxcKS4KIE5vdGUgdGhhdCB0aGlzIHByaW1pdGl2ZSBkb2VzIG5vdCBjaGFzZSB0aGUgcHJvdG9jb2wgaGVhZGVyIGNoYWluLgogLklQICJcZkJpcDYgcHJvdG8gXGZJcHJvdG9jb2xcZlIiCiBUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NiBwYWNrZXQgb2YgcHJvdG9jb2wgdHlwZSBcZklwcm90b2NvbFxmUC4KQEAgLTM3Miw5ICszNzIsOSBAQAogTm90ZSB0aGVzZSBpZGVudGlmaWVycyBhcmUgYWxzbyBrZXl3b3JkcwogYW5kIG11c3QgYmUgZXNjYXBlZCB2aWEgYmFja3NsYXNoIChcXCkuCiAuSVAKLVtJbiB0aGUgY2FzZSBvZiBGRERJIChlLmcuLCBgXGZCZmRkaSBwcm90b2NvbCBhcnBcZlInKSwgVG9rZW4gUmluZwotKGUuZy4sIGBcZkJ0ciBwcm90b2NvbCBhcnBcZlInKSwgYW5kIElFRUUgODAyLjExIHdpcmVsZXNzIExBTlMgKGUuZy4sCi1gXGZCd2xhbiBwcm90b2NvbCBhcnBcZlInKSwgZm9yIG1vc3Qgb2YgdGhvc2UgcHJvdG9jb2xzLCB0aGUKK1tJbiB0aGUgY2FzZSBvZiBGRERJIChlLmcuLCBgXGZCZmRkaSBwcm90byBhcnBcZlInKSwgVG9rZW4gUmluZworKGUuZy4sIGBcZkJ0ciBwcm90byBhcnBcZlInKSwgYW5kIElFRUUgODAyLjExIHdpcmVsZXNzIExBTlMgKGUuZy4sCitgXGZCd2xhbiBwcm90byBhcnBcZlInKSwgZm9yIG1vc3Qgb2YgdGhvc2UgcHJvdG9jb2xzLCB0aGUKIHByb3RvY29sIGlkZW50aWZpY2F0aW9uIGNvbWVzIGZyb20gdGhlIDgwMi4yIExvZ2ljYWwgTGluayBDb250cm9sIChMTEMpCiBoZWFkZXIsIHdoaWNoIGlzIHVzdWFsbHkgbGF5ZXJlZCBvbiB0b3Agb2YgdGhlIEZEREksIFRva2VuIFJpbmcsIG9yCiA4MDIuMTEgaGVhZGVyLgpAQCAtODc5LDggKzg3OSw3IEBACiAuTFAKIFByaW1pdGl2ZXMgbWF5IGJlIGNvbWJpbmVkIHVzaW5nOgogLklQCi1BIHBhcmVudGhlc2l6ZWQgZ3JvdXAgb2YgcHJpbWl0aXZlcyBhbmQgb3BlcmF0b3JzCi0ocGFyZW50aGVzZXMgYXJlIHNwZWNpYWwgdG8gdGhlIFNoZWxsIGFuZCBtdXN0IGJlIGVzY2FwZWQpLgorQSBwYXJlbnRoZXNpemVkIGdyb3VwIG9mIHByaW1pdGl2ZXMgYW5kIG9wZXJhdG9ycy4KIC5JUAogTmVnYXRpb24gKGBcZkIhXGZQJyBvciBgXGZCbm90XGZQJykuCiAuSVAKZGlmZiAtLWdpdCBhL3BjYXAtaW50LmggYi9wY2FwLWludC5oCmluZGV4IDJmNzFlMTEuLjdkYjdmZjUgMTAwNjQ0Ci0tLSBhL3BjYXAtaW50LmgKKysrIGIvcGNhcC1pbnQuaApAQCAtNDAsMTQgKzQwLDE2IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDxQYWNrZXQzMi5oPgotZXh0ZXJuIENSSVRJQ0FMX1NFQ1RJT04gZ19QY2FwQ29tcGlsZUNyaXRpY2FsU2VjdGlvbjsKLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0jaWZkZWYgTVNET1MKLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGlvLmg+CisjaWYgZGVmaW5lZChfV0lOMzIpCisgIC8qCisgICAqIE1ha2Ugc3VyZSBQYWNrZXQzMi5oIGRvZXNuJ3QgZGVmaW5lIEJQRiBzdHJ1Y3R1cmVzIHRoYXQgd2UndmUKKyAgICogcHJvYmFibHkgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcmVzdWx0IG9mIGluY2x1ZGluZyA8cGNhcC9wY2FwLmg+LgorICAgKi8KKyAgI2RlZmluZSBCUEZfTUFKT1JfVkVSU0lPTgorICAjaW5jbHVkZSA8UGFja2V0MzIuaD4KKyNlbGlmIGRlZmluZWQoTVNET1MpCisgICNpbmNsdWRlIDxmY250bC5oPgorICAjaW5jbHVkZSA8aW8uaD4KICNlbmRpZgogCiAjaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8PSAxMjAwKSkgLyogd2UgYXJlIGNvbXBpbGluZyB3aXRoIFZpc3VhbCBTdHVkaW8gNiwgdGhhdCBkb2Vzbid0IHN1cHBvcnQgdGhlIExMIHN1ZmZpeCovCkBAIC0xMDYsOSArMTA4LDkgQEAKICNkZWZpbmUgTUFYSU1VTV9TTkFQTEVOCQkyNjIxNDQKIAogc3RydWN0IHBjYXBfb3B0IHsKLQljaGFyCSpzb3VyY2U7CisJY2hhcgkqZGV2aWNlOwogCWludAl0aW1lb3V0OwkvKiB0aW1lb3V0IGZvciBidWZmZXJpbmcgKi8KLQlpbnQJYnVmZmVyX3NpemU7CisJdV9pbnQJYnVmZmVyX3NpemU7CiAJaW50CXByb21pc2M7CiAJaW50CXJmbW9uOwkJLyogbW9uaXRvciBtb2RlICovCiAJaW50CWltbWVkaWF0ZTsJLyogaW1tZWRpYXRlIG1vZGUgLSBkZWxpdmVyIHBhY2tldHMgYXMgc29vbiBhcyB0aGV5IGFycml2ZSAqLwpAQCAtMTI2LDExICsxMjgsMTkgQEAKIHR5cGVkZWYgaW50CSgqZ2V0bm9uYmxvY2tfb3BfdCkocGNhcF90ICosIGNoYXIgKik7CiB0eXBlZGVmIGludAkoKnNldG5vbmJsb2NrX29wX3QpKHBjYXBfdCAqLCBpbnQsIGNoYXIgKik7CiB0eXBlZGVmIGludAkoKnN0YXRzX29wX3QpKHBjYXBfdCAqLCBzdHJ1Y3QgcGNhcF9zdGF0ICopOwotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCit0eXBlZGVmIHN0cnVjdCBwY2FwX3N0YXQgKigqc3RhdHNfZXhfb3BfdCkocGNhcF90ICosIGludCAqKTsKIHR5cGVkZWYgaW50CSgqc2V0YnVmZl9vcF90KShwY2FwX3QgKiwgaW50KTsKIHR5cGVkZWYgaW50CSgqc2V0bW9kZV9vcF90KShwY2FwX3QgKiwgaW50KTsKIHR5cGVkZWYgaW50CSgqc2V0bWludG9jb3B5X29wX3QpKHBjYXBfdCAqLCBpbnQpOwotdHlwZWRlZiBBZGFwdGVyICooKmdldGFkYXB0ZXJfb3BfdCkocGNhcF90ICopOwordHlwZWRlZiBIQU5ETEUJKCpnZXRldmVudF9vcF90KShwY2FwX3QgKik7Cit0eXBlZGVmIGludAkoKm9pZF9nZXRfcmVxdWVzdF9vcF90KShwY2FwX3QgKiwgYnBmX3VfaW50MzIsIHZvaWQgKiwgc2l6ZV90ICopOwordHlwZWRlZiBpbnQJKCpvaWRfc2V0X3JlcXVlc3Rfb3BfdCkocGNhcF90ICosIGJwZl91X2ludDMyLCBjb25zdCB2b2lkICosIHNpemVfdCAqKTsKK3R5cGVkZWYgdV9pbnQJKCpzZW5kcXVldWVfdHJhbnNtaXRfb3BfdCkocGNhcF90ICosIHBjYXBfc2VuZF9xdWV1ZSAqLCBpbnQpOwordHlwZWRlZiBpbnQJKCpzZXR1c2VyYnVmZmVyX29wX3QpKHBjYXBfdCAqLCBpbnQpOwordHlwZWRlZiBpbnQJKCpsaXZlX2R1bXBfb3BfdCkocGNhcF90ICosIGNoYXIgKiwgaW50LCBpbnQpOwordHlwZWRlZiBpbnQJKCpsaXZlX2R1bXBfZW5kZWRfb3BfdCkocGNhcF90ICosIGludCk7Cit0eXBlZGVmIFBBaXJwY2FwSGFuZGxlCSgqZ2V0X2FpcnBjYXBfaGFuZGxlX29wX3QpKHBjYXBfdCAqKTsKICNlbmRpZgogdHlwZWRlZiB2b2lkCSgqY2xlYW51cF9vcF90KShwY2FwX3QgKik7CiAKQEAgLTE0NSwyNCArMTU1LDIyIEBACiAJcmVhZF9vcF90IHJlYWRfb3A7CiAKIAkvKgotCSAqIE1ldGhvZCB0byBjYWxsIHRvIHJlYWQgdG8gcmVhZCBwYWNrZXRzIGZyb20gYSBzYXZlZmlsZS4KKwkgKiBNZXRob2QgdG8gY2FsbCB0byByZWFkIHBhY2tldHMgZnJvbSBhIHNhdmVmaWxlLgogCSAqLwogCWludCAoKm5leHRfcGFja2V0X29wKShwY2FwX3QgKiwgc3RydWN0IHBjYXBfcGt0aGRyICosIHVfY2hhciAqKik7CiAKLSNpZmRlZiBXSU4zMgorI2lmZGVmIF9XSU4zMgogCUFEQVBURVIgKmFkYXB0ZXI7Ci0JTFBQQUNLRVQgUGFja2V0OwotCWludCBub25ibG9jazsKICNlbHNlCiAJaW50IGZkOwogCWludCBzZWxlY3RhYmxlX2ZkOwotI2VuZGlmIC8qIFdJTjMyICovCisjZW5kaWYgLyogX1dJTjMyICovCiAKIAkvKgogCSAqIFJlYWQgYnVmZmVyLgogCSAqLwotCWludCBidWZzaXplOwotCXVfY2hhciAqYnVmZmVyOworCXVfaW50IGJ1ZnNpemU7CisJdm9pZCAqYnVmZmVyOwogCXVfY2hhciAqYnA7CiAJaW50IGNjOwogCkBAIC0xNzIsNyArMTgwLDcgQEAKIAogCWludCBzd2FwcGVkOwogCUZJTEUgKnJmaWxlOwkJLyogbnVsbCBpZiBsaXZlIGNhcHR1cmUsIG5vbi1udWxsIGlmIHNhdmVmaWxlICovCi0JaW50IGZkZGlwYWQ7CisJdV9pbnQgZmRkaXBhZDsKIAlzdHJ1Y3QgcGNhcCAqbmV4dDsJLyogbGlzdCBvZiBvcGVuIHBjYXBzIHRoYXQgbmVlZCBzdHVmZiBjbGVhcmVkIG9uIGNsb3NlICovCiAKIAkvKgpAQCAtMTk5LDYgKzIwNywxMCBAQAogCSAqLwogCXVfY2hhciAqcGt0OwogCisjaWZkZWYgX1dJTjMyCisJc3RydWN0IHBjYXBfc3RhdCBzdGF0OwkJLyogdXNlZCBmb3IgcGNhcF9zdGF0c19leCgpICovCisjZW5kaWYKKwogCS8qIFdlJ3JlIGFjY2VwdGluZyBvbmx5IHBhY2tldHMgaW4gdGhpcyBkaXJlY3Rpb24vdGhlc2UgZGlyZWN0aW9ucy4gKi8KIAlwY2FwX2RpcmVjdGlvbl90IGRpcmVjdGlvbjsKIApAQCAtMjQwLDE1ICsyNTIsMjMgQEAKIAkgKi8KIAlwY2FwX2hhbmRsZXIgb25lc2hvdF9jYWxsYmFjazsKIAotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCiAJLyoKIAkgKiBUaGVzZSBhcmUsIGF0IGxlYXN0IGN1cnJlbnRseSwgc3BlY2lmaWMgdG8gdGhlIFdpbjMyIE5QRgogCSAqIGRyaXZlci4KIAkgKi8KKwlzdGF0c19leF9vcF90IHN0YXRzX2V4X29wOwogCXNldGJ1ZmZfb3BfdCBzZXRidWZmX29wOwogCXNldG1vZGVfb3BfdCBzZXRtb2RlX29wOwogCXNldG1pbnRvY29weV9vcF90IHNldG1pbnRvY29weV9vcDsKLQlnZXRhZGFwdGVyX29wX3QgZ2V0YWRhcHRlcl9vcDsKKwlnZXRldmVudF9vcF90IGdldGV2ZW50X29wOworCW9pZF9nZXRfcmVxdWVzdF9vcF90IG9pZF9nZXRfcmVxdWVzdF9vcDsKKwlvaWRfc2V0X3JlcXVlc3Rfb3BfdCBvaWRfc2V0X3JlcXVlc3Rfb3A7CisJc2VuZHF1ZXVlX3RyYW5zbWl0X29wX3Qgc2VuZHF1ZXVlX3RyYW5zbWl0X29wOworCXNldHVzZXJidWZmZXJfb3BfdCBzZXR1c2VyYnVmZmVyX29wOworCWxpdmVfZHVtcF9vcF90IGxpdmVfZHVtcF9vcDsKKwlsaXZlX2R1bXBfZW5kZWRfb3BfdCBsaXZlX2R1bXBfZW5kZWRfb3A7CisJZ2V0X2FpcnBjYXBfaGFuZGxlX29wX3QgZ2V0X2FpcnBjYXBfaGFuZGxlX29wOwogI2VuZGlmCiAJY2xlYW51cF9vcF90IGNsZWFudXBfb3A7CiB9OwpAQCAtMzM4LDM0ICszNTgsMTUgQEAKIAlwY2FwX3QgKnBkOwogfTsKIAotaW50CXl5bGV4KHZvaWQpOwotCiAjaWZuZGVmIG1pbgogI2RlZmluZSBtaW4oYSwgYikgKChhKSA+IChiKSA/IChiKSA6IChhKSkKICNlbmRpZgogCi0vKiBYWFggc2hvdWxkIHRoZXNlIGJlIGluIHBjYXAuaD8gKi8KIGludAlwY2FwX29mZmxpbmVfcmVhZChwY2FwX3QgKiwgaW50LCBwY2FwX2hhbmRsZXIsIHVfY2hhciAqKTsKLWludAlwY2FwX3JlYWQocGNhcF90ICosIGludCBjbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOwotCi0jaWZuZGVmIEhBVkVfU1RSTENQWQotI2RlZmluZSBzdHJsY3B5KHgsIHksIHopIFwKLQkoc3RybmNweSgoeCksICh5KSwgKHopKSwgXAotCSAoKHopIDw9IDAgPyAwIDogKCh4KVsoeikgLSAxXSA9ICdcMCcpKSwgXAotCSBzdHJsZW4oKHkpKSkKLSNlbmRpZgogCiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKLSNpZiAhZGVmaW5lZChIQVZFX1NOUFJJTlRGKQotI2RlZmluZSBzbnByaW50ZiBwY2FwX3NucHJpbnRmCi1leHRlcm4gaW50IHNucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChIQVZFX1ZTTlBSSU5URikKLSNkZWZpbmUgdnNucHJpbnRmIHBjYXBfdnNucHJpbnRmCi1leHRlcm4gaW50IHZzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCBhcCk7Ci0jZW5kaWYKKyNpbmNsdWRlICJwb3J0YWJpbGl0eS5oIgogCiAvKgogICogRG9lcyB0aGUgcGFja2V0IGNvdW50IGFyZ3VtZW50IHRvIGEgbW9kdWxlJ3MgcmVhZCByb3V0aW5lIHNheQpAQCAtMzc2LDcgKzM3Nyw3IEBACiAvKgogICogUm91dGluZXMgdGhhdCBtb3N0IHBjYXAgaW1wbGVtZW50YXRpb25zIGNhbiB1c2UgZm9yIG5vbi1ibG9ja2luZyBtb2RlLgogICovCi0jaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQorI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCiBpbnQJcGNhcF9nZXRub25ibG9ja19mZChwY2FwX3QgKiwgY2hhciAqKTsKIGludAlwY2FwX3NldG5vbmJsb2NrX2ZkKHBjYXBfdCAqcCwgaW50LCBjaGFyICopOwogI2VuZGlmCkBAIC0zOTMsMzggKzM5NCw0MyBAQAogICogYnkgcGNhcF9jcmVhdGUgcm91dGluZXMuCiAgKi8KIHBjYXBfdAkqcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKLXBjYXBfdAkqcGNhcF9jcmVhdGVfY29tbW9uKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzaXplX3QpOworcGNhcF90CSpwY2FwX2NyZWF0ZV9jb21tb24oY2hhciAqLCBzaXplX3QpOwogaW50CXBjYXBfZG9fYWRkZXhpdChwY2FwX3QgKik7CiB2b2lkCXBjYXBfYWRkX3RvX3BjYXBzX3RvX2Nsb3NlKHBjYXBfdCAqKTsKIHZvaWQJcGNhcF9yZW1vdmVfZnJvbV9wY2Fwc190b19jbG9zZShwY2FwX3QgKik7CiB2b2lkCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwY2FwX3QgKik7Ci1pbnQJcGNhcF9ub3RfaW5pdGlhbGl6ZWQocGNhcF90ICopOwogaW50CXBjYXBfY2hlY2tfYWN0aXZhdGVkKHBjYXBfdCAqKTsKIAogLyoKICAqIEludGVybmFsIGludGVyZmFjZXMgZm9yICJwY2FwX2ZpbmRhbGxkZXZzKCkiLgogICoKLSAqICJwY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMoKSIgZmluZHMgaW50ZXJmYWNlcyB1c2luZyB0aGUKLSAqICJzdGFuZGFyZCIgbWVjaGFuaXNtcyAoU0lPQ0dJRkNPTkYsICJnZXRpZmFkZHJzKCkiLCBldGMuKS4KLSAqCiAgKiAicGNhcF9wbGF0Zm9ybV9maW5kZGV2cygpIiBpcyBhIHBsYXRmb3JtLWRlcGVuZGVudCByb3V0aW5lIHRvCi0gKiBhZGQgZGV2aWNlcyBub3QgZm91bmQgYnkgdGhlICJzdGFuZGFyZCIgbWVjaGFuaXNtcy4KKyAqIGZpbmQgbG9jYWwgbmV0d29yayBpbnRlcmZhY2VzLgorICoKKyAqICJwY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMoKSIgaXMgYSBoZWxwZXIgdG8gZmluZCB0aG9zZSBpbnRlcmZhY2VzCisgKiB1c2luZyB0aGUgInN0YW5kYXJkIiBtZWNoYW5pc21zIChTSU9DR0lGQ09ORiwgImdldGlmYWRkcnMoKSIsIGV0Yy4pLgogICoKICAqICJwY2FwX2FkZF9pZigpIiBhZGRzIGFuIGludGVyZmFjZSB0byB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzLCBmb3IKICAqIHVzZSBieSB2YXJpb3VzICJmaW5kIGludGVyZmFjZXMiIHJvdXRpbmVzLgogICovCi1pbnQJcGNhcF9maW5kYWxsZGV2c19pbnRlcmZhY2VzKHBjYXBfaWZfdCAqKiwgY2hhciAqKTsKIGludAlwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKiwgY2hhciAqKTsKLWludAlhZGRfYWRkcl90b19pZmxpc3QocGNhcF9pZl90ICoqLCBjb25zdCBjaGFyICosIHVfaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwKLQkgICAgc2l6ZV90LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc2l6ZV90LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc2l6ZV90LAotCSAgICBzdHJ1Y3Qgc29ja2FkZHIgKiwgc2l6ZV90LCBjaGFyICopOworI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCitpbnQJcGNhcF9maW5kYWxsZGV2c19pbnRlcmZhY2VzKHBjYXBfaWZfdCAqKiwgY2hhciAqLAorCSAgICBpbnQgKCopKGNvbnN0IGNoYXIgKikpOworI2VuZGlmCitpbnQJYWRkX2FkZHJfdG9faWZsaXN0KHBjYXBfaWZfdCAqKiwgY29uc3QgY2hhciAqLCBicGZfdV9pbnQzMiwKKwkgICAgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwKKwkgICAgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwgY2hhciAqKTsKIGludAlhZGRfYWRkcl90b19kZXYocGNhcF9pZl90ICosIHN0cnVjdCBzb2NrYWRkciAqLCBzaXplX3QsCiAJICAgIHN0cnVjdCBzb2NrYWRkciAqLCBzaXplX3QsIHN0cnVjdCBzb2NrYWRkciAqLCBzaXplX3QsCiAJICAgIHN0cnVjdCBzb2NrYWRkciAqZHN0YWRkciwgc2l6ZV90LCBjaGFyICplcnJidWYpOwotaW50CXBjYXBfYWRkX2lmKHBjYXBfaWZfdCAqKiwgY29uc3QgY2hhciAqLCB1X2ludCwgY29uc3QgY2hhciAqLCBjaGFyICopOwotc3RydWN0IHNvY2thZGRyICpkdXBfc29ja2FkZHIoc3RydWN0IHNvY2thZGRyICosIHNpemVfdCk7Ci1pbnQJYWRkX29yX2ZpbmRfaWYocGNhcF9pZl90ICoqLCBwY2FwX2lmX3QgKiosIGNvbnN0IGNoYXIgKiwgdV9pbnQsCitpbnQJcGNhcF9hZGRfaWYocGNhcF9pZl90ICoqLCBjb25zdCBjaGFyICosIGJwZl91X2ludDMyLCBjb25zdCBjaGFyICosCisJICAgIGNoYXIgKik7CitpbnQJYWRkX29yX2ZpbmRfaWYocGNhcF9pZl90ICoqLCBwY2FwX2lmX3QgKiosIGNvbnN0IGNoYXIgKiwgYnBmX3VfaW50MzIsCiAJICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKKyNpZm5kZWYgX1dJTjMyCiticGZfdV9pbnQzMiBpZl9mbGFnc190b19wY2FwX2ZsYWdzKGNvbnN0IGNoYXIgKiwgdV9pbnQpOworI2VuZGlmCiAKIC8qCiAgKiBJbnRlcm5hbCBpbnRlcmZhY2VzIGZvciAicGNhcF9vcGVuX29mZmxpbmUoKSIuCkBAIC00NDgsOCArNDU0LDggQEAKICAqLwogdm9pZAlwY2FwX29uZXNob3QodV9jaGFyICosIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CiAKLSNpZmRlZiBXSU4zMgotY2hhcgkqcGNhcF93aW4zMnN0cmVycm9yKHZvaWQpOworI2lmZGVmIF9XSU4zMgordm9pZAlwY2FwX3dpbjMyX2Vycl90b19zdHIoRFdPUkQsIGNoYXIgKik7CiAjZW5kaWYKIAogaW50CWluc3RhbGxfYnBmX3Byb2dyYW0ocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKZGlmZiAtLWdpdCBhL3BjYXAtbGliZGxwaS5jIGIvcGNhcC1saWJkbHBpLmMKaW5kZXggMzMzZTUzMi4uNjI1ZjFlMCAxMDA2NDQKLS0tIGEvcGNhcC1saWJkbHBpLmMKKysrIGIvcGNhcC1saWJkbHBpLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCSAqIGRscGlfb3BlbigpIHdpbGwgbm90IGZhaWwgaWYgdGhlIHVuZGVybHlpbmcgbGluayBkb2VzIG5vdCBzdXBwb3J0CiAJICogcGFzc2l2ZSBtb2RlLiBTZWUgZGxwaSg3UCkgZm9yIGRldGFpbHMuCiAJICovCi0JcmV0diA9IGRscGlfb3BlbihwLT5vcHQuc291cmNlLCAmZGgsIERMUElfUkFXfERMUElfUEFTU0lWRSk7CisJcmV0diA9IGRscGlfb3BlbihwLT5vcHQuZGV2aWNlLCAmZGgsIERMUElfUkFXfERMUElfUEFTU0lWRSk7CiAJaWYgKHJldHYgIT0gRExQSV9TVUNDRVNTKSB7CiAJCWlmIChyZXR2ID09IERMUElfRUxJTktOQU1FSU5WQUwgfHwgcmV0diA9PSBETFBJX0VOT0xJTkspCiAJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOwpAQCAtMTE1LDcgKzExNSw3IEBACiAJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOwogCQllbHNlCiAJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwotCQlwY2FwX2xpYmRscGlfZXJyKHAtPm9wdC5zb3VyY2UsICJkbHBpX29wZW4iLCByZXR2LAorCQlwY2FwX2xpYmRscGlfZXJyKHAtPm9wdC5kZXZpY2UsICJkbHBpX29wZW4iLCByZXR2LAogCQkgICAgcC0+ZXJyYnVmKTsKIAkJcmV0dXJuIChzdGF0dXMpOwogCX0KQEAgLTEzMyw3ICsxMzMsNyBAQAogCS8qIEJpbmQgd2l0aCBETFBJX0FOWV9TQVAuICovCiAJaWYgKChyZXR2ID0gZGxwaV9iaW5kKHBkLT5kbHBpX2hkLCBETFBJX0FOWV9TQVAsIDApKSAhPSBETFBJX1NVQ0NFU1MpIHsKIAkJc3RhdHVzID0gUENBUF9FUlJPUjsKLQkJcGNhcF9saWJkbHBpX2VycihwLT5vcHQuc291cmNlLCAiZGxwaV9iaW5kIiwgcmV0diwgcC0+ZXJyYnVmKTsKKwkJcGNhcF9saWJkbHBpX2VycihwLT5vcHQuZGV2aWNlLCAiZGxwaV9iaW5kIiwgcmV0diwgcC0+ZXJyYnVmKTsKIAkJZ290byBiYWQ7CiAJfQogCkBAIC0xODcsNyArMTg3LDcgQEAKIAkvKiBEZXRlcm1pbmUgbGluayB0eXBlLiAgKi8KIAlpZiAoKHJldHYgPSBkbHBpX2luZm8ocGQtPmRscGlfaGQsICZkbGluZm8sIDApKSAhPSBETFBJX1NVQ0NFU1MpIHsKIAkJc3RhdHVzID0gUENBUF9FUlJPUjsKLQkJcGNhcF9saWJkbHBpX2VycihwLT5vcHQuc291cmNlLCAiZGxwaV9pbmZvIiwgcmV0diwgcC0+ZXJyYnVmKTsKKwkJcGNhcF9saWJkbHBpX2VycihwLT5vcHQuZGV2aWNlLCAiZGxwaV9pbmZvIiwgcmV0diwgcC0+ZXJyYnVmKTsKIAkJZ290byBiYWQ7CiAJfQogCkBAIC0yMDksNyArMjA5LDcgQEAKIAkgKi8KIAlpZiAoaW9jdGwocC0+ZmQsIElfRkxVU0gsIEZMVVNIUikgIT0gMCkgewogCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGTFVTSFI6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGTFVTSFI6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtMjU4LDcgKzI1OCw3IEBACiAJCQllcnIgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOwogCQllbHNlCiAJCQllcnIgPSBQQ0FQX0VSUk9SOwotCQlwY2FwX2xpYmRscGlfZXJyKHAtPm9wdC5zb3VyY2UsICJkbHBpX3Byb21pc2NvbiIgU1RSSU5HSUZZKGxldmVsKSwKKwkJcGNhcF9saWJkbHBpX2VycihwLT5vcHQuZGV2aWNlLCAiZGxwaV9wcm9taXNjb24iIFNUUklOR0lGWShsZXZlbCksCiAJCSAgICByZXR2LCBwLT5lcnJidWYpOwogCQlyZXR1cm4gKGVycik7CiAJfQpAQCAtMjY2LDYgKzI2NiwxNyBAQAogfQogCiAvKgorICogUHJlc3VtYWJseSBldmVyeXRoaW5nIHJldHVybmVkIGJ5IGRscGlfd2FsaygpIGlzIGEgRExQSSBkZXZpY2UsCisgKiBzbyB0aGVyZSdzIG5vIHdvcmsgdG8gYmUgZG9uZSBoZXJlIHRvIGNoZWNrIHdoZXRoZXIgbmFtZSByZWZlcnMKKyAqIHRvIGEgRExQSSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQKK2lzX2RscGlfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUgX1VfKQoreworCXJldHVybiAoMSk7Cit9CisKKy8qCiAgKiBJbiBTb2xhcmlzLCB0aGUgInN0YW5kYXJkIiBtZWNoYW5pc20iIGkuZSBTSU9DR0xJRkNPTkYgd2lsbCBvbmx5IGZpbmQKICAqIG5ldHdvcmsgbGlua3MgdGhhdCBhcmUgcGx1bWJlZCBhbmQgYXJlIHVwLiBkbHBpX3dhbGsoM0RMUEkpIHdpbGwgZmluZAogICogYWRkaXRpb25hbCBuZXR3b3JrIGxpbmtzIHByZXNlbnQgaW4gdGhlIHN5c3RlbS4KQEAgLTI3OSwxMiArMjkwLDE4IEBACiAJbGlua3dhbGtfdAlsdyA9IHtOVUxMLCAwfTsKIAlpbnQgCQlzYXZlX2Vycm5vOwogCisJLyoKKwkgKiBHZXQgdGhlIGxpc3Qgb2YgcmVndWxhciBpbnRlcmZhY2VzIGZpcnN0LgorCSAqLworCWlmIChwY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMoYWxsZGV2c3AsIGVycmJ1ZiwgaXNfZGxwaV9pbnRlcmZhY2UpID09IC0xKQorCQlyZXR1cm4gKC0xKTsJLyogZmFpbHVyZSAqLworCiAJLyogZGxwaV93YWxrKCkgZm9yIGxvb3BiYWNrIHdpbGwgYmUgYWRkZWQgaGVyZS4gKi8KIAogCWRscGlfd2FsayhsaXN0X2ludGVyZmFjZXMsICZsdywgMCk7CiAKIAlpZiAobHcubHdfZXJyICE9IDApIHsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJkbHBpX3dhbGs6ICVzIiwgcGNhcF9zdHJlcnJvcihsdy5sd19lcnIpKTsKIAkJcmV0diA9IC0xOwogCQlnb3RvIGRvbmU7CkBAIC0zMzcsNyArMzU0LDcgQEAKIAkJfQogCiAJCW1zZ2xlbiA9IHAtPmJ1ZnNpemU7Ci0JCWJ1ZnAgPSBwLT5idWZmZXIgKyBwLT5vZmZzZXQ7CisJCWJ1ZnAgPSAodV9jaGFyICopcC0+YnVmZmVyICsgcC0+b2Zmc2V0OwogCiAJCXJldHYgPSBkbHBpX3JlY3YocGQtPmRscGlfaGQsIE5VTEwsIE5VTEwsIGJ1ZnAsCiAJCSAgICAmbXNnbGVuLCAtMSwgTlVMTCk7CkBAIC00MDQsMTYgKzQyMSwxNiBAQAogc3RhdGljIHZvaWQKIHBjYXBfbGliZGxwaV9lcnIoY29uc3QgY2hhciAqbGlua25hbWUsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBlcnIsIGNoYXIgKmVycmJ1ZikKIHsKLQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJsaWJwY2FwOiAlcyBmYWlsZWQgb24gJXM6ICVzIiwKKwlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImxpYnBjYXA6ICVzIGZhaWxlZCBvbiAlczogJXMiLAogCSAgICBmdW5jLCBsaW5rbmFtZSwgZGxwaV9zdHJlcnJvcihlcnIpKTsKIH0KIAogcGNhcF90ICoKLXBjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCitwY2FwX2NyZWF0ZV9pbnRlcmZhY2UoY29uc3QgY2hhciAqZGV2aWNlIF9VXywgY2hhciAqZWJ1ZikKIHsKIAlwY2FwX3QgKnA7CiAKLQlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9kbHBpKSk7CisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX2RscGkpKTsKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gKE5VTEwpOwogCmRpZmYgLS1naXQgYS9wY2FwLWxpbmt0eXBlLm1hbm1pc2MgYi9wY2FwLWxpbmt0eXBlLm1hbm1pc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4MDU2NwotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtbGlua3R5cGUubWFubWlzYwpAQCAtMCwwICsxLDQ4IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUC1MSU5LVFlQRSA3ICI3IEFwcmlsIDIwMTQiCisuU0ggTkFNRQorcGNhcC1saW5rdHlwZSBcLSBsaW5rLWxheWVyIGhlYWRlciB0eXBlcyBzdXBwb3J0ZWQgYnkgbGlicGNhcAorLlNIIERFU0NSSVBUSU9OCitGb3IgYSBsaXZlIGNhcHR1cmUgb3IgYGBzYXZlZmlsZScnLCBsaWJwY2FwIHN1cHBsaWVzLCBhcyB0aGUgcmV0dXJuCit2YWx1ZSBvZiB0aGUKKy5CUiBwY2FwX2RhdGFsaW5rICgzUENBUCkKK3JvdXRpbmUsIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgbGluay1sYXllciBoZWFkZXIgYXQgdGhlCitiZWdpbm5pbmcgb2YgdGhlIHBhY2tldHMgaXQgcHJvdmlkZXMuICBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgdHlwZQorb2YgbGluay1sYXllciBoZWFkZXIgdGhhdCB0aGUgcGFja2V0cyBiZWluZyBjYXB0dXJlZCBoYXZlIG9uIHRoZSBuZXR3b3JrCitmcm9tIHdoaWNoIHRoZXkncmUgYmVpbmcgY2FwdHVyZWQ7IGZvciBleGFtcGxlLCBwYWNrZXRzIGZyb20gYW4gSUVFRQorODAyLjExIG5ldHdvcmsgbWlnaHQgYmUgcHJvdmlkZWQgYnkgbGlicGNhcCB3aXRoIEV0aGVybmV0IGhlYWRlcnMgdGhhdAordGhlIG5ldHdvcmsgYWRhcHRlciBvciB0aGUgbmV0d29yayBhZGFwdGVyIGRyaXZlciBnZW5lcmF0ZXMgZnJvbSB0aGUKKzgwMi4xMSBoZWFkZXJzLiAgVGhlIG5hbWVzIGZvciB0aG9zZSB2YWx1ZXMgYmVnaW4gd2l0aAorLkJSIERMVF8gLAorc28gdGhleSBhcmUgc29tZXRpbWVzIGNhbGxlZCAiRExUXyB2YWx1ZXMiLgorLlBQCitUaGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgbGluay1sYXllciBoZWFkZXIgdHlwZSBmaWVsZCBpbiB0aGUgc2F2ZWZpbGUKK2hlYWRlciBhcmUsIGluIG1vc3QgYnV0IG5vdCBhbGwgY2FzZXMsIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZXMgcmV0dXJuZWQKK2J5CisuQlIgcGNhcF9kYXRhbGluaygpIC4KK1RoZSBuYW1lcyBmb3IgdGhvc2UgdmFsdWVzIGJlZ2luIHdpdGgKKy5CUiBMSU5LVFlQRV8gLgorLlBQCitUaGUgbGluay1sYXllciBoZWFkZXIgdHlwZXMgc3VwcG9ydGVkIGJ5IGxpYnBjYXAgYXJlIGRlc2NyaWJlZCBhdAoraHR0cDovL3d3dy50Y3BkdW1wLm9yZy9saW5rdHlwZXMuaHRtbC4KKy5TSCBTRUUgQUxTTworcGNhcF9kYXRhbGluaygzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXAtbGlua3R5cGUubWFubWlzYy5pbiBiL3BjYXAtbGlua3R5cGUubWFubWlzYy5pbgppbmRleCBlNDJjNWIzLi43NjM0YTk2IDEwMDY0NAotLS0gYS9wY2FwLWxpbmt0eXBlLm1hbm1pc2MuaW4KKysrIGIvcGNhcC1saW5rdHlwZS5tYW5taXNjLmluCkBAIC0xOCw3ICsxOCw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUC1MSU5LVFlQRSBATUFOX01JU0NfSU5GT0AgIjEyIE1hcmNoIDIwMTEiCisuVEggUENBUC1MSU5LVFlQRSBATUFOX01JU0NfSU5GT0AgIjcgQXByaWwgMjAxNCIKIC5TSCBOQU1FCiBwY2FwLWxpbmt0eXBlIFwtIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzIHN1cHBvcnRlZCBieSBsaWJwY2FwCiAuU0ggREVTQ1JJUFRJT04KZGlmZiAtLWdpdCBhL3BjYXAtbGludXguYyBiL3BjYXAtbGludXguYwppbmRleCBhMjI2ZGExLi45MjRkZjQyIDEwMDY0NAotLS0gYS9wY2FwLWxpbnV4LmMKKysrIGIvcGNhcC1saW51eC5jCkBAIC0yMjEsNyArMjIxLDE2IEBACiAKICNpZmRlZiBIQVZFX0xJTlVYX0lGX0JPTkRJTkdfSAogI2luY2x1ZGUgPGxpbnV4L2lmX2JvbmRpbmcuaD4KKworLyoKKyAqIFRoZSBpb2N0bCBjb2RlIHRvIHVzZSB0byBjaGVjayB3aGV0aGVyIGEgZGV2aWNlIGlzIGEgYm9uZGluZyBkZXZpY2UuCisgKi8KKyNpZiBkZWZpbmVkKFNJT0NCT05ESU5GT1FVRVJZKQorCSNkZWZpbmUgQk9ORF9JTkZPX1FVRVJZX0lPQ1RMIFNJT0NCT05ESU5GT1FVRVJZCisjZWxpZiBkZWZpbmVkKEJPTkRfSU5GT19RVUVSWV9PTEQpCisJI2RlZmluZSBCT05EX0lORk9fUVVFUllfSU9DVEwgQk9ORF9JTkZPX1FVRVJZX09MRAogI2VuZGlmCisjZW5kaWYgLyogSEFWRV9MSU5VWF9JRl9CT05ESU5HX0ggKi8KIAogLyoKICAqIEdvdCBXaXJlbGVzcyBFeHRlbnNpb25zPwpAQCAtMzEwLDYgKzMxOSw3IEBACiAJdV9pbnQJdHBfdmVyc2lvbjsJLyogdmVyc2lvbiBvZiB0cGFja2V0X2hkciBmb3IgbW1hcGVkIHJpbmcgKi8KIAl1X2ludAl0cF9oZHJsZW47CS8qIGhkcmxlbiBvZiB0cGFja2V0X2hkciBmb3IgbW1hcGVkIHJpbmcgKi8KIAl1X2NoYXIJKm9uZXNob3RfYnVmZmVyOyAvKiBidWZmZXIgZm9yIGNvcHkgb2YgcGFja2V0ICovCisJaW50CXBvbGxfdGltZW91dDsJLyogdGltZW91dCB0byB1c2UgaW4gcG9sbCgpICovCiAjaWZkZWYgSEFWRV9UUEFDS0VUMwogCXVuc2lnbmVkIGNoYXIgKmN1cnJlbnRfcGFja2V0OyAvKiBDdXJyZW50IHBhY2tldCB3aXRoaW4gdGhlIFRQQUNLRVRfVjMgYmxvY2suIE1vdmUgdG8gbmV4dCBibG9jayBpZiBOVUxMLiAqLwogCWludCBwYWNrZXRzX2xlZnQ7IC8qIFVuaGFuZGxlZCBwYWNrZXRzIGxlZnQgd2l0aGluIHRoZSBibG9jayBmcm9tIHByZXZpb3VzIGNhbGwgdG8gcGNhcF9yZWFkX2xpbnV4X21tYXBfdjMgaW4gY2FzZSBvZiBUUEFDS0VUX1YzLiAqLwpAQCAtMzc4LDcgKzM4OCw4IEBACiB9OwogCiAjaWZkZWYgSEFWRV9QQUNLRVRfUklORwotI2RlZmluZSBSSU5HX0dFVF9GUkFNRShoKSAoKCh1bmlvbiB0aGRyICoqKWgtPmJ1ZmZlcilbaC0+b2Zmc2V0XSkKKyNkZWZpbmUgUklOR19HRVRfRlJBTUVfQVQoaCwgb2Zmc2V0KSAoKCh1bmlvbiB0aGRyICoqKWgtPmJ1ZmZlcilbKG9mZnNldCldKQorI2RlZmluZSBSSU5HX0dFVF9DVVJSRU5UX0ZSQU1FKGgpIFJJTkdfR0VUX0ZSQU1FX0FUKGgsIGgtPm9mZnNldCkKIAogc3RhdGljIHZvaWQgZGVzdHJveV9yaW5nKHBjYXBfdCAqaGFuZGxlKTsKIHN0YXRpYyBpbnQgY3JlYXRlX3JpbmcocGNhcF90ICpoYW5kbGUsIGludCAqc3RhdHVzKTsKQEAgLTQyMiw3ICs0MzMsOCBAQAogICAgIGNvbnN0IGNoYXIgKmRldmljZSk7CiAjZW5kaWYgLyogSEFWRV9QRl9QQUNLRVRfU09DS0VUUyAqLwogI2lmIGRlZmluZWQoSEFWRV9MSU5VWF9ORVRfVFNUQU1QX0gpICYmIGRlZmluZWQoUEFDS0VUX1RJTUVTVEFNUCkKLXN0YXRpYyBpbnQJaWZhY2VfZXRodG9vbF9nZXRfdHNfaW5mbyhwY2FwX3QgKmhhbmRsZSwgY2hhciAqZWJ1Zik7CitzdGF0aWMgaW50CWlmYWNlX2V0aHRvb2xfZ2V0X3RzX2luZm8oY29uc3QgY2hhciAqZGV2aWNlLCBwY2FwX3QgKmhhbmRsZSwKKyAgICBjaGFyICplYnVmKTsKICNlbmRpZgogI2lmZGVmIEhBVkVfUEFDS0VUX1JJTkcKIHN0YXRpYyBpbnQJaWZhY2VfZ2V0X29mZmxvYWQocGNhcF90ICpoYW5kbGUpOwpAQCAtNDQ3LDcgKzQ1OSw3IEBACiB7CiAJcGNhcF90ICpoYW5kbGU7CiAKLQloYW5kbGUgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX2xpbnV4KSk7CisJaGFuZGxlID0gcGNhcF9jcmVhdGVfY29tbW9uKGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfbGludXgpKTsKIAlpZiAoaGFuZGxlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCkBAIC00NTgsOCArNDcwLDggQEAKIAkvKgogCSAqIFNlZSB3aGF0IHRpbWUgc3RhbXAgdHlwZXMgd2Ugc3VwcG9ydC4KIAkgKi8KLQlpZiAoaWZhY2VfZXRodG9vbF9nZXRfdHNfaW5mbyhoYW5kbGUsIGVidWYpID09IC0xKSB7Ci0JCWZyZWUoaGFuZGxlKTsKKwlpZiAoaWZhY2VfZXRodG9vbF9nZXRfdHNfaW5mbyhkZXZpY2UsIGhhbmRsZSwgZWJ1ZikgPT0gLTEpIHsKKwkJcGNhcF9jbG9zZShoYW5kbGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAjZW5kaWYKQEAgLTQ3NiwxMSArNDg4LDkgQEAKIAloYW5kbGUtPnRzdGFtcF9wcmVjaXNpb25fY291bnQgPSAyOwogCWhhbmRsZS0+dHN0YW1wX3ByZWNpc2lvbl9saXN0ID0gbWFsbG9jKDIgKiBzaXplb2YodV9pbnQpKTsKIAlpZiAoaGFuZGxlLT50c3RhbXBfcHJlY2lzaW9uX2xpc3QgPT0gTlVMTCkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQlpZiAoaGFuZGxlLT50c3RhbXBfdHlwZV9saXN0ICE9IE5VTEwpCi0JCQlmcmVlKGhhbmRsZS0+dHN0YW1wX3R5cGVfbGlzdCk7Ci0JCWZyZWUoaGFuZGxlKTsKKwkJcGNhcF9jbG9zZShoYW5kbGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJaGFuZGxlLT50c3RhbXBfcHJlY2lzaW9uX2xpc3RbMF0gPSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk87CkBAIC01MzIsNyArNTQyLDcgQEAKICAqCiAgKiBZZXMsIHlvdSBjYW4gaGF2ZSBtdWx0aXBsZSBtb25pdG9yIGRldmljZXMgZm9yIGEgZ2l2ZW4KICAqIHBoeXNpY2FsIGRldmljZS4KLSovCisgKi8KIAogLyoKICAqIElzIHRoaXMgYSBtYWM4MDIxMSBkZXZpY2U/ICBJZiBzbywgZmlsbCBpbiB0aGUgcGh5c2ljYWwgZGV2aWNlIHBhdGggYW5kCkBAIC01NTAsNyArNTYwLDcgQEAKIAkgKiBHZW5lcmF0ZSB0aGUgcGF0aCBzdHJpbmcgZm9yIHRoZSBzeW1saW5rIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2UuCiAJICovCiAJaWYgKGFzcHJpbnRmKCZwYXRoc3RyLCAiL3N5cy9jbGFzcy9uZXQvJXMvcGh5ODAyMTEiLCBkZXZpY2UpID09IC0xKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIiVzOiBDYW4ndCBnZW5lcmF0ZSBwYXRoIG5hbWUgc3RyaW5nIGZvciAvc3lzL2NsYXNzL25ldCBkZXZpY2UiLAogCQkgICAgZGV2aWNlKTsKIAkJcmV0dXJuIFBDQVBfRVJST1I7CkBAIC01NjUsNyArNTc1LDcgQEAKIAkJCWZyZWUocGF0aHN0cik7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICIlczogQ2FuJ3QgcmVhZGxpbmsgJXM6ICVzIiwgZGV2aWNlLCBwYXRoc3RyLAogCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKIAkJZnJlZShwYXRoc3RyKTsKQEAgLTYyMiwyMCArNjMyLDIwIEBACiAKIAlzdGF0ZS0+bmxfc29jayA9IG5sX3NvY2tldF9hbGxvYygpOwogCWlmICghc3RhdGUtPm5sX3NvY2spIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBuZXRsaW5rIGhhbmRsZSIsIGRldmljZSk7CiAJCXJldHVybiBQQ0FQX0VSUk9SOwogCX0KIAogCWlmIChnZW5sX2Nvbm5lY3Qoc3RhdGUtPm5sX3NvY2spKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIiVzOiBmYWlsZWQgdG8gY29ubmVjdCB0byBnZW5lcmljIG5ldGxpbmsiLCBkZXZpY2UpOwogCQlnb3RvIG91dF9oYW5kbGVfZGVzdHJveTsKIAl9CiAKIAllcnIgPSBnZW5sX2N0cmxfYWxsb2NfY2FjaGUoc3RhdGUtPm5sX3NvY2ssICZzdGF0ZS0+bmxfY2FjaGUpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgZ2VuZXJpYyBuZXRsaW5rIGNhY2hlOiAlcyIsCiAJCSAgICBkZXZpY2UsIGdldF9ubF9lcnJtc2coLWVycikpOwogCQlnb3RvIG91dF9oYW5kbGVfZGVzdHJveTsKQEAgLTY0Myw3ICs2NTMsNyBAQAogCiAJc3RhdGUtPm5sODAyMTEgPSBnZW5sX2N0cmxfc2VhcmNoX2J5X25hbWUoc3RhdGUtPm5sX2NhY2hlLCAibmw4MDIxMSIpOwogCWlmICghc3RhdGUtPm5sODAyMTEpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiJXM6IG5sODAyMTEgbm90IGZvdW5kIiwgZGV2aWNlKTsKIAkJZ290byBvdXRfY2FjaGVfZnJlZTsKIAl9CkBAIC02NjYsOSArNjc2LDE0IEBACiB9CiAKIHN0YXRpYyBpbnQKK2RlbF9tb25faWYocGNhcF90ICpoYW5kbGUsIGludCBzb2NrX2ZkLCBzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSAqc3RhdGUsCisgICAgY29uc3QgY2hhciAqZGV2aWNlLCBjb25zdCBjaGFyICptb25kZXZpY2UpOworCitzdGF0aWMgaW50CiBhZGRfbW9uX2lmKHBjYXBfdCAqaGFuZGxlLCBpbnQgc29ja19mZCwgc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLAogICAgIGNvbnN0IGNoYXIgKmRldmljZSwgY29uc3QgY2hhciAqbW9uZGV2aWNlKQogeworCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OwogCWludCBpZmluZGV4OwogCXN0cnVjdCBubF9tc2cgKm1zZzsKIAlpbnQgZXJyOwpAQCAtNjc5LDcgKzY5NCw3IEBACiAKIAltc2cgPSBubG1zZ19hbGxvYygpOwogCWlmICghbXNnKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV0bGluayBtc2ciLCBkZXZpY2UpOwogCQlyZXR1cm4gUENBUF9FUlJPUjsKIAl9CkBAIC03MTEsNyArNzI2LDcgQEAKIAkJCSAqIFJlYWwgZmFpbHVyZSwgbm90IGp1c3QgInRoYXQgZGV2aWNlIGlzIG5vdAogCQkJICogYXZhaWxhYmxlLgogCQkJICovCi0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIiVzOiBubF9zZW5kX2F1dG9fY29tcGxldGUgZmFpbGVkIGFkZGluZyAlcyBpbnRlcmZhY2U6ICVzIiwKIAkJCSAgICBkZXZpY2UsIG1vbmRldmljZSwgZ2V0X25sX2Vycm1zZygtZXJyKSk7CiAJCQlubG1zZ19mcmVlKG1zZyk7CkBAIC03MzksNyArNzU0LDcgQEAKIAkJCSAqIFJlYWwgZmFpbHVyZSwgbm90IGp1c3QgInRoYXQgZGV2aWNlIGlzIG5vdAogCQkJICogYXZhaWxhYmxlLgogCQkJICovCi0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIiVzOiBubF93YWl0X2Zvcl9hY2sgZmFpbGVkIGFkZGluZyAlcyBpbnRlcmZhY2U6ICVzIiwKIAkJCSAgICBkZXZpY2UsIG1vbmRldmljZSwgZ2V0X25sX2Vycm1zZygtZXJyKSk7CiAJCQlubG1zZ19mcmVlKG1zZyk7CkBAIC03NTEsMTAgKzc2NiwyNCBAQAogCSAqIFN1Y2Nlc3MuCiAJICovCiAJbmxtc2dfZnJlZShtc2cpOworCisJLyoKKwkgKiBUcnkgdG8gcmVtZW1iZXIgdGhlIG1vbml0b3IgZGV2aWNlLgorCSAqLworCWhhbmRsZXAtPm1vbmRldmljZSA9IHN0cmR1cChtb25kZXZpY2UpOworCWlmIChoYW5kbGVwLT5tb25kZXZpY2UgPT0gTlVMTCkgeworCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic3RyZHVwOiAlcyIsCisJCQkgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkvKgorCQkgKiBHZXQgcmlkIG9mIHRoZSBtb25pdG9yIGRldmljZS4KKwkJICovCisJCWRlbF9tb25faWYoaGFuZGxlLCBzb2NrX2ZkLCBzdGF0ZSwgZGV2aWNlLCBtb25kZXZpY2UpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CiAJcmV0dXJuIDE7CiAKIG5sYV9wdXRfZmFpbHVyZToKLQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCSAgICAiJXM6IG5sX3B1dCBmYWlsZWQgYWRkaW5nICVzIGludGVyZmFjZSIsCiAJICAgIGRldmljZSwgbW9uZGV2aWNlKTsKIAlubG1zZ19mcmVlKG1zZyk7CkBAIC03NzUsNyArODA0LDcgQEAKIAogCW1zZyA9IG5sbXNnX2FsbG9jKCk7CiAJaWYgKCFtc2cpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBuZXRsaW5rIG1zZyIsIGRldmljZSk7CiAJCXJldHVybiBQQ0FQX0VSUk9SOwogCX0KQEAgLTc4Niw3ICs4MTUsNyBAQAogCiAJZXJyID0gbmxfc2VuZF9hdXRvX2NvbXBsZXRlKHN0YXRlLT5ubF9zb2NrLCBtc2cpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIiVzOiBubF9zZW5kX2F1dG9fY29tcGxldGUgZmFpbGVkIGRlbGV0aW5nICVzIGludGVyZmFjZTogJXMiLAogCQkgICAgZGV2aWNlLCBtb25kZXZpY2UsIGdldF9ubF9lcnJtc2coLWVycikpOwogCQlubG1zZ19mcmVlKG1zZyk7CkBAIC03OTQsNyArODIzLDcgQEAKIAl9CiAJZXJyID0gbmxfd2FpdF9mb3JfYWNrKHN0YXRlLT5ubF9zb2NrKTsKIAlpZiAoZXJyIDwgMCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICIlczogbmxfd2FpdF9mb3JfYWNrIGZhaWxlZCBhZGRpbmcgJXMgaW50ZXJmYWNlOiAlcyIsCiAJCSAgICBkZXZpY2UsIG1vbmRldmljZSwgZ2V0X25sX2Vycm1zZygtZXJyKSk7CiAJCW5sbXNnX2ZyZWUobXNnKTsKQEAgLTgwOCw3ICs4MzcsNyBAQAogCXJldHVybiAxOwogCiBubGFfcHV0X2ZhaWx1cmU6Ci0Jc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkgICAgIiVzOiBubF9wdXQgZmFpbGVkIGRlbGV0aW5nICVzIGludGVyZmFjZSIsCiAJICAgIGRldmljZSwgbW9uZGV2aWNlKTsKIAlubG1zZ19mcmVlKG1zZyk7CkBAIC04NTMsMTAgKzg4MiwxMyBAQAogCQkgKi8KIAkJY2hhciBtb25kZXZpY2VbMysxMCsxXTsJLyogbW9ue1VJTlRfTUFYfVwwICovCiAKLQkJc25wcmludGYobW9uZGV2aWNlLCBzaXplb2YgbW9uZGV2aWNlLCAibW9uJXUiLCBuKTsKKwkJcGNhcF9zbnByaW50Zihtb25kZXZpY2UsIHNpemVvZiBtb25kZXZpY2UsICJtb24ldSIsIG4pOwogCQlyZXQgPSBhZGRfbW9uX2lmKGhhbmRsZSwgc29ja19mZCwgJm5sc3RhdGUsIGRldmljZSwgbW9uZGV2aWNlKTsKIAkJaWYgKHJldCA9PSAxKSB7Ci0JCQloYW5kbGVwLT5tb25kZXZpY2UgPSBzdHJkdXAobW9uZGV2aWNlKTsKKwkJCS8qCisJCQkgKiBTdWNjZXNzLiAgV2UgZG9uJ3QgY2xlYW4gdXAgdGhlIGxpYm5sIHN0YXRlCisJCQkgKiB5ZXQsIGFzIHdlJ2xsIGJlIHVzaW5nIGl0IGxhdGVyLgorCQkJICovCiAJCQlnb3RvIGFkZGVkOwogCQl9CiAJCWlmIChyZXQgPCAwKSB7CkBAIC04NjksNyArOTAxLDcgQEAKIAkJfQogCX0KIAotCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJICAgICIlczogTm8gZnJlZSBtb25OIGludGVyZmFjZXMiLCBkZXZpY2UpOwogCW5sODAyMTFfY2xlYW51cCgmbmxzdGF0ZSk7CiAJcmV0dXJuIFBDQVBfRVJST1I7CkBAIC04OTQsNyArOTI2LDEwIEBACiAJCSAqICJhdGV4aXQoKSIgZmFpbGVkOyBkb24ndCBwdXQgdGhlIGludGVyZmFjZQogCQkgKiBpbiByZm1vbiBtb2RlLCBqdXN0IGdpdmUgdXAuCiAJCSAqLwotCQlyZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJCWRlbF9tb25faWYoaGFuZGxlLCBzb2NrX2ZkLCAmbmxzdGF0ZSwgZGV2aWNlLAorCQkgICAgaGFuZGxlcC0+bW9uZGV2aWNlKTsKKwkJbmw4MDIxMV9jbGVhbnVwKCZubHN0YXRlKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CiAJfQogCiAJLyoKQEAgLTkwMyw3ICs5MzgsNyBAQAogCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CiAJc3RybGNweShpZnIuaWZyX25hbWUsIGhhbmRsZXAtPm1vbmRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwogCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lGRkxBR1MsICZpZnIpID09IC0xKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIiVzOiBDYW4ndCBnZXQgZmxhZ3MgZm9yICVzOiAlcyIsIGRldmljZSwKIAkJICAgIGhhbmRsZXAtPm1vbmRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKIAkJZGVsX21vbl9pZihoYW5kbGUsIHNvY2tfZmQsICZubHN0YXRlLCBkZXZpY2UsCkBAIC05MTMsNyArOTQ4LDcgQEAKIAl9CiAJaWZyLmlmcl9mbGFncyB8PSBJRkZfVVB8SUZGX1JVTk5JTkc7CiAJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiJXM6IENhbid0IHNldCBmbGFncyBmb3IgJXM6ICVzIiwgZGV2aWNlLAogCQkgICAgaGFuZGxlcC0+bW9uZGV2aWNlLCBzdHJlcnJvcihlcnJubykpOwogCQlkZWxfbW9uX2lmKGhhbmRsZSwgc29ja19mZCwgJm5sc3RhdGUsIGRldmljZSwKQEAgLTk1Nyw3ICs5OTIsNyBAQAogc3RhdGljIGludAogaXNfYm9uZGluZ19kZXZpY2UoaW50IGZkLCBjb25zdCBjaGFyICpkZXZpY2UpCiB7Ci0jaWYgZGVmaW5lZChCT05EX0lORk9fUVVFUllfT0xEKSB8fCBkZWZpbmVkKFNJT0NCT05ESU5GT1FVRVJZKQorI2lmZGVmIEJPTkRfSU5GT19RVUVSWV9JT0NUTAogCXN0cnVjdCBpZnJlcSBpZnI7CiAJaWZib25kIGlmYjsKIApAQCAtOTY1LDEzICsxMDAwLDkgQEAKIAlzdHJsY3B5KGlmci5pZnJfbmFtZSwgZGV2aWNlLCBzaXplb2YgaWZyLmlmcl9uYW1lKTsKIAltZW1zZXQoJmlmYiwgMCwgc2l6ZW9mIGlmYik7CiAJaWZyLmlmcl9kYXRhID0gKGNhZGRyX3QpJmlmYjsKLSNpZmRlZiBTSU9DQk9ORElORk9RVUVSWQotCWlmIChpb2N0bChmZCwgU0lPQ0JPTkRJTkZPUVVFUlksICZpZnIpID09IDApCi0jZWxzZSAvKiBTSU9DQk9ORElORk9RVUVSWSAqLwotCWlmIChpb2N0bChmZCwgQk9ORF9JTkZPX1FVRVJZX09MRCwgJmlmcikgPT0gMCkKLSNlbmRpZiAvKiBTSU9DQk9ORElORk9RVUVSWSAqLworCWlmIChpb2N0bChmZCwgQk9ORF9JTkZPX1FVRVJZX0lPQ1RMLCAmaWZyKSA9PSAwKQogCQlyZXR1cm4gMTsJLyogc3VjY2Vzcywgc28gaXQncyBhIGJvbmRpbmcgZGV2aWNlICovCi0jZW5kaWYgLyogZGVmaW5lZChCT05EX0lORk9fUVVFUllfT0xEKSB8fCBkZWZpbmVkKFNJT0NCT05ESU5GT1FVRVJZKSAqLworI2VuZGlmIC8qIEJPTkRfSU5GT19RVUVSWV9JT0NUTCAqLwogCiAJcmV0dXJuIDA7CS8qIG5vLCBpdCdzIG5vdCBhIGJvbmRpbmcgZGV2aWNlICovCiB9CkBAIC05ODksNyArMTAyMCw3IEBACiAJc3RydWN0IGl3cmVxIGlyZXE7CiAjZW5kaWYKIAotCWlmIChzdHJjbXAoaGFuZGxlLT5vcHQuc291cmNlLCAiYW55IikgPT0gMCkgeworCWlmIChzdHJjbXAoaGFuZGxlLT5vcHQuZGV2aWNlLCAiYW55IikgPT0gMCkgewogCQkvKgogCQkgKiBNb25pdG9yIG1vZGUgbWFrZXMgbm8gc2Vuc2Ugb24gdGhlICJhbnkiIGRldmljZS4KIAkJICovCkBAIC0xMDA5LDcgKzEwNDAsNyBAQAogCSAqIHdtYXN0ZXIgZGV2aWNlLCBzbyB3ZSBkb24ndCBib3RoZXIgY2hlY2tpbmcgd2hldGhlcgogCSAqIGEgbWFjODAyMTEgZGV2aWNlIHN1cHBvcnRzIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zLgogCSAqLwotCXJldCA9IGdldF9tYWM4MDIxMV9waHlkZXYoaGFuZGxlLCBoYW5kbGUtPm9wdC5zb3VyY2UsIHBoeWRldl9wYXRoLAorCXJldCA9IGdldF9tYWM4MDIxMV9waHlkZXYoaGFuZGxlLCBoYW5kbGUtPm9wdC5kZXZpY2UsIHBoeWRldl9wYXRoLAogCSAgICBQQVRIX01BWCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CS8qIGVycm9yICovCkBAIC0xMDMwLDEyICsxMDYxLDEyIEBACiAJICovCiAJc29ja19mZCA9IHNvY2tldChQRl9QQUNLRVQsIFNPQ0tfUkFXLCBodG9ucyhFVEhfUF9BTEwpKTsKIAlpZiAoc29ja19mZCA9PSAtMSkgewotCQkodm9pZClzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJKHZvaWQpcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gUENBUF9FUlJPUjsKIAl9CiAKLQlpZiAoaXNfYm9uZGluZ19kZXZpY2Uoc29ja19mZCwgaGFuZGxlLT5vcHQuc291cmNlKSkgeworCWlmIChpc19ib25kaW5nX2RldmljZShzb2NrX2ZkLCBoYW5kbGUtPm9wdC5kZXZpY2UpKSB7CiAJCS8qIEl0J3MgYSBib25kaW5nIGRldmljZSwgc28gZG9uJ3QgZXZlbiB0cnkuICovCiAJCWNsb3NlKHNvY2tfZmQpOwogCQlyZXR1cm4gMDsKQEAgLTEwNDQsNyArMTA3NSw3IEBACiAJLyoKIAkgKiBBdHRlbXB0IHRvIGdldCB0aGUgY3VycmVudCBtb2RlLgogCSAqLwotCXN0cmxjcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGhhbmRsZS0+b3B0LnNvdXJjZSwKKwlzdHJsY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBoYW5kbGUtPm9wdC5kZXZpY2UsCiAJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CiAJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSVdNT0RFLCAmaXJlcSkgIT0gLTEpIHsKIAkJLyoKQEAgLTEwNTUsNyArMTA4Niw3IEBACiAJfQogCWlmIChlcnJubyA9PSBFTk9ERVYpIHsKIAkJLyogVGhlIGRldmljZSBkb2Vzbid0IGV2ZW4gZXhpc3QuICovCi0JCSh2b2lkKXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkodm9pZClwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIlNJT0NHSVdNT0RFIGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWNsb3NlKHNvY2tfZmQpOwogCQlyZXR1cm4gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKQEAgLTEyOTMsNiArMTMyNCw5NCBAQAogfQogCiAvKgorICogU2V0IHRoZSB0aW1lb3V0IHRvIGJlIHVzZWQgaW4gcG9sbCgpIHdpdGggbWVtb3J5LW1hcHBlZCBwYWNrZXQgY2FwdHVyZS4KKyAqLworc3RhdGljIHZvaWQKK3NldF9wb2xsX3RpbWVvdXQoc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXApCit7CisjaWZkZWYgSEFWRV9UUEFDS0VUMworCXN0cnVjdCB1dHNuYW1lIHV0c25hbWU7CisJY2hhciAqdmVyc2lvbl9jb21wb25lbnQsICplbmRwOworCWludCBtYWpvciwgbWlub3I7CisJaW50IGJyb2tlbl90cGFja2V0X3YzID0gMTsKKworCS8qCisJICogU29tZSB2ZXJzaW9ucyBvZiBUUEFDS0VUX1YzIGhhdmUgYW5ub3lpbmcgYnVncy9taXNmZWF0dXJlcworCSAqIGFyb3VuZCB3aGljaCB3ZSBoYXZlIHRvIHdvcmsuICBEZXRlcm1pbmUgaWYgd2UgaGF2ZSB0aG9zZQorCSAqIHByb2JsZW1zIG9yIG5vdC4KKwkgKi8KKwlpZiAodW5hbWUoJnV0c25hbWUpID09IDApIHsKKwkJLyoKKwkJICogMy4xOSBpcyB0aGUgZmlyc3QgcmVsZWFzZSB3aXRoIGEgZml4ZWQgdmVyc2lvbiBvZgorCQkgKiBUUEFDS0VUX1YzLiAgV2UgdHJlYXQgYW55dGhpbmcgYmVmb3JlIHRoYXQgYXMKKwkJICogbm90IGhhdmVpbmcgYSBmaXhlZCB2ZXJzaW9uOyB0aGF0IG1heSByZWFsbHkgbWVhbgorCQkgKiBpdCBoYXMgKm5vKiB2ZXJzaW9uLgorCQkgKi8KKwkJdmVyc2lvbl9jb21wb25lbnQgPSB1dHNuYW1lLnJlbGVhc2U7CisJCW1ham9yID0gc3RydG9sKHZlcnNpb25fY29tcG9uZW50LCAmZW5kcCwgMTApOworCQlpZiAoZW5kcCAhPSB2ZXJzaW9uX2NvbXBvbmVudCAmJiAqZW5kcCA9PSAnLicpIHsKKwkJCS8qCisJCQkgKiBPSywgdGhhdCB3YXMgYSB2YWxpZCBtYWpvciB2ZXJzaW9uLgorCQkJICogR2V0IHRoZSBtaW5vciB2ZXJzaW9uLgorCQkJICovCisJCQl2ZXJzaW9uX2NvbXBvbmVudCA9IGVuZHAgKyAxOworCQkJbWlub3IgPSBzdHJ0b2wodmVyc2lvbl9jb21wb25lbnQsICZlbmRwLCAxMCk7CisJCQlpZiAoZW5kcCAhPSB2ZXJzaW9uX2NvbXBvbmVudCAmJgorCQkJICAgICgqZW5kcCA9PSAnLicgfHwgKmVuZHAgPT0gJ1wwJykpIHsKKwkJCQkvKgorCQkJCSAqIE9LLCB0aGF0IHdhcyBhIHZhbGlkIG1pbm9yIHZlcnNpb24uCisJCQkJICogSXMgdGhpcyAzLjE5IG9yIG5ld2VyPworCQkJCSAqLworCQkJCWlmIChtYWpvciA+PSA0IHx8IChtYWpvciA9PSAzICYmIG1pbm9yID49IDE5KSkgeworCQkJCQkvKiBZZXMuIFRQQUNLRVRfVjMgd29ya3MgY29ycmVjdGx5LiAqLworCQkJCQlicm9rZW5fdHBhY2tldF92MyA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJfQorI2VuZGlmCisJaWYgKGhhbmRsZXAtPnRpbWVvdXQgPT0gMCkgeworI2lmZGVmIEhBVkVfVFBBQ0tFVDMKKwkJLyoKKwkJICogWFhYIC0gZHVlIHRvIGEgc2V0IG9mIChtaXMpZmVhdHVyZXMgaW4gdGhlIFRQQUNLRVRfVjMKKwkJICoga2VybmVsIGNvZGUgcHJpb3IgdG8gdGhlIDMuMTkga2VybmVsLCBibG9ja2luZyBmb3JldmVyCisJCSAqIHdpdGggYSBUUEFDS0VUX1YzIHNvY2tldCBjYW4sIGlmIGZldyBwYWNrZXRzIGFyZQorCQkgKiBhcnJpdmluZyBhbmQgcGFzc2luZyB0aGUgc29ja2V0IGZpbHRlciwgY2F1c2UgbW9zdAorCQkgKiBwYWNrZXRzIHRvIGJlIGRyb3BwZWQuICBTZWUgbGlicGNhcCBpc3N1ZSAjMzM1IGZvciB0aGUKKwkJICogZnVsbCBwYWluZnVsIHN0b3J5LgorCQkgKgorCQkgKiBUaGUgd29ya2Fyb3VuZCBpcyB0byBoYXZlIHBvbGwoKSB0aW1lIG91dCB2ZXJ5IHF1aWNrbHksCisJCSAqIHNvIHdlIGdyYWIgdGhlIGZyYW1lcyBoYW5kZWQgdG8gdXMsIGFuZCByZXR1cm4gdGhlbSB0bworCQkgKiB0aGUga2VybmVsLCBBU0FQLgorCQkgKi8KKwkJaWYgKGhhbmRsZXAtPnRwX3ZlcnNpb24gPT0gVFBBQ0tFVF9WMyAmJiBicm9rZW5fdHBhY2tldF92MykKKwkJCWhhbmRsZXAtPnBvbGxfdGltZW91dCA9IDE7CS8qIGRvbid0IGJsb2NrIGZvciB2ZXJ5IGxvbmcgKi8KKwkJZWxzZQorI2VuZGlmCisJCQloYW5kbGVwLT5wb2xsX3RpbWVvdXQgPSAtMTsJLyogYmxvY2sgZm9yZXZlciAqLworCX0gZWxzZSBpZiAoaGFuZGxlcC0+dGltZW91dCA+IDApIHsKKyNpZmRlZiBIQVZFX1RQQUNLRVQzCisJCS8qCisJCSAqIEZvciBUUEFDS0VUX1YzLCB0aGUgdGltZW91dCBpcyBoYW5kbGVkIGJ5IHRoZSBrZXJuZWwsCisJCSAqIHNvIGJsb2NrIGZvcmV2ZXI7IHRoYXQgd2F5LCB3ZSBkb24ndCBnZXQgZXh0cmEgdGltZW91dHMuCisJCSAqIERvbid0IGRvIHRoYXQgaWYgd2UgaGF2ZSBhIGJyb2tlbiBUUEFDS0VUX1YzLCB0aG91Z2guCisJCSAqLworCQlpZiAoaGFuZGxlcC0+dHBfdmVyc2lvbiA9PSBUUEFDS0VUX1YzICYmICFicm9rZW5fdHBhY2tldF92MykKKwkJCWhhbmRsZXAtPnBvbGxfdGltZW91dCA9IC0xOwkvKiBibG9jayBmb3JldmVyLCBsZXQgVFBBQ0tFVF9WMyB3YWtlIHVzIHVwICovCisJCWVsc2UKKyNlbmRpZgorCQkJaGFuZGxlcC0+cG9sbF90aW1lb3V0ID0gaGFuZGxlcC0+dGltZW91dDsJLyogYmxvY2sgZm9yIHRoYXQgYW1vdW50IG9mIHRpbWUgKi8KKwl9IGVsc2UgeworCQkvKgorCQkgKiBOb24tYmxvY2tpbmcgbW9kZTsgd2UgY2FsbCBwb2xsKCkgdG8gcGljayB1cCBlcnJvcgorCQkgKiBpbmRpY2F0aW9ucywgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8gd2FpdCBmb3IKKwkJICogYW55dGhpbmcuCisJCSAqLworCQloYW5kbGVwLT5wb2xsX3RpbWVvdXQgPSAwOworCX0KK30KKworLyoKICAqICBHZXQgYSBoYW5kbGUgZm9yIGEgbGl2ZSBjYXB0dXJlIGZyb20gdGhlIGdpdmVuIGRldmljZS4gWW91IGNhbgogICogIHBhc3MgTlVMTCBhcyBkZXZpY2UgdG8gZ2V0IGFsbCBwYWNrYWdlcyAod2l0aG91dCBsaW5rIGxldmVsCiAgKiAgaW5mb3JtYXRpb24gb2YgY291cnNlKS4gSWYgeW91IHBhc3MgMSBhcyBwcm9taXNjIHRoZSBpbnRlcmZhY2UKQEAgLTEzMDksNyArMTQyOCw3IEBACiAJaW50CQlzdGF0dXMgPSAwOwogCWludAkJcmV0OwogCi0JZGV2aWNlID0gaGFuZGxlLT5vcHQuc291cmNlOworCWRldmljZSA9IGhhbmRsZS0+b3B0LmRldmljZTsKIAogCS8qCiAJICogTWFrZSBzdXJlIHRoZSBuYW1lIHdlIHdlcmUgaGFuZGVkIHdpbGwgZml0IGludG8gdGhlIGlvY3RscyB3ZQpAQCAtMTM0Niw3ICsxNDY1LDcgQEAKIAkJaWYgKGhhbmRsZS0+b3B0LnByb21pc2MpIHsKIAkJCWhhbmRsZS0+b3B0LnByb21pc2MgPSAwOwogCQkJLyogSnVzdCBhIHdhcm5pbmcuICovCi0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIlByb21pc2N1b3VzIG1vZGUgbm90IHN1cHBvcnRlZCBvbiB0aGUgXCJhbnlcIiBkZXZpY2UiKTsKIAkJCXN0YXR1cyA9IFBDQVBfV0FSTklOR19QUk9NSVNDX05PVFNVUDsKIAkJfQpAQCAtMTM1NCw3ICsxNDczLDcgQEAKIAogCWhhbmRsZXAtPmRldmljZQk9IHN0cmR1cChkZXZpY2UpOwogCWlmIChoYW5kbGVwLT5kZXZpY2UgPT0gTlVMTCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInN0cmR1cDogJXMiLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic3RyZHVwOiAlcyIsCiAJCQkgcGNhcF9zdHJlcnJvcihlcnJubykgKTsKIAkJcmV0dXJuIFBDQVBfRVJST1I7CiAJfQpAQCAtMTQwMiw3ICsxNTIxLDExIEBACiAJCQkgKiBzZXQgdG8gdGhlIHN0YXR1cyB0byByZXR1cm4sCiAJCQkgKiB3aGljaCBtaWdodCBiZSAwLCBvciBtaWdodCBiZQogCQkJICogYSBQQ0FQX1dBUk5JTkdfIHZhbHVlLgorCQkJICoKKwkJCSAqIFNldCB0aGUgdGltZW91dCB0byB1c2UgaW4gcG9sbCgpIGJlZm9yZQorCQkJICogcmV0dXJuaW5nLgogCQkJICovCisJCQlzZXRfcG9sbF90aW1lb3V0KGhhbmRsZXApOwogCQkJcmV0dXJuIHN0YXR1czsKIAogCQljYXNlIDA6CkBAIC0xNDQ3LDcgKzE1NzAsNyBAQAogCQlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCiAJCSAgICAmaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUsCiAJCSAgICBzaXplb2YoaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUpKSA9PSAtMSkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAiU09fUkNWQlVGOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCQlnb3RvIGZhaWw7CkBAIC0xNDU4LDcgKzE1ODEsNyBAQAogCiAJaGFuZGxlLT5idWZmZXIJID0gbWFsbG9jKGhhbmRsZS0+YnVmc2l6ZSArIGhhbmRsZS0+b2Zmc2V0KTsKIAlpZiAoIWhhbmRsZS0+YnVmZmVyKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOwogCQlnb3RvIGZhaWw7CkBAIC0xNTIwLDYgKzE2NDMsMjIgQEAKIAkJCXJldHVybiAwOwogCiAJCS8qCisJCSAqIElmIHRoaXMgaXMgYW4gb3V0Z29pbmcgQ0FOIG9yIENBTiBGRCBmcmFtZSwgYW5kCisJCSAqIHRoZSB1c2VyIGRvZXNuJ3Qgb25seSB3YW50IG91dGdvaW5nIHBhY2tldHMsCisJCSAqIHJlamVjdCBpdDsgQ0FOIGRldmljZXMgYW5kIGRyaXZlcnMsIGFuZCB0aGUgQ0FOCisJCSAqIHN0YWNrLCBhbHdheXMgYXJyYW5nZSB0byBsb29wIGJhY2sgdHJhbnNtaXR0ZWQKKwkJICogcGFja2V0cywgc28gdGhleSBhbHNvIGFwcGVhciBhcyBpbmNvbWluZyBwYWNrZXRzLgorCQkgKiBXZSBkb24ndCB3YW50IGR1cGxpY2F0ZSBwYWNrZXRzLCBhbmQgd2UgY2FuJ3QKKwkJICogZWFzaWx5IGRpc3Rpbmd1aXNoIHBhY2tldHMgbG9vcGVkIGJhY2sgYnkgdGhlIENBTgorCQkgKiBsYXllciB0aGFuIHRob3NlIHJlY2VpdmVkIGJ5IHRoZSBDQU4gbGF5ZXIsIHNvIHdlCisJCSAqIGVsaW1pbmF0ZSB0aGlzIHBhY2tldCBpbnN0ZWFkLgorCQkgKi8KKwkJaWYgKChzbGwtPnNsbF9wcm90b2NvbCA9PSBMSU5VWF9TTExfUF9DQU4gfHwKKwkJICAgICBzbGwtPnNsbF9wcm90b2NvbCA9PSBMSU5VWF9TTExfUF9DQU5GRCkgJiYKKwkJICAgICBoYW5kbGUtPmRpcmVjdGlvbiAhPSBQQ0FQX0RfT1VUKQorCQkJcmV0dXJuIDA7CisKKwkJLyoKIAkJICogSWYgdGhlIHVzZXIgb25seSB3YW50cyBpbmNvbWluZyBwYWNrZXRzLCByZWplY3QgaXQuCiAJCSAqLwogCQlpZiAoaGFuZGxlLT5kaXJlY3Rpb24gPT0gUENBUF9EX0lOKQpAQCAtMTU5OSw3ICsxNzM4LDcgQEAKIAkgKiBpZiB3ZSdyZSB1c2luZyBhIG1lbW9yeS1tYXBwZWQgYnVmZmVyLCB3ZSB3b24ndCBldmVuCiAJICogZ2V0IG5vdGlmaWVkIG9mICJuZXR3b3JrIGRvd24iIGV2ZW50cy4KIAkgKi8KLQlicCA9IGhhbmRsZS0+YnVmZmVyICsgaGFuZGxlLT5vZmZzZXQ7CisJYnAgPSAodV9jaGFyICopaGFuZGxlLT5idWZmZXIgKyBoYW5kbGUtPm9mZnNldDsKIAogI2lmIGRlZmluZWQoSEFWRV9QQUNLRVRfQVVYREFUQSkgJiYgZGVmaW5lZChIQVZFX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSSkKIAltc2cubXNnX25hbWUJCT0gJmZyb207CkBAIC0xNjU1LDEyICsxNzk0LDEyIEBACiAJCQkgKiBQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCwgYnV0IHBjYXBfZGlzcGF0Y2goKQogCQkJICogZXRjLiBhcmVuJ3QgZGVmaW5lZCB0byByZXR1cm4gdGhhdC4KIAkJCSAqLwotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSJUaGUgaW50ZXJmYWNlIHdlbnQgZG93biIpOwogCQkJcmV0dXJuIFBDQVBfRVJST1I7CiAKIAkJZGVmYXVsdDoKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgInJlY3Zmcm9tOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiBQQ0FQX0VSUk9SOwogCQl9CkBAIC0xNzM5LDEzICsxODc4LDIyIEBACiAjZW5kaWYKIAkJCQljb250aW51ZTsKIAotCQkJbGVuID0gcGFja2V0X2xlbiA+IGlvdi5pb3ZfbGVuID8gaW92Lmlvdl9sZW4gOiBwYWNrZXRfbGVuOwotCQkJaWYgKGxlbiA8ICh1bnNpZ25lZCBpbnQpIGhhbmRsZXAtPnZsYW5fb2Zmc2V0KQorCQkJbGVuID0gKHVfaW50KXBhY2tldF9sZW4gPiBpb3YuaW92X2xlbiA/IGlvdi5pb3ZfbGVuIDogKHVfaW50KXBhY2tldF9sZW47CisJCQlpZiAobGVuIDwgKHVfaW50KWhhbmRsZXAtPnZsYW5fb2Zmc2V0KQogCQkJCWJyZWFrOwogCisJCQkvKgorCQkJICogTW92ZSBldmVyeXRoaW5nIGluIHRoZSBoZWFkZXIsIGV4Y2VwdCB0aGUKKwkJCSAqIHR5cGUgZmllbGQsIGRvd24gVkxBTl9UQUdfTEVOIGJ5dGVzLCB0bworCQkJICogYWxsb3cgdXMgdG8gaW5zZXJ0IHRoZSBWTEFOIHRhZyBiZXR3ZWVuCisJCQkgKiB0aGF0IHN0dWZmIGFuZCB0aGUgdHlwZSBmaWVsZC4KKwkJCSAqLwogCQkJYnAgLT0gVkxBTl9UQUdfTEVOOwogCQkJbWVtbW92ZShicCwgYnAgKyBWTEFOX1RBR19MRU4sIGhhbmRsZXAtPnZsYW5fb2Zmc2V0KTsKIAorCQkJLyoKKwkJCSAqIE5vdyBpbnNlcnQgdGhlIHRhZy4KKwkJCSAqLwogCQkJdGFnID0gKHN0cnVjdCB2bGFuX3RhZyAqKShicCArIGhhbmRsZXAtPnZsYW5fb2Zmc2V0KTsKIAkJCXRhZy0+dmxhbl90cGlkID0gaHRvbnMoVkxBTl9UUElEKGF1eCwgYXV4KSk7CiAJCQl0YWctPnZsYW5fdGNpID0gaHRvbnMoYXV4LT50cF92bGFuX3RjaSk7CkBAIC0xNzU1LDYgKzE5MDMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGF1eF9kYXRhLnZsYW5fdGFnID0gaHRvbnMoYXV4LT50cF92bGFuX3RjaSkgJiAweDBmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXhfZGF0YS52bGFuX3RhZ19wcmVzZW50ID0gKGF1eC0+dHBfc3RhdHVzICYgVFBfU1RBVFVTX1ZMQU5fVkFMSUQpOwogI2VuZGlmCisKKwkJCS8qCisJCQkgKiBBZGQgdGhlIHRhZyB0byB0aGUgcGFja2V0IGxlbmd0aHMuCisJCQkgKi8KIAkJCXBhY2tldF9sZW4gKz0gVkxBTl9UQUdfTEVOOwogCQl9CiAJfQpAQCAtMTgxMiw3ICsxOTY0LDcgQEAKICNpZiBkZWZpbmVkKFNJT0NHU1RBTVBOUykgJiYgZGVmaW5lZChTT19USU1FU1RBTVBOUykKIAlpZiAoaGFuZGxlLT5vcHQudHN0YW1wX3ByZWNpc2lvbiA9PSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTkFOTykgewogCQlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ0dTVEFNUE5TLCAmcGNhcF9oZWFkZXIudHMpID09IC0xKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJCSJTSU9DR1NUQU1QTlM6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuIFBDQVBfRVJST1I7CiAJCX0KQEAgLTE4MjAsNyArMTk3Miw3IEBACiAjZW5kaWYKIAl7CiAJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DR1NUQU1QLCAmcGNhcF9oZWFkZXIudHMpID09IC0xKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJCSJTSU9DR1NUQU1QOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiBQQ0FQX0VSUk9SOwogCQl9CkBAIC0xOTE4LDcgKzIwNzAsNyBAQAogCiAJcmV0ID0gc2VuZChoYW5kbGUtPmZkLCBidWYsIHNpemUsIDApOwogCWlmIChyZXQgPT0gLTEpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzZW5kOiAlcyIsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzZW5kOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTIwNDAsNyArMjE5Miw3IEBACiAJCSAqIGlzIGJ1aWx0IG9uIGEgc3lzdGVtIHdpdGhvdXQgInN0cnVjdCB0cGFja2V0X3N0YXRzIi4KIAkJICovCiAJCWlmIChlcnJubyAhPSBFT1BOT1RTVVBQKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgInBjYXBfc3RhdHM6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0yMTI2LDcgKzIyNzgsNyBAQAogCWlmIChpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSZpZnJmbGFncykgPCAwKSB7CiAJCWlmIChlcnJubyA9PSBFTlhJTyB8fCBlcnJubyA9PSBFTk9ERVYpCiAJCQlyZXR1cm4gKDApOwkvKiBkZXZpY2UgZG9lc24ndCBhY3R1YWxseSBleGlzdCAtIGlnbm9yZSBpdCAqLwotCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIlNJT0NHSUZGTEFHUzogJS4qczogJXMiLAogCQkgICAgKGludClzaXplb2YoaWZyZmxhZ3MuaWZyX25hbWUpLAogCQkgICAgaWZyZmxhZ3MuaWZyX25hbWUsCkBAIC0yMTM3LDcgKzIyODksOCBAQAogCS8qCiAJICogQWRkIGFuIGVudHJ5IGZvciB0aGlzIGludGVyZmFjZSwgd2l0aCBubyBhZGRyZXNzZXMuCiAJICovCi0JaWYgKHBjYXBfYWRkX2lmKGRldmxpc3RwLCBuYW1lLCBpZnJmbGFncy5pZnJfZmxhZ3MsIE5VTEwsCisJaWYgKHBjYXBfYWRkX2lmKGRldmxpc3RwLCBuYW1lLAorCSAgICBpZl9mbGFnc190b19wY2FwX2ZsYWdzKG5hbWUsIGlmcmZsYWdzLmlmcl9mbGFncyksIE5VTEwsCiAJICAgIGVycmJ1ZikgPT0gLTEpIHsKIAkJLyoKIAkJICogRmFpbHVyZS4KQEAgLTIxODUsNyArMjMzOCw3IEBACiAJCS8qCiAJCSAqIEZhaWwgaWYgd2UgZ290IHNvbWUgb3RoZXIgZXJyb3IuCiAJCSAqLwotCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIkNhbid0IG9wZW4gL3N5cy9jbGFzcy9uZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKC0xKTsKIAl9CkBAIC0yMTkzLDkgKzIzNDYsOSBAQAogCS8qCiAJICogQ3JlYXRlIGEgc29ja2V0IGZyb20gd2hpY2ggdG8gZmV0Y2ggaW50ZXJmYWNlIGluZm9ybWF0aW9uLgogCSAqLwotCWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWZkID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfUkFXLCAwKTsKIAlpZiAoZmQgPCAwKSB7Ci0JCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAic29ja2V0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJKHZvaWQpY2xvc2VkaXIoc3lzX2NsYXNzX25ldF9kKTsKIAkJcmV0dXJuICgtMSk7CkBAIC0yMjMyLDcgKzIzODUsNyBAQAogCQkgKiBmb3IgZGV2aWNlcywgbmV3ZXIga2VybmVscyBoYXZlIHN5bWxpbmtzIHRvCiAJCSAqIGRpcmVjdG9yaWVzLikKIAkJICovCi0JCXNucHJpbnRmKHN1YnN5c3RlbV9wYXRoLCBzaXplb2Ygc3Vic3lzdGVtX3BhdGgsCisJCXBjYXBfc25wcmludGYoc3Vic3lzdGVtX3BhdGgsIHNpemVvZiBzdWJzeXN0ZW1fcGF0aCwKIAkJICAgICIvc3lzL2NsYXNzL25ldC8lcy9pZmluZGV4IiwgZW50LT5kX25hbWUpOwogCQlpZiAobHN0YXQoc3Vic3lzdGVtX3BhdGgsICZzdGF0YikgIT0gMCkgewogCQkJLyoKQEAgLTIyNjMsNyArMjQxNiw3IEBACiAJCSAqIGZhaWwgZHVlIHRvIGFuIGVycm9yIHJlYWRpbmcgdGhlIGRpcmVjdG9yeT8KIAkJICovCiAJCWlmIChlcnJubyAhPSAwKSB7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiRXJyb3IgcmVhZGluZyAvc3lzL2NsYXNzL25ldDogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldCA9IC0xOwpAQCAtMjMwMyw3ICsyNDU2LDcgQEAKIAkJLyoKIAkJICogRmFpbCBpZiB3ZSBnb3Qgc29tZSBvdGhlciBlcnJvci4KIAkJICovCi0JCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiQ2FuJ3Qgb3BlbiAvcHJvYy9uZXQvZGV2OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQpAQCAtMjMxMSw5ICsyNDY0LDkgQEAKIAkvKgogCSAqIENyZWF0ZSBhIHNvY2tldCBmcm9tIHdoaWNoIHRvIGZldGNoIGludGVyZmFjZSBpbmZvcm1hdGlvbi4KIAkgKi8KLQlmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlmZCA9IHNvY2tldChQRl9VTklYLCBTT0NLX1JBVywgMCk7CiAJaWYgKGZkIDwgMCkgewotCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgInNvY2tldDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCSh2b2lkKWZjbG9zZShwcm9jX25ldF9mKTsKIAkJcmV0dXJuICgtMSk7CkBAIC0yMzUyLDcgKzI1MDUsNyBAQAogCQkgKiBmYWlsIGR1ZSB0byBhbiBlcnJvciByZWFkaW5nIHRoZSBmaWxlPwogCQkgKi8KIAkJaWYgKGZlcnJvcihwcm9jX25ldF9mKSkgewotCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIkVycm9yIHJlYWRpbmcgL3Byb2MvbmV0L2RldjogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldCA9IC0xOwpAQCAtMjM2OSwxMiArMjUyMiwyNyBAQAogICovCiBzdGF0aWMgY29uc3QgY2hhciBhbnlfZGVzY3JbXSA9ICJQc2V1ZG8tZGV2aWNlIHRoYXQgY2FwdHVyZXMgb24gYWxsIGludGVyZmFjZXMiOwogCisvKgorICogQSBTT0NLX1BBQ0tFVCBvciBQRl9QQUNLRVQgc29ja2V0IGNhbiBiZSBib3VuZCB0byBhbnkgbmV0d29yayBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQKK2Nhbl9iZV9ib3VuZChjb25zdCBjaGFyICpuYW1lIF9VXykKK3sKKwlyZXR1cm4gKDEpOworfQorCiBpbnQKIHBjYXBfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKIHsKIAlpbnQgcmV0OwogCiAJLyoKKwkgKiBHZXQgdGhlIGxpc3Qgb2YgcmVndWxhciBpbnRlcmZhY2VzIGZpcnN0LgorCSAqLworCWlmIChwY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMoYWxsZGV2c3AsIGVycmJ1ZiwgY2FuX2JlX2JvdW5kKSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CS8qIGZhaWx1cmUgKi8KKworCS8qCiAJICogUmVhZCAiL3N5cy9jbGFzcy9uZXQiLCBhbmQgYWRkIHRvIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgYWxsCiAJICogaW50ZXJmYWNlcyBsaXN0ZWQgdGhlcmUgdGhhdCB3ZSBkb24ndCBhbHJlYWR5IGhhdmUsIGJlY2F1c2UsCiAJICogb24gTGludXgsIFNJT0NHSUZDT05GIHJlcG9ydHMgb25seSBpbnRlcmZhY2VzIHdpdGggSVB2NCBhZGRyZXNzZXMsCkBAIC0yMzk2LDcgKzI1NjQsNyBAQAogCS8qCiAJICogQWRkIHRoZSAiYW55IiBkZXZpY2UuCiAJICovCi0JaWYgKHBjYXBfYWRkX2lmKGFsbGRldnNwLCAiYW55IiwgSUZGX1VQfElGRl9SVU5OSU5HLAorCWlmIChwY2FwX2FkZF9pZihhbGxkZXZzcCwgImFueSIsIFBDQVBfSUZfVVB8UENBUF9JRl9SVU5OSU5HLAogCSAgICBhbnlfZGVzY3IsIGVycmJ1ZikgPCAwKQogCQlyZXR1cm4gKC0xKTsKIApAQCAtMjU1Nyw3ICsyNzI1LDcgQEAKIAkgKi8KIAlpZiAoaGFuZGxlcC0+ZmlsdGVyX2luX3VzZXJsYW5kKSB7CiAJCWlmIChyZXNldF9rZXJuZWxfZmlsdGVyKGhhbmRsZSkgPT0gLTEpIHsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiY2FuJ3QgcmVtb3ZlIGtlcm5lbCBmaWx0ZXI6ICVzIiwKIAkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQllcnIgPSAtMjsJLyogZmF0YWwgZXJyb3IgKi8KQEAgLTI2MDQsNyArMjc3Miw3IEBACiAJICogV2UncmUgbm90IHVzaW5nIFBGX1BBQ0tFVCBzb2NrZXRzLCBzbyB3ZSBjYW4ndCBkZXRlcm1pbmUKIAkgKiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBwYWNrZXQuCiAJICovCi0Jc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkgICAgIlNldHRpbmcgZGlyZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gU09DS19QQUNLRVQgc29ja2V0cyIpOwogCXJldHVybiAtMTsKIH0KQEAgLTI3OTEsNyArMjk1OSwxNCBAQAogI2RlZmluZSBBUlBIUkRfQ0FOIDI4MAogI2VuZGlmCiAJY2FzZSBBUlBIUkRfQ0FOOgotCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0NBTl9TT0NLRVRDQU47CisJCS8qCisJCSAqIE1hcCB0aGlzIHRvIERMVF9MSU5VWF9TTEw7IHRoYXQgd2F5LCBDQU4gZnJhbWVzIHdpbGwKKwkJICogaGF2ZSBFVEhfUF9DQU4vTElOVVhfU0xMX1BfQ0FOIGFzIHRoZSBwcm90b2NvbCBhbmQKKwkJICogQ0FOIEZEIGZyYW1lcyB3aWxsIGhhdmUgRVRIX1BfQ0FORkQvTElOVVhfU0xMX1BfQ0FORkQKKwkJICogYXMgdGhlIHByb3RvY29sLCBzbyB0aGV5IGNhbiBiZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZQorCQkgKiBwcm90b2NvbCBpbiB0aGUgU0xMIGhlYWRlci4KKwkJICovCisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfTElOVVhfU0xMOwogCQlicmVhazsKIAogI2lmbmRlZiBBUlBIUkRfSUVFRTgwMl9UUgpAQCAtMzA3NCw3ICszMjQ5LDcgQEAKIAkJICogc28gbGV0J3MgdXNlICJMaW51eC1jb29rZWQiIG1vZGUuIEplYW4gSUkKIAkJICoKIAkJICogWFhYIC0gdGhpcyBpcyBoYW5kbGVkIGluIGFjdGl2YXRlX25ldygpLiAqLwotCQkvL2hhbmRsZXAtPmNvb2tlZCA9IDE7CisJCS8qIGhhbmRsZXAtPmNvb2tlZCA9IDE7ICovCiAJCWJyZWFrOwogCiAJLyogQVJQSFJEX0xBUEQgaXMgdW5vZmZpY2lhbCBhbmQgcmFuZG9tbHkgYWxsb2NhdGVkLCBpZiByZWFsbG9jYXRpb24KQEAgLTMxMTcsNyArMzI5Miw3IEBACiAJCSAqCiAJCSAqIFhYWCAtIHRoaXMgaXMgaGFuZGxlZCBpbiBhY3RpdmF0ZV9uZXcoKS4KIAkJICovCi0JCS8vaGFuZGxlcC0+Y29va2VkID0gMTsKKwkJLyogaGFuZGxlcC0+Y29va2VkID0gMTsgKi8KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzE0MCw3ICszMzE1LDcgQEAKIHsKICNpZmRlZiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTCiAJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7Ci0JY29uc3QgY2hhcgkJKmRldmljZSA9IGhhbmRsZS0+b3B0LnNvdXJjZTsKKwljb25zdCBjaGFyCQkqZGV2aWNlID0gaGFuZGxlLT5vcHQuZGV2aWNlOwogCWludAkJCWlzX2FueV9kZXZpY2UgPSAoc3RyY21wKGRldmljZSwgImFueSIpID09IDApOwogCWludAkJCXNvY2tfZmQgPSAtMSwgYXJwdHlwZTsKICNpZmRlZiBIQVZFX1BBQ0tFVF9BVVhEQVRBCkBAIC0zMTQ4LDcgKzMzMjMsNyBAQAogI2VuZGlmCiAJaW50CQkJZXJyID0gMDsKIAlzdHJ1Y3QgcGFja2V0X21yZXEJbXI7Ci0jaWZkZWYgU09fQlBGX0VYVEVOU0lPTlMKKyNpZiBkZWZpbmVkKFNPX0JQRl9FWFRFTlNJT05TKSAmJiBkZWZpbmVkKFNLRl9BRF9WTEFOX1RBR19QUkVTRU5UKQogCWludAkJCWJwZl9leHRlbnNpb25zOwogCXNvY2tsZW5fdAkJbGVuID0gc2l6ZW9mKGJwZl9leHRlbnNpb25zKTsKICNlbmRpZgpAQCAtMzE3Miw3ICszMzQ3LDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzb2NrZXQ6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNvY2tldDogJXMiLAogCQkJIHBjYXBfc3RyZXJyb3IoZXJybm8pICk7CiAJCWlmIChlcnJubyA9PSBFUEVSTSB8fCBlcnJubyA9PSBFQUNDRVMpIHsKIAkJCS8qCkBAIC0zMjc0LDE0ICszNDQ5LDE0IEBACiAJCQkgKiBrZXJuZWxzKSAtIHJlb3BlbiBpbiBjb29rZWQgbW9kZS4KIAkJCSAqLwogCQkJaWYgKGNsb3NlKHNvY2tfZmQpID09IC0xKSB7Ci0JCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkJICJjbG9zZTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkJcmV0dXJuIFBDQVBfRVJST1I7CiAJCQl9CiAJCQlzb2NrX2ZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwKIAkJCSAgICBodG9ucyhFVEhfUF9BTEwpKTsKIAkJCWlmIChzb2NrX2ZkID09IC0xKSB7Ci0JCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgInNvY2tldDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkJaWYgKGVycm5vID09IEVQRVJNIHx8IGVycm5vID09IEVBQ0NFUykgewogCQkJCQkvKgpAQCAtMzMxNiw3ICszNDkxLDcgQEAKIAkJCQkgKiB1cGRhdGUgIm1hcF9hcnBocmRfdG9fZGx0KCkiCiAJCQkJICogdG8gaGFuZGxlIHRoZSBuZXcgdHlwZS4KIAkJCQkgKi8KLQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCQkiYXJwdHlwZSAlZCBub3QgIgogCQkJCQkic3VwcG9ydGVkIGJ5IGxpYnBjYXAgLSAiCiAJCQkJCSJmYWxsaW5nIGJhY2sgdG8gY29va2VkICIKQEAgLTM0MDYsNyArMzU4MSw3IEBACiAJCW1yLm1yX3R5cGUgICAgPSBQQUNLRVRfTVJfUFJPTUlTQzsKIAkJaWYgKHNldHNvY2tvcHQoc29ja19mZCwgU09MX1BBQ0tFVCwgUEFDS0VUX0FERF9NRU1CRVJTSElQLAogCQkgICAgJm1yLCBzaXplb2YobXIpKSA9PSAtMSkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSJzZXRzb2Nrb3B0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWNsb3NlKHNvY2tfZmQpOwogCQkJcmV0dXJuIFBDQVBfRVJST1I7CkBAIC0zNDE5LDcgKzM1OTQsNyBAQAogCXZhbCA9IDE7CiAJaWYgKHNldHNvY2tvcHQoc29ja19mZCwgU09MX1BBQ0tFVCwgUEFDS0VUX0FVWERBVEEsICZ2YWwsCiAJCSAgICAgICBzaXplb2YodmFsKSkgPT0gLTEgJiYgZXJybm8gIT0gRU5PUFJPVE9PUFQpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgInNldHNvY2tvcHQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQljbG9zZShzb2NrX2ZkKTsKIAkJcmV0dXJuIFBDQVBfRVJST1I7CkBAIC0zNDQ5LDE1ICszNjI0LDI0IEBACiAKIAkvKgogCSAqIFNldCB0aGUgb2Zmc2V0IGF0IHdoaWNoIHRvIGluc2VydCBWTEFOIHRhZ3MuCisJICogVGhhdCBzaG91bGQgYmUgdGhlIG9mZnNldCBvZiB0aGUgdHlwZSBmaWVsZC4KIAkgKi8KIAlzd2l0Y2ggKGhhbmRsZS0+bGlua3R5cGUpIHsKIAogCWNhc2UgRExUX0VOMTBNQjoKKwkJLyoKKwkJICogVGhlIHR5cGUgZmllbGQgaXMgYWZ0ZXIgdGhlIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2UKKwkJICogTUFDIGFkZHJlc3MuCisJCSAqLwogCQloYW5kbGVwLT52bGFuX29mZnNldCA9IDIgKiBFVEhfQUxFTjsKIAkJYnJlYWs7CiAKIAljYXNlIERMVF9MSU5VWF9TTEw6Ci0JCWhhbmRsZXAtPnZsYW5fb2Zmc2V0ID0gMTQ7CisJCS8qCisJCSAqIFRoZSB0eXBlIGZpZWxkIGlzIGluIHRoZSBsYXN0IDIgYnl0ZXMgb2YgdGhlCisJCSAqIERMVF9MSU5VWF9TTEwgaGVhZGVyLgorCQkgKi8KKwkJaGFuZGxlcC0+dmxhbl9vZmZzZXQgPSBTTExfSERSX0xFTiAtIDI7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTM0NzAsNyArMzY1NCw3IEBACiAJCWludCBuc2VjX3RzdGFtcHMgPSAxOwogCiAJCWlmIChzZXRzb2Nrb3B0KHNvY2tfZmQsIFNPTF9TT0NLRVQsIFNPX1RJTUVTVEFNUE5TLCAmbnNlY190c3RhbXBzLCBzaXplb2YobnNlY190c3RhbXBzKSkgPCAwKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNldHNvY2tvcHQ6IHVuYWJsZSB0byBzZXQgU09fVElNRVNUQU1QTlMiKTsKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzZXRzb2Nrb3B0OiB1bmFibGUgdG8gc2V0IFNPX1RJTUVTVEFNUE5TIik7CiAJCQljbG9zZShzb2NrX2ZkKTsKIAkJCXJldHVybiBQQ0FQX0VSUk9SOwogCQl9CkBAIC0zNDgyLDcgKzM2NjYsNyBAQAogCSAqLwogCWhhbmRsZS0+ZmQgPSBzb2NrX2ZkOwogCi0jaWZkZWYgU09fQlBGX0VYVEVOU0lPTlMKKyNpZiBkZWZpbmVkKFNPX0JQRl9FWFRFTlNJT05TKSAmJiBkZWZpbmVkKFNLRl9BRF9WTEFOX1RBR19QUkVTRU5UKQogCS8qCiAJICogQ2FuIHdlIGdlbmVyYXRlIHNwZWNpYWwgY29kZSBmb3IgVkxBTiBjaGVja3M/CiAJICogKFhYWCAtIHdoYXQgaWYgd2UgbmVlZCB0aGUgc3BlY2lhbCBjb2RlIGJ1dCBpdCdzIG5vdCBzdXBwb3J0ZWQKQEAgLTM0OTcsNyArMzY4MSw3IEBACiAJCQloYW5kbGUtPmJwZl9jb2RlZ2VuX2ZsYWdzIHw9IEJQRl9TUEVDSUFMX1ZMQU5fSEFORExJTkc7CiAJCX0KIAl9Ci0jZW5kaWYgLyogU09fQlBGX0VYVEVOU0lPTlMgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKFNPX0JQRl9FWFRFTlNJT05TKSAmJiBkZWZpbmVkKFNLRl9BRF9WTEFOX1RBR19QUkVTRU5UKSAqLwogCiAJcmV0dXJuIDE7CiAjZWxzZSAvKiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTICovCkBAIC0zNTMzLDcgKzM3MTcsNyBAQAogCSAqLwogCWhhbmRsZXAtPm9uZXNob3RfYnVmZmVyID0gbWFsbG9jKGhhbmRsZS0+c25hcHNob3QpOwogCWlmIChoYW5kbGVwLT5vbmVzaG90X2J1ZmZlciA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJjYW4ndCBhbGxvY2F0ZSBvbmVzaG90IGJ1ZmZlcjogJXMiLAogCQkJIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CkBAIC0zNjM4LDcgKzM4MjIsNyBAQAogCQkJcmV0dXJuIDE7CS8qIG5vICovCiAKIAkJLyogRmFpbGVkIHRvIGV2ZW4gZmluZCBvdXQ7IHRoaXMgaXMgYSBmYXRhbCBlcnJvci4gKi8KLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkiY2FuJ3QgZ2V0ICVzIGhlYWRlciBsZW4gb24gcGFja2V0IHNvY2tldDogJXMiLAogCQkJdmVyc2lvbl9zdHIsCiAJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CkBAIC0zNjQ5LDcgKzM4MzMsNyBAQAogCXZhbCA9IHZlcnNpb247CiAJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX1BBQ0tFVCwgUEFDS0VUX1ZFUlNJT04sICZ2YWwsCiAJCQkgICBzaXplb2YodmFsKSkgPCAwKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJImNhbid0IGFjdGl2YXRlICVzIG9uIHBhY2tldCBzb2NrZXQ6ICVzIiwKIAkJCXZlcnNpb25fc3RyLAogCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOwpAQCAtMzY2MSw3ICszODQ1LDcgQEAKIAl2YWwgPSBWTEFOX1RBR19MRU47CiAJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX1BBQ0tFVCwgUEFDS0VUX1JFU0VSVkUsICZ2YWwsCiAJCQkgICBzaXplb2YodmFsKSkgPCAwKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJImNhbid0IHNldCB1cCByZXNlcnZlIG9uIHBhY2tldCBzb2NrZXQ6ICVzIiwKIAkJCXBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwpAQCAtMzc5Myw3ICszOTc3LDcgQEAKIAkJCS8qCiAJCQkgKiBGYWlsZWQuCiAJCQkgKi8KLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAidW5hbWUgZmFpbGVkOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAtMTsKIAkJfQpAQCAtMzg5OSwxNCArNDA4MywxNCBAQAogCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJCWlmICghb2ZmbG9hZCkgewotCQkJCW10dSA9IGlmYWNlX2dldF9tdHUoaGFuZGxlLT5mZCwgaGFuZGxlLT5vcHQuc291cmNlLAorCQkJCW10dSA9IGlmYWNlX2dldF9tdHUoaGFuZGxlLT5mZCwgaGFuZGxlLT5vcHQuZGV2aWNlLAogCQkJCSAgICBoYW5kbGUtPmVycmJ1Zik7CiAJCQkJaWYgKG10dSA9PSAtMSkgewogCQkJCQkqc3RhdHVzID0gUENBUF9FUlJPUjsKIAkJCQkJcmV0dXJuIC0xOwogCQkJCX0KLQkJCQlpZiAoZnJhbWVfc2l6ZSA+IG10dSArIDE4KQotCQkJCQlmcmFtZV9zaXplID0gbXR1ICsgMTg7CisJCQkJaWYgKGZyYW1lX3NpemUgPiAodW5zaWduZWQgaW50KW10dSArIDE4KQorCQkJCQlmcmFtZV9zaXplID0gKHVuc2lnbmVkIGludCltdHUgKyAxODsKIAkJCX0KIAkJfQogCkBAIC0zOTE2LDcgKzQxMDAsNyBAQAogCQlsZW4gPSBzaXplb2Yoc2tfdHlwZSk7CiAJCWlmIChnZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9TT0NLRVQsIFNPX1RZUEUsICZza190eXBlLAogCQkgICAgJmxlbikgPCAwKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgImdldHNvY2tvcHQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCQlyZXR1cm4gLTE7CkBAIC0zOTMxLDcgKzQxMTUsNyBAQAogCQkJCSAqIFBBQ0tFVF9SRVNFUlZFIiwgaW4gd2hpY2ggY2FzZSB3ZSBmYWxsIGJhY2sKIAkJCQkgKiBhcyBiZXN0IHdlIGNhbi4KIAkJCQkgKi8KLQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAgICAiZ2V0c29ja29wdDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CiAJCQkJcmV0dXJuIC0xOwpAQCAtMzk4Nyw3ICs0MTcxLDcgQEAKIAkJYnJlYWs7CiAjZW5kaWYKIAlkZWZhdWx0OgotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBUUEFDS0VUXyB2YWx1ZSAldSIsCiAJCSAgICBoYW5kbGVwLT50cF92ZXJzaW9uKTsKIAkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CkBAIC00MDQwLDcgKzQyMjQsNyBAQAogCQlod2NvbmZpZy5yeF9maWx0ZXIgPSBIV1RTVEFNUF9GSUxURVJfQUxMOwogCiAJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7Ci0JCXN0cmxjcHkoaWZyLmlmcl9uYW1lLCBoYW5kbGUtPm9wdC5zb3VyY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJc3RybGNweShpZnIuaWZyX25hbWUsIGhhbmRsZS0+b3B0LmRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwogCQlpZnIuaWZyX2RhdGEgPSAodm9pZCAqKSZod2NvbmZpZzsKIAogCQlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ1NIV1RTVEFNUCwgJmlmcikgPCAwKSB7CkBAIC00MDU4LDE4ICs0MjQyLDI2IEBACiAJCQkJcmV0dXJuIC0xOwogCiAJCQljYXNlIEVPUE5PVFNVUFA6CisJCQljYXNlIEVSQU5HRToKIAkJCQkvKgogCQkJCSAqIFRyZWF0IHRoaXMgYXMgYSB3YXJuaW5nLCBhcyB0aGUKIAkJCQkgKiBvbmx5IHdheSB0byBmaXggdGhlIHdhcm5pbmcgaXMgdG8KIAkJCQkgKiBnZXQgYW4gYWRhcHRlciB0aGF0IHN1cHBvcnRzIGhhcmR3YXJlCi0JCQkJICogdGltZSBzdGFtcHMuICBXZSdsbCBqdXN0IGZhbGwgYmFjawotCQkJCSAqIG9uIHRoZSBzdGFuZGFyZCBob3N0IHRpbWUgc3RhbXBzLgorCQkJCSAqIHRpbWUgc3RhbXBzIGZvciAqYWxsKiBwYWNrZXRzLgorCQkJCSAqIChFUkFOR0UgbWVhbnMgIndlIHN1cHBvcnQgaGFyZHdhcmUKKwkJCQkgKiB0aW1lIHN0YW1wcywgYnV0IGZvciBwYWNrZXRzIG1hdGNoaW5nCisJCQkJICogdGhhdCBwYXJ0aWN1bGFyIGZpbHRlciIsIHNvIGl0IG1lYW5zCisJCQkJICogIndlIGRvbid0IHN1cHBvcnQgaGFyZHdhcmUgdGltZSBzdGFtcHMKKwkJCQkgKiBmb3IgYWxsIGluY29taW5nIHBhY2tldHMiIGhlcmUuKQorCQkJCSAqCisJCQkJICogV2UnbGwganVzdCBmYWxsIGJhY2sgb24gdGhlIHN0YW5kYXJkCisJCQkJICogaG9zdCB0aW1lIHN0YW1wcy4KIAkJCQkgKi8KIAkJCQkqc3RhdHVzID0gUENBUF9XQVJOSU5HX1RTVEFNUF9UWVBFX05PVFNVUDsKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKLQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCQkiU0lPQ1NIV1RTVEFNUCBmYWlsZWQ6ICVzIiwKIAkJCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJCSpzdGF0dXMgPSBQQ0FQX0VSUk9SOwpAQCAtNDA5Nyw3ICs0Mjg5LDcgQEAKIAkJCX0KIAkJCWlmIChzZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9QQUNLRVQsIFBBQ0tFVF9USU1FU1RBTVAsCiAJCQkJKHZvaWQgKikmdGltZXNvdXJjZSwgc2l6ZW9mKHRpbWVzb3VyY2UpKSkgewotCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJCSJjYW4ndCBzZXQgUEFDS0VUX1RJTUVTVEFNUDogJXMiLAogCQkJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CkBAIC00MTQ3LDcgKzQzMzksNyBAQAogCQkJICovCiAJCQlyZXR1cm4gMDsKIAkJfQotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJjYW4ndCBjcmVhdGUgcnggcmluZyBvbiBwYWNrZXQgc29ja2V0OiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCSpzdGF0dXMgPSBQQ0FQX0VSUk9SOwpAQCAtNDE1OSw3ICs0MzUxLDcgQEAKIAloYW5kbGVwLT5tbWFwYnVmID0gbW1hcCgwLCBoYW5kbGVwLT5tbWFwYnVmbGVuLAogCSAgICBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgaGFuZGxlLT5mZCwgMCk7CiAJaWYgKGhhbmRsZXAtPm1tYXBidWYgPT0gTUFQX0ZBSUxFRCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJjYW4ndCBtbWFwIHJ4IHJpbmc6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCiAJCS8qIGNsZWFyIHRoZSBhbGxvY2F0ZWQgcmluZyBvbiBlcnJvciovCkBAIC00MTcyLDcgKzQzNjQsNyBAQAogCWhhbmRsZS0+Y2MgPSByZXEudHBfZnJhbWVfbnI7CiAJaGFuZGxlLT5idWZmZXIgPSBtYWxsb2MoaGFuZGxlLT5jYyAqIHNpemVvZih1bmlvbiB0aGRyICopKTsKIAlpZiAoIWhhbmRsZS0+YnVmZmVyKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgImNhbid0IGFsbG9jYXRlIHJpbmcgb2YgZnJhbWUgaGVhZGVyczogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCkBAIC00MTg2LDcgKzQzNzgsNyBAQAogCWZvciAoaT0wOyBpPHJlcS50cF9ibG9ja19ucjsgKytpKSB7CiAJCXZvaWQgKmJhc2UgPSAmaGFuZGxlcC0+bW1hcGJ1ZltpKnJlcS50cF9ibG9ja19zaXplXTsKIAkJZm9yIChqPTA7IGo8ZnJhbWVzX3Blcl9ibG9jazsgKytqLCArK2hhbmRsZS0+b2Zmc2V0KSB7Ci0JCQlSSU5HX0dFVF9GUkFNRShoYW5kbGUpID0gYmFzZTsKKwkJCVJJTkdfR0VUX0NVUlJFTlRfRlJBTUUoaGFuZGxlKSA9IGJhc2U7CiAJCQliYXNlICs9IHJlcS50cF9mcmFtZV9zaXplOwogCQl9CiAJfQpAQCAtNDI5OSwxNTYgKzQ0OTEsMTMxIEBACiAJCQloYW5kbGVwLT50aW1lb3V0ID0gfmhhbmRsZXAtPnRpbWVvdXQ7CiAJCX0KIAl9CisJLyogVXBkYXRlIHRoZSB0aW1lb3V0IHRvIHVzZSBpbiBwb2xsKCkuICovCisJc2V0X3BvbGxfdGltZW91dChoYW5kbGVwKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB1bmlvbiB0aGRyICoKLXBjYXBfZ2V0X3JpbmdfZnJhbWUocGNhcF90ICpoYW5kbGUsIGludCBzdGF0dXMpCisvKgorICogR2V0IHRoZSBzdGF0dXMgZmllbGQgb2YgdGhlIHJpbmcgYnVmZmVyIGZyYW1lIGF0IGEgc3BlY2lmaWVkIG9mZnNldC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3BjYXBfZ2V0X3JpbmdfZnJhbWVfc3RhdHVzKHBjYXBfdCAqaGFuZGxlLCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OwogCXVuaW9uIHRoZHIgaDsKIAotCWgucmF3ID0gUklOR19HRVRfRlJBTUUoaGFuZGxlKTsKKwloLnJhdyA9IFJJTkdfR0VUX0ZSQU1FX0FUKGhhbmRsZSwgb2Zmc2V0KTsKIAlzd2l0Y2ggKGhhbmRsZXAtPnRwX3ZlcnNpb24pIHsKIAljYXNlIFRQQUNLRVRfVjE6Ci0JCWlmIChzdGF0dXMgIT0gKGguaDEtPnRwX3N0YXR1cyA/IFRQX1NUQVRVU19VU0VSIDoKLQkJCQkJCVRQX1NUQVRVU19LRVJORUwpKQotCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAoaC5oMS0+dHBfc3RhdHVzKTsKIAkJYnJlYWs7CiAJY2FzZSBUUEFDS0VUX1YxXzY0OgotCQlpZiAoc3RhdHVzICE9IChoLmgxXzY0LT50cF9zdGF0dXMgPyBUUF9TVEFUVVNfVVNFUiA6Ci0JCQkJCQlUUF9TVEFUVVNfS0VSTkVMKSkKLQkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gKGguaDFfNjQtPnRwX3N0YXR1cyk7CiAJCWJyZWFrOwogI2lmZGVmIEhBVkVfVFBBQ0tFVDIKIAljYXNlIFRQQUNLRVRfVjI6Ci0JCWlmIChzdGF0dXMgIT0gKGguaDItPnRwX3N0YXR1cyA/IFRQX1NUQVRVU19VU0VSIDoKLQkJCQkJCVRQX1NUQVRVU19LRVJORUwpKQotCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAoaC5oMi0+dHBfc3RhdHVzKTsKIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBIQVZFX1RQQUNLRVQzCiAJY2FzZSBUUEFDS0VUX1YzOgotCQlpZiAoc3RhdHVzICE9IChoLmgzLT5oZHIuYmgxLmJsb2NrX3N0YXR1cyA/IFRQX1NUQVRVU19VU0VSIDoKLQkJCQkJCVRQX1NUQVRVU19LRVJORUwpKQotCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAoaC5oMy0+aGRyLmJoMS5ibG9ja19zdGF0dXMpOwogCQlicmVhazsKICNlbmRpZgogCX0KLQlyZXR1cm4gaC5yYXc7CisJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gKi8KKwlyZXR1cm4gMDsKIH0KIAogI2lmbmRlZiBQT0xMUkRIVVAKICNkZWZpbmUgUE9MTFJESFVQIDAKICNlbmRpZgogCi0vKiB3YWl0IGZvciBmcmFtZXMgYXZhaWxhYmlsaXR5LiovCisvKgorICogQmxvY2sgd2FpdGluZyBmb3IgZnJhbWVzIHRvIGJlIGF2YWlsYWJsZS4KKyAqLwogc3RhdGljIGludCBwY2FwX3dhaXRfZm9yX2ZyYW1lc19tbWFwKHBjYXBfdCAqaGFuZGxlKQogewotCWlmICghcGNhcF9nZXRfcmluZ19mcmFtZShoYW5kbGUsIFRQX1NUQVRVU19VU0VSKSkgewotCQlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKLQkJaW50IHRpbWVvdXQ7Ci0JCWNoYXIgYzsKLQkJc3RydWN0IHBvbGxmZCBwb2xsaW5mbzsKLQkJaW50IHJldDsKKwlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwljaGFyIGM7CisJc3RydWN0IHBvbGxmZCBwb2xsaW5mbzsKKwlpbnQgcmV0OwogCi0JCXBvbGxpbmZvLmZkID0gaGFuZGxlLT5mZDsKLQkJcG9sbGluZm8uZXZlbnRzID0gUE9MTElOOworCXBvbGxpbmZvLmZkID0gaGFuZGxlLT5mZDsKKwlwb2xsaW5mby5ldmVudHMgPSBQT0xMSU47CiAKLQkJaWYgKGhhbmRsZXAtPnRpbWVvdXQgPT0gMCkgewotI2lmZGVmIEhBVkVfVFBBQ0tFVDMKKwlkbyB7CisJCS8qCisJCSAqIFllcywgd2UgZG8gdGhpcyBldmVuIGluIG5vbi1ibG9ja2luZyBtb2RlLCBhcyBpdCdzCisJCSAqIHRoZSBvbmx5IHdheSB0byBnZXQgZXJyb3IgaW5kaWNhdGlvbnMgZnJvbSBhCisJCSAqIHRwYWNrZXQgc29ja2V0LgorCQkgKgorCQkgKiBUaGUgdGltZW91dCBpcyAwIGluIG5vbi1ibG9ja2luZyBtb2RlLCBzbyBwb2xsKCkKKwkJICogcmV0dXJucyBpbW1lZGlhdGVseS4KKwkJICovCisJCXJldCA9IHBvbGwoJnBvbGxpbmZvLCAxLCBoYW5kbGVwLT5wb2xsX3RpbWVvdXQpOworCQlpZiAocmV0IDwgMCAmJiBlcnJubyAhPSBFSU5UUikgeworCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkiY2FuJ3QgcG9sbCBvbiBwYWNrZXQgc29ja2V0OiAlcyIsCisJCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0gZWxzZSBpZiAocmV0ID4gMCAmJgorCQkJKHBvbGxpbmZvLnJldmVudHMgJiAoUE9MTEhVUHxQT0xMUkRIVVB8UE9MTEVSUnxQT0xMTlZBTCkpKSB7CiAJCQkvKgotCQkJICogWFhYIC0gZHVlIHRvIGEgc2V0IG9mIChtaXMpZmVhdHVyZXMgaW4gdGhlCi0JCQkgKiBUUEFDS0VUX1YzIGtlcm5lbCBjb2RlLCBibG9ja2luZyBmb3JldmVyIHdpdGgKLQkJCSAqIGEgVFBBQ0tFVF9WMyBzb2NrZXQgY2FuLCBpZiBmZXcgcGFja2V0cwotCQkJICogYXJlIGFycml2aW5nIGFuZCBwYXNzaW5nIHRoZSBzb2NrZXQgZmlsdGVyLAotCQkJICogY2F1c2UgbW9zdCBwYWNrZXRzIHRvIGJlIGRyb3BwZWQuICBTZWUKLQkJCSAqIGxpYnBjYXAgaXNzdWUgIzMzNSBmb3IgdGhlIGZ1bGwgcGFpbmZ1bAotCQkJICogc3RvcnkuICBUaGUgd29ya2Fyb3VuZCBpcyB0byBoYXZlIHBvbGwoKQotCQkJICogdGltZSBvdXQgdmVyeSBxdWlja2x5LCBzbyB3ZSBncmFiIHRoZQotCQkJICogZnJhbWVzIGhhbmRlZCB0byB1cywgYW5kIHJldHVybiB0aGVtIHRvCi0JCQkgKiB0aGUga2VybmVsLCBBU0FQLgotCQkJICoKLQkJCSAqIElmIHRob3NlIGlzc3VlcyBhcmUgZXZlciBmaXhlZCwgd2UgbWlnaHQKLQkJCSAqIHdhbnQgdG8gY2hlY2sgdGhlIGtlcm5lbCB2ZXJzaW9uIGFuZCBibG9jawotCQkJICogZm9yZXZlciB3aXRoIFRQQUNLRVRfVjMgaWYgd2UncmUgcnVubmluZwotCQkJICogd2l0aCBhIGtlcm5lbCB0aGF0IGhhcyB0aGUgZml4LgorCQkJICogVGhlcmUncyBzb21lIGluZGljYXRpb24gb3RoZXIgdGhhbgorCQkJICogInlvdSBjYW4gcmVhZCBvbiB0aGlzIGRlc2NyaXB0b3IiIG9uCisJCQkgKiB0aGUgZGVzY3JpcHRvci4KIAkJCSAqLwotCQkJaWYgKGhhbmRsZXAtPnRwX3ZlcnNpb24gPT0gVFBBQ0tFVF9WMykKLQkJCQl0aW1lb3V0ID0gMTsJLyogZG9uJ3QgYmxvY2sgZm9yIHZlcnkgbG9uZyAqLwotCQkJZWxzZQotI2VuZGlmCi0JCQkJdGltZW91dCA9IC0xOwkvKiBibG9jayBmb3JldmVyICovCi0JCX0gZWxzZSBpZiAoaGFuZGxlcC0+dGltZW91dCA+IDApCi0JCQl0aW1lb3V0ID0gaGFuZGxlcC0+dGltZW91dDsJLyogYmxvY2sgZm9yIHRoYXQgYW1vdW50IG9mIHRpbWUgKi8KLQkJZWxzZQotCQkJdGltZW91dCA9IDA7CS8qIG5vbi1ibG9ja2luZyBtb2RlIC0gcG9sbCB0byBwaWNrIHVwIGVycm9ycyAqLwotCQlkbyB7Ci0JCQlyZXQgPSBwb2xsKCZwb2xsaW5mbywgMSwgdGltZW91dCk7Ci0JCQlpZiAocmV0IDwgMCAmJiBlcnJubyAhPSBFSU5UUikgewotCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCQkiY2FuJ3QgcG9sbCBvbiBwYWNrZXQgc29ja2V0OiAlcyIsCi0JCQkJCXBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWlmIChwb2xsaW5mby5yZXZlbnRzICYgKFBPTExIVVAgfCBQT0xMUkRIVVApKSB7CisJCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwKKwkJCQkJUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJIkhhbmd1cCBvbiBwYWNrZXQgc29ja2V0Iik7CiAJCQkJcmV0dXJuIFBDQVBfRVJST1I7Ci0JCQl9IGVsc2UgaWYgKHJldCA+IDAgJiYKLQkJCQkocG9sbGluZm8ucmV2ZW50cyAmIChQT0xMSFVQfFBPTExSREhVUHxQT0xMRVJSfFBPTExOVkFMKSkpIHsKKwkJCX0KKwkJCWlmIChwb2xsaW5mby5yZXZlbnRzICYgUE9MTEVSUikgewogCQkJCS8qCi0JCQkJICogVGhlcmUncyBzb21lIGluZGljYXRpb24gb3RoZXIgdGhhbgotCQkJCSAqICJ5b3UgY2FuIHJlYWQgb24gdGhpcyBkZXNjcmlwdG9yIiBvbgotCQkJCSAqIHRoZSBkZXNjcmlwdG9yLgorCQkJCSAqIEEgcmVjdigpIHdpbGwgZ2l2ZSB1cyB0aGUgYWN0dWFsIGVycm9yIGNvZGUuCisJCQkJICoKKwkJCQkgKiBYWFggLSBtYWtlIHRoZSBzb2NrZXQgbm9uLWJsb2NraW5nPwogCQkJCSAqLwotCQkJCWlmIChwb2xsaW5mby5yZXZlbnRzICYgKFBPTExIVVAgfCBQT0xMUkRIVVApKSB7Ci0JCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLAotCQkJCQkJUENBUF9FUlJCVUZfU0laRSwKLQkJCQkJCSJIYW5ndXAgb24gcGFja2V0IHNvY2tldCIpOwotCQkJCQlyZXR1cm4gUENBUF9FUlJPUjsKLQkJCQl9Ci0JCQkJaWYgKHBvbGxpbmZvLnJldmVudHMgJiBQT0xMRVJSKSB7CisJCQkJaWYgKHJlY3YoaGFuZGxlLT5mZCwgJmMsIHNpemVvZiBjLAorCQkJCQlNU0dfUEVFSykgIT0gLTEpCisJCQkJCWNvbnRpbnVlOwkvKiB3aGF0LCBubyBlcnJvcj8gKi8KKwkJCQlpZiAoZXJybm8gPT0gRU5FVERPV04pIHsKIAkJCQkJLyoKLQkJCQkJICogQSByZWN2KCkgd2lsbCBnaXZlIHVzIHRoZQotCQkJCQkgKiBhY3R1YWwgZXJyb3IgY29kZS4KKwkJCQkJICogVGhlIGRldmljZSBvbiB3aGljaCB3ZSdyZQorCQkJCQkgKiBjYXB0dXJpbmcgd2VudCBhd2F5LgogCQkJCQkgKgotCQkJCQkgKiBYWFggLSBtYWtlIHRoZSBzb2NrZXQgbm9uLWJsb2NraW5nPworCQkJCQkgKiBYWFggLSB3ZSBzaG91bGQgcmVhbGx5IHJldHVybgorCQkJCQkgKiBQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCwgYnV0CisJCQkJCSAqIHBjYXBfZGlzcGF0Y2goKSBldGMuIGFyZW4ndAorCQkJCQkgKiBkZWZpbmVkIHRvIHJldHVybiB0aGF0LgogCQkJCQkgKi8KLQkJCQkJaWYgKHJlY3YoaGFuZGxlLT5mZCwgJmMsIHNpemVvZiBjLAotCQkJCQkJTVNHX1BFRUspICE9IC0xKQotCQkJCQkJY29udGludWU7CS8qIHdoYXQsIG5vIGVycm9yPyAqLwotCQkJCQlpZiAoZXJybm8gPT0gRU5FVERPV04pIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBUaGUgZGV2aWNlIG9uIHdoaWNoIHdlJ3JlCi0JCQkJCQkgKiBjYXB0dXJpbmcgd2VudCBhd2F5LgotCQkJCQkJICoKLQkJCQkJCSAqIFhYWCAtIHdlIHNob3VsZCByZWFsbHkgcmV0dXJuCi0JCQkJCQkgKiBQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCwKLQkJCQkJCSAqIGJ1dCBwY2FwX2Rpc3BhdGNoKCkgZXRjLgotCQkJCQkJICogYXJlbid0IGRlZmluZWQgdG8gcmV0dXJuCi0JCQkJCQkgKiB0aGF0LgotCQkJCQkJICovCi0JCQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwKLQkJCQkJCQlQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCQkJCSJUaGUgaW50ZXJmYWNlIHdlbnQgZG93biIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsCi0JCQkJCQkJUENBUF9FUlJCVUZfU0laRSwKLQkJCQkJCQkiRXJyb3IgY29uZGl0aW9uIG9uIHBhY2tldCBzb2NrZXQ6ICVzIiwKLQkJCQkJCQlzdHJlcnJvcihlcnJubykpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBQQ0FQX0VSUk9SOwotCQkJCX0KLQkJCQlpZiAocG9sbGluZm8ucmV2ZW50cyAmIFBPTExOVkFMKSB7Ci0JCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLAorCQkJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLAogCQkJCQkJUENBUF9FUlJCVUZfU0laRSwKLQkJCQkJCSJJbnZhbGlkIHBvbGxpbmcgcmVxdWVzdCBvbiBwYWNrZXQgc29ja2V0Iik7Ci0JCQkJCXJldHVybiBQQ0FQX0VSUk9SOworCQkJCQkJIlRoZSBpbnRlcmZhY2Ugd2VudCBkb3duIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwKKwkJCQkJCVBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCQkiRXJyb3IgY29uZGl0aW9uIG9uIHBhY2tldCBzb2NrZXQ6ICVzIiwKKwkJCQkJCXN0cmVycm9yKGVycm5vKSk7CiAJCQkJfQorCQkJCXJldHVybiBQQ0FQX0VSUk9SOwogCQkJfQotCQkJLyogY2hlY2sgZm9yIGJyZWFrIGxvb3AgY29uZGl0aW9uIG9uIGludGVycnVwdGVkIHN5c2NhbGwqLwotCQkJaWYgKGhhbmRsZS0+YnJlYWtfbG9vcCkgewotCQkJCWhhbmRsZS0+YnJlYWtfbG9vcCA9IDA7Ci0JCQkJcmV0dXJuIFBDQVBfRVJST1JfQlJFQUs7CisJCQlpZiAocG9sbGluZm8ucmV2ZW50cyAmIFBPTExOVkFMKSB7CisJCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwKKwkJCQkJUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJIkludmFsaWQgcG9sbGluZyByZXF1ZXN0IG9uIHBhY2tldCBzb2NrZXQiKTsKKwkJCQlyZXR1cm4gUENBUF9FUlJPUjsKIAkJCX0KLQkJfSB3aGlsZSAocmV0IDwgMCk7Ci0JfQorCQl9CisJCS8qIGNoZWNrIGZvciBicmVhayBsb29wIGNvbmRpdGlvbiBvbiBpbnRlcnJ1cHRlZCBzeXNjYWxsKi8KKwkJaWYgKGhhbmRsZS0+YnJlYWtfbG9vcCkgeworCQkJaGFuZGxlLT5icmVha19sb29wID0gMDsKKwkJCXJldHVybiBQQ0FQX0VSUk9SX0JSRUFLOworCQl9CisJfSB3aGlsZSAocmV0IDwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ0NzQsNyArNDY0MSw3IEBACiAKIAkvKiBwZXJmb3JtIHNhbml0eSBjaGVjayBvbiBpbnRlcm5hbCBvZmZzZXQuICovCiAJaWYgKHRwX21hYyArIHRwX3NuYXBsZW4gPiBoYW5kbGUtPmJ1ZnNpemUpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkiY29ycnVwdGVkIGZyYW1lIG9uIGtlcm5lbCByaW5nIG1hYyAiCiAJCQkib2Zmc2V0ICV1ICsgY2FwbGVuICV1ID4gZnJhbWUgbGVuICVkIiwKIAkJCXRwX21hYywgdHBfc25hcGxlbiwgaGFuZGxlLT5idWZzaXplKTsKQEAgLTQ1MTYsNyArNDY4Myw3IEBACiAJCWlmIChicCA8ICh1X2NoYXIgKilmcmFtZSArCiAJCQkJICAgVFBBQ0tFVF9BTElHTihoYW5kbGVwLT50cF9oZHJsZW4pICsKIAkJCQkgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKSkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSJjb29rZWQtbW9kZSBmcmFtZSBkb2Vzbid0IGhhdmUgcm9vbSBmb3Igc2xsIGhlYWRlciIpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC00NTY3LDEzICs0NzM0LDI0IEBACiAJewogCQlzdHJ1Y3Qgdmxhbl90YWcgKnRhZzsKIAorCQkvKgorCQkgKiBNb3ZlIGV2ZXJ5dGhpbmcgaW4gdGhlIGhlYWRlciwgZXhjZXB0IHRoZSB0eXBlIGZpZWxkLAorCQkgKiBkb3duIFZMQU5fVEFHX0xFTiBieXRlcywgdG8gYWxsb3cgdXMgdG8gaW5zZXJ0IHRoZQorCQkgKiBWTEFOIHRhZyBiZXR3ZWVuIHRoYXQgc3R1ZmYgYW5kIHRoZSB0eXBlIGZpZWxkLgorCQkgKi8KIAkJYnAgLT0gVkxBTl9UQUdfTEVOOwogCQltZW1tb3ZlKGJwLCBicCArIFZMQU5fVEFHX0xFTiwgaGFuZGxlcC0+dmxhbl9vZmZzZXQpOwogCisJCS8qCisJCSAqIE5vdyBpbnNlcnQgdGhlIHRhZy4KKwkJICovCiAJCXRhZyA9IChzdHJ1Y3Qgdmxhbl90YWcgKikoYnAgKyBoYW5kbGVwLT52bGFuX29mZnNldCk7CiAJCXRhZy0+dmxhbl90cGlkID0gaHRvbnModHBfdmxhbl90cGlkKTsKIAkJdGFnLT52bGFuX3RjaSA9IGh0b25zKHRwX3ZsYW5fdGNpKTsKIAorCQkvKgorCQkgKiBBZGQgdGhlIHRhZyB0byB0aGUgcGFja2V0IGxlbmd0aHMuCisJCSAqLwogCQlwY2FwaGRyLmNhcGxlbiArPSBWTEFOX1RBR19MRU47CiAJCXBjYXBoZHIubGVuICs9IFZMQU5fVEFHX0xFTjsKIAl9CkBAIC00NTg4LDcgKzQ3NjYsNyBAQAogCSAqIFRyaW0gdGhlIHNuYXBzaG90IGxlbmd0aCB0byBiZSBubyBsb25nZXIgdGhhbiB0aGUKIAkgKiBzcGVjaWZpZWQgc25hcHNob3QgbGVuZ3RoLgogCSAqLwotCWlmIChwY2FwaGRyLmNhcGxlbiA+IGhhbmRsZS0+c25hcHNob3QpCisJaWYgKHBjYXBoZHIuY2FwbGVuID4gKGJwZl91X2ludDMyKWhhbmRsZS0+c25hcHNob3QpCiAJCXBjYXBoZHIuY2FwbGVuID0gaGFuZGxlLT5zbmFwc2hvdDsKIAogCS8qIHBhc3MgdGhlIHBhY2tldCB0byB0aGUgdXNlciAqLwpAQCAtNDYwMiwyMiArNDc4MCwzMiBAQAogCQl1X2NoYXIgKnVzZXIpCiB7CiAJc3RydWN0IHBjYXBfbGludXggKmhhbmRsZXAgPSBoYW5kbGUtPnByaXY7CisJdW5pb24gdGhkciBoOwogCWludCBwa3RzID0gMDsKIAlpbnQgcmV0OwogCiAJLyogd2FpdCBmb3IgZnJhbWVzIGF2YWlsYWJpbGl0eS4qLwotCXJldCA9IHBjYXBfd2FpdF9mb3JfZnJhbWVzX21tYXAoaGFuZGxlKTsKLQlpZiAocmV0KSB7Ci0JCXJldHVybiByZXQ7CisJaC5yYXcgPSBSSU5HX0dFVF9DVVJSRU5UX0ZSQU1FKGhhbmRsZSk7CisJaWYgKGguaDEtPnRwX3N0YXR1cyA9PSBUUF9TVEFUVVNfS0VSTkVMKSB7CisJCS8qCisJCSAqIFRoZSBjdXJyZW50IGZyYW1lIGlzIG93bmVkIGJ5IHRoZSBrZXJuZWw7IHdhaXQgZm9yCisJCSAqIGEgZnJhbWUgdG8gYmUgaGFuZGVkIHRvIHVzLgorCQkgKi8KKwkJcmV0ID0gcGNhcF93YWl0X2Zvcl9mcmFtZXNfbW1hcChoYW5kbGUpOworCQlpZiAocmV0KSB7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCiAJLyogbm9uLXBvc2l0aXZlIHZhbHVlcyBvZiBtYXhfcGFja2V0cyBhcmUgdXNlZCB0byByZXF1aXJlIGFsbAogCSAqIHBhY2tldHMgY3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgcmluZyAqLwogCXdoaWxlICgocGt0cyA8IG1heF9wYWNrZXRzKSB8fCBQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKG1heF9wYWNrZXRzKSkgewotCQl1bmlvbiB0aGRyIGg7Ci0KLQkJaC5yYXcgPSBwY2FwX2dldF9yaW5nX2ZyYW1lKGhhbmRsZSwgVFBfU1RBVFVTX1VTRVIpOwotCQlpZiAoIWgucmF3KQorCQkvKgorCQkgKiBHZXQgdGhlIGN1cnJlbnQgcmluZyBidWZmZXIgZnJhbWUsIGFuZCBicmVhayBpZgorCQkgKiBpdCdzIHN0aWxsIG93bmVkIGJ5IHRoZSBrZXJuZWwuCisJCSAqLworCQloLnJhdyA9IFJJTkdfR0VUX0NVUlJFTlRfRlJBTUUoaGFuZGxlKTsKKwkJaWYgKGguaDEtPnRwX3N0YXR1cyA9PSBUUF9TVEFUVVNfS0VSTkVMKQogCQkJYnJlYWs7CiAKIAkJcmV0ID0gcGNhcF9oYW5kbGVfcGFja2V0X21tYXAoCkBAIC00Njc2LDIyICs0ODY0LDMyIEBACiAJCXVfY2hhciAqdXNlcikKIHsKIAlzdHJ1Y3QgcGNhcF9saW51eCAqaGFuZGxlcCA9IGhhbmRsZS0+cHJpdjsKKwl1bmlvbiB0aGRyIGg7CiAJaW50IHBrdHMgPSAwOwogCWludCByZXQ7CiAKIAkvKiB3YWl0IGZvciBmcmFtZXMgYXZhaWxhYmlsaXR5LiovCi0JcmV0ID0gcGNhcF93YWl0X2Zvcl9mcmFtZXNfbW1hcChoYW5kbGUpOwotCWlmIChyZXQpIHsKLQkJcmV0dXJuIHJldDsKKwloLnJhdyA9IFJJTkdfR0VUX0NVUlJFTlRfRlJBTUUoaGFuZGxlKTsKKwlpZiAoaC5oMV82NC0+dHBfc3RhdHVzID09IFRQX1NUQVRVU19LRVJORUwpIHsKKwkJLyoKKwkJICogVGhlIGN1cnJlbnQgZnJhbWUgaXMgb3duZWQgYnkgdGhlIGtlcm5lbDsgd2FpdCBmb3IKKwkJICogYSBmcmFtZSB0byBiZSBoYW5kZWQgdG8gdXMuCisJCSAqLworCQlyZXQgPSBwY2FwX3dhaXRfZm9yX2ZyYW1lc19tbWFwKGhhbmRsZSk7CisJCWlmIChyZXQpIHsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAKIAkvKiBub24tcG9zaXRpdmUgdmFsdWVzIG9mIG1heF9wYWNrZXRzIGFyZSB1c2VkIHRvIHJlcXVpcmUgYWxsCiAJICogcGFja2V0cyBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHRoZSByaW5nICovCiAJd2hpbGUgKChwa3RzIDwgbWF4X3BhY2tldHMpIHx8IFBBQ0tFVF9DT1VOVF9JU19VTkxJTUlURUQobWF4X3BhY2tldHMpKSB7Ci0JCXVuaW9uIHRoZHIgaDsKLQotCQloLnJhdyA9IHBjYXBfZ2V0X3JpbmdfZnJhbWUoaGFuZGxlLCBUUF9TVEFUVVNfVVNFUik7Ci0JCWlmICghaC5yYXcpCisJCS8qCisJCSAqIEdldCB0aGUgY3VycmVudCByaW5nIGJ1ZmZlciBmcmFtZSwgYW5kIGJyZWFrIGlmCisJCSAqIGl0J3Mgc3RpbGwgb3duZWQgYnkgdGhlIGtlcm5lbC4KKwkJICovCisJCWgucmF3ID0gUklOR19HRVRfQ1VSUkVOVF9GUkFNRShoYW5kbGUpOworCQlpZiAoaC5oMV82NC0+dHBfc3RhdHVzID09IFRQX1NUQVRVU19LRVJORUwpCiAJCQlicmVhazsKIAogCQlyZXQgPSBwY2FwX2hhbmRsZV9wYWNrZXRfbW1hcCgKQEAgLTQ3NTEsMjIgKzQ5NDksMzIgQEAKIAkJdV9jaGFyICp1c2VyKQogewogCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OworCXVuaW9uIHRoZHIgaDsKIAlpbnQgcGt0cyA9IDA7CiAJaW50IHJldDsKIAogCS8qIHdhaXQgZm9yIGZyYW1lcyBhdmFpbGFiaWxpdHkuKi8KLQlyZXQgPSBwY2FwX3dhaXRfZm9yX2ZyYW1lc19tbWFwKGhhbmRsZSk7Ci0JaWYgKHJldCkgewotCQlyZXR1cm4gcmV0OworCWgucmF3ID0gUklOR19HRVRfQ1VSUkVOVF9GUkFNRShoYW5kbGUpOworCWlmIChoLmgyLT50cF9zdGF0dXMgPT0gVFBfU1RBVFVTX0tFUk5FTCkgeworCQkvKgorCQkgKiBUaGUgY3VycmVudCBmcmFtZSBpcyBvd25lZCBieSB0aGUga2VybmVsOyB3YWl0IGZvcgorCQkgKiBhIGZyYW1lIHRvIGJlIGhhbmRlZCB0byB1cy4KKwkJICovCisJCXJldCA9IHBjYXBfd2FpdF9mb3JfZnJhbWVzX21tYXAoaGFuZGxlKTsKKwkJaWYgKHJldCkgeworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAogCS8qIG5vbi1wb3NpdGl2ZSB2YWx1ZXMgb2YgbWF4X3BhY2tldHMgYXJlIHVzZWQgdG8gcmVxdWlyZSBhbGwKIAkgKiBwYWNrZXRzIGN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIHJpbmcgKi8KIAl3aGlsZSAoKHBrdHMgPCBtYXhfcGFja2V0cykgfHwgUEFDS0VUX0NPVU5UX0lTX1VOTElNSVRFRChtYXhfcGFja2V0cykpIHsKLQkJdW5pb24gdGhkciBoOwotCi0JCWgucmF3ID0gcGNhcF9nZXRfcmluZ19mcmFtZShoYW5kbGUsIFRQX1NUQVRVU19VU0VSKTsKLQkJaWYgKCFoLnJhdykKKwkJLyoKKwkJICogR2V0IHRoZSBjdXJyZW50IHJpbmcgYnVmZmVyIGZyYW1lLCBhbmQgYnJlYWsgaWYKKwkJICogaXQncyBzdGlsbCBvd25lZCBieSB0aGUga2VybmVsLgorCQkgKi8KKwkJaC5yYXcgPSBSSU5HX0dFVF9DVVJSRU5UX0ZSQU1FKGhhbmRsZSk7CisJCWlmIChoLmgyLT50cF9zdGF0dXMgPT0gVFBfU1RBVFVTX0tFUk5FTCkKIAkJCWJyZWFrOwogCiAJCXJldCA9IHBjYXBfaGFuZGxlX3BhY2tldF9tbWFwKApAQCAtNDgzOCwxMyArNTA0NiwyMCBAQAogYWdhaW46CiAJaWYgKGhhbmRsZXAtPmN1cnJlbnRfcGFja2V0ID09IE5VTEwpIHsKIAkJLyogd2FpdCBmb3IgZnJhbWVzIGF2YWlsYWJpbGl0eS4qLwotCQlyZXQgPSBwY2FwX3dhaXRfZm9yX2ZyYW1lc19tbWFwKGhhbmRsZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXJldHVybiByZXQ7CisJCWgucmF3ID0gUklOR19HRVRfQ1VSUkVOVF9GUkFNRShoYW5kbGUpOworCQlpZiAoaC5oMy0+aGRyLmJoMS5ibG9ja19zdGF0dXMgPT0gVFBfU1RBVFVTX0tFUk5FTCkgeworCQkJLyoKKwkJCSAqIFRoZSBjdXJyZW50IGZyYW1lIGlzIG93bmVkIGJ5IHRoZSBrZXJuZWw7IHdhaXQKKwkJCSAqIGZvciBhIGZyYW1lIHRvIGJlIGhhbmRlZCB0byB1cy4KKwkJCSAqLworCQkJcmV0ID0gcGNhcF93YWl0X2Zvcl9mcmFtZXNfbW1hcChoYW5kbGUpOworCQkJaWYgKHJldCkgeworCQkJCXJldHVybiByZXQ7CisJCQl9CiAJCX0KIAl9Ci0JaC5yYXcgPSBwY2FwX2dldF9yaW5nX2ZyYW1lKGhhbmRsZSwgVFBfU1RBVFVTX1VTRVIpOwotCWlmICghaC5yYXcpIHsKKwloLnJhdyA9IFJJTkdfR0VUX0NVUlJFTlRfRlJBTUUoaGFuZGxlKTsKKwlpZiAoaC5oMy0+aGRyLmJoMS5ibG9ja19zdGF0dXMgPT0gVFBfU1RBVFVTX0tFUk5FTCkgewogCQlpZiAocGt0cyA9PSAwICYmIGhhbmRsZXAtPnRpbWVvdXQgPT0gMCkgewogCQkJLyogQmxvY2sgdW50aWwgd2Ugc2VlIGEgcGFja2V0LiAqLwogCQkJZ290byBhZ2FpbjsKQEAgLTQ4NTUsMjEgKzUwNzAsMzAgQEAKIAkvKiBub24tcG9zaXRpdmUgdmFsdWVzIG9mIG1heF9wYWNrZXRzIGFyZSB1c2VkIHRvIHJlcXVpcmUgYWxsCiAJICogcGFja2V0cyBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHRoZSByaW5nICovCiAJd2hpbGUgKChwa3RzIDwgbWF4X3BhY2tldHMpIHx8IFBBQ0tFVF9DT1VOVF9JU19VTkxJTUlURUQobWF4X3BhY2tldHMpKSB7CisJCWludCBwYWNrZXRzX3RvX3JlYWQ7CisKIAkJaWYgKGhhbmRsZXAtPmN1cnJlbnRfcGFja2V0ID09IE5VTEwpIHsKLQkJCWgucmF3ID0gcGNhcF9nZXRfcmluZ19mcmFtZShoYW5kbGUsIFRQX1NUQVRVU19VU0VSKTsKLQkJCWlmICghaC5yYXcpCisJCQloLnJhdyA9IFJJTkdfR0VUX0NVUlJFTlRfRlJBTUUoaGFuZGxlKTsKKwkJCWlmIChoLmgzLT5oZHIuYmgxLmJsb2NrX3N0YXR1cyA9PSBUUF9TVEFUVVNfS0VSTkVMKQogCQkJCWJyZWFrOwogCiAJCQloYW5kbGVwLT5jdXJyZW50X3BhY2tldCA9IGgucmF3ICsgaC5oMy0+aGRyLmJoMS5vZmZzZXRfdG9fZmlyc3RfcGt0OwogCQkJaGFuZGxlcC0+cGFja2V0c19sZWZ0ID0gaC5oMy0+aGRyLmJoMS5udW1fcGt0czsKIAkJfQotCQlpbnQgcGFja2V0c190b19yZWFkID0gaGFuZGxlcC0+cGFja2V0c19sZWZ0OworCQlwYWNrZXRzX3RvX3JlYWQgPSBoYW5kbGVwLT5wYWNrZXRzX2xlZnQ7CiAKLQkJaWYgKCFQQUNLRVRfQ09VTlRfSVNfVU5MSU1JVEVEKG1heF9wYWNrZXRzKSAmJiBwYWNrZXRzX3RvX3JlYWQgPiBtYXhfcGFja2V0cykgewotCQkJcGFja2V0c190b19yZWFkID0gbWF4X3BhY2tldHM7CisJCWlmICghUEFDS0VUX0NPVU5UX0lTX1VOTElNSVRFRChtYXhfcGFja2V0cykgJiYKKwkJICAgIHBhY2tldHNfdG9fcmVhZCA+IChtYXhfcGFja2V0cyAtIHBrdHMpKSB7CisJCQkvKgorCQkJICogV2UndmUgYmVlbiBnaXZlbiBhIG1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMKKwkJCSAqIHRvIHByb2Nlc3MsIGFuZCB0aGVyZSBhcmUgbW9yZSBwYWNrZXRzIGluCisJCQkgKiB0aGlzIGJ1ZmZlciB0aGFuIHRoYXQuICBPbmx5IHByb2Nlc3MgZW5vdWdoCisJCQkgKiBvZiB0aGVtIHRvIGdldCB1cyB1cCB0byB0aGF0IG1heGltdW0uCisJCQkgKi8KKwkJCXBhY2tldHNfdG9fcmVhZCA9IG1heF9wYWNrZXRzIC0gcGt0czsKIAkJfQogCi0JCXdoaWxlKHBhY2tldHNfdG9fcmVhZC0tKSB7CisJCXdoaWxlIChwYWNrZXRzX3RvX3JlYWQtLSAmJiAhaGFuZGxlLT5icmVha19sb29wKSB7CiAJCQlzdHJ1Y3QgdHBhY2tldDNfaGRyKiB0cDNfaGRyID0gKHN0cnVjdCB0cGFja2V0M19oZHIqKSBoYW5kbGVwLT5jdXJyZW50X3BhY2tldDsKIAkJCXJldCA9IHBjYXBfaGFuZGxlX3BhY2tldF9tbWFwKAogCQkJCQloYW5kbGUsCkBAIC00OTc0LDEyICs1MTk4LDEyIEBACiAJICogd2FsayB0aGUgcmluZyBiYWNrd2FyZCBhbmQgY291bnQgdGhlIGZyZWUgYmxvY2tzLgogCSAqLwogCW9mZnNldCA9IGhhbmRsZS0+b2Zmc2V0OwotCWlmICgtLWhhbmRsZS0+b2Zmc2V0IDwgMCkKLQkJaGFuZGxlLT5vZmZzZXQgPSBoYW5kbGUtPmNjIC0gMTsKKwlpZiAoLS1vZmZzZXQgPCAwKQorCQlvZmZzZXQgPSBoYW5kbGUtPmNjIC0gMTsKIAlmb3IgKG49MDsgbiA8IGhhbmRsZS0+Y2M7ICsrbikgewotCQlpZiAoLS1oYW5kbGUtPm9mZnNldCA8IDApCi0JCQloYW5kbGUtPm9mZnNldCA9IGhhbmRsZS0+Y2MgLSAxOwotCQlpZiAoIXBjYXBfZ2V0X3JpbmdfZnJhbWUoaGFuZGxlLCBUUF9TVEFUVVNfS0VSTkVMKSkKKwkJaWYgKC0tb2Zmc2V0IDwgMCkKKwkJCW9mZnNldCA9IGhhbmRsZS0+Y2MgLSAxOworCQlpZiAocGNhcF9nZXRfcmluZ19mcmFtZV9zdGF0dXMoaGFuZGxlLCBvZmZzZXQpICE9IFRQX1NUQVRVU19LRVJORUwpCiAJCQlicmVhazsKIAl9CiAKQEAgLTUwMDAsOSArNTIyNCw2IEBACiAJaWYgKG4gIT0gMCkKIAkJbi0tOwogCi0JLyogYmUgY2FyZWZ1bCB0byBub3QgY2hhbmdlIGN1cnJlbnQgcmluZyBwb3NpdGlvbiAqLwotCWhhbmRsZS0+b2Zmc2V0ID0gb2Zmc2V0OwotCiAJLyoKIAkgKiBTZXQgdGhlIGNvdW50IG9mIGJsb2NrcyB3b3J0aCBvZiBwYWNrZXRzIHRvIGZpbHRlcgogCSAqIGluIHVzZXJsYW5kIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIGluIHRoZQpAQCAtNTAzNiw3ICs1MjU3LDcgQEAKIAlzdHJsY3B5KGlmci5pZnJfbmFtZSwgZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CiAKIAlpZiAoaW9jdGwoZmQsIFNJT0NHSUZJTkRFWCwgJmlmcikgPT0gLTEpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJTSU9DR0lGSU5ERVg6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNTA3Miw3ICs1MjkzLDcgQEAKIAkJCSAqLwogCQkJcmV0dXJuIFBDQVBfRVJST1JfSUZBQ0VfTk9UX1VQOwogCQl9IGVsc2UgewotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgImJpbmQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuIFBDQVBfRVJST1I7CiAJCX0KQEAgLTUwODEsNyArNTMwMiw3IEBACiAJLyogQW55IHBlbmRpbmcgZXJyb3JzLCBlLmcuLCBuZXR3b3JrIGlzIGRvd24/ICovCiAKIAlpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsICZlcnIsICZlcnJsZW4pID09IC0xKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSJnZXRzb2Nrb3B0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTA5Niw3ICs1MzE3LDcgQEAKIAkJICovCiAJCXJldHVybiBQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUDsKIAl9IGVsc2UgaWYgKGVyciA+IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJImJpbmQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnIpKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTEyMiw3ICs1MzQzLDcgQEAKIAkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKIAlpZiAoaW9jdGwoc29ja19mZCwgU0lPQ0dJV05BTUUsICZpcmVxKSA+PSAwKQogCQlyZXR1cm4gMTsJLyogeWVzICovCi0Jc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJICAgICIlczogU0lPQ0dJV05BTUU6ICVzIiwgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJaWYgKGVycm5vID09IEVOT0RFVikKIAkJcmV0dXJuIFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U7CkBAIC01MjYxLDcgKzU0ODIsNyBAQAogCWlyZXEudS5kYXRhLmxlbmd0aCA9IDA7CiAJaXJlcS51LmRhdGEuZmxhZ3MgPSAwOwogCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lXUFJJViwgJmlyZXEpICE9IC0xKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIiVzOiBTSU9DR0lXUFJJViB3aXRoIGEgemVyby1sZW5ndGggYnVmZmVyIGRpZG4ndCBmYWlsISIsCiAJCSAgICBkZXZpY2UpOwogCQlyZXR1cm4gUENBUF9FUlJPUjsKQEAgLTUyNzQsNyArNTQ5NSw3IEBACiAJCQkvKgogCQkJICogRmFpbGVkLgogCQkJICovCi0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIiVzOiBTSU9DR0lXUFJJVjogJXMiLCBkZXZpY2UsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuIFBDQVBfRVJST1I7CkBAIC01Mjg1LDEzICs1NTA2LDEzIEBACiAJCSAqLwogCQlwcml2ID0gbWFsbG9jKGlyZXEudS5kYXRhLmxlbmd0aCAqIHNpemVvZiAoc3RydWN0IGl3X3ByaXZfYXJncykpOwogCQlpZiAocHJpdiA9PSBOVUxMKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gUENBUF9FUlJPUjsKIAkJfQogCQlpcmVxLnUuZGF0YS5wb2ludGVyID0gKHZvaWQgKilwcml2OwogCQlpZiAoaW9jdGwoc29ja19mZCwgU0lPQ0dJV1BSSVYsICZpcmVxKSA9PSAtMSkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICIlczogU0lPQ0dJV1BSSVY6ICVzIiwgZGV2aWNlLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWZyZWUocHJpdik7CkBAIC01NTQ3LDcgKzU3NjgsNyBAQAogCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CiAJc3RybGNweShpZnIuaWZyX25hbWUsIGRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwogCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lGRkxBR1MsICZpZnIpID09IC0xKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIiVzOiBDYW4ndCBnZXQgZmxhZ3M6ICVzIiwgZGV2aWNlLCBzdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gUENBUF9FUlJPUjsKIAl9CkBAIC01NTU2LDcgKzU3NzcsNyBAQAogCQlvbGRmbGFncyA9IGlmci5pZnJfZmxhZ3M7CiAJCWlmci5pZnJfZmxhZ3MgJj0gfklGRl9VUDsKIAkJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiJXM6IENhbid0IHNldCBmbGFnczogJXMiLCBkZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gUENBUF9FUlJPUjsKIAkJfQpAQCAtNTU3NSw3ICs1Nzk2LDcgQEAKIAkJICovCiAJCWlmci5pZnJfZmxhZ3MgPSBvbGRmbGFnczsKIAkJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiJXM6IENhbid0IHNldCBmbGFnczogJXMiLCBkZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gUENBUF9FUlJPUjsKIAkJfQpAQCAtNTY1OSw3ICs1ODgwLDcgQEAKIAkJc3RybGNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgZGV2aWNlLAogCQkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKIAkJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSVdGUkVRLCAmaXJlcSkgPT0gLTEpIHsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiJXM6IFNJT0NHSVdGUkVROiAlcyIsIGRldmljZSwKIAkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gUENBUF9FUlJPUjsKQEAgLTU3MzYsNyArNTk1Nyw3IEBACiAJaWYgKG9sZGZsYWdzICE9IDApIHsKIAkJaWZyLmlmcl9mbGFncyA9IG9sZGZsYWdzOwogCQlpZiAoaW9jdGwoc29ja19mZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKSA9PSAtMSkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICIlczogQ2FuJ3Qgc2V0IGZsYWdzOiAlcyIsIGRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKIAogCQkJLyoKQEAgLTU4MTksMTAgKzYwNDAsMTMgQEAKIH07CiAjZGVmaW5lIE5VTV9TT0ZfVElNRVNUQU1QSU5HX1RZUEVTCShzaXplb2Ygc29mX3RzX3R5cGVfbWFwIC8gc2l6ZW9mIHNvZl90c190eXBlX21hcFswXSkKIAorLyoKKyAqIFNldCB0aGUgbGlzdCBvZiB0aW1lIHN0YW1waW5nIHR5cGVzIHRvIGluY2x1ZGUgYWxsIHR5cGVzLgorICovCiBzdGF0aWMgdm9pZAotaWZhY2Vfc2V0X2RlZmF1bHRfdHNfdHlwZXMocGNhcF90ICpoYW5kbGUpCitpZmFjZV9zZXRfYWxsX3RzX3R5cGVzKHBjYXBfdCAqaGFuZGxlKQogewotCWludCBpOworCXVfaW50IGk7CiAKIAloYW5kbGUtPnRzdGFtcF90eXBlX2NvdW50ID0gTlVNX1NPRl9USU1FU1RBTVBJTkdfVFlQRVM7CiAJaGFuZGxlLT50c3RhbXBfdHlwZV9saXN0ID0gbWFsbG9jKE5VTV9TT0ZfVElNRVNUQU1QSU5HX1RZUEVTICogc2l6ZW9mKHVfaW50KSk7CkBAIC01ODM1LDU2ICs2MDU5LDk2IEBACiAgKiBHZXQgYSBsaXN0IG9mIHRpbWUgc3RhbXBpbmcgY2FwYWJpbGl0aWVzLgogICovCiBzdGF0aWMgaW50Ci1pZmFjZV9ldGh0b29sX2dldF90c19pbmZvKHBjYXBfdCAqaGFuZGxlLCBjaGFyICplYnVmKQoraWZhY2VfZXRodG9vbF9nZXRfdHNfaW5mbyhjb25zdCBjaGFyICpkZXZpY2UsIHBjYXBfdCAqaGFuZGxlLCBjaGFyICplYnVmKQogewogCWludCBmZDsKIAlzdHJ1Y3QgaWZyZXEgaWZyOwogCXN0cnVjdCBldGh0b29sX3RzX2luZm8gaW5mbzsKIAlpbnQgbnVtX3RzX3R5cGVzOwotCWludCBpLCBqOworCXVfaW50IGksIGo7CiAKIAkvKgotCSAqIFRoaXMgZG9lc24ndCBhcHBseSB0byB0aGUgImFueSIgZGV2aWNlOyB5b3UgaGF2ZSB0byBhc2sKLQkgKiBzcGVjaWZpYyBkZXZpY2VzIGZvciB0aGVpciBjYXBhYmlsaXRpZXMsIHNvIGp1c3QgZGVmYXVsdAotCSAqIHRvIHNheWluZyB3ZSBzdXBwb3J0IGFsbCBvZiB0aGVtLgorCSAqIFRoaXMgZG9lc24ndCBhcHBseSB0byB0aGUgImFueSIgZGV2aWNlOyB5b3UgY2FuJ3Qgc2F5ICJ0dXJuIG9uCisJICogaGFyZHdhcmUgdGltZSBzdGFtcGluZyBmb3IgYWxsIGRldmljZXMgdGhhdCBleGlzdCBub3cgYW5kIGFycmFuZ2UKKwkgKiB0aGF0IGl0IGJlIHR1cm5lZCBvbiBmb3IgYW55IGRldmljZSB0aGF0IGFwcGVhcnMgaW4gdGhlIGZ1dHVyZSIsCisJICogYW5kIG5vdCBhbGwgZGV2aWNlcyBldmVuIG5lY2Vzc2FyaWx5ICpzdXBwb3J0KiBoYXJkd2FyZSB0aW1lCisJICogc3RhbXBpbmcsIHNvIGRvbid0IHJlcG9ydCBhbnkgdGltZSBzdGFtcCB0eXBlcy4KIAkgKi8KLQlpZiAoc3RyY21wKGhhbmRsZS0+b3B0LnNvdXJjZSwgImFueSIpID09IDApIHsKLQkJaWZhY2Vfc2V0X2RlZmF1bHRfdHNfdHlwZXMoaGFuZGxlKTsKKwlpZiAoc3RyY21wKGRldmljZSwgImFueSIpID09IDApIHsKKwkJaGFuZGxlLT50c3RhbXBfdHlwZV9saXN0ID0gTlVMTDsKIAkJcmV0dXJuIDA7CiAJfQogCiAJLyoKIAkgKiBDcmVhdGUgYSBzb2NrZXQgZnJvbSB3aGljaCB0byBmZXRjaCB0aW1lIHN0YW1waW5nIGNhcGFiaWxpdGllcy4KIAkgKi8KLQlmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlmZCA9IHNvY2tldChQRl9VTklYLCBTT0NLX1JBVywgMCk7CiAJaWYgKGZkIDwgMCkgewotCQkodm9pZClzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkodm9pZClwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAic29ja2V0IGZvciBTSU9DRVRIVE9PTChFVEhUT09MX0dFVF9UU19JTkZPKTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOwotCXN0cmxjcHkoaWZyLmlmcl9uYW1lLCBoYW5kbGUtPm9wdC5zb3VyY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwlzdHJsY3B5KGlmci5pZnJfbmFtZSwgZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CiAJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwogCWluZm8uY21kID0gRVRIVE9PTF9HRVRfVFNfSU5GTzsKIAlpZnIuaWZyX2RhdGEgPSAoY2FkZHJfdCkmaW5mbzsKIAlpZiAoaW9jdGwoZmQsIFNJT0NFVEhUT09MLCAmaWZyKSA9PSAtMSkgeworCQlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCiAJCWNsb3NlKGZkKTsKLQkJaWYgKGVycm5vID09IEVPUE5PVFNVUFAgfHwgZXJybm8gPT0gRUlOVkFMKSB7CisJCXN3aXRjaCAoc2F2ZV9lcnJubykgeworCisJCWNhc2UgRU9QTk9UU1VQUDoKKwkJY2FzZSBFSU5WQUw6CiAJCQkvKgotCQkJICogT0ssIGxldCdzIGp1c3QgcmV0dXJuIGFsbCB0aGUgcG9zc2libGUgdGltZQotCQkJICogc3RhbXBpbmcgdHlwZXMuCisJCQkgKiBPSywgdGhpcyBPUyB2ZXJzaW9uIG9yIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQKKwkJCSAqIGFza2luZyBmb3IgdGhlIHRpbWUgc3RhbXBpbmcgdHlwZXMsIHNvIGxldCdzCisJCQkgKiBqdXN0IHJldHVybiBhbGwgdGhlIHBvc3NpYmxlIHR5cGVzLgogCQkJICovCi0JCQlpZmFjZV9zZXRfZGVmYXVsdF90c190eXBlcyhoYW5kbGUpOworCQkJaWZhY2Vfc2V0X2FsbF90c190eXBlcyhoYW5kbGUpOwogCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBFTk9ERVY6CisJCQkvKgorCQkJICogT0ssIG5vIHN1Y2ggZGV2aWNlLgorCQkJICogVGhlIHVzZXIgd2lsbCBmaW5kIHRoYXQgb3V0IHdoZW4gdGhleSB0cnkgdG8KKwkJCSAqIGFjdGl2YXRlIHRoZSBkZXZpY2U7IGp1c3QgcmV0dXJuIGFuIGVtcHR5CisJCQkgKiBsaXN0IG9mIHRpbWUgc3RhbXAgdHlwZXMuCisJCQkgKi8KKwkJCWhhbmRsZS0+dHN0YW1wX3R5cGVfbGlzdCA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIE90aGVyIGVycm9yLgorCQkJICovCisJCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIiVzOiBTSU9DRVRIVE9PTChFVEhUT09MX0dFVF9UU19JTkZPKSBpb2N0bCBmYWlsZWQ6ICVzIiwgZGV2aWNlLAorCQkJICAgIHN0cmVycm9yKHNhdmVfZXJybm8pKTsKKwkJCXJldHVybiAtMTsKIAkJfQotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkgICAgIiVzOiBTSU9DRVRIVE9PTChFVEhUT09MX0dFVF9UU19JTkZPKSBpb2N0bCBmYWlsZWQ6ICVzIiwgaGFuZGxlLT5vcHQuc291cmNlLAotCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwogCX0KIAljbG9zZShmZCk7CiAKKwkvKgorCSAqIERvIHdlIHN1cHBvcnQgaGFyZHdhcmUgdGltZSBzdGFtcGluZyBvZiAqYWxsKiBwYWNrZXRzPworCSAqLworCWlmICghKGluZm8ucnhfZmlsdGVycyAmICgxIDw8IEhXVFNUQU1QX0ZJTFRFUl9BTEwpKSkgeworCQkvKgorCQkgKiBObywgc28gZG9uJ3QgcmVwb3J0IGFueSB0aW1lIHN0YW1wIHR5cGVzLgorCQkgKgorCQkgKiBYWFggLSBzb21lIGRldmljZXMgZWl0aGVyIGRvbid0IHJlcG9ydAorCQkgKiBIV1RTVEFNUF9GSUxURVJfQUxMIHdoZW4gdGhleSBkbyBzdXBwb3J0IGl0LCBvcgorCQkgKiByZXBvcnQgSFdUU1RBTVBfRklMVEVSX0FMTCBidXQgbWFwIGl0IHRvIG9ubHkKKwkJICogdGltZSBzdGFtcGluZyBhIGZldyBQVFAgcGFja2V0cy4gIFNlZQorCQkgKiBodHRwOi8vbWFyYy5pbmZvLz9sPWxpbnV4LW5ldGRldiZtPTE0NjMxODE4MzUyOTU3MSZ3PTIKKwkJICovCisJCWhhbmRsZS0+dHN0YW1wX3R5cGVfbGlzdCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKwogCW51bV90c190eXBlcyA9IDA7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9TT0ZfVElNRVNUQU1QSU5HX1RZUEVTOyBpKyspIHsKIAkJaWYgKGluZm8uc29fdGltZXN0YW1waW5nICYgc29mX3RzX3R5cGVfbWFwW2ldLnNvZnRfdGltZXN0YW1waW5nX3ZhbCkKQEAgLTU5MDYsMTMgKzYxNzAsMjUgQEAKIH0KICNlbHNlIC8qIEVUSFRPT0xfR0VUX1RTX0lORk8gKi8KIHN0YXRpYyBpbnQKLWlmYWNlX2V0aHRvb2xfZ2V0X3RzX2luZm8ocGNhcF90ICpoYW5kbGUsIGNoYXIgKmVidWYgX1VfKQoraWZhY2VfZXRodG9vbF9nZXRfdHNfaW5mbyhjb25zdCBjaGFyICpkZXZpY2UsIHBjYXBfdCAqaGFuZGxlLCBjaGFyICplYnVmIF9VXykKIHsKIAkvKgorCSAqIFRoaXMgZG9lc24ndCBhcHBseSB0byB0aGUgImFueSIgZGV2aWNlOyB5b3UgY2FuJ3Qgc2F5ICJ0dXJuIG9uCisJICogaGFyZHdhcmUgdGltZSBzdGFtcGluZyBmb3IgYWxsIGRldmljZXMgdGhhdCBleGlzdCBub3cgYW5kIGFycmFuZ2UKKwkgKiB0aGF0IGl0IGJlIHR1cm5lZCBvbiBmb3IgYW55IGRldmljZSB0aGF0IGFwcGVhcnMgaW4gdGhlIGZ1dHVyZSIsCisJICogYW5kIG5vdCBhbGwgZGV2aWNlcyBldmVuIG5lY2Vzc2FyaWx5ICpzdXBwb3J0KiBoYXJkd2FyZSB0aW1lCisJICogc3RhbXBpbmcsIHNvIGRvbid0IHJlcG9ydCBhbnkgdGltZSBzdGFtcCB0eXBlcy4KKwkgKi8KKwlpZiAoc3RyY21wKGRldmljZSwgImFueSIpID09IDApIHsKKwkJaGFuZGxlLT50c3RhbXBfdHlwZV9saXN0ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKIAkgKiBXZSBkb24ndCBoYXZlIGFuIGlvY3RsIHRvIHVzZSB0byBhc2sgd2hhdCdzIHN1cHBvcnRlZCwKIAkgKiBzbyBzYXkgd2Ugc3VwcG9ydCBldmVyeXRoaW5nLgogCSAqLwotCWlmYWNlX3NldF9kZWZhdWx0X3RzX3R5cGVzKGhhbmRsZSk7CisJaWZhY2Vfc2V0X2FsbF90c190eXBlcyhoYW5kbGUpOwogCXJldHVybiAwOwogfQogI2VuZGlmIC8qIEVUSFRPT0xfR0VUX1RTX0lORk8gKi8KQEAgLTU5MzYsNyArNjIxMiw3IEBACiAJc3RydWN0IGV0aHRvb2xfdmFsdWUgZXZhbDsKIAogCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7Ci0Jc3RybGNweShpZnIuaWZyX25hbWUsIGhhbmRsZS0+b3B0LnNvdXJjZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCXN0cmxjcHkoaWZyLmlmcl9uYW1lLCBoYW5kbGUtPm9wdC5kZXZpY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKIAlldmFsLmNtZCA9IGNtZDsKIAlldmFsLmRhdGEgPSAwOwogCWlmci5pZnJfZGF0YSA9IChjYWRkcl90KSZldmFsOwpAQCAtNTk1MCw4ICs2MjI2LDggQEAKIAkJCSAqLwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCSAgICAiJXM6IFNJT0NFVEhUT09MKCVzKSBpb2N0bCBmYWlsZWQ6ICVzIiwgaGFuZGxlLT5vcHQuc291cmNlLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBTSU9DRVRIVE9PTCglcykgaW9jdGwgZmFpbGVkOiAlcyIsIGhhbmRsZS0+b3B0LmRldmljZSwKIAkJICAgIGNtZG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC02MDQzLDcgKzYzMTksNyBAQAogCXN0cnVjdCBwY2FwX2xpbnV4ICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OwogCWludAkJYXJwdHlwZTsKIAlzdHJ1Y3QgaWZyZXEJaWZyOwotCWNvbnN0IGNoYXIJKmRldmljZSA9IGhhbmRsZS0+b3B0LnNvdXJjZTsKKwljb25zdCBjaGFyCSpkZXZpY2UgPSBoYW5kbGUtPm9wdC5kZXZpY2U7CiAJc3RydWN0IHV0c25hbWUJdXRzbmFtZTsKIAlpbnQJCW10dTsKIApAQCAtNjA1MSw3ICs2MzI3LDcgQEAKIAogCWhhbmRsZS0+ZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19QQUNLRVQsIGh0b25zKEVUSF9QX0FMTCkpOwogCWlmIChoYW5kbGUtPmZkID09IC0xKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlpZiAoZXJybm8gPT0gRVBFUk0gfHwgZXJybm8gPT0gRUFDQ0VTKSB7CiAJCQkvKgpAQCAtNjA5Niw3ICs2MzcyLDcgQEAKIAkgKi8KIAltYXBfYXJwaHJkX3RvX2RsdChoYW5kbGUsIGhhbmRsZS0+ZmQsIGFycHR5cGUsIGRldmljZSwgMCk7CiAJaWYgKGhhbmRsZS0+bGlua3R5cGUgPT0gLTEpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgInVua25vd24gYXJwdHlwZSAlZCIsIGFycHR5cGUpOwogCQlyZXR1cm4gUENBUF9FUlJPUjsKIAl9CkBAIC02MTA3LDcgKzYzODMsNyBAQAogCQltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOwogCQlzdHJsY3B5KGlmci5pZnJfbmFtZSwgZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CiAJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DR0lGRkxBR1MsICZpZnIpID09IC0xKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICJTSU9DR0lGRkxBR1M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuIFBDQVBfRVJST1I7CiAJCX0KQEAgLTYxMzUsNyArNjQxMSw3IEBACiAKIAkJCWlmci5pZnJfZmxhZ3MgfD0gSUZGX1BST01JU0M7CiAJCQlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKSA9PSAtMSkgewotCQkJICAgICAgICBzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAgICAgcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkJICJTSU9DU0lGRkxBR1M6ICVzIiwKIAkJCQkJIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQlyZXR1cm4gUENBUF9FUlJPUjsKQEAgLTYyMDQsOCArNjQ4MCw4IEBACiAJCWlmIChtdHUgPT0gLTEpCiAJCQlyZXR1cm4gUENBUF9FUlJPUjsKIAkJaGFuZGxlLT5idWZzaXplID0gTUFYX0xJTktIRUFERVJfU0laRSArIG10dTsKLQkJaWYgKGhhbmRsZS0+YnVmc2l6ZSA8IGhhbmRsZS0+c25hcHNob3QpCi0JCQloYW5kbGUtPmJ1ZnNpemUgPSBoYW5kbGUtPnNuYXBzaG90OworCQlpZiAoaGFuZGxlLT5idWZzaXplIDwgKHVfaW50KWhhbmRsZS0+c25hcHNob3QpCisJCQloYW5kbGUtPmJ1ZnNpemUgPSAodV9pbnQpaGFuZGxlLT5zbmFwc2hvdDsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBUaGlzIGlzIGEgMi4yWy54XSBvciBsYXRlciBrZXJuZWwuCkBAIC02MjEzLDcgKzY0ODksNyBAQAogCQkgKiBXZSBjYW4gc2FmZWx5IHBhc3MgInJlY3Zmcm9tKCkiIGEgYnl0ZSBjb3VudAogCQkgKiBiYXNlZCBvbiB0aGUgc25hcHNob3QgbGVuZ3RoLgogCQkgKi8KLQkJaGFuZGxlLT5idWZzaXplID0gaGFuZGxlLT5zbmFwc2hvdDsKKwkJaGFuZGxlLT5idWZzaXplID0gKHVfaW50KWhhbmRsZS0+c25hcHNob3Q7CiAJfQogCiAJLyoKQEAgLTYyNDUsNyArNjUyMSw3IEBACiAJbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7CiAJc3RybGNweShzYWRkci5zYV9kYXRhLCBkZXZpY2UsIHNpemVvZihzYWRkci5zYV9kYXRhKSk7CiAJaWYgKGJpbmQoZmQsICZzYWRkciwgc2l6ZW9mKHNhZGRyKSkgPT0gLTEpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJiaW5kOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTYyNTMsMTMgKzY1MjksMTMgQEAKIAkvKiBBbnkgcGVuZGluZyBlcnJvcnMsIGUuZy4sIG5ldHdvcmsgaXMgZG93bj8gKi8KIAogCWlmIChnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgJmVyciwgJmVycmxlbikgPT0gLTEpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJImdldHNvY2tvcHQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKGVyciA+IDApIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJImJpbmQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnIpKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTYyODUsNyArNjU2MSw3IEBACiAJc3RybGNweShpZnIuaWZyX25hbWUsIGRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwogCiAJaWYgKGlvY3RsKGZkLCBTSU9DR0lGTVRVLCAmaWZyKSA9PSAtMSkgewotCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgIlNJT0NHSUZNVFU6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNjMwNSw3ICs2NTgxLDcgQEAKIAlzdHJsY3B5KGlmci5pZnJfbmFtZSwgZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CiAKIAlpZiAoaW9jdGwoZmQsIFNJT0NHSUZIV0FERFIsICZpZnIpID09IC0xKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAiU0lPQ0dJRkhXQUREUjogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWlmIChlcnJubyA9PSBFTk9ERVYpIHsKIAkJCS8qCkBAIC02MzM4LDcgKzY2MTQsNyBAQAogCWxlbiA9IGhhbmRsZS0+ZmNvZGUuYmZfbGVuOwogCWYgPSAoc3RydWN0IGJwZl9pbnNuICopbWFsbG9jKHByb2dfc2l6ZSk7CiAJaWYgKGYgPT0gTlVMTCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTY1MTUsMTMgKzY3OTEsMTMgQEAKIAkJICovCiAJCXNhdmVfbW9kZSA9IGZjbnRsKGhhbmRsZS0+ZmQsIEZfR0VURkwsIDApOwogCQlpZiAoc2F2ZV9tb2RlID09IC0xKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgImNhbid0IGdldCBGRCBmbGFncyB3aGVuIGNoYW5naW5nIGZpbHRlcjogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAtMjsKIAkJfQogCQlpZiAoZmNudGwoaGFuZGxlLT5mZCwgRl9TRVRGTCwgc2F2ZV9tb2RlIHwgT19OT05CTE9DSykgPCAwKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgImNhbid0IHNldCBub25ibG9ja2luZyBtb2RlIHdoZW4gY2hhbmdpbmcgZmlsdGVyOiAlcyIsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuIC0yOwpAQCAtNjUzOCwxMyArNjgxNCwxMyBAQAogCQkJICovCiAJCQkodm9pZClmY250bChoYW5kbGUtPmZkLCBGX1NFVEZMLCBzYXZlX21vZGUpOwogCQkJKHZvaWQpcmVzZXRfa2VybmVsX2ZpbHRlcihoYW5kbGUpOwotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJyZWN2IGZhaWxlZCB3aGVuIGNoYW5naW5nIGZpbHRlcjogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3Ioc2F2ZV9lcnJubykpOwogCQkJcmV0dXJuIC0yOwogCQl9CiAJCWlmIChmY250bChoYW5kbGUtPmZkLCBGX1NFVEZMLCBzYXZlX21vZGUpID09IC0xKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgImNhbid0IHJlc3RvcmUgRkQgZmxhZ3Mgd2hlbiBjaGFuZ2luZyBmaWx0ZXI6ICVzIiwKIAkJCSAgICBwY2FwX3N0cmVycm9yKHNhdmVfZXJybm8pKTsKIAkJCXJldHVybiAtMjsKQEAgLTY1NzUsNyArNjg1MSw3IEBACiAJCSAqIFJlcG9ydCBpdCBhcyBhIGZhdGFsIGVycm9yLgogCQkgKi8KIAkJaWYgKHJlc2V0X2tlcm5lbF9maWx0ZXIoaGFuZGxlKSA9PSAtMSkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJjYW4ndCByZW1vdmUga2VybmVsIHRvdGFsIGZpbHRlcjogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAtMjsJLyogZmF0YWwgZXJyb3IgKi8KZGlmZiAtLWdpdCBhL3BjYXAtbmV0ZmlsdGVyLWxpbnV4LmMgYi9wY2FwLW5ldGZpbHRlci1saW51eC5jCmluZGV4IDNlZTZmYWEuLmJkZTY0OGYgMTAwNjQ0Ci0tLSBhL3BjYXAtbmV0ZmlsdGVyLWxpbnV4LmMKKysrIGIvcGNhcC1uZXRmaWx0ZXItbGludXguYwpAQCAtNzksMTAgKzc5LDEyIEBACiAgKi8KIHN0cnVjdCBwY2FwX25ldGZpbHRlciB7CiAJdV9pbnQJcGFja2V0c19yZWFkOwkvKiBjb3VudCBvZiBwYWNrZXRzIHJlYWQgd2l0aCByZWN2ZnJvbSgpICovCisJdV9pbnQgICBwYWNrZXRzX25vYnVmczsgLyogRU5PQlVGUyBjb3VudGVyICovCiB9OwogCiBzdGF0aWMgaW50IG5mcXVldWVfc2VuZF92ZXJkaWN0KGNvbnN0IHBjYXBfdCAqaGFuZGxlLCB1X2ludDE2X3QgZ3JvdXBfaWQsIHVfaW50MzJfdCBpZCwgdV9pbnQzMl90IHZlcmRpY3QpOwogCisKIHN0YXRpYyBpbnQKIG5ldGZpbHRlcl9yZWFkX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQogewpAQCAtOTgsMjEgKzEwMCwyMiBAQAogCQkJaGFuZGxlLT5icmVha19sb29wID0gMDsKIAkJCXJldHVybiAtMjsKIAkJfQotCX0gd2hpbGUgKChsZW4gPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikpOworCQlpZihlcnJubyA9PSBFTk9CVUZTKSBoYW5kbGVwLT5wYWNrZXRzX25vYnVmcysrOworCX0gd2hpbGUgKChsZW4gPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFTk9CVUZTKSk7CiAKIAlpZiAobGVuIDwgMCkgewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IHJlY2VpdmUgcGFja2V0ICVkOiVzIiwgZXJybm8sIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IHJlY2VpdmUgcGFja2V0ICVkOiVzIiwgZXJybm8sIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWJ1ZiA9IGhhbmRsZS0+YnVmZmVyOwotCXdoaWxlIChsZW4gPj0gTkxNU0dfU1BBQ0UoMCkpIHsKKwlidWYgPSAodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+YnVmZmVyOworCXdoaWxlICgodV9pbnQpbGVuID49IE5MTVNHX1NQQUNFKDApKSB7CiAJCWNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqKSBidWY7CiAJCXVfaW50MzJfdCBtc2dfbGVuOwogCQluZnR5cGVfdCB0eXBlID0gT1RIRVI7CiAKLQkJaWYgKG5saC0+bmxtc2dfbGVuIDwgc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikgfHwgbGVuIDwgbmxoLT5ubG1zZ19sZW4pIHsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTWVzc2FnZSB0cnVuY2F0ZWQ6IChnb3Q6ICVkKSAobmxtc2dfbGVuOiAldSkiLCBsZW4sIG5saC0+bmxtc2dfbGVuKTsKKwkJaWYgKG5saC0+bmxtc2dfbGVuIDwgc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikgfHwgKHVfaW50KWxlbiA8IG5saC0+bmxtc2dfbGVuKSB7CisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTWVzc2FnZSB0cnVuY2F0ZWQ6IChnb3Q6ICVkKSAobmxtc2dfbGVuOiAldSkiLCBsZW4sIG5saC0+bmxtc2dfbGVuKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCkBAIC0xMzQsNyArMTM3LDcgQEAKIAkJCQljb25zdCBzdHJ1Y3QgbmZhdHRyICpwYXlsb2FkX2F0dHIgPSBOVUxMOwogCiAJCQkJaWYgKG5saC0+bmxtc2dfbGVuIDwgSERSX0xFTkdUSCkgewotCQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk1hbGZvcm1lZCBtZXNzYWdlOiAobmxtc2dfbGVuOiAldSkiLCBubGgtPm5sbXNnX2xlbik7CisJCQkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJNYWxmb3JtZWQgbWVzc2FnZTogKG5sbXNnX2xlbjogJXUpIiwgbmxoLT5ubG1zZ19sZW4pOwogCQkJCQlyZXR1cm4gLTE7CiAJCQkJfQogCkBAIC0yMDIsOCArMjA1LDggQEAKIAkJfQogCiAJCW1zZ19sZW4gPSBOTE1TR19BTElHTihubGgtPm5sbXNnX2xlbik7Ci0JCWlmIChtc2dfbGVuID4gbGVuKQotCQkJbXNnX2xlbiA9IGxlbjsKKwkJaWYgKG1zZ19sZW4gPiAodV9pbnQpbGVuKQorCQkJbXNnX2xlbiA9ICh1X2ludClsZW47CiAKIAkJbGVuIC09IG1zZ19sZW47CiAJCWJ1ZiArPSBtc2dfbGVuOwpAQCAtMjI0LDcgKzIyNyw3IEBACiAJc3RydWN0IHBjYXBfbmV0ZmlsdGVyICpoYW5kbGVwID0gaGFuZGxlLT5wcml2OwogCiAJc3RhdHMtPnBzX3JlY3YgPSBoYW5kbGVwLT5wYWNrZXRzX3JlYWQ7Ci0Jc3RhdHMtPnBzX2Ryb3AgPSAwOworCXN0YXRzLT5wc19kcm9wID0gaGFuZGxlcC0+cGFja2V0c19ub2J1ZnM7CiAJc3RhdHMtPnBzX2lmZHJvcCA9IDA7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMzIsNyArMjM1LDcgQEAKIHN0YXRpYyBpbnQKIG5ldGZpbHRlcl9pbmplY3RfbGludXgocGNhcF90ICpoYW5kbGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0Jc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJpbmplY3Qgbm90IHN1cHBvcnRlZCBvbiBuZXRmaWx0ZXIgZGV2aWNlcyIpOworCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJpbmplY3Qgbm90IHN1cHBvcnRlZCBvbiBuZXRmaWx0ZXIgZGV2aWNlcyIpOwogCXJldHVybiAoLTEpOwogfQogCkBAIC0zMDcsNyArMzEwLDcgQEAKIAkJaWYgKHNubC5ubF9waWQgIT0gMCB8fCBzZXFfaWQgIT0gbmxoLT5ubG1zZ19zZXEpCS8qIGlmIG5vdCBmcm9tIGtlcm5lbCBvciB3cm9uZyBzZXF1ZW5jZSBza2lwICovCiAJCQljb250aW51ZTsKIAotCQl3aGlsZSAobGVuID49IE5MTVNHX1NQQUNFKDApICYmIE5MTVNHX09LKG5saCwgbGVuKSkgeworCQl3aGlsZSAoKHVfaW50KWxlbiA+PSBOTE1TR19TUEFDRSgwKSAmJiBOTE1TR19PSyhubGgsIGxlbikpIHsKIAkJCWlmIChubGgtPm5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IgfHwgKG5saC0+bmxtc2dfdHlwZSA9PSBOTE1TR19ET05FICYmIG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9NVUxUSSkpIHsKIAkJCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSkpIHsKIAkJCQkJZXJybm8gPSBFQkFETVNHOwpAQCAtNDE3LDcgKzQyMCw3IEBACiBzdGF0aWMgaW50CiBuZXRmaWx0ZXJfYWN0aXZhdGUocGNhcF90KiBoYW5kbGUpCiB7Ci0JY29uc3QgY2hhciAqZGV2ID0gaGFuZGxlLT5vcHQuc291cmNlOworCWNvbnN0IGNoYXIgKmRldiA9IGhhbmRsZS0+b3B0LmRldmljZTsKIAl1bnNpZ25lZCBzaG9ydCBncm91cHNbMzJdOwogCWludCBncm91cF9jb3VudCA9IDA7CiAJbmZ0eXBlX3QgdHlwZSA9IE9USEVSOwpAQCAtNDM5LDE2ICs0NDIsMTYgQEAKIAkJCWNoYXIgKmVuZF9kZXY7CiAKIAkJCWlmIChncm91cF9jb3VudCA9PSAzMikgewotCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJCQkiTWF4aW11bSAzMiBuZXRmaWx0ZXIgZ3JvdXBzISBkZXY6ICVzIiwKLQkJCQkJCWhhbmRsZS0+b3B0LnNvdXJjZSk7CisJCQkJCQloYW5kbGUtPm9wdC5kZXZpY2UpOwogCQkJCXJldHVybiBQQ0FQX0VSUk9SOwogCQkJfQogCiAJCQlncm91cF9pZCA9IHN0cnRvbChkZXYsICZlbmRfZGV2LCAwKTsKIAkJCWlmIChlbmRfZGV2ICE9IGRldikgewogCQkJCWlmIChncm91cF9pZCA8IDAgfHwgZ3JvdXBfaWQgPiA2NTUzNSkgewotCQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkJCQkiTmV0ZmlsdGVyIGdyb3VwIHJhbmdlIGZyb20gMCB0byA2NTUzNSAoZ290ICVsZCkiLAogCQkJCQkJCWdyb3VwX2lkKTsKIAkJCQkJcmV0dXJuIFBDQVBfRVJST1I7CkBAIC00NjQsOSArNDY3LDkgQEAKIAl9CiAKIAlpZiAodHlwZSA9PSBPVEhFUiB8fCAqZGV2KSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSJDYW4ndCBnZXQgbmV0ZmlsdGVyIGdyb3VwKHMpIGluZGV4IGZyb20gJXMiLAotCQkJCWhhbmRsZS0+b3B0LnNvdXJjZSk7CisJCQkJaGFuZGxlLT5vcHQuZGV2aWNlKTsKIAkJcmV0dXJuIFBDQVBfRVJST1I7CiAJfQogCkBAIC00OTEsNyArNDk0LDcgQEAKIAkvKiBDcmVhdGUgbmV0bGluayBzb2NrZXQgKi8KIAloYW5kbGUtPmZkID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX05FVEZJTFRFUik7CiAJaWYgKGhhbmRsZS0+ZmQgPCAwKSB7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgY3JlYXRlIHJhdyBzb2NrZXQgJWQ6JXMiLCBlcnJubywgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgY3JlYXRlIHJhdyBzb2NrZXQgJWQ6JXMiLCBlcnJubywgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gUENBUF9FUlJPUjsKIAl9CiAKQEAgLTUwOSw1NCArNTEyLDU0IEBACiAKIAloYW5kbGUtPmJ1ZmZlciA9IG1hbGxvYyhoYW5kbGUtPmJ1ZnNpemUpOwogCWlmICghaGFuZGxlLT5idWZmZXIpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBhbGxvY2F0ZSBkdW1wIGJ1ZmZlcjogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBhbGxvY2F0ZSBkdW1wIGJ1ZmZlcjogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gY2xvc2VfZmFpbDsKIAl9CiAKIAlpZiAodHlwZSA9PSBORkxPRykgewogCQlpZiAobmZsb2dfc2VuZF9jb25maWdfY21kKGhhbmRsZSwgMCwgTkZVTE5MX0NGR19DTURfUEZfVU5CSU5ELCBBRl9JTkVUKSA8IDApIHsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTkZVTE5MX0NGR19DTURfUEZfVU5CSU5EOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJORlVMTkxfQ0ZHX0NNRF9QRl9VTkJJTkQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJZ290byBjbG9zZV9mYWlsOwogCQl9CiAKIAkJaWYgKG5mbG9nX3NlbmRfY29uZmlnX2NtZChoYW5kbGUsIDAsIE5GVUxOTF9DRkdfQ01EX1BGX0JJTkQsIEFGX0lORVQpIDwgMCkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJORlVMTkxfQ0ZHX0NNRF9QRl9CSU5EOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJORlVMTkxfQ0ZHX0NNRF9QRl9CSU5EOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWdvdG8gY2xvc2VfZmFpbDsKIAkJfQogCiAJCS8qIEJpbmQgc29ja2V0IHRvIHRoZSBuZmxvZyBncm91cHMgKi8KIAkJZm9yIChpID0gMDsgaSA8IGdyb3VwX2NvdW50OyBpKyspIHsKIAkJCWlmIChuZmxvZ19zZW5kX2NvbmZpZ19jbWQoaGFuZGxlLCBncm91cHNbaV0sIE5GVUxOTF9DRkdfQ01EX0JJTkQsIEFGX1VOU1BFQykgPCAwKSB7Ci0JCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBsaXN0ZW4gb24gZ3JvdXAgZ3JvdXAgaW5kZXg6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBsaXN0ZW4gb24gZ3JvdXAgZ3JvdXAgaW5kZXg6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJCWdvdG8gY2xvc2VfZmFpbDsKIAkJCX0KIAogCQkJaWYgKG5mbG9nX3NlbmRfY29uZmlnX21vZGUoaGFuZGxlLCBncm91cHNbaV0sIE5GVUxOTF9DT1BZX1BBQ0tFVCwgaGFuZGxlLT5zbmFwc2hvdCkgPCAwKSB7Ci0JCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJORlVMTkxfQ09QWV9QQUNLRVQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJORlVMTkxfQ09QWV9QQUNLRVQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJCWdvdG8gY2xvc2VfZmFpbDsKIAkJCX0KIAkJfQogCiAJfSBlbHNlIHsKIAkJaWYgKG5mcXVldWVfc2VuZF9jb25maWdfY21kKGhhbmRsZSwgMCwgTkZRTkxfQ0ZHX0NNRF9QRl9VTkJJTkQsIEFGX0lORVQpIDwgMCkgewotCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJORlFOTF9DRkdfQ01EX1BGX1VOQklORDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTkZRTkxfQ0ZHX0NNRF9QRl9VTkJJTkQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJZ290byBjbG9zZV9mYWlsOwogCQl9CiAKIAkJaWYgKG5mcXVldWVfc2VuZF9jb25maWdfY21kKGhhbmRsZSwgMCwgTkZRTkxfQ0ZHX0NNRF9QRl9CSU5ELCBBRl9JTkVUKSA8IDApIHsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTkZRTkxfQ0ZHX0NNRF9QRl9CSU5EOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJORlFOTF9DRkdfQ01EX1BGX0JJTkQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJZ290byBjbG9zZV9mYWlsOwogCQl9CiAKIAkJLyogQmluZCBzb2NrZXQgdG8gdGhlIG5mcXVldWUgZ3JvdXBzICovCiAJCWZvciAoaSA9IDA7IGkgPCBncm91cF9jb3VudDsgaSsrKSB7CiAJCQlpZiAobmZxdWV1ZV9zZW5kX2NvbmZpZ19jbWQoaGFuZGxlLCBncm91cHNbaV0sIE5GUU5MX0NGR19DTURfQklORCwgQUZfVU5TUEVDKSA8IDApIHsKLQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGxpc3RlbiBvbiBncm91cCBncm91cCBpbmRleDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGxpc3RlbiBvbiBncm91cCBncm91cCBpbmRleDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkJZ290byBjbG9zZV9mYWlsOwogCQkJfQogCiAJCQlpZiAobmZxdWV1ZV9zZW5kX2NvbmZpZ19tb2RlKGhhbmRsZSwgZ3JvdXBzW2ldLCBORlFOTF9DT1BZX1BBQ0tFVCwgaGFuZGxlLT5zbmFwc2hvdCkgPCAwKSB7Ci0JCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJORlFOTF9DT1BZX1BBQ0tFVDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5GUU5MX0NPUFlfUEFDS0VUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQlnb3RvIGNsb3NlX2ZhaWw7CiAJCQl9CiAJCX0KQEAgLTU3NSw3ICs1NzgsNyBAQAogCQkgKiBTZXQgdGhlIHNvY2tldCBidWZmZXIgc2l6ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgogCQkgKi8KIAkJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAmaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUsIHNpemVvZihoYW5kbGUtPm9wdC5idWZmZXJfc2l6ZSkpID09IC0xKSB7Ci0JCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNPX1JDVkJVRjogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU09fUkNWQlVGOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWdvdG8gY2xvc2VfZmFpbDsKIAkJfQogCX0KQEAgLTYyMyw3ICs2MjYsNyBAQAogCS8qIE9LLCBpdCdzIHByb2JhYmx5IG91cnMuICovCiAJKmlzX291cnMgPSAxOwogCi0JcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfbmV0ZmlsdGVyKSk7CisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX25ldGZpbHRlcikpOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiAoTlVMTCk7CiAKQEAgLTY0MSw3ICs2NDQsNyBAQAogCQkvKiBpZiBuZXRsaW5rIGlzIG5vdCBzdXBwb3J0ZWQgdGhpcyBpcyBub3QgZmF0YWwgKi8KIAkJaWYgKGVycm5vID09IEVBRk5PU1VQUE9SVCB8fCBlcnJubyA9PSBFUFJPVE9OT1NVUFBPUlQpCiAJCQlyZXR1cm4gMDsKLQkJc25wcmludGYoZXJyX3N0ciwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IG9wZW4gbmV0bGluayBzb2NrZXQgJWQ6JXMiLAorCQlwY2FwX3NucHJpbnRmKGVycl9zdHIsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBvcGVuIG5ldGxpbmsgc29ja2V0ICVkOiVzIiwKIAkJCWVycm5vLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtMTsKIAl9CmRpZmYgLS1naXQgYS9wY2FwLW5ldy5jIGIvcGNhcC1uZXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTRlNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1uZXcuYwpAQCAtMCwwICsxLDEyNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgLSAyMDA1IE5ldEdyb3VwLCBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gKEl0YWx5KQorICogQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAwOCBDQUNFIFRlY2hub2xvZ2llcywgRGF2aXMgKENhbGlmb3JuaWEpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFBvbGl0ZWNuaWNvIGRpIFRvcmlubywgQ0FDRSBUZWNobm9sb2dpZXMKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJwY2FwLWludC5oIgkvLyBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIHBjYXBfdCBzdHJ1Y3R1cmUKKyNpbmNsdWRlICJwY2FwLXJwY2FwLmgiCisjaW5jbHVkZSAic29ja3V0aWxzLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4JCS8vIGZvciB0aGUgZXJybm8gdmFyaWFibGUKKyNpbmNsdWRlIDxzdGRsaWIuaD4JCS8vIGZvciBtYWxsb2MoKSwgZnJlZSgpLCAuLi4KKyNpbmNsdWRlIDxzdHJpbmcuaD4JCS8vIGZvciBzdHJzdHIsIGV0YworCisjaWZuZGVmIFdJTjMyCisjaW5jbHVkZSA8ZGlyZW50Lmg+CQkvLyBmb3IgcmVhZGRpcgorI2VuZGlmCisKKy8qIEtlZXBzIGEgbGlzdCBvZiBhbGwgdGhlIG9wZW5lZCBjb25uZWN0aW9ucyBpbiB0aGUgYWN0aXZlIG1vZGUuICovCitleHRlcm4gc3RydWN0IGFjdGl2ZWhvc3RzICphY3RpdmVIb3N0czsKKworLyoKKyAqIFxicmllZiBLZWVwcyB0aGUgbWFpbiBzb2NrZXQgaWRlbnRpZmllciB3aGVuIHdlIHdhbnQgdG8gYWNjZXB0IGEgbmV3IHJlbW90ZSBjb25uZWN0aW9uIChhY3RpdmUgbW9kZSBvbmx5KS4KKyAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBwY2FwX3JlbW90ZWFjdF9hY2NlcHQoKSBhbmQgcGNhcF9yZW1vdGVhY3RfY2xlYW51cCgpIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK1NPQ0tFVCBzb2NrbWFpbjsKKworLyogU3RyaW5nIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBpbiB0aGUgcGNhcF9maW5kYWxsZGV2c19leCgpICovCisjZGVmaW5lIFBDQVBfVEVYVF9TT1VSQ0VfRklMRSAiRmlsZSIKKy8qIFN0cmluZyBpZGVudGlmaWVyIHRvIGJlIHVzZWQgaW4gdGhlIHBjYXBfZmluZGFsbGRldnNfZXgoKSAqLworI2RlZmluZSBQQ0FQX1RFWFRfU09VUkNFX0FEQVBURVIgIk5ldHdvcmsgYWRhcHRlciIKKworLyogU3RyaW5nIGlkZW50aWZpZXIgdG8gYmUgdXNlZCBpbiB0aGUgcGNhcF9maW5kYWxsZGV2c19leCgpICovCisjZGVmaW5lIFBDQVBfVEVYVF9TT1VSQ0VfT05fTE9DQUxfSE9TVCAib24gbG9jYWwgaG9zdCIKKy8qIFN0cmluZyBpZGVudGlmaWVyIHRvIGJlIHVzZWQgaW4gdGhlIHBjYXBfZmluZGFsbGRldnNfZXgoKSAqLworI2RlZmluZSBQQ0FQX1RFWFRfU09VUkNFX09OX1JFTU9URV9IT1NUICJvbiByZW1vdGUgbm9kZSIKKworLyoKKyogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gV2luUGNhcCBkZXZpY2VzLgorKi8KK3N0cnVjdCBwY2FwX3dpbiB7CisJaW50IG5vbmJsb2NrOworCWludCByZm1vbl9zZWxmc3RhcnQ7CQkvKiBhIGZsYWcgdGVsbHMgd2hldGhlciB0aGUgbW9uaXRvciBtb2RlIGlzIHNldCBieSBpdHNlbGYgKi8KKwlpbnQgZmlsdGVyaW5nX2luX2tlcm5lbDsJLyogdXNpbmcga2VybmVsIGZpbHRlciAqLworCisjaWZkZWYgSEFWRV9EQUdfQVBJCisJaW50CWRhZ19mY3NfYml0czsJCS8qIE51bWJlciBvZiBjaGVja3N1bSBiaXRzIGZyb20gbGluayBsYXllciAqLworI2VuZGlmCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZ1bmN0aW9uIGJvZGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBwY2FwX2ZpbmRhbGxkZXZzX2V4KGNoYXIgKnNvdXJjZSwgc3RydWN0IHBjYXBfcm10YXV0aCAqYXV0aCwgcGNhcF9pZl90ICoqYWxsZGV2cywgY2hhciAqZXJyYnVmKQoreworCVNPQ0tFVCBzb2NrY3RybDsJCS8qIHNvY2tldCBkZXNjcmlwdG9yIG9mIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gKi8KKwl1aW50MzIgdG90cmVhZCA9IDA7CQkvKiBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIHBheWxvYWQgcmVhZCBmcm9tIHRoZSBzb2NrZXQgKi8KKwlpbnQgbnJlYWQ7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzOwkJLyogdGVtcCB2YXJpYWJsZSBuZWVkZWQgdG8gcmVzb2x2ZSBob3N0bmFtZXMgaW50byB0byBzb2NrZXQgcmVwcmVzZW50YXRpb24gKi8KKwlzdHJ1Y3QgYWRkcmluZm8gKmFkZHJpbmZvOwkvKiB0ZW1wIHZhcmlhYmxlIG5lZWRlZCB0byByZXNvbHZlIGhvc3RuYW1lcyBpbnRvIHRvIHNvY2tldCByZXByZXNlbnRhdGlvbiAqLworCXN0cnVjdCBycGNhcF9oZWFkZXIgaGVhZGVyOwkvKiBzdHJ1Y3R1cmUgdGhhdCBrZWVwcyB0aGUgZ2VuZXJhbCBoZWFkZXIgb2YgdGhlIHJwY2FwIHByb3RvY29sICovCisJaW50IGksIGo7CQkvKiB0ZW1wIHZhcmlhYmxlcyAqLworCWludCBuYWRkcjsJCS8qIHRlbXAgdmFyIG5lZWRlZCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIElQdjYgYWRkcmVzc2VzICovCisJc3RydWN0IHBjYXBfYWRkciAqYWRkcjsJLyogYW5vdGhlciBzdWNoIHRlbXAgKi8KKwlpbnQgcmV0dmFsOwkJLyogc3RvcmUgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb25zICovCisJaW50IG5pZjsJCS8qIE51bWJlciBvZiBpbnRlcmZhY2VzIGxpc3RlZCAqLworCWludCBhY3RpdmUgPSAwOwkvKiAndHJ1ZScgaWYgd2UgdGhlIG90aGVyIGVuZC1wYXJ0eSBpcyBpbiBhY3RpdmUgbW9kZSAqLworCWNoYXIgaG9zdFtQQ0FQX0JVRl9TSVpFXSwgcG9ydFtQQ0FQX0JVRl9TSVpFXSwgbmFtZVtQQ0FQX0JVRl9TSVpFXSwgcGF0aFtQQ0FQX0JVRl9TSVpFXSwgZmlsZW5hbWVbUENBUF9CVUZfU0laRV07CisJaW50IHR5cGU7CisJcGNhcF90ICpmcDsKKwljaGFyIHRtcHN0cmluZ1tQQ0FQX0JVRl9TSVpFICsgMV07CQkvKiBOZWVkZWQgdG8gY29udmVydCBuYW1lcyBhbmQgZGVzY3JpcHRpb25zIGZyb20gJ29sZCcgc3ludGF4IHRvIHRoZSAnbmV3JyBvbmUgKi8KKwlwY2FwX2lmX3QgKmRldjsJCS8qIFByZXZpb3VzIGRldmljZSBpbnRvIHRoZSBwY2FwX2lmX3QgY2hhaW4gKi8KKworCisJaWYgKHN0cmxlbihzb3VyY2UpID4gUENBUF9CVUZfU0laRSkKKwl7CisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiVGhlIHNvdXJjZSBzdHJpbmcgaXMgdG9vIGxvbmcuIENhbm5vdCBoYW5kbGUgaXQgY29ycmVjdGx5LiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIHNvdXJjZSAoZmlsZSwgbG9jYWwsIHJlbW90ZSkKKwkgKiBUaGVyZSBhcmUgc29tZSBkaWZmZXJlbmNlcyBpZiBwY2FwX2ZpbmRhbGxkZXZzX2V4KCkgaXMgY2FsbGVkIHRvIGxpc3QgZmlsZXMgYW5kIHJlbW90ZSBhZGFwdGVycy4KKwkgKiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB3ZSBoYXZlIHRvIGxvb2sgaW50byBtdXN0IGJlIHByZXNlbnQgKHRoZXJlZm9yZQorCSAqIHRoZSAnbmFtZScgcGFyYW1ldGVyIG9mIHRoZSBwY2FwX3BhcnNlc3Jjc3RyKCkgaXMgcHJlc2VudCkuCisJICogSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgbmFtZSBvZiB0aGUgYWRhcHRlciBpcyBub3QgcmVxdWlyZWQgKHdlIG5lZWQganVzdCB0aGUgaG9zdCkuIFNvLCB3ZSBoYXZlCisJICogdG8gdXNlIGEgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGUgc291cmNlIHR5cGUsIGFuZCBhIHNlY29uZCB0aW1lIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUKKwkgKiBpbmZvLCB3aGljaCBkZXBlbmRzIG9uIHRoZSBzb3VyY2UgdHlwZS4KKwkgKi8KKwlpZiAocGNhcF9wYXJzZXNyY3N0cihzb3VyY2UsICZ0eXBlLCBOVUxMLCBOVUxMLCBOVUxMLCBlcnJidWYpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodHlwZSA9PSBQQ0FQX1NSQ19JRkxPQ0FMKQorCXsKKwkJaWYgKHBjYXBfcGFyc2VzcmNzdHIoc291cmNlLCAmdHlwZSwgaG9zdCwgTlVMTCwgTlVMTCwgZXJyYnVmKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKworCQkvKiBJbml0aWFsaXplIHRlbXBvcmFyeSBzdHJpbmcgKi8KKwkJdG1wc3RyaW5nW1BDQVBfQlVGX1NJWkVdID0gMDsKKworCQkvKiBUaGUgdXNlciB3YW50cyB0byByZXRyaWV2ZSBhZGFwdGVycyBmcm9tIGEgbG9jYWwgaG9zdCAqLworCQlpZiAocGNhcF9maW5kYWxsZGV2cyhhbGxkZXZzLCBlcnJidWYpID09IC0xKQorCQkJcmV0dXJuIC0xOworCisJCWlmICgoYWxsZGV2cyA9PSBOVUxMKSB8fCAoKmFsbGRldnMgPT0gTlVMTCkpCisJCXsKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSJObyBpbnRlcmZhY2VzIGZvdW5kISBNYWtlIHN1cmUgbGlicGNhcC9XaW5QY2FwIGlzIHByb3Blcmx5IGluc3RhbGxlZCIKKwkJCQkiIG9uIHRoZSBsb2NhbCBtYWNoaW5lLiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogU2NhbiBhbGwgdGhlIGludGVyZmFjZXMgYW5kIG1vZGlmeSBuYW1lIGFuZCBkZXNjcmlwdGlvbiAqLworCQkvKiBUaGlzIGlzIGEgdHJpY2sgaW4gb3JkZXIgdG8gYXZvaWQgdGhlIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBwY2FwX2ZpbmRhbGxkZXZzIGhlcmUgKi8KKwkJZGV2ID0gKmFsbGRldnM7CisJCXdoaWxlIChkZXYpCisJCXsKKwkJCS8qIENyZWF0ZSB0aGUgbmV3IGRldmljZSBpZGVudGlmaWVyICovCisJCQlpZiAocGNhcF9jcmVhdGVzcmNzdHIodG1wc3RyaW5nLCBQQ0FQX1NSQ19JRkxPQ0FMLCBOVUxMLCBOVUxMLCBkZXYtPm5hbWUsIGVycmJ1ZikgPT0gLTEpCisJCQkJcmV0dXJuIC0xOworCisJCQkvKiBEZWxldGUgdGhlIG9sZCBwb2ludGVyICovCisJCQlmcmVlKGRldi0+bmFtZSk7CisKKwkJCS8qIE1ha2UgYSBjb3B5IG9mIHRoZSBuZXcgZGV2aWNlIGlkZW50aWZpZXIgKi8KKwkJCWRldi0+bmFtZSA9IHN0cmR1cCh0bXBzdHJpbmcpOworCQkJaWYgKGRldi0+bmFtZSA9PSBOVUxMKQorCQkJeworCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jKCkgZmFpbGVkOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCS8qIENyZWF0ZSB0aGUgbmV3IGRldmljZSBkZXNjcmlwdGlvbiAqLworCQkJaWYgKChkZXYtPmRlc2NyaXB0aW9uID09IE5VTEwpIHx8IChkZXYtPmRlc2NyaXB0aW9uWzBdID09IDApKQorCQkJCXBjYXBfc25wcmludGYodG1wc3RyaW5nLCBzaXplb2YodG1wc3RyaW5nKSAtIDEsICIlcyAnJXMnICVzIiwgUENBUF9URVhUX1NPVVJDRV9BREFQVEVSLAorCQkJCWRldi0+bmFtZSwgUENBUF9URVhUX1NPVVJDRV9PTl9MT0NBTF9IT1NUKTsKKwkJCWVsc2UKKwkJCQlwY2FwX3NucHJpbnRmKHRtcHN0cmluZywgc2l6ZW9mKHRtcHN0cmluZykgLSAxLCAiJXMgJyVzJyAlcyIsIFBDQVBfVEVYVF9TT1VSQ0VfQURBUFRFUiwKKwkJCQlkZXYtPmRlc2NyaXB0aW9uLCBQQ0FQX1RFWFRfU09VUkNFX09OX0xPQ0FMX0hPU1QpOworCisJCQkvKiBEZWxldGUgdGhlIG9sZCBwb2ludGVyICovCisJCQlmcmVlKGRldi0+ZGVzY3JpcHRpb24pOworCisJCQkvKiBNYWtlIGEgY29weSBvZiB0aGUgZGVzY3JpcHRpb24gKi8KKwkJCWRldi0+ZGVzY3JpcHRpb24gPSBzdHJkdXAodG1wc3RyaW5nKTsKKwkJCWlmIChkZXYtPmRlc2NyaXB0aW9uID09IE5VTEwpCisJCQl7CisJCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2MoKSBmYWlsZWQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJZGV2ID0gZGV2LT5uZXh0OworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJKCphbGxkZXZzKSA9IE5VTEw7CisKKwlpZiAodHlwZSA9PSBQQ0FQX1NSQ19GSUxFKQorCXsKKwkJc2l6ZV90IHN0cmluZ2xlbjsKKyNpZmRlZiBXSU4zMgorCQlXSU4zMl9GSU5EX0RBVEEgZmlsZWRhdGE7CisJCUhBTkRMRSBmaWxlaGFuZGxlOworI2Vsc2UKKwkJc3RydWN0IGRpcmVudCAqZmlsZWRhdGE7CisJCURJUiAqdW5peGRpcjsKKyNlbmRpZgorCisJCWlmIChwY2FwX3BhcnNlc3Jjc3RyKHNvdXJjZSwgJnR5cGUsIGhvc3QsIHBvcnQsIG5hbWUsIGVycmJ1ZikgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisKKwkJLyogQ2hlY2sgdGhhdCB0aGUgZmlsZW5hbWUgaXMgY29ycmVjdCAqLworCQlzdHJpbmdsZW4gPSBzdHJsZW4obmFtZSk7CisKKwkJLyogVGhlIGRpcmVjdG9yeSBtdXN0IGVuZCB3aXRoICdcJyBpbiBXaW4zMiBhbmQgJy8nIGluIFVOSVggKi8KKyNpZmRlZiBXSU4zMgorI2RlZmluZSBFTkRJTkdfQ0hBUiAnXFwnCisjZWxzZQorI2RlZmluZSBFTkRJTkdfQ0hBUiAnLycKKyNlbmRpZgorCisJCWlmIChuYW1lW3N0cmluZ2xlbiAtIDFdICE9IEVORElOR19DSEFSKQorCQl7CisJCQluYW1lW3N0cmluZ2xlbl0gPSBFTkRJTkdfQ0hBUjsKKwkJCW5hbWVbc3RyaW5nbGVuICsgMV0gPSAwOworCisJCQlzdHJpbmdsZW4rKzsKKwkJfQorCisJCS8qIFNhdmUgdGhlIHBhdGggZm9yIGZ1dHVyZSByZWZlcmVuY2UgKi8KKwkJcGNhcF9zbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcyIsIG5hbWUpOworCisjaWZkZWYgV0lOMzIKKwkJLyogVG8gcGVyZm9ybSBkaXJlY3RvcnkgbGlzdGluZywgV2luMzIgbXVzdCBoYXZlIGFuICdhc3RlcmlzaycgYXMgZW5kaW5nIGNoYXIgKi8KKwkJaWYgKG5hbWVbc3RyaW5nbGVuIC0gMV0gIT0gJyonKQorCQl7CisJCQluYW1lW3N0cmluZ2xlbl0gPSAnKic7CisJCQluYW1lW3N0cmluZ2xlbiArIDFdID0gMDsKKwkJfQorCisJCWZpbGVoYW5kbGUgPSBGaW5kRmlyc3RGaWxlKG5hbWUsICZmaWxlZGF0YSk7CisKKwkJaWYgKGZpbGVoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJCXsKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRXJyb3Igd2hlbiBsaXN0aW5nIGZpbGVzOiBkb2VzIGZvbGRlciAnJXMnIGV4aXN0PyIsIHBhdGgpOworCQkJcmV0dXJuIC0xOworCQl9CisKKyNlbHNlCisJCS8qIG9wZW5pbmcgdGhlIGZvbGRlciAqLworCQl1bml4ZGlyPSBvcGVuZGlyKHBhdGgpOworCisJCS8qIGdldCB0aGUgZmlyc3QgZmlsZSBpbnRvIGl0ICovCisJCWZpbGVkYXRhPSByZWFkZGlyKHVuaXhkaXIpOworCisJCWlmIChmaWxlZGF0YSA9PSBOVUxMKQorCQl7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVycm9yIHdoZW4gbGlzdGluZyBmaWxlczogZG9lcyBmb2xkZXIgJyVzJyBleGlzdD8iLCBwYXRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorI2VuZGlmCisKKwkJZG8KKwkJeworCisjaWZkZWYgV0lOMzIKKwkJCXBjYXBfc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcyVzIiwgcGF0aCwgZmlsZWRhdGEuY0ZpbGVOYW1lKTsKKyNlbHNlCisJCQlwY2FwX3NucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMlcyIsIHBhdGgsIGZpbGVkYXRhLT5kX25hbWUpOworI2VuZGlmCisKKwkJCWZwID0gcGNhcF9vcGVuX29mZmxpbmUoZmlsZW5hbWUsIGVycmJ1Zik7CisKKwkJCWlmIChmcCkKKwkJCXsKKwkJCQkvKiBhbGxvY2F0ZSB0aGUgbWFpbiBzdHJ1Y3R1cmUgKi8KKwkJCQlpZiAoKmFsbGRldnMgPT0gTlVMTCkJLyogVGhpcyBpcyBpbiBjYXNlIGl0IGlzIHRoZSBmaXJzdCBmaWxlICovCisJCQkJeworCQkJCQkoKmFsbGRldnMpID0gKHBjYXBfaWZfdCAqKW1hbGxvYyhzaXplb2YocGNhcF9pZl90KSk7CisJCQkJCWRldiA9ICgqYWxsZGV2cyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWRldi0+bmV4dCA9IChwY2FwX2lmX3QgKiltYWxsb2Moc2l6ZW9mKHBjYXBfaWZfdCkpOworCQkJCQlkZXYgPSBkZXYtPm5leHQ7CisJCQkJfQorCisJCQkJLyogY2hlY2sgdGhhdCB0aGUgbWFsbG9jKCkgZGlkbid0IGZhaWwgKi8KKwkJCQlpZiAoZGV2ID09IE5VTEwpCisJCQkJeworCQkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYygpIGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisKKwkJCQkvKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgdG8gJ3plcm8nICovCisJCQkJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHBjYXBfaWZfdCkpOworCisJCQkJLyogQ3JlYXRlIHRoZSBuZXcgc291cmNlIGlkZW50aWZpZXIgKi8KKwkJCQlpZiAocGNhcF9jcmVhdGVzcmNzdHIodG1wc3RyaW5nLCBQQ0FQX1NSQ19GSUxFLCBOVUxMLCBOVUxMLCBmaWxlbmFtZSwgZXJyYnVmKSA9PSAtMSkKKwkJCQkJcmV0dXJuIC0xOworCisJCQkJc3RyaW5nbGVuID0gc3RybGVuKHRtcHN0cmluZyk7CisKKwkJCQlkZXYtPm5hbWUgPSAoY2hhciAqKW1hbGxvYyhzdHJpbmdsZW4gKyAxKTsKKwkJCQlpZiAoZGV2LT5uYW1lID09IE5VTEwpCisJCQkJeworCQkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYygpIGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisKKwkJCQlzdHJsY3B5KGRldi0+bmFtZSwgdG1wc3RyaW5nLCBzdHJpbmdsZW4pOworCisJCQkJZGV2LT5uYW1lW3N0cmluZ2xlbl0gPSAwOworCisJCQkJLyogQ3JlYXRlIHRoZSBkZXNjcmlwdGlvbiAqLworCQkJCXBjYXBfc25wcmludGYodG1wc3RyaW5nLCBzaXplb2YodG1wc3RyaW5nKSAtIDEsICIlcyAnJXMnICVzIiwgUENBUF9URVhUX1NPVVJDRV9GSUxFLAorCQkJCQlmaWxlbmFtZSwgUENBUF9URVhUX1NPVVJDRV9PTl9MT0NBTF9IT1NUKTsKKworCQkJCXN0cmluZ2xlbiA9IHN0cmxlbih0bXBzdHJpbmcpOworCisJCQkJZGV2LT5kZXNjcmlwdGlvbiA9IChjaGFyICopbWFsbG9jKHN0cmluZ2xlbiArIDEpOworCisJCQkJaWYgKGRldi0+ZGVzY3JpcHRpb24gPT0gTlVMTCkKKwkJCQl7CisJCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jKCkgZmFpbGVkOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKworCQkJCS8qIENvcHkgdGhlIG5ldyBkZXZpY2UgZGVzY3JpcHRpb24gaW50byB0aGUgY29ycmVjdCBtZW1vcnkgbG9jYXRpb24gKi8KKwkJCQlzdHJsY3B5KGRldi0+ZGVzY3JpcHRpb24sIHRtcHN0cmluZywgc3RyaW5nbGVuICsgMSk7CisKKwkJCQlwY2FwX2Nsb3NlKGZwKTsKKwkJCX0KKwkJfQorI2lmZGVmIFdJTjMyCisJCXdoaWxlIChGaW5kTmV4dEZpbGUoZmlsZWhhbmRsZSwgJmZpbGVkYXRhKSAhPSAwKTsKKyNlbHNlCisJCXdoaWxlICggKGZpbGVkYXRhPSByZWFkZGlyKHVuaXhkaXIpKSAhPSBOVUxMKTsKKyNlbmRpZgorCisKKyNpZmRlZiBXSU4zMgorCQkvKiBDbG9zZSB0aGUgc2VhcmNoIGhhbmRsZS4gKi8KKwkJRmluZENsb3NlKGZpbGVoYW5kbGUpOworI2VuZGlmCisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgd2UgY29tZSBoZXJlLCBpdCBpcyBhIHJlbW90ZSBob3N0ICovCisKKwkvKiBSZXRyaWV2ZSB0aGUgbmVlZGVkIGRhdGEgZm9yIGdldHRpbmcgYWRhcHRlciBsaXN0ICovCisJaWYgKHBjYXBfcGFyc2VzcmNzdHIoc291cmNlLCAmdHlwZSwgaG9zdCwgcG9ydCwgTlVMTCwgZXJyYnVmKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJLyogV2FybmluZzogdGhpcyBjYWxsIGNhbiBiZSB0aGUgZmlyc3Qgb25lIGNhbGxlZCBieSB0aGUgdXNlci4gKi8KKwkvKiBGb3IgdGhpcyByZWFzb24sIHdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgV2luU29jayBzdXBwb3J0LiAqLworCWlmIChzb2NrX2luaXQoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJLyogQ2hlY2sgZm9yIGFjdGl2ZSBtb2RlICovCisJc29ja2N0cmwgPSBycGNhcF9yZW1vdGVhY3RfZ2V0c29jayhob3N0LCAmYWN0aXZlLCBlcnJidWYpOworCWlmIChzb2NrY3RybCA9PSBJTlZBTElEX1NPQ0tFVCkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFhY3RpdmUpIHsKKwkJLyoKKwkJICogV2UncmUgbm90IGluIGFjdGl2ZSBtb2RlOyBsZXQncyB0cnkgdG8gb3BlbiBhIG5ldworCQkgKiBjb250cm9sIGNvbm5lY3Rpb24uCisJCSAqLworCQlhZGRyaW5mbyA9IE5VTEw7CisKKwkJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOworCQloaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisJCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisKKwkJaWYgKHBvcnRbMF0gPT0gMCkKKwkJeworCQkJLyogdGhlIHVzZXIgY2hvc2Ugbm90IHRvIHNwZWNpZnkgdGhlIHBvcnQgKi8KKwkJCWlmIChzb2NrX2luaXRhZGRyZXNzKGhvc3QsIFJQQ0FQX0RFRkFVTFRfTkVUUE9SVCwgJmhpbnRzLCAmYWRkcmluZm8sIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgPT0gLTEpCisJCQkJcmV0dXJuIC0xOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHNvY2tfaW5pdGFkZHJlc3MoaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWRkcmluZm8sIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgPT0gLTEpCisJCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKChzb2NrY3RybCA9IHNvY2tfb3BlbihhZGRyaW5mbywgU09DS09QRU5fQ0xJRU5ULCAwLCBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKSA9PSAtMSkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogYWRkcmluZm8gaXMgbm8gbG9uZ2VyIHVzZWQgKi8KKwkJZnJlZWFkZHJpbmZvKGFkZHJpbmZvKTsKKwkJYWRkcmluZm8gPSBOVUxMOworCisJCWlmIChycGNhcF9zZW5kYXV0aChzb2NrY3RybCwgYXV0aCwgZXJyYnVmKSA9PSAtMSkKKwkJeworCQkJc29ja19jbG9zZShzb2NrY3RybCwgTlVMTCwgMCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiBSUENBUCBmaW5kYWxsZGV2cyBjb21tYW5kICovCisJcnBjYXBfY3JlYXRlaGRyKCZoZWFkZXIsIFJQQ0FQX01TR19GSU5EQUxMSUZfUkVRLCAwLCAwKTsKKworCWlmIChzb2NrX3NlbmQoc29ja2N0cmwsIChjaGFyICopJmhlYWRlciwgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpLCBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpID09IC0xKQorCQlnb3RvIGVycm9yOworCisJaWYgKHNvY2tfcmVjdihzb2NrY3RybCwgKGNoYXIgKikmaGVhZGVyLCBzaXplb2Yoc3RydWN0IHJwY2FwX2hlYWRlciksIFNPQ0tfUkVDRUlWRUFMTF9ZRVMsIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgPT0gLTEpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaXMgY29ycmVjdCAqLworCXJldHZhbCA9IHJwY2FwX2NoZWNrbXNnKGVycmJ1Ziwgc29ja2N0cmwsICZoZWFkZXIsIFJQQ0FQX01TR19GSU5EQUxMSUZfUkVQTFksIFJQQ0FQX01TR19FUlJPUiwgMCk7CisKKwlpZiAocmV0dmFsICE9IFJQQ0FQX01TR19GSU5EQUxMSUZfUkVQTFkpCQkvKiB0aGUgbWVzc2FnZSBpcyBub3QgdGhlIG9uZSBleHBlY3RlZCAqLworCXsKKwkJc3dpdGNoIChyZXR2YWwpCisJCXsKKwkJY2FzZSAtMzoJLyogVW5yZWNvdmVyYWJsZSBuZXR3b3JrIGVycm9yICovCisJCWNhc2UgLTI6CS8qIFRoZSBvdGhlciBlbmRwb2ludCBzZW5kIGEgbWVzc2FnZSB0aGF0IGlzIG5vdCBhbGxvd2VkIGhlcmUgKi8KKwkJY2FzZSAtMToJLyogVGhlIG90aGVyIGVuZHBvaW50IGhhcyBhIHZlcnNpb24gbnVtYmVyIHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdXIgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgUlBDQVBfTVNHX0VSUk9SOgkJLyogVGhlIG90aGVyIGVuZHBvaW50IHJlcG9ydGVkIGFuIGVycm9yICovCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQl7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkludGVybmFsIGVycm9yIik7CisJCQlicmVhazsKKwkJfTsKKwkJfQorCisJCWlmICghYWN0aXZlKQorCQkJc29ja19jbG9zZShzb2NrY3RybCwgTlVMTCwgMCk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHJlYWQgdGhlIG51bWJlciBvZiBpbnRlcmZhY2VzICovCisJbmlmID0gbnRvaHMoaGVhZGVyLnZhbHVlKTsKKworCS8qIGxvb3AgdW50aWwgYWxsIGludGVyZmFjZXMgaGF2ZSBiZWVuIHJlY2VpdmVkICovCisJZm9yIChpID0gMDsgaSA8IG5pZjsgaSsrKQorCXsKKwkJc3RydWN0IHJwY2FwX2ZpbmRhbGxkZXZzX2lmIGZpbmRhbGxkZXZzX2lmOworCQljaGFyIHRtcHN0cmluZzJbUENBUF9CVUZfU0laRSArIDFdOwkJLyogTmVlZGVkIHRvIGNvbnZlcnQgbmFtZXMgYW5kIGRlc2NyaXB0aW9ucyBmcm9tICdvbGQnIHN5bnRheCB0byB0aGUgJ25ldycgb25lICovCisJCXNpemVfdCBzdHJpbmdsZW47CisKKwkJdG1wc3RyaW5nMltQQ0FQX0JVRl9TSVpFXSA9IDA7CisKKwkJLyogcmVjZWl2ZSB0aGUgZmluZGFsbGRldnMgc3RydWN0dXJlIGZyb20gcmVtb3RlIGhvc3QgKi8KKwkJbnJlYWQgPSBzb2NrX3JlY3Yoc29ja2N0cmwsIChjaGFyICopJmZpbmRhbGxkZXZzX2lmLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBycGNhcF9maW5kYWxsZGV2c19pZiksIFNPQ0tfUkVDRUlWRUFMTF9ZRVMsCisJCSAgICBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpOworCQlpZiAobnJlYWQgPT0gLTEpCisJCQlnb3RvIGVycm9yOworCQl0b3RyZWFkICs9IG5yZWFkOworCisJCWZpbmRhbGxkZXZzX2lmLm5hbWVsZW4gPSBudG9ocyhmaW5kYWxsZGV2c19pZi5uYW1lbGVuKTsKKwkJZmluZGFsbGRldnNfaWYuZGVzY2xlbiA9IG50b2hzKGZpbmRhbGxkZXZzX2lmLmRlc2NsZW4pOworCQlmaW5kYWxsZGV2c19pZi5uYWRkciA9IG50b2hzKGZpbmRhbGxkZXZzX2lmLm5hZGRyKTsKKworCQkvKiBhbGxvY2F0ZSB0aGUgbWFpbiBzdHJ1Y3R1cmUgKi8KKwkJaWYgKGkgPT0gMCkKKwkJeworCQkJKCphbGxkZXZzKSA9IChwY2FwX2lmX3QgKiltYWxsb2Moc2l6ZW9mKHBjYXBfaWZfdCkpOworCQkJZGV2ID0gKCphbGxkZXZzKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRldi0+bmV4dCA9IChwY2FwX2lmX3QgKiltYWxsb2Moc2l6ZW9mKHBjYXBfaWZfdCkpOworCQkJZGV2ID0gZGV2LT5uZXh0OworCQl9CisKKwkJLyogY2hlY2sgdGhhdCB0aGUgbWFsbG9jKCkgZGlkbid0IGZhaWwgKi8KKwkJaWYgKGRldiA9PSBOVUxMKQorCQl7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYygpIGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlIHRvICd6ZXJvJyAqLworCQltZW1zZXQoZGV2LCAwLCBzaXplb2YocGNhcF9pZl90KSk7CisKKwkJLyogYWxsb2NhdGUgbWVtIGZvciBuYW1lIGFuZCBkZXNjcmlwdGlvbiAqLworCQlpZiAoZmluZGFsbGRldnNfaWYubmFtZWxlbikKKwkJeworCisJCQlpZiAoZmluZGFsbGRldnNfaWYubmFtZWxlbiA+PSBzaXplb2YodG1wc3RyaW5nKSkKKwkJCXsKKwkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkludGVyZmFjZSBuYW1lIHRvbyBsb25nIik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJLyogUmV0cmlldmUgYWRhcHRlciBuYW1lICovCisJCQlucmVhZCA9IHNvY2tfcmVjdihzb2NrY3RybCwgdG1wc3RyaW5nLAorCQkJICAgIGZpbmRhbGxkZXZzX2lmLm5hbWVsZW4sIFNPQ0tfUkVDRUlWRUFMTF9ZRVMsCisJCQkgICAgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJCWlmIChucmVhZCA9PSAtMSkKKwkJCQlnb3RvIGVycm9yOworCQkJdG90cmVhZCArPSBucmVhZDsKKworCQkJdG1wc3RyaW5nW2ZpbmRhbGxkZXZzX2lmLm5hbWVsZW5dID0gMDsKKworCQkJLyogQ3JlYXRlIHRoZSBuZXcgZGV2aWNlIGlkZW50aWZpZXIgKi8KKwkJCWlmIChwY2FwX2NyZWF0ZXNyY3N0cih0bXBzdHJpbmcyLCBQQ0FQX1NSQ19JRlJFTU9URSwgaG9zdCwgcG9ydCwgdG1wc3RyaW5nLCBlcnJidWYpID09IC0xKQorCQkJCXJldHVybiAtMTsKKworCQkJc3RyaW5nbGVuID0gc3RybGVuKHRtcHN0cmluZzIpOworCisJCQlkZXYtPm5hbWUgPSAoY2hhciAqKW1hbGxvYyhzdHJpbmdsZW4gKyAxKTsKKwkJCWlmIChkZXYtPm5hbWUgPT0gTlVMTCkKKwkJCXsKKwkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYygpIGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJLyogQ29weSB0aGUgbmV3IGRldmljZSBuYW1lIGludG8gdGhlIGNvcnJlY3QgbWVtb3J5IGxvY2F0aW9uICovCisJCQlzdHJsY3B5KGRldi0+bmFtZSwgdG1wc3RyaW5nMiwgc3RyaW5nbGVuICsgMSk7CisJCX0KKworCQlpZiAoZmluZGFsbGRldnNfaWYuZGVzY2xlbikKKwkJeworCQkJaWYgKGZpbmRhbGxkZXZzX2lmLmRlc2NsZW4gPj0gc2l6ZW9mKHRtcHN0cmluZykpCisJCQl7CisJCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJJbnRlcmZhY2UgZGVzY3JpcHRpb24gdG9vIGxvbmciKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCisJCQkvKiBSZXRyaWV2ZSBhZGFwdGVyIGRlc2NyaXB0aW9uICovCisJCQlucmVhZCA9IHNvY2tfcmVjdihzb2NrY3RybCwgdG1wc3RyaW5nLAorCQkJICAgIGZpbmRhbGxkZXZzX2lmLmRlc2NsZW4sIFNPQ0tfUkVDRUlWRUFMTF9ZRVMsCisJCQkgICAgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJCWlmIChucmVhZCA9PSAtMSkKKwkJCQlnb3RvIGVycm9yOworCQkJdG90cmVhZCArPSBucmVhZDsKKworCQkJdG1wc3RyaW5nW2ZpbmRhbGxkZXZzX2lmLmRlc2NsZW5dID0gMDsKKworCQkJcGNhcF9zbnByaW50Zih0bXBzdHJpbmcyLCBzaXplb2YodG1wc3RyaW5nMikgLSAxLCAiJXMgJyVzJyAlcyAlcyIsIFBDQVBfVEVYVF9TT1VSQ0VfQURBUFRFUiwKKwkJCQl0bXBzdHJpbmcsIFBDQVBfVEVYVF9TT1VSQ0VfT05fUkVNT1RFX0hPU1QsIGhvc3QpOworCisJCQlzdHJpbmdsZW4gPSBzdHJsZW4odG1wc3RyaW5nMik7CisKKwkJCWRldi0+ZGVzY3JpcHRpb24gPSAoY2hhciAqKW1hbGxvYyhzdHJpbmdsZW4gKyAxKTsKKworCQkJaWYgKGRldi0+ZGVzY3JpcHRpb24gPT0gTlVMTCkKKwkJCXsKKwkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYygpIGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJLyogQ29weSB0aGUgbmV3IGRldmljZSBkZXNjcmlwdGlvbiBpbnRvIHRoZSBjb3JyZWN0IG1lbW9yeSBsb2NhdGlvbiAqLworCQkJc3RybGNweShkZXYtPmRlc2NyaXB0aW9uLCB0bXBzdHJpbmcyLCBzdHJpbmdsZW4gKyAxKTsKKwkJfQorCisJCWRldi0+ZmxhZ3MgPSBudG9obChmaW5kYWxsZGV2c19pZi5mbGFncyk7CisKKwkJbmFkZHIgPSAwOworCQlhZGRyID0gTlVMTDsKKwkJLyogbG9vcCB1bnRpbCBhbGwgYWRkcmVzc2VzIGhhdmUgYmVlbiByZWNlaXZlZCAqLworCQlmb3IgKGogPSAwOyBqIDwgZmluZGFsbGRldnNfaWYubmFkZHI7IGorKykKKwkJeworCQkJc3RydWN0IHJwY2FwX2ZpbmRhbGxkZXZzX2lmYWRkciBpZmFkZHI7CisKKwkJCS8qIFJldHJpZXZlIHRoZSBpbnRlcmZhY2UgYWRkcmVzc2VzICovCisJCQlucmVhZCA9IHNvY2tfcmVjdihzb2NrY3RybCwgKGNoYXIgKikmaWZhZGRyLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcnBjYXBfZmluZGFsbGRldnNfaWZhZGRyKSwKKwkJCSAgICBTT0NLX1JFQ0VJVkVBTExfWUVTLCBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpOworCQkJaWYgKG5yZWFkID09IC0xKQorCQkJCWdvdG8gZXJyb3I7CisJCQl0b3RyZWFkICs9IG5yZWFkOworCisJCQkvKgorCQkJICogV0FSTklORyBsaWJwY2FwIGJ1ZzogdGhlIGFkZHJlc3MgbGlzdGluZyBpcworCQkJICogYXZhaWxhYmxlIG9ubHkgZm9yIEFGX0lORVQuCisJCQkgKgorCQkJICogWFhYIC0gSVB2Nj8KKwkJCSAqLworCQkJaWYgKG50b2hzKGlmYWRkci5hZGRyLnNzX2ZhbWlseSkgPT0gQUZfSU5FVCkKKwkJCXsKKwkJCQlpZiAoYWRkciA9PSBOVUxMKQorCQkJCXsKKwkJCQkJZGV2LT5hZGRyZXNzZXMgPSAoc3RydWN0IHBjYXBfYWRkciAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2FwX2FkZHIpKTsKKwkJCQkJYWRkciA9IGRldi0+YWRkcmVzc2VzOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlhZGRyLT5uZXh0ID0gKHN0cnVjdCBwY2FwX2FkZHIgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNhcF9hZGRyKSk7CisJCQkJCWFkZHIgPSBhZGRyLT5uZXh0OworCQkJCX0KKwkJCQluYWRkcisrOworCisJCQkJaWYgKGFkZHIgPT0gTlVMTCkKKwkJCQl7CisJCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jKCkgZmFpbGVkOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQkJYWRkci0+bmV4dCA9IE5VTEw7CisKKwkJCQlpZiAocnBjYXBfZGVzZXJhZGRyKChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqKSAmaWZhZGRyLmFkZHIsCisJCQkJCShzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqKikgJmFkZHItPmFkZHIsIGVycmJ1ZikgPT0gLTEpCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJaWYgKHJwY2FwX2Rlc2VyYWRkcigoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKikgJmlmYWRkci5uZXRtYXNrLAorCQkJCQkoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKiopICZhZGRyLT5uZXRtYXNrLCBlcnJidWYpID09IC0xKQorCQkJCQlnb3RvIGVycm9yOworCQkJCWlmIChycGNhcF9kZXNlcmFkZHIoKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICopICZpZmFkZHIuYnJvYWRhZGRyLAorCQkJCQkoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKiopICZhZGRyLT5icm9hZGFkZHIsIGVycmJ1ZikgPT0gLTEpCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJaWYgKHJwY2FwX2Rlc2VyYWRkcigoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKikgJmlmYWRkci5kc3RhZGRyLAorCQkJCQkoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKiopICZhZGRyLT5kc3RhZGRyLCBlcnJidWYpID09IC0xKQorCQkJCQlnb3RvIGVycm9yOworCisJCQkJaWYgKChhZGRyLT5hZGRyID09IE5VTEwpICYmIChhZGRyLT5uZXRtYXNrID09IE5VTEwpICYmCisJCQkJCShhZGRyLT5icm9hZGFkZHIgPT0gTlVMTCkgJiYgKGFkZHItPmRzdGFkZHIgPT0gTlVMTCkpCisJCQkJeworCQkJCQlmcmVlKGFkZHIpOworCQkJCQlhZGRyID0gTlVMTDsKKwkJCQkJaWYgKG5hZGRyID09IDEpCisJCQkJCQluYWRkciA9IDA7CS8qIHRoZSBmaXJzdCBpdGVtIG9mIHRoZSBsaXN0IGhhZCBOVUxMIGFkZHJlc3NlcyAqLworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIENoZWNrcyBpZiBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gcmVhZDsgaWYgbm90LCBkaXNjYXJkIHRoZSBkYXRhIGluIGV4Y2VzcyAqLworCWlmICh0b3RyZWFkICE9IG50b2hsKGhlYWRlci5wbGVuKSkKKwl7CisJCWlmIChzb2NrX2Rpc2NhcmQoc29ja2N0cmwsIG50b2hsKGhlYWRlci5wbGVuKSAtIHRvdHJlYWQsIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgPT0gMSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDb250cm9sIGNvbm5lY3Rpb24gaGFzIHRvIGJlIGNsb3NlZCBvbmx5IGluIGNhc2UgdGhlIHJlbW90ZSBtYWNoaW5lIGlzIGluIHBhc3NpdmUgbW9kZSAqLworCWlmICghYWN0aXZlKQorCXsKKwkJLyogRE8gbm90IHNlbmQgUlBDQVBfQ0xPU0UsIHNpbmNlIHdlIGRpZCBub3Qgb3BlbiBhIHBjYXBfdDsgbm8gbmVlZCB0byBmcmVlIHJlc291cmNlcyAqLworCQlpZiAoc29ja19jbG9zZShzb2NrY3RybCwgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwkvKiBUbyBhdm9pZCBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIG51bWJlciBvZiBzb2NrX2luaXQoKSAqLworCXNvY2tfY2xlYW51cCgpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCS8qCisJICogSW4gY2FzZSB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciwgSSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSBpdCB3aXRoIGEgbmV3IG9uZQorCSAqIGlmIHRoZSBmb2xsb3dpbmcgY2FsbCBmYWlscy4gSSB3YW50IHRvIHJldHVybiBhbHdheXMgdGhlIG9yaWdpbmFsIGVycm9yLgorCSAqCisJICogVGFrZSBjYXJlOiB0aGlzIGNvbm5lY3Rpb24gY2FuIGFscmVhZHkgYmUgY2xvc2VkIHdoZW4gd2UgdHJ5IHRvIGNsb3NlIGl0LgorCSAqIFRoaXMgaGFwcGVucyBiZWNhdXNlIGEgcHJldmlvdXMgZXJyb3IgaW4gdGhlIHJwY2FwZCwgd2hpY2ggcmVxdWVzdGVkIHRvCisJICogY2xvc2VkIHRoZSBjb25uZWN0aW9uLiBJbiB0aGF0IGNhc2UsIHdlIGFscmVhZHkgcmVjb2duaXplZCB0aGF0IGludG8gdGhlCisJICogcnBzcGNrX2lzaGVhZGVyb2soKSBhbmQgd2UgYWxyZWFkeSBhY2tub3dsZWRnZWQgdGhlIGNsb3NpbmcuCisJICogSW4gdGhhdCBzZW5zZSwgdGhpcyBjYWxsIGlzIHVzZWxlc3MgaGVyZSAoaG93ZXZlciBpdCBpcyBuZWVkZWQgaW4gY2FzZQorCSAqIHRoZSBjbGllbnQgZ2VuZXJhdGVzIHRoZSBlcnJvcikuCisJICoKKwkgKiBDaGVja3MgaWYgYWxsIHRoZSBkYXRhIGhhcyBiZWVuIHJlYWQ7IGlmIG5vdCwgZGlzY2FyZCB0aGUgZGF0YSBpbiBleGNlc3MKKwkgKi8KKwlpZiAodG90cmVhZCAhPSBudG9obChoZWFkZXIucGxlbikpCisJeworCQlpZiAoc29ja19kaXNjYXJkKHNvY2tjdHJsLCBudG9obChoZWFkZXIucGxlbikgLSB0b3RyZWFkLCBOVUxMLCAwKSA9PSAxKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIENvbnRyb2wgY29ubmVjdGlvbiBoYXMgdG8gYmUgY2xvc2VkIG9ubHkgaW4gY2FzZSB0aGUgcmVtb3RlIG1hY2hpbmUgaXMgaW4gcGFzc2l2ZSBtb2RlICovCisJaWYgKCFhY3RpdmUpCisJCXNvY2tfY2xvc2Uoc29ja2N0cmwsIE5VTEwsIDApOworCisJLyogVG8gYXZvaWQgaW5jb25zaXN0ZW5jaWVzIGluIHRoZSBudW1iZXIgb2Ygc29ja19pbml0KCkgKi8KKwlzb2NrX2NsZWFudXAoKTsKKworCXJldHVybiAtMTsKK30KKworaW50IHBjYXBfY3JlYXRlc3Jjc3RyKGNoYXIgKnNvdXJjZSwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKnBvcnQsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmVycmJ1ZikKK3sKKwlzd2l0Y2ggKHR5cGUpCisJeworCWNhc2UgUENBUF9TUkNfRklMRToKKwl7CisJCXN0cmxjcHkoc291cmNlLCBQQ0FQX1NSQ19GSUxFX1NUUklORywgUENBUF9CVUZfU0laRSk7CisJCWlmICgobmFtZSkgJiYgKCpuYW1lKSkKKwkJeworCQkJc3RybGNhdChzb3VyY2UsIG5hbWUsIFBDQVBfQlVGX1NJWkUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlRoZSBmaWxlIG5hbWUgY2Fubm90IGJlIE5VTEwuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwljYXNlIFBDQVBfU1JDX0lGUkVNT1RFOgorCXsKKwkJc3RybGNweShzb3VyY2UsIFBDQVBfU1JDX0lGX1NUUklORywgUENBUF9CVUZfU0laRSk7CisJCWlmICgoaG9zdCkgJiYgKCpob3N0KSkKKwkJeworCQkJaWYgKChzdHJjc3BuKGhvc3QsICJhQWJCY0NkRGVFZkZnR2hIakprS2xMbU1uTm9PcFBxUXJSc1N0VHVVdlZ3V3hYeVl6WiIpKSA9PSBzdHJsZW4oaG9zdCkpCisJCQl7CisJCQkJLyogdGhlIGhvc3QgbmFtZSBkb2VzIG5vdCBjb250YWlucyBhbHBoYWJldGljIGNoYXJzLiBTbywgaXQgaXMgYSBudW1lcmljIGFkZHJlc3MgKi8KKwkJCQkvKiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBpbmNsdWRlIGl0IGJldHdlZW4gc3F1YXJlIGJyYWNrZXRzICovCisJCQkJc3RybGNhdChzb3VyY2UsICJbIiwgUENBUF9CVUZfU0laRSk7CisJCQkJc3RybGNhdChzb3VyY2UsIGhvc3QsIFBDQVBfQlVGX1NJWkUpOworCQkJCXN0cmxjYXQoc291cmNlLCAiXSIsIFBDQVBfQlVGX1NJWkUpOworCQkJfQorCQkJZWxzZQorCQkJCXN0cmxjYXQoc291cmNlLCBob3N0LCBQQ0FQX0JVRl9TSVpFKTsKKworCQkJaWYgKChwb3J0KSAmJiAoKnBvcnQpKQorCQkJeworCQkJCXN0cmxjYXQoc291cmNlLCAiOiIsIFBDQVBfQlVGX1NJWkUpOworCQkJCXN0cmxjYXQoc291cmNlLCBwb3J0LCBQQ0FQX0JVRl9TSVpFKTsKKwkJCX0KKworCQkJc3RybGNhdChzb3VyY2UsICIvIiwgUENBUF9CVUZfU0laRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlRoZSBob3N0IG5hbWUgY2Fubm90IGJlIE5VTEwuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoKG5hbWUpICYmICgqbmFtZSkpCisJCQlzdHJsY2F0KHNvdXJjZSwgbmFtZSwgUENBUF9CVUZfU0laRSk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBQQ0FQX1NSQ19JRkxPQ0FMOgorCXsKKwkJc3RybGNweShzb3VyY2UsIFBDQVBfU1JDX0lGX1NUUklORywgUENBUF9CVUZfU0laRSk7CisKKwkJaWYgKChuYW1lKSAmJiAoKm5hbWUpKQorCQkJc3RybGNhdChzb3VyY2UsIG5hbWUsIFBDQVBfQlVGX1NJWkUpOworCisJCXJldHVybiAwOworCX0KKworCWRlZmF1bHQ6CisJeworCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlRoZSBpbnRlcmZhY2UgdHlwZSBpcyBub3QgdmFsaWQuIik7CisJCXJldHVybiAtMTsKKwl9CisJfQorfQorCitpbnQgcGNhcF9wYXJzZXNyY3N0cihjb25zdCBjaGFyICpzb3VyY2UsIGludCAqdHlwZSwgY2hhciAqaG9zdCwgY2hhciAqcG9ydCwgY2hhciAqbmFtZSwgY2hhciAqZXJyYnVmKQoreworCWNoYXIgKnB0cjsKKwlpbnQgbnRva2VuOworCWNoYXIgdG1wbmFtZVtQQ0FQX0JVRl9TSVpFXTsKKwljaGFyIHRtcGhvc3RbUENBUF9CVUZfU0laRV07CisJY2hhciB0bXBwb3J0W1BDQVBfQlVGX1NJWkVdOworCWludCB0bXB0eXBlOworCisJLyogSW5pdGlhbGl6YXRpb24gc3R1ZmYgKi8KKwl0bXBuYW1lWzBdID0gMDsKKwl0bXBob3N0WzBdID0gMDsKKwl0bXBwb3J0WzBdID0gMDsKKworCWlmIChob3N0KQorCQkqaG9zdCA9IDA7CisJaWYgKHBvcnQpCisJCSpwb3J0ID0gMDsKKwlpZiAobmFtZSkKKwkJKm5hbWUgPSAwOworCisJLyogTG9vayBmb3IgYSAncnBjYXA6Ly8nIGlkZW50aWZpZXIgKi8KKwlpZiAoKHB0ciA9IHN0cnN0cihzb3VyY2UsIFBDQVBfU1JDX0lGX1NUUklORykpICE9IE5VTEwpCisJeworCQlpZiAoc3RybGVuKFBDQVBfU1JDX0lGX1NUUklORykgPT0gc3RybGVuKHNvdXJjZSkpCisJCXsKKwkJCS8qIFRoZSBzb3VyY2UgaWRlbnRpZmllciBjb250YWlucyBvbmx5IHRoZSAncnBjYXA6Ly8nIHN0cmluZy4gKi8KKwkJCS8qIFNvLCB0aGlzIGlzIGEgbG9jYWwgY2FwdHVyZS4gKi8KKwkJCSp0eXBlID0gUENBUF9TUkNfSUZMT0NBTDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcHRyICs9IHN0cmxlbihQQ0FQX1NSQ19JRl9TVFJJTkcpOworCisJCWlmIChzdHJjaHIocHRyLCAnWycpKSAvKiBUaGlzIGlzIHByb2JhYmx5IGEgbnVtZXJpYyBhZGRyZXNzICovCisJCXsKKwkJCW50b2tlbiA9IHNzY2FuZihwdHIsICJbJVsxMjM0NTY3ODkwOi5dXTolW14vXS8lcyIsIHRtcGhvc3QsIHRtcHBvcnQsIHRtcG5hbWUpOworCisJCQlpZiAobnRva2VuID09IDEpCS8qIHByb2JhYmx5IHRoZSBwb3J0IGlzIG1pc3NpbmcgKi8KKwkJCQludG9rZW4gPSBzc2NhbmYocHRyLCAiWyVbMTIzNDU2Nzg5MDouXV0vJXMiLCB0bXBob3N0LCB0bXBuYW1lKTsKKworCQkJdG1wdHlwZSA9IFBDQVBfU1JDX0lGUkVNT1RFOworCQl9CisJCWVsc2UKKwkJeworCQkJbnRva2VuID0gc3NjYW5mKHB0ciwgIiVbXi86XTolW14vXS8lcyIsIHRtcGhvc3QsIHRtcHBvcnQsIHRtcG5hbWUpOworCisJCQlpZiAobnRva2VuID09IDEpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGNhbiBiZSBkdWUgdG8gdHdvIHJlYXNvbnM6CisJCQkJICogLSB3ZSB3YW50IGEgcmVtb3RlIGNhcHR1cmUsIGJ1dCB0aGUgbmV0d29yayBwb3J0IGlzIG1pc3NpbmcKKwkJCQkgKiAtIHdlIHdhbnQgdG8gZG8gYSBsb2NhbCBjYXB0dXJlCisJCQkJICogVG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvLCB3ZSBsb29rIGZvciB0aGUgJy8nIGNoYXIKKwkJCQkgKi8KKwkJCQlpZiAoc3RyY2hyKHB0ciwgJy8nKSkKKwkJCQl7CisJCQkJCS8qIFdlJ3JlIG9uIGEgcmVtb3RlIGNhcHR1cmUgKi8KKwkJCQkJc3NjYW5mKHB0ciwgIiVbXi9dLyVzIiwgdG1waG9zdCwgdG1wbmFtZSk7CisJCQkJCXRtcHR5cGUgPSBQQ0FQX1NSQ19JRlJFTU9URTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogV2UncmUgb24gYSBsb2NhbCBjYXB0dXJlICovCisJCQkJCWlmICgqcHRyKQorCQkJCQkJc3RybGNweSh0bXBuYW1lLCBwdHIsIFBDQVBfQlVGX1NJWkUpOworCisJCQkJCS8qIENsZWFuIHRoZSBob3N0IG5hbWUsIHNpbmNlIGl0IGlzIGEgcmVtb3RlIGNhcHR1cmUgKi8KKwkJCQkJLyogTk9URTogdGhlIGhvc3QgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCBpbiB0aGUgcHJldmlvdXMgIm50b2tlbj0gc3NjYW5mKC4uLikiIGxpbmUgKi8KKwkJCQkJdG1waG9zdFswXSA9IDA7CisKKwkJCQkJdG1wdHlwZSA9IFBDQVBfU1JDX0lGTE9DQUw7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJCXRtcHR5cGUgPSBQQ0FQX1NSQ19JRlJFTU9URTsKKwkJfQorCisJCWlmIChob3N0KQorCQkJc3RybGNweShob3N0LCB0bXBob3N0LCBQQ0FQX0JVRl9TSVpFKTsKKwkJaWYgKHBvcnQpCisJCQlzdHJsY3B5KHBvcnQsIHRtcHBvcnQsIFBDQVBfQlVGX1NJWkUpOworCQlpZiAodHlwZSkKKwkJCSp0eXBlID0gdG1wdHlwZTsKKworCQlpZiAobmFtZSkKKwkJeworCQkJLyoKKwkJCSAqIElmIHRoZSB1c2VyIHdhbnRzIHRoZSBob3N0IG5hbWUsIGJ1dCBpdCBjYW5ub3QgYmUgbG9jYXRlZCBpbnRvIHRoZSBzb3VyY2Ugc3RyaW5nLCByZXR1cm4gZXJyb3IKKwkJCSAqIEhvd2V2ZXIsIGlmIHRoZSB1c2VyIGlzIG5vdCBpbnRlcmVzdGVkIGluIHRoZSBpbnRlcmZhY2UgbmFtZSAoZS5nLiBpZiB3ZSdyZSBjYWxsZWQgYnkKKwkJCSAqIHBjYXBfZmluZGFsbGRldnNfZXgoKSwgd2hpY2ggZG9lcyBub3QgaGF2ZSBpbnRlcmZhY2UgbmFtZSwgZG8gbm90IHJldHVybiBlcnJvcgorCQkJICovCisJCQlpZiAodG1wbmFtZVswXSkKKwkJCXsKKwkJCQlzdHJsY3B5KG5hbWUsIHRtcG5hbWUsIFBDQVBfQlVGX1NJWkUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChlcnJidWYpCisJCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiVGhlIGludGVyZmFjZSBuYW1lIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBzdHJpbmcuIik7CisKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBMb29rIGZvciBhICdmaWxlOi8vJyBpZGVudGlmaWVyICovCisJaWYgKChwdHIgPSBzdHJzdHIoc291cmNlLCBQQ0FQX1NSQ19GSUxFX1NUUklORykpICE9IE5VTEwpCisJeworCQlwdHIgKz0gc3RybGVuKFBDQVBfU1JDX0ZJTEVfU1RSSU5HKTsKKwkJaWYgKCpwdHIpCisJCXsKKwkJCWlmIChuYW1lKQorCQkJCXN0cmxjcHkobmFtZSwgcHRyLCBQQ0FQX0JVRl9TSVpFKTsKKworCQkJaWYgKHR5cGUpCisJCQkJKnR5cGUgPSBQQ0FQX1NSQ19GSUxFOworCisJCQlyZXR1cm4gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChlcnJidWYpCisJCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJUaGUgZmlsZSBuYW1lIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBzdHJpbmcuIik7CisKKwkJCXJldHVybiAtMTsKKwkJfQorCisJfQorCisJLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eTsgdGhlIHVzZXIgZGlkbid0IHVzZSB0aGUgJ3JwY2FwOi8vLCBmaWxlOi8vJyAgc3BlY2lmaWVycyAqLworCWlmICgoc291cmNlKSAmJiAoKnNvdXJjZSkpCisJeworCQlpZiAobmFtZSkKKwkJCXN0cmxjcHkobmFtZSwgc291cmNlLCBQQ0FQX0JVRl9TSVpFKTsKKworCQlpZiAodHlwZSkKKwkJCSp0eXBlID0gUENBUF9TUkNfSUZMT0NBTDsKKworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorCXsKKwkJaWYgKGVycmJ1ZikKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiVGhlIGludGVyZmFjZSBuYW1lIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBzdHJpbmcuIik7CisKKwkJcmV0dXJuIC0xOworCX0KK307CisKK3BjYXBfdCAqcGNhcF9vcGVuKGNvbnN0IGNoYXIgKnNvdXJjZSwgaW50IHNuYXBsZW4sIGludCBmbGFncywgaW50IHJlYWRfdGltZW91dCwgc3RydWN0IHBjYXBfcm10YXV0aCAqYXV0aCwgY2hhciAqZXJyYnVmKQoreworCWNoYXIgaG9zdFtQQ0FQX0JVRl9TSVpFXSwgcG9ydFtQQ0FQX0JVRl9TSVpFXSwgbmFtZVtQQ0FQX0JVRl9TSVpFXTsKKwlpbnQgdHlwZTsKKwlwY2FwX3QgKmZwOworCWludCByZXN1bHQ7CisKKwlpZiAoc3RybGVuKHNvdXJjZSkgPiBQQ0FQX0JVRl9TSVpFKQorCXsKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJUaGUgc291cmNlIHN0cmluZyBpcyB0b28gbG9uZy4gQ2Fubm90IGhhbmRsZSBpdCBjb3JyZWN0bHkuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGRldGVybWluZSB0aGUgdHlwZSBvZiB0aGUgc291cmNlIChmaWxlLCBsb2NhbCwgcmVtb3RlKSAqLworCWlmIChwY2FwX3BhcnNlc3Jjc3RyKHNvdXJjZSwgJnR5cGUsIGhvc3QsIHBvcnQsIG5hbWUsIGVycmJ1ZikgPT0gLTEpCisJCXJldHVybiBOVUxMOworCisKKwlzd2l0Y2ggKHR5cGUpCisJeworCWNhc2UgUENBUF9TUkNfRklMRToKKwkJZnAgPSBwY2FwX29wZW5fb2ZmbGluZShuYW1lLCBlcnJidWYpOworCQlicmVhazsKKworCWNhc2UgUENBUF9TUkNfSUZSRU1PVEU6CisJCWZwID0gcGNhcF9jcmVhdGUoc291cmNlLCBlcnJidWYpOworCQlpZiAoZnAgPT0gTlVMTCkKKwkJeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKgorCQkgKiBBbHRob3VnaCB3ZSBhbHJlYWR5IGhhdmUgaG9zdCwgcG9ydCBhbmQgaWZhY2UsIHdlIHByZWZlciBUTyBQQVNTIG9ubHkgJ3BhcnMnIHRvIHRoZQorCQkgKiBwY2FwX29wZW5fcmVtb3RlKCkgc28gdGhhdCBpdCBoYXMgdG8gY2FsbCB0aGUgcGNhcF9wYXJzZXNyY3N0cigpIGFnYWluLgorCQkgKiBUaGlzIGlzIGxlc3Mgb3B0aW1pemVkLCBidXQgbXVjaCBjbGVhcmVyLgorCQkgKi8KKworCQlyZXN1bHQgPSBwY2FwX29wZW5zb3VyY2VfcmVtb3RlKGZwLCBhdXRoKTsKKworCQlpZiAocmVzdWx0ICE9IDApCisJCXsKKwkJCXBjYXBfY2xvc2UoZnApOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlzdHJ1Y3QgcGNhcF9tZCAqbWQ7CQkJCS8qIHN0cnVjdHVyZSB1c2VkIHdoZW4gZG9pbmcgYSByZW1vdGUgbGl2ZSBjYXB0dXJlICovCisJCW1kID0gKHN0cnVjdCBwY2FwX21kICopICgodV9jaGFyKilmcC0+cHJpdiArIHNpemVvZihzdHJ1Y3QgcGNhcF93aW4pKTsKKworCQlmcC0+c25hcHNob3QgPSBzbmFwbGVuOworCQlmcC0+b3B0LnRpbWVvdXQgPSByZWFkX3RpbWVvdXQ7CisJCW1kLT5ybXRfZmxhZ3MgPSBmbGFnczsKKwkJYnJlYWs7CisKKwljYXNlIFBDQVBfU1JDX0lGTE9DQUw6CisKKwkJZnAgPSBwY2FwX29wZW5fbGl2ZShuYW1lLCBzbmFwbGVuLCAoZmxhZ3MgJiBQQ0FQX09QRU5GTEFHX1BST01JU0NVT1VTKSwgcmVhZF90aW1lb3V0LCBlcnJidWYpOworCisjaWZkZWYgV0lOMzIKKwkJLyoKKwkJICogdGhlc2UgZmxhZ3MgYXJlIHN1cHBvcnRlZCBvbiBXaW5kb3dzIG9ubHkKKwkJICovCisJCWlmIChmcCAhPSBOVUxMICYmIGZwLT5hZGFwdGVyICE9IE5VTEwpCisJCXsKKwkJCS8qIGRpc2FibGUgbG9vcGJhY2sgY2FwdHVyZSBpZiByZXF1ZXN0ZWQgKi8KKwkJCWlmIChmbGFncyAmIFBDQVBfT1BFTkZMQUdfTk9DQVBUVVJFX0xPQ0FMKQorCQkJeworCQkJCWlmICghUGFja2V0U2V0TG9vcGJhY2tCZWhhdmlvcihmcC0+YWRhcHRlciwgTlBGX0RJU0FCTEVfTE9PUEJBQ0spKQorCQkJCXsKKwkJCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJVbmFibGUgdG8gZGlzYWJsZSB0aGUgY2FwdHVyZSBvZiBsb29wYmFjayBwYWNrZXRzLiIpOworCQkJCQlwY2FwX2Nsb3NlKGZwKTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJfQorCisJCQkvKiBzZXQgbWludG9jb3B5IHRvIHplcm8gaWYgcmVxdWVzdGVkICovCisJCQlpZiAoZmxhZ3MgJiBQQ0FQX09QRU5GTEFHX01BWF9SRVNQT05TSVZFTkVTUykKKwkJCXsKKwkJCQlpZiAoIVBhY2tldFNldE1pblRvQ29weShmcC0+YWRhcHRlciwgMCkpCisJCQkJeworCQkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlVuYWJsZSB0byBzZXQgbWF4IHJlc3BvbnNpdmVuZXNzLiIpOworCQkJCQlwY2FwX2Nsb3NlKGZwKTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYgLyogV0lOMzIgKi8KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0cmxjcHkoZXJyYnVmLCAiU291cmNlIHR5cGUgbm90IHN1cHBvcnRlZCIsIFBDQVBfRVJSQlVGX1NJWkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGZwOworfQorCitzdHJ1Y3QgcGNhcF9zYW1wICpwY2FwX3NldHNhbXBsaW5nKHBjYXBfdCAqcCkKK3sKKwlzdHJ1Y3QgcGNhcF9tZCAqbWQ7CQkJCS8qIHN0cnVjdHVyZSB1c2VkIHdoZW4gZG9pbmcgYSByZW1vdGUgbGl2ZSBjYXB0dXJlICovCisKKwltZCA9IChzdHJ1Y3QgcGNhcF9tZCAqKSAoKHVfY2hhciopcC0+cHJpdiArIHNpemVvZihzdHJ1Y3QgcGNhcF93aW4pKTsKKwlyZXR1cm4gJihtZC0+cm10X3NhbXApOworfQorCitTT0NLRVQgcGNhcF9yZW1vdGVhY3RfYWNjZXB0KGNvbnN0IGNoYXIgKmFkZHJlc3MsIGNvbnN0IGNoYXIgKnBvcnQsIGNvbnN0IGNoYXIgKmhvc3RsaXN0LCBjaGFyICpjb25uZWN0aW5naG9zdCwgc3RydWN0IHBjYXBfcm10YXV0aCAqYXV0aCwgY2hhciAqZXJyYnVmKQoreworCS8qIHNvY2tldC1yZWxhdGVkIHZhcmlhYmxlcyAqLworCXN0cnVjdCBhZGRyaW5mbyBoaW50czsJCQkvKiB0ZW1wb3Jhcnkgc3RydWN0IHRvIGtlZXAgc2V0dGluZ3MgbmVlZGVkIHRvIG9wZW4gdGhlIG5ldyBzb2NrZXQgKi8KKwlzdHJ1Y3QgYWRkcmluZm8gKmFkZHJpbmZvOwkJLyoga2VlcHMgdGhlIGFkZHJpbmZvIGNoYWluOyByZXF1aXJlZCB0byBvcGVuIGEgbmV3IHNvY2tldCAqLworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGZyb207CS8qIGdlbmVyaWMgc29ja2FkZHJfc3RvcmFnZSB2YXJpYWJsZSAqLworCXNvY2tsZW5fdCBmcm9tbGVuOwkJCQkvKiBrZWVwcyB0aGUgbGVuZ3RoIG9mIHRoZSBzb2NrYWRkcl9zdG9yYWdlIHZhcmlhYmxlICovCisJU09DS0VUIHNvY2tjdHJsOwkJCQkvKiBrZWVwcyB0aGUgbWFpbiBzb2NrZXQgaWRlbnRpZmllciAqLworCXN0cnVjdCBhY3RpdmVob3N0cyAqdGVtcCwgKnByZXY7CS8qIHRlbXAgdmFyIG5lZWRlZCB0byBzY2FuIGhlIGhvc3QgbGlzdCBjaGFpbiAqLworCisJKmNvbm5lY3Rpbmdob3N0ID0gMDsJCS8qIGp1c3QgaW4gY2FzZSAqLworCisJLyogUHJlcGFyZSB0byBvcGVuIGEgbmV3IHNlcnZlciBzb2NrZXQgKi8KKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSk7CisJLyogV0FSTklORyBDdXJyZW50bHkgaXQgc3VwcG9ydHMgb25seSBPTkUgc29ja2V0IGZhbWlseSBhbW9uZyBpcHY0IGFuZCBJUHY2ICAqLworCWhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7CQkvKiBQRl9VTlNQRUMgdG8gaGF2ZSBib3RoIElQdjQgYW5kIElQdjYgc2VydmVyICovCisJaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOwkvKiBSZWFkeSB0byBhIGJpbmQoKSBzb2NrZXQgKi8KKwloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCisJLyogV2FybmluZzogdGhpcyBjYWxsIGNhbiBiZSB0aGUgZmlyc3Qgb25lIGNhbGxlZCBieSB0aGUgdXNlci4gKi8KKwkvKiBGb3IgdGhpcyByZWFzb24sIHdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgV2luU29jayBzdXBwb3J0LiAqLworCWlmIChzb2NrX2luaXQoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJLyogRG8gdGhlIHdvcmsgKi8KKwlpZiAoKHBvcnQgPT0gTlVMTCkgfHwgKHBvcnRbMF0gPT0gMCkpCisJeworCQlpZiAoc29ja19pbml0YWRkcmVzcyhhZGRyZXNzLCBSUENBUF9ERUZBVUxUX05FVFBPUlRfQUNUSVZFLCAmaGludHMsICZhZGRyaW5mbywgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJeworCQkJU09DS19BU1NFUlQoZXJyYnVmLCAxKTsKKwkJCXJldHVybiAtMjsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAoc29ja19pbml0YWRkcmVzcyhhZGRyZXNzLCBwb3J0LCAmaGludHMsICZhZGRyaW5mbywgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJeworCQkJU09DS19BU1NFUlQoZXJyYnVmLCAxKTsKKwkJCXJldHVybiAtMjsKKwkJfQorCX0KKworCisJaWYgKChzb2NrbWFpbiA9IHNvY2tfb3BlbihhZGRyaW5mbywgU09DS09QRU5fU0VSVkVSLCAxLCBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKSA9PSAtMSkKKwl7CisJCVNPQ0tfQVNTRVJUKGVycmJ1ZiwgMSk7CisJCXJldHVybiAtMjsKKwl9CisKKwkvKiBDb25uZWN0aW9uIGNyZWF0aW9uICovCisJZnJvbWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSk7CisKKwlzb2NrY3RybCA9IGFjY2VwdChzb2NrbWFpbiwgKHN0cnVjdCBzb2NrYWRkciAqKSAmZnJvbSwgJmZyb21sZW4pOworCisJLyogV2UncmUgbm90IHVzaW5nIHNvY2tfY2xvc2UsIHNpbmNlIHdlIGRvIG5vdCB3YW50IHRvIHNlbmQgYSBzaHV0ZG93biAqLworCS8qICh3aGljaCBpcyBub3QgYWxsb3dlZCBvbiBhIG5vbi1jb25uZWN0ZWQgc29ja2V0KSAqLworCWNsb3Nlc29ja2V0KHNvY2ttYWluKTsKKwlzb2NrbWFpbiA9IDA7CisKKwlpZiAoc29ja2N0cmwgPT0gLTEpCisJeworCQlzb2NrX2dldGVycm9yKCJhY2NlcHQoKTogIiwgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJcmV0dXJuIC0yOworCX0KKworCS8qIEdldCB0aGUgbnVtZXJpYyBmb3Igb2YgdGhlIG5hbWUgb2YgdGhlIGNvbm5lY3RpbmcgaG9zdCAqLworCWlmIChnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopICZmcm9tLCBmcm9tbGVuLCBjb25uZWN0aW5naG9zdCwgUlBDQVBfSE9TVExJU1RfU0laRSwgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QpKQorCXsKKwkJc29ja19nZXRlcnJvcigiZ2V0bmFtZWluZm8oKTogIiwgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJcnBjYXBfc2VuZGVycm9yKHNvY2tjdHJsLCBlcnJidWYsIFBDQVBfRVJSX1JFTU9URUFDQ0VQVCwgTlVMTCk7CisJCXNvY2tfY2xvc2Uoc29ja2N0cmwsIE5VTEwsIDApOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY2hlY2tzIGlmIHRoZSBjb25uZWN0aW5nIGhvc3QgaXMgYW1vbmcgdGhlIG9uZXMgYWxsb3dlZCAqLworCWlmIChzb2NrX2NoZWNrX2hvc3RsaXN0KChjaGFyICopaG9zdGxpc3QsIFJQQ0FQX0hPU1RMSVNUX1NFUCwgJmZyb20sIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgPCAwKQorCXsKKwkJcnBjYXBfc2VuZGVycm9yKHNvY2tjdHJsLCBlcnJidWYsIFBDQVBfRVJSX1JFTU9URUFDQ0VQVCwgTlVMTCk7CisJCXNvY2tfY2xvc2Uoc29ja2N0cmwsIE5VTEwsIDApOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU2VuZCBhdXRoZW50aWNhdGlvbiB0byB0aGUgcmVtb3RlIG1hY2hpbmUgKi8KKwlpZiAocnBjYXBfc2VuZGF1dGgoc29ja2N0cmwsIGF1dGgsIGVycmJ1ZikgPT0gLTEpCisJeworCQlycGNhcF9zZW5kZXJyb3Ioc29ja2N0cmwsIGVycmJ1ZiwgUENBUF9FUlJfUkVNT1RFQUNDRVBULCBOVUxMKTsKKwkJc29ja19jbG9zZShzb2NrY3RybCwgTlVMTCwgMCk7CisJCXJldHVybiAtMzsKKwl9CisKKwkvKiBDaGVja3MgdGhhdCB0aGlzIGhvc3QgZG9lcyBub3QgYWxyZWFkeSBoYXZlIGEgY250cmwgY29ubmVjdGlvbiBpbiBwbGFjZSAqLworCisJLyogSW5pdGlhbGl6ZSBwb2ludGVycyAqLworCXRlbXAgPSBhY3RpdmVIb3N0czsKKwlwcmV2ID0gTlVMTDsKKworCXdoaWxlICh0ZW1wKQorCXsKKwkJLyogVGhpcyBob3N0IGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHBsYWNlLCBzbyBJIGRvbid0IGhhdmUgdG8gdXBkYXRlIHRoZSBob3N0IGxpc3QgKi8KKwkJaWYgKHNvY2tfY21wYWRkcigmdGVtcC0+aG9zdCwgJmZyb20pID09IDApCisJCQlyZXR1cm4gc29ja2N0cmw7CisKKwkJcHJldiA9IHRlbXA7CisJCXRlbXAgPSB0ZW1wLT5uZXh0OworCX0KKworCS8qIFRoZSBob3N0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBsaXN0OyBzbyBJIGhhdmUgdG8gdXBkYXRlIHRoZSBsaXN0ICovCisJaWYgKHByZXYpCisJeworCQlwcmV2LT5uZXh0ID0gKHN0cnVjdCBhY3RpdmVob3N0cyAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3RpdmVob3N0cykpOworCQl0ZW1wID0gcHJldi0+bmV4dDsKKwl9CisJZWxzZQorCXsKKwkJYWN0aXZlSG9zdHMgPSAoc3RydWN0IGFjdGl2ZWhvc3RzICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGFjdGl2ZWhvc3RzKSk7CisJCXRlbXAgPSBhY3RpdmVIb3N0czsKKwl9CisKKwlpZiAodGVtcCA9PSBOVUxMKQorCXsKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2MoKSBmYWlsZWQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlycGNhcF9zZW5kZXJyb3Ioc29ja2N0cmwsIGVycmJ1ZiwgUENBUF9FUlJfUkVNT1RFQUNDRVBULCBOVUxMKTsKKwkJc29ja19jbG9zZShzb2NrY3RybCwgTlVMTCwgMCk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1jcHkoJnRlbXAtPmhvc3QsICZmcm9tLCBmcm9tbGVuKTsKKwl0ZW1wLT5zb2NrY3RybCA9IHNvY2tjdHJsOworCXRlbXAtPm5leHQgPSBOVUxMOworCisJcmV0dXJuIHNvY2tjdHJsOworfQorCitpbnQgcGNhcF9yZW1vdGVhY3RfY2xvc2UoY29uc3QgY2hhciAqaG9zdCwgY2hhciAqZXJyYnVmKQoreworCXN0cnVjdCBhY3RpdmVob3N0cyAqdGVtcCwgKnByZXY7CS8qIHRlbXAgdmFyIG5lZWRlZCB0byBzY2FuIHRoZSBob3N0IGxpc3QgY2hhaW4gKi8KKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphZGRyaW5mbywgKmFpX25leHQ7CS8qIHRlbXAgdmFyIG5lZWRlZCB0byB0cmFuc2xhdGUgYmV0d2VlbiBob3N0bmFtZSB0byBpdHMgYWRkcmVzcyAqLworCWludCByZXR2YWw7CisKKwl0ZW1wID0gYWN0aXZlSG9zdHM7CisJcHJldiA9IE5VTEw7CisKKwkvKiByZXRyaWV2ZSB0aGUgbmV0d29yayBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gJ2hvc3QnICovCisJYWRkcmluZm8gPSBOVUxMOworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKKwloaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKworCXJldHZhbCA9IGdldGFkZHJpbmZvKGhvc3QsICIwIiwgJmhpbnRzLCAmYWRkcmluZm8pOworCWlmIChyZXR2YWwgIT0gMCkKKwl7CisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZ2V0YWRkcmluZm8oKSAlcyIsIGdhaV9zdHJlcnJvcihyZXR2YWwpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdoaWxlICh0ZW1wKQorCXsKKwkJYWlfbmV4dCA9IGFkZHJpbmZvOworCQl3aGlsZSAoYWlfbmV4dCkKKwkJeworCQkJaWYgKHNvY2tfY21wYWRkcigmdGVtcC0+aG9zdCwgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICopIGFpX25leHQtPmFpX2FkZHIpID09IDApCisJCQl7CisJCQkJc3RydWN0IHJwY2FwX2hlYWRlciBoZWFkZXI7CisKKwkJCQkvKiBDbG9zZSB0aGlzIGNvbm5lY3Rpb24gKi8KKwkJCQlycGNhcF9jcmVhdGVoZHIoJmhlYWRlciwgUlBDQVBfTVNHX0NMT1NFLCAwLCAwKTsKKworCQkJCS8qIEkgZG9uJ3QgY2hlY2sgZm9yIGVycm9ycywgc2luY2UgSSdtIGdvaW5nIHRvIGNsb3NlIGV2ZXJ5dGhpbmcgKi8KKwkJCQlzb2NrX3NlbmQodGVtcC0+c29ja2N0cmwsIChjaGFyICopJmhlYWRlciwgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpLCBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpOworCisJCQkJaWYgKHNvY2tfY2xvc2UodGVtcC0+c29ja2N0cmwsIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkpCisJCQkJeworCQkJCQkvKiBUbyBhdm9pZCBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIG51bWJlciBvZiBzb2NrX2luaXQoKSAqLworCQkJCQlzb2NrX2NsZWFudXAoKTsKKworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCisJCQkJaWYgKHByZXYpCisJCQkJCXByZXYtPm5leHQgPSB0ZW1wLT5uZXh0OworCQkJCWVsc2UKKwkJCQkJYWN0aXZlSG9zdHMgPSB0ZW1wLT5uZXh0OworCisJCQkJZnJlZWFkZHJpbmZvKGFkZHJpbmZvKTsKKworCQkJCWZyZWUodGVtcCk7CisKKwkJCQkvKiBUbyBhdm9pZCBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIG51bWJlciBvZiBzb2NrX2luaXQoKSAqLworCQkJCXNvY2tfY2xlYW51cCgpOworCisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWFpX25leHQgPSBhaV9uZXh0LT5haV9uZXh0OworCQl9CisJCXByZXYgPSB0ZW1wOworCQl0ZW1wID0gdGVtcC0+bmV4dDsKKwl9CisKKwlpZiAoYWRkcmluZm8pCisJCWZyZWVhZGRyaW5mbyhhZGRyaW5mbyk7CisKKwkvKiBUbyBhdm9pZCBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIG51bWJlciBvZiBzb2NrX2luaXQoKSAqLworCXNvY2tfY2xlYW51cCgpOworCisJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJUaGUgaG9zdCB5b3Ugd2FudCB0byBjbG9zZSB0aGUgYWN0aXZlIGNvbm5lY3Rpb24gaXMgbm90IGtub3duIik7CisJcmV0dXJuIC0xOworfQorCit2b2lkIHBjYXBfcmVtb3RlYWN0X2NsZWFudXAodm9pZCkKK3sKKwkvKiBWZXJ5IGRpcnR5LCBidXQgaXQgd29ya3MgKi8KKwlpZiAoc29ja21haW4pCisJeworCQljbG9zZXNvY2tldChzb2NrbWFpbik7CisKKwkJLyogVG8gYXZvaWQgaW5jb25zaXN0ZW5jaWVzIGluIHRoZSBudW1iZXIgb2Ygc29ja19pbml0KCkgKi8KKwkJc29ja19jbGVhbnVwKCk7CisJfQorCit9CisKK2ludCBwY2FwX3JlbW90ZWFjdF9saXN0KGNoYXIgKmhvc3RsaXN0LCBjaGFyIHNlcCwgaW50IHNpemUsIGNoYXIgKmVycmJ1ZikKK3sKKwlzdHJ1Y3QgYWN0aXZlaG9zdHMgKnRlbXA7CS8qIHRlbXAgdmFyIG5lZWRlZCB0byBzY2FuIHRoZSBob3N0IGxpc3QgY2hhaW4gKi8KKwlzaXplX3QgbGVuOworCWNoYXIgaG9zdHN0cltSUENBUF9IT1NUTElTVF9TSVpFICsgMV07CisKKwl0ZW1wID0gYWN0aXZlSG9zdHM7CisKKwlsZW4gPSAwOworCSpob3N0bGlzdCA9IDA7CisKKwl3aGlsZSAodGVtcCkKKwl7CisJCS8qaW50IHNvY2tfZ2V0YXNjaWlfYWRkcnBvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNvY2thZGRyLCBjaGFyICphZGRyZXNzLCBpbnQgYWRkcmxlbiwgY2hhciAqcG9ydCwgaW50IHBvcnRsZW4sIGludCBmbGFncywgY2hhciAqZXJyYnVmLCBpbnQgZXJyYnVmbGVuKSAqLworCisJCS8qIEdldCB0aGUgbnVtZXJpYyBmb3JtIG9mIHRoZSBuYW1lIG9mIHRoZSBjb25uZWN0aW5nIGhvc3QgKi8KKwkJaWYgKHNvY2tfZ2V0YXNjaWlfYWRkcnBvcnQoKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICopICZ0ZW1wLT5ob3N0LCBob3N0c3RyLAorCQkJUlBDQVBfSE9TVExJU1RfU0laRSwgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QsIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgIT0gLTEpCisJCQkvKglpZiAoZ2V0bmFtZWluZm8oIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnRlbXAtPmhvc3QsIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpLCBob3N0c3RyLCAqLworCQkJLyoJCVJQQ0FQX0hPU1RMSVNUX1NJWkUsIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKSApICovCisJCXsKKwkJCS8qCXNvY2tfZ2V0ZXJyb3IoImdldG5hbWVpbmZvKCk6ICIsIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSk7ICovCisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlsZW4gPSBsZW4gKyBzdHJsZW4oaG9zdHN0cikgKyAxIC8qIHRoZSBzZXBhcmF0b3IgKi87CisKKwkJaWYgKChzaXplIDwgMCkgfHwgKGxlbiA+PSAoc2l6ZV90KXNpemUpKQorCQl7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlRoZSBzdHJpbmcgeW91IHByb3ZpZGVkIGlzIG5vdCBhYmxlIHRvIGtlZXAgIgorCQkJCSJ0aGUgaG9zdG5hbWVzIGZvciBhbGwgdGhlIGFjdGl2ZSBjb25uZWN0aW9ucyIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJc3RybGNhdChob3N0bGlzdCwgaG9zdHN0ciwgUENBUF9FUlJCVUZfU0laRSk7CisJCWhvc3RsaXN0W2xlbiAtIDFdID0gc2VwOworCQlob3N0bGlzdFtsZW5dID0gMDsKKworCQl0ZW1wID0gdGVtcC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3BjYXAtbml0LmMgYi9wY2FwLW5pdC5jCmluZGV4IGE4MzU1ZjkuLjFiNjI2ZTIgMTAwNjQ0Ci0tLSBhL3BjYXAtbml0LmMKKysrIGIvcGNhcC1uaXQuYwpAQCAtMTE0LDExICsxMTQsMTEgQEAKIAkJaWYgKGNjIDwgMCkgewogCQkJaWYgKGVycm5vID09IEVXT1VMREJMT0NLKQogCQkJCXJldHVybiAoMCk7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLCAicGNhcF9yZWFkOiAlcyIsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksICJwY2FwX3JlYWQ6ICVzIiwKIAkJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gKC0xKTsKIAkJfQotCQlicCA9IHAtPmJ1ZmZlcjsKKwkJYnAgPSAodV9jaGFyICopcC0+YnVmZmVyOwogCX0gZWxzZQogCQlicCA9IHAtPmJwOwogCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWRlZmF1bHQ6Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAogCQkJICAgICJiYWQgbml0IHN0YXRlICVkIiwgbmgtPm5oX3N0YXRlKTsKIAkJCXJldHVybiAoLTEpOwogCQl9CkBAIC0yMDYsNyArMjA2LDcgQEAKIAlzdHJuY3B5KHNhLnNhX2RhdGEsIGRldmljZSwgc2l6ZW9mKHNhLnNhX2RhdGEpKTsKIAlyZXQgPSBzZW5kdG8ocC0+ZmQsIGJ1Ziwgc2l6ZSwgMCwgJnNhLCBzaXplb2Yoc2EpKTsKIAlpZiAocmV0ID09IC0xKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzZW5kOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTI0OSw3ICsyNDksNyBAQAogCQluaW9jLm5pb2NfZmxhZ3MgfD0gTkZfUFJPTUlTQzsKIAogCWlmIChpb2N0bChwLT5mZCwgU0lPQ1NOSVQsICZuaW9jKSA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU0lPQ1NOSVQ6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTSU9DU05JVDogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKC0xKTsKIAl9CkBAIC0yODAsMTUgKzI4MCwyMiBAQAogCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKIAlwLT5mZCA9IGZkID0gc29ja2V0KEFGX05JVCwgU09DS19SQVcsIE5JVFBST1RPX1JBVyk7CiAJaWYgKGZkIDwgMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgInNvY2tldDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KIAlzbml0LnNuaXRfZmFtaWx5ID0gQUZfTklUOwotCSh2b2lkKXN0cm5jcHkoc25pdC5zbml0X2lmbmFtZSwgcC0+b3B0LnNvdXJjZSwgTklUSUZTSVopOworCSh2b2lkKXN0cm5jcHkoc25pdC5zbml0X2lmbmFtZSwgcC0+b3B0LmRldmljZSwgTklUSUZTSVopOwogCiAJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc25pdCwgc2l6ZW9mKHNuaXQpKSkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCS8qCisJCSAqIFhYWCAtIHRoZXJlJ3MgcHJvYmFibHkgYSBwYXJ0aWN1bGFyIGJpbmQgZXJyb3IgdGhhdAorCQkgKiBtZWFucyAidGhlcmUncyBubyBzdWNoIGRldmljZSIgYW5kIGEgcGFydGljdWxhciBiaW5kCisJCSAqIGVycm9yIHRoYXQgbWVhbnMgInRoYXQgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBOSVQiOworCQkgKiB0aGV5IG1pZ2h0IGJlIHRoZSBzYW1lIGVycm9yLCBpZiB0aGV5IGJvdGggZW5kIHVwCisJCSAqIG1lYW5pbmcgIk5JVCBkb2Vzbid0IGtub3cgYWJvdXQgdGhhdCBkZXZpY2UiLgorCQkgKi8KKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiYmluZDogJXM6ICVzIiwgc25pdC5zbml0X2lmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGJhZDsKIAl9CkBAIC0zMDEsNyArMzA4LDcgQEAKIAlwLT5saW5rdHlwZSA9IERMVF9FTjEwTUI7CiAKIAlwLT5idWZzaXplID0gQlVGU1BBQ0U7Ci0JcC0+YnVmZmVyID0gKHVfY2hhciAqKW1hbGxvYyhwLT5idWZzaXplKTsKKwlwLT5idWZmZXIgPSBtYWxsb2MocC0+YnVmc2l6ZSk7CiAJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7CiAJCXN0cmxjcHkocC0+ZXJyYnVmLCBwY2FwX3N0cmVycm9yKGVycm5vKSwgUENBUF9FUlJCVUZfU0laRSk7CiAJCWdvdG8gYmFkOwpAQCAtMzQ4LDExICszNTUsMTEgQEAKIH0KIAogcGNhcF90ICoKLXBjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCitwY2FwX2NyZWF0ZV9pbnRlcmZhY2UoY29uc3QgY2hhciAqZGV2aWNlIF9VXywgY2hhciAqZWJ1ZikKIHsKIAlwY2FwX3QgKnA7CiAKLQlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9uaXQpKTsKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfbml0KSk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIChOVUxMKTsKIApAQCAtMzYwLDggKzM2NywxOCBAQAogCXJldHVybiAocCk7CiB9CiAKKy8qCisgKiBYWFggLSB0aGVyZSdzIHByb2JhYmx5IGEgcGFydGljdWxhciBiaW5kIGVycm9yIHRoYXQgbWVhbnMgInRoYXQgZGV2aWNlCisgKiBkb2Vzbid0IHN1cHBvcnQgTklUIjsgaWYgc28sIHdlIHNob3VsZCB0cnkgYSBiaW5kIGFuZCB1c2UgdGhhdC4KKyAqLworc3RhdGljIGludAorY2FuX2JlX2JvdW5kKGNvbnN0IGNoYXIgKm5hbWUgX1VfKQoreworCXJldHVybiAoMSk7Cit9CisKIGludAogcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQogewotCXJldHVybiAoMCk7CisJcmV0dXJuIChwY2FwX2ZpbmRhbGxkZXZzX2ludGVyZmFjZXMoYWxsZGV2c3AsIGVycmJ1ZiwgY2FuX2JlX2JvdW5kKSk7CiB9CmRpZmYgLS1naXQgYS9wY2FwLW51bGwuYyBiL3BjYXAtbnVsbC5jCmluZGV4IDkzNGZiMmMuLmI1ZmEzYWIgMTAwNjQ0Ci0tLSBhL3BjYXAtbnVsbC5jCisrKyBiL3BjYXAtbnVsbC5jCkBAIC0zNiw3ICszNiw3IEBACiBzdGF0aWMgY2hhciBub3N1cFtdID0gImxpdmUgcGFja2V0IGNhcHR1cmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSI7CiAKIHBjYXBfdCAqCi1wY2FwX2NyZWF0ZV9pbnRlcmZhY2UoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQorcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSBfVV8sIGNoYXIgKmVidWYpCiB7CiAJKHZvaWQpc3RybGNweShlYnVmLCBub3N1cCwgUENBUF9FUlJCVUZfU0laRSk7CiAJcmV0dXJuIChOVUxMKTsKQEAgLTQ1LDUgKzQ1LDkgQEAKIGludAogcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQogeworCS8qCisJICogVGhlcmUgYXJlIG5vIGludGVyZmFjZXMgb24gd2hpY2ggd2UgY2FuIGNhcHR1cmUuCisJICovCisJKmFsbGRldnNwID0gTlVMTDsKIAlyZXR1cm4gKDApOwogfQpkaWZmIC0tZ2l0IGEvcGNhcC1wZi5jIGIvcGNhcC1wZi5jCmluZGV4IGUwM2IyZWQuLjczNDY5MDggMTAwNjQ0Ci0tLSBhL3BjYXAtcGYuYworKysgYi9wY2FwLXBmLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogI2lmZGVmIExCTF9BTElHTgogCXN0cnVjdCBlbnN0YW1wIHN0YW1wOwogI2VuZGlmCi0JcmVnaXN0ZXIgaW50IHBhZDsKKwlyZWdpc3RlciB1X2ludCBwYWQ7CiAKICBhZ2FpbjoKIAljYyA9IHBjLT5jYzsKQEAgLTEyNywxMSArMTI3LDExIEBACiAJCQkJKHZvaWQpbHNlZWsocGMtPmZkLCAwTCwgU0VFS19TRVQpOwogCQkJCWdvdG8gYWdhaW47CiAJCQl9Ci0JCQlzbnByaW50ZihwYy0+ZXJyYnVmLCBzaXplb2YocGMtPmVycmJ1ZiksICJwZiByZWFkOiAlcyIsCisJCQlwY2FwX3NucHJpbnRmKHBjLT5lcnJidWYsIHNpemVvZihwYy0+ZXJyYnVmKSwgInBmIHJlYWQ6ICVzIiwKIAkJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gKC0xKTsKIAkJfQotCQlicCA9IHBjLT5idWZmZXIgKyBwYy0+b2Zmc2V0OworCQlicCA9ICh1X2NoYXIgKilwYy0+YnVmZmVyICsgcGMtPm9mZnNldDsKIAl9IGVsc2UKIAkJYnAgPSBwYy0+YnA7CiAJLyoKQEAgLTE2MCw3ICsxNjAsNyBAQAogCQkJfQogCQl9CiAJCWlmIChjYyA8IHNpemVvZigqc3ApKSB7Ci0JCQlzbnByaW50ZihwYy0+ZXJyYnVmLCBzaXplb2YocGMtPmVycmJ1ZiksCisJCQlwY2FwX3NucHJpbnRmKHBjLT5lcnJidWYsIHNpemVvZihwYy0+ZXJyYnVmKSwKIAkJCSAgICAicGYgc2hvcnQgcmVhZCAoJWQpIiwgY2MpOwogCQkJcmV0dXJuICgtMSk7CiAJCX0KQEAgLTE3Miw3ICsxNzIsNyBAQAogI2VuZGlmCiAJCQlzcCA9IChzdHJ1Y3QgZW5zdGFtcCAqKWJwOwogCQlpZiAoc3AtPmVuc19zdGFtcGxlbiAhPSBzaXplb2YoKnNwKSkgewotCQkJc25wcmludGYocGMtPmVycmJ1Ziwgc2l6ZW9mKHBjLT5lcnJidWYpLAorCQkJcGNhcF9zbnByaW50ZihwYy0+ZXJyYnVmLCBzaXplb2YocGMtPmVycmJ1ZiksCiAJCQkgICAgInBmIHNob3J0IHN0YW1wbGVuICglZCkiLAogCQkJICAgIHNwLT5lbnNfc3RhbXBsZW4pOwogCQkJcmV0dXJuICgtMSk7CkBAIC0yMzIsNyArMjMyLDcgQEAKIAogCXJldCA9IHdyaXRlKHAtPmZkLCBidWYsIHNpemUpOwogCWlmIChyZXQgPT0gLTEpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZDogJXMiLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQpAQCAtMzIxLDE0ICszMjEsMTcgQEAKIAkgKiBpdHMgYXJndW1lbnQsIGV2ZW4gdGhvdWdoIGl0IHRha2VzIGEgImNoYXIgKiIgcmF0aGVyIHRoYW4gYQogCSAqICJjb25zdCBjaGFyICoiIGFzIGl0cyBmaXJzdCBhcmd1bWVudC4gIFRoYXQgYXBwZWFycyB0byBiZQogCSAqIHRoZSBjYXNlLCBhdCBsZWFzdCBvbiBEaWdpdGFsIFVOSVggNC4wLgorCSAqCisJICogWFhYIC0gaXMgdGhlcmUgYW4gZXJyb3IgdGhhdCBtZWFucyAibm8gc3VjaCBkZXZpY2UiPyAgSXMKKwkgKiB0aGVyZSBvbmUgdGhhdCBtZWFucyAidGhhdCBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHBmIj8KIAkgKi8KLQlwLT5mZCA9IHBmb3BlbihwLT5vcHQuc291cmNlLCBPX1JEV1IpOworCXAtPmZkID0gcGZvcGVuKHAtPm9wdC5kZXZpY2UsIE9fUkRXUik7CiAJaWYgKHAtPmZkID09IC0xICYmIGVycm5vID09IEVBQ0NFUykKLQkJcC0+ZmQgPSBwZm9wZW4ocC0+b3B0LnNvdXJjZSwgT19SRE9OTFkpOworCQlwLT5mZCA9IHBmb3BlbihwLT5vcHQuZGV2aWNlLCBPX1JET05MWSk7CiAJaWYgKHAtPmZkIDwgMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJwZiBvcGVuOiAlczogJXNcblwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJwZiBvcGVuOiAlczogJXNcblwKIHlvdXIgc3lzdGVtIG1heSBub3QgYmUgcHJvcGVybHkgY29uZmlndXJlZDsgc2VlIHRoZSBwYWNrZXRmaWx0ZXIoNCkgbWFuIHBhZ2VcbiIsCi0JCQlwLT5vcHQuc291cmNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlwLT5vcHQuZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KIAlwZi0+T3JpZ01pc3NlZCA9IC0xOwpAQCAtMzM4LDcgKzM0MSw3IEBACiAJaWYgKHAtPm9wdC5wcm9taXNjKQogCQllbm1vZGUgfD0gRU5QUk9NSVNDOwogCWlmIChpb2N0bChwLT5mZCwgRUlPQ01CSVMsIChjYWRkcl90KSZlbm1vZGUpIDwgMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJFSU9DTUJJUzogJXMiLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVJT0NNQklTOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KQEAgLTM0OSwxMyArMzUyLDEzIEBACiAjZW5kaWYKIAkvKiBzZXQgdGhlIGJhY2tsb2cgKi8KIAlpZiAoaW9jdGwocC0+ZmQsIEVJT0NTRVRXLCAoY2FkZHJfdCkmYmFja2xvZykgPCAwKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVJT0NTRVRXOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ1NFVFc6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQogCS8qIGRpc2NvdmVyIGludGVyZmFjZSB0eXBlICovCiAJaWYgKGlvY3RsKHAtPmZkLCBFSU9DREVWUCwgKGNhZGRyX3QpJmRldnBhcmFtcykgPCAwKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVJT0NERVZQOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ0RFVlA6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtNDM3LDcgKzQ0MCw3IEBACiAJCSAqIGZyYW1pbmciLCB0aGVyZSdzIG5vdCBtdWNoIHdlIGNhbiBkbywgYXMgdGhhdAogCQkgKiBkb2Vzbid0IHNwZWNpZnkgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgaGVhZGVyLgogCQkgKi8KLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJ1bmtub3duIGRhdGEtbGluayB0eXBlICV1IiwgZGV2cGFyYW1zLmVuZF9kZXZfdHlwZSk7CiAJCWdvdG8gYmFkOwogCX0KQEAgLTQ1MCw3ICs0NTMsNyBAQAogCX0gZWxzZQogCQlwLT5mZGRpcGFkID0gMDsKIAlpZiAoaW9jdGwocC0+ZmQsIEVJT0NUUlVOQ0FURSwgKGNhZGRyX3QpJnAtPnNuYXBzaG90KSA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ1RSVU5DQVRFOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ1RSVU5DQVRFOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KQEAgLTQ1OSw3ICs0NjIsNyBAQAogCUZpbHRlci5lbmZfUHJpb3JpdHkgPSAzNzsJLyogYW55dGhpbmcgPiAyICovCiAJRmlsdGVyLmVuZl9GaWx0ZXJMZW4gPSAwOwkvKiBtZWFucyAiYWx3YXlzIHRydWUiICovCiAJaWYgKGlvY3RsKHAtPmZkLCBFSU9DU0VURiwgKGNhZGRyX3QpJkZpbHRlcikgPCAwKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVJT0NTRVRGOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ1NFVEY6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtNDY5LDE0ICs0NzIsMTQgQEAKIAkJdGltZW91dC50dl9zZWMgPSBwLT5vcHQudGltZW91dCAvIDEwMDA7CiAJCXRpbWVvdXQudHZfdXNlYyA9IChwLT5vcHQudGltZW91dCAqIDEwMDApICUgMTAwMDAwMDsKIAkJaWYgKGlvY3RsKHAtPmZkLCBFSU9DU1JUSU1FT1VULCAoY2FkZHJfdCkmdGltZW91dCkgPCAwKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJFSU9DU1JUSU1FT1VUOiAlcyIsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVJT0NTUlRJTUVPVVQ6ICVzIiwKIAkJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlnb3RvIGJhZDsKIAkJfQogCX0KIAogCXAtPmJ1ZnNpemUgPSBCVUZTUEFDRTsKLQlwLT5idWZmZXIgPSAodV9jaGFyKiltYWxsb2MocC0+YnVmc2l6ZSArIHAtPm9mZnNldCk7CisJcC0+YnVmZmVyID0gbWFsbG9jKHAtPmJ1ZnNpemUgKyBwLT5vZmZzZXQpOwogCWlmIChwLT5idWZmZXIgPT0gTlVMTCkgewogCQlzdHJsY3B5KHAtPmVycmJ1ZiwgcGNhcF9zdHJlcnJvcihlcnJubyksIFBDQVBfRVJSQlVGX1NJWkUpOwogCQlnb3RvIGJhZDsKQEAgLTUwMywxMSArNTA2LDExIEBACiB9CiAKIHBjYXBfdCAqCi1wY2FwX2NyZWF0ZV9pbnRlcmZhY2UoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQorcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSBfVV8sIGNoYXIgKmVidWYpCiB7CiAJcGNhcF90ICpwOwogCi0JcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfcGYpKTsKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfcGYpKTsKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gKE5VTEwpOwogCkBAIC01MTUsMTAgKzUxOCwyMCBAQAogCXJldHVybiAocCk7CiB9CiAKKy8qCisgKiBYWFggLSBpcyB0aGVyZSBhbiBlcnJvciBmcm9tIHBmb3BlbigpIHRoYXQgbWVhbnMgIm5vIHN1Y2ggZGV2aWNlIj8KKyAqIElzIHRoZXJlIG9uZSB0aGF0IG1lYW5zICJ0aGF0IGRldmljZSBkb2Vzbid0IHN1cHBvcnQgcGYiPworICovCitzdGF0aWMgaW50CitjYW5fYmVfYm91bmQoY29uc3QgY2hhciAqbmFtZSBfVV8pCit7CisJcmV0dXJuICgxKTsKK30KKwogaW50CiBwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCiB7Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gKHBjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhhbGxkZXZzcCwgZXJyYnVmLCBjYW5fYmVfYm91bmQpKTsKIH0KIAogc3RhdGljIGludApAQCAtNTQ3LDcgKzU2MCw3IEBACiAJCQkgKiBZZXMuICBUcnkgdG8gaW5zdGFsbCB0aGUgZmlsdGVyLgogCQkJICovCiAJCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTRVRGLCAoY2FkZHJfdClmcCkgPCAwKSB7Ci0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKKwkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCiAJCQkJICAgICJCSU9DU0VURjogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkJcmV0dXJuICgtMSk7CiAJCQl9CmRpZmYgLS1naXQgYS9wY2FwLXJwY2FwLmMgYi9wY2FwLXJwY2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1NDA1OAotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAtcnBjYXAuYwpAQCAtMCwwICsxLDIxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgLSAyMDA1IE5ldEdyb3VwLCBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gKEl0YWx5KQorICogQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAwOCBDQUNFIFRlY2hub2xvZ2llcywgRGF2aXMgKENhbGlmb3JuaWEpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFBvbGl0ZWNuaWNvIGRpIFRvcmlubywgQ0FDRSBUZWNobm9sb2dpZXMKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIGZvciBzdHJsZW4oKSwgLi4uICovCisjaW5jbHVkZSA8c3RkbGliLmg+CQkvKiBmb3IgbWFsbG9jKCksIGZyZWUoKSwgLi4uICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CQkvKiBmb3IgZnVuY3Rpb25zIHdpdGggdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworI2luY2x1ZGUgPGVycm5vLmg+CQkvKiBmb3IgdGhlIGVycm5vIHZhcmlhYmxlICovCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKyNpbmNsdWRlICJwY2FwLXJwY2FwLmgiCisjaW5jbHVkZSAic29ja3V0aWxzLmgiCisKKy8qCisgKiBcZmlsZSBwY2FwLXJwY2FwLmMKKyAqCisgKiBUaGlzIGZpbGUga2VlcHMgYWxsIHRoZSBuZXcgZnVudGlvbnMgdGhhdCBhcmUgbmVlZGVkIGZvciB0aGUgUlBDQVAgcHJvdG9jb2wuCisgKiBBbG1vc3QgYWxsIHRoZSBwY2FwIGZ1bmN0aW9ucyBuZWVkIHRvIGJlIG1vZGlmaWVkIGluIG9yZGVyIHRvIGJlY29tZSBjb21wYXRpYmxlCisgKiB3aXRoIHRoZSBSUENBUCBwcm90b2NvbC4gSG93ZXZlciwgeW91IGNhbiBmaW5kIGhlcmUgb25seSB0aGUgb25lcyB0aGF0IGFyZSBjb21wbGV0ZWx5IG5ldy4KKyAqCisgKiBUaGlzIGZpbGUga2VlcHMgYWxzbyB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlICdwcml2YXRlJywgaS5lLiBhcmUgbmVlZGVkIGJ5IHRoZSBSUENBUAorICogcHJvdG9jb2wgYnV0IGFyZSBub3QgZXhwb3J0ZWQgdG8gdGhlIHVzZXIuCisgKgorICogXHdhcm5pbmcgQWxsIHRoZSBSUENBUCBmdW5jdGlvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byByZXR1cm4gYSBidWZmZXIgY29udGFpbmluZworICogdGhlIGVycm9yIGRlc2NyaXB0aW9uIGNhbiByZXR1cm4gbWF4IFBDQVBfRVJSQlVGX1NJWkUgY2hhcmFjdGVycy4KKyAqIEhvd2V2ZXIgdGhlcmUgaXMgbm8gZ3VhcmFudGVlcyB0aGF0IHRoZSBzdHJpbmcgd2lsbCBiZSB6ZXJvLXRlcm1pbmF0ZWQuCisgKiBCZXN0IHByYWN0aWNlIGlzIHRvIGRlZmluZSB0aGUgZXJyYnVmIHZhcmlhYmxlIGFzIGEgY2hhciBvZiBzaXplICdQQ0FQX0VSUkJVRl9TSVpFKzEnCisgKiBhbmQgdG8gaW5zZXJ0IG1hbnVhbGx5IGEgTlVMTCBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiBUaGlzIHdpbGwKKyAqIGd1YXJhbnRlZSB0aGF0IG5vIGJ1ZmZlciBvdmVyZmxvd3Mgb2NjdXIgZXZlbiBpZiB3ZSB1c2UgdGhlIHByaW50ZigpIHRvIHNob3cKKyAqIHRoZSBlcnJvciBvbiB0aGUgc2NyZWVuLgorICovCisKKyNkZWZpbmUgUENBUF9TVEFUU19TVEFOREFSRAkwCS8qIFVzZWQgYnkgcGNhcF9zdGF0c19yZW1vdGUgdG8gc2VlIGlmIHdlIHdhbnQgc3RhbmRhcmQgb3IgZXh0ZW5kZWQgc3RhdGlzdGljcyAqLworI2RlZmluZSBQQ0FQX1NUQVRTX0VYCQkxCS8qIFVzZWQgYnkgcGNhcF9zdGF0c19yZW1vdGUgdG8gc2VlIGlmIHdlIHdhbnQgc3RhbmRhcmQgb3IgZXh0ZW5kZWQgc3RhdGlzdGljcyAqLworCisvKiBLZWVwcyBhIGxpc3Qgb2YgYWxsIHRoZSBvcGVuZWQgY29ubmVjdGlvbnMgaW4gdGhlIGFjdGl2ZSBtb2RlLiAqLworc3RydWN0IGFjdGl2ZWhvc3RzICphY3RpdmVIb3N0czsKKworLyoKKyAqIFByaXZhdGUgZGF0YSBmb3IgY2FwdHVyaW5nIG9uIFdpblBjYXAgZGV2aWNlcy4KKyAqLworc3RydWN0IHBjYXBfd2luIHsKKwlpbnQgbm9uYmxvY2s7CisJaW50IHJmbW9uX3NlbGZzdGFydDsJCS8qIGEgZmxhZyB0ZWxscyB3aGV0aGVyIHRoZSBtb25pdG9yIG1vZGUgaXMgc2V0IGJ5IGl0c2VsZiAqLworCWludCBmaWx0ZXJpbmdfaW5fa2VybmVsOwkvKiB1c2luZyBrZXJuZWwgZmlsdGVyICovCisKKyNpZmRlZiBIQVZFX0RBR19BUEkKKwlpbnQJZGFnX2Zjc19iaXRzOwkJLyogTnVtYmVyIG9mIGNoZWNrc3VtIGJpdHMgZnJvbSBsaW5rIGxheWVyICovCisjZW5kaWYKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTG9jYWxseSBkZWZpbmVkIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcnBjYXBfY2hlY2t2ZXIoU09DS0VUIHNvY2ssIHN0cnVjdCBycGNhcF9oZWFkZXIgKmhlYWRlciwgY2hhciAqZXJyYnVmKTsKK3N0YXRpYyBzdHJ1Y3QgcGNhcF9zdGF0ICpycGNhcF9zdGF0c19yZW1vdGUocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcywgaW50IG1vZGUpOworc3RhdGljIGludCBwY2FwX3BhY2tfYnBmZmlsdGVyKHBjYXBfdCAqZnAsIGNoYXIgKnNlbmRidWYsIGludCAqc2VuZGJ1ZmlkeCwgc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nKTsKK3N0YXRpYyBpbnQgcGNhcF9jcmVhdGVmaWx0ZXJfbm9ycGNhcHBrdChwY2FwX3QgKmZwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnByb2cpOworc3RhdGljIGludCBwY2FwX3VwZGF0ZWZpbHRlcl9yZW1vdGUocGNhcF90ICpmcCwgc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nKTsKK3N0YXRpYyBpbnQgcGNhcF9zZXRmaWx0ZXJfcmVtb3RlKHBjYXBfdCAqZnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZyk7CitzdGF0aWMgaW50IHBjYXBfc2V0c2FtcGxpbmdfcmVtb3RlKHBjYXBfdCAqcCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGdW5jdGlvbiBib2RpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogXGluZ3JvdXAgcmVtb3RlX3ByaV9mdW5jCisgKgorICogXGJyaWVmIAlJdCB0cmFzbGF0ZXMgKGkuZS4gZGUtc2VyaWFsaXplcykgYSAnc29ja2FkZHJfc3RvcmFnZScgc3RydWN0dXJlIGZyb20KKyAqIHRoZSBuZXR3b3JrIGJ5dGUgb3JkZXIgdG8gdGhlIGhvc3QgYnl0ZSBvcmRlci4KKyAqCisgKiBJdCBhY2NlcHRzIGEgJ3NvY2thZGRyX3N0b3JhZ2UnIHN0cnVjdHVyZSBhcyBpdCBpcyByZWNlaXZlZCBmcm9tIHRoZSBuZXR3b3JrIGFuZCBpdAorICogY29udmVydHMgaXQgaW50byB0aGUgaG9zdCBieXRlIG9yZGVyIChieSBtZWFucyBvZiBhIHNldCBvZiBudG9oKCkgKS4KKyAqIFRoZSBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSAnc29ja2FkZHJvdXQnIHZhcmlhYmxlIGFjY29yZGluZyB0byB0aGUgYWRkcmVzcyBmYW1pbHkKKyAqIGluIHVzZS4gSW4gY2FzZSB0aGUgYWRkcmVzcyBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIEFGX0lORVQgbm9yIEFGX0lORVQ2IGZhbWlsaWVzLAorICogJ3NvY2thZGRyb3V0JyBpcyBub3QgYWxsb2NhdGVkIGFuZCBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KKyAqIFRoaXMgdXN1YWxseSBoYXBwZW5zIGJlY2F1c2UgdGhhdCBhZGRyZXNzIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBvdGhlciBob3N0LCBzbyB0aGUKKyAqIFJQQ0FQIGRhZW1vbiBzZW50IGEgJ3NvY2thZGRyX3N0b3JhZ2UnIHN0cnVjdHVyZSBjb250YWluaW5nIGFsbCAnemVybycgdmFsdWVzLgorICoKKyAqIFxwYXJhbSBzb2NrYWRkcmluOiBhICdzb2NrYWRkcl9zdG9yYWdlJyBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IGhhcyB0byBiZQorICogZGUtc2VyaWFsaXplZC4KKyAqCisgKiBccGFyYW0gc29ja2FkZHJvdXQ6IGEgJ3NvY2thZGRyX3N0b3JhZ2UnIHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHRoYXQgd2lsbCBjb250YWluCisgKiB0aGUgZGUtc2VyaWFsaXplZCBkYXRhLiBUaGUgc3RydWN0dXJlIHJldHVybmVkIGNhbiBiZSBlaXRoZXIgYSAnc29ja2FkZHJfaW4nIG9yICdzb2NrYWRkcl9pbjYnLgorICogVGhpcyB2YXJpYWJsZSB3aWxsIGJlIGFsbG9jYXRlZCBhdXRvbWF0aWNhbGx5IGluc2lkZSB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFxwYXJhbSBlcnJidWY6IGEgcG9pbnRlciB0byBhIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciAob2Ygc2l6ZSBQQ0FQX0VSUkJVRl9TSVpFKQorICogdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGVycm9yIG1lc3NhZ2UgKGluIGNhc2UgdGhlcmUgaXMgb25lKS4KKyAqCisgKiBccmV0dXJuICcwJyBpZiBldmVyeXRoaW5nIGlzIGZpbmUsICctMScgaWYgc29tZSBlcnJvcnMgb2NjdXJyZWQuIEJhc2ljYWxseSwgdGhlIGVycm9yCisgKiBjYW4gYmUgb25seSB0aGUgZmFjdCB0aGF0IHRoZSBtYWxsb2MoKSBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5LgorICogVGhlIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQgaW4gdGhlICdlcnJidWYnIHZhcmlhYmxlLCB3aGlsZSB0aGUgZGVzZXJpYWxpemVkIGFkZHJlc3MKKyAqIGlzIHJldHVybmVkIGludG8gdGhlICdzb2NrYWRkcm91dCcgdmFyaWFibGUuCisgKgorICogXHdhcm5pbmcgVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBvbmx5IEFGX0lORVQgYW5kIEFGX0lORVQ2IGFkZHJlc3MgZmFtaWxpZXMuCisgKgorICogXHdhcm5pbmcgVGhlIHNvY2thZGRyb3V0IChpZiBub3QgTlVMTCkgbXVzdCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgdXNlci4KKyAqLworaW50IHJwY2FwX2Rlc2VyYWRkcihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc29ja2FkZHJpbiwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKipzb2NrYWRkcm91dCwgY2hhciAqZXJyYnVmKQoreworCS8qIFdhcm5pbmc6IHdlIHN1cHBvcnQgb25seSBBRl9JTkVUIGFuZCBBRl9JTkVUNiAqLworCWlmIChudG9ocyhzb2NrYWRkcmluLT5zc19mYW1pbHkpID09IEFGX0lORVQpCisJeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNvY2thZGRyOworCisJCXNvY2thZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzb2NrYWRkcmluOworCQlzb2NrYWRkci0+c2luX2ZhbWlseSA9IG50b2hzKHNvY2thZGRyLT5zaW5fZmFtaWx5KTsKKwkJc29ja2FkZHItPnNpbl9wb3J0ID0gbnRvaHMoc29ja2FkZHItPnNpbl9wb3J0KTsKKworCQkoKnNvY2thZGRyb3V0KSA9IChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCQlpZiAoKCpzb2NrYWRkcm91dCkgPT0gTlVMTCkKKwkJeworCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2MoKSBmYWlsZWQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbWNweSgqc29ja2FkZHJvdXQsIHNvY2thZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJCXJldHVybiAwOworCX0KKwlpZiAobnRvaHMoc29ja2FkZHJpbi0+c3NfZmFtaWx5KSA9PSBBRl9JTkVUNikKKwl7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNvY2thZGRyOworCisJCXNvY2thZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgc29ja2FkZHJpbjsKKwkJc29ja2FkZHItPnNpbjZfZmFtaWx5ID0gbnRvaHMoc29ja2FkZHItPnNpbjZfZmFtaWx5KTsKKwkJc29ja2FkZHItPnNpbjZfcG9ydCA9IG50b2hzKHNvY2thZGRyLT5zaW42X3BvcnQpOworCQlzb2NrYWRkci0+c2luNl9mbG93aW5mbyA9IG50b2hsKHNvY2thZGRyLT5zaW42X2Zsb3dpbmZvKTsKKwkJc29ja2FkZHItPnNpbjZfc2NvcGVfaWQgPSBudG9obChzb2NrYWRkci0+c2luNl9zY29wZV9pZCk7CisKKwkJKCpzb2NrYWRkcm91dCkgPSAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisJCWlmICgoKnNvY2thZGRyb3V0KSA9PSBOVUxMKQorCQl7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYygpIGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtY3B5KCpzb2NrYWRkcm91dCwgc29ja2FkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEl0IGlzIG5laXRoZXIgQUZfSU5FVCBub3IgQUZfSU5FVDYgKi8KKwkqc29ja2FkZHJvdXQgPSBOVUxMOworCXJldHVybiAwOworfQorCisvKiBcaW5ncm91cCByZW1vdGVfcHJpX2Z1bmMKKyAqCisgKiBcYnJpZWYgSXQgcmVhZHMgYSBwYWNrZXQgZnJvbSB0aGUgbmV0d29yayBzb2NrZXQuIFRoaXMgZG9lcyBub3QgbWFrZSB1c2Ugb2YKKyAqIGNhbGxiYWNrIChoZW5jZSB0aGUgIm5vY2IiIHN0cmluZyBpbnRvIGl0cyBuYW1lKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2V2ZXJhbCBwY2FwX25leHRfZXgoKSB3aGVuIHRoZXkgZGV0ZWN0IHRoYXQKKyAqIHdlIGhhdmUgYSByZW1vdGUgY2FwdHVyZSBhbmQgdGhleSBhcmUgdGhlIGNsaWVudCBzaWRlLiBJbiB0aGF0IGNhc2UsIHRoZXkgbmVlZAorICogdG8gcmVhZCBwYWNrZXRzIGZyb20gdGhlIHNvY2tldC4KKyAqCisgKiBQYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzIGFyZSBleGFjdGx5IHRoZSBzYW1lIG9mIHRoZSBwY2FwX25leHRfZXgoKS4KKyAqCisgKiBcd2FybmluZyBCeSBjaG9pY2UsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbWFrZSB1c2Ugb2Ygc2VtYXBob3Jlcy4gQSBzbWFydGVyCisgKiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcHV0IGEgc2VtYXBob3JlIGludG8gdGhlIGRhdGEgdGhyZWFkLCBhbmQgYSBzaWduYWwgd2lsbAorICogYmUgcmFpc2VkIGFzIHNvb24gYXMgdGhlcmUgaXMgZGF0YSBpbnRvIHRoZSBzb2NrZXQgYnVmZmVyLgorICogSG93ZXZlciB0aGlzIGlzIGNvbXBsaWNhdGVkIGFuZCBpdCBkb2VzIG5vdCBicmluZyBhbnkgYWR2YW50YWdlcyB3aGVuIHJlYWRpbmcKKyAqIGZyb20gdGhlIG5ldHdvcmssIGluIHdoaWNoIG5ldHdvcmsgZGVsYXlzIGNhbiBiZSBtdWNoIG1vcmUgaW1wb3J0YW50IHRoYW4KKyAqIHRoZXNlIG9wdGltaXphdGlvbnMuIFRoZXJlZm9yZSwgd2UgY2hvc2UgdGhlIGZvbGxvd2luZyBhcHByb2FjaDoKKyAqIC0gdGhlICd0aW1lb3V0JyBjaG9zZW4gYnkgdGhlIHVzZXIgaXMgc3BsaXQgaW4gdHdvIChoYWxmIG9uIHRoZSBzZXJ2ZXIgc2lkZSwKKyAqIHdpdGggdGhlIHVzdWFsIG1lYW5pbmcsIGFuZCBoYWxmIG9uIHRoZSBjbGllbnQgc2lkZSkKKyAqIC0gdGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIHBhY2tldHM7IGlmIHRoZXJlIGFyZSBubyBwYWNrZXRzLCBpdCB3YWl0cyBmb3IKKyAqIHRpbWVvdXQvMiBhbmQgdGhlbiBpdCBjaGVja3MgYWdhaW4uIElmIHBhY2tldHMgYXJlIHN0aWxsIG1pc3NpbmcsIGl0IHJldHVybnMsCisgKiBvdGhlcndpc2UgaXQgcmVhZHMgcGFja2V0cy4KKyAqLworc3RhdGljIGludCBwY2FwX3JlYWRfbm9jYl9yZW1vdGUocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKipwa3RfaGVhZGVyLCB1X2NoYXIgKipwa3RfZGF0YSkKK3sKKwlzdHJ1Y3QgcnBjYXBfaGVhZGVyICpoZWFkZXI7CQkvKiBnZW5lcmFsIGhlYWRlciBhY2NvcmRpbmcgdG8gdGhlIFJQQ0FQIGZvcm1hdCAqLworCXN0cnVjdCBycGNhcF9wa3RoZHIgKm5ldF9wa3RfaGVhZGVyOwkvKiBoZWFkZXIgb2YgdGhlIHBhY2tldCAqLworCWNoYXIgbmV0YnVmW1JQQ0FQX05FVEJVRl9TSVpFXTsJCS8qIHNpemUgb2YgdGhlIG5ldHdvcmsgYnVmZmVyIGluIHdoaWNoIHRoZSBwYWNrZXQgaXMgY29waWVkLCBqdXN0IGZvciBVRFAgKi8KKwl1aW50MzIgdG90cmVhZDsJCQkJLyogbnVtYmVyIG9mIGJ5dGVzIChvZiBwYXlsb2FkKSBjdXJyZW50bHkgcmVhZCBmcm9tIHRoZSBuZXR3b3JrIChyZWZlcnJlZCB0byB0aGUgY3VycmVudCBwa3QpICovCisJaW50IG5yZWFkOworCWludCByZXR2YWw7CQkJCS8qIGdlbmVyaWMgcmV0dXJuIHZhbHVlICovCisKKwkvKiBTdHJ1Y3R1cmVzIG5lZWRlZCBmb3IgdGhlIHNlbGVjdCgpIGNhbGwgKi8KKwlmZF9zZXQgcmZkczsJCQkJLyogc2V0IG9mIHNvY2tldCBkZXNjcmlwdG9ycyB3ZSBoYXZlIHRvIGNoZWNrICovCisJc3RydWN0IHRpbWV2YWwgdHY7CQkJLyogbWF4aW11bSB0aW1lIHRoZSBzZWxlY3QoKSBjYW4gYmxvY2sgd2FpdGluZyBmb3IgZGF0YSAqLworCXN0cnVjdCBwY2FwX21kICptZDsJCQkvKiBzdHJ1Y3R1cmUgdXNlZCB3aGVuIGRvaW5nIGEgcmVtb3RlIGxpdmUgY2FwdHVyZSAqLworCisJbWQgPSAoc3RydWN0IHBjYXBfbWQgKikgKCh1X2NoYXIqKXAtPnByaXYgKyBzaXplb2Yoc3RydWN0IHBjYXBfd2luKSk7CisKKwkvKgorCSAqIERlZmluZSB0aGUgcmVhZCB0aW1lb3V0LCB0byBiZSB1c2VkIGluIHRoZSBzZWxlY3QoKQorCSAqICd0aW1lb3V0JywgaW4gcGNhcF90LCBpcyBpbiBtaWxsaXNlY29uZHM7IHdlIGhhdmUgdG8gY29udmVydCBpdCBpbnRvIHNlYyBhbmQgbWljcm9zZWMKKwkgKi8KKwl0di50dl9zZWMgPSBwLT5vcHQudGltZW91dCAvIDEwMDA7CisJdHYudHZfdXNlYyA9IChwLT5vcHQudGltZW91dCAtIHR2LnR2X3NlYyAqIDEwMDApICogMTAwMDsKKworCS8qIFdhdGNoIG91dCBzb2NrZGF0YSB0byBzZWUgaWYgaXQgaGFzIGlucHV0ICovCisJRkRfWkVSTygmcmZkcyk7CisKKwkvKgorCSAqICdmcC0+cm10X3NvY2tkYXRhJyBoYXMgYWx3YXlzIHRvIGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGUgc2VsZWN0KCksCisJICogc2luY2UgaXQgaXMgY2xlYXJlZCBieSB0aGUgc2VsZWN0KCkKKwkgKi8KKwlGRF9TRVQobWQtPnJtdF9zb2NrZGF0YSwgJnJmZHMpOworCisJcmV0dmFsID0gc2VsZWN0KChpbnQpIG1kLT5ybXRfc29ja2RhdGEgKyAxLCAmcmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKwlpZiAocmV0dmFsID09IC0xKQorCXsKKwkJc29ja19nZXRlcnJvcigic2VsZWN0KCk6ICIsIHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBUaGVyZSBpcyBubyBkYXRhIHdhaXRpbmcsIHNvIHJldHVybiAnMCcgKi8KKwlpZiAocmV0dmFsID09IDApCisJCXJldHVybiAwOworCisJLyoKKwkgKiBkYXRhIGlzIGhlcmU7IHNvLCBsZXQncyBjb3B5IGl0IGludG8gdGhlIHVzZXIgYnVmZmVyLgorCSAqIEknbSBnb2luZyB0byByZWFkIGEgbmV3IHBhY2tldDsgc28gSSByZXNldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIChwYXlsb2FkIG9ubHkpIHJlYWQKKwkgKi8KKwl0b3RyZWFkID0gMDsKKworCS8qCisJICogV2UgaGF2ZSB0byBkZWZpbmUgJ2hlYWRlcicgYXMgYSBwb2ludGVyIHRvIGEgbGFyZ2VyIGJ1ZmZlciwKKwkgKiBiZWNhdXNlIGluIGNhc2Ugb2YgVURQIHdlIGhhdmUgdG8gcmVhZCBhbGwgdGhlIG1lc3NhZ2Ugd2l0aGluIGEgc2luZ2xlIGNhbGwKKwkgKi8KKwloZWFkZXIgPSAoc3RydWN0IHJwY2FwX2hlYWRlciAqKSBuZXRidWY7CisJbmV0X3BrdF9oZWFkZXIgPSAoc3RydWN0IHJwY2FwX3BrdGhkciAqKSAobmV0YnVmICsgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpKTsKKworCWlmIChtZC0+cm10X2ZsYWdzICYgUENBUF9PUEVORkxBR19EQVRBVFhfVURQKQorCXsKKwkJLyogUmVhZCB0aGUgZW50aXJlIG1lc3NhZ2UgZnJvbSB0aGUgbmV0d29yayAqLworCQlpZiAoc29ja19yZWN2KG1kLT5ybXRfc29ja2RhdGEsIG5ldGJ1ZiwgUlBDQVBfTkVUQlVGX1NJWkUsIFNPQ0tfUkVDRUlWRUFMTF9OTywgcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKHNvY2tfcmVjdihtZC0+cm10X3NvY2tkYXRhLCBuZXRidWYsIHNpemVvZihzdHJ1Y3QgcnBjYXBfaGVhZGVyKSwgU09DS19SRUNFSVZFQUxMX1lFUywgcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaXMgY29ycmVjdCAqLworCXJldHZhbCA9IHJwY2FwX2NoZWNrbXNnKHAtPmVycmJ1ZiwgbWQtPnJtdF9zb2NrZGF0YSwgaGVhZGVyLCBSUENBUF9NU0dfUEFDS0VULCAwKTsKKworCWlmIChyZXR2YWwgIT0gUlBDQVBfTVNHX1BBQ0tFVCkJCS8qIHRoZSBtZXNzYWdlIGlzIG5vdCB0aGUgb25lIGV4cGVjdGVkICovCisJeworCQlzd2l0Y2ggKHJldHZhbCkKKwkJeworCQljYXNlIC0zOgkJLyogVW5yZWNvdmVyYWJsZSBuZXR3b3JrIGVycm9yICovCisJCQlyZXR1cm4gLTE7CS8qIERvIG5vdGhpbmc7IGp1c3QgZXhpdCBmcm9tIGhlcmU7IHRoZSBlcnJvciBjb2RlIGlzIGFscmVhZHkgaW50byB0aGUgZXJyYnVmICovCisKKwkJY2FzZSAtMjoJCS8qIFRoZSBvdGhlciBlbmRwb2ludCBzZW50IGEgbWVzc2FnZSB0aGF0IGlzIG5vdCBhbGxvd2VkIGhlcmUgKi8KKwkJY2FzZSAtMToJCS8qIFRoZSBvdGhlciBlbmRwb2ludCBoYXMgYSB2ZXJzaW9uIG51bWJlciB0aGF0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb3VyICovCisJCQlyZXR1cm4gMDsJLyogUmV0dXJuICdubyBwYWNrZXRzIHJlY2VpdmVkJyAqLworCisJCWRlZmF1bHQ6CisJCQlTT0NLX0FTU0VSVCgiSW50ZXJuYWwgZXJyb3IiLCAxKTsKKwkJCXJldHVybiAwOwkvKiBSZXR1cm4gJ25vIHBhY2tldHMgcmVjZWl2ZWQnICovCisJCX0KKwl9CisKKwkvKiBJbiBjYXNlIG9mIFRDUCwgcmVhZCB0aGUgcmVtYWluaW5nIG9mIHRoZSBwYWNrZXQgZnJvbSB0aGUgc29ja2V0ICovCisJaWYgKCEobWQtPnJtdF9mbGFncyAmIFBDQVBfT1BFTkZMQUdfREFUQVRYX1VEUCkpCisJeworCQkvKiBSZWFkIHRoZSBSUENBUCBwYWNrZXQgaGVhZGVyIGZyb20gdGhlIG5ldHdvcmsgKi8KKwkJbnJlYWQgPSBzb2NrX3JlY3YobWQtPnJtdF9zb2NrZGF0YSwgKGNoYXIgKiluZXRfcGt0X2hlYWRlciwKKwkJICAgIHNpemVvZihzdHJ1Y3QgcnBjYXBfcGt0aGRyKSwgU09DS19SRUNFSVZFQUxMX1lFUywKKwkJICAgIHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSk7CisJCWlmIChucmVhZCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwkJdG90cmVhZCArPSBucmVhZDsKKwl9CisKKwlpZiAoKG50b2hsKG5ldF9wa3RfaGVhZGVyLT5jYXBsZW4pICsgc2l6ZW9mKHN0cnVjdCBwY2FwX3BrdGhkcikpIDw9IHAtPmJ1ZnNpemUpCisJeworCQkvKiBJbml0aWFsaXplIHJldHVybmVkIHN0cnVjdHVyZXMgKi8KKwkJKnBrdF9oZWFkZXIgPSAoc3RydWN0IHBjYXBfcGt0aGRyICopIHAtPmJ1ZmZlcjsKKwkJKnBrdF9kYXRhID0gKHVfY2hhciopcC0+YnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBwY2FwX3BrdGhkcik7CisKKwkJKCpwa3RfaGVhZGVyKS0+Y2FwbGVuID0gbnRvaGwobmV0X3BrdF9oZWFkZXItPmNhcGxlbik7CisJCSgqcGt0X2hlYWRlciktPmxlbiA9IG50b2hsKG5ldF9wa3RfaGVhZGVyLT5sZW4pOworCQkoKnBrdF9oZWFkZXIpLT50cy50dl9zZWMgPSBudG9obChuZXRfcGt0X2hlYWRlci0+dGltZXN0YW1wX3NlYyk7CisJCSgqcGt0X2hlYWRlciktPnRzLnR2X3VzZWMgPSBudG9obChuZXRfcGt0X2hlYWRlci0+dGltZXN0YW1wX3VzZWMpOworCisJCS8qCisJCSAqIEkgZG9uJ3QgdXBkYXRlIHRoZSBjb3VudGVyIG9mIHRoZSBwYWNrZXRzIGRyb3BwZWQgYnkgdGhlIG5ldHdvcmsgc2luY2Ugd2UncmUgdXNpbmcgVENQLAorCQkgKiB0aGVyZWZvcmUgbm8gcGFja2V0cyBhcmUgZHJvcHBlZC4gSnVzdCB1cGRhdGUgdGhlIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkIGNvcnJlY3RseQorCQkgKi8KKwkJbWQtPlRvdENhcHQrKzsKKworCQkvKiBDb3BpZXMgdGhlIHBhY2tldCBpbnRvIHRoZSBkYXRhIGJ1ZmZlciAqLworCQlpZiAobWQtPnJtdF9mbGFncyAmIFBDQVBfT1BFTkZMQUdfREFUQVRYX1VEUCkKKwkJeworCQkJdW5zaWduZWQgaW50IG5wa3Q7CisKKwkJCS8qCisJCQkgKiBJbiBjYXNlIG9mIFVEUCB0aGUgcGFja2V0IGhhcyBhbHJlYWR5IGJlZW4gcmVhZCwgd2UgaGF2ZSB0byBjb3B5IGl0IGludG8gJ2J1ZmZlcicuCisJCQkgKiBBbm90aGVyIG9wdGlvbiBzaG91bGQgYmUgdG8gZGVjbGFyZSAnbmV0YnVmJyBhcyAnc3RhdGljJy4gSG93ZXZlciB0aGlzIHByZXZlbnRzCisJCQkgKiB1c2luZyBzZXZlcmFsIHBjYXAgaW5zdGFuY2VzIHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzIChiZWNhdXNlIHRoZSBzdGF0aWMgYnVmZmVyIGlzIHNoYXJlZCBhbW9uZworCQkJICogYWxsIHByb2Nlc3NlcykKKwkJCSAqLworCQkJbWVtY3B5KCpwa3RfZGF0YSwgbmV0YnVmICsgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpICsgc2l6ZW9mKHN0cnVjdCBycGNhcF9wa3RoZHIpLCAoKnBrdF9oZWFkZXIpLT5jYXBsZW4pOworCisJCQkvKiBXZSdyZSB1c2luZyBVRFAsIHNvIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBjb3VudGVyIG9mIHRoZSBwYWNrZXRzIGRyb3BwZWQgYnkgdGhlIG5ldHdvcmsgKi8KKwkJCW5wa3QgPSBudG9obChuZXRfcGt0X2hlYWRlci0+bnBrdCk7CisKKwkJCWlmIChtZC0+VG90Q2FwdCAhPSBucGt0KQorCQkJeworCQkJCW1kLT5Ub3ROZXREcm9wcyArPSAobnBrdCAtIG1kLT5Ub3RDYXB0KTsKKwkJCQltZC0+VG90Q2FwdCA9IG5wa3Q7CisJCQl9CisKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIEluIGNhc2Ugb2YgVENQLCByZWFkIHRoZSByZW1haW5pbmcgb2YgdGhlIHBhY2tldCBmcm9tIHRoZSBzb2NrZXQgKi8KKwkJCW5yZWFkID0gc29ja19yZWN2KG1kLT5ybXRfc29ja2RhdGEsICpwa3RfZGF0YSwKKwkJCSAgICAoKnBrdF9oZWFkZXIpLT5jYXBsZW4sIFNPQ0tfUkVDRUlWRUFMTF9ZRVMsCisJCQkgICAgcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJCWlmIChucmVhZCA9PSAtMSkKKwkJCQlyZXR1cm4gLTE7CisJCQl0b3RyZWFkICs9IG5yZWFkOworCisJCQkvKiBDaGVja3MgaWYgYWxsIHRoZSBkYXRhIGhhcyBiZWVuIHJlYWQ7IGlmIG5vdCwgZGlzY2FyZCB0aGUgZGF0YSBpbiBleGNlc3MgKi8KKwkJCS8qIFRoaXMgY2hlY2sgaGFzIHRvIGJlIGRvbmUgb25seSBvbiBUQ1AgY29ubmVjdGlvbnMgKi8KKwkJCWlmICh0b3RyZWFkICE9IG50b2hsKGhlYWRlci0+cGxlbikpCisJCQkJc29ja19kaXNjYXJkKG1kLT5ybXRfc29ja2RhdGEsIG50b2hsKGhlYWRlci0+cGxlbikgLSB0b3RyZWFkLCBOVUxMLCAwKTsKKwkJfQorCisKKwkJLyogUGFja2V0IHJlYWQgc3VjY2Vzc2Z1bGx5ICovCisJCXJldHVybiAxOworCX0KKwllbHNlCisJeworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlJlY2VpdmVkIGEgcGFja2V0IHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGludGVybmFsIGJ1ZmZlciBzaXplLiIpOworCQlyZXR1cm4gLTE7CisJfQorCit9CisKKy8qIFxpbmdyb3VwIHJlbW90ZV9wcmlfZnVuYworICoKKyAqIFxicmllZiBJdCByZWFkcyBhIHBhY2tldCBmcm9tIHRoZSBuZXR3b3JrIHNvY2tldC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2V2ZXJhbCBwY2FwX3JlYWQoKSB3aGVuIHRoZXkgZGV0ZWN0IHRoYXQKKyAqIHdlIGhhdmUgYSByZW1vdGUgY2FwdHVyZSBhbmQgdGhleSBhcmUgdGhlIGNsaWVudCBzaWRlLiBJbiB0aGF0IGNhc2UsIHRoZXkgbmVlZAorICogdG8gcmVhZCBwYWNrZXRzIGZyb20gdGhlIHNvY2tldC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlbGllcyBvbiB0aGUgcGNhcF9yZWFkX25vY2JfcmVtb3RlIHRvIGRlbGl2ZXIgcGFja2V0cy4gVGhlCisgKiBkaWZmZXJlbmNlLCBoZXJlLCBpcyB0aGF0IGFzIHNvb24gYXMgYSBwYWNrZXQgaXMgcmVhZCwgaXQgaXMgZGVsaXZlcmVkCisgKiB0byB0aGUgYXBwbGljYXRpb24gYnkgbWVhbnMgb2YgYSBjYWxsYmFjayBmdW5jdGlvbi4KKyAqCisgKiBQYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzIGFyZSBleGFjdGx5IHRoZSBzYW1lIG9mIHRoZSBwY2FwX3JlYWQoKS4KKyAqLworc3RhdGljIGludCBwY2FwX3JlYWRfcmVtb3RlKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCit7CisJc3RydWN0IHBjYXBfcGt0aGRyICpwa3RfaGVhZGVyOworCXVfY2hhciAqcGt0X2RhdGE7CisJaW50IG4gPSAwOworCisJd2hpbGUgKChuIDwgY250KSB8fCAoY250IDwgMCkpCisJeworCQlpZiAocGNhcF9yZWFkX25vY2JfcmVtb3RlKHAsICZwa3RfaGVhZGVyLCAmcGt0X2RhdGEpID09IDEpCisJCXsKKwkJCSgqY2FsbGJhY2spKHVzZXIsIHBrdF9oZWFkZXIsIHBrdF9kYXRhKTsKKwkJCW4rKzsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gbjsKKwl9CisJcmV0dXJuIG47Cit9CisKKy8qIFxpbmdyb3VwIHJlbW90ZV9wcmlfZnVuYworICoKKyAqIFxicmllZiBJdCBzZW5kcyBhIENMT1NFIGNvbW1hbmQgdG8gdGhlIGNhcHR1cmUgc2VydmVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgd2FudHMgdG8gY2xvc2UgYSBwY2FwX3QgYWRhcHRlci4KKyAqIEluIGNhc2Ugd2UncmUgY2FwdHVyaW5nIGZyb20gdGhlIG5ldHdvcmssIGl0IHNlbmRzIGEgY29tbWFuZCB0byB0aGUgb3RoZXIKKyAqIHBlZXIgdGhhdCBzYXlzICdvaywgbGV0J3Mgc3RvcCBjYXB0dXJpbmcnLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSB1c2VyIGNhbGxzIHRoZSBwY2FwX2Nsb3NlKCkuCisgKgorICogUGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlcyBhcmUgZXhhY3RseSB0aGUgc2FtZSBvZiB0aGUgcGNhcF9jbG9zZSgpLgorICoKKyAqIFx3YXJuaW5nIFNpbmNlIHdlJ3JlIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24sIHdlIGRvIG5vdCBjaGVjayBmb3IgZXJyb3JzLgorICovCitzdGF0aWMgdm9pZCBwY2FwX2NsZWFudXBfcmVtb3RlKHBjYXBfdCAqZnApCit7CisJc3RydWN0IHJwY2FwX2hlYWRlciBoZWFkZXI7CQkvKiBoZWFkZXIgb2YgdGhlIFJQQ0FQIHBhY2tldCAqLworCXN0cnVjdCBhY3RpdmVob3N0cyAqdGVtcDsJCS8qIHRlbXAgdmFyIG5lZWRlZCB0byBzY2FuIHRoZSBob3N0IGxpc3QgY2hhaW4sIHRvIGRldGVjdCBpZiB3ZSdyZSBpbiBhY3RpdmUgbW9kZSAqLworCWludCBhY3RpdmUgPSAwOwkJCQkJLyogYWN0aXZlIG1vZGUgb3Igbm90PyAqLworCXN0cnVjdCBwY2FwX21kICptZDsJCQkJLyogc3RydWN0dXJlIHVzZWQgd2hlbiBkb2luZyBhIHJlbW90ZSBsaXZlIGNhcHR1cmUgKi8KKworCW1kID0gKHN0cnVjdCBwY2FwX21kICopICgodV9jaGFyKilmcC0+cHJpdiArIHNpemVvZihzdHJ1Y3QgcGNhcF93aW4pKTsKKworCS8qIGRldGVjdCBpZiB3ZSdyZSBpbiBhY3RpdmUgbW9kZSAqLworCXRlbXAgPSBhY3RpdmVIb3N0czsKKwl3aGlsZSAodGVtcCkKKwl7CisJCWlmICh0ZW1wLT5zb2NrY3RybCA9PSBtZC0+cm10X3NvY2tjdHJsKQorCQl7CisJCQlhY3RpdmUgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJdGVtcCA9IHRlbXAtPm5leHQ7CisJfQorCisJaWYgKCFhY3RpdmUpCisJeworCQlycGNhcF9jcmVhdGVoZHIoJmhlYWRlciwgUlBDQVBfTVNHX0NMT1NFLCAwLCAwKTsKKworCQkvKiBJIGRvbid0IGNoZWNrIGZvciBlcnJvcnMsIHNpbmNlIEknbSBnb2luZyB0byBjbG9zZSBldmVyeXRoaW5nICovCisJCXNvY2tfc2VuZChtZC0+cm10X3NvY2tjdHJsLCAoY2hhciAqKSZoZWFkZXIsIHNpemVvZihzdHJ1Y3QgcnBjYXBfaGVhZGVyKSwgTlVMTCwgMCk7CisJfQorCWVsc2UKKwl7CisJCXJwY2FwX2NyZWF0ZWhkcigmaGVhZGVyLCBSUENBUF9NU0dfRU5EQ0FQX1JFUSwgMCwgMCk7CisKKwkJLyogSSBkb24ndCBjaGVjayBmb3IgZXJyb3JzLCBzaW5jZSBJJ20gZ29pbmcgdG8gY2xvc2UgZXZlcnl0aGluZyAqLworCQlzb2NrX3NlbmQobWQtPnJtdF9zb2NrY3RybCwgKGNoYXIgKikmaGVhZGVyLCBzaXplb2Yoc3RydWN0IHJwY2FwX2hlYWRlciksIE5VTEwsIDApOworCisJCS8qIHdhaXQgZm9yIHRoZSBhbnN3ZXIgKi8KKwkJLyogRG9uJ3QgY2hlY2sgd2hhdCB3ZSBnb3QsIHNpbmNlIHRoZSBwcmVzZW50IGxpYnBjYXAgZG9lcyBub3QgdXNlcyB0aGlzIHBjYXBfdCBhbnltb3JlICovCisJCXNvY2tfcmVjdihtZC0+cm10X3NvY2tjdHJsLCAoY2hhciAqKSZoZWFkZXIsIHNpemVvZihzdHJ1Y3QgcnBjYXBfaGVhZGVyKSwgU09DS19SRUNFSVZFQUxMX1lFUywgTlVMTCwgMCk7CisKKwkJaWYgKG50b2hsKGhlYWRlci5wbGVuKSAhPSAwKQorCQkJc29ja19kaXNjYXJkKG1kLT5ybXRfc29ja2N0cmwsIG50b2hsKGhlYWRlci5wbGVuKSwgTlVMTCwgMCk7CisJfQorCisJaWYgKG1kLT5ybXRfc29ja2RhdGEpCisJeworCQlzb2NrX2Nsb3NlKG1kLT5ybXRfc29ja2RhdGEsIE5VTEwsIDApOworCQltZC0+cm10X3NvY2tkYXRhID0gMDsKKwl9CisKKwlpZiAoKCFhY3RpdmUpICYmIChtZC0+cm10X3NvY2tjdHJsKSkKKwkJc29ja19jbG9zZShtZC0+cm10X3NvY2tjdHJsLCBOVUxMLCAwKTsKKworCW1kLT5ybXRfc29ja2N0cmwgPSAwOworCisJaWYgKG1kLT5jdXJyZW50ZmlsdGVyKQorCXsKKwkJZnJlZShtZC0+Y3VycmVudGZpbHRlcik7CisJCW1kLT5jdXJyZW50ZmlsdGVyID0gTlVMTDsKKwl9CisKKwkvKiBUbyBhdm9pZCBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIG51bWJlciBvZiBzb2NrX2luaXQoKSAqLworCXNvY2tfY2xlYW51cCgpOworfQorCisvKiBcaW5ncm91cCByZW1vdGVfcHJpX2Z1bmMKKyAqCisgKiBcYnJpZWYgSXQgcmV0cmlldmVzIG5ldHdvcmsgc3RhdGlzdGljcyBmcm9tIHRoZSBvdGhlciBwZWVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMganVzdCBhIHZvaWQgY29pbnRhaW5lciwgc2luY2UgdGhlIHdvcmsgaXMgZG9uZSBieSB0aGUgcnBjYXBfc3RhdHNfcmVtb3RlKCkuCisgKiBTZWUgdGhhdCBmdW5jaW9uIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogUGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlcyBhcmUgZXhhY3RseSB0aGUgc2FtZSBvZiB0aGUgcGNhcF9zdGF0cygpLgorICovCitzdGF0aWMgaW50IHBjYXBfc3RhdHNfcmVtb3RlKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpCit7CisJc3RydWN0IHBjYXBfc3RhdCAqcmV0dmFsOworCisJcmV0dmFsID0gcnBjYXBfc3RhdHNfcmVtb3RlKHAsIHBzLCBQQ0FQX1NUQVRTX1NUQU5EQVJEKTsKKworCWlmIChyZXR2YWwpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCisjaWZkZWYgX1dJTjMyCisvKiBcaW5ncm91cCByZW1vdGVfcHJpX2Z1bmMKKyAqCisgKiBcYnJpZWYgSXQgcmV0cmlldmVzIG5ldHdvcmsgc3RhdGlzdGljcyBmcm9tIHRoZSBvdGhlciBwZWVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMganVzdCBhIHZvaWQgY29pbnRhaW5lciwgc2luY2UgdGhlIHdvcmsgaXMgZG9uZSBieSB0aGUgcnBjYXBfc3RhdHNfcmVtb3RlKCkuCisgKiBTZWUgdGhhdCBmdW5jaW9uIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogUGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlcyBhcmUgZXhhY3RseSB0aGUgc2FtZSBvZiB0aGUgcGNhcF9zdGF0c19leCgpLgorICovCitzdGF0aWMgc3RydWN0IHBjYXBfc3RhdCAqcGNhcF9zdGF0c19leF9yZW1vdGUocGNhcF90ICpwLCBpbnQgKnBjYXBfc3RhdF9zaXplKQoreworCSpwY2FwX3N0YXRfc2l6ZSA9IHNpemVvZiAocC0+c3RhdCk7CisKKwkvKiBQQ0FQX1NUQVRTX0VYICh0aGlyZCBwYXJhbSkgbWVhbnMgJ2V4dGVuZGVkIHBjYXBfc3RhdHMoKScgKi8KKwlyZXR1cm4gKHJwY2FwX3N0YXRzX3JlbW90ZShwLCAmKHAtPnN0YXQpLCBQQ0FQX1NUQVRTX0VYKSk7Cit9CisjZW5kaWYKKworLyogXGluZ3JvdXAgcmVtb3RlX3ByaV9mdW5jCisgKgorICogXGJyaWVmIEl0IHJldHJpZXZlcyBuZXR3b3JrIHN0YXRpc3RpY3MgZnJvbSB0aGUgb3RoZXIgcGVlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIG1vZGVzOgorICogLSBQQ0FQX1NUQVRTX1NUQU5EQVJEOiBpZiB3ZSB3YW50IGp1c3Qgc3RhbmRhcmQgc3RhdGlzdGljcyAoaS5lLiB0aGUgcGNhcF9zdGF0cygpICkKKyAqIC0gUENBUF9TVEFUU19FWDogaWYgd2Ugd2FudCBleHRlbmRlZCBzdGF0aXN0aWNzIChpLmUuIHRoZSBwY2FwX3N0YXRzX2V4KCkgKQorICoKKyAqIFRoaXMgJ21vZGUnIHBhcmFtZXRlciBpcyBuZWVkZWQgYmVjYXVzZSBpbiB0aGUgc3RhbmRhcmQgcGNhcF9zdGF0cygpIHRoZSB2YXJpYWJsZSB0aGF0IGtlZXBzIHRoZQorICogc3RhdGlzdGljcyBpcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIuIFVuZm9ydHVuYXRlbHksIHRoaXMgc3RydWN0dXJlIGhhcyBiZWVuIGV4dGVuZGVkIGluIG9yZGVyCisgKiB0byBrZWVwIG5ldyBzdGF0cy4gSG93ZXZlciwgaWYgdGhlIHVzZXIgaGFzIGEgc21hbGxlciBzdHJ1Y3R1cmUgYW5kIGl0IHBhc3NlcyBpdCB0byB0aGUgcGNhcF9zdGF0cywKKyAqIHRoaWQgZnVuY3Rpb24gd2lsbCB0cnkgdG8gZmlsbCBpbiBtb3JlIGRhdGEgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlLCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbgorICogZ29lcyBpbiBtZW1vcnkgb3ZlcmZsb3cuCisgKiBTbywgd2UgbmVlZCB0byBrbm93IGl0IHdlIGhhdmUgdG8gY29weSBqdXN0IHRoZSBzdGFuZGFyZCBmaWVsZHMsIG9yIHRoZSBleHRlbmRlZCBmaWVsZHMgYXMgd2VsbC4KKyAqCisgKiBJbiBjYXNlIHdlIHdhbnQgdG8gY29weSB0aGUgZXh0ZW5kZWQgZmllbGRzIGFzIHdlbGwsIHRoZSBwcm9ibGVtIG9mIG1lbW9yeSBvdmVyZmxvdyBkb2VzIG5vCisgKiBsb25nZXIgZXhpc3QgYmVjYXVzZSB0aGUgc3RydWN0dXJlIHBjYXBfc3RhdCBpcyBubyBsb25nZXIgYWxsb2NhdGVkIGJ5IHRoZSBwcm9ncmFtOworICogaXQgaXMgYWxsb2NhdGVkIGJ5IHRoZSBsaWJyYXJ5IGluc3RlYWQuCisgKgorICogXHBhcmFtIHA6IHRoZSBwY2FwX3Qgc3RydWN0dXJlIHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCisgKgorICogXHBhcmFtIHBzOiBhICdwY2FwX3N0YXQnIHN0cnVjdHVyZSwgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcGNhcF9zdGF0KCksIGluIHdoaWNoCisgKiB0aGUgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgdXNlci4gSW4gY2FzZSBvZiBwY2FwX3N0YXRzX2V4LCB0aGlzIHN0cnVjdHVyZSBhbmQgdGhlCisgKiBmdW5jdGlvbiByZXR1cm4gdmFsdWUgcG9pbnQgdG8gdGhlIHNhbWUgdmFyaWFibGUuCisgKgorICogXHBhcmFtIG1vZGU6IG9uZSBvZiBQQ0FQX1NUQVRTX1NUQU5EQVJEIG9yIFBDQVBfU1RBVFNfRVguCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHRoYXQga2VlcHMgdGhlIHN0YXRpc3RpY3MsIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyAqIFRoZSBlcnJvciBzdHJpbmcgaXMgcGxhY2VkIGluIHRoZSBwY2FwX3Qgc3RydWN0dXJlLgorICovCitzdGF0aWMgc3RydWN0IHBjYXBfc3RhdCAqcnBjYXBfc3RhdHNfcmVtb3RlKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMsIGludCBtb2RlKQoreworCXN0cnVjdCBycGNhcF9oZWFkZXIgaGVhZGVyOwkJLyogaGVhZGVyIG9mIHRoZSBSUENBUCBwYWNrZXQgKi8KKwlzdHJ1Y3QgcnBjYXBfc3RhdHMgbmV0c3RhdHM7CQkvKiBzdGF0aXN0aWNzIHNlbnQgb24gdGhlIG5ldHdvcmsgKi8KKwl1aW50MzIgdG90cmVhZCA9IDA7CQkJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBwYXlsb2FkIHJlYWQgZnJvbSB0aGUgc29ja2V0ICovCisJaW50IG5yZWFkOworCWludCByZXR2YWw7CQkJCS8qIHRlbXAgdmFyaWFibGUgd2hpY2ggc3RvcmVzIGZ1bmN0aW9ucyByZXR1cm4gdmFsdWUgKi8KKwlzdHJ1Y3QgcGNhcF9tZCAqbWQ7CQkJLyogc3RydWN0dXJlIHVzZWQgd2hlbiBkb2luZyBhIHJlbW90ZSBsaXZlIGNhcHR1cmUgKi8KKworCW1kID0gKHN0cnVjdCBwY2FwX21kICopICgodV9jaGFyKilwLT5wcml2ICsgc2l6ZW9mKHN0cnVjdCBwY2FwX3dpbikpOworCisJLyoKKwkgKiBJZiB0aGUgY2FwdHVyZSBoYXMgc3RpbGwgdG8gc3RhcnQsIHdlIGNhbm5vdCBhc2sgc3RhdGlzdGljcyB0byB0aGUgb3RoZXIgcGVlciwKKwkgKiBzbyB3ZSByZXR1cm4gYSBmYWtlIG51bWJlcgorCSAqLworCWlmICghbWQtPnJtdF9jYXBzdGFydGVkKQorCXsKKwkJaWYgKG1vZGUgPT0gUENBUF9TVEFUU19TVEFOREFSRCkKKwkJeworCQkJcHMtPnBzX2Ryb3AgPSAwOworCQkJcHMtPnBzX2lmZHJvcCA9IDA7CisJCQlwcy0+cHNfcmVjdiA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcy0+cHNfY2FwdCA9IDA7CisJCQlwcy0+cHNfZHJvcCA9IDA7CisJCQlwcy0+cHNfaWZkcm9wID0gMDsKKwkJCXBzLT5wc19uZXRkcm9wID0gMDsKKwkJCXBzLT5wc19yZWN2ID0gMDsKKwkJCXBzLT5wc19zZW50ID0gMDsKKwkJfQorCisJCXJldHVybiBwczsKKwl9CisKKwlycGNhcF9jcmVhdGVoZHIoJmhlYWRlciwgUlBDQVBfTVNHX1NUQVRTX1JFUSwgMCwgMCk7CisKKwkvKiBTZW5kIHRoZSBQQ0FQX1NUQVRTIGNvbW1hbmQgKi8KKwlpZiAoc29ja19zZW5kKG1kLT5ybXRfc29ja2N0cmwsIChjaGFyICopJmhlYWRlciwgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpLCBwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKQorCQlnb3RvIGVycm9yOworCisJLyogUmVjZWl2ZSB0aGUgUlBDQVAgc3RhdHMgcmVwbHkgbWVzc2FnZSAqLworCWlmIChzb2NrX3JlY3YobWQtPnJtdF9zb2NrY3RybCwgKGNoYXIgKikmaGVhZGVyLCBzaXplb2Yoc3RydWN0IHJwY2FwX2hlYWRlciksIFNPQ0tfUkVDRUlWRUFMTF9ZRVMsIHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgPT0gLTEpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaXMgY29ycmVjdCAqLworCXJldHZhbCA9IHJwY2FwX2NoZWNrbXNnKHAtPmVycmJ1ZiwgbWQtPnJtdF9zb2NrY3RybCwgJmhlYWRlciwgUlBDQVBfTVNHX1NUQVRTX1JFUExZLCBSUENBUF9NU0dfRVJST1IsIDApOworCisJaWYgKHJldHZhbCAhPSBSUENBUF9NU0dfU1RBVFNfUkVQTFkpCQkvKiB0aGUgbWVzc2FnZSBpcyBub3QgdGhlIG9uZSBleHBlY3RlZCAqLworCXsKKwkJc3dpdGNoIChyZXR2YWwpCisJCXsKKwkJY2FzZSAtMzoJCS8qIFVucmVjb3ZlcmFibGUgbmV0d29yayBlcnJvciAqLworCQljYXNlIC0yOgkJLyogVGhlIG90aGVyIGVuZHBvaW50IHNlbmQgYSBtZXNzYWdlIHRoYXQgaXMgbm90IGFsbG93ZWQgaGVyZSAqLworCQljYXNlIC0xOgkJLyogVGhlIG90aGVyIGVuZHBvaW50IGhhcyBhIHZlcnNpb24gbnVtYmVyIHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdXIgKi8KKwkJCWdvdG8gZXJyb3I7CisKKwkJY2FzZSBSUENBUF9NU0dfRVJST1I6CQkvKiBUaGUgb3RoZXIgZW5kcG9pbnQgcmVwb3J0ZWQgYW4gZXJyb3IgKi8KKwkJCS8qIFVwZGF0ZSB0b3RyZWFkLCBzaW5jZSB0aGUgcnBjYXBfY2hlY2ttc2coKSBhbHJlYWR5IHB1cmdlZCB0aGUgYnVmZmVyICovCisJCQl0b3RyZWFkID0gbnRvaGwoaGVhZGVyLnBsZW4pOworCisJCQkvKiBEbyBub3RoaW5nOyBqdXN0IGV4aXQ7IHRoZSBlcnJvciBjb2RlIGlzIGFscmVhZHkgaW50byB0aGUgZXJyYnVmICovCisJCQlnb3RvIGVycm9yOworCisJCWRlZmF1bHQ6CisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkludGVybmFsIGVycm9yIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJbnJlYWQgPSBzb2NrX3JlY3YobWQtPnJtdF9zb2NrY3RybCwgKGNoYXIgKikmbmV0c3RhdHMsCisJICAgIHNpemVvZihzdHJ1Y3QgcnBjYXBfc3RhdHMpLCBTT0NLX1JFQ0VJVkVBTExfWUVTLAorCSAgICBwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpOworCWlmIChucmVhZCA9PSAtMSkKKwkJZ290byBlcnJvcjsKKwl0b3RyZWFkICs9IG5yZWFkOworCisJaWYgKG1vZGUgPT0gUENBUF9TVEFUU19TVEFOREFSRCkKKwl7CisJCXBzLT5wc19kcm9wID0gbnRvaGwobmV0c3RhdHMua3JubGRyb3ApOworCQlwcy0+cHNfaWZkcm9wID0gbnRvaGwobmV0c3RhdHMuaWZkcm9wKTsKKwkJcHMtPnBzX3JlY3YgPSBudG9obChuZXRzdGF0cy5pZnJlY3YpOworCX0KKwllbHNlCisJeworCQlwcy0+cHNfY2FwdCA9IG1kLT5Ub3RDYXB0OworCQlwcy0+cHNfZHJvcCA9IG50b2hsKG5ldHN0YXRzLmtybmxkcm9wKTsKKwkJcHMtPnBzX2lmZHJvcCA9IG50b2hsKG5ldHN0YXRzLmlmZHJvcCk7CisJCXBzLT5wc19uZXRkcm9wID0gbWQtPlRvdE5ldERyb3BzOworCQlwcy0+cHNfcmVjdiA9IG50b2hsKG5ldHN0YXRzLmlmcmVjdik7CisJCXBzLT5wc19zZW50ID0gbnRvaGwobmV0c3RhdHMuc3ZyY2FwdCk7CisJfQorCisJLyogQ2hlY2tzIGlmIGFsbCB0aGUgZGF0YSBoYXMgYmVlbiByZWFkOyBpZiBub3QsIGRpc2NhcmQgdGhlIGRhdGEgaW4gZXhjZXNzICovCisJaWYgKHRvdHJlYWQgIT0gbnRvaGwoaGVhZGVyLnBsZW4pKQorCXsKKwkJaWYgKHNvY2tfZGlzY2FyZChtZC0+cm10X3NvY2tjdHJsLCBudG9obChoZWFkZXIucGxlbikgLSB0b3RyZWFkLCBOVUxMLCAwKSA9PSAxKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gcHM7CisKK2Vycm9yOgorCWlmICh0b3RyZWFkICE9IG50b2hsKGhlYWRlci5wbGVuKSkKKwkJc29ja19kaXNjYXJkKG1kLT5ybXRfc29ja2N0cmwsIG50b2hsKGhlYWRlci5wbGVuKSAtIHRvdHJlYWQsIE5VTEwsIDApOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFxpbmdyb3VwIHJlbW90ZV9wcmlfZnVuYworICoKKyAqIFxicmllZiBJdCBvcGVucyBhIHJlbW90ZSBhZGFwdGVyIGJ5IG9wZW5pbmcgYW4gUlBDQVAgY29ubmVjdGlvbiBhbmQgc28gb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGJhc2ljYWxseSB0aGUgam9iIG9mIHBjYXBfb3Blbl9saXZlKCkgZm9yIGEgcmVtb3RlIGludGVyZmFjZS4KKyAqIEluIG90aGVyIHdvcmRzLCB3ZSBoYXZlIGEgcGNhcF9yZWFkIGZvciB3aW4zMiwgd2hpY2ggcmVhZHMgcGFja2V0cyBmcm9tIE5QRiwKKyAqIGFub3RoZXIgZm9yIExJTlVYLCBhbmQgc28gb24uIE5vdywgd2UgaGF2ZSBhIHBjYXBfb3BlbnNvdXJjZV9yZW1vdGUoKSBhcyB3ZWxsLgorICogVGhlIGRpZmZlcmVuY2UsIGhlcmUsIGlzIHRoZSBjYXB0dXJlIHRocmVhZCBkb2VzIG5vdCBzdGFydCB1bnRpbCB0aGUKKyAqIHBjYXBfc3RhcnRjYXB0dXJlX3JlbW90ZSgpIGlzIGNhbGxlZC4KKyAqCisgKiBUaGlzIGlzIGJlY2F1c2UsIGluIHJlbW90ZSBjYXB0dXJlLCB3ZSBjYW5ub3Qgc3RhcnQgY2FwdHVyaW5nIGRhdGEgYXMgc29vbiBhZCB0aGUKKyAqICdvcGVuIGFkYXB0ZXInIGNvbW1hbmQgaXMgc2VudC4gU3VwcG9zZSB0aGUgcmVtb3RlIGFkYXB0ZXIgaXMgYWxyZWFkeSBvdmVybG9hZGVkOworICogaWYgd2Ugc3RhcnQgYSBjYXB0dXJlICh3aGljaCwgYnkgZGVmYXVsdCwgaGFzIGEgTlVMTCBmaWx0ZXIpIHRoZSBuZXcgdHJhZmZpYyBjYW4KKyAqIHNhdHVyYXRlIHRoZSBuZXR3b3JrLgorICoKKyAqIEluc3RlYWQsIHdlIHdhbnQgdG8gIm9wZW4iIHRoZSBhZGFwdGVyLCB0aGVuIHNlbmQgYSAic3RhcnQgY2FwdHVyZSIgY29tbWFuZCBvbmx5CisgKiB3aGVuIHdlJ3JlIHJlYWR5IHRvIHN0YXJ0IHRoZSBjYXB0dXJlLgorICogVGhpcyBmdW50aW9uIGRvZXMgdGhpcyBqb2I6IGl0IHNlbmRzIGEgIm9wZW4gYWRhcHRlciIgY29tbWFuZCAoYWNjb3JkaW5nIHRvIHRoZQorICogUlBDQVAgcHJvdG9jb2wpLCBidXQgaXQgZG9lcyBub3Qgc3RhcnQgdGhlIGNhcHR1cmUuCisgKgorICogU2luY2UgdGhlIG90aGVyIGxpYnBjYXAgZnVuY3Rpb25zIGRvIG5vdCBzaGFyZSB0aGlzIHdheSBvZiBsaWZlLCB3ZSBoYXZlIHRvIG1ha2UKKyAqIHNvbWUgZGlydHkgdGhpbmdzIGluIG9yZGVyIHRvIG1ha2UgZXZlcnl0aW5nIHdvcmtpbmcuCisgKgorICogXHBhcmFtIGZwOiBBIHBvaW50ZXIgdG8gYSBwY2FwX3Qgc3RydWN0dXJlIHRoYXQgaGFzIGJlZW4gcHJldmlvdXNseSBjcmVhdGVkIHdpdGgKKyAqIFxyZWYgcGNhcF9jcmVhdGUoKS4KKyAqIFxwYXJhbSBzb3VyY2U6IHNlZSBwY2FwX29wZW4oKS4KKyAqIFxwYXJhbSBhdXRoOiBzZWUgcGNhcF9vcGVuKCkuCisgKgorICogXHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgLTEgb3RoZXJ3aXNlLiBJbiBjYXNlIG9mIHN1Y2Nlc3MsIHRoZSBwY2FwX3QgcG9pbnRlciBpbiBmcCBjYW4gYmUKKyAqIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIGZvbGxvd2luZyBjYWxscyAocGNhcF9jb21waWxlKCkgYW5kIHNvIG9uKS4gSW4gY2FzZSBvZgorICogcHJvYmxlbXMsIGZwLT5lcnJidWYgY29udGFpbnMgYSB0ZXh0IGV4cGxhbmF0aW9uIG9mIGVycm9yLgorICoKKyAqIFx3YXJuaW5nIEluIGNhc2Ugd2UgY2FsbCB0aGUgcGNhcF9jb21waWxlKCkgYW5kIHRoZSBjYXB0dXJlIGlzIG5vdCBzdGFydGVkLCB0aGUgZmlsdGVyCisgKiB3aWxsIGJlIHNhdmVkIGludG8gdGhlIHBjYXBfdCBzdHJ1Y3R1cmUsIGFuZCBpdCB3aWxsIGJlIHNlbnQgdG8gdGhlIG90aGVyIGhvc3QgbGF0ZXIKKyAqICh3aGVuIHRoZSBwY2FwX3N0YXJ0Y2FwdHVyZV9yZW1vdGUoKSBpcyBjYWxsZWQpLgorICovCitpbnQgcGNhcF9vcGVuc291cmNlX3JlbW90ZShwY2FwX3QgKmZwLCBzdHJ1Y3QgcGNhcF9ybXRhdXRoICphdXRoKQoreworCWNoYXIgaG9zdFtQQ0FQX0JVRl9TSVpFXSwgY3RybHBvcnRbUENBUF9CVUZfU0laRV0sIGlmYWNlW1BDQVBfQlVGX1NJWkVdOworCisJY2hhciBzZW5kYnVmW1JQQ0FQX05FVEJVRl9TSVpFXTsJLyogdGVtcG9yYXJ5IGJ1ZmZlciBpbiB3aGljaCBkYXRhIHRvIGJlIHNlbnQgaXMgYnVmZmVyZWQgKi8KKwlpbnQgc2VuZGJ1ZmlkeCA9IDA7CQkJLyogaW5kZXggd2hpY2gga2VlcHMgdGhlIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgYnVmZmVyZWQgKi8KKwl1aW50MzIgdG90cmVhZCA9IDA7CQkJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBwYXlsb2FkIHJlYWQgZnJvbSB0aGUgc29ja2V0ICovCisJaW50IG5yZWFkOworCWludCByZXR2YWw7CQkJCS8qIHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9ucyAqLworCWludCBhY3RpdmUgPSAwOwkJCQkvKiAnMScgaWYgd2UncmUgaW4gYWN0aXZlIG1vZGUgKi8KKworCS8qIHNvY2tldC1yZWxhdGVkIHZhcmlhYmxlcyAqLworCXN0cnVjdCBhZGRyaW5mbyBoaW50czsJCQkvKiB0ZW1wLCBuZWVkZWQgdG8gb3BlbiBhIHNvY2tldCBjb25uZWN0aW9uICovCisJc3RydWN0IGFkZHJpbmZvICphZGRyaW5mbzsJCS8qIHRlbXAsIG5lZWRlZCB0byBvcGVuIGEgc29ja2V0IGNvbm5lY3Rpb24gKi8KKwlTT0NLRVQgc29ja2N0cmwgPSAwOwkJCS8qIHNvY2tldCBkZXNjcmlwdG9yIG9mIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gKi8KKworCS8qIFJQQ0FQLXJlbGF0ZWQgdmFyaWFibGVzICovCisJc3RydWN0IHJwY2FwX2hlYWRlciBoZWFkZXI7CQkvKiBoZWFkZXIgb2YgdGhlIFJQQ0FQIHBhY2tldCAqLworCXN0cnVjdCBycGNhcF9vcGVucmVwbHkgb3BlbnJlcGx5OwkvKiBvcGVuIHJlcGx5IG1lc3NhZ2UgKi8KKworCXN0cnVjdCBwY2FwX21kICptZDsJCQkvKiBzdHJ1Y3R1cmUgdXNlZCB3aGVuIGRvaW5nIGEgcmVtb3RlIGxpdmUgY2FwdHVyZSAqLworCisJbWQgPSAoc3RydWN0IHBjYXBfbWQgKikgKCh1X2NoYXIqKWZwLT5wcml2ICsgc2l6ZW9mKHN0cnVjdCBwY2FwX3dpbikpOworCisKKwkvKgorCSAqIGRldGVybWluZSB0aGUgdHlwZSBvZiB0aGUgc291cmNlIChOVUxMLCBmaWxlLCBsb2NhbCwgcmVtb3RlKQorCSAqIFlvdSBtdXN0IGhhdmUgYSB2YWxpZCBzb3VyY2Ugc3RyaW5nIGV2ZW4gaWYgd2UncmUgaW4gYWN0aXZlIG1vZGUsIGJlY2F1c2Ugb3RoZXJ3aXNlCisJICogdGhlIGNhbGwgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB3aWxsIGZhaWwuCisJICovCisJaWYgKHBjYXBfcGFyc2VzcmNzdHIoZnAtPm9wdC5kZXZpY2UsICZyZXR2YWwsIGhvc3QsIGN0cmxwb3J0LCBpZmFjZSwgZnAtPmVycmJ1ZikgPT0gLTEpCisJCXJldHVybiAtMTsKKworCWlmIChyZXR2YWwgIT0gUENBUF9TUkNfSUZSRU1PVEUpCisJeworCQlwY2FwX3NucHJpbnRmKGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJUaGlzIGZ1bmN0aW9uIGlzIGFibGUgdG8gb3BlbiBvbmx5IHJlbW90ZSBpbnRlcmZhY2VzIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGRyaW5mbyA9IE5VTEw7CisKKwkvKgorCSAqIFdhcm5pbmc6IHRoaXMgY2FsbCBjYW4gYmUgdGhlIGZpcnN0IG9uZSBjYWxsZWQgYnkgdGhlIHVzZXIuCisJICogRm9yIHRoaXMgcmVhc29uLCB3ZSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIFdpblNvY2sgc3VwcG9ydC4KKwkgKi8KKwlpZiAoc29ja19pbml0KGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlzb2NrY3RybCA9IHJwY2FwX3JlbW90ZWFjdF9nZXRzb2NrKGhvc3QsICZhY3RpdmUsIGZwLT5lcnJidWYpOworCWlmIChzb2NrY3RybCA9PSBJTlZBTElEX1NPQ0tFVCkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFhY3RpdmUpCisJeworCQkvKgorCQkgKiBXZSdyZSBub3QgaW4gYWN0aXZlIG1vZGU7IGxldCdzIHRyeSB0byBvcGVuIGEgbmV3CisJCSAqIGNvbnRyb2wgY29ubmVjdGlvbi4KKwkJICovCisJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKKwkJaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworCQloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCisJCWlmICgoY3RybHBvcnQgPT0gTlVMTCkgfHwgKGN0cmxwb3J0WzBdID09IDApKQorCQl7CisJCQkvKiB0aGUgdXNlciBjaG9zZSBub3QgdG8gc3BlY2lmeSB0aGUgcG9ydCAqLworCQkJaWYgKHNvY2tfaW5pdGFkZHJlc3MoaG9zdCwgUlBDQVBfREVGQVVMVF9ORVRQT1JULCAmaGludHMsICZhZGRyaW5mbywgZnAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgPT0gLTEpCisJCQkJcmV0dXJuIC0xOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogdGhlIHVzZXIgY2hvc2Ugbm90IHRvIHNwZWNpZnkgdGhlIHBvcnQgKi8KKwkJCWlmIChzb2NrX2luaXRhZGRyZXNzKGhvc3QsIGN0cmxwb3J0LCAmaGludHMsICZhZGRyaW5mbywgZnAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgPT0gLTEpCisJCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKChzb2NrY3RybCA9IHNvY2tfb3BlbihhZGRyaW5mbywgU09DS09QRU5fQ0xJRU5ULCAwLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSkgPT0gSU5WQUxJRF9TT0NLRVQpCisJCQlnb3RvIGVycm9yOworCisJCWZyZWVhZGRyaW5mbyhhZGRyaW5mbyk7CisJCWFkZHJpbmZvID0gTlVMTDsKKworCQlpZiAocnBjYXBfc2VuZGF1dGgoc29ja2N0cmwsIGF1dGgsIGZwLT5lcnJidWYpID09IC0xKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwkvKgorCSAqIE5vdyBpdCdzIHRpbWUgdG8gc3RhcnQgcGxheWluZyB3aXRoIHRoZSBSUENBUCBwcm90b2NvbAorCSAqIFJQQ0FQIG9wZW4gY29tbWFuZDogY3JlYXRlIHRoZSByZXF1ZXN0IG1lc3NhZ2UKKwkgKi8KKwlpZiAoc29ja19idWZmZXJpemUoTlVMTCwgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpLCBOVUxMLAorCQkmc2VuZGJ1ZmlkeCwgUlBDQVBfTkVUQlVGX1NJWkUsIFNPQ0tCVUZfQ0hFQ0tPTkxZLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSkKKwkJZ290byBlcnJvcjsKKworCXJwY2FwX2NyZWF0ZWhkcigoc3RydWN0IHJwY2FwX2hlYWRlciAqKSBzZW5kYnVmLCBSUENBUF9NU0dfT1BFTl9SRVEsIDAsICh1aW50MzIpIHN0cmxlbihpZmFjZSkpOworCisJaWYgKHNvY2tfYnVmZmVyaXplKGlmYWNlLCAoaW50KSBzdHJsZW4oaWZhY2UpLCBzZW5kYnVmLCAmc2VuZGJ1ZmlkeCwKKwkJUlBDQVBfTkVUQlVGX1NJWkUsIFNPQ0tCVUZfQlVGRkVSSVpFLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSkKKwkJZ290byBlcnJvcjsKKworCWlmIChzb2NrX3NlbmQoc29ja2N0cmwsIHNlbmRidWYsIHNlbmRidWZpZHgsIGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKQorCQlnb3RvIGVycm9yOworCisJLyogUmVjZWl2ZSB0aGUgUlBDQVAgb3BlbiByZXBseSBtZXNzYWdlICovCisJaWYgKHNvY2tfcmVjdihzb2NrY3RybCwgKGNoYXIgKikmaGVhZGVyLCBzaXplb2Yoc3RydWN0IHJwY2FwX2hlYWRlciksIFNPQ0tfUkVDRUlWRUFMTF9ZRVMsIGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpID09IC0xKQorCQlnb3RvIGVycm9yOworCisJLyogQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIGlzIGNvcnJlY3QgKi8KKwlyZXR2YWwgPSBycGNhcF9jaGVja21zZyhmcC0+ZXJyYnVmLCBzb2NrY3RybCwgJmhlYWRlciwgUlBDQVBfTVNHX09QRU5fUkVQTFksIFJQQ0FQX01TR19FUlJPUiwgMCk7CisKKwlpZiAocmV0dmFsICE9IFJQQ0FQX01TR19PUEVOX1JFUExZKQkJLyogdGhlIG1lc3NhZ2UgaXMgbm90IHRoZSBvbmUgZXhwZWN0ZWQgKi8KKwl7CisJCXN3aXRjaCAocmV0dmFsKQorCQl7CisJCWNhc2UgLTM6CQkvKiBVbnJlY292ZXJhYmxlIG5ldHdvcmsgZXJyb3IgKi8KKwkJY2FzZSAtMjoJCS8qIFRoZSBvdGhlciBlbmRwb2ludCBzZW5kIGEgbWVzc2FnZSB0aGF0IGlzIG5vdCBhbGxvd2VkIGhlcmUgKi8KKwkJY2FzZSAtMToJCS8qIFRoZSBvdGhlciBlbmRwb2ludCBoYXMgYSB2ZXJzaW9uIG51bWJlciB0aGF0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb3VyICovCisJCQlnb3RvIGVycm9yOworCisJCWNhc2UgUlBDQVBfTVNHX0VSUk9SOgkJLyogVGhlIG90aGVyIGVuZHBvaW50IHJlcG9ydGVkIGFuIGVycm9yICovCisJCQkvKiBVcGRhdGUgdG90cmVhZCwgc2luY2UgdGhlIHJwY2FwX2NoZWNrbXNnKCkgYWxyZWFkeSBwdXJnZWQgdGhlIGJ1ZmZlciAqLworCQkJdG90cmVhZCA9IG50b2hsKGhlYWRlci5wbGVuKTsKKwkJCS8qIERvIG5vdGhpbmc7IGp1c3QgZXhpdDsgdGhlIGVycm9yIGNvZGUgaXMgYWxyZWFkeSBpbnRvIHRoZSBlcnJidWYgKi8KKwkJCWdvdG8gZXJyb3I7CisKKwkJZGVmYXVsdDoKKwkJCXBjYXBfc25wcmludGYoZnAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkludGVybmFsIGVycm9yIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJbnJlYWQgPSBzb2NrX3JlY3Yoc29ja2N0cmwsIChjaGFyICopJm9wZW5yZXBseSwKKwkgICAgc2l6ZW9mKHN0cnVjdCBycGNhcF9vcGVucmVwbHkpLCBTT0NLX1JFQ0VJVkVBTExfWUVTLAorCSAgICBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwlpZiAobnJlYWQgPT0gLTEpCisJCWdvdG8gZXJyb3I7CisJdG90cmVhZCArPSBucmVhZDsKKworCS8qIFNldCBwcm9wZXIgZmllbGRzIGludG8gdGhlIHBjYXBfdCBzdHJ1Y3QgKi8KKwlmcC0+bGlua3R5cGUgPSBudG9obChvcGVucmVwbHkubGlua3R5cGUpOworCWZwLT50em9mZiA9IG50b2hsKG9wZW5yZXBseS50em9mZik7CisJbWQtPnJtdF9zb2NrY3RybCA9IHNvY2tjdHJsOworCW1kLT5ybXRfY2xpZW50c2lkZSA9IDE7CisKKworCS8qIFRoaXMgY29kZSBpcyBkdXBsaWNhdGVkIGZyb20gdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uICovCisJZnAtPnJlYWRfb3AgPSBwY2FwX3JlYWRfcmVtb3RlOworCWZwLT5zZXRmaWx0ZXJfb3AgPSBwY2FwX3NldGZpbHRlcl9yZW1vdGU7CisJZnAtPmdldG5vbmJsb2NrX29wID0gTlVMTDsJLyogVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgaW4gcmVtb3RlIGNhcHR1cmUgKi8KKwlmcC0+c2V0bm9uYmxvY2tfb3AgPSBOVUxMOwkvKiBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiByZW1vdGUgY2FwdHVyZSAqLworCWZwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfcmVtb3RlOworI2lmZGVmIF9XSU4zMgorCWZwLT5zdGF0c19leF9vcCA9IHBjYXBfc3RhdHNfZXhfcmVtb3RlOworI2VuZGlmCisJZnAtPmNsZWFudXBfb3AgPSBwY2FwX2NsZWFudXBfcmVtb3RlOworCisJLyogQ2hlY2tzIGlmIGFsbCB0aGUgZGF0YSBoYXMgYmVlbiByZWFkOyBpZiBub3QsIGRpc2NhcmQgdGhlIGRhdGEgaW4gZXhjZXNzICovCisJaWYgKHRvdHJlYWQgIT0gbnRvaGwoaGVhZGVyLnBsZW4pKQorCXsKKwkJaWYgKHNvY2tfZGlzY2FyZChzb2NrY3RybCwgbnRvaGwoaGVhZGVyLnBsZW4pIC0gdG90cmVhZCwgTlVMTCwgMCkgPT0gMSkKKwkJCWdvdG8gZXJyb3I7CisJfQorCXJldHVybiAwOworCitlcnJvcjoKKwkvKgorCSAqIFdoZW4gdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQsIHdlIGhhdmUgdG8gY2xvc2UgaXQuIFNvLCBhdCB0aGUKKwkgKiBiZWdpbm5pbmcgb2YgdGhpcyBmdW5jdGlvbiwgaWYgYW4gZXJyb3Igb2NjdXIgd2UgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGgKKwkgKiBhIHJldHVybiBOVUxMOyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCB3ZSBoYXZlIHRvIGNvbWUgaGVyZQorCSAqICgnZ290byBlcnJvcjsnKSBpbiBvcmRlciB0byBjbG9zZSBldmVyeXRoaW5nIHByb3Blcmx5LgorCSAqCisJICogQ2hlY2tzIGlmIGFsbCB0aGUgZGF0YSBoYXMgYmVlbiByZWFkOyBpZiBub3QsIGRpc2NhcmQgdGhlIGRhdGEgaW4gZXhjZXNzCisJICovCisJaWYgKHRvdHJlYWQgIT0gbnRvaGwoaGVhZGVyLnBsZW4pKQorCQlzb2NrX2Rpc2NhcmQoc29ja2N0cmwsIG50b2hsKGhlYWRlci5wbGVuKSAtIHRvdHJlYWQsIE5VTEwsIDApOworCisJaWYgKGFkZHJpbmZvKQorCQlmcmVlYWRkcmluZm8oYWRkcmluZm8pOworCisJaWYgKCFhY3RpdmUpCisJCXNvY2tfY2xvc2Uoc29ja2N0cmwsIE5VTEwsIDApOworCisJcmV0dXJuIC0xOworfQorCisvKiBcaW5ncm91cCByZW1vdGVfcHJpX2Z1bmMKKyAqCisgKiBcYnJpZWYgSXQgc3RhcnRzIGEgcmVtb3RlIGNhcHR1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlcyBzaW5jZSB0aGUgUlBDQVAgcHJvdG9jb2wgZGVjb3VwbGVzIHRoZSAnb3BlbicgZnJvbSB0aGUKKyAqICdzdGFydCBjYXB0dXJlJyBmdW5jdGlvbnMuCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGFsbCB0aGUgcGFyYW1ldGVycyBuZWVkZWQgKHdoaWNoIGhhdmUgYmVlbiBzdG9yZWQgaW50byB0aGUgcGNhcF90IHN0cnVjdHVyZSkKKyAqIGFuZCBzZW5kcyB0aGVtIHRvIHRoZSBzZXJ2ZXIuCisgKiBJZiBldmVyeXRoaW5nIGlzIGZpbmUsIGl0IGNyZWF0ZXMgYSBuZXcgY2hpbGQgdGhyZWFkIHRoYXQgcmVhZHMgZGF0YSBmcm9tIHRoZSBuZXR3b3JrCisgKiBhbmQgcHV0cyBkYXRhIGl0IGludG8gdGhlIHVzZXIgYnVmZmVyLgorICogVGhlIHBjYXBfcmVhZCgpIHdpbGwgcmVhZCBkYXRhIGZyb20gdGhlIHVzZXIgYnVmZmVyLCBhcyB1c3VhbC4KKyAqCisgKiBUaGUgcmVtb3RlIGNhcHR1cmUgYWN0cyBsaWtlIGEgbmV3ICJrZXJuZWwiLCB3aGljaCBwdXRzIHBhY2tldHMgZGlyZWN0bHkgaW50bworICogdGhlIGJ1ZmZlciBwb2ludGVkIGJ5IHBjYXBfdC4KKyAqIEluIGZhY3QsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVseSBvbiBhIGtlcm5lbCB0aGF0IHJlYWRzIHBhY2tldHMgYW5kIHB1dCB0aGVtCisgKiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcjsgaXQgaGFzIHRvIGRvIHRoYXQgb24gaXRzIG93bi4KKyAqCisgKiBccGFyYW0gZnA6IHRoZSBwY2FwX3QgZGVzY3JpcHRvciBvZiB0aGUgZGV2aWNlIGN1cnJlbnRseSBvcGVuLgorICoKKyAqIFxyZXR1cm4gJzAnIGlmIGV2ZXJ5dGhpbmcgaXMgZmluZSwgJy0xJyBvdGhlcndpc2UuIFRoZSBlcnJvciBtZXNzYWdlIChpZiBvbmUpCisgKiBpcyByZXR1cm5lZCBpbnRvIHRoZSAnZXJyYnVmJyBmaWVsZCBvZiB0aGUgcGNhcF90IHN0cnVjdHVyZS4KKyAqLworaW50IHBjYXBfc3RhcnRjYXB0dXJlX3JlbW90ZShwY2FwX3QgKmZwKQoreworCWNoYXIgc2VuZGJ1ZltSUENBUF9ORVRCVUZfU0laRV07CS8qIHRlbXBvcmFyeSBidWZmZXIgaW4gd2hpY2ggZGF0YSB0byBiZSBzZW50IGlzIGJ1ZmZlcmVkICovCisJaW50IHNlbmRidWZpZHggPSAwOwkJCS8qIGluZGV4IHdoaWNoIGtlZXBzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGJ1ZmZlcmVkICovCisJY2hhciBwb3J0ZGF0YVtQQ0FQX0JVRl9TSVpFXTsJCS8qIHRlbXAgdmFyaWFibGUgbmVlZGVkIHRvIGtlZXAgdGhlIG5ldHdvcmsgcG9ydCBmb3IgdGhlIHRoZSBkYXRhIGNvbm5lY3Rpb24gKi8KKwl1aW50MzIgdG90cmVhZCA9IDA7CQkJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBwYXlsb2FkIHJlYWQgZnJvbSB0aGUgc29ja2V0ICovCisJaW50IG5yZWFkOworCWludCByZXR2YWw7CQkJCS8qIHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9ucyAqLworCWludCBhY3RpdmUgPSAwOwkJCQkvKiAnMScgaWYgd2UncmUgaW4gYWN0aXZlIG1vZGUgKi8KKwlzdHJ1Y3QgYWN0aXZlaG9zdHMgKnRlbXA7CQkvKiB0ZW1wIHZhciBuZWVkZWQgdG8gc2NhbiB0aGUgaG9zdCBsaXN0IGNoYWluLCB0byBkZXRlY3QgaWYgd2UncmUgaW4gYWN0aXZlIG1vZGUgKi8KKwljaGFyIGhvc3RbSU5FVDZfQUREUlNUUkxFTiArIDFdOwkvKiBudW1lcmljIG5hbWUgb2YgdGhlIG90aGVyIGhvc3QgKi8KKworCS8qIHNvY2tldC1yZWxhdGVkIHZhcmlhYmxlcyovCisJc3RydWN0IGFkZHJpbmZvIGhpbnRzOwkJCS8qIHRlbXAsIG5lZWRlZCB0byBvcGVuIGEgc29ja2V0IGNvbm5lY3Rpb24gKi8KKwlzdHJ1Y3QgYWRkcmluZm8gKmFkZHJpbmZvOwkJLyogdGVtcCwgbmVlZGVkIHRvIG9wZW4gYSBzb2NrZXQgY29ubmVjdGlvbiAqLworCVNPQ0tFVCBzb2NrZGF0YSA9IDA7CQkJLyogc29ja2V0IGRlc2NyaXB0b3Igb2YgdGhlIGRhdGEgY29ubmVjdGlvbiAqLworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhZGRyOwkJLyogdGVtcCwgbmVlZGVkIHRvIHJldHJpZXZlIHRoZSBuZXR3b3JrIGRhdGEgcG9ydCBjaG9zZW4gb24gdGhlIGxvY2FsIG1hY2hpbmUgKi8KKwlzb2NrbGVuX3Qgc2FkZHJsZW47CQkJLyogdGVtcCwgbmVlZGVkIHRvIHJldHJpZXZlIHRoZSBuZXR3b3JrIGRhdGEgcG9ydCBjaG9zZW4gb24gdGhlIGxvY2FsIG1hY2hpbmUgKi8KKwlpbnQgYWlfZmFtaWx5OwkJCQkvKiB0ZW1wLCBrZWVwcyB0aGUgYWRkcmVzcyBmYW1pbHkgdXNlZCBieSB0aGUgY29udHJvbCBjb25uZWN0aW9uICovCisKKwkvKiBSUENBUC1yZWxhdGVkIHZhcmlhYmxlcyovCisJc3RydWN0IHJwY2FwX2hlYWRlciBoZWFkZXI7CQkJLyogaGVhZGVyIG9mIHRoZSBSUENBUCBwYWNrZXQgKi8KKwlzdHJ1Y3QgcnBjYXBfc3RhcnRjYXByZXEgKnN0YXJ0Y2FwcmVxOwkJLyogc3RhcnQgY2FwdHVyZSByZXF1ZXN0IG1lc3NhZ2UgKi8KKwlzdHJ1Y3QgcnBjYXBfc3RhcnRjYXByZXBseSBzdGFydGNhcHJlcGx5OwkvKiBzdGFydCBjYXB0dXJlIHJlcGx5IG1lc3NhZ2UgKi8KKworCS8qIFZhcmlhYmxlcyByZWxhdGVkIHRvIHRoZSBidWZmZXIgc2V0dGluZyAqLworCWludCByZXMsIGl0ZW1wOworCWludCBzb2NrYnVmc2l6ZSA9IDA7CisKKwlzdHJ1Y3QgcGNhcF9tZCAqbWQ7CQkJLyogc3RydWN0dXJlIHVzZWQgd2hlbiBkb2luZyBhIHJlbW90ZSBsaXZlIGNhcHR1cmUgKi8KKworCW1kID0gKHN0cnVjdCBwY2FwX21kICopICgodV9jaGFyKilmcC0+cHJpdiArIHNpemVvZihzdHJ1Y3QgcGNhcF93aW4pKTsKKworCS8qCisJICogTGV0J3MgY2hlY2sgaWYgc2FtcGxpbmcgaGFzIGJlZW4gcmVxdWlyZWQuCisJICogSWYgc28sIGxldCdzIHNldCBpdCBmaXJzdAorCSAqLworCWlmIChwY2FwX3NldHNhbXBsaW5nX3JlbW90ZShmcCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisKKwkvKiBkZXRlY3QgaWYgd2UncmUgaW4gYWN0aXZlIG1vZGUgKi8KKwl0ZW1wID0gYWN0aXZlSG9zdHM7CisJd2hpbGUgKHRlbXApCisJeworCQlpZiAodGVtcC0+c29ja2N0cmwgPT0gbWQtPnJtdF9zb2NrY3RybCkKKwkJeworCQkJYWN0aXZlID0gMTsKKwkJCWJyZWFrOworCQl9CisJCXRlbXAgPSB0ZW1wLT5uZXh0OworCX0KKworCWFkZHJpbmZvID0gTlVMTDsKKworCS8qCisJICogR2V0cyB0aGUgY29tcGxldGUgc29ja2FkZHIgc3RydWN0dXJlIHVzZWQgaW4gdGhlIGN0cmwgY29ubmVjdGlvbgorCSAqIFRoaXMgaXMgbmVlZGVkIHRvIGdldCB0aGUgYWRkcmVzcyBmYW1pbHkgb2YgdGhlIGNvbnRyb2wgc29ja2V0CisJICogVGlwOiBJIGNhbm5vdCBzYXZlIHRoZSBhaV9mYW1pbHkgb2YgdGhlIGN0cmwgc29jayBpbiB0aGUgcGNhcF90IHN0cnVjdCwKKwkgKiBzaW5jZSB0aGUgY3RybCBzb2NrZXQgY2FuIGFscmVhZHkgYmUgb3BlbiBpbiBjYXNlIG9mIGFjdGl2ZSBtb2RlOworCSAqIHNvIEkgd291bGQgaGF2ZSB0byBjYWxsIGdldHBlZXJuYW1lKCkgYW55d2F5CisJICovCisJc2FkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpOworCWlmIChnZXRwZWVybmFtZShtZC0+cm10X3NvY2tjdHJsLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgJnNhZGRybGVuKSA9PSAtMSkKKwl7CisJCXNvY2tfZ2V0ZXJyb3IoImdldHNvY2tuYW1lKCk6ICIsIGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpOworCQlnb3RvIGVycm9yOworCX0KKwlhaV9mYW1pbHkgPSAoKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICopICZzYWRkciktPnNzX2ZhbWlseTsKKworCS8qIEdldCB0aGUgbnVtZXJpYyBhZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCB3ZSBhcmUgY29ubmVjdGVkIHRvICovCisJaWYgKGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCBzYWRkcmxlbiwgaG9zdCwKKwkJc2l6ZW9mKGhvc3QpLCBOVUxMLCAwLCBOSV9OVU1FUklDSE9TVCkpCisJeworCQlzb2NrX2dldGVycm9yKCJnZXRuYW1laW5mbygpOiAiLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKgorCSAqIERhdGEgY29ubmVjdGlvbiBpcyBvcGVuZWQgYnkgdGhlIHNlcnZlciB0b3dhcmQgdGhlIGNsaWVudCBpZjoKKwkgKiAtIHdlJ3JlIHVzaW5nIFRDUCwgYW5kIHRoZSB1c2VyIHdhbnRzIHVzIHRvIGJlIGluIGFjdGl2ZSBtb2RlCisJICogLSB3ZSdyZSB1c2luZyBVRFAKKwkgKi8KKwlpZiAoKGFjdGl2ZSkgfHwgKG1kLT5ybXRfZmxhZ3MgJiBQQ0FQX09QRU5GTEFHX0RBVEFUWF9VRFApKQorCXsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgc29ja2V0IHRvIHJlY2VpdmUgcGFja2V0cworCQkgKiBXZSBoYXZlIHRvIGRvIHRoYXQgaW1tZWRpYXRlbHksIHNpbmNlIHdlIGhhdmUgdG8gdGVsbCB0aGUgb3RoZXIKKwkJICogZW5kIHdoaWNoIG5ldHdvcmsgcG9ydCB3ZSBwaWNrZWQgdXAKKwkJICovCisJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKKwkJLyogVEVNUCBhZGRyaW5mbyBpcyBOVUxMIGluIGNhc2Ugb2YgYWN0aXZlICovCisJCWhpbnRzLmFpX2ZhbWlseSA9IGFpX2ZhbWlseTsJLyogVXNlIHRoZSBzYW1lIGFkZHJlc3MgZmFtaWx5IG9mIHRoZSBjb250cm9sIHNvY2tldCAqLworCQloaW50cy5haV9zb2NrdHlwZSA9IChtZC0+cm10X2ZsYWdzICYgUENBUF9PUEVORkxBR19EQVRBVFhfVURQKSA/IFNPQ0tfREdSQU0gOiBTT0NLX1NUUkVBTTsKKwkJaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOwkvKiBEYXRhIGNvbm5lY3Rpb24gaXMgb3BlbmVkIGJ5IHRoZSBzZXJ2ZXIgdG93YXJkIHRoZSBjbGllbnQgKi8KKworCQkvKiBMZXQncyB0aGUgc2VydmVyIHBpY2sgdXAgYSBmcmVlIG5ldHdvcmsgcG9ydCBmb3IgdXMgKi8KKwkJaWYgKHNvY2tfaW5pdGFkZHJlc3MoTlVMTCwgIjAiLCAmaGludHMsICZhZGRyaW5mbywgZnAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgPT0gLTEpCisJCQlnb3RvIGVycm9yOworCisJCWlmICgoc29ja2RhdGEgPSBzb2NrX29wZW4oYWRkcmluZm8sIFNPQ0tPUEVOX1NFUlZFUiwKKwkJCTEgLyogbWF4IDEgY29ubmVjdGlvbiBpbiBxdWV1ZSAqLywgZnAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkpID09IElOVkFMSURfU09DS0VUKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBhZGRyaW5mbyBpcyBubyBsb25nZXIgdXNlZCAqLworCQlmcmVlYWRkcmluZm8oYWRkcmluZm8pOworCQlhZGRyaW5mbyA9IE5VTEw7CisKKwkJLyogZ2V0IHRoZSBjb21wbGV0ZSBzb2NrYWRkciBzdHJ1Y3R1cmUgdXNlZCBpbiB0aGUgZGF0YSBjb25uZWN0aW9uICovCisJCXNhZGRybGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKKwkJaWYgKGdldHNvY2tuYW1lKHNvY2tkYXRhLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgJnNhZGRybGVuKSA9PSAtMSkKKwkJeworCQkJc29ja19nZXRlcnJvcigiZ2V0c29ja25hbWUoKTogIiwgZnAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSk7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogR2V0IHRoZSBsb2NhbCBwb3J0IHRoZSBzeXN0ZW0gcGlja2VkIHVwICovCisJCWlmIChnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgc2FkZHJsZW4sIE5VTEwsCisJCQkwLCBwb3J0ZGF0YSwgc2l6ZW9mKHBvcnRkYXRhKSwgTklfTlVNRVJJQ1NFUlYpKQorCQl7CisJCQlzb2NrX2dldGVycm9yKCJnZXRuYW1laW5mbygpOiAiLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdyBpdCdzIHRpbWUgdG8gc3RhcnQgcGxheWluZyB3aXRoIHRoZSBSUENBUCBwcm90b2NvbAorCSAqIFJQQ0FQIHN0YXJ0IGNhcHR1cmUgY29tbWFuZDogY3JlYXRlIHRoZSByZXF1ZXN0IG1lc3NhZ2UKKwkgKi8KKwlpZiAoc29ja19idWZmZXJpemUoTlVMTCwgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpLCBOVUxMLAorCQkmc2VuZGJ1ZmlkeCwgUlBDQVBfTkVUQlVGX1NJWkUsIFNPQ0tCVUZfQ0hFQ0tPTkxZLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSkKKwkJZ290byBlcnJvcjsKKworCXJwY2FwX2NyZWF0ZWhkcigoc3RydWN0IHJwY2FwX2hlYWRlciAqKSBzZW5kYnVmLCBSUENBUF9NU0dfU1RBUlRDQVBfUkVRLCAwLAorCQlzaXplb2Yoc3RydWN0IHJwY2FwX3N0YXJ0Y2FwcmVxKSArIHNpemVvZihzdHJ1Y3QgcnBjYXBfZmlsdGVyKSArIGZwLT5mY29kZS5iZl9sZW4gKiBzaXplb2Yoc3RydWN0IHJwY2FwX2ZpbHRlcmJwZl9pbnNuKSk7CisKKwkvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgbmVlZGVkIHRvIG9wZW4gYW4gYWRhcHRlciByZW1vdGVseSAqLworCXN0YXJ0Y2FwcmVxID0gKHN0cnVjdCBycGNhcF9zdGFydGNhcHJlcSAqKSAmc2VuZGJ1ZltzZW5kYnVmaWR4XTsKKworCWlmIChzb2NrX2J1ZmZlcml6ZShOVUxMLCBzaXplb2Yoc3RydWN0IHJwY2FwX3N0YXJ0Y2FwcmVxKSwgTlVMTCwKKwkJJnNlbmRidWZpZHgsIFJQQ0FQX05FVEJVRl9TSVpFLCBTT0NLQlVGX0NIRUNLT05MWSwgZnAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkpCisJCWdvdG8gZXJyb3I7CisKKwltZW1zZXQoc3RhcnRjYXByZXEsIDAsIHNpemVvZihzdHJ1Y3QgcnBjYXBfc3RhcnRjYXByZXEpKTsKKworCS8qIEJ5IGRlZmF1bHQsIGFwcGx5IGhhbGYgdGhlIHRpbWVvdXQgb24gb25lIHNpZGUsIGhhbGYgb2YgdGhlIG90aGVyICovCisJZnAtPm9wdC50aW1lb3V0ID0gZnAtPm9wdC50aW1lb3V0IC8gMjsKKwlzdGFydGNhcHJlcS0+cmVhZF90aW1lb3V0ID0gaHRvbmwoZnAtPm9wdC50aW1lb3V0KTsKKworCS8qIHBvcnRkYXRhIG9uIHRoZSBvcGVucmVxIGlzIG1lYW5pbmdmdWwgb25seSBpZiB3ZSdyZSBpbiBhY3RpdmUgbW9kZSAqLworCWlmICgoYWN0aXZlKSB8fCAobWQtPnJtdF9mbGFncyAmIFBDQVBfT1BFTkZMQUdfREFUQVRYX1VEUCkpCisJeworCQlzc2NhbmYocG9ydGRhdGEsICIlZCIsIChpbnQgKikmKHN0YXJ0Y2FwcmVxLT5wb3J0ZGF0YSkpOwkvKiBjYXN0IHRvIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZyAqLworCQlzdGFydGNhcHJlcS0+cG9ydGRhdGEgPSBodG9ucyhzdGFydGNhcHJlcS0+cG9ydGRhdGEpOworCX0KKworCXN0YXJ0Y2FwcmVxLT5zbmFwbGVuID0gaHRvbmwoZnAtPnNuYXBzaG90KTsKKwlzdGFydGNhcHJlcS0+ZmxhZ3MgPSAwOworCisJaWYgKG1kLT5ybXRfZmxhZ3MgJiBQQ0FQX09QRU5GTEFHX1BST01JU0NVT1VTKQorCQlzdGFydGNhcHJlcS0+ZmxhZ3MgfD0gUlBDQVBfU1RBUlRDQVBSRVFfRkxBR19QUk9NSVNDOworCWlmIChtZC0+cm10X2ZsYWdzICYgUENBUF9PUEVORkxBR19EQVRBVFhfVURQKQorCQlzdGFydGNhcHJlcS0+ZmxhZ3MgfD0gUlBDQVBfU1RBUlRDQVBSRVFfRkxBR19ER1JBTTsKKwlpZiAoYWN0aXZlKQorCQlzdGFydGNhcHJlcS0+ZmxhZ3MgfD0gUlBDQVBfU1RBUlRDQVBSRVFfRkxBR19TRVJWRVJPUEVOOworCisJc3RhcnRjYXByZXEtPmZsYWdzID0gaHRvbnMoc3RhcnRjYXByZXEtPmZsYWdzKTsKKworCS8qIFBhY2sgdGhlIGNhcHR1cmUgZmlsdGVyICovCisJaWYgKHBjYXBfcGFja19icGZmaWx0ZXIoZnAsICZzZW5kYnVmW3NlbmRidWZpZHhdLCAmc2VuZGJ1ZmlkeCwgJmZwLT5mY29kZSkpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoc29ja19zZW5kKG1kLT5ybXRfc29ja2N0cmwsIHNlbmRidWYsIHNlbmRidWZpZHgsIGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBSZWNlaXZlIHRoZSBSUENBUCBzdGFydCBjYXB0dXJlIHJlcGx5IG1lc3NhZ2UgKi8KKwlpZiAoc29ja19yZWN2KG1kLT5ybXRfc29ja2N0cmwsIChjaGFyICopJmhlYWRlciwgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpLCBTT0NLX1JFQ0VJVkVBTExfWUVTLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJZ290byBlcnJvcjsKKworCS8qIENoZWNrcyBpZiB0aGUgbWVzc2FnZSBpcyBjb3JyZWN0ICovCisJcmV0dmFsID0gcnBjYXBfY2hlY2ttc2coZnAtPmVycmJ1ZiwgbWQtPnJtdF9zb2NrY3RybCwgJmhlYWRlciwgUlBDQVBfTVNHX1NUQVJUQ0FQX1JFUExZLCBSUENBUF9NU0dfRVJST1IsIDApOworCisJaWYgKHJldHZhbCAhPSBSUENBUF9NU0dfU1RBUlRDQVBfUkVQTFkpCQkvKiB0aGUgbWVzc2FnZSBpcyBub3QgdGhlIG9uZSBleHBlY3RlZCAqLworCXsKKwkJc3dpdGNoIChyZXR2YWwpCisJCXsKKwkJY2FzZSAtMzoJCS8qIFVucmVjb3ZlcmFibGUgbmV0d29yayBlcnJvciAqLworCQljYXNlIC0yOgkJLyogVGhlIG90aGVyIGVuZHBvaW50IHNlbmQgYSBtZXNzYWdlIHRoYXQgaXMgbm90IGFsbG93ZWQgaGVyZSAqLworCQljYXNlIC0xOgkJLyogVGhlIG90aGVyIGVuZHBvaW50IGhhcyBhIHZlcnNpb24gbnVtYmVyIHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdXIgKi8KKwkJCWdvdG8gZXJyb3I7CisKKwkJY2FzZSBSUENBUF9NU0dfRVJST1I6CQkvKiBUaGUgb3RoZXIgZW5kcG9pbnQgcmVwb3J0ZWQgYW4gZXJyb3IgKi8KKwkJCS8qIFVwZGF0ZSB0b3RyZWFkLCBzaW5jZSB0aGUgcnBjYXBfY2hlY2ttc2coKSBhbHJlYWR5IHB1cmdlZCB0aGUgYnVmZmVyICovCisJCQl0b3RyZWFkID0gbnRvaGwoaGVhZGVyLnBsZW4pOworCQkJLyogRG8gbm90aGluZzsganVzdCBleGl0OyB0aGUgZXJyb3IgY29kZSBpcyBhbHJlYWR5IGludG8gdGhlIGVycmJ1ZiAqLworCQkJZ290byBlcnJvcjsKKworCQlkZWZhdWx0OgorCQkJcGNhcF9zbnByaW50ZihmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiSW50ZXJuYWwgZXJyb3IiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlucmVhZCA9IHNvY2tfcmVjdihtZC0+cm10X3NvY2tjdHJsLCAoY2hhciAqKSZzdGFydGNhcHJlcGx5LAorCSAgICBzaXplb2Yoc3RydWN0IHJwY2FwX3N0YXJ0Y2FwcmVwbHkpLCBTT0NLX1JFQ0VJVkVBTExfWUVTLAorCSAgICBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwlpZiAobnJlYWQgPT0gLTEpCisJCWdvdG8gZXJyb3I7CisJdG90cmVhZCArPSBucmVhZDsKKworCS8qCisJICogSW4gY2FzZSBvZiBVRFAgZGF0YSBzdHJlYW0sIHRoZSBjb25uZWN0aW9uIGlzIGFsd2F5cyBvcGVuZWQgYnkgdGhlIGRhZW1vbgorCSAqIFNvLCB0aGlzIGNhc2UgaXMgYWxyZWFkeSBjb3ZlcmVkIGJ5IHRoZSBjb2RlIGFib3ZlLgorCSAqIE5vdywgd2UgaGF2ZSBzdGlsbCB0byBoYW5kbGUgVENQIGNvbm5lY3Rpb25zLCBiZWNhdXNlOgorCSAqIC0gaWYgd2UncmUgaW4gYWN0aXZlIG1vZGUsIHdlIGhhdmUgdG8gd2FpdCBmb3IgYSByZW1vdGUgY29ubmVjdGlvbgorCSAqIC0gaWYgd2UncmUgaW4gcGFzc2l2ZSBtb3JlLCB3ZSBoYXZlIHRvIHN0YXJ0IGEgY29ubmVjdGlvbgorCSAqCisJICogV2UgaGF2ZSB0byBkbyBoZSBqb2IgaW4gdHdvIHN0ZXBzIGJlY2F1c2UgaW4gY2FzZSB3ZSdyZSBvcGVuaW5nIGEgVENQIGNvbm5lY3Rpb24sIHdlIGhhdmUKKwkgKiB0byB0ZWxsIHRoZSBwb3J0IHdlJ3JlIHVzaW5nIHRvIHRoZSByZW1vdGUgc2lkZTsgaW4gY2FzZSB3ZSdyZSBhY2NlcHRpbmcgYSBUQ1AKKwkgKiBjb25uZWN0aW9uLCB3ZSBoYXZlIHRvIHdhaXQgdGhpcyBpbmZvIGZyb20gdGhlIHJlbW90ZSBzaWRlLgorCSAqLworCisJaWYgKCEobWQtPnJtdF9mbGFncyAmIFBDQVBfT1BFTkZMQUdfREFUQVRYX1VEUCkpCisJeworCQlpZiAoIWFjdGl2ZSkKKwkJeworCQkJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOworCQkJaGludHMuYWlfZmFtaWx5ID0gYWlfZmFtaWx5OwkJLyogVXNlIHRoZSBzYW1lIGFkZHJlc3MgZmFtaWx5IG9mIHRoZSBjb250cm9sIHNvY2tldCAqLworCQkJaGludHMuYWlfc29ja3R5cGUgPSAobWQtPnJtdF9mbGFncyAmIFBDQVBfT1BFTkZMQUdfREFUQVRYX1VEUCkgPyBTT0NLX0RHUkFNIDogU09DS19TVFJFQU07CisJCQlwY2FwX3NucHJpbnRmKHBvcnRkYXRhLCBQQ0FQX0JVRl9TSVpFLCAiJWQiLCBudG9ocyhzdGFydGNhcHJlcGx5LnBvcnRkYXRhKSk7CisKKwkJCS8qIExldCdzIHRoZSBzZXJ2ZXIgcGljayB1cCBhIGZyZWUgbmV0d29yayBwb3J0IGZvciB1cyAqLworCQkJaWYgKHNvY2tfaW5pdGFkZHJlc3MoaG9zdCwgcG9ydGRhdGEsICZoaW50cywgJmFkZHJpbmZvLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJCQlnb3RvIGVycm9yOworCisJCQlpZiAoKHNvY2tkYXRhID0gc29ja19vcGVuKGFkZHJpbmZvLCBTT0NLT1BFTl9DTElFTlQsIDAsIGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKSA9PSBJTlZBTElEX1NPQ0tFVCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiBhZGRyaW5mbyBpcyBubyBsb25nZXIgdXNlZCAqLworCQkJZnJlZWFkZHJpbmZvKGFkZHJpbmZvKTsKKwkJCWFkZHJpbmZvID0gTlVMTDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVNPQ0tFVCBzb2NrdGVtcDsJLyogV2UgbmVlZCBhbm90aGVyIHNvY2tldCwgc2luY2Ugd2UncmUgZ29pbmcgdG8gYWNjZXB0KCkgYSBjb25uZWN0aW9uICovCisKKwkJCS8qIENvbm5lY3Rpb24gY3JlYXRpb24gKi8KKwkJCXNhZGRybGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKKworCQkJc29ja3RlbXAgPSBhY2NlcHQoc29ja2RhdGEsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCAmc2FkZHJsZW4pOworCisJCQlpZiAoc29ja3RlbXAgPT0gLTEpCisJCQl7CisJCQkJc29ja19nZXRlcnJvcigiYWNjZXB0KCk6ICIsIGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCS8qIE5vdyB0aGF0IEkgYWNjZXB0ZWQgdGhlIGNvbm5lY3Rpb24sIHRoZSBzZXJ2ZXIgc29ja2V0IGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KKwkJCXNvY2tfY2xvc2Uoc29ja2RhdGEsIGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpOworCQkJc29ja2RhdGEgPSBzb2NrdGVtcDsKKwkJfQorCX0KKworCS8qIExldCdzIHNhdmUgdGhlIHNvY2tldCBvZiB0aGUgZGF0YSBjb25uZWN0aW9uICovCisJbWQtPnJtdF9zb2NrZGF0YSA9IHNvY2tkYXRhOworCisJLyogQWxsb2NhdGVzIFdpblBjYXAvbGlicGNhcCB1c2VyIGJ1ZmZlciwgd2hpY2ggaXMgYSBzb2NrZXQgYnVmZmVyIGluIGNhc2Ugb2YgYSByZW1vdGUgY2FwdHVyZSAqLworCS8qIEl0IGhhcyB0aGUgc2FtZSBzaXplIG9mIHRoZSBvbmUgdXNlZCBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgY29ubmVjdGlvbiAqLworCWZwLT5idWZzaXplID0gbnRvaGwoc3RhcnRjYXByZXBseS5idWZzaXplKTsKKworCS8qIExldCdzIGdldCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHNvY2tldCBidWZmZXIgKi8KKwlpdGVtcCA9IHNpemVvZihzb2NrYnVmc2l6ZSk7CisKKwlyZXMgPSBnZXRzb2Nrb3B0KHNvY2tkYXRhLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIChjaGFyICopJnNvY2tidWZzaXplLCAmaXRlbXApOworCWlmIChyZXMgPT0gLTEpCisJeworCQlzb2NrX2dldGVycm9yKCJwY2FwX3N0YXJ0Y2FwdHVyZV9yZW1vdGUoKSIsIGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpOworCQlTT0NLX0FTU0VSVChmcC0+ZXJyYnVmLCAxKTsKKwl9CisKKwkvKgorCSAqIFdhcm5pbmc6IG9uIHNvbWUga2VybmVscyAoZS5nLiBMaW51eCksIHRoZSBzaXplIG9mIHRoZSB1c2VyIGJ1ZmZlciBkb2VzIG5vdCB0YWtlCisJICogaW50byBhY2NvdW50IHRoZSBwY2FwX2hlYWRlciBhbmQgc3VjaCwgYW5kIGl0IGlzIHNldCBlcXVhbCB0byB0aGUgc25hcGxlbi4KKwkgKiBJbiBteSB2aWV3LCB0aGlzIGlzIHdyb25nICh0aGUgbWVhbmluZyBvZiB0aGUgYnVmc2l6ZSBiZWNhbWUgYSBiaXQgc3RyYW5nZSkuCisJICogU28sIGhlcmUgYnVmc2l6ZSBpcyB0aGUgd2hvbGUgc2l6ZSBvZiB0aGUgdXNlciBidWZmZXIuCisJICogSW4gY2FzZSB0aGUgYnVmc2l6ZSByZXR1cm5lZCBpcyB0b28gc21hbGwsIGxldCdzIGFkanVzdCBpdCBhY2NvcmRpbmdseS4KKwkgKi8KKwlpZiAoZnAtPmJ1ZnNpemUgPD0gKHVfaW50KSBmcC0+c25hcHNob3QpCisJCWZwLT5idWZzaXplICs9IHNpemVvZihzdHJ1Y3QgcGNhcF9wa3RoZHIpOworCisJLyogaWYgdGhlIGN1cnJlbnQgc29ja2V0IGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGRlc2lyZWQgb25lICovCisJaWYgKCh1X2ludCkgc29ja2J1ZnNpemUgPCBmcC0+YnVmc2l6ZSkKKwl7CisJCS8qIExvb3AgdW50aWwgdGhlIGJ1ZmZlciBzaXplIGlzIE9LIG9yIHRoZSBvcmlnaW5hbCBzb2NrZXQgYnVmZmVyIHNpemUgaXMgbGFyZ2VyIHRoYW4gdGhpcyBvbmUgKi8KKwkJd2hpbGUgKDEpCisJCXsKKwkJCXJlcyA9IHNldHNvY2tvcHQoc29ja2RhdGEsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgKGNoYXIgKikmKGZwLT5idWZzaXplKSwgc2l6ZW9mKGZwLT5idWZzaXplKSk7CisKKwkJCWlmIChyZXMgPT0gMCkKKwkJCQlicmVhazsKKworCQkJLyoKKwkJCSAqIElmIHNvbWV0aGluZyBnb2VzIHdyb25nLCBoYWxmIHRoZSBidWZmZXIgc2l6ZSAoY2hlY2tpbmcgdGhhdCBpdCBkb2VzIG5vdCBiZWNvbWUgc21hbGxlciB0aGFuCisJCQkgKiB0aGUgY3VycmVudCBvbmUpCisJCQkgKi8KKwkJCWZwLT5idWZzaXplIC89IDI7CisKKwkJCWlmICgodV9pbnQpIHNvY2tidWZzaXplID49IGZwLT5idWZzaXplKQorCQkJeworCQkJCWZwLT5idWZzaXplID0gc29ja2J1ZnNpemU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIExldCdzIGFsbG9jYXRlIHRoZSBwYWNrZXQ7IHRoaXMgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gcHV0IHRoZSBwYWNrZXQgc29tZXdoZXJlIHdoZW4KKwkgKiBleHRyYWN0aW5nIGRhdGEgZnJvbSB0aGUgc29ja2V0CisJICogU2luY2UgYnVmZmVyaW5nIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSBpbiB0aGUgc29ja2V0IGJ1ZmZlciwgaGVyZSB3ZSBuZWVkIGp1c3QgYSBidWZmZXIsCisJICogd2hvc2Ugc2l6ZSBpcyBlcXVhbCB0byB0aGUgcGNhcCBoZWFkZXIgcGx1cyB0aGUgc25hcHNob3QgbGVuZ3RoCisJICovCisJZnAtPmJ1ZnNpemUgPSBmcC0+c25hcHNob3QgKyBzaXplb2Yoc3RydWN0IHBjYXBfcGt0aGRyKTsKKworCWZwLT5idWZmZXIgPSAodV9jaGFyICopbWFsbG9jKGZwLT5idWZzaXplKTsKKwlpZiAoZnAtPmJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJcGNhcF9zbnByaW50ZihmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKworCS8qIENoZWNrcyBpZiBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gcmVhZDsgaWYgbm90LCBkaXNjYXJkIHRoZSBkYXRhIGluIGV4Y2VzcyAqLworCWlmICh0b3RyZWFkICE9IG50b2hsKGhlYWRlci5wbGVuKSkKKwl7CisJCWlmIChzb2NrX2Rpc2NhcmQobWQtPnJtdF9zb2NrY3RybCwgbnRvaGwoaGVhZGVyLnBsZW4pIC0gdG90cmVhZCwgTlVMTCwgMCkgPT0gMSkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJLyoKKwkgKiBJbiBjYXNlIHRoZSB1c2VyIGRvZXMgbm90IHdhbnQgdG8gY2FwdHVyZSBSUENBUCBwYWNrZXRzLCBsZXQncyB1cGRhdGUgdGhlIGZpbHRlcgorCSAqIFdlIGhhdmUgdG8gdXBkYXRlIGl0IGhlcmUgKGluc3RlYWQgb2Ygc2VuZGluZyBpdCBpbnRvIHRoZSAnU3RhcnRDYXB0dXJlJyBtZXNzYWdlCisJICogYmVjYXVzZSB3aGVuIHdlIGdlbmVyYXRlIHRoZSAnc3RhcnQgY2FwdHVyZScgd2UgZG8gbm90IGtub3cgKHlldCkgYWxsIHRoZSBwb3J0cworCSAqIHdlJ3JlIGN1cnJlbnRseSB1c2luZy4KKwkgKi8KKwlpZiAobWQtPnJtdF9mbGFncyAmIFBDQVBfT1BFTkZMQUdfTk9DQVBUVVJFX1JQQ0FQKQorCXsKKwkJc3RydWN0IGJwZl9wcm9ncmFtIGZjb2RlOworCisJCWlmIChwY2FwX2NyZWF0ZWZpbHRlcl9ub3JwY2FwcGt0KGZwLCAmZmNvZGUpID09IC0xKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBXZSBjYW5ub3QgdXNlICdwY2FwX3NldGZpbHRlcl9yZW1vdGUnIGJlY2F1c2UgZm9ybWFsbHkgdGhlIGNhcHR1cmUgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0ICovCisJCS8qICh0aGUgJ2ZwLT5ybXRfY2Fwc3RhcnRlZCcgdmFyaWFibGUgd2lsbCBiZSB1cGRhdGVkIHNvbWUgbGluZXMgYmVsb3cpICovCisJCWlmIChwY2FwX3VwZGF0ZWZpbHRlcl9yZW1vdGUoZnAsICZmY29kZSkgPT0gLTEpCisJCQlnb3RvIGVycm9yOworCisJCXBjYXBfZnJlZWNvZGUoJmZjb2RlKTsKKwl9CisKKwltZC0+cm10X2NhcHN0YXJ0ZWQgPSAxOworCXJldHVybiAwOworCitlcnJvcjoKKwkvKgorCSAqIFdoZW4gdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQsIHdlIGhhdmUgdG8gY2xvc2UgaXQuIFNvLCBhdCB0aGUKKwkgKiBiZWdpbm5pbmcgb2YgdGhpcyBmdW5jdGlvbiwgaWYgYW4gZXJyb3Igb2NjdXIgd2UgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGgKKwkgKiBhIHJldHVybiBOVUxMOyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCB3ZSBoYXZlIHRvIGNvbWUgaGVyZQorCSAqICgnZ290byBlcnJvcjsnKSBpbiBvcmRlciB0byBjbG9zZSBldmVyeXRoaW5nIHByb3Blcmx5LgorCSAqCisJICogQ2hlY2tzIGlmIGFsbCB0aGUgZGF0YSBoYXMgYmVlbiByZWFkOyBpZiBub3QsIGRpc2NhcmQgdGhlIGRhdGEgaW4gZXhjZXNzCisJICovCisJaWYgKHRvdHJlYWQgIT0gbnRvaGwoaGVhZGVyLnBsZW4pKQorCQlzb2NrX2Rpc2NhcmQobWQtPnJtdF9zb2NrY3RybCwgbnRvaGwoaGVhZGVyLnBsZW4pIC0gdG90cmVhZCwgTlVMTCwgMCk7CisKKwlpZiAoKHNvY2tkYXRhKSAmJiAoc29ja2RhdGEgIT0gLTEpKQkJLyogd2UgY2FuIGJlIGhlcmUgYmVjYXVzZSBzb2NrZGF0YSBzYWlkICdlcnJvcicgKi8KKwkJc29ja19jbG9zZShzb2NrZGF0YSwgTlVMTCwgMCk7CisKKwlpZiAoIWFjdGl2ZSkKKwkJc29ja19jbG9zZShtZC0+cm10X3NvY2tjdHJsLCBOVUxMLCAwKTsKKworCS8qCisJICogV2UgZG8gbm90IGhhdmUgdG8gY2FsbCBwY2FwX2Nsb3NlKCkgaGVyZSwgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQKKwkgKiBieSB0aGUgdXNlciBpbiBjYXNlIHNvbWV0aGluZyBiYWQgaGFwcGVucworCSAqLworCS8vIAlpZiAoZnApCisJLy8gCXsKKwkvLyAJCXBjYXBfY2xvc2UoZnApOworCS8vIAkJZnA9IE5VTEw7CisJLy8gCX0KKworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFxicmllZiBUYWtlcyBhIGJwZiBwcm9ncmFtIGFuZCBzZW5kcyBpdCB0byB0aGUgb3RoZXIgaG9zdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIGNhc2VzOgorICogLSB0aGUgcGNhcF9zdGFydGNhcHR1cmUoKSBpcyBjYWxsZWQgKHdlIGhhdmUgdG8gc2VuZCB0aGUgZmlsdGVyIGFsb25nIHdpdGgKKyAqIHRoZSAnc3RhcnQgY2FwdHVyZScgY29tbWFuZCkKKyAqIC0gd2Ugd2FudCB0byB1ZHBhdGUgdGhlIGZpbHRlciBkdXJpbmcgYSBjYXB0dXJlIChpLmUuIHRoZSBwY2FwX3NldGZpbHRlcigpCisgKiBpcyBjYWxsZWQgd2hlbiB0aGUgY2FwdHVyZSBpcyBzdGlsbCBvbikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlcmlhbGl6ZXMgdGhlIGZpbHRlciBpbnRvIHRoZSBzZW5kaW5nIGJ1ZmZlciAoJ3NlbmRidWYnLCBwYXNzZWQKKyAqIGFzIGEgcGFyYW1ldGVyKSBhbmQgcmV0dXJuIGJhY2suIEl0IGRvZXMgbm90IHNlbmQgYW55dGhpbmcgb24gdGhlIG5ldHdvcmsuCisgKgorICogXHBhcmFtIGZwOiB0aGUgcGNhcF90IGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZSBjdXJyZW50bHkgb3BlbmVkLgorICoKKyAqIFxwYXJhbSBzZW5kYnVmOiB0aGUgYnVmZmVyIG9uIHdoaWNoIHRoZSBzZXJpYWxpemVkIGRhdGEgaGFzIHRvIGNvcGllZC4KKyAqCisgKiBccGFyYW0gc2VuZGJ1ZmlkeDogaXQgaXMgdXNlZCB0byByZXR1cm4gdGhlIGFib3VuZiBvZiBieXRlcyBjb3BpZWQgaW50byB0aGUgYnVmZmVyLgorICoKKyAqIFxwYXJhbSBwcm9nOiB0aGUgYnBmIHByb2dyYW0gd2UgaGF2ZSB0byBjb3B5LgorICoKKyAqIFxyZXR1cm4gJzAnIGlmIGV2ZXJ5dGhpbmcgaXMgZmluZSwgJy0xJyBvdGhlcndpc2UuIFRoZSBlcnJvciBtZXNzYWdlIChpZiBvbmUpCisgKiBpcyByZXR1cm5lZCBpbnRvIHRoZSAnZXJyYnVmJyBmaWVsZCBvZiB0aGUgcGNhcF90IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCBwY2FwX3BhY2tfYnBmZmlsdGVyKHBjYXBfdCAqZnAsIGNoYXIgKnNlbmRidWYsIGludCAqc2VuZGJ1ZmlkeCwgc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nKQoreworCXN0cnVjdCBycGNhcF9maWx0ZXIgKmZpbHRlcjsKKwlzdHJ1Y3QgcnBjYXBfZmlsdGVyYnBmX2luc24gKmluc247CisJc3RydWN0IGJwZl9pbnNuICpiZl9pbnNuOworCXN0cnVjdCBicGZfcHJvZ3JhbSBmYWtlX3Byb2c7CQkvKiBUbyBiZSB1c2VkIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBmb3Jnb3QgdG8gc2V0IGEgZmlsdGVyICovCisJdW5zaWduZWQgaW50IGk7CisKKworCWlmIChwcm9nLT5iZl9sZW4gPT0gMCkJLyogTm8gZmlsdGVycyBoYXZlIGJlZW4gc3BlY2lmaWVkOyBzbywgbGV0J3MgYXBwbHkgYSAiZmFrZSIgZmlsdGVyICovCisJeworCQlpZiAocGNhcF9jb21waWxlKGZwLCAmZmFrZV9wcm9nLCBOVUxMIC8qIGJ1ZmZlciAqLywgMSwgMCkgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisKKwkJcHJvZyA9ICZmYWtlX3Byb2c7CisJfQorCisJZmlsdGVyID0gKHN0cnVjdCBycGNhcF9maWx0ZXIgKikgc2VuZGJ1ZjsKKworCWlmIChzb2NrX2J1ZmZlcml6ZShOVUxMLCBzaXplb2Yoc3RydWN0IHJwY2FwX2ZpbHRlciksIE5VTEwsIHNlbmRidWZpZHgsCisJCVJQQ0FQX05FVEJVRl9TSVpFLCBTT0NLQlVGX0NIRUNLT05MWSwgZnAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkpCisJCXJldHVybiAtMTsKKworCWZpbHRlci0+ZmlsdGVydHlwZSA9IGh0b25zKFJQQ0FQX1VQREFURUZJTFRFUl9CUEYpOworCWZpbHRlci0+bml0ZW1zID0gaHRvbmwoKGludDMyKXByb2ctPmJmX2xlbik7CisKKwlpZiAoc29ja19idWZmZXJpemUoTlVMTCwgcHJvZy0+YmZfbGVuICogc2l6ZW9mKHN0cnVjdCBycGNhcF9maWx0ZXJicGZfaW5zbiksCisJCU5VTEwsIHNlbmRidWZpZHgsIFJQQ0FQX05FVEJVRl9TSVpFLCBTT0NLQlVGX0NIRUNLT05MWSwgZnAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkpCisJCXJldHVybiAtMTsKKworCWluc24gPSAoc3RydWN0IHJwY2FwX2ZpbHRlcmJwZl9pbnNuICopIChmaWx0ZXIgKyAxKTsKKwliZl9pbnNuID0gcHJvZy0+YmZfaW5zbnM7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJvZy0+YmZfbGVuOyBpKyspCisJeworCQlpbnNuLT5jb2RlID0gaHRvbnMoYmZfaW5zbi0+Y29kZSk7CisJCWluc24tPmpmID0gYmZfaW5zbi0+amY7CisJCWluc24tPmp0ID0gYmZfaW5zbi0+anQ7CisJCWluc24tPmsgPSBodG9ubChiZl9pbnNuLT5rKTsKKworCQlpbnNuKys7CisJCWJmX2luc24rKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogXGluZ3JvdXAgcmVtb3RlX3ByaV9mdW5jCisgKgorICogXGJyaWVmIFVwZGF0ZSBhIGZpbHRlciBvbiBhIHJlbW90ZSBob3N0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgd2FudHMgdG8gdXBkYXRlIGEgZmlsdGVyLgorICogSW4gY2FzZSB3ZSdyZSBjYXB0dXJpbmcgZnJvbSB0aGUgbmV0d29yaywgaXQgc2VuZHMgdGhlIGZpbHRlciB0byB0aGUgb3RoZXIgcGVlci4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgKm5vdCogY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdXNlciBjYWxscyB0aGUgcGNhcF9zZXRmaWx0ZXIoKS4KKyAqIFRoZXJlIHdpbGwgYmUgdHdvIGNhc2VzOgorICogLSB0aGUgY2FwdHVyZSBpcyBhbHJlYWR5IG9uOiBpbiB0aGlzIGNhc2UsIHBjYXBfc2V0ZmlsdGVyKCkgY2FsbHMgcGNhcF91cGRhdGVmaWx0ZXJfcmVtb3RlKCkKKyAqIC0gdGhlIGNhcHR1cmUgaGFzIG5vdCBzdGFydGVkIHlldDogaW4gdGhpcyBjYXNlLCBwY2FwX3NldGZpbHRlcigpIHN0b3JlcyB0aGUgZmlsdGVyIGludG8KKyAqIHRoZSBwY2FwX3Qgc3RydWN0dXJlLCBhbmQgdGhlbiB0aGUgZmlsdGVyIGlzIHNlbnQgd2l0aCB0aGUgcGNhcF9zdGFydGNhcCgpLgorICoKKyAqIFBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZXMgYXJlIGV4YWN0bHkgdGhlIHNhbWUgb2YgdGhlIHBjYXBfc2V0ZmlsdGVyKCkuCisgKgorICogXHdhcm5pbmcgVGhpcyBmdW5jdGlvbiAqZG9lcyBub3QqIGNsZWFyIHRoZSBwYWNrZXQgY3VycmVudGx5IGludG8gdGhlIGJ1ZmZlcnMuIFRoZXJlZm9yZSwKKyAqIHRoZSB1c2VyIGhhcyB0byBleHBlY3QgdG8gcmVjZWl2ZSBzb21lIHBhY2tldHMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgcHJldmlvdXMgZmlsdGVyLgorICogSWYgeW91IHdhbnQgdG8gZGlzY2FyZCBhbGwgdGhlIHBhY2tldHMgYmVmb3JlIGFwcGx5aW5nIGEgbmV3IGZpbHRlciwgeW91IGhhdmUgdG8gY2xvc2UKKyAqIHRoZSBjdXJyZW50IGNhcHR1cmUgc2Vzc2lvbiBhbmQgc3RhcnQgYSBuZXcgb25lLgorICovCitzdGF0aWMgaW50IHBjYXBfdXBkYXRlZmlsdGVyX3JlbW90ZShwY2FwX3QgKmZwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnByb2cpCit7CisJaW50IHJldHZhbDsJCQkJCQkvKiBnZW5lcmFsIHZhcmlhYmxlIHVzZWQgdG8ga2VlcCB0aGUgcmV0dXJuIHZhbHVlIG9mIG90aGVyIGZ1bmN0aW9ucyAqLworCWNoYXIgc2VuZGJ1ZltSUENBUF9ORVRCVUZfU0laRV07LyogdGVtcG9yYXJ5IGJ1ZmZlciBpbiB3aGljaCBkYXRhIHRvIGJlIHNlbnQgaXMgYnVmZmVyZWQgKi8KKwlpbnQgc2VuZGJ1ZmlkeCA9IDA7CQkJCS8qIGluZGV4IHdoaWNoIGtlZXBzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGJ1ZmZlcmVkICovCisJc3RydWN0IHJwY2FwX2hlYWRlciBoZWFkZXI7CQkvKiBUbyBrZWVwIHRoZSByZXBseSBtZXNzYWdlICovCisJc3RydWN0IHBjYXBfbWQgKm1kOwkJCQkvKiBzdHJ1Y3R1cmUgdXNlZCB3aGVuIGRvaW5nIGEgcmVtb3RlIGxpdmUgY2FwdHVyZSAqLworCisJbWQgPSAoc3RydWN0IHBjYXBfbWQgKikgKCh1X2NoYXIqKWZwLT5wcml2ICsgc2l6ZW9mKHN0cnVjdCBwY2FwX3dpbikpOworCisKKwlpZiAoc29ja19idWZmZXJpemUoTlVMTCwgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpLCBOVUxMLCAmc2VuZGJ1ZmlkeCwKKwkJUlBDQVBfTkVUQlVGX1NJWkUsIFNPQ0tCVUZfQ0hFQ0tPTkxZLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSkKKwkJcmV0dXJuIC0xOworCisJcnBjYXBfY3JlYXRlaGRyKChzdHJ1Y3QgcnBjYXBfaGVhZGVyICopIHNlbmRidWYsIFJQQ0FQX01TR19VUERBVEVGSUxURVJfUkVRLCAwLAorCQlzaXplb2Yoc3RydWN0IHJwY2FwX2ZpbHRlcikgKyBwcm9nLT5iZl9sZW4gKiBzaXplb2Yoc3RydWN0IHJwY2FwX2ZpbHRlcmJwZl9pbnNuKSk7CisKKwlpZiAocGNhcF9wYWNrX2JwZmZpbHRlcihmcCwgJnNlbmRidWZbc2VuZGJ1ZmlkeF0sICZzZW5kYnVmaWR4LCBwcm9nKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNvY2tfc2VuZChtZC0+cm10X3NvY2tjdHJsLCBzZW5kYnVmLCBzZW5kYnVmaWR4LCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSkKKwkJcmV0dXJuIC0xOworCisJLyogV2FpdHMgZm9yIHRoZSBhbnN3ZXIgKi8KKwlpZiAoc29ja19yZWN2KG1kLT5ybXRfc29ja2N0cmwsIChjaGFyICopJmhlYWRlciwgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpLCBTT0NLX1JFQ0VJVkVBTExfWUVTLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJLyogQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIGlzIGNvcnJlY3QgKi8KKwlyZXR2YWwgPSBycGNhcF9jaGVja21zZyhmcC0+ZXJyYnVmLCBtZC0+cm10X3NvY2tjdHJsLCAmaGVhZGVyLCBSUENBUF9NU0dfVVBEQVRFRklMVEVSX1JFUExZLCAwKTsKKworCWlmIChyZXR2YWwgIT0gUlBDQVBfTVNHX1VQREFURUZJTFRFUl9SRVBMWSkJCS8qIHRoZSBtZXNzYWdlIGlzIG5vdCB0aGUgb25lIGV4cGVjdGVkICovCisJeworCQlzd2l0Y2ggKHJldHZhbCkKKwkJeworCQljYXNlIC0zOgkJLyogVW5yZWNvdmVyYWJsZSBuZXR3b3JrIGVycm9yICovCisJCWNhc2UgLTI6CQkvKiBUaGUgb3RoZXIgZW5kcG9pbnQgc2VudCBhIG1lc3NhZ2UgdGhhdCBpcyBub3QgYWxsb3dlZCBoZXJlICovCisJCWNhc2UgLTE6CQkvKiBUaGUgb3RoZXIgZW5kcG9pbnQgaGFzIGEgdmVyc2lvbiBudW1iZXIgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG91ciAqLworCQkJLyogRG8gbm90aGluZzsganVzdCBleGl0IGZyb20gaGVyZTsgdGhlIGVycm9yIGNvZGUgaXMgYWxyZWFkeSBpbnRvIHRoZSBlcnJidWYgKi8KKwkJCXJldHVybiAtMTsKKworCQlkZWZhdWx0OgorCQkJU09DS19BU1NFUlQoIkludGVybmFsIGVycm9yIiwgMCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAobnRvaGwoaGVhZGVyLnBsZW4pICE9IDApCS8qIHRoZSBtZXNzYWdlIGhhcyBhbiB1bmV4cGVjdGVkIHNpemUgKi8KKwl7CisJCWlmIChzb2NrX2Rpc2NhcmQobWQtPnJtdF9zb2NrY3RybCwgbnRvaGwoaGVhZGVyLnBsZW4pLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFxpbmdyb3VwIHJlbW90ZV9wcmlfZnVuYworICoKKyAqIFxicmllZiBTZW5kIGEgZmlsdGVyIHRvIGEgcmVtb3RlIGhvc3QuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciB3YW50cyB0byBzZXQgYSBmaWx0ZXIuCisgKiBJbiBjYXNlIHdlJ3JlIGNhcHR1cmluZyBmcm9tIHRoZSBuZXR3b3JrLCBpdCBzZW5kcyB0aGUgZmlsdGVyIHRvIHRoZSBvdGhlciBwZWVyLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSB1c2VyIGNhbGxzIHRoZSBwY2FwX3NldGZpbHRlcigpLgorICoKKyAqIFBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZXMgYXJlIGV4YWN0bHkgdGhlIHNhbWUgb2YgdGhlIHBjYXBfc2V0ZmlsdGVyKCkuCisgKi8KK3N0YXRpYyBpbnQgcGNhcF9zZXRmaWx0ZXJfcmVtb3RlKHBjYXBfdCAqZnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZykKK3sKKwlzdHJ1Y3QgcGNhcF9tZCAqbWQ7CQkJCS8qIHN0cnVjdHVyZSB1c2VkIHdoZW4gZG9pbmcgYSByZW1vdGUgbGl2ZSBjYXB0dXJlICovCisKKwltZCA9IChzdHJ1Y3QgcGNhcF9tZCAqKSAoKHVfY2hhciopZnAtPnByaXYgKyBzaXplb2Yoc3RydWN0IHBjYXBfd2luKSk7CisKKwlpZiAoIW1kLT5ybXRfY2Fwc3RhcnRlZCkKKwl7CisJCS8qIGNvcHkgZmlsdGVyIGludG8gdGhlIHBjYXBfdCBzdHJ1Y3R1cmUgKi8KKwkJaWYgKGluc3RhbGxfYnBmX3Byb2dyYW0oZnAsIHByb2cpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB3ZSBoYXZlIHRvIHVwZGF0ZSBhIGZpbHRlciBkdXJpbmcgcnVuLXRpbWUgKi8KKwlpZiAocGNhcF91cGRhdGVmaWx0ZXJfcmVtb3RlKGZwLCBwcm9nKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBcaW5ncm91cCByZW1vdGVfcHJpX2Z1bmMKKyAqCisgKiBcYnJpZWYgVXBkYXRlIHRoZSBjdXJyZW50IGZpbHRlciBpbiBvcmRlciBub3QgdG8gY2FwdHVyZSBycGNhcCBwYWNrZXRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICpvbmx5KiB3aGVuIHRoZSB1c2VyIHdhbnRzIGV4Y2x1ZGUgUlBDQVAgcGFja2V0cworICogcmVsYXRlZCB0byB0aGUgY3VycmVudCBzZXNzaW9uIGZyb20gdGhlIGNhcHR1cmVkIHBhY2tldHMuCisgKgorICogXHJldHVybiAnMCcgaWYgZXZlcnl0aGluZyBpcyBmaW5lLCAnLTEnIG90aGVyd2lzZS4gVGhlIGVycm9yIG1lc3NhZ2UgKGlmIG9uZSkKKyAqIGlzIHJldHVybmVkIGludG8gdGhlICdlcnJidWYnIGZpZWxkIG9mIHRoZSBwY2FwX3Qgc3RydWN0dXJlLgorICovCitzdGF0aWMgaW50IHBjYXBfY3JlYXRlZmlsdGVyX25vcnBjYXBwa3QocGNhcF90ICpmcCwgc3RydWN0IGJwZl9wcm9ncmFtICpwcm9nKQoreworCWludCBSZXRWYWwgPSAwOworCXN0cnVjdCBwY2FwX21kICptZDsJCQkJLyogc3RydWN0dXJlIHVzZWQgd2hlbiBkb2luZyBhIHJlbW90ZSBsaXZlIGNhcHR1cmUgKi8KKworCW1kID0gKHN0cnVjdCBwY2FwX21kICopICgodV9jaGFyKilmcC0+cHJpdiArIHNpemVvZihzdHJ1Y3QgcGNhcF93aW4pKTsKKworCS8qIFdlIGRvIG5vdCB3YW50IHRvIGNhcHR1cmUgb3VyIFJQQ0FQIHRyYWZmaWMuIFNvLCBsZXQncyB1cGRhdGUgdGhlIGZpbHRlciAqLworCWlmIChtZC0+cm10X2ZsYWdzICYgUENBUF9PUEVORkxBR19OT0NBUFRVUkVfUlBDQVApCisJeworCQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYWRkcjsJCS8qIHRlbXAsIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgbmV0d29yayBkYXRhIHBvcnQgY2hvc2VuIG9uIHRoZSBsb2NhbCBtYWNoaW5lICovCisJCXNvY2tsZW5fdCBzYWRkcmxlbjsJCQkJCS8qIHRlbXAsIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgbmV0d29yayBkYXRhIHBvcnQgY2hvc2VuIG9uIHRoZSBsb2NhbCBtYWNoaW5lICovCisJCWNoYXIgbXlhZGRyZXNzWzEyOF07CisJCWNoYXIgbXljdHJscG9ydFsxMjhdOworCQljaGFyIG15ZGF0YXBvcnRbMTI4XTsKKwkJY2hhciBwZWVyYWRkcmVzc1sxMjhdOworCQljaGFyIHBlZXJjdHJscG9ydFsxMjhdOworCQljaGFyICpuZXdmaWx0ZXI7CisJCWNvbnN0IGludCBuZXdzdHJpbmdzaXplID0gMTAyNDsKKwkJc2l6ZV90IGN1cnJlbnRmaWx0ZXJzaXplOworCisJCS8qIEdldCB0aGUgbmFtZS9wb3J0IG9mIHRoZSBvdGhlciBwZWVyICovCisJCXNhZGRybGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKKwkJaWYgKGdldHBlZXJuYW1lKG1kLT5ybXRfc29ja2N0cmwsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCAmc2FkZHJsZW4pID09IC0xKQorCQl7CisJCQlzb2NrX2dldGVycm9yKCJnZXRwZWVybmFtZSgpOiAiLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgc2FkZHJsZW4sIHBlZXJhZGRyZXNzLAorCQkJc2l6ZW9mKHBlZXJhZGRyZXNzKSwgcGVlcmN0cmxwb3J0LCBzaXplb2YocGVlcmN0cmxwb3J0KSwgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVikpCisJCXsKKwkJCXNvY2tfZ2V0ZXJyb3IoImdldG5hbWVpbmZvKCk6ICIsIGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogV2UgY2Fubm90IGNoZWNrIHRoZSBkYXRhIHBvcnQsIGJlY2F1c2UgdGhpcyBpcyBhdmFpbGFibGUgb25seSBpbiBjYXNlIG9mIFRDUCBzb2NrZXRzICovCisJCS8qIEdldCB0aGUgbmFtZS9wb3J0IG9mIHRoZSBjdXJyZW50IGhvc3QgKi8KKwkJaWYgKGdldHNvY2tuYW1lKG1kLT5ybXRfc29ja2N0cmwsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCAmc2FkZHJsZW4pID09IC0xKQorCQl7CisJCQlzb2NrX2dldGVycm9yKCJnZXRzb2NrbmFtZSgpOiAiLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qIEdldCB0aGUgbG9jYWwgcG9ydCB0aGUgc3lzdGVtIHBpY2tlZCB1cCAqLworCQlpZiAoZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsIHNhZGRybGVuLCBteWFkZHJlc3MsCisJCQlzaXplb2YobXlhZGRyZXNzKSwgbXljdHJscG9ydCwgc2l6ZW9mKG15Y3RybHBvcnQpLCBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKSkKKwkJeworCQkJc29ja19nZXRlcnJvcigiZ2V0bmFtZWluZm8oKTogIiwgZnAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKiBMZXQncyBub3cgY2hlY2sgdGhlIGRhdGEgcG9ydCAqLworCQlpZiAoZ2V0c29ja25hbWUobWQtPnJtdF9zb2NrZGF0YSwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsICZzYWRkcmxlbikgPT0gLTEpCisJCXsKKwkJCXNvY2tfZ2V0ZXJyb3IoImdldHNvY2tuYW1lKCk6ICIsIGZwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogR2V0IHRoZSBsb2NhbCBwb3J0IHRoZSBzeXN0ZW0gcGlja2VkIHVwICovCisJCWlmIChnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgc2FkZHJsZW4sIE5VTEwsIDAsIG15ZGF0YXBvcnQsIHNpemVvZihteWRhdGFwb3J0KSwgTklfTlVNRVJJQ1NFUlYpKQorCQl7CisJCQlzb2NrX2dldGVycm9yKCJnZXRuYW1laW5mbygpOiAiLCBmcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWN1cnJlbnRmaWx0ZXJzaXplID0gc3RybGVuKG1kLT5jdXJyZW50ZmlsdGVyKTsKKworCQluZXdmaWx0ZXIgPSAoY2hhciAqKW1hbGxvYyhjdXJyZW50ZmlsdGVyc2l6ZSArIG5ld3N0cmluZ3NpemUgKyAxKTsKKworCQlpZiAoY3VycmVudGZpbHRlcnNpemUpCisJCXsKKwkJCXBjYXBfc25wcmludGYobmV3ZmlsdGVyLCBjdXJyZW50ZmlsdGVyc2l6ZSArIG5ld3N0cmluZ3NpemUsCisJCQkJIiglcykgYW5kIG5vdCAoaG9zdCAlcyBhbmQgaG9zdCAlcyBhbmQgcG9ydCAlcyBhbmQgcG9ydCAlcykgYW5kIG5vdCAoaG9zdCAlcyBhbmQgaG9zdCAlcyBhbmQgcG9ydCAlcykiLAorCQkJCW1kLT5jdXJyZW50ZmlsdGVyLCBteWFkZHJlc3MsIHBlZXJhZGRyZXNzLCBteWN0cmxwb3J0LCBwZWVyY3RybHBvcnQsIG15YWRkcmVzcywgcGVlcmFkZHJlc3MsIG15ZGF0YXBvcnQpOworCQl9CisJCWVsc2UKKwkJeworCQkJcGNhcF9zbnByaW50ZihuZXdmaWx0ZXIsIGN1cnJlbnRmaWx0ZXJzaXplICsgbmV3c3RyaW5nc2l6ZSwKKwkJCQkibm90IChob3N0ICVzIGFuZCBob3N0ICVzIGFuZCBwb3J0ICVzIGFuZCBwb3J0ICVzKSBhbmQgbm90IChob3N0ICVzIGFuZCBob3N0ICVzIGFuZCBwb3J0ICVzKSIsCisJCQkJbXlhZGRyZXNzLCBwZWVyYWRkcmVzcywgbXljdHJscG9ydCwgcGVlcmN0cmxwb3J0LCBteWFkZHJlc3MsIHBlZXJhZGRyZXNzLCBteWRhdGFwb3J0KTsKKwkJfQorCisJCW5ld2ZpbHRlcltjdXJyZW50ZmlsdGVyc2l6ZSArIG5ld3N0cmluZ3NpemVdID0gMDsKKworCQkvKiBUaGlzIGlzIG9ubHkgYW4gaGFjayB0byBtYWtlIHRoZSBwY2FwX2NvbXBpbGUoKSB3b3JraW5nIHByb3Blcmx5ICovCisJCW1kLT5ybXRfY2xpZW50c2lkZSA9IDA7CisKKwkJaWYgKHBjYXBfY29tcGlsZShmcCwgcHJvZywgbmV3ZmlsdGVyLCAxLCAwKSA9PSAtMSkKKwkJCVJldFZhbCA9IC0xOworCisJCS8qIFRoaXMgaXMgb25seSBhbiBoYWNrIHRvIG1ha2UgdGhlIHBjYXBfY29tcGlsZSgpIHdvcmtpbmcgcHJvcGVybHkgKi8KKwkJbWQtPnJtdF9jbGllbnRzaWRlID0gMTsKKworCQlmcmVlKG5ld2ZpbHRlcik7CisJfQorCisJcmV0dXJuIFJldFZhbDsKK30KKworLyoKKyAqIFxpbmdyb3VwIHJlbW90ZV9wcmlfZnVuYworICoKKyAqIFxicmllZiBTZXQgc2FtcGxpbmcgcGFyYW1ldGVycyBpbiB0aGUgcmVtb3RlIGhvc3QuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciB3YW50cyB0byBzZXQgYWN0aXZhdGUgc2FtcGxpbmcgb24gdGhlIHJlbW90ZSBob3N0LgorICoKKyAqIFNhbXBsaW5nIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQgaW50byB0aGUgJ3BjYXBfdCcgc3RydWN0dXJlLgorICoKKyAqIFxwYXJhbSBwOiB0aGUgcGNhcF90IGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZSBjdXJyZW50bHkgb3BlbmVkLgorICoKKyAqIFxyZXR1cm4gJzAnIGlmIGV2ZXJ5dGhpbmcgaXMgT0ssICctMScgaXMgc29tZXRoaW5nIGdvZXMgd3JvbmcuIFRoZSBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkCisgKiBpbiB0aGUgJ2VycmJ1ZicgbWVtYmVyIG9mIHRoZSBwY2FwX3Qgc3RydWN0dXJlLgorICovCitzdGF0aWMgaW50IHBjYXBfc2V0c2FtcGxpbmdfcmVtb3RlKHBjYXBfdCAqcCkKK3sKKwlpbnQgcmV0dmFsOwkJCQkJCS8qIGdlbmVyYWwgdmFyaWFibGUgdXNlZCB0byBrZWVwIHRoZSByZXR1cm4gdmFsdWUgb2Ygb3RoZXIgZnVuY3Rpb25zICovCisJY2hhciBzZW5kYnVmW1JQQ0FQX05FVEJVRl9TSVpFXTsvKiB0ZW1wb3JhcnkgYnVmZmVyIGluIHdoaWNoIGRhdGEgdG8gYmUgc2VudCBpcyBidWZmZXJlZCAqLworCWludCBzZW5kYnVmaWR4ID0gMDsJCQkJLyogaW5kZXggd2hpY2gga2VlcHMgdGhlIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgYnVmZmVyZWQgKi8KKwlzdHJ1Y3QgcnBjYXBfaGVhZGVyIGhlYWRlcjsJCS8qIFRvIGtlZXAgdGhlIHJlcGx5IG1lc3NhZ2UgKi8KKwlzdHJ1Y3QgcnBjYXBfc2FtcGxpbmcgKnNhbXBsaW5nX3BhcnM7CS8qIFN0cnVjdHVyZSB0aGF0IGlzIG5lZWRlZCB0byBzZW5kIHNhbXBsaW5nIHBhcmFtZXRlcnMgdG8gdGhlIHJlbW90ZSBob3N0ICovCisJc3RydWN0IHBjYXBfbWQgKm1kOwkJCQkvKiBzdHJ1Y3R1cmUgdXNlZCB3aGVuIGRvaW5nIGEgcmVtb3RlIGxpdmUgY2FwdHVyZSAqLworCisJbWQgPSAoc3RydWN0IHBjYXBfbWQgKikgKCh1X2NoYXIqKXAtPnByaXYgKyBzaXplb2Yoc3RydWN0IHBjYXBfd2luKSk7CisKKwkvKiBJZiBubyBzYW1waW5nIGlzIHJlcXVlc3RlZCwgcmV0dXJuICdvaycgKi8KKwlpZiAobWQtPnJtdF9zYW1wLm1ldGhvZCA9PSBQQ0FQX1NBTVBfTk9TQU1QKQorCQlyZXR1cm4gMDsKKworCWlmIChzb2NrX2J1ZmZlcml6ZShOVUxMLCBzaXplb2Yoc3RydWN0IHJwY2FwX2hlYWRlciksIE5VTEwsCisJCSZzZW5kYnVmaWR4LCBSUENBUF9ORVRCVUZfU0laRSwgU09DS0JVRl9DSEVDS09OTFksIHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkpCisJCXJldHVybiAtMTsKKworCXJwY2FwX2NyZWF0ZWhkcigoc3RydWN0IHJwY2FwX2hlYWRlciAqKSBzZW5kYnVmLCBSUENBUF9NU0dfU0VUU0FNUExJTkdfUkVRLCAwLCBzaXplb2Yoc3RydWN0IHJwY2FwX3NhbXBsaW5nKSk7CisKKwkvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgbmVlZGVkIHRvIG9wZW4gYW4gYWRhcHRlciByZW1vdGVseSAqLworCXNhbXBsaW5nX3BhcnMgPSAoc3RydWN0IHJwY2FwX3NhbXBsaW5nICopICZzZW5kYnVmW3NlbmRidWZpZHhdOworCisJaWYgKHNvY2tfYnVmZmVyaXplKE5VTEwsIHNpemVvZihzdHJ1Y3QgcnBjYXBfc2FtcGxpbmcpLCBOVUxMLAorCQkmc2VuZGJ1ZmlkeCwgUlBDQVBfTkVUQlVGX1NJWkUsIFNPQ0tCVUZfQ0hFQ0tPTkxZLCBwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoc2FtcGxpbmdfcGFycywgMCwgc2l6ZW9mKHN0cnVjdCBycGNhcF9zYW1wbGluZykpOworCisJc2FtcGxpbmdfcGFycy0+bWV0aG9kID0gbWQtPnJtdF9zYW1wLm1ldGhvZDsKKwlzYW1wbGluZ19wYXJzLT52YWx1ZSA9IGh0b25sKG1kLT5ybXRfc2FtcC52YWx1ZSk7CisKKwlpZiAoc29ja19zZW5kKG1kLT5ybXRfc29ja2N0cmwsIHNlbmRidWYsIHNlbmRidWZpZHgsIHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkpCisJCXJldHVybiAtMTsKKworCS8qIFdhaXRzIGZvciB0aGUgYW5zd2VyICovCisJaWYgKHNvY2tfcmVjdihtZC0+cm10X3NvY2tjdHJsLCAoY2hhciAqKSZoZWFkZXIsIHNpemVvZihzdHJ1Y3QgcnBjYXBfaGVhZGVyKSwgU09DS19SRUNFSVZFQUxMX1lFUywgcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJLyogQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIGlzIGNvcnJlY3QgKi8KKwlyZXR2YWwgPSBycGNhcF9jaGVja21zZyhwLT5lcnJidWYsIG1kLT5ybXRfc29ja2N0cmwsICZoZWFkZXIsIFJQQ0FQX01TR19TRVRTQU1QTElOR19SRVBMWSwgMCk7CisKKwlpZiAocmV0dmFsICE9IFJQQ0FQX01TR19TRVRTQU1QTElOR19SRVBMWSkJCS8qIHRoZSBtZXNzYWdlIGlzIG5vdCB0aGUgb25lIGV4cGVjdGVkICovCisJeworCQlzd2l0Y2ggKHJldHZhbCkKKwkJeworCQljYXNlIC0zOgkJLyogVW5yZWNvdmVyYWJsZSBuZXR3b3JrIGVycm9yICovCisJCWNhc2UgLTI6CQkvKiBUaGUgb3RoZXIgZW5kcG9pbnQgc2VudCBhIG1lc3NhZ2UgdGhhdCBpcyBub3QgYWxsb3dlZCBoZXJlICovCisJCWNhc2UgLTE6CQkvKiBUaGUgb3RoZXIgZW5kcG9pbnQgaGFzIGEgdmVyc2lvbiBudW1iZXIgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG91ciAqLworCQljYXNlIFJQQ0FQX01TR19FUlJPUjoKKwkJCS8qIERvIG5vdGhpbmc7IGp1c3QgZXhpdCBmcm9tIGhlcmU7IHRoZSBlcnJvciBjb2RlIGlzIGFscmVhZHkgaW50byB0aGUgZXJyYnVmICovCisJCQlyZXR1cm4gLTE7CisKKwkJZGVmYXVsdDoKKwkJCVNPQ0tfQVNTRVJUKCJJbnRlcm5hbCBlcnJvciIsIDApOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKG50b2hsKGhlYWRlci5wbGVuKSAhPSAwKQkvKiB0aGUgbWVzc2FnZSBoYXMgYW4gdW5leHBlY3RlZCBzaXplICovCisJeworCQlpZiAoc29ja19kaXNjYXJkKG1kLT5ybXRfc29ja2N0cmwsIG50b2hsKGhlYWRlci5wbGVuKSwgcC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIFxpbmdyb3VwIHJlbW90ZV9wcmlfZnVuYworICogXGJyaWVmIEl0IHNlbmRzIGEgUlBDQVAgZXJyb3IgdG8gdGhlIG90aGVyIHBlZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBoYXMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIG1haW4gcHJvZ3JhbSBkZXRlY3RzIGFuIGVycm9yLiBUaGlzIGZ1bmN0aW9uCisgKiB3aWxsIHNlbmQgb24gdGhlIG90aGVyIHBlZXIgdGhlICdidWZmZXInIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAqIFRoaXMgZnVuY3Rpb24gKmRvZXMgbm90KiByZXF1ZXN0IGEgUlBDQVAgQ0xPU0UgY29ubmVjdGlvbi4gQSBDTE9TRSBjb21tYW5kIG11c3QgYmUgc2VudAorICogZXhwbGljaXRseSBieSB0aGUgcHJvZ3JhbSwgc2luY2Ugd2UgZG8gbm90IGtub3cgaXQgdGhlIGVycm9yIGNhbiBiZSByZWNvdmVyZWQgaW4gc29tZQorICogd2F5IG9yIGl0IGlzIGEgbm9uLXJlY292ZXJhYmxlIG9uZS4KKyAqCisgKiBccGFyYW0gc29jazogdGhlIHNvY2tldCB3ZSBhcmUgY3VycmVudGx5IHVzaW5nLgorICoKKyAqIFxwYXJhbSBlcnJvcjogYW4gdXNlci1hbGxvY2F0ZWQgKGFuZCAnMCcgdGVybWluYXRlZCkgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGVycm9yCisgKiBkZXNjcmlwdGlvbiB0aGF0IGhhcyB0byBiZSB0cmFuc21pdHRlZCBvbiB0aGUgb3RoZXIgcGVlci4gVGhlIGVycm9yIG1lc3NhZ2UgY2Fubm90CisgKiBiZSBsb25nZXIgdGhhbiBQQ0FQX0VSUkJVRl9TSVpFLgorICoKKyAqIFxwYXJhbSBlcnJjb2RlOiBhIGludGVnZXIgd2hpY2ggdGVsbHMgdGhlIG90aGVyIHBhcnR5IHRoZSB0eXBlIG9mIGVycm9yIHdlIGhhZDsKKyAqIGN1cnJlbnRseSBpcyBpcyBub3QgdG9vIG11Y2ggdXNlZC4KKyAqCisgKiBccGFyYW0gZXJyYnVmOiBhIHBvaW50ZXIgdG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgKG9mIHNpemUgUENBUF9FUlJCVUZfU0laRSkKKyAqIHRoYXQgd2lsbCBjb250YWluIHRoZSBlcnJvciBtZXNzYWdlIChpbiBjYXNlIHRoZXJlIGlzIG9uZSkuIEl0IGNvdWxkIGJlIG5ldHdvcmsgcHJvYmxlbS4KKyAqCisgKiBccmV0dXJuICcwJyBpZiBldmVyeXRoaW5nIGlzIGZpbmUsICctMScgaWYgc29tZSBlcnJvcnMgb2NjdXJyZWQuIFRoZSBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkCisgKiBpbiB0aGUgJ2VycmJ1ZicgdmFyaWFibGUuCisgKi8KK2ludCBycGNhcF9zZW5kZXJyb3IoU09DS0VUIHNvY2ssIGNoYXIgKmVycm9yLCB1bnNpZ25lZCBzaG9ydCBlcnJjb2RlLCBjaGFyICplcnJidWYpCit7CisJY2hhciBzZW5kYnVmW1JQQ0FQX05FVEJVRl9TSVpFXTsJCQkvKiB0ZW1wb3JhcnkgYnVmZmVyIGluIHdoaWNoIGRhdGEgdG8gYmUgc2VudCBpcyBidWZmZXJlZCAqLworCWludCBzZW5kYnVmaWR4ID0gMDsJCQkJCQkJLyogaW5kZXggd2hpY2gga2VlcHMgdGhlIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgYnVmZmVyZWQgKi8KKwl1aW50MTYgbGVuZ3RoOworCisJbGVuZ3RoID0gKHVpbnQxNilzdHJsZW4oZXJyb3IpOworCisJaWYgKGxlbmd0aCA+IFBDQVBfRVJSQlVGX1NJWkUpCisJCWxlbmd0aCA9IFBDQVBfRVJSQlVGX1NJWkU7CisKKwlycGNhcF9jcmVhdGVoZHIoKHN0cnVjdCBycGNhcF9oZWFkZXIgKikgc2VuZGJ1ZiwgUlBDQVBfTVNHX0VSUk9SLCBlcnJjb2RlLCBsZW5ndGgpOworCisJaWYgKHNvY2tfYnVmZmVyaXplKE5VTEwsIHNpemVvZihzdHJ1Y3QgcnBjYXBfaGVhZGVyKSwgTlVMTCwgJnNlbmRidWZpZHgsCisJCVJQQ0FQX05FVEJVRl9TSVpFLCBTT0NLQlVGX0NIRUNLT05MWSwgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNvY2tfYnVmZmVyaXplKGVycm9yLCBsZW5ndGgsIHNlbmRidWYsICZzZW5kYnVmaWR4LAorCQlSUENBUF9ORVRCVUZfU0laRSwgU09DS0JVRl9CVUZGRVJJWkUsIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkpCisJCXJldHVybiAtMTsKKworCWlmIChzb2NrX3NlbmQoc29jaywgc2VuZGJ1Ziwgc2VuZGJ1ZmlkeCwgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFxpbmdyb3VwIHJlbW90ZV9wcmlfZnVuYworICogXGJyaWVmIFNlbmRzIHRoZSBhdXRoZW50aWNhdGlvbiBtZXNzYWdlLgorICoKKyAqIEl0IHNlbmRzIHRoZSBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzIG9uIHRoZSBjb250cm9sIHNvY2tldC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gb3BlbiB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBvdGhlciBlbmQgcGFydHkuCisgKgorICogXHBhcmFtIHNvY2s6IHRoZSBzb2NrZXQgd2UgYXJlIGN1cnJlbnRseSB1c2luZy4KKyAqCisgKiBccGFyYW0gYXV0aDogYXV0aGVudGljYXRpb24gcGFyYW1ldGVycyB0aGF0IGhhdmUgdG8gYmUgc2VudC4KKyAqCisgKiBccGFyYW0gZXJyYnVmOiBhIHBvaW50ZXIgdG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgKG9mIHNpemUgUENBUF9FUlJCVUZfU0laRSkKKyAqIHRoYXQgd2lsbCBjb250YWluIHRoZSBlcnJvciBtZXNzYWdlIChpbiBjYXNlIHRoZXJlIGlzIG9uZSkuIEl0IGNvdWxkIGJlIG5ldHdvcmsgcHJvYmxlbQorICogb2YgdGhlIGZhY3QgdGhhdCB0aGUgYXV0aG9yaXphdGlvbiBmYWlsZWQuCisgKgorICogXHJldHVybiAnMCcgaWYgZXZlcnl0aGluZyBpcyBmaW5lLCAnLTEnIGlmIHNvbWUgZXJyb3JzIG9jY3VycmVkLiBUaGUgZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZAorICogaW4gdGhlICdlcnJidWYnIHZhcmlhYmxlLgorICogVGhlIGVycm9yIG1lc3NhZ2UgY291bGQgYmUgYWxzbyAndGhlIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCcuCisgKi8KK2ludCBycGNhcF9zZW5kYXV0aChTT0NLRVQgc29jaywgc3RydWN0IHBjYXBfcm10YXV0aCAqYXV0aCwgY2hhciAqZXJyYnVmKQoreworCWNoYXIgc2VuZGJ1ZltSUENBUF9ORVRCVUZfU0laRV07CS8qIHRlbXBvcmFyeSBidWZmZXIgaW4gd2hpY2ggZGF0YSB0aGF0IGhhcyB0byBiZSBzZW50IGlzIGJ1ZmZlcmVkICovCisJaW50IHNlbmRidWZpZHggPSAwOwkJCQkJLyogaW5kZXggd2hpY2gga2VlcHMgdGhlIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgYnVmZmVyZWQgKi8KKwl1aW50MTYgbGVuZ3RoOwkJCQkJCS8qIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCBvZiB0aGlzIG1lc3NhZ2UgKi8KKwlzdHJ1Y3QgcnBjYXBfYXV0aCAqcnBhdXRoOworCXVpbnQxNiBhdXRoX3R5cGU7CisJc3RydWN0IHJwY2FwX2hlYWRlciBoZWFkZXI7CisJaW50IHJldHZhbDsJCQkJCQkJLyogdGVtcCB2YXJpYWJsZSB3aGljaCBzdG9yZXMgZnVuY3Rpb25zIHJldHVybiB2YWx1ZSAqLworCisJaWYgKGF1dGgpCisJeworCQlhdXRoX3R5cGUgPSBhdXRoLT50eXBlOworCisJCXN3aXRjaCAoYXV0aC0+dHlwZSkKKwkJeworCQljYXNlIFJQQ0FQX1JNVEFVVEhfTlVMTDoKKwkJCWxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgcnBjYXBfYXV0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJQQ0FQX1JNVEFVVEhfUFdEOgorCQkJbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBycGNhcF9hdXRoKTsKKwkJCWlmIChhdXRoLT51c2VybmFtZSkgbGVuZ3RoICs9ICh1aW50MTYpIHN0cmxlbihhdXRoLT51c2VybmFtZSk7CisJCQlpZiAoYXV0aC0+cGFzc3dvcmQpIGxlbmd0aCArPSAodWludDE2KSBzdHJsZW4oYXV0aC0+cGFzc3dvcmQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQXV0aGVudGljYXRpb24gdHlwZSBub3QgcmVjb2duaXplZC4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwllbHNlCisJeworCQlhdXRoX3R5cGUgPSBSUENBUF9STVRBVVRIX05VTEw7CisJCWxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgcnBjYXBfYXV0aCk7CisJfQorCisKKwlpZiAoc29ja19idWZmZXJpemUoTlVMTCwgc2l6ZW9mKHN0cnVjdCBycGNhcF9oZWFkZXIpLCBOVUxMLAorCQkmc2VuZGJ1ZmlkeCwgUlBDQVBfTkVUQlVGX1NJWkUsIFNPQ0tCVUZfQ0hFQ0tPTkxZLCBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKQorCQlyZXR1cm4gLTE7CisKKwlycGNhcF9jcmVhdGVoZHIoKHN0cnVjdCBycGNhcF9oZWFkZXIgKikgc2VuZGJ1ZiwgUlBDQVBfTVNHX0FVVEhfUkVRLCAwLCBsZW5ndGgpOworCisJcnBhdXRoID0gKHN0cnVjdCBycGNhcF9hdXRoICopICZzZW5kYnVmW3NlbmRidWZpZHhdOworCisJaWYgKHNvY2tfYnVmZmVyaXplKE5VTEwsIHNpemVvZihzdHJ1Y3QgcnBjYXBfYXV0aCksIE5VTEwsCisJCSZzZW5kYnVmaWR4LCBSUENBUF9ORVRCVUZfU0laRSwgU09DS0JVRl9DSEVDS09OTFksIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkpCisJCXJldHVybiAtMTsKKworCW1lbXNldChycGF1dGgsIDAsIHNpemVvZihzdHJ1Y3QgcnBjYXBfYXV0aCkpOworCisJcnBhdXRoLT50eXBlID0gaHRvbnMoYXV0aF90eXBlKTsKKworCWlmIChhdXRoX3R5cGUgPT0gUlBDQVBfUk1UQVVUSF9QV0QpCisJeworCisJCWlmIChhdXRoLT51c2VybmFtZSkKKwkJCXJwYXV0aC0+c2xlbjEgPSAodWludDE2KSBzdHJsZW4oYXV0aC0+dXNlcm5hbWUpOworCQllbHNlCisJCQlycGF1dGgtPnNsZW4xID0gMDsKKworCQlpZiAoc29ja19idWZmZXJpemUoYXV0aC0+dXNlcm5hbWUsIHJwYXV0aC0+c2xlbjEsIHNlbmRidWYsCisJCQkmc2VuZGJ1ZmlkeCwgUlBDQVBfTkVUQlVGX1NJWkUsIFNPQ0tCVUZfQlVGRkVSSVpFLCBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKQorCQkJcmV0dXJuIC0xOworCisJCWlmIChhdXRoLT5wYXNzd29yZCkKKwkJCXJwYXV0aC0+c2xlbjIgPSAodWludDE2KSBzdHJsZW4oYXV0aC0+cGFzc3dvcmQpOworCQllbHNlCisJCQlycGF1dGgtPnNsZW4yID0gMDsKKworCQlpZiAoc29ja19idWZmZXJpemUoYXV0aC0+cGFzc3dvcmQsIHJwYXV0aC0+c2xlbjIsIHNlbmRidWYsCisJCQkmc2VuZGJ1ZmlkeCwgUlBDQVBfTkVUQlVGX1NJWkUsIFNPQ0tCVUZfQlVGRkVSSVpFLCBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKQorCQkJcmV0dXJuIC0xOworCisJCXJwYXV0aC0+c2xlbjEgPSBodG9ucyhycGF1dGgtPnNsZW4xKTsKKwkJcnBhdXRoLT5zbGVuMiA9IGh0b25zKHJwYXV0aC0+c2xlbjIpOworCX0KKworCWlmIChzb2NrX3NlbmQoc29jaywgc2VuZGJ1Ziwgc2VuZGJ1ZmlkeCwgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNvY2tfcmVjdihzb2NrLCAoY2hhciAqKSZoZWFkZXIsIHNpemVvZihzdHJ1Y3QgcnBjYXBfaGVhZGVyKSwgU09DS19SRUNFSVZFQUxMX1lFUywgZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJcmV0dmFsID0gcnBjYXBfY2hlY2ttc2coZXJyYnVmLCBzb2NrLCAmaGVhZGVyLCBSUENBUF9NU0dfQVVUSF9SRVBMWSwgUlBDQVBfTVNHX0VSUk9SLCAwKTsKKworCWlmIChyZXR2YWwgIT0gUlBDQVBfTVNHX0FVVEhfUkVQTFkpCQkvKiB0aGUgbWVzc2FnZSBpcyBub3QgdGhlIG9uZSBleHBlY3RlZCAqLworCXsKKwkJc3dpdGNoIChyZXR2YWwpCisJCXsKKwkJY2FzZSAtMzoJCS8qIFVucmVjb3ZlcmFibGUgbmV0d29yayBlcnJvciAqLworCQljYXNlIC0yOgkJLyogVGhlIG90aGVyIGVuZHBvaW50IHNlbnQgYSBtZXNzYWdlIHRoYXQgaXMgbm90IGFsbG93ZWQgaGVyZSAqLworCQljYXNlIC0xOgkJLyogVGhlIG90aGVyIGVuZHBvaW50IGhhcyBhIHZlcnNpb24gbnVtYmVyIHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdXIgKi8KKwkJCS8qIERvIG5vdGhpbmc7IGp1c3QgZXhpdCBmcm9tIGhlcmU7IHRoZSBlcnJvciBjb2RlIGlzIGFscmVhZHkgaW50byB0aGUgZXJyYnVmICovCisJCQlyZXR1cm4gLTE7CisKKwkJY2FzZSBSUENBUF9NU0dfRVJST1I6CisJCQlyZXR1cm4gLTE7CisKKwkJZGVmYXVsdDoKKwkJCVNPQ0tfQVNTRVJUKCJJbnRlcm5hbCBlcnJvciIsIDApOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKG50b2hsKGhlYWRlci5wbGVuKSkKKwl7CisJCWlmIChzb2NrX2Rpc2NhcmQoc29jaywgbnRvaGwoaGVhZGVyLnBsZW4pLCBlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUpKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKiBcaW5ncm91cCByZW1vdGVfcHJpX2Z1bmMKKyAqIFxicmllZiBDcmVhdGVzIGEgc3RydWN0dXJlIG9mIHR5cGUgcnBjYXBfaGVhZGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQganVzdCBiZWNhdXNlIHRoZSBjcmVhdGlvbiBvZiBhbiBycGNhcCBoZWFkZXIgaXMgcXVpdGUgYSBjb21tb24KKyAqIHRhc2suIEl0IGFjY2VwdHMgYWxsIHRoZSB2YWx1ZXMgdGhhdCBhcHBlYXJzIGludG8gYW4gcnBjYXBfaGVhZGVyLCBhbmQgaXQgcHV0cyB0aGVtIGluCisgKiBwbGFjZSB1c2luZyB0aGUgcHJvcGVyIGh0b24oKSBjYWxscy4KKyAqCisgKiBccGFyYW0gaGVhZGVyOiBhIHBvaW50ZXIgdG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgd2hpY2ggd2lsbCBjb250YWluIHRoZSBzZXJpYWxpemVkCisgKiBoZWFkZXIsIHJlYWR5IHRvIGJlIHNlbnQgb24gdGhlIG5ldHdvcmsuCisgKgorICogXHBhcmFtIHR5cGU6IGEgdmFsdWUgKGluIHRoZSBob3N0IGJ5IG9yZGVyKSB3aGljaCB3aWxsIGJlIHBsYWNlZCBpbnRvIHRoZSBoZWFkZXIudHlwZQorICogZmllbGQgYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtZXNzYWdlLgorICoKKyAqIFxwYXJhbSB2YWx1ZTogYSB2YWx1ZSAoaW4gdGhlIGhvc3QgYnkgb3JkZXIpIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGludG8gdGhlIGhlYWRlci52YWx1ZQorICogZmllbGQgYW5kIHRoYXQgaGFzIGEgbWVzc2FnZS1kZXBlbmRlbnQgbWVhbmluZy4KKyAqCisgKiBccGFyYW0gbGVuZ3RoOiBhIHZhbHVlIChpbiB0aGUgaG9zdCBieSBvcmRlcikgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW50byB0aGUgaGVhZGVyLmxlbmd0aAorICogZmllbGQgYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgcGF5bG9hZCBsZW5ndGggb2YgdGhlIG1lc3NhZ2UuCisgKgorICogXHJldHVybiBOb3RoaW5nLiBUaGUgc2VyaWFsaXplZCBoZWFkZXIgaXMgcmV0dXJuZWQgaW50byB0aGUgJ2hlYWRlcicgdmFyaWFibGUuCisgKi8KK3ZvaWQgcnBjYXBfY3JlYXRlaGRyKHN0cnVjdCBycGNhcF9oZWFkZXIgKmhlYWRlciwgdWludDggdHlwZSwgdWludDE2IHZhbHVlLCB1aW50MzIgbGVuZ3RoKQoreworCW1lbXNldChoZWFkZXIsIDAsIHNpemVvZihzdHJ1Y3QgcnBjYXBfaGVhZGVyKSk7CisKKwloZWFkZXItPnZlciA9IFJQQ0FQX1ZFUlNJT047CisJaGVhZGVyLT50eXBlID0gdHlwZTsKKwloZWFkZXItPnZhbHVlID0gaHRvbnModmFsdWUpOworCWhlYWRlci0+cGxlbiA9IGh0b25sKGxlbmd0aCk7Cit9CisKKy8qIGluZ3JvdXAgcmVtb3RlX3ByaV9mdW5jCisgKiBcYnJpZWYgQ2hlY2tzIGlmIHRoZSBoZWFkZXIgb2YgdGhlIHJlY2VpdmVkIG1lc3NhZ2UgaXMgY29ycmVjdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgd2F5IHRvIGVhc2lseSBjaGVjayBpZiB0aGUgbWVzc2FnZSByZWNlaXZlZCwgaW4gYSBjZXJ0YWluCisgKiBzdGF0ZSBvZiB0aGUgUlBDQVAgcHJvdG9jb2wgRmluaXRlIFN0YXRlIE1hY2hpbmUsIGlzIHZhbGlkLiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMsCisgKiBhcyBhIHBhcmFtZXRlciwgdGhlIGxpc3Qgb2YgbWVzc2FnZSB0eXBlcyB0aGF0IGFyZSBhbGxvd2VkIGluIGEgY2VydGFpbiBzaXR1YXRpb24sCisgKiBhbmQgaXQgcmV0dXJucyB0aGUgb25lIHdoaWNoIG9jY3Vycy4KKyAqCisgKiBccGFyYW0gZXJyYnVmOiBhIHBvaW50ZXIgdG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgKG9mIHNpemUgUENBUF9FUlJCVUZfU0laRSkKKyAqIHRoYXQgd2lsbCBjb250YWluIHRoZSBlcnJvciBtZXNzYWdlIChpbiBjYXNlIHRoZXJlIGlzIG9uZSkuIEl0IGNvdWxkIGJlIGVpdGhlciBwcm9ibGVtCisgKiBvY2N1cnJlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbiAoZS5nLiBhIG5ldHdvcmsgcHJvYmxlbSBpbiBjYXNlIGl0IHRyaWVzIHRvIHNlbmQgYW4KKyAqIGVycm9yIG9uIHRoZSBvdGhlciBwZWVyIGFuZCB0aGUgc2VuZCgpIGNhbGwgZmFpbHMpLCBhbiBlcnJvciBtZXNzYWdlIHdoaWNoIGhhcyBiZWVuCisgKiBzZW50IHRvIHVzIGZyb20gdGhlIG90aGVyIHBhcnR5LCBvciBhIHZlcnNpb24gZXJyb3IgKHRoZSBtZXNzYWdlIHJlY2VpdmUgaGFzIGEgdmVyc2lvbgorICogbnVtYmVyIHRoYXQgaXMgaW5jb21wYXRpYmxlIHdpdGggb3VyKS4KKyAqCisgKiBccGFyYW0gc29jazogdGhlIHNvY2tldCB0aGF0IGhhcyB0byBiZSB1c2VkIHRvIHJlY2VpdmUgZGF0YS4gVGhpcyBmdW5jdGlvbiBjYW4KKyAqIHJlYWQgZGF0YSBmcm9tIHNvY2tldCBpbiBjYXNlIHRoZSB2ZXJzaW9uIGNvbnRhaW5lZCBpbnRvIHRoZSBtZXNzYWdlIGlzIG5vdCBjb21wYXRpYmxlCisgKiB3aXRoIG91ci4gSW4gdGhhdCBjYXNlLCBhbGwgdGhlIG1lc3NhZ2UgaXMgcHVyZ2VkIGZyb20gdGhlIHNvY2tldCwgc28gdGhhdCB0aGUgZm9sbG93aW5nCisgKiByZWN2KCkgY2FsbHMgd2lsbCByZXR1cm4gYSBuZXcgbWVzc2FnZS4KKyAqCisgKiBccGFyYW0gaGVhZGVyOiBhIHBvaW50ZXIgdG8gYW5kICdycGNhcF9oZWFkZXInIHN0cnVjdHVyZSB0aGF0IGtlZXBzIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20KKyAqIHRoZSBuZXR3b3JrIChzdGlsbCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpIGFuZCB0aGF0IGhhcyB0byBiZSBjaGVja2VkLgorICoKKyAqIFxwYXJhbSBmaXJzdDogdGhpcyBmdW5jdGlvbiBoYXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgcGFyYW1ldGVycy4gRnJvbSB0aGlzIHBvaW50IG9uLAorICogYWxsIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSB2YWxpZCBpbiB0aGlzIGNvbnRleHQgbXVzdCBiZSBwYXNzZWQgYXMgcGFyYW1ldGVycy4KKyAqIFRoZSBtZXNzYWdlIHR5cGUgbGlzdCBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhICcwJyB2YWx1ZSwgdGhlIG51bGwgbWVzc2FnZSB0eXBlLAorICogd2hpY2ggbWVhbnMgJ25vIG1vcmUgdHlwZXMgdG8gY2hlY2snLiBUaGUgUlBDQVAgcHJvdG9jb2wgZG9lcyBub3QgZGVmaW5lIGFueXRoaW5nIHdpdGgKKyAqIG1lc3NhZ2UgdHlwZSBlcXVhbCB0byB6ZXJvLCBzbyB0aGVyZSBpcyBubyBhbWJpZ3VpdHkgaW4gdXNpbmcgdGhpcyB2YWx1ZSBhcyBhIGxpc3QgdGVybWluYXRvci4KKyAqCisgKiBccmV0dXJuIFRoZSBtZXNzYWdlIHR5cGUgb2YgdGhlIG1lc3NhZ2UgdGhhdCBoYXMgYmVlbiBkZXRlY3RlZC4gSW4gY2FzZSBvZiBlcnJvcnMgKGUuZy4gdGhlCisgKiBoZWFkZXIgY29udGFpbnMgYSB0eXBlIHRoYXQgaXMgbm90IGxpc3RlZCBhbW9uZyB0aGUgYWxsb3dlZCB0eXBlcyksIHRoaXMgZnVuY3Rpb24gd2lsbAorICogcmV0dXJuIHRoZSBmb2xsb3dpbmcgY29kZXM6CisgKiAtICgtMSkgaWYgdGhlIHZlcnNpb24gaXMgaW5jb21wYXRpYmxlLgorICogLSAoLTIpIGlmIHRoZSBjb2RlIGlzIG5vdCBhbW9uZyB0aGUgb25lIGxpc3RlZCBpbnRvIHRoZSBwYXJhbWV0ZXJzIGxpc3QKKyAqIC0gKC0zKSBpZiBhIG5ldHdvcmsgZXJyb3IgKGNvbm5lY3Rpb24gcmVzZXQsIC4uLikKKyAqIC0gUlBDQVBfTVNHX0VSUk9SIGlmIHRoZSBtZXNzYWdlIGlzIGFuIGVycm9yIG1lc3NhZ2UgKGl0IGZvbGxvdyB0aGF0IHRoZSBSUENBUF9NU0dfRVJST1IKKyAqIGNvdWxkIG5vdCBiZSBwcmVzZW50IGluIHRoZSBhbGxvd2VkIG1lc3NhZ2UtdHlwZXMgbGlzdCwgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGNoZWNrcworICogZm9yIGVycm9ycyBhbnl3YXkpCisgKgorICogSW4gY2FzZSBlaXRoZXIgdGhlIHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIG9yIG5vdGhpbmcgbWF0Y2hlcyAoaS5lLiBpdCByZXR1cm5zICctMScgb3IgJy0yJyksCisgKiBpdCBkaXNjYXJkcyB0aGUgbWVzc2FnZSBib2R5IChpLmUuIGl0IHJlYWRzIHRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgbWVzc2FnZSBmcm9tIHRoZQorICogbmV0d29yayBhbmQgaXQgZGlzY2FyZHMgaXQpIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIHJlYWR5IHRvIHJlY2VpdmUgYSBuZXcgbWVzc2FnZS4KKyAqLworaW50IHJwY2FwX2NoZWNrbXNnKGNoYXIgKmVycmJ1ZiwgU09DS0VUIHNvY2ssIHN0cnVjdCBycGNhcF9oZWFkZXIgKmhlYWRlciwgdWludDggZmlyc3QsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXVpbnQ4IHR5cGU7CisJaW50MzIgbGVuOworCisJdmFfc3RhcnQoYXAsIGZpcnN0KTsKKworCS8qIENoZWNrIGlmIHRoZSBwcmVzZW50IHZlcnNpb24gb2YgdGhlIHByb3RvY29sIGNhbiBoYW5kbGUgdGhpcyBtZXNzYWdlICovCisJaWYgKHJwY2FwX2NoZWNrdmVyKHNvY2ssIGhlYWRlciwgZXJyYnVmKSkKKwl7CisJCVNPQ0tfQVNTRVJUKGVycmJ1ZiwgMSk7CisKKwkJdmFfZW5kKGFwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXR5cGUgPSBmaXJzdDsKKworCXdoaWxlICh0eXBlICE9IDApCisJeworCQkvKgorCQkgKiBUaGUgbWVzc2FnZSBtYXRjaGVzIHdpdGggb25lIG9mIHRoZSB0eXBlcyBsaXN0ZWQKKwkJICogVGhlcmUgaXMgbm8gbmVlZCBvZiBjb252ZXJzaW9ucyBzaW5jZSBib3RoIHZhbHVlcyBhcmUgdWludDgKKwkJICoKKwkJICogQ2hlY2sgaWYgdGhlIG90aGVyIHNpZGUgcmVwb3J0ZWQgYW4gZXJyb3IuCisJCSAqIElmIHllcywgaXQgcmV0cmlldmVzIGl0IGFuZCBpdCByZXR1cm5zIGl0IGJhY2sgdG8gdGhlIGNhbGxlcgorCQkgKi8KKwkJaWYgKGhlYWRlci0+dHlwZSA9PSBSUENBUF9NU0dfRVJST1IpCisJCXsKKwkJCWxlbiA9IG50b2hsKGhlYWRlci0+cGxlbik7CisKKwkJCWlmIChsZW4gPj0gUENBUF9FUlJCVUZfU0laRSkKKwkJCXsKKwkJCQlpZiAoc29ja19yZWN2KHNvY2ssIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSAtIDEsIFNPQ0tfUkVDRUlWRUFMTF9ZRVMsIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkpCisJCQkJCXJldHVybiAtMzsKKworCQkJCXNvY2tfZGlzY2FyZChzb2NrLCBsZW4gLSAoUENBUF9FUlJCVUZfU0laRSAtIDEpLCBOVUxMLCAwKTsKKworCQkJCS8qIFB1dCAnXDAnIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLworCQkJCWVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFIC0gMV0gPSAwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChzb2NrX3JlY3Yoc29jaywgZXJyYnVmLCBsZW4sIFNPQ0tfUkVDRUlWRUFMTF9ZRVMsIGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSkgPT0gLTEpCisJCQkJCXJldHVybiAtMzsKKworCQkJCS8qIFB1dCAnXDAnIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyAqLworCQkJCWVycmJ1ZltsZW5dID0gMDsKKwkJCX0KKworCisJCQl2YV9lbmQoYXApOworCQkJcmV0dXJuIGhlYWRlci0+dHlwZTsKKwkJfQorCisJCWlmIChoZWFkZXItPnR5cGUgPT0gdHlwZSkKKwkJeworCQkJdmFfZW5kKGFwKTsKKwkJCXJldHVybiBoZWFkZXItPnR5cGU7CisJCX0KKworCQkvKiBnZXQgbmV4dCBhcmd1bWVudCAqLworCQl0eXBlID0gdmFfYXJnKGFwLCBpbnQpOworCX0KKworCS8qIHdlIGFscmVhZHkgaGF2ZSBhbiBlcnJvciwgc28gcGxlYXNlIGRpc2NhcmQgdGhpcyBvbmUgKi8KKwlzb2NrX2Rpc2NhcmQoc29jaywgbnRvaGwoaGVhZGVyLT5wbGVuKSwgTlVMTCwgMCk7CisKKwlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlRoZSBvdGhlciBlbmRwb2ludCBzZW50IGEgbWVzc2FnZSB0aGF0IGlzIG5vdCBhbGxvd2VkIGhlcmUuIik7CisJU09DS19BU1NFUlQoZXJyYnVmLCAxKTsKKworCXZhX2VuZChhcCk7CisJcmV0dXJuIC0yOworfQorCisvKiBcaW5ncm91cCByZW1vdGVfcHJpX2Z1bmMKKyAqIFxicmllZiBDaGVja3MgaWYgdGhlIHZlcnNpb24gY29udGFpbmVkIGludG8gdGhlIG1lc3NhZ2UgaXMgY29tcGF0aWJsZSB3aXRoCisgKiB0aGUgb25lIGhhbmRsZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBSaWdodCBub3csIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgc29waGlzdGljYXRlZCB0YXNrOiBpZiB0aGUgdmVyc2lvbnMKKyAqIGFyZSBkaWZmZXJlbnQsIGl0IHJldHVybnMgLTEgYW5kIGl0IGRpc2NhcmRzIHRoZSBtZXNzYWdlLgorICogSXQgaXMgZXhwZWN0ZWQgdGhhdCBpbiB0aGUgZnV0dXJlIHRoaXMgbWVzc2FnZSB3aWxsIGJlY29tZSBtb3JlIGNvbXBsZXguCisgKgorICogXHBhcmFtIHNvY2s6IHRoZSBzb2NrZXQgdGhhdCBoYXMgdG8gYmUgdXNlZCB0byByZWNlaXZlIGRhdGEuIFRoaXMgZnVuY3Rpb24gY2FuCisgKiByZWFkIGRhdGEgZnJvbSBzb2NrZXQgaW4gY2FzZSB0aGUgdmVyc2lvbiBjb250YWluZWQgaW50byB0aGUgbWVzc2FnZSBpcyBub3QgY29tcGF0aWJsZQorICogd2l0aCBvdXIuIEluIHRoYXQgY2FzZSwgYWxsIHRoZSBtZXNzYWdlIGlzIHB1cmdlZCBmcm9tIHRoZSBzb2NrZXQsIHNvIHRoYXQgdGhlIGZvbGxvd2luZworICogcmVjdigpIGNhbGxzIHdpbGwgcmV0dXJuIGEgbmV3IChjbGVhbikgbWVzc2FnZS4KKyAqCisgKiBccGFyYW0gaGVhZGVyOiBhIHBvaW50ZXIgdG8gYW5kICdycGNhcF9oZWFkZXInIHN0cnVjdHVyZSB0aGF0IGtlZXBzIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20KKyAqIHRoZSBuZXR3b3JrIChzdGlsbCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpIGFuZCB0aGF0IGhhcyB0byBiZSBjaGVja2VkLgorICoKKyAqIFxwYXJhbSBlcnJidWY6IGEgcG9pbnRlciB0byBhIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciAob2Ygc2l6ZSBQQ0FQX0VSUkJVRl9TSVpFKQorICogdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGVycm9yIG1lc3NhZ2UgKGluIGNhc2UgdGhlcmUgaXMgb25lKS4gVGhlIGVycm9yIG1lc3NhZ2UgaXMKKyAqICJpbmNvbXBhdGlibGUgdmVyc2lvbiIuCisgKgorICogXHJldHVybiAnMCcgaWYgZXZlcnl0aGluZyBpcyBmaW5lLCAnLTEnIGlmIHNvbWUgZXJyb3JzIG9jY3VycmVkLiBUaGUgZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZAorICogaW4gdGhlICdlcnJidWYnIHZhcmlhYmxlLgorICovCitzdGF0aWMgaW50IHJwY2FwX2NoZWNrdmVyKFNPQ0tFVCBzb2NrLCBzdHJ1Y3QgcnBjYXBfaGVhZGVyICpoZWFkZXIsIGNoYXIgKmVycmJ1ZikKK3sKKwkvKgorCSAqIFRoaXMgaXMgYSBzYW1wbGUgZnVuY3Rpb24uCisJICoKKwkgKiBJbiB0aGUgcmVhbCB3b3JsZCwgeW91IGhhdmUgdG8gY2hlY2sgYXQgdGhlIHR5cGUgY29kZSwKKwkgKiBhbmQgZGVjaWRlIGFjY29yZGluZ2x5LgorCSAqLworCisJaWYgKGhlYWRlci0+dmVyICE9IFJQQ0FQX1ZFUlNJT04pCisJeworCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkluY29tcGF0aWJsZSB2ZXJzaW9uIG51bWJlcjogbWVzc2FnZSBkaXNjYXJkZWQuIik7CisKKwkJLyogd2UgYWxyZWFkeSBoYXZlIGFuIGVycm9yLCBzbyBwbGVhc2UgZGlzY2FyZCB0aGlzIG9uZSAqLworCQlzb2NrX2Rpc2NhcmQoc29jaywgbnRvaGwoaGVhZGVyLT5wbGVuKSwgTlVMTCwgMCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogXGluZ3JvdXAgcmVtb3RlX3ByaV9mdW5jCisgKgorICogXGJyaWVmIEl0IHJldHVybnMgdGhlIHNvY2tldCBjdXJyZW50bHkgdXNlZCBmb3IgdGhpcyBhY3RpdmUgY29ubmVjdGlvbgorICogKGFjdGl2ZSBtb2RlIG9ubHkpIGFuZCBwcm92aWRlcyBhbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uCisgKiBpcyBpbiBhY3RpdmUgbW9kZSBvciBub3QuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBqdXN0IGZvciBpbnRlcm5hbCB1c2U7IGl0IHJldHVybnMgdGhlIHNvY2tldCBJRCBvZiB0aGUKKyAqIGFjdGl2ZSBjb25uZWN0aW9uIGN1cnJlbnRseSBvcGVuZWQuCisgKgorICogXHBhcmFtIGhvc3Q6IGEgc3RyaW5nIHRoYXQga2VlcHMgdGhlIGhvc3QgbmFtZSBvZiB0aGUgaG9zdCBmb3Igd2hpY2ggd2UKKyAqIHdhbnQgdG8gZ2V0IHRoZSBzb2NrZXQgSUQgZm9yIHRoYXQgYWN0aXZlIGNvbm5lY3Rpb24uCisgKgorICogXHBhcmFtIGlzYWN0aXZlOiBhIHBvaW50ZXIgdG8gYW4gaW50IHRoYXQgaXMgc2V0IHRvIDEgaWYgdGhlcmUncyBhbgorICogYWN0aXZlIGNvbm5lY3Rpb24gdG8gdGhhdCBob3N0IGFuZCAwIG90aGVyd2lzZS4KKyAqCisgKiBccGFyYW0gZXJyYnVmOiBhIHBvaW50ZXIgdG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIgKG9mIHNpemUKKyAqIFBDQVBfRVJSQlVGX1NJWkUpIHRoYXQgd2lsbCBjb250YWluIHRoZSBlcnJvciBtZXNzYWdlIChpbiBjYXNlCisgKiB0aGVyZSBpcyBvbmUpLgorICoKKyAqIFxyZXR1cm4gdGhlIHNvY2tldCBpZGVudGlmaWVyIGlmIGV2ZXJ5dGhpbmcgaXMgZmluZSwgJzAnIGlmIHRoaXMgaG9zdAorICogaXMgbm90IGluIHRoZSBhY3RpdmUgaG9zdCBsaXN0LiBBbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhpcyBob3N0CisgKiBpcyBpbiB0aGUgYWN0aXZlIGhvc3QgbGlzdCBpcyByZXR1cm5lZCBpbnRvIHRoZSBpc2FjdGl2ZSB2YXJpYWJsZS4KKyAqIEl0IHJldHVybnMgJ0lOVkFMSURfU09DS0VUJyBpbiBjYXNlIG9mIGVycm9yLiBUaGUgZXJyb3IgbWVzc2FnZSBpcworICogcmV0dXJuZWQgaW50byB0aGUgZXJyYnVmIHZhcmlhYmxlLgorICovCitTT0NLRVQgcnBjYXBfcmVtb3RlYWN0X2dldHNvY2soY29uc3QgY2hhciAqaG9zdCwgaW50ICppc2FjdGl2ZSwgY2hhciAqZXJyYnVmKQoreworCXN0cnVjdCBhY3RpdmVob3N0cyAqdGVtcDsJCQkJCS8qIHRlbXAgdmFyIG5lZWRlZCB0byBzY2FuIHRoZSBob3N0IGxpc3QgY2hhaW4gKi8KKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphZGRyaW5mbywgKmFpX25leHQ7CS8qIHRlbXAgdmFyIG5lZWRlZCB0byB0cmFuc2xhdGUgYmV0d2VlbiBob3N0bmFtZSB0byBpdHMgYWRkcmVzcyAqLworCWludCByZXR2YWw7CisKKwkvKiByZXRyaWV2ZSB0aGUgbmV0d29yayBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gJ2hvc3QnICovCisJYWRkcmluZm8gPSBOVUxMOworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKKwloaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKworCXJldHZhbCA9IGdldGFkZHJpbmZvKGhvc3QsICIwIiwgJmhpbnRzLCAmYWRkcmluZm8pOworCWlmIChyZXR2YWwgIT0gMCkKKwl7CisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZ2V0YWRkcmluZm8oKSAlcyIsIGdhaV9zdHJlcnJvcihyZXR2YWwpKTsKKwkJKmlzYWN0aXZlID0gMDsKKwkJcmV0dXJuIElOVkFMSURfU09DS0VUOworCX0KKworCXRlbXAgPSBhY3RpdmVIb3N0czsKKworCXdoaWxlICh0ZW1wKQorCXsKKwkJYWlfbmV4dCA9IGFkZHJpbmZvOworCQl3aGlsZSAoYWlfbmV4dCkKKwkJeworCQkJaWYgKHNvY2tfY21wYWRkcigmdGVtcC0+aG9zdCwgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICopIGFpX25leHQtPmFpX2FkZHIpID09IDApIHsKKwkJCQkqaXNhY3RpdmUgPSAxOworCQkJCXJldHVybiAodGVtcC0+c29ja2N0cmwpOworCQkJfQorCisJCQlhaV9uZXh0ID0gYWlfbmV4dC0+YWlfbmV4dDsKKwkJfQorCQl0ZW1wID0gdGVtcC0+bmV4dDsKKwl9CisKKwlpZiAoYWRkcmluZm8pCisJCWZyZWVhZGRyaW5mbyhhZGRyaW5mbyk7CisKKwkvKgorCSAqIFRoZSBob3N0IGZvciB3aGljaCB5b3Ugd2FudCB0byBnZXQgdGhlIHNvY2tldCBJRCBkb2VzIG5vdCBoYXZlIGFuCisJICogYWN0aXZlIGNvbm5lY3Rpb24uCisJICovCisJKmlzYWN0aXZlID0gMDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3BjYXAtcnBjYXAuaCBiL3BjYXAtcnBjYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODRlOGJhCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1ycGNhcC5oCkBAIC0wLDAgKzEsNDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIC0gMjAwNSBOZXRHcm91cCwgUG9saXRlY25pY28gZGkgVG9yaW5vIChJdGFseSkKKyAqIENvcHlyaWdodCAoYykgMjAwNSAtIDIwMDggQ0FDRSBUZWNobm9sb2dpZXMsIERhdmlzIChDYWxpZm9ybmlhKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBQb2xpdGVjbmljbyBkaSBUb3Jpbm8sIENBQ0UgVGVjaG5vbG9naWVzCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1BDQVBfUlBDQVBfSF9fCisjZGVmaW5lIF9fUENBUF9SUENBUF9IX18KKworCisjaW5jbHVkZSAicGNhcC5oIgorI2luY2x1ZGUgInNvY2t1dGlscy5oIgkvKiBOZWVkZWQgZm9yIHNvbWUgc3RydWN0dXJlcyAobGlrZSBTT0NLRVQsIHNvY2thZGRyX2luKSB3aGljaCBhcmUgdXNlZCBoZXJlICovCisKKworLyoKKyAqIFxmaWxlIHBjYXAtcGNhcC5oCisgKgorICogVGhpcyBmaWxlIGtlZXBzIGFsbCB0aGUgbmV3IGRlZmluaXRpb25zIGFuZCB0eXBlZGVmcyB0aGF0IGFyZSBleHBvcnRlZCB0byB0aGUgdXNlciBhbmQKKyAqIHRoYXQgYXJlIG5lZWRlZCBmb3IgdGhlIFJQQ0FQIHByb3RvY29sLgorICoKKyAqIFx3YXJuaW5nIEFsbCB0aGUgUlBDQVAgZnVuY3Rpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gcmV0dXJuIGEgYnVmZmVyIGNvbnRhaW5pbmcKKyAqIHRoZSBlcnJvciBkZXNjcmlwdGlvbiBjYW4gcmV0dXJuIG1heCBQQ0FQX0VSUkJVRl9TSVpFIGNoYXJhY3RlcnMuCisgKiBIb3dldmVyIHRoZXJlIGlzIG5vIGd1YXJhbnRlZXMgdGhhdCB0aGUgc3RyaW5nIHdpbGwgYmUgemVyby10ZXJtaW5hdGVkLgorICogQmVzdCBwcmFjdGljZSBpcyB0byBkZWZpbmUgdGhlIGVycmJ1ZiB2YXJpYWJsZSBhcyBhIGNoYXIgb2Ygc2l6ZSAnUENBUF9FUlJCVUZfU0laRSsxJworICogYW5kIHRvIGluc2VydCBtYW51YWxseSB0aGUgdGVybWluYXRpb24gY2hhciBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuIFRoaXMgd2lsbAorICogZ3VhcmFudGVlIHRoYXQgbm8gYnVmZmVyIG92ZXJmbG93cyBvY2N1ciBldmVuIGlmIHdlIHVzZSB0aGUgcHJpbnRmKCkgdG8gc2hvdworICogdGhlIGVycm9yIG9uIHRoZSBzY3JlZW4uCisgKgorICogXHdhcm5pbmcgVGhpcyBmaWxlIGRlY2xhcmVzIHNvbWUgdHlwZWRlZnMgdGhhdCBNVVNUIGJlIG9mIGEgc3BlY2lmaWMgc2l6ZS4KKyAqIFRoZXNlIGRlZmluaXRpb25zIChpLmUuIHR5cGVkZWZzKSBjb3VsZCBuZWVkIHRvIGJlIGNoYW5nZWQgb24gb3RoZXIgcGxhdGZvcm1zIHRoYW4KKyAqIEludGVsIElBMzIuCisgKgorICogXHdhcm5pbmcgVGhpcyBmaWxlIGRlZmluZXMgc29tZSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHVzZWQgdG8gdHJhbnNmZXIgZGF0YSBvbiB0aGUgbmV0d29yay4KKyAqIEJlIGNhcmVmdWwgdGhhdCB5b3UgY29tcGlsZXIgTVVTVCBub3QgaW5zZXJ0IHBhZGRpbmcgaW50byB0aGVzZSBzdHJ1Y3R1cmVzCisgKiBmb3IgYmV0dGVyIGFsaWdubWVudC4KKyAqIFRoZXNlIHN0cnVjdHVyZXMgaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gb3JkZXIgdG8gYmUgY29ycmVjdGx5IGFsaWduZWQgdG8gYSAzMiBiaXRzCisgKiBib3VuZGFyeSwgYnV0IGJlIGNhcmVmdWwgaW4gYW55IGNhc2UuCisgKi8KKworCisKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBHZW5lcmFsIGRlZmluaXRpb25zIC8gdHlwZWRlZnMgZm9yIHRoZSBSUENBUCBwcm90b2NvbCAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBbGwgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIGFuZCB0eXBlZGVmIGJlbG9uZ3MgdG8gdGhlIFByaXZhdGUgRG9jdW1lbnRhdGlvbiAqLworLyoKKyAqIFxhZGR0b2dyb3VwIHJlbW90ZV9wcmlfc3RydWN0CisgKiBceworICovCisKKyNkZWZpbmUgUlBDQVBfREVGQVVMVF9ORVRQT1JUICIyMDAyIiAvKiBEZWZhdWx0IHBvcnQgb24gd2hpY2ggdGhlIFJQQ0FQIGRhZW1vbiBpcyB3YWl0aW5nIGZvciBjb25uZWN0aW9ucy4gKi8KKy8qIERlZmF1bHQgcG9ydCBvbiB3aGljaCB0aGUgY2xpZW50IHdvcmtzdGF0aW9uIGlzIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb25zIGluIGNhc2Ugb2YgYWN0aXZlIG1vZGUuICovCisjZGVmaW5lIFJQQ0FQX0RFRkFVTFRfTkVUUE9SVF9BQ1RJVkUgIjIwMDMiCisjZGVmaW5lIFJQQ0FQX0RFRkFVTFRfTkVUQUREUiAiIgkvKiBEZWZhdWx0IG5ldHdvcmsgYWRkcmVzcyBvbiB3aGljaCB0aGUgUlBDQVAgZGFlbW9uIGJpbmRzIHRvLiAqLworI2RlZmluZSBSUENBUF9WRVJTSU9OIDAJCQkJLyogUHJlc2VudCB2ZXJzaW9uIG9mIHRoZSBSUENBUCBwcm90b2NvbCAoMCA9IEV4cGVyaW1lbnRhbCkuICovCisjZGVmaW5lIFJQQ0FQX1RJTUVPVVRfSU5JVCA5MAkJLyogSW5pdGlhbCB0aW1lb3V0IGZvciBSUENBUCBjb25uZWN0aW9ucyAoZGVmYXVsdDogOTAgc2VjKSAqLworI2RlZmluZSBSUENBUF9USU1FT1VUX1JVTlRJTUUgMTgwCS8qIFJ1bi10aW1lIHRpbWVvdXQgZm9yIFJQQ0FQIGNvbm5lY3Rpb25zIChkZWZhdWx0OiAzIG1pbikgKi8KKyNkZWZpbmUgUlBDQVBfQUNUSVZFX1dBSVQgMzAJCS8qIFdhaXRpbmcgdGltZSBiZXR3ZWVuIHR3byBhdHRlbXB0cyB0byBvcGVuIGEgY29ubmVjdGlvbiwgaW4gYWN0aXZlIG1vZGUgKGRlZmF1bHQ6IDMwIHNlYykgKi8KKyNkZWZpbmUgUlBDQVBfU1VTUEVORF9XUk9OR0FVVEggMQkvKiBJZiB0aGUgYXV0aGVudGljYXRpb24gaXMgd3JvbmcsIHN0b3BzIDEgc2VjIGJlZm9yZSBhY2NlcHRpbmcgYSBuZXcgYXV0aCBtZXNzYWdlICovCisKKy8qCisgKiBcYnJpZWYgQnVmZmVyIHVzZWQgYnkgc29ja2V0IGZ1bmN0aW9ucyB0byBzZW5kLXJlY2VpdmUgcGFja2V0cy4KKyAqIEluIGNhc2UgeW91IHBsYW4gdG8gaGF2ZSBtZXNzYWdlcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCB5b3UgaGF2ZSB0byBpbmNyZWFzZSBpdC4KKyAqLworI2RlZmluZSBSUENBUF9ORVRCVUZfU0laRSA2NDAwMAorCisKKy8qCisgKiBcYnJpZWYgU2VwYXJhdG9ycyB1c2VkIGZvciB0aGUgaG9zdCBsaXN0LgorICoKKyAqIEl0IGlzIHVzZWQ6CisgKiAtIGJ5IHRoZSBycGNhcGQgZGFlbW9uLCB3aGVuIHlvdSB0eXBlcyBhIGxpc3Qgb2YgYWxsb3dlZCBjb25uZWN0aW5nIGhvc3RzCisgKiAtIGJ5IHRoZSBycGNhcCBpbiBhY3RpdmUgbW9kZSwgd2hlbiB0aGUgY2xpZW50IHdhaXRzIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyBmcm9tIG90aGVyIGhvc3RzCisgKi8KKyNkZWZpbmUgUlBDQVBfSE9TVExJU1RfU0VQICIgLDtcblxyIgorCisKKworCisvKiBXQVJOSU5HOiBUaGVzZSBjb3VsZCBuZWVkIHRvIGJlIGNoYW5nZWQgb24gb3RoZXIgcGxhdGZvcm1zICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7CQkvKiBQcm92aWRlcyBhbiA4LWJpdHMgdW5zaWduZWQgaW50ZWdlciAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTY7CQkvKiBQcm92aWRlcyBhIDE2LWJpdHMgdW5zaWduZWQgaW50ZWdlciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyOwkJLyogUHJvdmlkZXMgYSAzMi1iaXRzIHVuc2lnbmVkIGludGVnZXIgKi8KK3R5cGVkZWYgaW50IGludDMyOwkJCQkJLyogUHJvdmlkZXMgYSAzMi1iaXRzIGludGVnZXIgKi8KKworCisKKworLyoKKyAqIFxicmllZiBLZWVwcyBhIGxpc3Qgb2YgYWxsIHRoZSBvcGVuZWQgY29ubmVjdGlvbnMgaW4gdGhlIGFjdGl2ZSBtb2RlLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBsaW5rZWQgbGlzdCBvZiBpdGVtcyB0aGF0IGFyZSBuZWVkZWQgdG8ga2VlcCB0aGUgaW5mbyByZXF1aXJlZCB0bworICogbWFuYWdlIHRoZSBhY3RpdmUgbW9kZS4KKyAqIEluIG90aGVyIHdvcmRzLCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gaW4gYWN0aXZlIG1vZGUgc3RhcnRzLCB0aGlzIHN0cnVjdHVyZSBpcyB1cGRhdGVkIHNvIHRoYXQKKyAqIGl0IHJlZmxlY3RzIHRoZSBsaXN0IG9mIGFjdGl2ZSBtb2RlIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBvcGVuZWQuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyByZXF1aXJlZCBieSBmaW5kYWxsZGV2cygpIGFuZCBvcGVuX3JlbW90ZSgpIHRvIHNlZSBpZiB0aGV5IGhhdmUgdG8gb3BlbiBhIG5ldworICogY29udHJvbCBjb25uZWN0aW9uIHRvd2FyZCB0aGUgaG9zdCwgb3IgdGhleSBhbHJlYWR5IGhhdmUgYSBjb250cm9sIGNvbm5lY3Rpb24gaW4gcGxhY2UuCisgKi8KK3N0cnVjdCBhY3RpdmVob3N0cworeworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGhvc3Q7CisJU09DS0VUIHNvY2tjdHJsOworCXN0cnVjdCBhY3RpdmVob3N0cyAqbmV4dDsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUHJvdG9jb2wgbWVzc2FnZXMgZm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdBUk5JTkcgVGFrZSBjYXJlIHlvdSBjb21waWxlciBkb2VzIG5vdCBpbnNlcnQgcGFkZGluZyBmb3IgYmV0dGVyIGFsaWdubWVudHMgaW50byB0aGVzZSBzdHJ1Y3RzICovCisKKworLyogQ29tbW9uIGhlYWRlciBmb3IgYWxsIHRoZSBSUENBUCBtZXNzYWdlcyAqLworc3RydWN0IHJwY2FwX2hlYWRlcgoreworCXVpbnQ4IHZlcjsJCQkJCQkJLyogUlBDQVAgdmVyc2lvbiBudW1iZXIgKi8KKwl1aW50OCB0eXBlOwkJCQkJCQkvKiBSUENBUCBtZXNzYWdlIHR5cGUgKGVycm9yLCBmaW5kYWxsZGV2cywgLi4uKSAqLworCXVpbnQxNiB2YWx1ZTsJCQkJCQkvKiBNZXNzYWdlLWRlcGVuZGVudCB2YWx1ZSAobm90IGFsd2F5cyB1c2VkKSAqLworCXVpbnQzMiBwbGVuOwkJCQkJCS8qIExlbmd0aCBvZiB0aGUgcGF5bG9hZCBvZiB0aGlzIFJQQ0FQIG1lc3NhZ2UgKi8KK307CisKKworLyogRm9ybWF0IG9mIHRoZSBtZXNzYWdlIGZvciB0aGUgaW50ZXJmYWNlIGRlc2NyaXB0aW9uIChmaW5kYWxsZGV2cyBjb21tYW5kKSAqLworc3RydWN0IHJwY2FwX2ZpbmRhbGxkZXZzX2lmCit7CisJdWludDE2IG5hbWVsZW47CQkJCQkJLyogTGVuZ3RoIG9mIHRoZSBpbnRlcmZhY2UgbmFtZSAqLworCXVpbnQxNiBkZXNjbGVuOwkJCQkJCS8qIExlbmd0aCBvZiB0aGUgaW50ZXJmYWNlIGRlc2NyaXB0aW9uICovCisJdWludDMyIGZsYWdzOwkJCQkJCS8qIEludGVyZmFjZSBmbGFncyAqLworCXVpbnQxNiBuYWRkcjsJCQkJCQkvKiBOdW1iZXIgb2YgYWRkcmVzc2VzICovCisJdWludDE2IGR1bW15OwkJCQkJCS8qIE11c3QgYmUgemVybyAqLworfTsKKworCisvKiBGb3JtYXQgb2YgdGhlIG1lc3NhZ2UgZm9yIHRoZSBhZGRyZXNzIGxpc3RpbmcgKGZpbmRhbGxkZXZzIGNvbW1hbmQpICovCitzdHJ1Y3QgcnBjYXBfZmluZGFsbGRldnNfaWZhZGRyCit7CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsJCS8qIE5ldHdvcmsgYWRkcmVzcyAqLworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIG5ldG1hc2s7CS8qIE5ldG1hc2sgZm9yIHRoYXQgYWRkcmVzcyAqLworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGJyb2FkYWRkcjsJLyogQnJvYWRjYXN0IGFkZHJlc3MgZm9yIHRoYXQgYWRkcmVzcyAqLworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGRzdGFkZHI7CS8qIFAyUCBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciB0aGF0IGFkZHJlc3MgKi8KK307CisKKworCisvKgorICogXGJyaWVmIEZvcm1hdCBvZiB0aGUgbWVzc2FnZSBvZiB0aGUgY29ubmVjdGlvbiBvcGVuaW5nIHJlcGx5IChvcGVuIGNvbW1hbmQpLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIHRyYW5zZmVycyBvdmVyIHRoZSBuZXR3b3JrIHNvbWUgb2YgdGhlIHZhbHVlcyB1c2VmdWwgb24gdGhlIGNsaWVudCBzaWRlLgorICovCitzdHJ1Y3QgcnBjYXBfb3BlbnJlcGx5Cit7CisJaW50MzIgbGlua3R5cGU7CQkJCQkJLyogTGluayB0eXBlICovCisJaW50MzIgdHpvZmY7CQkJCQkJLyogVGltZXpvbmUgb2Zmc2V0ICovCit9OworCisKKworLyogRm9ybWF0IG9mIHRoZSBtZXNzYWdlIHRoYXQgc3RhcnRzIGEgcmVtb3RlIGNhcHR1cmUgKHN0YXJ0Y2FwIGNvbW1hbmQpICovCitzdHJ1Y3QgcnBjYXBfc3RhcnRjYXByZXEKK3sKKwl1aW50MzIgc25hcGxlbjsJCQkJCQkvKiBMZW5ndGggb2YgdGhlIHNuYXBzaG90IChudW1iZXIgb2YgYnl0ZXMgdG8gY2FwdHVyZSBmb3IgZWFjaCBwYWNrZXQpICovCisJdWludDMyIHJlYWRfdGltZW91dDsJCQkJLyogUmVhZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqLworCXVpbnQxNiBmbGFnczsJCQkJCQkvKiBGbGFncyAoc2VlIFJQQ0FQX1NUQVJUQ0FQUkVRX0ZMQUdfeHh4KSAqLworCXVpbnQxNiBwb3J0ZGF0YTsJCQkJCS8qIE5ldHdvcmsgcG9ydCBvbiB3aGljaCB0aGUgY2xpZW50IGlzIHdhaXRpbmcgYXQgKGlmICdzZXJ2ZXJvcGVuJykgKi8KK307CisKKworLyogRm9ybWF0IG9mIHRoZSByZXBseSBtZXNzYWdlIHRoYXQgZGV2b3RlZCB0byBzdGFydCBhIHJlbW90ZSBjYXB0dXJlIChzdGFydGNhcCByZXBseSBjb21tYW5kKSAqLworc3RydWN0IHJwY2FwX3N0YXJ0Y2FwcmVwbHkKK3sKKwlpbnQzMiBidWZzaXplOwkJCQkJCS8qIFNpemUgb2YgdGhlIHVzZXIgYnVmZmVyIGFsbG9jYXRlZCBieSBXaW5QY2FwOyBpdCBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB3ZSBjaG9zZSAqLworCXVpbnQxNiBwb3J0ZGF0YTsJCQkJCS8qIE5ldHdvcmsgcG9ydCBvbiB3aGljaCB0aGUgc2VydmVyIGlzIHdhaXRpbmcgYXQgKHBhc3NpdmUgbW9kZSBvbmx5KSAqLworCXVpbnQxNiBkdW1teTsJCQkJCQkvKiBNdXN0IGJlIHplcm8gKi8KK307CisKKworLyoKKyAqIFxicmllZiBGb3JtYXQgb2YgdGhlIGhlYWRlciB3aGljaCBlbmNhcHN1bGF0ZXMgY2FwdHVyZWQgcGFja2V0cyB3aGVuIHRyYW5zbWl0dGVkIG9uIHRoZSBuZXR3b3JrLgorICoKKyAqIFRoaXMgbWVzc2FnZSByZXF1aXJlcyB0aGUgZ2VuZXJhbCBoZWFkZXIgYXMgd2VsbCwgc2luY2Ugd2Ugd2FudCB0byBiZSBhYmxlIHRvIGV4Y2hhbmdlCisgKiBtb3JlIGluZm9ybWF0aW9uIGFjcm9zcyB0aGUgbmV0d29yayBpbiB0aGUgZnV0dXJlIChmb3IgZXhhbXBsZSBzdGF0aXN0aWNzLCBhbmQga2luZCBsaWtlIHRoYXQpLgorICovCitzdHJ1Y3QgcnBjYXBfcGt0aGRyCit7CisJdWludDMyIHRpbWVzdGFtcF9zZWM7CS8qICdzdHJ1Y3QgdGltZXZhbCcgY29tcGF0aWJsZSwgaXQgcmVwcmVzZW50cyB0aGUgJ3R2X3NlYycgZmllbGQgKi8KKwl1aW50MzIgdGltZXN0YW1wX3VzZWM7CS8qICdzdHJ1Y3QgdGltZXZhbCcgY29tcGF0aWJsZSwgaXQgcmVwcmVzZW50cyB0aGUgJ3R2X3VzZWMnIGZpZWxkICovCisJdWludDMyIGNhcGxlbjsJCQkvKiBMZW5ndGggb2YgcG9ydGlvbiBwcmVzZW50IGluIHRoZSBjYXB0dXJlICovCisJdWludDMyIGxlbjsJCQkJLyogUmVhbCBsZW5ndGggdGhpcyBwYWNrZXQgKG9mZiB3aXJlKSAqLworCXVpbnQzMiBucGt0OwkJCS8qIE9yZGluYWwgbnVtYmVyIG9mIHRoZSBwYWNrZXQgKGkuZS4gdGhlIGZpcnN0IG9uZSBjYXB0dXJlZCBoYXMgJzEnLCB0aGUgc2Vjb25kIG9uZSAnMicsIGV0YykgKi8KK307CisKKworLyogR2VuZXJhbCBoZWFkZXIgdXNlZCBmb3IgdGhlIHBjYXBfc2V0ZmlsdGVyKCkgY29tbWFuZDsga2VlcHMganVzdCB0aGUgbnVtYmVyIG9mIEJQRiBpbnN0cnVjdGlvbnMgKi8KK3N0cnVjdCBycGNhcF9maWx0ZXIKK3sKKwl1aW50MTYgZmlsdGVydHlwZTsJCS8qIHR5cGUgb2YgdGhlIGZpbHRlciB0cmFuc2ZlcnJlZCAoQlBGIGluc3RydWN0aW9ucywgLi4uKSAqLworCXVpbnQxNiBkdW1teTsJCQkvKiBNdXN0IGJlIHplcm8gKi8KKwl1aW50MzIgbml0ZW1zOwkJCS8qIE51bWJlciBvZiBpdGVtcyBjb250YWluZWQgaW50byB0aGUgZmlsdGVyIChlLmcuIEJQRiBpbnN0cnVjdGlvbnMgZm9yIEJQRiBmaWx0ZXJzKSAqLworfTsKKworCisvKiBTdHJ1Y3R1cmUgdGhhdCBrZWVwcyBhIHNpbmdsZSBCUEYgaW5zdHVjdGlvbjsgaXQgaXMgcmVwZWF0ZWQgJ25pbnNuJyB0aW1lcyBhY2NvcmRpbmcgdG8gdGhlICdycGNhcF9maWx0ZXJicGYnIGhlYWRlciAqLworc3RydWN0IHJwY2FwX2ZpbHRlcmJwZl9pbnNuCit7CisJdWludDE2IGNvZGU7CQkJLyogb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbiAqLworCXVpbnQ4IGp0OwkJCQkvKiByZWxhdGl2ZSBvZmZzZXQgdG8ganVtcCB0byBpbiBjYXNlIG9mICd0cnVlJyAqLworCXVpbnQ4IGpmOwkJCQkvKiByZWxhdGl2ZSBvZmZzZXQgdG8ganVtcCB0byBpbiBjYXNlIG9mICdmYWxzZScgKi8KKwlpbnQzMiBrOwkJCQkvKiBpbnN0cnVjdGlvbi1kZXBlbmRlbnQgdmFsdWUgKi8KK307CisKKworLyogU3RydWN0dXJlIHRoYXQga2VlcHMgdGhlIGRhdGEgcmVxdWlyZWQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbiBvbiB0aGUgcmVtb3RlIGhvc3QgKi8KK3N0cnVjdCBycGNhcF9hdXRoCit7CisJdWludDE2IHR5cGU7CQkJLyogQXV0aGVudGljYXRpb24gdHlwZSAqLworCXVpbnQxNiBkdW1teTsJCQkvKiBNdXN0IGJlIHplcm8gKi8KKwl1aW50MTYgc2xlbjE7CQkJLyogTGVuZ3RoIG9mIHRoZSBmaXJzdCBhdXRoZW50aWNhdGlvbiBpdGVtIChlLmcuIHVzZXJuYW1lKSAqLworCXVpbnQxNiBzbGVuMjsJCQkvKiBMZW5ndGggb2YgdGhlIHNlY29uZCBhdXRoZW50aWNhdGlvbiBpdGVtIChlLmcuIHBhc3N3b3JkKSAqLworfTsKKworCisvKiBTdHJ1Y3R1cmUgdGhhdCBrZWVwcyB0aGUgc3RhdGlzdGljcyBhYm91dCB0aGUgbnVtYmVyIG9mIHBhY2tldHMgY2FwdHVyZWQsIGRyb3BwZWQsIGV0Yy4gKi8KK3N0cnVjdCBycGNhcF9zdGF0cworeworCXVpbnQzMiBpZnJlY3Y7CQkvKiBQYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSBrZXJuZWwgZmlsdGVyIChpLmUuIHBjYXBfc3RhdHMucHNfcmVjdikgKi8KKwl1aW50MzIgaWZkcm9wOwkJLyogUGFja2V0cyBkcm9wcGVkIGJ5IHRoZSBuZXR3b3JrIGludGVyZmFjZSAoZS5nLiBub3QgZW5vdWdoIGJ1ZmZlcnMpIChpLmUuIHBjYXBfc3RhdHMucHNfaWZkcm9wKSAqLworCXVpbnQzMiBrcm5sZHJvcDsJLyogUGFja2V0cyBkcm9wcGVkIGJ5IHRoZSBrZXJuZWwgZmlsdGVyIChpLmUuIHBjYXBfc3RhdHMucHNfZHJvcCkgKi8KKwl1aW50MzIgc3ZyY2FwdDsJCS8qIFBhY2tldHMgY2FwdHVyZWQgYnkgdGhlIFJQQ0FQIGRhZW1vbiBhbmQgc2VudCBvbiB0aGUgbmV0d29yayAqLworfTsKKworCisvKiBTdHJ1Y3R1cmUgdGhhdCBpcyBuZWVkZWQgdG8gc2V0IHNhbXBsaW5nIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBycGNhcF9zYW1wbGluZworeworCXVpbnQ4IG1ldGhvZDsJCS8qIFNhbXBsaW5nIG1ldGhvZCAqLworCXVpbnQ4IGR1bW15MTsJCS8qIE11c3QgYmUgemVybyAqLworCXVpbnQxNiBkdW1teTI7CQkvKiBNdXN0IGJlIHplcm8gKi8KKwl1aW50MzIgdmFsdWU7CQkvKiBQYXJhbWV0ZXIgcmVsYXRlZCB0byB0aGUgc2FtcGxpbmcgbWV0aG9kICovCit9OworCisKKy8qCisgKiBQcml2YXRlIGRhdGEgZm9yIGRvaW5nIGEgbGl2ZSBjYXB0dXJlLgorICovCitzdHJ1Y3QgcGNhcF9tZCB7CisJc3RydWN0IHBjYXBfc3RhdCBzdGF0OworCS8qIFhYWCAqLworCWludAkJdXNlX2JwZjsJCS8qIHVzaW5nIGtlcm5lbCBmaWx0ZXIgKi8KKwl1X2xvbmcJVG90UGt0czsJCS8qIGNhbid0IG92ZXJmbG93IGZvciA3OSBocnMgb24gZXRoZXIgKi8KKwl1X2xvbmcJVG90QWNjZXB0ZWQ7CS8qIGNvdW50IGFjY2VwdGVkIGJ5IGZpbHRlciAqLworCXVfbG9uZwlUb3REcm9wczsJCS8qIGNvdW50IG9mIGRyb3BwZWQgcGFja2V0cyAqLworCWxvbmcJVG90TWlzc2VkOwkJLyogbWlzc2VkIGJ5IGkvZiBkdXJpbmcgdGhpcyBydW4gKi8KKwlsb25nCU9yaWdNaXNzZWQ7CQkvKiBtaXNzZWQgYnkgaS9mIGJlZm9yZSB0aGlzIHJ1biAqLworCWNoYXIJKmRldmljZTsJCS8qIGRldmljZSBuYW1lICovCisJaW50CQl0aW1lb3V0OwkJLyogdGltZW91dCBmb3IgYnVmZmVyaW5nICovCisJaW50CQltdXN0X2NsZWFyOwkJLyogc3R1ZmYgd2UgbXVzdCBjbGVhciB3aGVuIHdlIGNsb3NlICovCisJc3RydWN0IHBjYXAgKm5leHQ7CQkvKiBsaXN0IG9mIG9wZW4gcGNhcHMgdGhhdCBuZWVkIHN0dWZmIGNsZWFyZWQgb24gY2xvc2UgKi8KKyNpZmRlZiBsaW51eAorCWludAkJc29ja19wYWNrZXQ7CS8qIHVzaW5nIExpbnV4IDIuMCBjb21wYXRpYmxlIGludGVyZmFjZSAqLworCWludAkJY29va2VkOwkJCS8qIHVzaW5nIFNPQ0tfREdSQU0gcmF0aGVyIHRoYW4gU09DS19SQVcgKi8KKwlpbnQJCWlmaW5kZXg7CQkvKiBpbnRlcmZhY2UgaW5kZXggb2YgZGV2aWNlIHdlJ3JlIGJvdW5kIHRvICovCisJaW50CQlsb19pZmluZGV4OwkJLyogaW50ZXJmYWNlIGluZGV4IG9mIHRoZSBsb29wYmFjayBkZXZpY2UgKi8KKwl1X2ludAlwYWNrZXRzX3JlYWQ7CS8qIGNvdW50IG9mIHBhY2tldHMgcmVhZCB3aXRoIHJlY3Zmcm9tKCkgKi8KKwlicGZfdV9pbnQzMiBvbGRtb2RlOwkvKiBtb2RlIHRvIHJlc3RvcmUgd2hlbiB0dXJuaW5nIG1vbml0b3IgbW9kZSBvZmYgKi8KKwl1X2ludAl0cF92ZXJzaW9uOwkJLyogdmVyc2lvbiBvZiB0cGFja2V0X2hkciBmb3IgbW1hcGVkIHJpbmcgKi8KKwl1X2ludAl0cF9oZHJsZW47CQkvKiBoZHJsZW4gb2YgdHBhY2tldF9oZHIgZm9yIG1tYXBlZCByaW5nICovCisjZW5kaWYgLyogbGludXggKi8KKworI2lmZGVmIEhBVkVfREFHX0FQSQorI2lmZGVmIEhBVkVfREFHX1NUUkVBTVNfQVBJCisJdV9jaGFyCSpkYWdfbWVtX2JvdHRvbTsvKiBEQUcgY2FyZCBjdXJyZW50IG1lbW9yeSBib3R0b20gcG9pbnRlciAqLworCXVfY2hhcgkqZGFnX21lbV90b3A7CS8qIERBRyBjYXJkIGN1cnJlbnQgbWVtb3J5IHRvcCBwb2ludGVyICovCisjZWxzZSAvKiBIQVZFX0RBR19TVFJFQU1TX0FQSSAqLworCXZvaWQJKmRhZ19tZW1fYmFzZTsJLyogREFHIGNhcmQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworCXVfaW50CWRhZ19tZW1fYm90dG9tOwkvKiBEQUcgY2FyZCBjdXJyZW50IG1lbW9yeSBib3R0b20gb2Zmc2V0ICovCisJdV9pbnQJZGFnX21lbV90b3A7CS8qIERBRyBjYXJkIGN1cnJlbnQgbWVtb3J5IHRvcCBvZmZzZXQgKi8KKyNlbmRpZiAvKiBIQVZFX0RBR19TVFJFQU1TX0FQSSAqLworCWludAlkYWdfZmNzX2JpdHM7CQkvKiBOdW1iZXIgb2YgY2hlY2tzdW0gYml0cyBmcm9tIGxpbmsgbGF5ZXIgKi8KKwlpbnQJZGFnX29mZnNldF9mbGFnczsJLyogRmxhZ3MgdG8gcGFzcyB0byBkYWdfb2Zmc2V0KCkuICovCisJaW50CWRhZ19zdHJlYW07CQkJLyogREFHIHN0cmVhbSBudW1iZXIgKi8KKwlpbnQJZGFnX3RpbWVvdXQ7CQkvKiB0aW1lb3V0IHNwZWNpZmllZCB0byBwY2FwX29wZW5fbGl2ZS4KKwkJCQkJCQkgKiBTYW1lIGFzIGluIGxpbnV4IGFib3ZlLCBpbnRyb2R1Y2UKKwkJCQkJCQkgKiBnZW5lcmFsbHk/CisJCQkJCQkJICovCisjZW5kaWYgLyogSEFWRV9EQUdfQVBJICovCisjaWZkZWYgSEFWRV9aRVJPQ09QWV9CUEYKKwkvKgorCSAqIFplcm8tY29weSByZWFkIGJ1ZmZlciAtLSBmb3IgemVyby1jb3B5IEJQRi4gICdidWZmZXInIGFib3ZlIHdpbGwKKwkgKiBhbHRlcm5hdGl2ZSBiZXR3ZWVuIHRoZXNlIHR3byBhY3R1YWwgbW1hcCdkIGJ1ZmZlcnMgYXMgcmVxdWlyZWQuCisJICogQXMgdGhlcmUgaXMgYSBoZWFkZXIgb24gdGhlIGZyb250IHNpemUgb2YgdGhlIG1tYXAnZCBidWZmZXIsIG9ubHkKKwkgKiBzb21lIG9mIHRoZSBidWZmZXIgaXMgZXhwb3NlZCB0byBsaWJwY2FwIGFzIGEgd2hvbGUgdmlhIGJ1ZnNpemU7CisJICogemJ1ZnNpemUgaXMgdGhlIHRydWUgc2l6ZS4gIHpidWZmZXIgdHJhY2tzIHRoZSBjdXJyZW50IHpidWYKKwkgKiBhc3NvY2lhdGVkIHdpdGggYnVmZmVyIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gZGVjaWRlIHdoaWNoIHRoZQorCSAqIG5leHQgYnVmZmVyIHRvIHJlYWQgd2lsbCBiZS4KKwkgKi8KKwl1X2NoYXIgKnpidWYxLCAqemJ1ZjIsICp6YnVmZmVyOworCXVfaW50IHpidWZzaXplOworCXVfaW50IHplcm9jb3B5OworCXVfaW50IGludGVycnVwdGVkOworCXN0cnVjdCB0aW1lc3BlYyBmaXJzdHNlbDsKKwkvKgorCSAqIElmIHRoZXJlJ3MgY3VycmVudGx5IGEgYnVmZmVyIGJlaW5nIGFjdGl2ZWx5IHByb2Nlc3NlZCwgdGhlbiBpdCBpcworCSAqIHJlZmVyZW5jZWQgaGVyZTsgJ2J1ZmZlcicgaXMgYWxzbyBwb2ludGVkIGF0IGl0LCBidXQgb2Zmc2V0IGJ5IHRoZQorCSAqIHNpemUgb2YgdGhlIGhlYWRlci4KKwkgKi8KKwlzdHJ1Y3QgYnBmX3pidWZfaGVhZGVyICpiemg7CisjZW5kaWYgLyogSEFWRV9aRVJPQ09QWV9CUEYgKi8KKworCisKKyNpZmRlZiBIQVZFX1JFTU9URQorCS8qCisJICogVGhlcmUgaXMgcmVhbGx5IGEgbWVzcyB3aXRoIHByZXZpb3VzIHZhcmlhYmxlcywgYW5kIGl0IHNlZW1zIHRvIG1lIHRoYXQgdGhleSBhcmUgbm90IHVzZWQKKwkgKiAodGhleSBhcmUgdXNlZCBpbiBwY2FwX3BmLmMgb25seSkuIEkgdGhpbmsgd2UgaGF2ZSB0byBzdGFydCB1c2luZyB0aGVtLgorCSAqIFRoZSBtZWFuaW5nIGlzIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiAtIFRvdFBrdHM6IHRoZSBhbW91bnQgb2YgcGFja2V0cyByZWNlaXZlZCBieSB0aGUgYnBmIGZpbHRlciwgKmJlZm9yZSogYXBwbHlpbmcgdGhlIGZpbHRlcgorCSAqIC0gVG90QWNjZXB0ZWQ6IHRoZSBhbW91bnQgb2YgcGFja2V0cyB0aGF0IHNhdGlzZmllcyB0aGUgZmlsdGVyCisJICogLSBUb3REcm9wczogdGhlIGFtb3VudCBvZiBwYWNrZXQgdGhhdCB3ZXJlIGRyb3BwZWQgaW50byB0aGUga2VybmVsIGJ1ZmZlciBiZWNhdXNlIG9mIGxhY2sgb2Ygc3BhY2UKKwkgKiAtIFRvdE1pc3NlZDogdGhlIGFtb3VudCBvZiBwYWNrZXRzIHRoYXQgd2VyZSBkcm9wcGVkIGJ5IHRoZSBwaHlzaWNhbCBpbnRlcmZhY2U7IGl0IGlzIGJhc2ljYWxseQorCSAqIHRoZSB2YWx1ZSBvZiB0aGUgaGFyZHdhcmUgY291bnRlciBpbnRvIHRoZSBjYXJkLiBUaGlzIG51bWJlciBpcyBuZXZlciBwdXQgdG8gemVybywgc28gdGhpcyBudW1iZXIKKwkgKiB0YWtlcyBpbnRvIGFjY291bnQgdGhlICp0b3RhbCogbnVtYmVyIG9mIGludGVyZmFjZSBkcm9wcyBzdGFydGluZyBmcm9tIHRoZSBpbnRlcmZhY2UgcG93ZXItb24uCisJICogLSBPcmlnTWlzc2VkOiB0aGUgYW1vdW50IG9mIHBhY2tldHMgdGhhdCB3ZXJlIGRyb3BwZWQgYnkgdGhlIGludGVyZmFjZSAqd2hlbiB0aGUgY2FwdHVyZSBiZWdpbnMqLgorCSAqIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBkZXRlY3QgdGhlIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgYnkgdGhlIGludGVyZmFjZSAqZHVyaW5nIHRoZSBwcmVzZW50CisJICogY2FwdHVyZSosIHNvIHRoYXQgKHBzX2lmZHJvcHM9IFRvdE1pc3NlZCAtIE9yaWdNaXNzZWQpLgorCSAqLworCXVuc2lnbmVkIGludCBUb3ROZXREcm9wczsJCS8qIGtlZXBzIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGJ5IHRoZSBuZXR3b3JrICovCisJLyoKKwkgKiBcYnJpZWYgSXQga2VlcHMgdGhlIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgaGF2ZSBiZWVuIHJlY2VpdmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKwkgKgorCSAqIFBhY2tldHMgZHJvcHBlZCBieSB0aGUga2VybmVsIGJ1ZmZlciBhcmUgbm90IGNvdW50ZWQgaW4gdGhpcyB2YXJpYWJsZS4gVGhlIHZhcmlhYmxlIGlzIGFsd2F5cworCSAqIGVxdWFsIHRvIChUb3RBY2NlcHRlZCAtIFRvdERyb3BzKSwgZXhjZXB0IGZvciB0aGUgY2FzZSBvZiByZW1vdGUgY2FwdHVyZSwgaW4gd2hpY2ggd2UgaGF2ZSBhbHNvCisJICogcGFja2V0cyBpbiBmbGlnaHQsIGkuZS4gdGhhdCBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQgYnkgdGhlIHJlbW90ZSBob3N0LCBidXQgdGhhdCBoYXZlIG5vdCBiZWVuCisJICogcmVjZWl2ZWQgKHlldCkgZnJvbSB0aGUgY2xpZW50LiBJbiB0aGlzIGNhc2UsIChUb3RBY2NlcHRlZCAtIFRvdERyb3BzIC0gVG90TmV0RHJvcHMpIGdpdmVzIGEKKwkgKiB3cm9uZyByZXN1bHQsIHNpbmNlIHRoaXMgbnVtYmVyIGRvZXMgbm90IGNvcnJlc3BvbmRzIGFsd2F5cyB0byB0aGUgbnVtYmVyIG9mIHBhY2tldCByZWNlaXZlZCBieQorCSAqIHRoZSBhcHBsaWNhdGlvbi4gRm9yIHRoaXMgcmVhc29uLCBpbiB0aGUgcmVtb3RlIGNhcHR1cmUgd2UgbmVlZCBhbm90aGVyIHZhcmlhYmxlIHRoYXQgdGFrZXMKKwkgKiBpbnRvIGFjY291bnQgb2YgdGhlIG51bWJlciBvZiBwYWNrZXRzIGFjdHVhbGx5IHJlY2VpdmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgVG90Q2FwdDsKKworCS8qISBcYnJpZWYgJzEnIGlmIHdlJ3JlIHRoZSBuZXR3b3JrIGNsaWVudDsgbmVlZGVkIGJ5IHNldmVyYWwgZnVuY3Rpb25zIChsaWtlIHBjYXBfc2V0ZmlsdGVyKCkgKSB0byBrbm93IGlmCisJdGhleSBoYXZlIHRvIHVzZSB0aGUgc29ja2V0IG9yIHRoZXkgaGF2ZSB0byBvcGVuIHRoZSBsb2NhbCBhZGFwdGVyLiAqLworCWludCBybXRfY2xpZW50c2lkZTsKKworCVNPQ0tFVCBybXRfc29ja2N0cmw7CQkvLyE8IHNvY2tldCBJRCBvZiB0aGUgc29ja2V0IHVzZWQgZm9yIHRoZSBjb250cm9sIGNvbm5lY3Rpb24KKwlTT0NLRVQgcm10X3NvY2tkYXRhOwkJLy8hPCBzb2NrZXQgSUQgb2YgdGhlIHNvY2tldCB1c2VkIGZvciB0aGUgZGF0YSBjb25uZWN0aW9uCisJaW50IHJtdF9mbGFnczsJCQkJLy8hPCB3ZSBoYXZlIHRvIHNhdmUgZmxhZ3MsIHNpbmNlIHRoZXkgYXJlIHBhc3NlZCBieSB0aGUgcGNhcF9vcGVuX2xpdmUoKSwgYnV0IHRoZXkgYXJlIHVzZWQgYnkgdGhlIHBjYXBfc3RhcnRjYXB0dXJlKCkKKwlpbnQgcm10X2NhcHN0YXJ0ZWQ7CQkJLy8hPCAndHJ1ZScgaWYgdGhlIGNhcHR1cmUgaXMgYWxyZWFkeSBzdGFydGVkIChuZWVkZWQgdG8ga25vZSBpZiB3ZSBoYXZlIHRvIGNhbGwgdGhlIHBjYXBfc3RhcnRjYXB0dXJlKCkKKwlzdHJ1Y3QgcGNhcF9zYW1wIHJtdF9zYW1wOwkvLyE8IEtlZXBzIHRoZSBwYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gdGhlIHNhbXBsaW5nIHByb2Nlc3MuCisJY2hhciAqY3VycmVudGZpbHRlcjsJCS8vITwgUG9pbnRlciB0byBhIGJ1ZmZlciAoYWxsb2NhdGVkIGF0IHJ1bi10aW1lKSB0aGF0IHN0b3JlcyB0aGUgY3VycmVudCBmaWx0ZXIuIE5lZWRlZCB3aGVuIGZsYWcgUENBUF9PUEVORkxBR19OT0NBUFRVUkVfUlBDQVAgaXMgdHVybmVkIG9uLgorI2VuZGlmIC8qIEhBVkVfUkVNT1RFICovCisKK307CisKKworLyogTWVzc2FnZXMgZmllbGQgY29kaW5nICovCisjZGVmaW5lIFJQQ0FQX01TR19FUlJPUiAxCQkJCS8qIE1lc3NhZ2UgdGhhdCBrZWVwcyBhbiBlcnJvciBub3RpZmljYXRpb24gKi8KKyNkZWZpbmUgUlBDQVBfTVNHX0ZJTkRBTExJRl9SRVEgMgkJLyogUmVxdWVzdCB0byBsaXN0IGFsbCB0aGUgcmVtb3RlIGludGVyZmFjZXMgKi8KKyNkZWZpbmUgUlBDQVBfTVNHX09QRU5fUkVRIDMJCQkvKiBSZXF1ZXN0IHRvIG9wZW4gYSByZW1vdGUgZGV2aWNlICovCisjZGVmaW5lIFJQQ0FQX01TR19TVEFSVENBUF9SRVEgNAkJLyogUmVxdWVzdCB0byBzdGFydCBhIGNhcHR1cmUgb24gYSByZW1vdGUgZGV2aWNlICovCisjZGVmaW5lIFJQQ0FQX01TR19VUERBVEVGSUxURVJfUkVRIDUJLyogU2VuZCBhIGNvbXBpbGVkIGZpbHRlciBpbnRvIHRoZSByZW1vdGUgZGV2aWNlICovCisjZGVmaW5lIFJQQ0FQX01TR19DTE9TRSA2CQkJCS8qIENsb3NlIHRoZSBjb25uZWN0aW9uIHdpdGggdGhlIHJlbW90ZSBwZWVyICovCisjZGVmaW5lIFJQQ0FQX01TR19QQUNLRVQgNwkJCQkvKiBUaGlzIGlzIGEgJ2RhdGEnIG1lc3NhZ2UsIHdoaWNoIGNhcnJpZXMgYSBuZXR3b3JrIHBhY2tldCAqLworI2RlZmluZSBSUENBUF9NU0dfQVVUSF9SRVEgOAkJCS8qIE1lc3NhZ2UgdGhhdCBrZWVwcyB0aGUgYXV0aGVudGljYXRpb24gcGFyYW1ldGVycyAqLworI2RlZmluZSBSUENBUF9NU0dfU1RBVFNfUkVRIDkJCQkvKiBJdCByZXF1aXJlcyB0byBoYXZlIG5ldHdvcmsgc3RhdGlzdGljcyAqLworI2RlZmluZSBSUENBUF9NU0dfRU5EQ0FQX1JFUSAxMAkJCS8qIFN0b3BzIHRoZSBjdXJyZW50IGNhcHR1cmUsIGtlZXBpbmcgdGhlIGRldmljZSBvcGVuICovCisjZGVmaW5lIFJQQ0FQX01TR19TRVRTQU1QTElOR19SRVEgMTEJLyogU2V0IHNhbXBsaW5nIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBSUENBUF9NU0dfRklOREFMTElGX1JFUExZCSgxMjgrUlBDQVBfTVNHX0ZJTkRBTExJRl9SRVEpCQkvKiBLZWVwcyB0aGUgbGlzdCBvZiBhbGwgdGhlIHJlbW90ZSBpbnRlcmZhY2VzICovCisjZGVmaW5lIFJQQ0FQX01TR19PUEVOX1JFUExZCQkoMTI4K1JQQ0FQX01TR19PUEVOX1JFUSkJCQkvKiBUaGUgcmVtb3RlIGRldmljZSBoYXMgYmVlbiBvcGVuZWQgY29ycmVjdGx5ICovCisjZGVmaW5lIFJQQ0FQX01TR19TVEFSVENBUF9SRVBMWQkoMTI4K1JQQ0FQX01TR19TVEFSVENBUF9SRVEpCQkvKiBUaGUgY2FwdHVyZSBpcyBzdGFydGluZyBjb3JyZWN0bHkgKi8KKyNkZWZpbmUgUlBDQVBfTVNHX1VQREFURUZJTFRFUl9SRVBMWSAoMTI4K1JQQ0FQX01TR19VUERBVEVGSUxURVJfUkVRKQkvKiBUaGUgZmlsdGVyIGhhcyBiZWVuIGFwcGxpZWQgY29ycmVjdGx5IG9uIHRoZSByZW1vdGUgZGV2aWNlICovCisjZGVmaW5lIFJQQ0FQX01TR19BVVRIX1JFUExZCQkoMTI4K1JQQ0FQX01TR19BVVRIX1JFUSkJCQkvKiBTZW5kcyBhIG1lc3NhZ2UgdGhhdCBzYXlzICdvaywgYXV0aG9yaXphdGlvbiBzdWNjZXNzZnVsJyAqLworI2RlZmluZSBSUENBUF9NU0dfU1RBVFNfUkVQTFkJCSgxMjgrUlBDQVBfTVNHX1NUQVRTX1JFUSkJCQkvKiBNZXNzYWdlIHRoYXQga2VlcHMgdGhlIG5ldHdvcmsgc3RhdGlzdGljcyAqLworI2RlZmluZSBSUENBUF9NU0dfRU5EQ0FQX1JFUExZCQkoMTI4K1JQQ0FQX01TR19FTkRDQVBfUkVRKQkJCS8qIENvbmZpcm1zIHRoYXQgdGhlIGNhcHR1cmUgc3RvcHBlZCBzdWNjZXNzZnVsbHkgKi8KKyNkZWZpbmUgUlBDQVBfTVNHX1NFVFNBTVBMSU5HX1JFUExZCSgxMjgrUlBDQVBfTVNHX1NFVFNBTVBMSU5HX1JFUSkJCS8qIENvbmZpcm1zIHRoYXQgdGhlIGNhcHR1cmUgc3RvcHBlZCBzdWNjZXNzZnVsbHkgKi8KKworI2RlZmluZSBSUENBUF9TVEFSVENBUFJFUV9GTEFHX1BST01JU0MgMQkvKiBFbmFibGVzIHByb21pc2N1b3VzIG1vZGUgKGRlZmF1bHQ6IGRpc2FibGVkKSAqLworI2RlZmluZSBSUENBUF9TVEFSVENBUFJFUV9GTEFHX0RHUkFNIDIJCS8qIFVzZSBhIGRhdGFncmFtIChpLmUuIFVEUCkgY29ubmVjdGlvbiBmb3IgdGhlIGRhdGEgc3RyZWFtIChkZWZhdWx0OiB1c2UgVENQKSovCisjZGVmaW5lIFJQQ0FQX1NUQVJUQ0FQUkVRX0ZMQUdfU0VSVkVST1BFTiA0CS8qIFRoZSBzZXJ2ZXIgaGFzIHRvIG9wZW4gdGhlIGRhdGEgY29ubmVjdGlvbiB0b3dhcmQgdGhlIGNsaWVudCAqLworI2RlZmluZSBSUENBUF9TVEFSVENBUFJFUV9GTEFHX0lOQk9VTkQgOAkvKiBDYXB0dXJlIG9ubHkgaW5ib3VuZCBwYWNrZXRzICh0YWtlIGNhcmU6IHRoZSBmbGFnIGhhcyBubyBlZmZlY3RzIHdpdGggcHJvbWlzY3VvdXMgZW5hYmxlZCkgKi8KKyNkZWZpbmUgUlBDQVBfU1RBUlRDQVBSRVFfRkxBR19PVVRCT1VORCAxNgkvKiBDYXB0dXJlIG9ubHkgb3V0Ym91bmQgcGFja2V0cyAodGFrZSBjYXJlOiB0aGUgZmxhZyBoYXMgbm8gZWZmZWN0cyB3aXRoIHByb21pc2N1b3VzIGVuYWJsZWQpICovCisKKyNkZWZpbmUgUlBDQVBfVVBEQVRFRklMVEVSX0JQRiAxCQkJLyogVGhpcyBjb2RlIHRlbGxzIHVzIHRoYXQgdGhlIGZpbHRlciBpcyBlbmNvZGVkIHdpdGggdGhlIEJQRi9OUEYgc3ludGF4ICovCisKKworLyogTmV0d29yayBlcnJvciBjb2RlcyAqLworI2RlZmluZSBQQ0FQX0VSUl9ORVRXIDEJCQkJCS8qIE5ldHdvcmsgZXJyb3IgKi8KKyNkZWZpbmUgUENBUF9FUlJfSU5JVFRJTUVPVVQgMgkJCS8qIFRoZSBSUENBUCBpbml0aWFsIHRpbWVvdXQgaGFzIGV4cGlyZWQgKi8KKyNkZWZpbmUgUENBUF9FUlJfQVVUSCAzCQkJCQkvKiBHZW5lcmljIGF1dGhlbnRpY2F0aW9uIGVycm9yICovCisjZGVmaW5lIFBDQVBfRVJSX0ZJTkRBTExJRiA0CQkJLyogR2VuZXJpYyBmaW5kYWxsZGV2cyBlcnJvciAqLworI2RlZmluZSBQQ0FQX0VSUl9OT1JFTU9URUlGIDUJCQkvKiBUaGUgZmluZGFsbGRldnMgd2FzIG9rLCBidXQgdGhlIHJlbW90ZSBlbmQgaGFkIG5vIGludGVyZmFjZXMgdG8gbGlzdCAqLworI2RlZmluZSBQQ0FQX0VSUl9PUEVOIDYJCQkJCS8qIEdlbmVyaWMgcGNhcF9vcGVuIGVycm9yICovCisjZGVmaW5lIFBDQVBfRVJSX1VQREFURUZJTFRFUiA3CQkJLyogR2VuZXJpYyB1cGRhdGVmaWx0ZXIgZXJyb3IgKi8KKyNkZWZpbmUgUENBUF9FUlJfR0VUU1RBVFMgOAkJCQkvKiBHZW5lcmljIHBjYXBfc3RhdHMgZXJyb3IgKi8KKyNkZWZpbmUgUENBUF9FUlJfUkVBREVYIDkJCQkJLyogR2VuZXJpYyBwY2FwX25leHRfZXggZXJyb3IgKi8KKyNkZWZpbmUgUENBUF9FUlJfSE9TVE5PQVVUSCAxMAkJCS8qIFRoZSBob3N0IGlzIG5vdCBhdXRob3JpemVkIHRvIGNvbm5lY3QgdG8gdGhpcyBzZXJ2ZXIgKi8KKyNkZWZpbmUgUENBUF9FUlJfUkVNT1RFQUNDRVBUIDExCQkvKiBHZW5lcmljIHBjYXBfcmVtb3RlYWNjZXB0IGVycm9yICovCisjZGVmaW5lIFBDQVBfRVJSX1NUQVJUQ0FQVFVSRSAxMgkJLyogR2VuZXJpYyBwY2FwX3N0YXJ0Y2FwdHVyZSBlcnJvciAqLworI2RlZmluZSBQQ0FQX0VSUl9FTkRDQVBUVVJFIDEzCQkJLyogR2VuZXJpYyBwY2FwX2VuZGNhcHR1cmUgZXJyb3IgKi8KKyNkZWZpbmUgUENBUF9FUlJfUlVOVElNRVRJTUVPVVQJMTQJCS8qIFRoZSBSUENBUCBydW4tdGltZSB0aW1lb3V0IGhhcyBleHBpcmVkICovCisjZGVmaW5lIFBDQVBfRVJSX1NFVFNBTVBMSU5HIDE1CQkJLyogRXJyb3IgZHVyaW5nIHRoZSBzZXR0aW5ncyBvZiBzYW1wbGluZyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFBDQVBfRVJSX1dST05HTVNHIDE2CQkJLyogVGhlIG90aGVyIGVuZCBlbmRwb2ludCBzZW50IGEgbWVzc2FnZSB3aGljaCBoYXMgbm90IGJlZW4gcmVjb2duaXplZCAqLworI2RlZmluZSBQQ0FQX0VSUl9XUk9OR1ZFUiAxNwkJCS8qIFRoZSBvdGhlciBlbmQgZW5kcG9pbnQgaGFzIGEgdmVyc2lvbiBudW1iZXIgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG91ciAqLworLyoKKyAqIFx9CisgKiAvLyBlbmQgb2YgcHJpdmF0ZSBkb2N1bWVudGF0aW9uCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeHBvcnRlZCBmdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHBjYXBfb3BlbnNvdXJjZV9yZW1vdGUocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9ybXRhdXRoICphdXRoKTsKK2ludCBwY2FwX3N0YXJ0Y2FwdHVyZV9yZW1vdGUocGNhcF90ICpmcCk7CisKK3ZvaWQgcnBjYXBfY3JlYXRlaGRyKHN0cnVjdCBycGNhcF9oZWFkZXIgKmhlYWRlciwgdWludDggdHlwZSwgdWludDE2IHZhbHVlLCB1aW50MzIgbGVuZ3RoKTsKK2ludCBycGNhcF9kZXNlcmFkZHIoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNvY2thZGRyaW4sIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICoqc29ja2FkZHJvdXQsIGNoYXIgKmVycmJ1Zik7CitpbnQgcnBjYXBfY2hlY2ttc2coY2hhciAqZXJyYnVmLCBTT0NLRVQgc29jaywgc3RydWN0IHJwY2FwX2hlYWRlciAqaGVhZGVyLCB1aW50OCBmaXJzdCwgLi4uKTsKK2ludCBycGNhcF9zZW5kZXJyb3IoU09DS0VUIHNvY2ssIGNoYXIgKmVycm9yLCB1bnNpZ25lZCBzaG9ydCBlcnJjb2RlLCBjaGFyICplcnJidWYpOworaW50IHJwY2FwX3NlbmRhdXRoKFNPQ0tFVCBzb2NrLCBzdHJ1Y3QgcGNhcF9ybXRhdXRoICphdXRoLCBjaGFyICplcnJidWYpOworCitTT0NLRVQgcnBjYXBfcmVtb3RlYWN0X2dldHNvY2soY29uc3QgY2hhciAqaG9zdCwgaW50ICppc2FjdGl2ZSwgY2hhciAqZXJyYnVmKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3BjYXAtc2F2ZWZpbGUubWFuZmlsZSBiL3BjYXAtc2F2ZWZpbGUubWFuZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDdkODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGNhcC1zYXZlZmlsZS5tYW5maWxlCkBAIC0wLDAgKzEsMTMzIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVAtU0FWRUZJTEUgNSAiOCBNYXJjaCAyMDE1IgorLlNIIE5BTUUKK3BjYXAtc2F2ZWZpbGUgXC0gbGlicGNhcCBzYXZlZmlsZSBmb3JtYXQKKy5TSCBERVNDUklQVElPTgorTk9URTogYXBwbGljYXRpb25zIGFuZCBsaWJyYXJpZXMgc2hvdWxkLCBpZiBwb3NzaWJsZSwgdXNlIGxpYnBjYXAgdG8KK3JlYWQgc2F2ZWZpbGVzLCByYXRoZXIgdGhhbiBoYXZpbmcgdGhlaXIgb3duIGNvZGUgdG8gcmVhZCBzYXZlZmlsZXMuCitJZiwgaW4gdGhlIGZ1dHVyZSwgYSBuZXcgZmlsZSBmb3JtYXQgaXMgc3VwcG9ydGVkIGJ5IGxpYnBjYXAsCithcHBsaWNhdGlvbnMgYW5kIGxpYnJhcmllcyB1c2luZyBsaWJwY2FwIHRvIHJlYWQgc2F2ZWZpbGVzIHdpbGwgYmUgYWJsZQordG8gcmVhZCB0aGUgbmV3IGZvcm1hdCBvZiBzYXZlZmlsZXMsIGJ1dCBhcHBsaWNhdGlvbnMgYW5kIGxpYnJhcmllcwordXNpbmcgdGhlaXIgb3duIGNvZGUgdG8gcmVhZCBzYXZlZmlsZXMgd2lsbCBoYXZlIHRvIGJlIGNoYW5nZWQgdG8KK3N1cHBvcnQgdGhlIG5ldyBmaWxlIGZvcm1hdC4KKy5QUAorYGBTYXZlZmlsZXMnJyByZWFkIGFuZCB3cml0dGVuIGJ5IGxpYnBjYXAgYW5kIGFwcGxpY2F0aW9ucyB1c2luZyBsaWJwY2FwCitzdGFydCB3aXRoIGEgcGVyLWZpbGUgaGVhZGVyLiAgVGhlIGZvcm1hdCBvZiB0aGUgcGVyLWZpbGUgaGVhZGVyIGlzOgorLlJTCisuVFMKK2JveDsKK2MgcworYyB8IGMKK2Mgcy4KK01hZ2ljIG51bWJlcgorXworTWFqb3IgdmVyc2lvbglNaW5vciB2ZXJzaW9uCitfCitUaW1lIHpvbmUgb2Zmc2V0CitfCitUaW1lIHN0YW1wIGFjY3VyYWN5CitfCitTbmFwc2hvdCBsZW5ndGgKK18KK0xpbmstbGF5ZXIgaGVhZGVyIHR5cGUKKy5URQorLlJFCisuUFAKK0FsbCBmaWVsZHMgaW4gdGhlIHBlci1maWxlIGhlYWRlciBhcmUgaW4gdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3QKK3dyaXRpbmcgdGhlIGZpbGUuICBOb3JtYWxseSwgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSBwZXItZmlsZSBoZWFkZXIgaXMgYQorNC1ieXRlIG1hZ2ljIG51bWJlciwgd2l0aCB0aGUgdmFsdWUgMHhhMWIyYzNkNC4gIFRoZSBtYWdpYyBudW1iZXIsIHdoZW4KK3JlYWQgYnkgYSBob3N0IHdpdGggdGhlIHNhbWUgYnl0ZSBvcmRlciBhcyB0aGUgaG9zdCB0aGF0IHdyb3RlIHRoZSBmaWxlLAord2lsbCBoYXZlIHRoZSB2YWx1ZSAweGExYjJjM2Q0LCBhbmQsIHdoZW4gcmVhZCBieSBhIGhvc3Qgd2l0aCB0aGUKK29wcG9zaXRlIGJ5dGUgb3JkZXIgYXMgdGhlIGhvc3QgdGhhdCB3cm90ZSB0aGUgZmlsZSwgd2lsbCBoYXZlIHRoZSB2YWx1ZQorMHhkNGMzYjJhMS4gIFRoYXQgYWxsb3dzIHNvZnR3YXJlIHJlYWRpbmcgdGhlIGZpbGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKK3RoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0IHRoYXQgd3JvdGUgdGhlIGZpbGUgaXMgdGhlIHNhbWUgYXMgdGhlIGJ5dGUKK29yZGVyIG9mIHRoZSBob3N0IG9uIHdoaWNoIHRoZSBmaWxlIGlzIGJlaW5nIHJlYWQsIGFuZCB0aHVzIHdoZXRoZXIgdGhlCit2YWx1ZXMgaW4gdGhlIHBlci1maWxlIGFuZCBwZXItcGFja2V0IGhlYWRlcnMgbmVlZCB0byBiZSBieXRlLXN3YXBwZWQuCisuUFAKK0lmIHRoZSBtYWdpYyBudW1iZXIgaGFzIHRoZSB2YWx1ZSAweGExYjIzYzRkICh3aXRoIHRoZSB0d28gbmliYmxlcyBvZgordGhlIHR3byBsb3dlci1vcmRlciBieXRlcyBvZiB0aGUgbWFnaWMgbnVtYmVyIHN3YXBwZWQpLCB3aGljaCB3b3VsZCBiZQorcmVhZCBhcyAweGExYjIzYzRkIGJ5IGEgaG9zdCB3aXRoIHRoZSBzYW1lIGJ5dGUgb3JkZXIgYXMgdGhlIGhvc3QgdGhhdAord3JvdGUgdGhlIGZpbGUgYW5kIGFzIDB4NGQzY2IyYTEgYnkgYSBob3N0IHdpdGggdGhlIG9wcG9zaXRlIGJ5dGUgb3JkZXIKK2FzIHRoZSBob3N0IHRoYXQgd3JvdGUgdGhlIGZpbGUsIHRoZSBmaWxlIGZvcm1hdCBpcyB0aGUgc2FtZSBhcyBmb3IKK3JlZ3VsYXIgZmlsZXMsIGV4Y2VwdCB0aGF0IHRoZSB0aW1lIHN0YW1wcyBmb3IgcGFja2V0cyBhcmUgZ2l2ZW4gaW4KK3NlY29uZHMgYW5kIG5hbm9zZWNvbmRzIHJhdGhlciB0aGFuIHNlY29uZHMgYW5kIG1pY3Jvc2Vjb25kcy4KKy5QUAorRm9sbG93aW5nIHRoaXMgYXJlOgorLklQCitBIDItYnl0ZSBmaWxlIGZvcm1hdCBtYWpvciB2ZXJzaW9uIG51bWJlcjsgdGhlIGN1cnJlbnQgdmVyc2lvbiBudW1iZXIgaXMKKzIuCisuSVAKK0EgMi1ieXRlIGZpbGUgZm9ybWF0IG1pbm9yIHZlcnNpb24gbnVtYmVyOyB0aGUgY3VycmVudCB2ZXJzaW9uIG51bWJlciBpcworNC4KKy5JUAorQSA0LWJ5dGUgdGltZSB6b25lIG9mZnNldDsgdGhpcyBpcyBhbHdheXMgMC4KKy5JUAorQSA0LWJ5dGUgbnVtYmVyIGdpdmluZyB0aGUgYWNjdXJhY3kgb2YgdGltZSBzdGFtcHMgaW4gdGhlIGZpbGU7IHRoaXMgaXMKK2Fsd2F5cyAwLgorLklQCitBIDQtYnl0ZSBudW1iZXIgZ2l2aW5nIHRoZSAic25hcHNob3QgbGVuZ3RoIiBvZiB0aGUgY2FwdHVyZTsgcGFja2V0cworbG9uZ2VyIHRoYW4gdGhlIHNuYXBzaG90IGxlbmd0aCBhcmUgdHJ1bmNhdGVkIHRvIHRoZSBzbmFwc2hvdCBsZW5ndGgsIHNvCit0aGF0LCBpZiB0aGUgc25hcHNob3QgbGVuZ3RoIGlzCisuSVIgTiAsCitvbmx5IHRoZSBmaXJzdAorLkkgTgorYnl0ZXMgb2YgYSBwYWNrZXQgbG9uZ2VyIHRoYW4KKy5JIE4KK2J5dGVzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIGNhcHR1cmUuCisuSVAKK2EgNC1ieXRlIG51bWJlciBnaXZpbmcgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgZm9yIHBhY2tldHMgaW4gdGhlCitjYXB0dXJlOyBzZWUKKy5CUiBwY2FwLWxpbmt0eXBlICg3KQorZm9yIHRoZQorLkIgTElOS1RZUEVfCit2YWx1ZXMgdGhhdCBjYW4gYXBwZWFyIGluIHRoaXMgZmllbGQuCisuUFAKK0ZvbGxvd2luZyB0aGUgcGVyLWZpbGUgaGVhZGVyIGFyZSB6ZXJvIG9yIG1vcmUgcGFja2V0czsgZWFjaCBwYWNrZXQKK2JlZ2lucyB3aXRoIGEgcGVyLXBhY2tldCBoZWFkZXIsIHdoaWNoIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHRoZQorcmF3IHBhY2tldCBkYXRhLiAgVGhlIGZvcm1hdCBvZiB0aGUgcGVyLXBhY2tldCBoZWFkZXIgaXM6CisuUlMKKy5UUworYm94OworYy4KK1RpbWUgc3RhbXAsIHNlY29uZHMgdmFsdWUKK18KK1RpbWUgc3RhbXAsIG1pY3Jvc2Vjb25kcyBvciBuYW5vc2Vjb25kcyB2YWx1ZQorXworTGVuZ3RoIG9mIGNhcHR1cmVkIHBhY2tldCBkYXRhCitfCitVbi10cnVuY2F0ZWQgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgZGF0YQorLlRFCisuUkUKKy5QUAorQWxsIGZpZWxkcyBpbiB0aGUgcGVyLXBhY2tldCBoZWFkZXIgYXJlIGluIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0Cit3cml0aW5nIHRoZSBmaWxlLiAgVGhlIHBlci1wYWNrZXQgaGVhZGVyIGJlZ2lucyB3aXRoIGEgdGltZSBzdGFtcCBnaXZpbmcKK3RoZSBhcHByb3hpbWF0ZSB0aW1lIHRoZSBwYWNrZXQgd2FzIGNhcHR1cmVkOyB0aGUgdGltZSBzdGFtcCBjb25zaXN0cyBvZgorYSA0LWJ5dGUgdmFsdWUsIGdpdmluZyB0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCwKKzAwOjAwOjAwIFVUQywgZm9sbG93ZWQgYnkgYSA0LWJ5dGUgdmFsdWUsIGdpdmluZyB0aGUgdGltZSBpbgorbWljcm9zZWNvbmRzIG9yIG5hbm9zZWNvbmRzIHNpbmNlIHRoYXQgc2Vjb25kLCBkZXBlbmRpbmcgb24gdGhlIG1hZ2ljCitudW1iZXIgaW4gdGhlIGZpbGUgaGVhZGVyLiAgRm9sbG93aW5nIHRoYXQgYXJlIGEgNC1ieXRlIHZhbHVlIGdpdmluZyB0aGUKK251bWJlciBvZiBieXRlcyBvZiBjYXB0dXJlZCBkYXRhIHRoYXQgZm9sbG93IHRoZSBwZXItcGFja2V0IGhlYWRlciBhbmQgYQorNC1ieXRlIHZhbHVlIGdpdmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHByZXNlbnQgaGFkCit0aGUgcGFja2V0IG5vdCBiZWVuIHRydW5jYXRlZCBieSB0aGUgc25hcHNob3QgbGVuZ3RoLiAgVGhlIHR3byBsZW5ndGhzCit3aWxsIGJlIGVxdWFsIGlmIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgcGFja2V0IGRhdGEgYXJlIGxlc3MgdGhhbiBvcgorZXF1YWwgdG8gdGhlIHNuYXBzaG90IGxlbmd0aC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXAtbGlua3R5cGUoNykKZGlmZiAtLWdpdCBhL3BjYXAtc2F2ZWZpbGUubWFuZmlsZS5pbiBiL3BjYXAtc2F2ZWZpbGUubWFuZmlsZS5pbgppbmRleCA2MjJmNmM2Li40NTFkZDkwIDEwMDY0NAotLS0gYS9wY2FwLXNhdmVmaWxlLm1hbmZpbGUuaW4KKysrIGIvcGNhcC1zYXZlZmlsZS5tYW5maWxlLmluCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUC1TQVZFRklMRSBATUFOX0ZJTEVfRk9STUFUU0AgIjI5IEp1bHkgMjAxMyIKKy5USCBQQ0FQLVNBVkVGSUxFIEBNQU5fRklMRV9GT1JNQVRTQCAiOCBNYXJjaCAyMDE1IgogLlNIIE5BTUUKIHBjYXAtc2F2ZWZpbGUgXC0gbGlicGNhcCBzYXZlZmlsZSBmb3JtYXQKIC5TSCBERVNDUklQVElPTgpkaWZmIC0tZ2l0IGEvcGNhcC1zZXB0ZWwuYyBiL3BjYXAtc2VwdGVsLmMKaW5kZXggNjFjZDJmNS4uODhkYzg5ZCAxMDA2NDQKLS0tIGEvcGNhcC1zZXB0ZWwuYworKysgYi9wY2FwLXNlcHRlbC5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIAkvKiBPSywgaXQncyBwcm9iYWJseSBvdXJzLiAqLwogCSppc19vdXJzID0gMTsKIAotCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3NlcHRlbCkpOworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9zZXB0ZWwpKTsKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMjc2LDcgKzI3Niw3IEBACiAgIC8qIE1ha2Ugb3VyIHByaXZhdGUgY29weSBvZiB0aGUgZmlsdGVyICovCiAKICAgaWYgKGluc3RhbGxfYnBmX3Byb2dyYW0ocCwgZnApIDwgMCkgewotICAgIHNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisgICAgcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAogCSAgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAgICAgcmV0dXJuIC0xOwogICB9CkBAIC0yOTEsMyArMjkxLDMxIEBACiAgIGZwcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTm9uLWJsb2NraW5nIG1vZGUgbm90IHN1cHBvcnRlZCBvbiBTZXB0ZWwgZGV2aWNlcyIpOwogICByZXR1cm4gKC0xKTsKIH0KKworI2lmZGVmIFNFUFRFTF9PTkxZCisvKgorICogVGhpcyBsaWJwY2FwIGJ1aWxkIHN1cHBvcnRzIG9ubHkgU2VwdGVsIGNhcmRzLCBub3QgcmVndWxhciBuZXR3b3JrCisgKiBpbnRlcmZhY2VzLgorICovCisKKy8qCisgKiBUaGVyZSBhcmUgbm8gcmVndWxhciBpbnRlcmZhY2VzLCBqdXN0IFNlcHRlbCBpbnRlcmZhY2VzLgorICovCitpbnQKK3BjYXBfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKK3sKKyAgKmFsbGRldnNwID0gTlVMTDsKKyAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEF0dGVtcHRzIHRvIG9wZW4gYSByZWd1bGFyIGludGVyZmFjZSBmYWlsLgorICovCitwY2FwX3QgKgorcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZXJyYnVmKQoreworICBwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKyAgICAgICAgICAgICAgICAiVGhpcyB2ZXJzaW9uIG9mIGxpYnBjYXAgb25seSBzdXBwb3J0cyBTZXB0ZWwgY2FyZHMiKTsKKyAgcmV0dXJuIChOVUxMKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGNhcC1zaXRhLmMgYi9wY2FwLXNpdGEuYwppbmRleCBiMzViMTA2Li4xY2Q1Zjc1IDEwMDY0NAotLS0gYS9wY2FwLXNpdGEuYworKysgYi9wY2FwLXNpdGEuYwpAQCAtMjA4LDEwICsyMDgsMTQgQEAKIAogCWVtcHR5X3VuaXRfaWZhY2UodSk7CiAJaWYgKHUtPmltc2cpIHsJCQkJCQkJCQkJCS8qIHRoZW4gaWYgYW4gaW5ib3VuZCBtZXNzYWdlIGJ1ZmZlciBleGlzdHMgKi8KLQkJdS0+aW1zZyA9IChjaGFyICopcmVhbGxvYyh1LT5pbXNnLCAxKTsJCQkJLyogYW5kIHJlLWFsbG9jYXRlIHRoZSBvbGQgbGFyZ2UgYnVmZmVyIGludG8gYSBuZXcgc21hbGwgb25lICovCi0JCWlmICh1LT5pbXNnID09IE5VTEwpIHsJLyogb29wcywgcmVhbGxvYyBjYWxsIGZhaWxlZCAqLwotCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nLi4uY2FsbCB0byByZWFsbG9jKCkgZmFpbGVkLCB2YWx1ZSBvZiBlcnJubyBpcyAlZFxuIiwgZXJybm8pOworCQl2b2lkICpiaWdnZXJfYnVmZmVyOwogCisJCWJpZ2dlcl9idWZmZXIgPSAoY2hhciAqKXJlYWxsb2ModS0+aW1zZywgMSk7CQkJCS8qIGFuZCByZS1hbGxvY2F0ZSB0aGUgb2xkIGxhcmdlIGJ1ZmZlciBpbnRvIGEgbmV3IHNtYWxsIG9uZSAqLworCQlpZiAoYmlnZ2VyX2J1ZmZlciA9PSBOVUxMKSB7CS8qIG9vcHMsIHJlYWxsb2MgY2FsbCBmYWlsZWQgKi8KKwkJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZy4uLmNhbGwgdG8gcmVhbGxvYygpIGZhaWxlZCwgdmFsdWUgb2YgZXJybm8gaXMgJWRcbiIsIGVycm5vKTsKKwkJCXJldHVybjsKKwkJfQorCQl1LT5pbXNnID0gYmlnZ2VyX2J1ZmZlcjsKIAl9CiB9CiAKQEAgLTI2Miw3ICsyNjYsNyBAQAogCiAJZW1wdHlfdW5pdF90YWJsZSgpOwogCWlmICgoZnAgPSBmb3BlbigiL2V0Yy9ob3N0cyIsICJyIikpID09IE5VTEwpIHsJCQkJCQkJCQkJLyogdHJ5IHRvIG9wZW4gdGhlIGhvc3RzIGZpbGUgYW5kIGlmIGl0IGZhaWxzICovCi0JCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbm5vdCBvcGVuICcvZXRjL2hvc3RzJyBmb3IgcmVhZGluZy4iKTsJLyogcmV0dXJuIHRoZSBub2hvc3RzZmlsZSBlcnJvciByZXNwb25zZSAqLworCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbm5vdCBvcGVuICcvZXRjL2hvc3RzJyBmb3IgcmVhZGluZy4iKTsJLyogcmV0dXJuIHRoZSBub2hvc3RzZmlsZSBlcnJvciByZXNwb25zZSAqLwogCQlyZXR1cm4gLTE7CiAJfQogCXdoaWxlIChmZ2V0cyhidWYsIE1BWF9MSU5FX1NJWkUtMSwgZnApKSB7CQkJLyogd2hpbGUgbG9vcGluZyBvdmVyIHRoZSBmaWxlICovCkBAIC0yODUsMTEgKzI4OSwxMSBAQAogCQlnZW9zbG90ID0gKihwdHIyICsgNSkgLSAnMCc7CQkJCQkvKiBhbmQgZ2VvLXNsb3QgbnVtYmVyICovCiAJCWlmIChjaGFzc2lzIDwgMSB8fCBjaGFzc2lzID4gTUFYX0NIQVNTSVMgfHwKIAkJCWdlb3Nsb3QgPCAxIHx8IGdlb3Nsb3QgPiBNQVhfR0VPU0xPVCkgewkJLyogaWYgdGhlIGNoYXNzaXMgYW5kL29yIHNsb3QgbnVtYmVycyBhcHBlYXIgdG8gYmUgYmFkLi4uICovCi0JCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJJbnZhbGlkIEFDTiBuYW1lIGluICcvZXRjL2hvc3RzJy4iKTsJLyogd2FybiB0aGUgdXNlciAqLworCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJJbnZhbGlkIEFDTiBuYW1lIGluICcvZXRjL2hvc3RzJy4iKTsJLyogd2FybiB0aGUgdXNlciAqLwogCQkJY29udGludWU7CQkJCQkJCQkJCQkJCQkJCQkvKiBhbmQgaWdub3JlIHRoZSBlbnRyeSAqLwogCQl9CiAJCWlmICgocHRyMiA9IChjaGFyICopbWFsbG9jKHN0cmxlbihwdHIpICsgMSkpID09IE5VTEwpIHsKLQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQljb250aW51ZTsKIAkJfQogCQlzdHJjcHkocHRyMiwgcHRyKTsJCQkJCQkJCS8qIGNvcHkgdGhlIElQIGFkZHJlc3MgaW50byBvdXIgbWFsbG9jJ2VkIG1lbW9yeSAqLwpAQCAtNDAyLDE0ICs0MDYsMTQgQEAKIAogc3RhdGljIHZvaWQgbm9uVW5pZmllZF9JT1BfcG9ydF9uYW1lKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIGNvbnN0IGNoYXIgKnByb3RvLCB1bml0X3QgKnUpIHsKIAotCXNucHJpbnRmKGJ1ZiwgYnVmc2l6ZSwgIiVzXyVkXyVkIiwgcHJvdG8sIHUtPmNoYXNzaXMsIHUtPmdlb3Nsb3QpOworCXBjYXBfc25wcmludGYoYnVmLCBidWZzaXplLCAiJXNfJWRfJWQiLCBwcm90bywgdS0+Y2hhc3NpcywgdS0+Z2Vvc2xvdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHVuaWZpZWRfSU9QX3BvcnRfbmFtZShjaGFyICpidWYsIHNpemVfdCBidWZzaXplLCBjb25zdCBjaGFyICpwcm90bywgdW5pdF90ICp1LCBpbnQgSU9QcG9ydG51bSkgewogCWludAkJCXBvcnRudW07CiAKIAlwb3J0bnVtID0gKCh1LT5jaGFzc2lzIC0gMSkgKiA2NCkgKyAoKHUtPmdlb3Nsb3QgLSAxKSAqIDgpICsgSU9QcG9ydG51bSArIDE7Ci0Jc25wcmludGYoYnVmLCBidWZzaXplLCAiJXNfJWQiLCBwcm90bywgcG9ydG51bSk7CisJcGNhcF9zbnByaW50ZihidWYsIGJ1ZnNpemUsICIlc18lZCIsIHByb3RvLCBwb3J0bnVtKTsKIH0KIAogc3RhdGljIGNoYXIgKnRyYW5zbGF0ZV9JT1BfdG9fcGNhcF9uYW1lKHVuaXRfdCAqdSwgY2hhciAqSU9QbmFtZSwgYnBmX3VfaW50MzIgaWZ0eXBlKSB7CkBAIC01NjgsNiArNTcyLDcgQEAKIAljaGFyCQkJCSpuZXduYW1lOwogCWJwZl91X2ludDMyCQkJCWludGVyZmFjZVR5cGU7CiAJdW5zaWduZWQgY2hhcgkJZmxhZ3M7CisJdm9pZCAqYmlnZ2VyX2J1ZmZlcjsKIAogCXByZXZfaWZmID0gMDsKIAlmb3IgKGNoYXNzaXMgPSAwOyBjaGFzc2lzIDw9IE1BWF9DSEFTU0lTOyBjaGFzc2lzKyspIHsKQEAgLTU3Nyw3ICs1ODIsNyBAQAogCQkJcHRyID0gdS0+aW1zZzsJCQkJCQkJCQkJCQkJLyogcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtc2cgZm9yIHRoaXMgSU9QICovCiAJCQl3aGlsZSAocHRyIDwgKHUtPmltc2cgKyB1LT5sZW4pKSB7CiAJCQkJaWYgKChpZmYgPSBtYWxsb2Moc2l6ZW9mKHBjYXBfaWZfdCkpKSA9PSBOVUxMKSB7Ci0JCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQkJcmV0dXJuIC0xOwogCQkJCX0KIAkJCQltZW1zZXQoKGNoYXIgKilpZmYsIDAsIHNpemVvZihwY2FwX2lmX3QpKTsgLyogYnplcm8oKSBpcyBkZXByZWNhdGVkLCByZXBsYWNlZCB3aXRoIG1lbXNldCgpICovCkBAIC01ODYsNyArNTkxLDcgQEAKIAogCQkJCWlmICgqcHRyKSB7CQkJCQkJCQkJCQkJCS8qIGlmIHRoZXJlIGlzIGEgY291bnQgZm9yIHRoZSBuYW1lICovCiAJCQkJCWlmICgoaWZmLT5uYW1lID0gbWFsbG9jKCpwdHIgKyAxKSkgPT0gTlVMTCkgewkJCS8qIGdldCB0aGF0IGFtb3VudCBvZiBzcGFjZSAqLwotCQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQkJCXJldHVybiAtMTsKIAkJCQkJfQogCQkJCQltZW1jcHkoaWZmLT5uYW1lLCAocHRyICsgMSksICpwdHIpOwkJCQkJCS8qIGNvcHkgdGhlIG5hbWUgaW50byB0aGUgbWFsbG9jJ2VkIHNwYWNlICovCkBAIC01OTcsNyArNjAyLDcgQEAKIAogCQkJCWlmICgqcHRyKSB7CQkJCQkJCQkJCQkJCS8qIGlmIHRoZXJlIGlzIGEgY291bnQgZm9yIHRoZSBkZXNjcmlwdGlvbiAqLwogCQkJCQlpZiAoKGlmZi0+ZGVzY3JpcHRpb24gPSBtYWxsb2MoKnB0ciArIDEpKSA9PSBOVUxMKSB7CS8qIGdldCB0aGF0IGFtb3VudCBvZiBzcGFjZSAqLwotCQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQkJCXJldHVybiAtMTsKIAkJCQkJfQogCQkJCQltZW1jcHkoaWZmLT5kZXNjcmlwdGlvbiwgKHB0ciArIDEpLCAqcHRyKTsJCQkJLyogY29weSB0aGUgbmFtZSBpbnRvIHRoZSBtYWxsb2MnZWQgc3BhY2UgKi8KQEAgLTYxNywxNSArNjIyLDE1IEBACiAJCQkJcHJldl9hZGRyID0gMDsKIAkJCQl3aGlsZSAoYWRkcmVzc19jb3VudC0tKSB7CiAJCQkJCWlmICgoYWRkciA9IG1hbGxvYyhzaXplb2YocGNhcF9hZGRyX3QpKSkgPT0gTlVMTCkgewotCQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQkJCXJldHVybiAtMTsKIAkJCQkJfQotKwkJCQkJbWVtc2V0KChjaGFyICopYWRkciwgMCwgc2l6ZW9mKHBjYXBfYWRkcl90KSk7IC8qIGJ6ZXJvKCkgaXMgZGVwcmVjYXRlZCwgcmVwbGFjZWQgd2l0aCBtZW1zZXQoKSAqLworIAkJCQkJbWVtc2V0KChjaGFyICopYWRkciwgMCwgc2l6ZW9mKHBjYXBfYWRkcl90KSk7IC8qIGJ6ZXJvKCkgaXMgZGVwcmVjYXRlZCwgcmVwbGFjZWQgd2l0aCBtZW1zZXQoKSAqLwogCQkJCQlpZiAoaWZmLT5hZGRyZXNzZXMgPT0gMCkgaWZmLT5hZGRyZXNzZXMgPSBhZGRyOwogCQkJCQlpZiAocHJldl9hZGRyKSBwcmV2X2FkZHItPm5leHQgPSBhZGRyOwkJCQkJCQkvKiBpbnNlcnQgYSBmb3J3YXJkIGxpbmsgKi8KIAkJCQkJaWYgKCpwdHIpIHsJCQkJCQkJCQkJCQkJCS8qIGlmIHRoZXJlIGlzIGEgY291bnQgZm9yIHRoZSBhZGRyZXNzICovCiAJCQkJCQlpZiAoKHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSA9PSBOVUxMKSB7CQkvKiBnZXQgdGhhdCBhbW91bnQgb2Ygc3BhY2UgKi8KLQkJCQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQkJCQlyZXR1cm4gLTE7CiAJCQkJCQl9CiAJCQkJCQltZW1zZXQoKGNoYXIgKilzLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7IC8qIGJ6ZXJvKCkgaXMgZGVwcmVjYXRlZCwgcmVwbGFjZWQgd2l0aCBtZW1zZXQoKSAqLwpAQCAtNjM3LDcgKzY0Miw3IEBACiAJCQkJCXB0cisrOwkJCQkJCQkJCQkJCQkvKiB0aGVuIGZvcndhcmRzIG9uZSBtb3JlIGZvciB0aGUgJ2xlbmd0aCBvZiB0aGUgYWRkcmVzcycgZmllbGQgKi8KIAkJCQkJaWYgKCpwdHIpIHsJCQkJCQkJCQkJCQkvKiBwcm9jZXNzIGFueSBuZXRtYXNrICovCiAJCQkJCQlpZiAoKHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSA9PSBOVUxMKSB7Ci0JCQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkJCQkJcmV0dXJuIC0xOwogCQkJCQkJfQogCQkJCQkJLyogYnplcm8oKSBpcyBkZXByZWNhdGVkLCByZXBsYWNlZCB3aXRoIG1lbXNldCgpICovCkBAIC02NTEsNyArNjU2LDcgQEAKIAkJCQkJcHRyKys7CiAJCQkJCWlmICgqcHRyKSB7CQkJCQkJCQkJCQkJLyogcHJvY2VzcyBhbnkgYnJvYWRjYXN0IGFkZHJlc3MgKi8KIAkJCQkJCWlmICgocyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkpID09IE5VTEwpIHsKLQkJCQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQkJCQlyZXR1cm4gLTE7CiAJCQkJCQl9CiAJCQkJCQkvKiBiemVybygpIGlzIGRlcHJlY2F0ZWQsIHJlcGxhY2VkIHdpdGggbWVtc2V0KCkgKi8KQEAgLTY2NSw3ICs2NzAsNyBAQAogCQkJCQlwdHIrKzsKIAkJCQkJaWYgKCpwdHIpIHsJCQkJCQkJCQkJCQkvKiBwcm9jZXNzIGFueSBkZXN0aW5hdGlvbiBhZGRyZXNzICovCiAJCQkJCQlpZiAoKHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSA9PSBOVUxMKSB7Ci0JCQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkJCQkJcmV0dXJuIC0xOwogCQkJCQkJfQogCQkJCQkJLyogYnplcm8oKSBpcyBkZXByZWNhdGVkLCByZXBsYWNlZCB3aXRoIG1lbXNldCgpICovCkBAIC02ODIsMTAgKzY4NywxMiBAQAogCQkJCXByZXZfaWZmID0gaWZmOwogCiAJCQkJbmV3bmFtZSA9IHRyYW5zbGF0ZV9JT1BfdG9fcGNhcF9uYW1lKHUsIGlmZi0+bmFtZSwgaW50ZXJmYWNlVHlwZSk7CQkvKiBhZGQgYSB0cmFuc2xhdGlvbiBlbnRyeSBhbmQgZ2V0IGEgcG9pbnQgdG8gdGhlIG1hbmdsZWQgbmFtZSAqLwotCQkJCWlmICgoaWZmLT5uYW1lID0gcmVhbGxvYyhpZmYtPm5hbWUsIHN0cmxlbihuZXduYW1lKSArIDEpKSA9PSBOVUxMKSB7CS8qIHdlIG5vdyByZS13cml0ZSB0aGUgbmFtZSBzdG9yZWQgaW4gdGhlIGludGVyZmFjZSBsaXN0ICovCi0JCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCWJpZ2dlcl9idWZmZXIgPSByZWFsbG9jKGlmZi0+bmFtZSwgc3RybGVuKG5ld25hbWUpICsgMSkpOworCQkJCWlmIChiaWdnZXJfYnVmZmVyID09IE5VTEwpIHsJLyogd2Ugbm93IHJlLXdyaXRlIHRoZSBuYW1lIHN0b3JlZCBpbiB0aGUgaW50ZXJmYWNlIGxpc3QgKi8KKwkJCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJyZWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCQkJcmV0dXJuIC0xOwogCQkJCX0KKwkJCQlpZmYtPm5hbWUgPSBiaWdnZXJfYnVmZmVyOwogCQkJCXN0cmNweShpZmYtPm5hbWUsIG5ld25hbWUpOwkJCQkJCQkJCQkJCS8qIHRvIHRoaXMgbmV3IG5hbWUgKi8KIAkJCX0KIAkJfQpAQCAtODE2LDcgKzgyMyw3IEBACiAJaWZhY2VfdAkJKnA7CiAJcGNhcF9pZl90CSphbGxkZXZzcDsKIAotCXBjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcygmYWxsZGV2c3AsIGVycmJ1Zik7CisJcGNhcF9wbGF0Zm9ybV9maW5kZGV2cygmYWxsZGV2c3AsIGVycmJ1Zik7CiAJZm9yIChjaGFzc2lzID0gMDsgY2hhc3NpcyA8PSBNQVhfQ0hBU1NJUzsgY2hhc3NpcysrKSB7CQkJCQkJCQkJCS8qIHNjYW4gdGhlIHRhYmxlLi4uICovCiAJCWZvciAoZ2Vvc2xvdCA9IDA7IGdlb3Nsb3QgPD0gTUFYX0dFT1NMT1Q7IGdlb3Nsb3QrKykgewogCQkJdSA9ICZ1bml0c1tjaGFzc2lzXVtnZW9zbG90XTsKQEAgLTg5Miw3ICs4OTksNyBAQAogfQogCiBzdGF0aWMgaW50IHBjYXBfc2V0ZGlyZWN0aW9uX2FjbihwY2FwX3QgKmhhbmRsZSwgcGNhcF9kaXJlY3Rpb25fdCBkKSB7Ci0Jc25wcmludGYoaGFuZGxlLT5lcnJidWYsIHNpemVvZihoYW5kbGUtPmVycmJ1ZiksCisJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1Ziwgc2l6ZW9mKGhhbmRsZS0+ZXJyYnVmKSwKIAkgICAgIlNldHRpbmcgZGlyZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gQUNOIGFkYXB0ZXJzIik7CiAJcmV0dXJuIC0xOwogfQpAQCAtOTUxLDcgKzk1OCw3IEBACiAJcGNhcF9oZWFkZXIuY2FwbGVuCQk9IG50b2hsKCoodWludDMyX3QgKikmcGFja2V0X2hlYWRlcls4XSk7CQkJCS8qIGNhcGxlbiAqLwogCXBjYXBfaGVhZGVyLmxlbgkJCT0gbnRvaGwoKih1aW50MzJfdCAqKSZwYWNrZXRfaGVhZGVyWzEyXSk7CQkJCS8qIGxlbiAqLwogCi0JaGFuZGxlLT5icCA9IGhhbmRsZS0+YnVmZmVyICsgaGFuZGxlLT5vZmZzZXQ7CQkJCQkJCQkJLyogc3RhcnQgb2ZmIHRoZSByZWNlaXZlIHBvaW50ZXIgYXQgdGhlIHJpZ2h0IHNwb3QgKi8KKwloYW5kbGUtPmJwID0gKHVfY2hhciAqKWhhbmRsZS0+YnVmZmVyICsgaGFuZGxlLT5vZmZzZXQ7CQkJCQkJCQkJLyogc3RhcnQgb2ZmIHRoZSByZWNlaXZlIHBvaW50ZXIgYXQgdGhlIHJpZ2h0IHNwb3QgKi8KIAlpZiAoYWNuX3JlYWRfbl9ieXRlc193aXRoX3RpbWVvdXQoaGFuZGxlLCBwY2FwX2hlYWRlci5jYXBsZW4pID09IC0xKSByZXR1cm4gMDsJLyogdGhlbiB0cnkgdG8gcmVhZCBpbiB0aGUgcmVzdCBvZiB0aGUgZGF0YSAqLwogCiAJY2FsbGJhY2sodXNlciwgJnBjYXBfaGVhZGVyLCBoYW5kbGUtPmJwKTsJCQkJCQkJCQkJLyogY2FsbCB0aGUgdXNlciBzdXBwbGllZCBjYWxsYmFjayBmdW5jdGlvbiAqLwpAQCAtOTgxLDcgKzk4OCw3IEBACiAJaGFuZGxlLT5yZWFkX29wID0gcGNhcF9yZWFkX2FjbjsKIAloYW5kbGUtPnN0YXRzX29wID0gcGNhcF9zdGF0c19hY247CiAKLQlmZCA9IGFjbl9vcGVuX2xpdmUoaGFuZGxlLT5vcHQuc291cmNlLCBoYW5kbGUtPmVycmJ1ZiwKKwlmZCA9IGFjbl9vcGVuX2xpdmUoaGFuZGxlLT5vcHQuZGV2aWNlLCBoYW5kbGUtPmVycmJ1ZiwKIAkgICAgJmhhbmRsZS0+bGlua3R5cGUpOwogCWlmIChmZCA9PSAtMSkKIAkJcmV0dXJuIFBDQVBfRVJST1I7CkBAIC05OTIsNyArOTk5LDcgQEAKIAogCWhhbmRsZS0+YnVmZmVyCSA9IG1hbGxvYyhoYW5kbGUtPmJ1ZnNpemUgKyBoYW5kbGUtPm9mZnNldCk7CiAJaWYgKCFoYW5kbGUtPmJ1ZmZlcikgewotCSAgICAgICAgc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICAgICBwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlwY2FwX2NsZWFudXBfYWNuKGhhbmRsZSk7CiAJCXJldHVybiBQQ0FQX0VSUk9SOwpAQCAtMTAwNywxMyArMTAxNCwzNiBAQAogCXJldHVybiAwOwogfQogCi1wY2FwX3QgKnBjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpIHsKK3BjYXBfdCAqcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSBfVV8sIGNoYXIgKmVidWYpIHsKIAlwY2FwX3QgKnA7CiAKLQlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1ZiwgMCk7CisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihlYnVmLCAwKTsKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gKE5VTEwpOwogCiAJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX3NpdGE7CiAJcmV0dXJuIChwKTsKIH0KKworaW50IHBjYXBfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikgeworCisJLy9wcmludGYoInBjYXBfZmluZGFsbGRldnMoKVxuIik7CQkJCS8vIGZ1bGtvCisKKwkqYWxsZGV2c3AgPSAwOwkJCQkJCQkJCQkJCS8qIGluaXRpYWxpemUgdGhlIHJldHVybmVkIHZhcmlhYmxlcyBiZWZvcmUgd2UgZG8gYW55dGhpbmcgKi8KKwlzdHJjcHkoZXJyYnVmLCAiIik7CisJaWYgKGFjbl9wYXJzZV9ob3N0c19maWxlKGVycmJ1ZikpCQkJCQkJCS8qIHNjYW4gdGhlIGhvc3RzIGZpbGUgZm9yIHBvdGVudGlhbCBJT1BzICovCisJCXsKKwkJLy9wcmludGYoInBjYXBfZmluZGFsbGRldnMoKSByZXR1cm5pbmcgQkFEIGFmdGVyIHBhcnNlaG9zdHNcbiIpOwkJCQkvLyBmdWxrbworCQlyZXR1cm4gLTE7CisJCX0KKwkvL3ByaW50ZigicGNhcF9maW5kYWxsZGV2cygpIGdvdCBob3N0bGlzdCBub3cgZmluZGluZyBkZXZzXG4iKTsJCQkJLy8gZnVsa28KKwlpZiAoYWNuX2ZpbmRhbGxkZXZzKGVycmJ1ZikpCQkJCQkJCQkvKiB0aGVuIGFzayB0aGUgSU9QcyBmb3IgdGhlaXIgbW9uaXRvcmFibGUgZGV2aWNlcyAqLworCQl7CisJCS8vcHJpbnRmKCJwY2FwX2ZpbmRhbGxkZXZzKCkgcmV0dXJuaW5nIEJBRCBhZnRlciBmaW5kYWxsZGV2c1xuIik7CQkJCS8vIGZ1bGtvCisJCXJldHVybiAtMTsKKwkJfQorCSphbGxkZXZzcCA9IGFjbl9pZl9saXN0OworCWFjbl9pZl9saXN0ID0gMDsJCQkJCQkJCQkJCS8qIHRoZW4gZm9yZ2V0IG91ciBsaXN0IGhlYWQsIGJlY2F1c2Ugc29tZW9uZSB3aWxsIGNhbGwgcGNhcF9mcmVlYWxsZGV2cygpIHRvIGVtcHR5IHRoZSBtYWxsb2MnZWQgc3R1ZmYgKi8KKwkvL3ByaW50ZigicGNhcF9maW5kYWxsZGV2cygpIHJldHVybmluZyBaRVJPIE9LXG4iKTsJCQkJLy8gZnVsa28KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3BjYXAtc25mLmMgYi9wY2FwLXNuZi5jCmluZGV4IDAzZGMwOGQuLjIwN2M0OTUgMTAwNjQ0Ci0tLSBhL3BjYXAtc25mLmMKKysrIGIvcGNhcC1zbmYuYwpAQCAtNTEsNyArNTEsNyBAQAogCWludCByYzsKIAogCWlmICgocmMgPSBzbmZfcmluZ19nZXRzdGF0cyhzbmZwcy0+c25mX3JpbmcsICZzdGF0cykpKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNuZl9nZXRfc3RhdHM6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzbmZfZ2V0X3N0YXRzOiAlcyIsCiAJCQkgcGNhcF9zdHJlcnJvcihyYykpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNjYsOSArNjYsNiBAQAogewogCXN0cnVjdCBwY2FwX3NuZiAqcHMgPSBwLT5wcml2OwogCi0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuOwotCiAjaWZkZWYgU05GX0hBVkVfSU5KRUNUX0FQSQogICAgICAgICBpZiAocHMtPnNuZl9pbmopCiAgICAgICAgICAgICAgICAgc25mX2luamVjdF9jbG9zZShwcy0+c25mX2luaik7CkBAIC0xNjQsNyArMTYxLDcgQEAKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWVsc2UgewotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNuZl9yZWFkOiAlcyIsCisJCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzbmZfcmVhZDogJXMiLAogCQkJCSAJIHBjYXBfc3RyZXJyb3IoZXJyKSk7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQpAQCAtMjE5LDcgKzIxNiw3IEBACiAgICAgICAgIGlmIChwcy0+c25mX2luaiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmMgPSBzbmZfaW5qZWN0X29wZW4ocHMtPnNuZl9ib2FyZG51bSwgMCwgJnBzLT5zbmZfaW5qKTsKICAgICAgICAgICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic25mX2luamVjdF9vcGVuOiAlcyIsIHBjYXBfc3RyZXJyb3IocmMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgICAgICAgICAgIH0KQEAgLTIzMCw3ICsyMjcsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic25mX2luamVjdF9zZW5kOiAlcyIsCisgICAgICAgICAgICAgICAgcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzbmZfaW5qZWN0X3NlbmQ6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwY2FwX3N0cmVycm9yKHJjKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgICAgIH0KQEAgLTI0NSwxMyArMjQyLDEzIEBACiBzbmZfYWN0aXZhdGUocGNhcF90KiBwKQogewogCXN0cnVjdCBwY2FwX3NuZiAqcHMgPSBwLT5wcml2OwotCWNoYXIgKmRldmljZSA9IHAtPm9wdC5zb3VyY2U7CisJY2hhciAqZGV2aWNlID0gcC0+b3B0LmRldmljZTsKIAljb25zdCBjaGFyICpuciA9IE5VTEw7CiAJaW50IGVycjsKIAlpbnQgZmxhZ3MgPSAtMSwgcmluZ19pZCA9IC0xOwogCiAJaWYgKGRldmljZSA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgImRldmljZSBpcyBOVUxMOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTI3Miw3ICsyNjksNyBAQAogCQkJZmxhZ3MsIC8qIG1heSB3YW50IHBzaGFyZWQgKi8KIAkJCSZwcy0+c25mX2hhbmRsZSk7CiAJaWYgKGVyciAhPSAwKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgInNuZl9vcGVuIGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycikpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMjgyLDcgKzI3OSw3IEBACiAJfQogCWVyciA9IHNuZl9yaW5nX29wZW5faWQocHMtPnNuZl9oYW5kbGUsIHJpbmdfaWQsICZwcy0+c25mX3JpbmcpOwogCWlmIChlcnIgIT0gMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICJzbmZfcmluZ19vcGVuX2lkKHJpbmc9JWQpIGZhaWxlZDogJXMiLAogCQkJIHJpbmdfaWQsIHBjYXBfc3RyZXJyb3IoZXJyKSk7CiAJCXJldHVybiAtMTsKQEAgLTI5NSw3ICsyOTIsNyBAQAogCiAJZXJyID0gc25mX3N0YXJ0KHBzLT5zbmZfaGFuZGxlKTsKIAlpZiAoZXJyICE9IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAic25mX3N0YXJ0IGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycikpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzM1LDcgKzMzMiw3IEBACiAKIAlpZiAoc25mX2dldGlmYWRkcnMoJmlmYWRkcnMpIHx8IGlmYWRkcnMgPT0gTlVMTCkKIAl7Ci0JCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJKHZvaWQpcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkic25mX2dldGlmYWRkcnM6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKC0xKTsKIAl9CkBAIC0zNDcsNyArMzQ0LDcgQEAKIAkJICovCiAJCWN1cmRldiA9IChwY2FwX2lmX3QgKiltYWxsb2Moc2l6ZW9mKHBjYXBfaWZfdCkpOwogCQlpZiAoY3VyZGV2ID09IE5VTEwpIHsKLQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSJzbmZfZmluZGFsbGRldnMgbWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAoLTEpOwogCQl9CkBAIC0zNjEsMTYgKzM1OCwxNiBAQAogCQljdXJkZXYtPm5leHQgPSBOVUxMOwogCQljdXJkZXYtPm5hbWUgPSBzdHJkdXAoaWZhLT5zbmZfaWZhX25hbWUpOwogCQlpZiAoY3VyZGV2LT5uYW1lID09IE5VTEwpIHsKLQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJzbmZfZmluZGFsbGRldnMgc3RyZHVwOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWZyZWUoY3VyZGV2KTsKIAkJCXJldHVybiAoLTEpOwogCQl9Ci0JCSh2b2lkKXNucHJpbnRmKGRlc2MsTUFYX0RFU0NfTEVOR1RILCJNeXJpY29tIHNuZiVkIiwKKwkJKHZvaWQpcGNhcF9zbnByaW50ZihkZXNjLE1BWF9ERVNDX0xFTkdUSCwiTXlyaWNvbSBzbmYlZCIsCiAJCQkJaWZhLT5zbmZfaWZhX3BvcnRudW0pOwogCQljdXJkZXYtPmRlc2NyaXB0aW9uID0gc3RyZHVwKGRlc2MpOwogCQlpZiAoY3VyZGV2LT5kZXNjcmlwdGlvbiA9PSBOVUxMKSB7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSJzbmZfZmluZGFsbGRldnMgc3RyZHVwMTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlmcmVlKGN1cmRldi0+bmFtZSk7CiAJCQlmcmVlKGN1cmRldik7CkBAIC0zODEsNyArMzc4LDcgQEAKIAogCQljdXJhZGRyID0gKHBjYXBfYWRkcl90ICopbWFsbG9jKHNpemVvZihwY2FwX2FkZHJfdCkpOwogCQlpZiAoY3VyYWRkciA9PSBOVUxMKSB7Ci0JCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkodm9pZClwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAgInNuZl9maW5kYWxsZGV2cyBtYWxsb2MxOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWZyZWUoY3VyZGV2LT5kZXNjcmlwdGlvbik7CiAJCQlmcmVlKGN1cmRldi0+bmFtZSk7CkBAIC0zOTIsNyArMzg5LDcgQEAKIAkJY3VyYWRkci0+bmV4dCA9IE5VTEw7CiAJCWN1cmFkZHItPmFkZHIgPSAoc3RydWN0IHNvY2thZGRyKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSk7CiAJCWlmIChjdXJhZGRyLT5hZGRyID09IE5VTEwpIHsKLQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJtYWxsb2MyOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWZyZWUoY3VyZGV2LT5kZXNjcmlwdGlvbik7CiAJCQlmcmVlKGN1cmRldi0+bmFtZSk7CkBAIC00NzAsNyArNDY3LDcgQEAKIAkvKiBPSywgaXQncyBwcm9iYWJseSBvdXJzLiAqLwogCSppc19vdXJzID0gMTsKIAotCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3NuZikpOworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9zbmYpKTsKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlwcyA9IHAtPnByaXY7CkBAIC00ODEsMTEgKzQ3OCw5IEBACiAJcC0+dHN0YW1wX3ByZWNpc2lvbl9jb3VudCA9IDI7CiAJcC0+dHN0YW1wX3ByZWNpc2lvbl9saXN0ID0gbWFsbG9jKDIgKiBzaXplb2YodV9pbnQpKTsKIAlpZiAocC0+dHN0YW1wX3ByZWNpc2lvbl9saXN0ID09IE5VTEwpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAorCQlwY2FwX3NucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJaWYgKHAtPnRzdGFtcF90eXBlX2xpc3QgIT0gTlVMTCkKLQkJCWZyZWUocC0+dHN0YW1wX3R5cGVfbGlzdCk7Ci0JCWZyZWUocCk7CisJCXBjYXBfY2xvc2UocCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlwLT50c3RhbXBfcHJlY2lzaW9uX2xpc3RbMF0gPSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk87CkBAIC00OTUsMyArNDkwLDMxIEBACiAJcHMtPnNuZl9ib2FyZG51bSA9IGJvYXJkbnVtOwogCXJldHVybiBwOwogfQorCisjaWZkZWYgU05GX09OTFkKKy8qCisgKiBUaGlzIGxpYnBjYXAgYnVpbGQgc3VwcG9ydHMgb25seSBTTkYgY2FyZHMsIG5vdCByZWd1bGFyIG5ldHdvcmsKKyAqIGludGVyZmFjZXMuLgorICovCisKKy8qCisgKiBUaGVyZSBhcmUgbm8gcmVndWxhciBpbnRlcmZhY2VzLCBqdXN0IERBRyBpbnRlcmZhY2VzLgorICovCitpbnQKK3BjYXBfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKK3sKKwkqYWxsZGV2c3AgPSBOVUxMOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBBdHRlbXB0cyB0byBvcGVuIGEgcmVndWxhciBpbnRlcmZhY2UgZmFpbC4KKyAqLworcGNhcF90ICoKK3BjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVycmJ1ZikKK3sKKwlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIlRoaXMgdmVyc2lvbiBvZiBsaWJwY2FwIG9ubHkgc3VwcG9ydHMgU05GIGNhcmRzIik7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3BjYXAtc25pdC5jIGIvcGNhcC1zbml0LmMKaW5kZXggMGNlNzg2MC4uNzkzNDk0NSAxMDA2NDQKLS0tIGEvcGNhcC1zbml0LmMKKysrIGIvcGNhcC1zbml0LmMKQEAgLTEzMCwxMSArMTMwLDExIEBACiAJCWlmIChjYyA8IDApIHsKIAkJCWlmIChlcnJubyA9PSBFV09VTERCTE9DSykKIAkJCQlyZXR1cm4gKDApOwotCQkJc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwgInBjYXBfcmVhZDogJXMiLAorCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLCAicGNhcF9yZWFkOiAlcyIsCiAJCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuICgtMSk7CiAJCX0KLQkJYnAgPSBwLT5idWZmZXI7CisJCWJwID0gKHVfY2hhciAqKXAtPmJ1ZmZlcjsKIAl9IGVsc2UKIAkJYnAgPSBwLT5icDsKIApAQCAtMjIzLDcgKzIyMyw3IEBACiAJZGF0YS5sZW4gPSBzaXplOwogCXJldCA9IHB1dG1zZyhwLT5mZCwgJmN0bCwgJmRhdGEpOwogCWlmIChyZXQgPT0gLTEpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZDogJXMiLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJCXNpLmljX2xlbiA9IHNpemVvZih6ZXJvKTsKIAkJc2kuaWNfZHAgPSAoY2hhciAqKSZ6ZXJvOwogCQlpZiAoaW9jdGwocC0+ZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DU0NIVU5LOiAlcyIsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5JT0NTQ0hVTks6ICVzIiwKIAkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gKC0xKTsKIAkJfQpAQCAtMjYwLDcgKzI2MCw3IEBACiAJCXNpLmljX2xlbiA9IHNpemVvZih0aW1lb3V0KTsKIAkJc2kuaWNfZHAgPSAoY2hhciAqKSZ0aW1lb3V0OwogCQlpZiAoaW9jdGwocC0+ZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DU1RJTUU6ICVzIiwKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTklPQ1NUSU1FOiAlcyIsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuICgtMSk7CiAJCX0KQEAgLTI3Miw3ICsyNzIsNyBAQAogCXNpLmljX2xlbiA9IHNpemVvZihmbGFncyk7CiAJc2kuaWNfZHAgPSAoY2hhciAqKSZmbGFnczsKIAlpZiAoaW9jdGwocC0+ZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5JT0NTRkxBR1M6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DU0ZMQUdTOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTI4Niw3ICsyODYsNyBAQAogCXN0cnVjdCBpZnJlcSBpZnI7CQkvKiBpbnRlcmZhY2UgcmVxdWVzdCBzdHJ1Y3QgKi8KIAlpbnQgY2h1bmtzaXplID0gQ0hVTktTSVpFOwogCWludCBmZDsKLQlzdGF0aWMgY2hhciBkZXZbXSA9ICIvZGV2L25pdCI7CisJc3RhdGljIGNvbnN0IGNoYXIgZGV2W10gPSAiL2Rldi9uaXQiOwogCiAJaWYgKHAtPm9wdC5yZm1vbikgewogCQkvKgpAQCAtMzIwLDE5ICszMjAsMTkgQEAKIAlpZiAoZmQgPCAwICYmIGVycm5vID09IEVBQ0NFUykKIAkJcC0+ZmQgPSBmZCA9IG9wZW4oZGV2LCBPX1JET05MWSk7CiAJaWYgKGZkIDwgMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLCBkZXYsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwgZGV2LAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGJhZDsKIAl9CiAKIAkvKiBhcnJhbmdlIHRvIGdldCBkaXNjcmV0ZSBtZXNzYWdlcyBmcm9tIHRoZSBTVFJFQU0gYW5kIHVzZSBOSVRfQlVGICovCiAJaWYgKGlvY3RsKGZkLCBJX1NSRE9QVCwgKGNoYXIgKilSTVNHRCkgPCAwKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIklfU1JET1BUOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiSV9TUkRPUFQ6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQogCWlmIChpb2N0bChmZCwgSV9QVVNILCAibmJ1ZiIpIDwgMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJwdXNoIG5idWY6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJwdXNoIG5idWY6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtMzQyLDE5ICszNDIsMjQgQEAKIAlzaS5pY19sZW4gPSBzaXplb2YoY2h1bmtzaXplKTsKIAlzaS5pY19kcCA9IChjaGFyICopJmNodW5rc2l6ZTsKIAlpZiAoaW9jdGwoZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5JT0NTQ0hVTks6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DU0NIVU5LOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KIAogCS8qIHJlcXVlc3QgdGhlIGludGVyZmFjZSAqLwotCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBwLT5vcHQuc291cmNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJc3RybmNweShpZnIuaWZyX25hbWUsIHAtPm9wdC5kZXZpY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKIAlpZnIuaWZyX25hbWVbc2l6ZW9mKGlmci5pZnJfbmFtZSkgLSAxXSA9ICdcMCc7CiAJc2kuaWNfY21kID0gTklPQ0JJTkQ7CiAJc2kuaWNfbGVuID0gc2l6ZW9mKGlmcik7CiAJc2kuaWNfZHAgPSAoY2hhciAqKSZpZnI7CiAJaWYgKGlvY3RsKGZkLCBJX1NUUiwgKGNoYXIgKikmc2kpIDwgMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DQklORDogJXM6ICVzIiwKKwkJLyoKKwkJICogWFhYIC0gaXMgdGhlcmUgYW4gZXJyb3IgdGhhdCBtZWFucyAibm8gc3VjaCBkZXZpY2UiPworCQkgKiBJcyB0aGVyZSBvbmUgdGhhdCBtZWFucyAidGhhdCBkZXZpY2UgZG9lc24ndCBzdXBwb3J0CisJCSAqIFNUUkVBTVMgTklUIj8KKwkJICovCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTklPQ0JJTkQ6ICVzOiAlcyIsCiAJCQlpZnIuaWZyX25hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtMzY0LDcgKzM2OSw3IEBACiAJc2kuaWNfbGVuID0gc2l6ZW9mKHAtPnNuYXBzaG90KTsKIAlzaS5pY19kcCA9IChjaGFyICopJnAtPnNuYXBzaG90OwogCWlmIChpb2N0bChmZCwgSV9TVFIsIChjaGFyICopJnNpKSA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTklPQ1NTTkFQOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTklPQ1NTTkFQOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KQEAgLTM3OCw3ICszODMsNyBAQAogCXAtPmxpbmt0eXBlID0gRExUX0VOMTBNQjsKIAogCXAtPmJ1ZnNpemUgPSBCVUZTUEFDRTsKLQlwLT5idWZmZXIgPSAodV9jaGFyICopbWFsbG9jKHAtPmJ1ZnNpemUpOworCXAtPmJ1ZmZlciA9IG1hbGxvYyhwLT5idWZzaXplKTsKIAlpZiAocC0+YnVmZmVyID09IE5VTEwpIHsKIAkJc3RybGNweShwLT5lcnJidWYsIHBjYXBfc3RyZXJyb3IoZXJybm8pLCBQQ0FQX0VSUkJVRl9TSVpFKTsKIAkJZ290byBiYWQ7CkBAIC00MjYsMTEgKzQzMSwxMSBAQAogfQogCiBwY2FwX3QgKgotcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3BjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UgX1VfLCBjaGFyICplYnVmKQogewogCXBjYXBfdCAqcDsKIAotCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3NuaXQpKTsKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfc25pdCkpOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiAoTlVMTCk7CiAKQEAgLTQzOCw4ICs0NDMsMTggQEAKIAlyZXR1cm4gKHApOwogfQogCisvKgorICogWFhYIC0gdGhlcmUncyBwcm9iYWJseSBhIE5JT0NCSU5EIGVycm9yIHRoYXQgbWVhbnMgInRoYXQgZGV2aWNlCisgKiBkb2Vzbid0IHN1cHBvcnQgTklUIjsgaWYgc28sIHdlIHNob3VsZCB0cnkgYW4gTklPQ0JJTkQgYW5kIHVzZSB0aGF0LgorICovCitzdGF0aWMgaW50CitjYW5fYmVfYm91bmQoY29uc3QgY2hhciAqbmFtZSBfVV8pCit7CisJcmV0dXJuICgxKTsKK30KKwogaW50CiBwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCiB7Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gKHBjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhhbGxkZXZzcCwgZXJyYnVmLCBjYW5fYmVfYm91bmQpKTsKIH0KZGlmZiAtLWdpdCBhL3BjYXAtc25vb3AuYyBiL3BjYXAtc25vb3AuYwppbmRleCBmNjIyZjMxLi42ODdiMWQ5IDEwMDY0NAotLS0gYS9wY2FwLXNub29wLmMKKysrIGIvcGNhcC1zbm9vcC5jCkBAIC05NSw3ICs5NSw3IEBACiAJCWNhc2UgRVdPVUxEQkxPQ0s6CiAJCQlyZXR1cm4gKDApOwkJCS8qIFhYWCAqLwogCQl9Ci0JCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKIAkJICAgICJyZWFkOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQpAQCAtMTUwLDcgKzE1MCw3IEBACiAJICovCiAJcmV0ID0gd3JpdGUocC0+ZmQsIGJ1Ziwgc2l6ZSk7CiAJaWYgKHJldCA9PSAtMSkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzZW5kOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZDogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKC0xKTsKIAl9CkBAIC0xNjcsNyArMTY3LDcgQEAKIAlycyA9ICZyYXdzdGF0czsKIAltZW1zZXQocnMsIDAsIHNpemVvZigqcnMpKTsKIAlpZiAoaW9jdGwocC0+ZmQsIFNJT0NSQVdTVEFUUywgKGNoYXIgKilycykgPCAwKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKIAkJICAgICJTSU9DUkFXU1RBVFM6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlyZXR1cm4gKC0xKTsKIAl9CkBAIC0yMTIsMjIgKzIxMiwyOSBAQAogCiAJZmQgPSBzb2NrZXQoUEZfUkFXLCBTT0NLX1JBVywgUkFXUFJPVE9fU05PT1ApOwogCWlmIChmZCA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic25vb3Agc29ja2V0OiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic25vb3Agc29ja2V0OiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KIAlwLT5mZCA9IGZkOwogCW1lbXNldCgmc3IsIDAsIHNpemVvZihzcikpOwogCXNyLnNyX2ZhbWlseSA9IEFGX1JBVzsKLQkodm9pZClzdHJuY3B5KHNyLnNyX2lmbmFtZSwgcC0+b3B0LnNvdXJjZSwgc2l6ZW9mKHNyLnNyX2lmbmFtZSkpOworCSh2b2lkKXN0cm5jcHkoc3Iuc3JfaWZuYW1lLCBwLT5vcHQuZGV2aWNlLCBzaXplb2Yoc3Iuc3JfaWZuYW1lKSk7CiAJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3IsIHNpemVvZihzcikpKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNub29wIGJpbmQ6ICVzIiwKKwkJLyoKKwkJICogWFhYIC0gdGhlcmUncyBwcm9iYWJseSBhIHBhcnRpY3VsYXIgYmluZCBlcnJvciB0aGF0CisJCSAqIG1lYW5zICJ0aGVyZSdzIG5vIHN1Y2ggZGV2aWNlIiBhbmQgYSBwYXJ0aWN1bGFyIGJpbmQKKwkJICogZXJyb3IgdGhhdCBtZWFucyAidGhhdCBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHNub29wIjsKKwkJICogdGhleSBtaWdodCBiZSB0aGUgc2FtZSBlcnJvciwgaWYgdGhleSBib3RoIGVuZCB1cAorCQkgKiBtZWFuaW5nICJzbm9vcCBkb2Vzbid0IGtub3cgYWJvdXQgdGhhdCBkZXZpY2UiLgorCQkgKi8KKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzbm9vcCBiaW5kOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KIAltZW1zZXQoJnNmLCAwLCBzaXplb2Yoc2YpKTsKIAlpZiAoaW9jdGwoZmQsIFNJT0NBRERTTk9PUCwgJnNmKSA8IDApIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU0lPQ0FERFNOT09QOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU0lPQ0FERFNOT09QOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KQEAgLTIzOSwxOSArMjQ2LDE5IEBACiAJLyoKIAkgKiBYWFggaGFjayAtIG1hcCBkZXZpY2UgbmFtZSB0byBsaW5rIGxheWVyIHR5cGUKIAkgKi8KLQlpZiAoc3RybmNtcCgiZXQiLCBwLT5vcHQuc291cmNlLCAyKSA9PSAwIHx8CS8qIENoYWxsZW5nZSAxMCBNYml0ICovCi0JICAgIHN0cm5jbXAoImVjIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCB8fAkvKiBJbmRpZ28vSW5keSAxMCBNYml0LAorCWlmIChzdHJuY21wKCJldCIsIHAtPm9wdC5kZXZpY2UsIDIpID09IDAgfHwJLyogQ2hhbGxlbmdlIDEwIE1iaXQgKi8KKwkgICAgc3RybmNtcCgiZWMiLCBwLT5vcHQuZGV2aWNlLCAyKSA9PSAwIHx8CS8qIEluZGlnby9JbmR5IDEwIE1iaXQsCiAJCQkJCQkJICAgTzIgMTAvMTAwICovCi0JICAgIHN0cm5jbXAoImVmIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCB8fAkvKiBPMjAwLzIwMDAgMTAvMTAwIE1iaXQgKi8KLQkgICAgc3RybmNtcCgiZWciLCBwLT5vcHQuc291cmNlLCAyKSA9PSAwIHx8CS8qIE9jdGFuZS9PMnh4eC9PM3h4eCBHaWdhYml0ICovCi0JICAgIHN0cm5jbXAoImdmZSIsIHAtPm9wdC5zb3VyY2UsIDMpID09IDAgfHwJLyogR0lPIDEwMCBNYml0ICovCi0JICAgIHN0cm5jbXAoImZ4cCIsIHAtPm9wdC5zb3VyY2UsIDMpID09IDAgfHwJLyogQ2hhbGxlbmdlIFZNRSBFbmV0ICovCi0JICAgIHN0cm5jbXAoImVwIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCB8fAkvKiBDaGFsbGVuZ2UgOHgxMCBNYml0IEVQTEVYICovCi0JICAgIHN0cm5jbXAoInZmZSIsIHAtPm9wdC5zb3VyY2UsIDMpID09IDAgfHwJLyogQ2hhbGxlbmdlIFZNRSAxMDBNYml0ICovCi0JICAgIHN0cm5jbXAoImZhIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCB8fAotCSAgICBzdHJuY21wKCJxYWEiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwIHx8Ci0JICAgIHN0cm5jbXAoImNpcCIsIHAtPm9wdC5zb3VyY2UsIDMpID09IDAgfHwKLQkgICAgc3RybmNtcCgiZWwiLCBwLT5vcHQuc291cmNlLCAyKSA9PSAwKSB7CisJICAgIHN0cm5jbXAoImVmIiwgcC0+b3B0LmRldmljZSwgMikgPT0gMCB8fAkvKiBPMjAwLzIwMDAgMTAvMTAwIE1iaXQgKi8KKwkgICAgc3RybmNtcCgiZWciLCBwLT5vcHQuZGV2aWNlLCAyKSA9PSAwIHx8CS8qIE9jdGFuZS9PMnh4eC9PM3h4eCBHaWdhYml0ICovCisJICAgIHN0cm5jbXAoImdmZSIsIHAtPm9wdC5kZXZpY2UsIDMpID09IDAgfHwJLyogR0lPIDEwMCBNYml0ICovCisJICAgIHN0cm5jbXAoImZ4cCIsIHAtPm9wdC5kZXZpY2UsIDMpID09IDAgfHwJLyogQ2hhbGxlbmdlIFZNRSBFbmV0ICovCisJICAgIHN0cm5jbXAoImVwIiwgcC0+b3B0LmRldmljZSwgMikgPT0gMCB8fAkvKiBDaGFsbGVuZ2UgOHgxMCBNYml0IEVQTEVYICovCisJICAgIHN0cm5jbXAoInZmZSIsIHAtPm9wdC5kZXZpY2UsIDMpID09IDAgfHwJLyogQ2hhbGxlbmdlIFZNRSAxMDBNYml0ICovCisJICAgIHN0cm5jbXAoImZhIiwgcC0+b3B0LmRldmljZSwgMikgPT0gMCB8fAorCSAgICBzdHJuY21wKCJxYWEiLCBwLT5vcHQuZGV2aWNlLCAzKSA9PSAwIHx8CisJICAgIHN0cm5jbXAoImNpcCIsIHAtPm9wdC5kZXZpY2UsIDMpID09IDAgfHwKKwkgICAgc3RybmNtcCgiZWwiLCBwLT5vcHQuZGV2aWNlLCAyKSA9PSAwKSB7CiAJCXAtPmxpbmt0eXBlID0gRExUX0VOMTBNQjsKIAkJcC0+b2Zmc2V0ID0gUkFXX0hEUlBBRChzaXplb2Yoc3RydWN0IGV0aGVyX2hlYWRlcikpOwogCQlsbF9oZHJsZW4gPSBzaXplb2Yoc3RydWN0IGV0aGVyX2hlYWRlcik7CkBAIC0yODQsMjYgKzI5MSwyNiBAQAogCQkJcC0+ZGx0X2xpc3RbMV0gPSBETFRfRE9DU0lTOwogCQkJcC0+ZGx0X2NvdW50ID0gMjsKIAkJfQotCX0gZWxzZSBpZiAoc3RybmNtcCgiaXBnIiwgcC0+b3B0LnNvdXJjZSwgMykgPT0gMCB8fAotCQkgICBzdHJuY21wKCJybnMiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwIHx8CS8qIE8yLzIwMC8yMDAwIEZEREkgKi8KLQkJICAgc3RybmNtcCgieHBpIiwgcC0+b3B0LnNvdXJjZSwgMykgPT0gMCkgeworCX0gZWxzZSBpZiAoc3RybmNtcCgiaXBnIiwgcC0+b3B0LmRldmljZSwgMykgPT0gMCB8fAorCQkgICBzdHJuY21wKCJybnMiLCBwLT5vcHQuZGV2aWNlLCAzKSA9PSAwIHx8CS8qIE8yLzIwMC8yMDAwIEZEREkgKi8KKwkJICAgc3RybmNtcCgieHBpIiwgcC0+b3B0LmRldmljZSwgMykgPT0gMCkgewogCQlwLT5saW5rdHlwZSA9IERMVF9GRERJOwogCQlwLT5vZmZzZXQgPSAzOwkJCQkvKiBYWFggeWVhaD8gKi8KIAkJbGxfaGRybGVuID0gMTM7Ci0JfSBlbHNlIGlmIChzdHJuY21wKCJwcHAiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwKSB7CisJfSBlbHNlIGlmIChzdHJuY21wKCJwcHAiLCBwLT5vcHQuZGV2aWNlLCAzKSA9PSAwKSB7CiAJCXAtPmxpbmt0eXBlID0gRExUX1JBVzsKIAkJbGxfaGRybGVuID0gMDsJLyogRExUX1JBVyBtZWFuaW5nICJubyBQUFAgaGVhZGVyLCBqdXN0IHRoZSBJUCBwYWNrZXQiPyAqLwotCX0gZWxzZSBpZiAoc3RybmNtcCgicWZhIiwgcC0+b3B0LnNvdXJjZSwgMykgPT0gMCkgeworCX0gZWxzZSBpZiAoc3RybmNtcCgicWZhIiwgcC0+b3B0LmRldmljZSwgMykgPT0gMCkgewogCQlwLT5saW5rdHlwZSA9IERMVF9JUF9PVkVSX0ZDOwogCQlsbF9oZHJsZW4gPSAyNDsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoInBsIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCkgeworCX0gZWxzZSBpZiAoc3RybmNtcCgicGwiLCBwLT5vcHQuZGV2aWNlLCAyKSA9PSAwKSB7CiAJCXAtPmxpbmt0eXBlID0gRExUX1JBVzsKIAkJbGxfaGRybGVuID0gMDsJLyogQ3JheSBVTklDT1MvbXAgcHNldWRvIGxpbmsgKi8KLQl9IGVsc2UgaWYgKHN0cm5jbXAoImxvIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCkgeworCX0gZWxzZSBpZiAoc3RybmNtcCgibG8iLCBwLT5vcHQuZGV2aWNlLCAyKSA9PSAwKSB7CiAJCXAtPmxpbmt0eXBlID0gRExUX05VTEw7CiAJCWxsX2hkcmxlbiA9IDQ7CiAJfSBlbHNlIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJzbm9vcDogdW5rbm93biBwaHlzaWNhbCBsYXllciB0eXBlIik7CiAJCWdvdG8gYmFkOwogCX0KQEAgLTMyMyw5ICszMzAsOSBAQAogCSAqIHRoZSBNVFUgZmlyc3QgYW5kLCBpZiB0aGF0IHN1Y2NlZWRzLCB0cmltIHRoZSBzbmFwIGxlbmd0aAogCSAqIHRvIGJlIG5vIGdyZWF0ZXIgdGhhbiB0aGUgTVRVLgogCSAqLwotCSh2b2lkKXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBwLT5vcHQuc291cmNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJKHZvaWQpc3RybmNweShpZnIuaWZyX25hbWUsIHAtPm9wdC5kZXZpY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKIAlpZiAoaW9jdGwoZmQsIFNJT0NHSUZNVFUsIChjaGFyICopJmlmcikgPCAwKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NHSUZNVFU6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTSU9DR0lGTVRVOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWdvdG8gYmFkOwogCX0KQEAgLTM1OSwyMSArMzY2LDIxIEBACiAJaWYgKHNub29wbGVuIDwgMCkKIAkJc25vb3BsZW4gPSAwOwogCWlmIChpb2N0bChmZCwgU0lPQ1NOT09QTEVOLCAmc25vb3BsZW4pIDwgMCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTSU9DU05PT1BMRU46ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTSU9DU05PT1BMRU46ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBiYWQ7CiAJfQogCXYgPSAxOwogCWlmIChpb2N0bChmZCwgU0lPQ1NOT09QSU5HLCAmdikgPCAwKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NTTk9PUElORzogJXMiLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NTTk9PUElORzogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGJhZDsKIAl9CiAKIAlwLT5idWZzaXplID0gNDA5NjsJCQkJLyogWFhYICovCi0JcC0+YnVmZmVyID0gKHVfY2hhciAqKW1hbGxvYyhwLT5idWZzaXplKTsKKwlwLT5idWZmZXIgPSBtYWxsb2MocC0+YnVmc2l6ZSk7CiAJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAogCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGJhZDsKIAl9CkBAIC0zOTksMTEgKzQwNiwxMSBAQAogfQogCiBwY2FwX3QgKgotcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3BjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UgX1VfLCBjaGFyICplYnVmKQogewogCXBjYXBfdCAqcDsKIAotCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3Nub29wKSk7CisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3Nub29wKSk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIChOVUxMKTsKIApAQCAtNDExLDggKzQxOCwxOCBAQAogCXJldHVybiAocCk7CiB9CiAKKy8qCisgKiBYWFggLSB0aGVyZSdzIHByb2JhYmx5IGEgcGFydGljdWxhciBiaW5kIGVycm9yIHRoYXQgbWVhbnMgInRoYXQgZGV2aWNlCisgKiBkb2Vzbid0IHN1cHBvcnQgc25vb3AiOyBpZiBzbywgd2Ugc2hvdWxkIHRyeSBhIGJpbmQgYW5kIHVzZSB0aGF0LgorICovCitzdGF0aWMgaW50CitjYW5fYmVfYm91bmQoY29uc3QgY2hhciAqbmFtZSBfVV8pCit7CisJcmV0dXJuICgxKTsKK30KKwogaW50CiBwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCiB7Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gKHBjYXBfZmluZGFsbGRldnNfaW50ZXJmYWNlcyhhbGxkZXZzcCwgZXJyYnVmLCBjYW5fYmVfYm91bmQpKTsKIH0KZGlmZiAtLWdpdCBhL3BjYXAtc3RkaW5jLmggYi9wY2FwLXN0ZGluYy5oCmluZGV4IGY3MGRjY2UuLmExYmU2ODAgMTAwNjQ0Ci0tLSBhL3BjYXAtc3RkaW5jLmgKKysrIGIvcGNhcC1zdGRpbmMuaApAQCAtMjgsNiArMjgsMzUgQEAKICAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCiAjaWZuZGVmIHBjYXBfc3RkaW5jX2gKICNkZWZpbmUgcGNhcF9zdGRpbmNfaAogCkBAIC00NSwzOSArNzQsNTMgQEAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8aW8uaD4KIAotI2luY2x1ZGUgImJpdHR5cGVzLmgiCi0jaW5jbHVkZSAiSVA2X21pc2MuaCIKLQotI2RlZmluZSBjYWRkcl90IGNoYXIqCisjaW5jbHVkZSA8d3MydGNwaXAuaD4KIAogI2lmIGRlZmluZWQoX01TQ19WRVIpCi0gICNkZWZpbmUgc25wcmludGYgIF9zbnByaW50ZgotICAjZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCi0gICNkZWZpbmUgc3RyZHVwICAgIF9zdHJkdXAKLSNlbmRpZgorICAvKgorICAgKiBNU1ZDLgorICAgKi8KKyAgI2lmIF9NU0NfVkVSID49IDE4MDAKKyAgICAvKgorICAgICAqIFZTIDIwMTMgb3IgbmV3ZXI7IHdlIGhhdmUgPGludHR5cGVzLmg+LgorICAgICAqLworICAgICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCi0jZGVmaW5lIGlubGluZSBfX2lubGluZQorICAgICNkZWZpbmUgdV9pbnQ4X3QgdWludDhfdAorICAgICNkZWZpbmUgdV9pbnQxNl90IHVpbnQxNl90CisgICAgI2RlZmluZSB1X2ludDMyX3QgdWludDMyX3QKKyAgICAjZGVmaW5lIHVfaW50NjRfdCB1aW50NjRfdAorICAjZWxzZQorICAgIC8qCisgICAgICogRWFybGllciBWUzsgd2UgaGF2ZSB0byBkZWZpbmUgdGhpcyBzdHVmZiBvdXJzZWx2ZXMuCisgICAgICovCisgICAgI2lmbmRlZiBIQVZFX1VfSU5UOF9UCisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdV9pbnQ4X3Q7CisgICAgICB0eXBlZGVmIHNpZ25lZCBjaGFyIGludDhfdDsKKyAgICAjZW5kaWYKIAotI2lmZGVmIF9fTUlOR1czMl9fCisgICAgI2lmbmRlZiBIQVZFX1VfSU5UMTZfVAorICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X2ludDE2X3Q7CisgICAgICB0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQxNl90OworICAgICNlbmRpZgorCisgICAgI2lmbmRlZiBIQVZFX1VfSU5UMzJfVAorICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQzMl90OworICAgICAgdHlwZWRlZiBzaWduZWQgaW50IGludDMyX3Q7CisgICAgI2VuZGlmCisKKyAgICAjaWZuZGVmIEhBVkVfVV9JTlQ2NF9UCisgICAgICAjaWZkZWYgX01TQ19FWFRFTlNJT05TCisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgX2ludDY0IHVfaW50NjRfdDsKKyAgICAgICAgdHlwZWRlZiBfaW50NjQgaW50NjRfdDsKKyAgICAgICNlbHNlIC8qIF9NU0NfRVhURU5TSU9OUyAqLworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1X2ludDY0X3Q7CisgICAgICAgIHR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7CisgICAgICAjZW5kaWYKKyAgICAjZW5kaWYKKyAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQogICAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZWxzZQotICAjaWZuZGVmIF9VSU5UUFRSX1RfREVGSU5FRAotICAgICNpZmRlZiAgX1dJTjY0Ci0gICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgdWludHB0cl90OwotICAgICNlbHNlCi0gICAgICB0eXBlZGVmIF9XNjQgdW5zaWduZWQgaW50ICAgdWludHB0cl90OwotICAgICNlbmRpZgotICAgICNkZWZpbmUgX1VJTlRQVFJfVF9ERUZJTkVECi0gICNlbmRpZgotCi0gICNpZm5kZWYgX0lOVFBUUl9UX0RFRklORUQKLSAgICAjaWZkZWYgIF9XSU42NAotICAgICAgdHlwZWRlZiBfX2ludDY0ICAgIGludHB0cl90OwotICAgICNlbHNlCi0gICAgICB0eXBlZGVmIF9XNjQgaW50ICAgaW50cHRyX3Q7Ci0gICAgI2VuZGlmCi0gICAgI2RlZmluZSBfSU5UUFRSX1RfREVGSU5FRAotICAjZW5kaWYKLSNlbmRpZiAvKl9fTUlOR1czMl9fKi8KKyNlbmRpZgogCiAjZW5kaWYgLyogcGNhcF9zdGRpbmNfaCAqLwpkaWZmIC0tZ2l0IGEvcGNhcC10Yy5jIGIvcGNhcC10Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OGRiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLXRjLmMKQEAgLTAsMCArMSwxMjg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IENBQ0UgVGVjaG5vbG9naWVzLCBEYXZpcyAoQ2FsaWZvcm5pYSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBDQUNFIFRlY2hub2xvZ2llcyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHBjYXAtaW50Lmg+CisKKyNpbmNsdWRlICJwY2FwLXRjLmgiCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGNoYXIuaD4KKyNlbmRpZgorCit0eXBlZGVmIFRDX1NUQVRVUwkoVENfQ0FMTENPTlYgKlRjRmNuUXVlcnlQb3J0TGlzdCkJCQkoUFRDX1BPUlQgKnBwUG9ydHMsIFBVTE9ORyBwTGVuZ3RoKTsKK3R5cGVkZWYgVENfU1RBVFVTCShUQ19DQUxMQ09OViAqVGNGY25GcmVlUG9ydExpc3QpCQkJKFRDX1BPUlQgKnBQb3J0cyk7CisKK3R5cGVkZWYgUENIQVIJCShUQ19DQUxMQ09OViAqVGNGY25TdGF0dXNHZXRTdHJpbmcpCQkJKFRDX1NUQVRVUyBzdGF0dXMpOworCit0eXBlZGVmIFBDSEFSCQkoVENfQ0FMTENPTlYgKlRjRmNuUG9ydEdldE5hbWUpCQkJCShUQ19QT1JUIHBvcnQpOwordHlwZWRlZiBQQ0hBUgkJKFRDX0NBTExDT05WICpUY0ZjblBvcnRHZXREZXNjcmlwdGlvbikJCShUQ19QT1JUIHBvcnQpOworCit0eXBlZGVmIFRDX1NUQVRVUwkoVENfQ0FMTENPTlYgKlRjRmNuSW5zdGFuY2VPcGVuQnlOYW1lKQkJKFBDSEFSIG5hbWUsIFBUQ19JTlNUQU5DRSBwSW5zdGFuY2UpOwordHlwZWRlZiBUQ19TVEFUVVMJKFRDX0NBTExDT05WICpUY0Zjbkluc3RhbmNlQ2xvc2UpCQkJKFRDX0lOU1RBTkNFIGluc3RhbmNlKTsKK3R5cGVkZWYgVENfU1RBVFVTCShUQ19DQUxMQ09OViAqVGNGY25JbnN0YW5jZVNldEZlYXR1cmUpCQkoVENfSU5TVEFOQ0UgaW5zdGFuY2UsIFVMT05HIGZlYXR1cmUsIFVMT05HIHZhbHVlKTsKK3R5cGVkZWYgVENfU1RBVFVTCShUQ19DQUxMQ09OViAqVGNGY25JbnN0YW5jZVF1ZXJ5RmVhdHVyZSkJKFRDX0lOU1RBTkNFIGluc3RhbmNlLCBVTE9ORyBmZWF0dXJlLCBQVUxPTkcgcFZhbHVlKTsKK3R5cGVkZWYgVENfU1RBVFVTCShUQ19DQUxMQ09OViAqVGNGY25JbnN0YW5jZVJlY2VpdmVQYWNrZXRzKQkoVENfSU5TVEFOQ0UgaW5zdGFuY2UsIFBUQ19QQUNLRVRTX0JVRkZFUiBwQnVmZmVyKTsKK3R5cGVkZWYgSEFORExFCQkoVENfQ0FMTENPTlYgKlRjRmNuSW5zdGFuY2VHZXRSZWNlaXZlV2FpdEhhbmRsZSkgKFRDX0lOU1RBTkNFIGluc3RhbmNlKTsKK3R5cGVkZWYgVENfU1RBVFVTCShUQ19DQUxMQ09OViAqVGNGY25JbnN0YW5jZVRyYW5zbWl0UGFja2V0cykJKFRDX0lOU1RBTkNFIGluc3RhbmNlLCBUQ19QQUNLRVRTX0JVRkZFUiBwQnVmZmVyKTsKK3R5cGVkZWYgVENfU1RBVFVTCShUQ19DQUxMQ09OViAqVGNGY25JbnN0YW5jZVF1ZXJ5U3RhdGlzdGljcykJKFRDX0lOU1RBTkNFIGluc3RhbmNlLCBQVENfU1RBVElTVElDUyBwU3RhdGlzdGljcyk7CisKK3R5cGVkZWYgVENfU1RBVFVTCShUQ19DQUxMQ09OViAqVGNGY25QYWNrZXRzQnVmZmVyQ3JlYXRlKQkJKFVMT05HIHNpemUsIFBUQ19QQUNLRVRTX0JVRkZFUiBwQnVmZmVyKTsKK3R5cGVkZWYgVk9JRAkJKFRDX0NBTExDT05WICpUY0ZjblBhY2tldHNCdWZmZXJEZXN0cm95KQkoVENfUEFDS0VUU19CVUZGRVIgYnVmZmVyKTsKK3R5cGVkZWYgVENfU1RBVFVTCShUQ19DQUxMQ09OViAqVGNGY25QYWNrZXRzQnVmZmVyUXVlcnlOZXh0UGFja2V0KShUQ19QQUNLRVRTX0JVRkZFUiBidWZmZXIsIFBUQ19QQUNLRVRfSEVBREVSIHBIZWFkZXIsIFBWT0lEICpwcERhdGEpOwordHlwZWRlZiBUQ19TVEFUVVMJKFRDX0NBTExDT05WICpUY0ZjblBhY2tldHNCdWZmZXJDb21taXROZXh0UGFja2V0KShUQ19QQUNLRVRTX0JVRkZFUiBidWZmZXIsIFBUQ19QQUNLRVRfSEVBREVSIHBIZWFkZXIsIFBWT0lEIHBEYXRhKTsKKwordHlwZWRlZiBWT0lECQkoVENfQ0FMTENPTlYgKlRjRmNuU3RhdGlzdGljc0Rlc3Ryb3kpCQkoVENfU1RBVElTVElDUyBzdGF0aXN0aWNzKTsKK3R5cGVkZWYgVENfU1RBVFVTCShUQ19DQUxMQ09OViAqVGNGY25TdGF0aXN0aWNzVXBkYXRlKQkJKFRDX1NUQVRJU1RJQ1Mgc3RhdGlzdGljcyk7Cit0eXBlZGVmIFRDX1NUQVRVUwkoVENfQ0FMTENPTlYgKlRjRmNuU3RhdGlzdGljc1F1ZXJ5VmFsdWUpCShUQ19TVEFUSVNUSUNTIHN0YXRpc3RpY3MsIFVMT05HIGNvdW50ZXJJZCwgUFVMT05HTE9ORyBwVmFsdWUpOworCit0eXBlZGVmIGVudW0gTE9ORworeworCVRDX0FQSV9VTkxPQURFRCA9IDAsCisJVENfQVBJX0xPQURFRCwKKwlUQ19BUElfQ0FOTk9UX0xPQUQsCisJVENfQVBJX0xPQURJTkcKK30KKwlUQ19BUElfTE9BRF9TVEFUVVM7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1RDX0ZVTkNUSU9OUworeworCVRDX0FQSV9MT0FEX1NUQVRVUwkJCUxvYWRTdGF0dXM7CisjaWZkZWYgX1dJTjMyCisJSE1PRFVMRQkJCQkJCWhUY0FwaURsbEhhbmRsZTsKKyNlbmRpZgorCVRjRmNuUXVlcnlQb3J0TGlzdAkJCVF1ZXJ5UG9ydExpc3Q7CisJVGNGY25GcmVlUG9ydExpc3QJCQlGcmVlUG9ydExpc3Q7CisJVGNGY25TdGF0dXNHZXRTdHJpbmcJCVN0YXR1c0dldFN0cmluZzsKKworCVRjRmNuUG9ydEdldE5hbWUJCQlQb3J0R2V0TmFtZTsKKwlUY0ZjblBvcnRHZXREZXNjcmlwdGlvbgkJUG9ydEdldERlc2NyaXB0aW9uOworCisJVGNGY25JbnN0YW5jZU9wZW5CeU5hbWUJCUluc3RhbmNlT3BlbkJ5TmFtZTsKKwlUY0Zjbkluc3RhbmNlQ2xvc2UJCQlJbnN0YW5jZUNsb3NlOworCVRjRmNuSW5zdGFuY2VTZXRGZWF0dXJlCQlJbnN0YW5jZVNldEZlYXR1cmU7CisJVGNGY25JbnN0YW5jZVF1ZXJ5RmVhdHVyZQlJbnN0YW5jZVF1ZXJ5RmVhdHVyZTsKKwlUY0Zjbkluc3RhbmNlUmVjZWl2ZVBhY2tldHMJSW5zdGFuY2VSZWNlaXZlUGFja2V0czsKKyNpZmRlZiBfV0lOMzIKKwlUY0Zjbkluc3RhbmNlR2V0UmVjZWl2ZVdhaXRIYW5kbGUgSW5zdGFuY2VHZXRSZWNlaXZlV2FpdEhhbmRsZTsKKyNlbmRpZgorCVRjRmNuSW5zdGFuY2VUcmFuc21pdFBhY2tldHMgSW5zdGFuY2VUcmFuc21pdFBhY2tldHM7CisJVGNGY25JbnN0YW5jZVF1ZXJ5U3RhdGlzdGljcyBJbnN0YW5jZVF1ZXJ5U3RhdGlzdGljczsKKworCVRjRmNuUGFja2V0c0J1ZmZlckNyZWF0ZQlQYWNrZXRzQnVmZmVyQ3JlYXRlOworCVRjRmNuUGFja2V0c0J1ZmZlckRlc3Ryb3kJUGFja2V0c0J1ZmZlckRlc3Ryb3k7CisJVGNGY25QYWNrZXRzQnVmZmVyUXVlcnlOZXh0UGFja2V0CVBhY2tldHNCdWZmZXJRdWVyeU5leHRQYWNrZXQ7CisJVGNGY25QYWNrZXRzQnVmZmVyQ29tbWl0TmV4dFBhY2tldCAgUGFja2V0c0J1ZmZlckNvbW1pdE5leHRQYWNrZXQ7CisKKwlUY0ZjblN0YXRpc3RpY3NEZXN0cm95CQlTdGF0aXN0aWNzRGVzdHJveTsKKwlUY0ZjblN0YXRpc3RpY3NVcGRhdGUJCVN0YXRpc3RpY3NVcGRhdGU7CisJVGNGY25TdGF0aXN0aWNzUXVlcnlWYWx1ZQlTdGF0aXN0aWNzUXVlcnlWYWx1ZTsKK30KKwlUQ19GVU5DVElPTlM7CisKK3N0YXRpYyBwY2FwX2lmX3QqIFRjQ3JlYXRlUGNhcElmRnJvbVBvcnQoVENfUE9SVCBwb3J0KTsKK3N0YXRpYyBpbnQgVGNTZXREYXRhbGluayhwY2FwX3QgKnAsIGludCBkbHQpOworc3RhdGljIGludCBUY0dldE5vbkJsb2NrKHBjYXBfdCAqcCwgY2hhciAqZXJyYnVmKTsKK3N0YXRpYyBpbnQgVGNTZXROb25CbG9jayhwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKTsKK3N0YXRpYyB2b2lkIFRjQ2xlYW51cChwY2FwX3QgKnApOworc3RhdGljIGludCBUY0luamVjdChwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpOworc3RhdGljIGludCBUY1JlYWQocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcik7CitzdGF0aWMgaW50IFRjU3RhdHMocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcyk7CitzdGF0aWMgaW50IFRjU2V0RmlsdGVyKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCk7CisjaWZkZWYgX1dJTjMyCitzdGF0aWMgc3RydWN0IHBjYXBfc3RhdCAqVGNTdGF0c0V4KHBjYXBfdCAqcCwgaW50ICpwY2FwX3N0YXRfc2l6ZSk7CitzdGF0aWMgaW50IFRjU2V0QnVmZihwY2FwX3QgKnAsIGludCBkaW0pOworc3RhdGljIGludCBUY1NldE1vZGUocGNhcF90ICpwLCBpbnQgbW9kZSk7CitzdGF0aWMgaW50IFRjU2V0TWluVG9Db3B5KHBjYXBfdCAqcCwgaW50IHNpemUpOworc3RhdGljIEhBTkRMRSBUY0dldFJlY2VpdmVXYWl0SGFuZGxlKHBjYXBfdCAqcCk7CitzdGF0aWMgaW50IFRjT2lkR2V0UmVxdWVzdChwY2FwX3QgKnAsIGJwZl91X2ludDMyIG9pZCwgdm9pZCAqZGF0YSwgc2l6ZV90ICpsZW5wKTsKK3N0YXRpYyBpbnQgVGNPaWRTZXRSZXF1ZXN0KHBjYXBfdCAqcCwgYnBmX3VfaW50MzIgb2lkLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgKmxlbnApOworc3RhdGljIHVfaW50IFRjU2VuZHF1ZXVlVHJhbnNtaXQocGNhcF90ICpwLCBwY2FwX3NlbmRfcXVldWUgKnF1ZXVlLCBpbnQgc3luYyk7CitzdGF0aWMgaW50IFRjU2V0VXNlckJ1ZmZlcihwY2FwX3QgKnAsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgVGNMaXZlRHVtcChwY2FwX3QgKnAsIGNoYXIgKmZpbGVuYW1lLCBpbnQgbWF4c2l6ZSwgaW50IG1heHBhY2tzKTsKK3N0YXRpYyBpbnQgVGNMaXZlRHVtcEVuZGVkKHBjYXBfdCAqcCwgaW50IHN5bmMpOworc3RhdGljIFBBaXJwY2FwSGFuZGxlIFRjR2V0QWlyUGNhcEhhbmRsZShwY2FwX3QgKnApOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKK1RDX0ZVTkNUSU9OUyBnX1RjRnVuY3Rpb25zID0KK3sKKwlUQ19BUElfVU5MT0FERUQsIC8qIExvYWRTdGF0dXMgKi8KKwlOVUxMLCAgLyogaFRjQXBpRGxsSGFuZGxlICovCisJTlVMTCwgIC8qIFF1ZXJ5UG9ydExpc3QgKi8KKwlOVUxMLCAgLyogRnJlZVBvcnRMaXN0ICovCisJTlVMTCwgIC8qIFN0YXR1c0dldFN0cmluZyAqLworCU5VTEwsICAvKiBQb3J0R2V0TmFtZSAqLworCU5VTEwsICAvKiBQb3J0R2V0RGVzY3JpcHRpb24gKi8KKwlOVUxMLCAgLyogSW5zdGFuY2VPcGVuQnlOYW1lICovCisJTlVMTCwgIC8qIEluc3RhbmNlQ2xvc2UgKi8KKwlOVUxMLCAgLyogSW5zdGFuY2VTZXRGZWF0dXJlICovCisJTlVMTCwgIC8qIEluc3RhbmNlUXVlcnlGZWF0dXJlICovCisJTlVMTCwgIC8qIEluc3RhbmNlUmVjZWl2ZVBhY2tldHMgKi8KKwlOVUxMLCAgLyogSW5zdGFuY2VHZXRSZWNlaXZlV2FpdEhhbmRsZSAqLworCU5VTEwsICAvKiBJbnN0YW5jZVRyYW5zbWl0UGFja2V0cyAqLworCU5VTEwsICAvKiBJbnN0YW5jZVF1ZXJ5U3RhdGlzdGljcyAqLworCU5VTEwsICAvKiBQYWNrZXRzQnVmZmVyQ3JlYXRlICovCisJTlVMTCwgIC8qIFBhY2tldHNCdWZmZXJEZXN0cm95ICovCisJTlVMTCwgIC8qIFBhY2tldHNCdWZmZXJRdWVyeU5leHRQYWNrZXQgKi8KKwlOVUxMLCAgLyogUGFja2V0c0J1ZmZlckNvbW1pdE5leHRQYWNrZXQgKi8KKwlOVUxMLCAgLyogU3RhdGlzdGljc0Rlc3Ryb3kgKi8KKwlOVUxMLCAgLyogU3RhdGlzdGljc1VwZGF0ZSAqLworCU5VTEwgIC8qIFN0YXRpc3RpY3NRdWVyeVZhbHVlICovCit9OworI2Vsc2UKK1RDX0ZVTkNUSU9OUyBnX1RjRnVuY3Rpb25zID0KK3sKKwlUQ19BUElfTE9BREVELCAvKiBMb2FkU3RhdHVzICovCisJVGNRdWVyeVBvcnRMaXN0LAorCVRjRnJlZVBvcnRMaXN0LAorCVRjU3RhdHVzR2V0U3RyaW5nLAorCVRjUG9ydEdldE5hbWUsCisJVGNQb3J0R2V0RGVzY3JpcHRpb24sCisJVGNJbnN0YW5jZU9wZW5CeU5hbWUsCisJVGNJbnN0YW5jZUNsb3NlLAorCVRjSW5zdGFuY2VTZXRGZWF0dXJlLAorCVRjSW5zdGFuY2VRdWVyeUZlYXR1cmUsCisJVGNJbnN0YW5jZVJlY2VpdmVQYWNrZXRzLAorI2lmZGVmIF9XSU4zMgorCVRjSW5zdGFuY2VHZXRSZWNlaXZlV2FpdEhhbmRsZSwKKyNlbmRpZgorCVRjSW5zdGFuY2VUcmFuc21pdFBhY2tldHMsCisJVGNJbnN0YW5jZVF1ZXJ5U3RhdGlzdGljcywKKwlUY1BhY2tldHNCdWZmZXJDcmVhdGUsCisJVGNQYWNrZXRzQnVmZmVyRGVzdHJveSwKKwlUY1BhY2tldHNCdWZmZXJRdWVyeU5leHRQYWNrZXQsCisJVGNQYWNrZXRzQnVmZmVyQ29tbWl0TmV4dFBhY2tldCwKKwlUY1N0YXRpc3RpY3NEZXN0cm95LAorCVRjU3RhdGlzdGljc1VwZGF0ZSwKKwlUY1N0YXRpc3RpY3NRdWVyeVZhbHVlLAorfTsKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9UQ19QQUNLRVRfU0laRQk5NTAwCisKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorCisjZGVmaW5lIFBQSF9QSF9GTEFHX1BBRERJTkcJKChVQ0hBUikweDAxKQorI2RlZmluZSBQUEhfUEhfVkVSU0lPTgkJKChVQ0hBUikweDAwKQorCit0eXBlZGVmIHN0cnVjdCBfUFBJX1BBQ0tFVF9IRUFERVIKK3sKKwlVQ0hBUglQcGhWZXJzaW9uOworCVVDSEFSCVBwaEZsYWdzOworCVVTSE9SVAlQcGhMZW5ndGg7CisJVUxPTkcJUHBoRGx0OworfQorCVBQSV9QQUNLRVRfSEVBREVSLCAqUFBQSV9QQUNLRVRfSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCBfUFBJX0ZJRUxEX0hFQURFUgoreworCVVTSE9SVCBQZmhUeXBlOworCVVTSE9SVCBQZmhMZW5ndGg7Cit9CisJUFBJX0ZJRUxEX0hFQURFUiwgKlBQUElfRklFTERfSEVBREVSOworCisKKyNkZWZpbmUJCVBQSV9GSUVMRF9UWVBFX0FHR1JFR0FUSU9OX0VYVEVOU0lPTgkoKFVDSEFSKTB4MDgpCisKK3R5cGVkZWYgc3RydWN0IF9QUElfRklFTERfQUdHUkVHQVRJT05fRVhURU5TSU9OCit7CisJVUxPTkcJCUludGVyZmFjZUlkOworfQorCVBQSV9GSUVMRF9BR0dSRUdBVElPTl9FWFRFTlNJT04sICpQUFBJX0ZJRUxEX0FHR1JFR0FUSU9OX0VYVEVOU0lPTjsKKworCisjZGVmaW5lCQlQUElfRklFTERfVFlQRV84MDJfM19FWFRFTlNJT04JCQkoKFVDSEFSKTB4MDkpCisKKyNkZWZpbmUgUFBJX0ZMRF84MDJfM19FWFRfRkxBR19GQ1NfUFJFU0VOVAkJCSgoVUxPTkcpMHgwMDAwMDAwMSkKKwordHlwZWRlZiBzdHJ1Y3QgX1BQSV9GSUVMRF84MDJfM19FWFRFTlNJT04KK3sKKwlVTE9ORwkJRmxhZ3M7CisJVUxPTkcJCUVycm9yczsKK30KKwlQUElfRklFTERfODAyXzNfRVhURU5TSU9OLCAqUFBQSV9GSUVMRF84MDJfM19FWFRFTlNJT047CisKK3R5cGVkZWYgc3RydWN0IF9QUElfSEVBREVSCit7CisJUFBJX1BBQ0tFVF9IRUFERVIgUGFja2V0SGVhZGVyOworCVBQSV9GSUVMRF9IRUFERVIgIEFnZ3JlZ2F0aW9uRmllbGRIZWFkZXI7CisJUFBJX0ZJRUxEX0FHR1JFR0FUSU9OX0VYVEVOU0lPTiBBZ2dyZWdhdGlvbkZpZWxkOworCVBQSV9GSUVMRF9IRUFERVIgIERvdDNGaWVsZEhlYWRlcjsKKwlQUElfRklFTERfODAyXzNfRVhURU5TSU9OIERvdDNGaWVsZDsKK30KKwlQUElfSEVBREVSLCAqUFBQSV9IRUFERVI7CisjcHJhZ21hIHBhY2socG9wKQorCisjaWZkZWYgX1dJTjMyCisvLworLy8gVGhpcyB3cmFwcGVyIGFyb3VuZCBsb2FkbGlicmFyeSBhcHBlbmRzIHRoZSBzeXN0ZW0gZm9sZGVyICh1c3VhbGx5IGM6XHdpbmRvd3Ncc3lzdGVtMzIpCisvLyB0byB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgRExMLCBzbyB0aGF0IHRoZSBETEwgaXMgYWx3YXlzIGxvYWRlZCBmcm9tIGFuIGFic29sdXRlIHBhdGgKKy8vIChJdCdzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBsb2FkIGFpcnBjYXAuZGxsIGZyb20gdGhlIGFwcGxpY2F0aW9uIGZvbGRlcikuCisvLyBUaGlzIHNvbHZlcyB0aGUgRExMIEhpamFja2luZyBpc3N1ZSBkaXNjb3ZlcmVkIGluIEF1Z3VzdCAyMDEwCisvLyBodHRwOi8vYmxvZy5tZXRhc3Bsb2l0LmNvbS8yMDEwLzA4L2V4cGxvaXRpbmctZGxsLWhpamFja2luZy1mbGF3cy5odG1sCisvLworSE1PRFVMRSBMb2FkTGlicmFyeVNhZmUoTFBDVFNUUiBscEZpbGVOYW1lKQoreworICBUQ0hBUiBwYXRoW01BWF9QQVRIXTsKKyAgVENIQVIgZnVsbEZpbGVOYW1lW01BWF9QQVRIXTsKKyAgVUlOVCByZXM7CisgIEhNT0RVTEUgaE1vZHVsZSA9IE5VTEw7CisgIGRvCisgIHsKKwlyZXMgPSBHZXRTeXN0ZW1EaXJlY3RvcnkocGF0aCwgTUFYX1BBVEgpOworCisJaWYgKHJlcyA9PSAwKQorCXsKKwkJLy8KKwkJLy8gc29tZSBiYWQgZmFpbHVyZSBvY2N1cnJlZDsKKwkJLy8KKwkJYnJlYWs7CisJfQorCisJaWYgKHJlcyA+IE1BWF9QQVRIKQorCXsKKwkJLy8KKwkJLy8gdGhlIGJ1ZmZlciB3YXMgbm90IGJpZyBlbm91Z2gKKwkJLy8KKwkJU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOworCQlicmVhazsKKwl9CisKKwlpZiAocmVzICsgMSArIF90Y3NsZW4obHBGaWxlTmFtZSkgKyAxIDwgTUFYX1BBVEgpCisJeworCQltZW1jcHkoZnVsbEZpbGVOYW1lLCBwYXRoLCByZXMgKiBzaXplb2YoVENIQVIpKTsKKwkJZnVsbEZpbGVOYW1lW3Jlc10gPSBfVCgnXFwnKTsKKwkJbWVtY3B5KCZmdWxsRmlsZU5hbWVbcmVzICsgMV0sIGxwRmlsZU5hbWUsIChfdGNzbGVuKGxwRmlsZU5hbWUpICsgMSkgKiBzaXplb2YoVENIQVIpKTsKKworCQloTW9kdWxlID0gTG9hZExpYnJhcnkoZnVsbEZpbGVOYW1lKTsKKwl9CisJZWxzZQorCXsKKwkJU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOworCX0KKworICB9d2hpbGUoRkFMU0UpOworCisgIHJldHVybiBoTW9kdWxlOworfQorCisvKgorICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBwY2FwIGZ1bmN0aW9ucyB0aGF0IGNhbiB0aGVvcmV0aWNhbGx5CisgKiAgICAgICBkZWFsIHdpdGggdGhlIFRjIGxpYnJhcnkgZm9yIHRoZSBmaXJzdCB0aW1lLCBuYW1lbHkgbGlzdGluZyB0aGUgYWRhcHRlcnMgYW5kCisgKiAgICAgICBvcGVuaW5nIG9uZS4gQWxsIHRoZSBvdGhlciBvbmVzIChjbG9zZSwgcmVhZCwgd3JpdGUsIHNldCBwYXJhbWV0ZXJzKSB3b3JrCisgKiAgICAgICBvbiBhbiBvcGVuIGluc3RhbmNlIG9mIFRDLCBzbyB3ZSBkbyBub3QgY2FyZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24KKyAqLworVENfQVBJX0xPQURfU1RBVFVTIExvYWRUY0Z1bmN0aW9ucyh2b2lkKQoreworCVRDX0FQSV9MT0FEX1NUQVRVUyBjdXJyZW50U3RhdHVzOworCisJZG8KKwl7CisJCWN1cnJlbnRTdGF0dXMgPSBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgoTE9ORyopJmdfVGNGdW5jdGlvbnMuTG9hZFN0YXR1cywgVENfQVBJX0xPQURJTkcsIFRDX0FQSV9VTkxPQURFRCk7CisKKwkJd2hpbGUoY3VycmVudFN0YXR1cyA9PSBUQ19BUElfTE9BRElORykKKwkJeworCQkJY3VycmVudFN0YXR1cyA9IEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKChMT05HKikmZ19UY0Z1bmN0aW9ucy5Mb2FkU3RhdHVzLCBUQ19BUElfTE9BRElORywgVENfQVBJX0xPQURJTkcpOworCQkJU2xlZXAoMTApOworCQl9CisKKwkJLyoKKwkJICogYXQgdGhpcyBwb2ludCB3ZSBhcmUgZWl0aGVyIGluIHRoZSBMT0FERUQgc3RhdGUsIHVubG9hZGVkIHN0YXRlIChpLmUuIHdlIGFyZSB0aGUgb25lcyBsb2FkaW5nIGV2ZXJ5dGhpbmcpCisJCSAqIG9yIGluIGNhbm5vdCBsb2FkCisJCSAqLworCQlpZihjdXJyZW50U3RhdHVzICA9PSBUQ19BUElfTE9BREVEKQorCQl7CisJCQlyZXR1cm4gVENfQVBJX0xPQURFRDsKKwkJfQorCisJCWlmIChjdXJyZW50U3RhdHVzID09IFRDX0FQSV9DQU5OT1RfTE9BRCkKKwkJeworCQkJcmV0dXJuIFRDX0FQSV9DQU5OT1RfTE9BRDsKKwkJfQorCisJCWN1cnJlbnRTdGF0dXMgPSBUQ19BUElfQ0FOTk9UX0xPQUQ7CisKKwkJZ19UY0Z1bmN0aW9ucy5oVGNBcGlEbGxIYW5kbGUgPSBMb2FkTGlicmFyeVNhZmUoIlRjQXBpLmRsbCIpOworCQlpZiAoZ19UY0Z1bmN0aW9ucy5oVGNBcGlEbGxIYW5kbGUgPT0gTlVMTCkJYnJlYWs7CisKKwkJZ19UY0Z1bmN0aW9ucy5RdWVyeVBvcnRMaXN0CQkJCQk9IChUY0ZjblF1ZXJ5UG9ydExpc3QpCQkJR2V0UHJvY0FkZHJlc3MoZ19UY0Z1bmN0aW9ucy5oVGNBcGlEbGxIYW5kbGUsICJUY1F1ZXJ5UG9ydExpc3QiKTsKKwkJZ19UY0Z1bmN0aW9ucy5GcmVlUG9ydExpc3QJCQkJCT0gKFRjRmNuRnJlZVBvcnRMaXN0KQkJCUdldFByb2NBZGRyZXNzKGdfVGNGdW5jdGlvbnMuaFRjQXBpRGxsSGFuZGxlLCAiVGNGcmVlUG9ydExpc3QiKTsKKworCQlnX1RjRnVuY3Rpb25zLlN0YXR1c0dldFN0cmluZwkJCQk9IChUY0ZjblN0YXR1c0dldFN0cmluZykJCUdldFByb2NBZGRyZXNzKGdfVGNGdW5jdGlvbnMuaFRjQXBpRGxsSGFuZGxlLCAiVGNTdGF0dXNHZXRTdHJpbmciKTsKKworCQlnX1RjRnVuY3Rpb25zLlBvcnRHZXROYW1lCQkJCQk9IChUY0ZjblBvcnRHZXROYW1lKQkJCUdldFByb2NBZGRyZXNzKGdfVGNGdW5jdGlvbnMuaFRjQXBpRGxsSGFuZGxlLCAiVGNQb3J0R2V0TmFtZSIpOworCQlnX1RjRnVuY3Rpb25zLlBvcnRHZXREZXNjcmlwdGlvbgkJCT0gKFRjRmNuUG9ydEdldERlc2NyaXB0aW9uKQkJR2V0UHJvY0FkZHJlc3MoZ19UY0Z1bmN0aW9ucy5oVGNBcGlEbGxIYW5kbGUsICJUY1BvcnRHZXREZXNjcmlwdGlvbiIpOworCisJCWdfVGNGdW5jdGlvbnMuSW5zdGFuY2VPcGVuQnlOYW1lCQkJPSAoVGNGY25JbnN0YW5jZU9wZW5CeU5hbWUpCQlHZXRQcm9jQWRkcmVzcyhnX1RjRnVuY3Rpb25zLmhUY0FwaURsbEhhbmRsZSwgIlRjSW5zdGFuY2VPcGVuQnlOYW1lIik7CisJCWdfVGNGdW5jdGlvbnMuSW5zdGFuY2VDbG9zZQkJCQkJPSAoVGNGY25JbnN0YW5jZUNsb3NlKQkJCUdldFByb2NBZGRyZXNzKGdfVGNGdW5jdGlvbnMuaFRjQXBpRGxsSGFuZGxlLCAiVGNJbnN0YW5jZUNsb3NlIik7CisJCWdfVGNGdW5jdGlvbnMuSW5zdGFuY2VTZXRGZWF0dXJlCQkJPSAoVGNGY25JbnN0YW5jZVNldEZlYXR1cmUpCQlHZXRQcm9jQWRkcmVzcyhnX1RjRnVuY3Rpb25zLmhUY0FwaURsbEhhbmRsZSwgIlRjSW5zdGFuY2VTZXRGZWF0dXJlIik7CisJCWdfVGNGdW5jdGlvbnMuSW5zdGFuY2VRdWVyeUZlYXR1cmUJCQk9IChUY0Zjbkluc3RhbmNlUXVlcnlGZWF0dXJlKQlHZXRQcm9jQWRkcmVzcyhnX1RjRnVuY3Rpb25zLmhUY0FwaURsbEhhbmRsZSwgIlRjSW5zdGFuY2VRdWVyeUZlYXR1cmUiKTsKKwkJZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZVJlY2VpdmVQYWNrZXRzCQk9IChUY0Zjbkluc3RhbmNlUmVjZWl2ZVBhY2tldHMpCUdldFByb2NBZGRyZXNzKGdfVGNGdW5jdGlvbnMuaFRjQXBpRGxsSGFuZGxlLCAiVGNJbnN0YW5jZVJlY2VpdmVQYWNrZXRzIik7CisJCWdfVGNGdW5jdGlvbnMuSW5zdGFuY2VHZXRSZWNlaXZlV2FpdEhhbmRsZQk9IChUY0Zjbkluc3RhbmNlR2V0UmVjZWl2ZVdhaXRIYW5kbGUpR2V0UHJvY0FkZHJlc3MoZ19UY0Z1bmN0aW9ucy5oVGNBcGlEbGxIYW5kbGUsICJUY0luc3RhbmNlR2V0UmVjZWl2ZVdhaXRIYW5kbGUiKTsKKwkJZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZVRyYW5zbWl0UGFja2V0cwkJPSAoVGNGY25JbnN0YW5jZVRyYW5zbWl0UGFja2V0cylHZXRQcm9jQWRkcmVzcyhnX1RjRnVuY3Rpb25zLmhUY0FwaURsbEhhbmRsZSwgIlRjSW5zdGFuY2VUcmFuc21pdFBhY2tldHMiKTsKKwkJZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZVF1ZXJ5U3RhdGlzdGljcwkJPSAoVGNGY25JbnN0YW5jZVF1ZXJ5U3RhdGlzdGljcylHZXRQcm9jQWRkcmVzcyhnX1RjRnVuY3Rpb25zLmhUY0FwaURsbEhhbmRsZSwgIlRjSW5zdGFuY2VRdWVyeVN0YXRpc3RpY3MiKTsKKworCQlnX1RjRnVuY3Rpb25zLlBhY2tldHNCdWZmZXJDcmVhdGUJCQk9IChUY0ZjblBhY2tldHNCdWZmZXJDcmVhdGUpCUdldFByb2NBZGRyZXNzKGdfVGNGdW5jdGlvbnMuaFRjQXBpRGxsSGFuZGxlLCAiVGNQYWNrZXRzQnVmZmVyQ3JlYXRlIik7CisJCWdfVGNGdW5jdGlvbnMuUGFja2V0c0J1ZmZlckRlc3Ryb3kJCQk9IChUY0ZjblBhY2tldHNCdWZmZXJEZXN0cm95KQlHZXRQcm9jQWRkcmVzcyhnX1RjRnVuY3Rpb25zLmhUY0FwaURsbEhhbmRsZSwgIlRjUGFja2V0c0J1ZmZlckRlc3Ryb3kiKTsKKwkJZ19UY0Z1bmN0aW9ucy5QYWNrZXRzQnVmZmVyUXVlcnlOZXh0UGFja2V0CT0gKFRjRmNuUGFja2V0c0J1ZmZlclF1ZXJ5TmV4dFBhY2tldClHZXRQcm9jQWRkcmVzcyhnX1RjRnVuY3Rpb25zLmhUY0FwaURsbEhhbmRsZSwgIlRjUGFja2V0c0J1ZmZlclF1ZXJ5TmV4dFBhY2tldCIpOworCQlnX1RjRnVuY3Rpb25zLlBhY2tldHNCdWZmZXJDb21taXROZXh0UGFja2V0CT0gKFRjRmNuUGFja2V0c0J1ZmZlckNvbW1pdE5leHRQYWNrZXQpR2V0UHJvY0FkZHJlc3MoZ19UY0Z1bmN0aW9ucy5oVGNBcGlEbGxIYW5kbGUsICJUY1BhY2tldHNCdWZmZXJDb21taXROZXh0UGFja2V0Iik7CisKKwkJZ19UY0Z1bmN0aW9ucy5TdGF0aXN0aWNzRGVzdHJveQkJCQk9IChUY0ZjblN0YXRpc3RpY3NEZXN0cm95KQkJR2V0UHJvY0FkZHJlc3MoZ19UY0Z1bmN0aW9ucy5oVGNBcGlEbGxIYW5kbGUsICJUY1N0YXRpc3RpY3NEZXN0cm95Iik7CisJCWdfVGNGdW5jdGlvbnMuU3RhdGlzdGljc1VwZGF0ZQkJCQk9IChUY0ZjblN0YXRpc3RpY3NVcGRhdGUpCQlHZXRQcm9jQWRkcmVzcyhnX1RjRnVuY3Rpb25zLmhUY0FwaURsbEhhbmRsZSwgIlRjU3RhdGlzdGljc1VwZGF0ZSIpOworCQlnX1RjRnVuY3Rpb25zLlN0YXRpc3RpY3NRdWVyeVZhbHVlCQkJPSAoVGNGY25TdGF0aXN0aWNzUXVlcnlWYWx1ZSkJR2V0UHJvY0FkZHJlc3MoZ19UY0Z1bmN0aW9ucy5oVGNBcGlEbGxIYW5kbGUsICJUY1N0YXRpc3RpY3NRdWVyeVZhbHVlIik7CisKKwkJaWYgKCAgIGdfVGNGdW5jdGlvbnMuUXVlcnlQb3J0TGlzdCA9PSBOVUxMCisJCQl8fCBnX1RjRnVuY3Rpb25zLkZyZWVQb3J0TGlzdCA9PSBOVUxMCisJCQl8fCBnX1RjRnVuY3Rpb25zLlN0YXR1c0dldFN0cmluZyA9PSBOVUxMCisJCQl8fCBnX1RjRnVuY3Rpb25zLlBvcnRHZXROYW1lID09IE5VTEwKKwkJCXx8IGdfVGNGdW5jdGlvbnMuUG9ydEdldERlc2NyaXB0aW9uID09IE5VTEwKKwkJCXx8IGdfVGNGdW5jdGlvbnMuSW5zdGFuY2VPcGVuQnlOYW1lID09IE5VTEwKKwkJCXx8IGdfVGNGdW5jdGlvbnMuSW5zdGFuY2VDbG9zZSA9PSBOVUxMCisJCQl8fCBnX1RjRnVuY3Rpb25zLkluc3RhbmNlU2V0RmVhdHVyZQkgPT0gTlVMTAorCQkJfHwgZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZVF1ZXJ5RmVhdHVyZSA9PSBOVUxMCisJCQl8fCBnX1RjRnVuY3Rpb25zLkluc3RhbmNlUmVjZWl2ZVBhY2tldHMgPT0gTlVMTAorCQkJfHwgZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZUdldFJlY2VpdmVXYWl0SGFuZGxlID09IE5VTEwKKwkJCXx8IGdfVGNGdW5jdGlvbnMuSW5zdGFuY2VUcmFuc21pdFBhY2tldHMgPT0gTlVMTAorCQkJfHwgZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZVF1ZXJ5U3RhdGlzdGljcyA9PSBOVUxMCisJCQl8fCBnX1RjRnVuY3Rpb25zLlBhY2tldHNCdWZmZXJDcmVhdGUgPT0gTlVMTAorCQkJfHwgZ19UY0Z1bmN0aW9ucy5QYWNrZXRzQnVmZmVyRGVzdHJveSA9PSBOVUxMCisJCQl8fCBnX1RjRnVuY3Rpb25zLlBhY2tldHNCdWZmZXJRdWVyeU5leHRQYWNrZXQgPT0gTlVMTAorCQkJfHwgZ19UY0Z1bmN0aW9ucy5QYWNrZXRzQnVmZmVyQ29tbWl0TmV4dFBhY2tldCA9PSBOVUxMCisJCQl8fCBnX1RjRnVuY3Rpb25zLlN0YXRpc3RpY3NEZXN0cm95ID09IE5VTEwKKwkJCXx8IGdfVGNGdW5jdGlvbnMuU3RhdGlzdGljc1VwZGF0ZSA9PSBOVUxMCisJCQl8fCBnX1RjRnVuY3Rpb25zLlN0YXRpc3RpY3NRdWVyeVZhbHVlID09IE5VTEwKKwkJKQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIGV2ZXJ5dGhpbmcgZ290IGxvYWRlZCwgeWF5ISEKKwkJICovCisJCWN1cnJlbnRTdGF0dXMgPSBUQ19BUElfTE9BREVEOworCX13aGlsZShGQUxTRSk7CisKKwlpZiAoY3VycmVudFN0YXR1cyAhPSBUQ19BUElfTE9BREVEKQorCXsKKwkJaWYgKGdfVGNGdW5jdGlvbnMuaFRjQXBpRGxsSGFuZGxlICE9IE5VTEwpCisJCXsKKwkJCUZyZWVMaWJyYXJ5KGdfVGNGdW5jdGlvbnMuaFRjQXBpRGxsSGFuZGxlKTsKKwkJCWdfVGNGdW5jdGlvbnMuaFRjQXBpRGxsSGFuZGxlID0gTlVMTDsKKwkJfQorCX0KKworCUludGVybG9ja2VkRXhjaGFuZ2UoKExPTkcqKSZnX1RjRnVuY3Rpb25zLkxvYWRTdGF0dXMsIGN1cnJlbnRTdGF0dXMpOworCisJcmV0dXJuIGN1cnJlbnRTdGF0dXM7Cit9CisjZWxzZQorLy8gc3RhdGljIGxpbmtpbmcKK1RDX0FQSV9MT0FEX1NUQVRVUyBMb2FkVGNGdW5jdGlvbnModm9pZCkKK3sKKwlyZXR1cm4gVENfQVBJX0xPQURFRDsKK30KKyNlbmRpZgorCisvKgorICogUHJpdmF0ZSBkYXRhIGZvciBjYXB0dXJpbmcgb24gVHVyYm9DYXAgZGV2aWNlcy4KKyAqLworc3RydWN0IHBjYXBfdGMgeworCVRDX0lOU1RBTkNFIFRjSW5zdGFuY2U7CisJVENfUEFDS0VUU19CVUZGRVIgVGNQYWNrZXRzQnVmZmVyOworCVVMT05HIFRjQWNjZXB0ZWRDb3VudDsKKwl1X2NoYXIgKlBwaVBhY2tldDsKK307CisKK2ludAorVGNGaW5kQWxsRGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoreworCVRDX0FQSV9MT0FEX1NUQVRVUyBsb2FkU3RhdHVzOworCVVMT05HIG51bVBvcnRzOworCVBUQ19QT1JUIHBQb3J0cyA9IE5VTEw7CisJVENfU1RBVFVTIHN0YXR1czsKKwlpbnQgcmVzdWx0ID0gMDsKKwlwY2FwX2lmX3QgKmRldiwgKmN1cnNvcjsKKwlVTE9ORyBpOworCisJZG8KKwl7CisJCWxvYWRTdGF0dXMgPSBMb2FkVGNGdW5jdGlvbnMoKTsKKworCQlpZiAobG9hZFN0YXR1cyAhPSBUQ19BUElfTE9BREVEKQorCQl7CisJCQlyZXN1bHQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBlbnVtZXJhdGUgdGhlIHBvcnRzLCBhbmQgYWRkIHRoZW0gdG8gdGhlIGxpc3QKKwkJICovCisJCXN0YXR1cyA9IGdfVGNGdW5jdGlvbnMuUXVlcnlQb3J0TGlzdCgmcFBvcnRzLCAmbnVtUG9ydHMpOworCisJCWlmIChzdGF0dXMgIT0gVENfU1VDQ0VTUykKKwkJeworCQkJcmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IG51bVBvcnRzOyBpKyspCisJCXsKKwkJCS8qCisJCQkgKiB0cmFuc2Zvcm0gdGhlIHBvcnQgaW50byBhbiBlbnRyeSBpbiB0aGUgbGlzdAorCQkJICovCisJCQlkZXYgPSBUY0NyZWF0ZVBjYXBJZkZyb21Qb3J0KHBQb3J0c1tpXSk7CisKKwkJCWlmIChkZXYgIT0gTlVMTCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIGFwcGVuZCBpdCBhdCB0aGUgZW5kCisJCQkJICovCisJCQkJaWYgKCphbGxkZXZzcCA9PSBOVUxMKQorCQkJCXsKKwkJCQkJKmFsbGRldnNwID0gZGV2OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlmb3IoY3Vyc29yID0gKmFsbGRldnNwOyBjdXJzb3ItPm5leHQgIT0gTlVMTDsgY3Vyc29yID0gY3Vyc29yLT5uZXh0KTsKKwkJCQkJY3Vyc29yLT5uZXh0ID0gZGV2OworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChudW1Qb3J0cyA+IDApCisJCXsKKwkJCS8qCisJCQkgKiBpZ25vcmUgdGhlIHJlc3VsdCBoZXJlCisJCQkgKi8KKwkJCXN0YXR1cyA9IGdfVGNGdW5jdGlvbnMuRnJlZVBvcnRMaXN0KHBQb3J0cyk7CisJCX0KKworCX13aGlsZShGQUxTRSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgcGNhcF9pZl90KiBUY0NyZWF0ZVBjYXBJZkZyb21Qb3J0KFRDX1BPUlQgcG9ydCkKK3sKKwlDSEFSICpuYW1lOworCUNIQVIgKmRlc2NyaXB0aW9uOworCXBjYXBfaWZfdCAqbmV3SWYgPSBOVUxMOworCisJbmV3SWYgPSAocGNhcF9pZl90KiltYWxsb2Moc2l6ZW9mKCpuZXdJZikpOworCWlmIChuZXdJZiA9PSBOVUxMKQorCXsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG5ld0lmLCAwLCBzaXplb2YoKm5ld0lmKSk7CisKKwluYW1lID0gZ19UY0Z1bmN0aW9ucy5Qb3J0R2V0TmFtZShwb3J0KTsKKwlkZXNjcmlwdGlvbiA9IGdfVGNGdW5jdGlvbnMuUG9ydEdldERlc2NyaXB0aW9uKHBvcnQpOworCisJbmV3SWYtPm5hbWUgPSAoY2hhciopbWFsbG9jKHN0cmxlbihuYW1lKSArIDEpOworCWlmIChuZXdJZi0+bmFtZSA9PSBOVUxMKQorCXsKKwkJZnJlZShuZXdJZik7CisJCXJldHVybiBOVUxMOworCX0KKworCW5ld0lmLT5kZXNjcmlwdGlvbiA9IChjaGFyKiltYWxsb2Moc3RybGVuKGRlc2NyaXB0aW9uKSArIDEpOworCWlmIChuZXdJZi0+ZGVzY3JpcHRpb24gPT0gTlVMTCkKKwl7CisJCWZyZWUobmV3SWYtPm5hbWUpOworCQlmcmVlKG5ld0lmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3RyY3B5KG5ld0lmLT5uYW1lLCBuYW1lKTsKKwlzdHJjcHkobmV3SWYtPmRlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbik7CisKKwluZXdJZi0+YWRkcmVzc2VzID0gTlVMTDsKKwluZXdJZi0+bmV4dCA9IE5VTEw7CisJbmV3SWYtPmZsYWdzID0gMDsKKworCXJldHVybiBuZXdJZjsKKworfQorCitzdGF0aWMgaW50CitUY0FjdGl2YXRlKHBjYXBfdCAqcCkKK3sKKwlzdHJ1Y3QgcGNhcF90YyAqcHQgPSBwLT5wcml2OworCVRDX1NUQVRVUyBzdGF0dXM7CisJVUxPTkcgdGltZW91dDsKKwlQUFBJX0hFQURFUiBwUHBpSGVhZGVyOworCisJaWYgKHAtPm9wdC5yZm1vbikKKwl7CisJCS8qCisJCSAqIE5vIG1vbml0b3IgbW9kZSBvbiBUYyBjYXJkczsgdGhleSdyZSBFdGhlcm5ldAorCQkgKiBjYXB0dXJlIGFkYXB0ZXJzLgorCQkgKi8KKwkJcmV0dXJuIFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOworCX0KKworCXB0LT5QcGlQYWNrZXQgPSBtYWxsb2Moc2l6ZW9mKFBQSV9IRUFERVIpICsgTUFYX1RDX1BBQ0tFVF9TSVpFKTsKKworCWlmIChwdC0+UHBpUGFja2V0ID09IE5VTEwpCisJeworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5Iik7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgUFBJIGZpeGVkIGZpZWxkcworCSAqLworCXBQcGlIZWFkZXIgPSAoUFBQSV9IRUFERVIpcHQtPlBwaVBhY2tldDsKKwlwUHBpSGVhZGVyLT5QYWNrZXRIZWFkZXIuUHBoRGx0ID0gRExUX0VOMTBNQjsKKwlwUHBpSGVhZGVyLT5QYWNrZXRIZWFkZXIuUHBoTGVuZ3RoID0gc2l6ZW9mKFBQSV9IRUFERVIpOworCXBQcGlIZWFkZXItPlBhY2tldEhlYWRlci5QcGhGbGFncyA9IDA7CisJcFBwaUhlYWRlci0+UGFja2V0SGVhZGVyLlBwaFZlcnNpb24gPSAwOworCisJcFBwaUhlYWRlci0+QWdncmVnYXRpb25GaWVsZEhlYWRlci5QZmhMZW5ndGggPSBzaXplb2YoUFBJX0ZJRUxEX0FHR1JFR0FUSU9OX0VYVEVOU0lPTik7CisJcFBwaUhlYWRlci0+QWdncmVnYXRpb25GaWVsZEhlYWRlci5QZmhUeXBlID0gUFBJX0ZJRUxEX1RZUEVfQUdHUkVHQVRJT05fRVhURU5TSU9OOworCisJcFBwaUhlYWRlci0+RG90M0ZpZWxkSGVhZGVyLlBmaExlbmd0aCA9IHNpemVvZihQUElfRklFTERfODAyXzNfRVhURU5TSU9OKTsKKwlwUHBpSGVhZGVyLT5Eb3QzRmllbGRIZWFkZXIuUGZoVHlwZSA9IFBQSV9GSUVMRF9UWVBFXzgwMl8zX0VYVEVOU0lPTjsKKworCXN0YXR1cyA9IGdfVGNGdW5jdGlvbnMuSW5zdGFuY2VPcGVuQnlOYW1lKHAtPm9wdC5kZXZpY2UsICZwdC0+VGNJbnN0YW5jZSk7CisKKwlpZiAoc3RhdHVzICE9IFRDX1NVQ0NFU1MpCisJeworCQkvKiBBZGFwdGVyIGRldGVjdGVkIGJ1dCB3ZSBhcmUgbm90IGFibGUgdG8gb3BlbiBpdC4gUmV0dXJuIGZhaWx1cmUuICovCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRXJyb3Igb3BlbmluZyBUdXJib0NhcCBhZGFwdGVyOiAlcyIsIGdfVGNGdW5jdGlvbnMuU3RhdHVzR2V0U3RyaW5nKHN0YXR1cykpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwlwLT5saW5rdHlwZSA9IERMVF9FTjEwTUI7CisJcC0+ZGx0X2xpc3QgPSAodV9pbnQgKikgbWFsbG9jKHNpemVvZih1X2ludCkgKiAyKTsKKwkvKgorCSAqIElmIHRoYXQgZmFpbHMsIGp1c3QgbGVhdmUgdGhlIGxpc3QgZW1wdHkuCisJICovCisJaWYgKHAtPmRsdF9saXN0ICE9IE5VTEwpIHsKKwkJcC0+ZGx0X2xpc3RbMF0gPSBETFRfRU4xME1COworCQlwLT5kbHRfbGlzdFsxXSA9IERMVF9QUEk7CisJCXAtPmRsdF9jb3VudCA9IDI7CisJfQorCisJLyoKKwkgKiBpZ25vcmUgcHJvbWlzY3VvdXMgbW9kZQorCSAqIHAtPm9wdC5wcm9taXNjCisJICovCisKKworCS8qCisJICogaWdub3JlIGFsbCB0aGUgYnVmZmVyIHNpemVzCisJICovCisKKwkvKgorCSAqIGVuYWJsZSByZWNlcHRpb24KKwkgKi8KKwlzdGF0dXMgPSBnX1RjRnVuY3Rpb25zLkluc3RhbmNlU2V0RmVhdHVyZShwdC0+VGNJbnN0YW5jZSwgVENfSU5TVF9GVF9SWF9TVEFUVVMsIDEpOworCisJaWYgKHN0YXR1cyAhPSBUQ19TVUNDRVNTKQorCXsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsIkVycm9yIGVuYWJsaW5nIHJlY2VwdGlvbiBvbiBhIFR1cmJvQ2FwIGluc3RhbmNlOiAlcyIsIGdfVGNGdW5jdGlvbnMuU3RhdHVzR2V0U3RyaW5nKHN0YXR1cykpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKgorCSAqIGVuYWJsZSB0cmFuc21pc3Npb24KKwkgKi8KKwlzdGF0dXMgPSBnX1RjRnVuY3Rpb25zLkluc3RhbmNlU2V0RmVhdHVyZShwdC0+VGNJbnN0YW5jZSwgVENfSU5TVF9GVF9UWF9TVEFUVVMsIDEpOworCS8qCisJICogSWdub3JlIHRoZSBlcnJvciBoZXJlLgorCSAqLworCisJcC0+aW5qZWN0X29wID0gVGNJbmplY3Q7CisJLyoKKwkgKiBpZiB0aGUgdGltZW91dCBpcyAtMSwgaXQgbWVhbnMgaW1tZWRpYXRlIHJldHVybiwgbm8gdGltZW91dAorCSAqIGlmIHRoZSB0aW1lb3V0IGlzIDAsIGl0IG1lYW5zIElORklOSVRFCisJICovCisKKwlpZiAocC0+b3B0LnRpbWVvdXQgPT0gMCkKKwl7CisJCXRpbWVvdXQgPSAweEZGRkZGRkZGOworCX0KKwllbHNlCisJaWYgKHAtPm9wdC50aW1lb3V0IDwgMCkKKwl7CisJCS8qCisJCSAqICB3ZSBpbnNlcnQgYSBtaW5pbWFsIHRpbWVvdXQgaGVyZQorCQkgKi8KKwkJdGltZW91dCA9IDEwOworCX0KKwllbHNlCisJeworCQl0aW1lb3V0ID0gcC0+b3B0LnRpbWVvdXQ7CisJfQorCisJc3RhdHVzID0gZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZVNldEZlYXR1cmUocHQtPlRjSW5zdGFuY2UsIFRDX0lOU1RfRlRfUkVBRF9USU1FT1VULCB0aW1lb3V0KTsKKworCWlmIChzdGF0dXMgIT0gVENfU1VDQ0VTUykKKwl7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCJFcnJvciBzZXR0aW5nIHRoZSByZWFkIHRpbWVvdXQgYSBUdXJib0NhcCBpbnN0YW5jZTogJXMiLCBnX1RjRnVuY3Rpb25zLlN0YXR1c0dldFN0cmluZyhzdGF0dXMpKTsKKwkJZ290byBiYWQ7CisJfQorCisJcC0+cmVhZF9vcCA9IFRjUmVhZDsKKwlwLT5zZXRmaWx0ZXJfb3AgPSBUY1NldEZpbHRlcjsKKwlwLT5zZXRkaXJlY3Rpb25fb3AgPSBOVUxMOwkvKiBOb3QgaW1wbGVtZW50ZWQuICovCisJcC0+c2V0X2RhdGFsaW5rX29wID0gVGNTZXREYXRhbGluazsKKwlwLT5nZXRub25ibG9ja19vcCA9IFRjR2V0Tm9uQmxvY2s7CisJcC0+c2V0bm9uYmxvY2tfb3AgPSBUY1NldE5vbkJsb2NrOworCXAtPnN0YXRzX29wID0gVGNTdGF0czsKKyNpZmRlZiBfV0lOMzIKKwlwLT5zdGF0c19leF9vcCA9IFRjU3RhdHNFeDsKKwlwLT5zZXRidWZmX29wID0gVGNTZXRCdWZmOworCXAtPnNldG1vZGVfb3AgPSBUY1NldE1vZGU7CisJcC0+c2V0bWludG9jb3B5X29wID0gVGNTZXRNaW5Ub0NvcHk7CisJcC0+Z2V0ZXZlbnRfb3AgPSBUY0dldFJlY2VpdmVXYWl0SGFuZGxlOworCXAtPm9pZF9nZXRfcmVxdWVzdF9vcCA9IFRjT2lkR2V0UmVxdWVzdDsKKwlwLT5vaWRfc2V0X3JlcXVlc3Rfb3AgPSBUY09pZFNldFJlcXVlc3Q7CisJcC0+c2VuZHF1ZXVlX3RyYW5zbWl0X29wID0gVGNTZW5kcXVldWVUcmFuc21pdDsKKwlwLT5zZXR1c2VyYnVmZmVyX29wID0gVGNTZXRVc2VyQnVmZmVyOworCXAtPmxpdmVfZHVtcF9vcCA9IFRjTGl2ZUR1bXA7CisJcC0+bGl2ZV9kdW1wX2VuZGVkX29wID0gVGNMaXZlRHVtcEVuZGVkOworCXAtPmdldF9haXJwY2FwX2hhbmRsZV9vcCA9IFRjR2V0QWlyUGNhcEhhbmRsZTsKKyNlbHNlCisJcC0+c2VsZWN0YWJsZV9mZCA9IC0xOworI2VuZGlmCisKKwlwLT5jbGVhbnVwX29wID0gVGNDbGVhbnVwOworCisJcmV0dXJuIDA7CitiYWQ6CisJVGNDbGVhbnVwKHApOworCXJldHVybiBQQ0FQX0VSUk9SOworfQorCitwY2FwX3QgKgorVGNDcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmLCBpbnQgKmlzX291cnMpCit7CisJVUxPTkcgbnVtUG9ydHM7CisJUFRDX1BPUlQgcFBvcnRzID0gTlVMTDsKKwlUQ19TVEFUVVMgc3RhdHVzOworCWludCBpc190YzsKKwlVTE9ORyBpOworCXBjYXBfdCAqcDsKKworCWlmIChMb2FkVGNGdW5jdGlvbnMoKSAhPSBUQ19BUElfTE9BREVEKQorCXsKKwkJLyoKKwkJICogWFhYIC0gcmVwb3J0IHRoaXMgYXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYXMKKwkJICogIm5vdCBhIFR1cmJvQ2FwIGRldmljZSI/CisJCSAqLworCQkqaXNfb3VycyA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogZW51bWVyYXRlIHRoZSBwb3J0cywgYW5kIGFkZCB0aGVtIHRvIHRoZSBsaXN0CisJICovCisJc3RhdHVzID0gZ19UY0Z1bmN0aW9ucy5RdWVyeVBvcnRMaXN0KCZwUG9ydHMsICZudW1Qb3J0cyk7CisKKwlpZiAoc3RhdHVzICE9IFRDX1NVQ0NFU1MpCisJeworCQkvKgorCQkgKiBYWFggLSByZXBvcnQgdGhpcyBhcyBhbiBlcnJvciByYXRoZXIgdGhhbiBhcworCQkgKiAibm90IGEgVHVyYm9DYXAgZGV2aWNlIj8KKwkJICovCisJCSppc19vdXJzID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaXNfdGMgPSBGQUxTRTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtUG9ydHM7IGkrKykKKwl7CisJCWlmIChzdHJjbXAoZ19UY0Z1bmN0aW9ucy5Qb3J0R2V0TmFtZShwUG9ydHNbaV0pLCBkZXZpY2UpID09IDApCisJCXsKKwkJCWlzX3RjID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG51bVBvcnRzID4gMCkKKwl7CisJCS8qCisJCSAqIGlnbm9yZSB0aGUgcmVzdWx0IGhlcmUKKwkJICovCisJCSh2b2lkKWdfVGNGdW5jdGlvbnMuRnJlZVBvcnRMaXN0KHBQb3J0cyk7CisJfQorCisJaWYgKCFpc190YykKKwl7CisJCSppc19vdXJzID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogT0ssIGl0J3MgcHJvYmFibHkgb3Vycy4gKi8KKwkqaXNfb3VycyA9IDE7CisKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfdGMpKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXAtPmFjdGl2YXRlX29wID0gVGNBY3RpdmF0ZTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGludCBUY1NldERhdGFsaW5rKHBjYXBfdCAqcCwgaW50IGRsdCkKK3sKKwkvKgorCSAqIGFsd2F5cyByZXR1cm4gMCwgYXMgdGhlIGNoZWNrIGlzIGRvbmUgYnkgcGNhcF9zZXRfZGF0YWxpbmsKKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBUY0dldE5vbkJsb2NrKHBjYXBfdCAqcCwgY2hhciAqZXJyYnVmKQoreworCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkdldHRpbmcgdGhlIG5vbiBibG9ja2luZyBzdGF0dXMgaXMgbm90IGF2YWlsYWJsZSBmb3IgVHVyYm9DYXAgcG9ydHMiKTsKKwlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJHZXR0aW5nIHRoZSBub24gYmxvY2tpbmcgc3RhdHVzIGlzIG5vdCBhdmFpbGFibGUgZm9yIFR1cmJvQ2FwIHBvcnRzIik7CisJCXJldHVybiAtMTsKKworfQorc3RhdGljIGludCBUY1NldE5vbkJsb2NrKHBjYXBfdCAqcCwgaW50IG5vbmJsb2NrLCBjaGFyICplcnJidWYpCit7CisJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiU2V0dGluZyB0aGUgbm9uIGJsb2NraW5nIHN0YXR1cyBpcyBub3QgYXZhaWxhYmxlIGZvciBUdXJib0NhcCBwb3J0cyIpOworCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIlNldHRpbmcgdGhlIG5vbiBibG9ja2luZyBzdGF0dXMgaXMgbm90IGF2YWlsYWJsZSBmb3IgVHVyYm9DYXAgcG9ydHMiKTsKKwkJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyB2b2lkIFRjQ2xlYW51cChwY2FwX3QgKnApCit7CisJc3RydWN0IHBjYXBfdGMgKnB0ID0gcC0+cHJpdjsKKworCWlmIChwdC0+VGNQYWNrZXRzQnVmZmVyICE9IE5VTEwpCisJeworCQlnX1RjRnVuY3Rpb25zLlBhY2tldHNCdWZmZXJEZXN0cm95KHB0LT5UY1BhY2tldHNCdWZmZXIpOworCQlwdC0+VGNQYWNrZXRzQnVmZmVyID0gTlVMTDsKKwl9CisJaWYgKHB0LT5UY0luc3RhbmNlICE9IE5VTEwpCisJeworCQkvKgorCQkgKiBoZXJlIHdlIGRvIG5vdCBjaGVjayBmb3IgdGhlIGVycm9yIHZhbHVlcworCQkgKi8KKwkJZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZUNsb3NlKHB0LT5UY0luc3RhbmNlKTsKKwkJcHQtPlRjSW5zdGFuY2UgPSBOVUxMOworCX0KKworCWlmIChwdC0+UHBpUGFja2V0ICE9IE5VTEwpCisJeworCQlmcmVlKHB0LT5QcGlQYWNrZXQpOworCQlwdC0+UHBpUGFja2V0ID0gTlVMTDsKKwl9CisKKwlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24ocCk7Cit9CisKKy8qIFNlbmQgYSBwYWNrZXQgdG8gdGhlIG5ldHdvcmsgKi8KK3N0YXRpYyBpbnQgVGNJbmplY3QocGNhcF90ICpwLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBwY2FwX3RjICpwdCA9IHAtPnByaXY7CisJVENfU1RBVFVTIHN0YXR1czsKKwlUQ19QQUNLRVRTX0JVRkZFUiBidWZmZXI7CisJVENfUEFDS0VUX0hFQURFUiBoZWFkZXI7CisKKwlpZiAoc2l6ZSA+PSAweEZGRkYpCisJeworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQgZXJyb3I6IHRoZSBUdXJib0NhcCBBUEkgZG9lcyBub3Qgc3VwcG9ydCBwYWNrZXRzIGxhcmdlciB0aGFuIDY0ayIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RhdHVzID0gZ19UY0Z1bmN0aW9ucy5QYWNrZXRzQnVmZmVyQ3JlYXRlKHNpemVvZihUQ19QQUNLRVRfSEVBREVSKSArIFRDX0FMSUdOX1VTSE9SVF9UT182NEJJVCgoVVNIT1JUKXNpemUpLCAmYnVmZmVyKTsKKworCWlmIChzdGF0dXMgIT0gVENfU1VDQ0VTUykKKwl7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZCBlcnJvcjogVGNQYWNrZXRzQnVmZmVyQ3JlYXRlIGZhaWx1cmU6ICVzICglMDh4KSIsIGdfVGNGdW5jdGlvbnMuU3RhdHVzR2V0U3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIHdlIGFzc3VtZSB0aGF0IHRoZSBwYWNrZXQgaXMgd2l0aG91dCB0aGUgY2hlY2tzdW0sIGFzIGNvbW1vbiB3aXRoIFdpblBjYXAKKwkgKi8KKwltZW1zZXQoJmhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOworCisJaGVhZGVyLkxlbmd0aCA9IChVU0hPUlQpc2l6ZTsKKwloZWFkZXIuQ2FwdHVyZWRMZW5ndGggPSBoZWFkZXIuTGVuZ3RoOworCisJc3RhdHVzID0gZ19UY0Z1bmN0aW9ucy5QYWNrZXRzQnVmZmVyQ29tbWl0TmV4dFBhY2tldChidWZmZXIsICZoZWFkZXIsIChQVk9JRClidWYpOworCisJaWYgKHN0YXR1cyA9PSBUQ19TVUNDRVNTKQorCXsKKwkJc3RhdHVzID0gZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZVRyYW5zbWl0UGFja2V0cyhwdC0+VGNJbnN0YW5jZSwgYnVmZmVyKTsKKworCQlpZiAoc3RhdHVzICE9IFRDX1NVQ0NFU1MpCisJCXsKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZCBlcnJvcjogVGNJbnN0YW5jZVRyYW5zbWl0UGFja2V0cyBmYWlsdXJlOiAlcyAoJTA4eCkiLCBnX1RjRnVuY3Rpb25zLlN0YXR1c0dldFN0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZCBlcnJvcjogVGNQYWNrZXRzQnVmZmVyQ29tbWl0TmV4dFBhY2tldCBmYWlsdXJlOiAlcyAoJTA4eCkiLCBnX1RjRnVuY3Rpb25zLlN0YXR1c0dldFN0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworCX0KKworCWdfVGNGdW5jdGlvbnMuUGFja2V0c0J1ZmZlckRlc3Ryb3koYnVmZmVyKTsKKworCWlmIChzdGF0dXMgIT0gVENfU1VDQ0VTUykKKwl7CisJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IFRjUmVhZChwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCXN0cnVjdCBwY2FwX3RjICpwdCA9IHAtPnByaXY7CisJVENfU1RBVFVTIHN0YXR1czsKKwlpbnQgbiA9IDA7CisKKwkvKgorCSAqIEhhcyAicGNhcF9icmVha2xvb3AoKSIgYmVlbiBjYWxsZWQ/CisJICovCisJaWYgKHAtPmJyZWFrX2xvb3ApCisJeworCQkvKgorCQkgKiBZZXMgLSBjbGVhciB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGl0CisJCSAqIGhhcywgYW5kIHJldHVybiAtMiB0byBpbmRpY2F0ZSB0aGF0IHdlIHdlcmUKKwkJICogdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisJCSAqLworCQlwLT5icmVha19sb29wID0gMDsKKwkJcmV0dXJuIC0yOworCX0KKworCWlmIChwdC0+VGNQYWNrZXRzQnVmZmVyID09IE5VTEwpCisJeworCQlzdGF0dXMgPSBnX1RjRnVuY3Rpb25zLkluc3RhbmNlUmVjZWl2ZVBhY2tldHMocHQtPlRjSW5zdGFuY2UsICZwdC0+VGNQYWNrZXRzQnVmZmVyKTsKKwkJaWYgKHN0YXR1cyAhPSBUQ19TVUNDRVNTKQorCQl7CisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlYWQgZXJyb3IsIFRjSW5zdGFuY2VSZWNlaXZlUGFja2V0cyBmYWlsdXJlOiAlcyAoJTA4eCkiLCBnX1RjRnVuY3Rpb25zLlN0YXR1c0dldFN0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJd2hpbGUgKFRSVUUpCisJeworCQlzdHJ1Y3QgcGNhcF9wa3RoZHIgaGRyOworCQlUQ19QQUNLRVRfSEVBREVSIHRjSGVhZGVyOworCQlQVk9JRCBkYXRhOworCQlVTE9ORyBmaWx0ZXJSZXN1bHQ7CisKKwkJLyoKKwkJICogSGFzICJwY2FwX2JyZWFrbG9vcCgpIiBiZWVuIGNhbGxlZD8KKwkJICogSWYgc28sIHJldHVybiBpbW1lZGlhdGVseSAtIGlmIHdlIGhhdmVuJ3QgcmVhZCBhbnkKKwkJICogcGFja2V0cywgY2xlYXIgdGhlIGZsYWcgYW5kIHJldHVybiAtMiB0byBpbmRpY2F0ZQorCQkgKiB0aGF0IHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AsIG90aGVyd2lzZQorCQkgKiBsZWF2ZSB0aGUgZmxhZyBzZXQsIHNvIHRoYXQgdGhlICpuZXh0KiBjYWxsIHdpbGwgYnJlYWsKKwkJICogb3V0IG9mIHRoZSBsb29wIHdpdGhvdXQgaGF2aW5nIHJlYWQgYW55IHBhY2tldHMsIGFuZAorCQkgKiByZXR1cm4gdGhlIG51bWJlciBvZiBwYWNrZXRzIHdlJ3ZlIHByb2Nlc3NlZCBzbyBmYXIuCisJCSAqLworCQlpZiAocC0+YnJlYWtfbG9vcCkKKwkJeworCQkJaWYgKG4gPT0gMCkKKwkJCXsKKwkJCQlwLT5icmVha19sb29wID0gMDsKKwkJCQlyZXR1cm4gLTI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIG47CisJCQl9CisJCX0KKworCQlpZiAocHQtPlRjUGFja2V0c0J1ZmZlciA9PSBOVUxMKQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCXN0YXR1cyA9IGdfVGNGdW5jdGlvbnMuUGFja2V0c0J1ZmZlclF1ZXJ5TmV4dFBhY2tldChwdC0+VGNQYWNrZXRzQnVmZmVyLCAmdGNIZWFkZXIsICZkYXRhKTsKKworCQlpZiAoc3RhdHVzID09IFRDX0VSUk9SX0VORF9PRl9CVUZGRVIpCisJCXsKKwkJCWdfVGNGdW5jdGlvbnMuUGFja2V0c0J1ZmZlckRlc3Ryb3kocHQtPlRjUGFja2V0c0J1ZmZlcik7CisJCQlwdC0+VGNQYWNrZXRzQnVmZmVyID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAhPSBUQ19TVUNDRVNTKQorCQl7CisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlYWQgZXJyb3IsIFRjUGFja2V0c0J1ZmZlclF1ZXJ5TmV4dFBhY2tldCBmYWlsdXJlOiAlcyAoJTA4eCkiLCBnX1RjRnVuY3Rpb25zLlN0YXR1c0dldFN0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogTm8gdW5kZXJsYXlpbmcgZmlsdGVyaW5nIHN5c3RlbS4gV2UgbmVlZCB0byBmaWx0ZXIgb24gb3VyIG93biAqLworCQlpZiAocC0+ZmNvZGUuYmZfaW5zbnMpCisJCXsKKwkJCWZpbHRlclJlc3VsdCA9IGJwZl9maWx0ZXIocC0+ZmNvZGUuYmZfaW5zbnMsIGRhdGEsIHRjSGVhZGVyLkxlbmd0aCwgdGNIZWFkZXIuQ2FwdHVyZWRMZW5ndGgpOworCisJCQlpZiAoZmlsdGVyUmVzdWx0ID09IDApCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChmaWx0ZXJSZXN1bHQgPiB0Y0hlYWRlci5DYXB0dXJlZExlbmd0aCkKKwkJCXsKKwkJCQlmaWx0ZXJSZXN1bHQgPSB0Y0hlYWRlci5DYXB0dXJlZExlbmd0aDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWZpbHRlclJlc3VsdCA9IHRjSGVhZGVyLkNhcHR1cmVkTGVuZ3RoOworCQl9CisKKwkJcHQtPlRjQWNjZXB0ZWRDb3VudCArKzsKKworCQloZHIudHMudHZfc2VjID0gKGJwZl91X2ludDMyKSh0Y0hlYWRlci5UaW1lc3RhbXAgLyAoVUxPTkdMT05HKSgxMDAwICAqIDEwMDAgKiAxMDAwKSk7CisJCWhkci50cy50dl91c2VjID0gKGJwZl91X2ludDMyKSgodGNIZWFkZXIuVGltZXN0YW1wICUgKFVMT05HTE9ORykoMTAwMCAgKiAxMDAwICogMTAwMCkpIC8gMTAwMCk7CisKKwkJaWYgKHAtPmxpbmt0eXBlID09IERMVF9FTjEwTUIpCisJCXsKKwkJCWhkci5jYXBsZW4gPSBmaWx0ZXJSZXN1bHQ7CisJCQloZHIubGVuID0gdGNIZWFkZXIuTGVuZ3RoOworCQkJKCpjYWxsYmFjaykodXNlciwgJmhkciwgZGF0YSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlQUFBJX0hFQURFUiBwUHBpSGVhZGVyID0gKFBQUElfSEVBREVSKXB0LT5QcGlQYWNrZXQ7CisJCQlQVk9JRCBkYXRhMiA9IHBQcGlIZWFkZXIgKyAxOworCisJCQlwUHBpSGVhZGVyLT5BZ2dyZWdhdGlvbkZpZWxkLkludGVyZmFjZUlkID0gVENfUEhfRkxBR1NfUlhfUE9SVF9JRCh0Y0hlYWRlci5GbGFncyk7CisJCQlwUHBpSGVhZGVyLT5Eb3QzRmllbGQuRXJyb3JzID0gdGNIZWFkZXIuRXJyb3JzOworCQkJaWYgKHRjSGVhZGVyLkZsYWdzICYgVENfUEhfRkxBR1NfQ0hFQ0tTVU0pCisJCQl7CisJCQkJcFBwaUhlYWRlci0+RG90M0ZpZWxkLkZsYWdzID0gUFBJX0ZMRF84MDJfM19FWFRfRkxBR19GQ1NfUFJFU0VOVDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwUHBpSGVhZGVyLT5Eb3QzRmllbGQuRmxhZ3MgPSAwOworCQkJfQorCisJCQlpZiAoZmlsdGVyUmVzdWx0IDw9IE1BWF9UQ19QQUNLRVRfU0laRSkKKwkJCXsKKwkJCQltZW1jcHkoZGF0YTIsIGRhdGEsIGZpbHRlclJlc3VsdCk7CisJCQkJaGRyLmNhcGxlbiA9IHNpemVvZihQUElfSEVBREVSKSArIGZpbHRlclJlc3VsdDsKKwkJCQloZHIubGVuID0gc2l6ZW9mKFBQSV9IRUFERVIpICsgdGNIZWFkZXIuTGVuZ3RoOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW1lbWNweShkYXRhMiwgZGF0YSwgTUFYX1RDX1BBQ0tFVF9TSVpFKTsKKwkJCQloZHIuY2FwbGVuID0gc2l6ZW9mKFBQSV9IRUFERVIpICsgTUFYX1RDX1BBQ0tFVF9TSVpFOworCQkJCWhkci5sZW4gPSBzaXplb2YoUFBJX0hFQURFUikgKyB0Y0hlYWRlci5MZW5ndGg7CisJCQl9CisKKwkJCSgqY2FsbGJhY2spKHVzZXIsICZoZHIsIHB0LT5QcGlQYWNrZXQpOworCisJCX0KKworCQlpZiAoKytuID49IGNudCAmJiBjbnQgPiAwKQorCQl7CisJCQlyZXR1cm4gbjsKKwkJfQorCX0KKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50CitUY1N0YXRzKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpCit7CisJc3RydWN0IHBjYXBfdGMgKnB0ID0gcC0+cHJpdjsKKwlUQ19TVEFUSVNUSUNTIHN0YXRpc3RpY3M7CisJVENfU1RBVFVTIHN0YXR1czsKKwlVTE9OR0xPTkcgY291bnRlcjsKKwlzdHJ1Y3QgcGNhcF9zdGF0IHM7CisKKwlzdGF0dXMgPSBnX1RjRnVuY3Rpb25zLkluc3RhbmNlUXVlcnlTdGF0aXN0aWNzKHB0LT5UY0luc3RhbmNlLCAmc3RhdGlzdGljcyk7CisKKwlpZiAoc3RhdHVzICE9IFRDX1NVQ0NFU1MpCisJeworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlR1cmJvQ2FwIGVycm9yIGluIFRjSW5zdGFuY2VRdWVyeVN0YXRpc3RpY3M6ICVzICglMDh4KSIsIGdfVGNGdW5jdGlvbnMuU3RhdHVzR2V0U3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoJnMsIDAsIHNpemVvZihzKSk7CisKKwlzdGF0dXMgPSBnX1RjRnVuY3Rpb25zLlN0YXRpc3RpY3NRdWVyeVZhbHVlKHN0YXRpc3RpY3MsIFRDX0NPVU5URVJfSU5TVEFOQ0VfVE9UQUxfUlhfUEFDS0VUUywgJmNvdW50ZXIpOworCWlmIChzdGF0dXMgIT0gVENfU1VDQ0VTUykKKwl7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiVHVyYm9DYXAgZXJyb3IgaW4gVGNTdGF0aXN0aWNzUXVlcnlWYWx1ZTogJXMgKCUwOHgpIiwgZ19UY0Z1bmN0aW9ucy5TdGF0dXNHZXRTdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoY291bnRlciA8PSAoVUxPTkdMT05HKTB4RkZGRkZGRkYpCisJeworCQlzLnBzX3JlY3YgPSAoVUxPTkcpY291bnRlcjsKKwl9CisJZWxzZQorCXsKKwkJcy5wc19yZWN2ID0gMHhGRkZGRkZGRjsKKwl9CisKKwlzdGF0dXMgPSBnX1RjRnVuY3Rpb25zLlN0YXRpc3RpY3NRdWVyeVZhbHVlKHN0YXRpc3RpY3MsIFRDX0NPVU5URVJfSU5TVEFOQ0VfUlhfRFJPUFBFRF9QQUNLRVRTLCAmY291bnRlcik7CisJaWYgKHN0YXR1cyAhPSBUQ19TVUNDRVNTKQorCXsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJUdXJib0NhcCBlcnJvciBpbiBUY1N0YXRpc3RpY3NRdWVyeVZhbHVlOiAlcyAoJTA4eCkiLCBnX1RjRnVuY3Rpb25zLlN0YXR1c0dldFN0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChjb3VudGVyIDw9IChVTE9OR0xPTkcpMHhGRkZGRkZGRikKKwl7CisJCXMucHNfaWZkcm9wID0gKFVMT05HKWNvdW50ZXI7CisJCXMucHNfZHJvcCA9IChVTE9ORyljb3VudGVyOworCX0KKwllbHNlCisJeworCQlzLnBzX2lmZHJvcCA9IDB4RkZGRkZGRkY7CisJCXMucHNfZHJvcCA9IDB4RkZGRkZGRkY7CisJfQorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoSEFWRV9SRU1PVEUpCisJcy5wc19jYXB0ID0gcHQtPlRjQWNjZXB0ZWRDb3VudDsKKyNlbmRpZgorCSpwcyA9IHM7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogV2UgZmlsdGVyIGF0IHVzZXIgbGV2ZWwsIHNpbmNlIHRoZSBrZXJuZWwgZHJpdmVyIGRvZXMndCBwcm9jZXNzIHRoZSBwYWNrZXRzCisgKi8KK3N0YXRpYyBpbnQKK1RjU2V0RmlsdGVyKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCkKK3sKKwlpZighZnApCisJeworCQlzdHJuY3B5KHAtPmVycmJ1ZiwgInNldGZpbHRlcjogTm8gZmlsdGVyIHNwZWNpZmllZCIsIHNpemVvZihwLT5lcnJidWYpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEluc3RhbGwgYSB1c2VyIGxldmVsIGZpbHRlciAqLworCWlmIChpbnN0YWxsX2JwZl9wcm9ncmFtKHAsIGZwKSA8IDApCisJeworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCQkic2V0ZmlsdGVyLCB1bmFibGUgdG8gaW5zdGFsbCB0aGUgZmlsdGVyOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgX1dJTjMyCitzdGF0aWMgc3RydWN0IHBjYXBfc3RhdCAqCitUY1N0YXRzRXgocGNhcF90ICpwLCBpbnQgKnBjYXBfc3RhdF9zaXplKQoreworCXN0cnVjdCBwY2FwX3RjICpwdCA9IHAtPnByaXY7CisJVENfU1RBVElTVElDUyBzdGF0aXN0aWNzOworCVRDX1NUQVRVUyBzdGF0dXM7CisJVUxPTkdMT05HIGNvdW50ZXI7CisKKwkqcGNhcF9zdGF0X3NpemUgPSBzaXplb2YgKHAtPnN0YXQpOworCisJc3RhdHVzID0gZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZVF1ZXJ5U3RhdGlzdGljcyhwdC0+VGNJbnN0YW5jZSwgJnN0YXRpc3RpY3MpOworCisJaWYgKHN0YXR1cyAhPSBUQ19TVUNDRVNTKQorCXsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJUdXJib0NhcCBlcnJvciBpbiBUY0luc3RhbmNlUXVlcnlTdGF0aXN0aWNzOiAlcyAoJTA4eCkiLCBnX1RjRnVuY3Rpb25zLlN0YXR1c0dldFN0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoJnAtPnN0YXQsIDAsIHNpemVvZihwLT5zdGF0KSk7CisKKwlzdGF0dXMgPSBnX1RjRnVuY3Rpb25zLlN0YXRpc3RpY3NRdWVyeVZhbHVlKHN0YXRpc3RpY3MsIFRDX0NPVU5URVJfSU5TVEFOQ0VfVE9UQUxfUlhfUEFDS0VUUywgJmNvdW50ZXIpOworCWlmIChzdGF0dXMgIT0gVENfU1VDQ0VTUykKKwl7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiVHVyYm9DYXAgZXJyb3IgaW4gVGNTdGF0aXN0aWNzUXVlcnlWYWx1ZTogJXMgKCUwOHgpIiwgZ19UY0Z1bmN0aW9ucy5TdGF0dXNHZXRTdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChjb3VudGVyIDw9IChVTE9OR0xPTkcpMHhGRkZGRkZGRikKKwl7CisJCXAtPnN0YXQucHNfcmVjdiA9IChVTE9ORyljb3VudGVyOworCX0KKwllbHNlCisJeworCQlwLT5zdGF0LnBzX3JlY3YgPSAweEZGRkZGRkZGOworCX0KKworCXN0YXR1cyA9IGdfVGNGdW5jdGlvbnMuU3RhdGlzdGljc1F1ZXJ5VmFsdWUoc3RhdGlzdGljcywgVENfQ09VTlRFUl9JTlNUQU5DRV9SWF9EUk9QUEVEX1BBQ0tFVFMsICZjb3VudGVyKTsKKwlpZiAoc3RhdHVzICE9IFRDX1NVQ0NFU1MpCisJeworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlR1cmJvQ2FwIGVycm9yIGluIFRjU3RhdGlzdGljc1F1ZXJ5VmFsdWU6ICVzICglMDh4KSIsIGdfVGNGdW5jdGlvbnMuU3RhdHVzR2V0U3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoY291bnRlciA8PSAoVUxPTkdMT05HKTB4RkZGRkZGRkYpCisJeworCQlwLT5zdGF0LnBzX2lmZHJvcCA9IChVTE9ORyljb3VudGVyOworCQlwLT5zdGF0LnBzX2Ryb3AgPSAoVUxPTkcpY291bnRlcjsKKwl9CisJZWxzZQorCXsKKwkJcC0+c3RhdC5wc19pZmRyb3AgPSAweEZGRkZGRkZGOworCQlwLT5zdGF0LnBzX2Ryb3AgPSAweEZGRkZGRkZGOworCX0KKworI2lmZGVmIEhBVkVfUkVNT1RFCisJcC0+c3RhdC5wc19jYXB0ID0gcHQtPlRjQWNjZXB0ZWRDb3VudDsKKyNlbmRpZgorCisJcmV0dXJuICZwLT5zdGF0OworfQorCisvKiBTZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUga2VybmVsLWxldmVsIGNhcHR1cmUgYnVmZmVyICovCitzdGF0aWMgaW50CitUY1NldEJ1ZmYocGNhcF90ICpwLCBpbnQgZGltKQoreworCS8qCisJICogWFhYIHR1cmJvY2FwIGhhcyBhbiBpbnRlcm5hbCB3YXkgb2YgbWFuYWdpbmcgYnVmZmVycy4KKwkgKiBBbmQgYXQgdGhlIG1vbWVudCBpdCdzIG5vdCBjb25maWd1cmFibGUsIHNvIHdlIGp1c3QKKwkgKiBzaWxlbnRseSBpZ25vcmUgdGhlIHJlcXVlc3QgdG8gc2V0IHRoZSBidWZmZXIuCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK1RjU2V0TW9kZShwY2FwX3QgKnAsIGludCBtb2RlKQoreworCWlmIChtb2RlICE9IE1PREVfQ0FQVCkKKwl7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTW9kZSAldSBub3Qgc3VwcG9ydGVkIGJ5IFR1cmJvQ2FwIGRldmljZXMuIFR1cmJvQ2FwIG9ubHkgc3VwcG9ydHMgY2FwdHVyZS4iLCBtb2RlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitUY1NldE1pblRvQ29weShwY2FwX3QgKnAsIGludCBzaXplKQoreworCXN0cnVjdCBwY2FwX3RjICpwdCA9IHAtPnByaXY7CisJVENfU1RBVFVTIHN0YXR1czsKKworCWlmIChzaXplIDwgMCkKKwl7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTWludG9jb3B5IGNhbm5vdCBiZSBsZXNzIHRoYW4gMC4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN0YXR1cyA9IGdfVGNGdW5jdGlvbnMuSW5zdGFuY2VTZXRGZWF0dXJlKHB0LT5UY0luc3RhbmNlLCBUQ19JTlNUX0ZUX01JTlRPQ09QWSwgKFVMT05HKXNpemUpOworCisJaWYgKHN0YXR1cyAhPSBUQ19TVUNDRVNTKQorCXsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJUdXJib0NhcCBlcnJvciBzZXR0aW5nIHRoZSBtaW50b2NvcHk6ICVzICglMDh4KSIsIGdfVGNGdW5jdGlvbnMuU3RhdHVzR2V0U3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIQU5ETEUKK1RjR2V0UmVjZWl2ZVdhaXRIYW5kbGUocGNhcF90ICpwKQoreworCXN0cnVjdCBwY2FwX3RjICpwdCA9IHAtPnByaXY7CisKKwlyZXR1cm4gZ19UY0Z1bmN0aW9ucy5JbnN0YW5jZUdldFJlY2VpdmVXYWl0SGFuZGxlKHB0LT5UY0luc3RhbmNlKTsKK30KKworc3RhdGljIGludAorVGNPaWRHZXRSZXF1ZXN0KHBjYXBfdCAqcCwgYnBmX3VfaW50MzIgb2lkIF9VXywgdm9pZCAqZGF0YSBfVV8sIHNpemVfdCAqbGVucCBfVV8pCit7CisJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJBbiBPSUQgZ2V0IHJlcXVlc3QgY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBhIFR1cmJvQ2FwIGRldmljZSIpOworCXJldHVybiBQQ0FQX0VSUk9SOworfQorCitzdGF0aWMgaW50CitUY09pZFNldFJlcXVlc3QocGNhcF90ICpwLCBicGZfdV9pbnQzMiBvaWQgX1VfLCBjb25zdCB2b2lkICpkYXRhIF9VXywKKyAgICBzaXplX3QgKmxlbnAgX1VfKQoreworCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiQW4gT0lEIHNldCByZXF1ZXN0IGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gYSBUdXJib0NhcCBkZXZpY2UiKTsKKwlyZXR1cm4gUENBUF9FUlJPUjsKK30KKworc3RhdGljIHVfaW50CitUY1NlbmRxdWV1ZVRyYW5zbWl0KHBjYXBfdCAqcCwgcGNhcF9zZW5kX3F1ZXVlICpxdWV1ZSBfVV8sIGludCBzeW5jIF9VXykKK3sKKwlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIlBhY2tldHMgY2Fubm90IGJlIGJ1bGsgdHJhbnNtaXR0ZWQgb24gYSBUdXJib0NhcCBkZXZpY2UiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorVGNTZXRVc2VyQnVmZmVyKHBjYXBfdCAqcCwgaW50IHNpemUgX1VfKQoreworCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiVGhlIHVzZXIgYnVmZmVyIGNhbm5vdCBiZSBzZXQgb24gYSBUdXJib0NhcCBkZXZpY2UiKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK1RjTGl2ZUR1bXAocGNhcF90ICpwLCBjaGFyICpmaWxlbmFtZSBfVV8sIGludCBtYXhzaXplIF9VXywgaW50IG1heHBhY2tzIF9VXykKK3sKKwlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIkxpdmUgcGFja2V0IGR1bXBpbmcgY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBhIFR1cmJvQ2FwIGRldmljZSIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludAorVGNMaXZlRHVtcEVuZGVkKHBjYXBfdCAqcCwgaW50IHN5bmMgX1VfKQoreworCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiTGl2ZSBwYWNrZXQgZHVtcGluZyBjYW5ub3QgYmUgcGVyZm9ybWVkIG9uIGEgVHVyYm9DYXAgZGV2aWNlIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgUEFpcnBjYXBIYW5kbGUKK1RjR2V0QWlyUGNhcEhhbmRsZShwY2FwX3QgKnAgX1VfKQoreworCXJldHVybiBOVUxMOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9wY2FwLWNhbnVzYi1saW51eC5oIGIvcGNhcC10Yy5oCnNpbWlsYXJpdHkgaW5kZXggNjglCnJlbmFtZSBmcm9tIHBjYXAtY2FudXNiLWxpbnV4LmgKcmVuYW1lIHRvIHBjYXAtdGMuaAppbmRleCBjOGYzYmUxLi41OWRkZWMyIDEwMDY0NAotLS0gYS9wY2FwLWNhbnVzYi1saW51eC5oCisrKyBiL3BjYXAtdGMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgRmVsaXggT2Jlbmh1YmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQ0FDRSBUZWNobm9sb2dpZXMsIERhdmlzIChDYWxpZm9ybmlhKQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTExLDkgKzExLDkgQEAKICAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAqIHBlcm1pc3Npb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIENBQ0UgVGVjaG5vbG9naWVzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICAqCiAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVApAQCAtMjksOSArMjksMjYgQEAKICAqCiAgKi8KIAotLyoKLSAqIFByb3RvdHlwZXMgZm9yIFNvY2tldENBTiByZWxhdGVkIGZ1bmN0aW9ucwotICovCi1wY2FwX3QqIGNhbnVzYl9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmLCBpbnQgKmlzX291cnMpOwotaW50IGNhbnVzYl9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKipwZGV2bGlzdCwgY2hhciogZXJyYnVmKTsKKyNpZm5kZWYgX19QQ0FQX1RDX0hfXworI2RlZmluZSBfX1BDQVBfVENfSF9fCiAKKy8qCisgKiBuZWVkZWQgYmVjYXVzZSBnY2MgaGVhZGVycyBkbyBub3QgaGF2ZSBDX0FTU0VSVAorICovCisjaWZuZGVmIENfQVNTRVJUCisjZGVmaW5lIENfQVNTRVJUKGEpCisjZW5kaWYKKworI2luY2x1ZGUgPFRjQXBpLmg+CisKKy8qCisgKiBmdW5jdGlvbnMgdXNlZCBlZmZlY3RpdmVseSBieSB0aGUgcGNhcCBsaWJyYXJ5CisgKi8KKworcGNhcF90ICoKK1RjQ3JlYXRlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZiwgaW50ICppc19vdXJzKTsKKworaW50CitUY0ZpbmRBbGxEZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3BjYXAtdHN0YW1wLm1hbm1pc2MgYi9wY2FwLXRzdGFtcC5tYW5taXNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDc4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLXRzdGFtcC5tYW5taXNjCkBAIC0wLDAgKzEsMTc1IEBACisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQLVRTVEFNUCA3ICI4IE1hcmNoIDIwMTUiCisuU0ggTkFNRQorcGNhcC10c3RhbXAgXC0gcGFja2V0IHRpbWUgc3RhbXBzIGluIGxpYnBjYXAKKy5TSCBERVNDUklQVElPTgorV2hlbiBjYXB0dXJpbmcgdHJhZmZpYywgZWFjaCBwYWNrZXQgaXMgZ2l2ZW4gYSB0aW1lIHN0YW1wIHJlcHJlc2VudGluZywKK2ZvciBpbmNvbWluZyBwYWNrZXRzLCB0aGUgYXJyaXZhbCB0aW1lIG9mIHRoZSBwYWNrZXQgYW5kLCBmb3Igb3V0Z29pbmcKK3BhY2tldHMsIHRoZSB0cmFuc21pc3Npb24gdGltZSBvZiB0aGUgcGFja2V0LiAgVGhpcyB0aW1lIGlzIGFuCithcHByb3hpbWF0aW9uIG9mIHRoZSBhcnJpdmFsIG9yIHRyYW5zbWlzc2lvbiB0aW1lLiAgSWYgaXQgaXMgc3VwcGxpZWQgYnkKK3RoZSBvcGVyYXRpbmcgc3lzdGVtIHJ1bm5pbmcgb24gdGhlIGhvc3Qgb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMgYmVpbmcKK2RvbmUsIHRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgd2h5IGl0IG1pZ2h0IG5vdCBwcmVjaXNlbHkgcmVwcmVzZW50IHRoZQorYXJyaXZhbCBvciB0cmFuc21pc3Npb24gdGltZToKKy5JUAoraWYgdGhlIHRpbWUgc3RhbXAgaXMgYXBwbGllZCB0byB0aGUgcGFja2V0IHdoZW4gdGhlIG5ldHdvcmtpbmcgc3RhY2sKK3JlY2VpdmVzIHRoZSBwYWNrZXQsIHRoZSBuZXR3b3JraW5nIHN0YWNrIG1pZ2h0IG5vdCBzZWUgdGhlIHBhY2tldCB1bnRpbAorYW4gaW50ZXJydXB0IGlzIGRlbGl2ZXJlZCBmb3IgdGhlIHBhY2tldCBvciBhIHRpbWVyIGV2ZW50IGNhdXNlcyB0aGUKK25ldHdvcmtpbmcgZGV2aWNlIGRyaXZlciB0byBwb2xsIGZvciBwYWNrZXRzLCBhbmQgdGhlIHRpbWUgc3RhbXAgbWlnaHQKK25vdCBiZSBhcHBsaWVkIHVudGlsIHRoZSBwYWNrZXQgaGFzIGhhZCBzb21lIHByb2Nlc3NpbmcgZG9uZSBieSBvdGhlcgorY29kZSBpbiB0aGUgbmV0d29ya2luZyBzdGFjaywgc28gdGhlcmUgbWlnaHQgYmUgYSBzaWduaWZpY2FudCBkZWxheQorYmV0d2VlbiB0aGUgdGltZSB3aGVuIHRoZSBsYXN0IGJpdCBvZiB0aGUgcGFja2V0IGlzIHJlY2VpdmVkIGJ5IHRoZQorY2FwdHVyZSBkZXZpY2UgYW5kIHdoZW4gdGhlIG5ldHdvcmtpbmcgc3RhY2sgdGltZS1zdGFtcHMgdGhlIHBhY2tldDsKKy5JUAordGhlIHRpbWVyIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRpbWUgc3RhbXBzIG1pZ2h0IGhhdmUgbG93IHJlc29sdXRpb24sCitmb3IgZXhhbXBsZSwgaXQgbWlnaHQgYmUgYSB0aW1lciB1cGRhdGVkIG9uY2UgcGVyIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbQordGltZXIgdGljaywgd2l0aCB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtIHRpbWVyIHRpY2tpbmcgb25jZSBldmVyeSBmZXcKK21pbGxpc2Vjb25kczsKKy5JUAorYSBoaWdoLXJlc29sdXRpb24gdGltZXIgbWlnaHQgdXNlIGEgY291bnRlciB0aGF0IHJ1bnMgYXQgYSByYXRlCitkZXBlbmRlbnQgb24gdGhlIHByb2Nlc3NvciBjbG9jayBzcGVlZCwgYW5kIHRoYXQgY2xvY2sgc3BlZWQgbWlnaHQgYmUKK2FkanVzdGVkIHVwd2FyZHMgb3IgZG93bndhcmRzIG92ZXIgdGltZSBhbmQgdGhlIHRpbWVyIG1pZ2h0IG5vdCBiZSBhYmxlCit0byBjb21wZW5zYXRlIGZvciBhbGwgdGhvc2UgYWRqdXN0bWVudHM7CisuSVAKK3RoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0ncyBjbG9jayBtaWdodCBiZSBhZGp1c3RlZCBvdmVyIHRpbWUgdG8gbWF0Y2ggYQordGltZSBzdGFuZGFyZCB0byB3aGljaCB0aGUgaG9zdCBpcyBiZWluZyBzeW5jaHJvbml6ZWQsIHdoaWNoIG1pZ2h0IGJlCitkb25lIGJ5IHRlbXBvcmFyaWx5IHNsb3dpbmcgZG93biBvciBzcGVlZGluZyB1cCB0aGUgY2xvY2sgb3IgYnkgbWFraW5nIGEKK3NpbmdsZSBhZGp1c3RtZW50OworLklQCitkaWZmZXJlbnQgQ1BVIGNvcmVzIG9uIGEgbXVsdGktY29yZSBvciBtdWx0aS1wcm9jZXNzb3Igc3lzdGVtIG1pZ2h0IGJlCitydW5uaW5nIGF0IGRpZmZlcmVudCBzcGVlZHMsIG9yIG1pZ2h0IG5vdCBoYXZlIHRpbWUgY291bnRlcnMgYWxsCitzeW5jaHJvbml6ZWQsIHNvIHBhY2tldHMgdGltZS1zdGFtcGVkIGJ5IGRpZmZlcmVudCBjb3JlcyBtaWdodCBub3QgaGF2ZQorY29uc2lzdGVudCB0aW1lIHN0YW1wcy4KKy5MUAorSW4gYWRkaXRpb24sIHBhY2tldHMgdGltZS1zdGFtcGVkIGJ5IGRpZmZlcmVudCBjb3JlcyBtaWdodCBiZQordGltZS1zdGFtcGVkIGluIG9uZSBvcmRlciBhbmQgYWRkZWQgdG8gdGhlIHF1ZXVlIG9mIHBhY2tldHMgZm9yIGxpYnBjYXAKK3RvIHJlYWQgaW4gYW5vdGhlciBvcmRlciwgc28gdGltZSBzdGFtcHMgbWlnaHQgbm90IGJlIG1vbm90b25pY2FsbHkKK2luY3JlYXNpbmcuCisuTFAKK1NvbWUgY2FwdHVyZSBkZXZpY2VzIG9uIHNvbWUgcGxhdGZvcm1zIGNhbiBwcm92aWRlIHRpbWUgc3RhbXBzIGZvcgorcGFja2V0czsgdGhvc2UgdGltZSBzdGFtcHMgYXJlIHVzdWFsbHkgaGlnaC1yZXNvbHV0aW9uIHRpbWUgc3RhbXBzLCBhbmQKK2FyZSB1c3VhbGx5IGFwcGxpZWQgdG8gdGhlIHBhY2tldCB3aGVuIHRoZSBmaXJzdCBvciBsYXN0IGJpdCBvZiB0aGUKK3BhY2tldCBhcnJpdmVzLCBhbmQgYXJlIHRodXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRpbWUgc3RhbXBzIHByb3ZpZGVkIGJ5Cit0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtLiAgVGhvc2UgdGltZSBzdGFtcHMgbWlnaHQgbm90LCBob3dldmVyLCBiZQorc3luY2hyb25pemVkIHdpdGggdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbSdzIGNsb2NrLCBzbyB0aGF0LCBmb3IKK2V4YW1wbGUsIHRoZSB0aW1lIHN0YW1wIG9mIGEgcGFja2V0IG1pZ2h0IG5vdCBjb3JyZXNwb25kIHRvIHRoZSB0aW1lCitzdGFtcCBvZiBhbiBldmVudCBvbiB0aGUgaG9zdCB0cmlnZ2VyZWQgYnkgdGhlIGFycml2YWwgb2YgdGhhdCBwYWNrZXQuCisuTFAKK0RlcGVuZGluZyBvbiB0aGUgY2FwdHVyZSBkZXZpY2UgYW5kIHRoZSBzb2Z0d2FyZSBvbiB0aGUgaG9zdCwgbGlicGNhcAorbWlnaHQgYWxsb3cgZGlmZmVyZW50IHR5cGVzIG9mIHRpbWUgc3RhbXAgdG8gYmUgdXNlZC4gIFRoZQorLkJSIHBjYXBfbGlzdF90c3RhbXBfdHlwZXMgKDNQQ0FQKQorcm91dGluZSBwcm92aWRlcywgZm9yIGEgcGFja2V0IGNhcHR1cmUgaGFuZGxlIGNyZWF0ZWQgYnkKKy5CUiBwY2FwX2NyZWF0ZSAoM1BDQVApCitidXQgbm90IHlldCBhY3RpdmF0ZWQgYnkKKy5CUiBwY2FwX2FjdGl2YXRlICgzUENBUCksCithIGxpc3Qgb2YgdGltZSBzdGFtcCB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGNhcHR1cmUgZGV2aWNlIGZvciB0aGF0CitoYW5kbGUuCitUaGUgbGlzdCBtaWdodCBiZSBlbXB0eSwgaW4gd2hpY2ggY2FzZSBubyBjaG9pY2Ugb2YgdGltZSBzdGFtcCB0eXBlIGlzCitvZmZlcmVkIGZvciB0aGF0IGNhcHR1cmUgZGV2aWNlLiAgSWYgdGhlIGxpc3QgaXMgbm90IGVtcHR5LCB0aGUKKy5CUiBwY2FwX3NldF90c3RhbXBfdHlwZSAoM1BDQVApCityb3V0aW5lIGNhbiBiZSB1c2VkIGFmdGVyIGEKKy5CIHBjYXBfY3JlYXRlKCkKK2NhbGwgYW5kIGJlZm9yZSBhCisuQiBwY2FwX2FjdGl2YXRlKCkKK2NhbGwgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiB0aW1lIHN0YW1wIHRvIGJlIHVzZWQgb24gdGhlIGRldmljZS4KK1RoZSB0aW1lIHN0YW1wIHR5cGVzIGFyZSBsaXN0ZWQgaGVyZTsgdGhlIGZpcnN0IHZhbHVlIGlzIHRoZSAjZGVmaW5lIHRvCit1c2UgaW4gY29kZSwgdGhlIHNlY29uZCB2YWx1ZSBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKKy5CIHBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUoKQorYW5kIGFjY2VwdGVkIGJ5CisuQlIgcGNhcF90c3RhbXBfdHlwZV9uYW1lX3RvX3ZhbCgpIC4KKy5SUyA1CisuVFAgNQorLkJSIFBDQVBfVFNUQU1QX0hPU1QgIiAtICIgaG9zdAorVGltZSBzdGFtcCBwcm92aWRlZCBieSB0aGUgaG9zdCBvbiB3aGljaCB0aGUgY2FwdHVyZSBpcyBiZWluZyBkb25lLiAgVGhlCitwcmVjaXNpb24gb2YgdGhpcyB0aW1lIHN0YW1wIGlzIHVuc3BlY2lmaWVkOyBpdCBtaWdodCBvciBtaWdodCBub3QgYmUKK3N5bmNocm9uaXplZCB3aXRoIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0ncyBjbG9jay4KKy5UUCA1CisuQlIgUENBUF9UU1RBTVBfSE9TVF9MT1dQUkVDICIgLSAiIGhvc3RfbG93cHJlYworVGltZSBzdGFtcCBwcm92aWRlZCBieSB0aGUgaG9zdCBvbiB3aGljaCB0aGUgY2FwdHVyZSBpcyBiZWluZyBkb25lLgorVGhpcyBpcyBhIGxvdy1wcmVjaXNpb24gdGltZSBzdGFtcCwgc3luY2hyb25pemVkIHdpdGggdGhlIGhvc3Qgb3BlcmF0aW5nCitzeXN0ZW0ncyBjbG9jay4KKy5UUCA1CisuQlIgUENBUF9UU1RBTVBfSE9TVF9ISVBSRUMgIiAtICIgaG9zdF9oaXByZWMKK1RpbWUgc3RhbXAgcHJvdmlkZWQgYnkgdGhlIGhvc3Qgb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMgYmVpbmcgZG9uZS4KK1RoaXMgaXMgYSBoaWdoLXByZWNpc2lvbiB0aW1lIHN0YW1wOyBpdCBtaWdodCBvciBtaWdodCBub3QgYmUKK3N5bmNocm9uaXplZCB3aXRoIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0ncyBjbG9jay4gIEl0IG1pZ2h0IGJlIG1vcmUKK2V4cGVuc2l2ZSB0byBmZXRjaCB0aGFuCisuQlIgUENBUF9UU1RBTVBfSE9TVF9MT1dQUkVDIC4KKy5UUCA1CisuQlIgUENBUF9UU1RBTVBfQURBUFRFUiAiIC0gIiBhZGFwdGVyCitUaW1lIHN0YW1wIHByb3ZpZGVkIGJ5IHRoZSBuZXR3b3JrIGFkYXB0ZXIgb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMgYmVpbmcKK2RvbmUuICBUaGlzIGlzIGEgaGlnaC1wcmVjaXNpb24gdGltZSBzdGFtcCwgc3luY2hyb25pemVkIHdpdGggdGhlIGhvc3QKK29wZXJhdGluZyBzeXN0ZW0ncyBjbG9jay4KKy5UUCA1CisuQlIgUENBUF9UU1RBTVBfQURBUFRFUl9VTlNZTkNFRCAiIC0gIiBhZGFwdGVyX3Vuc3luY2VkCitUaW1lIHN0YW1wIHByb3ZpZGVkIGJ5IHRoZSBuZXR3b3JrIGFkYXB0ZXIgb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMgYmVpbmcKK2RvbmUuICBUaGlzIGlzIGEgaGlnaC1wcmVjaXNpb24gdGltZSBzdGFtcDsgaXQgaXMgbm90IHN5bmNocm9uaXplZCB3aXRoCit0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtJ3MgY2xvY2suCisuUkUKKy5MUAorQnkgZGVmYXVsdCwgd2hlbiBwZXJmb3JtaW5nIGEgbGl2ZSBjYXB0dXJlIG9yIHJlYWRpbmcgZnJvbSBhIHNhdmVmaWxlLAordGltZSBzdGFtcHMgYXJlIHN1cHBsaWVkIGFzIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwLCAwMDowMDowMCBVVEMsCithbmQgbWljcm9zZWNvbmRzIHNpbmNlIHRoYXQgc2Vjb25kcyB2YWx1ZSwgZXZlbiBpZiBoaWdoZXItcmVzb2x1dGlvbgordGltZSBzdGFtcHMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBjYXB0dXJlIGRldmljZSBvciBpbiB0aGUgc2F2ZWZpbGUuCitJZiwgd2hlbiByZWFkaW5nIGEgc2F2ZWZpbGUsIHRoZSB0aW1lIHN0YW1wcyBpbiB0aGUgZmlsZSBoYXZlIGEgaGlnaGVyCityZXNvbHV0aW9uIHRoYW4gb25lIG1pY3Jvc2Vjb25kLCB0aGUgYWRkaXRpb25hbCBkaWdpdHMgb2YgcmVzb2x1dGlvbiBhcmUKK2Rpc2NhcmRlZC4KKy5MUAorVGhlCisuQlIgcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbiAoM1BDQVApCityb3V0aW5lIGNhbiBiZSB1c2VkIGFmdGVyIGEKKy5CIHBjYXBfY3JlYXRlKCkKK2NhbGwgYW5kIGFmdGVyIGEKKy5CIHBjYXBfYWN0aXZhdGUoKQorY2FsbCB0byBzcGVjaWZ5IHRoZSByZXNvbHV0aW9uIG9mIHRoZSB0aW1lIHN0YW1wcyB0byBnZXQgZm9yIHRoZSBkZXZpY2UuCitJZiB0aGUgaGFyZHdhcmUgb3Igc29mdHdhcmUgY2Fubm90IHN1cHBseSBhIGhpZ2hlci1yZXNvbHV0aW9uIHRpbWUKK3N0YW1wLCB0aGUKKy5CIHBjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24oKQorY2FsbCB3aWxsIGZhaWwsIGFuZCB0aGUgdGltZSBzdGFtcHMgc3VwcGxpZWQgYWZ0ZXIgdGhlCisuQiBwY2FwX2FjdGl2YXRlKCkKK2NhbGwgd2lsbCBoYXZlIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24uCisuTFAKK1doZW4gb3BlbmluZyBhIHNhdmVmaWxlLCB0aGUKKy5CUiBwY2FwX29wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24gKDNQQ0FQKQorYW5kCisuQlIgcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbiAoM1BDQVApCityb3V0aW5lcyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSByZXNvbHV0aW9uIG9mIHRpbWUgc3RhbXBzIHRvIGJlIHJlYWQKK2Zyb20gdGhlIGZpbGU7IGlmIHRoZSB0aW1lIHN0YW1wcyBpbiB0aGUgZmlsZSBoYXZlIGEgbG93ZXIgcmVzb2x1dGlvbiwKK3RoZSBmcmFjdGlvbi1vZi1hLXNlY29uZCBwb3J0aW9uIG9mIHRoZSB0aW1lIHN0YW1wcyB3aWxsIGJlIHNjYWxlZCB0bwordGhlIHNwZWNpZmllZCByZXNvbHV0aW9uLgorLkxQCitUaGUKKy5CUiBwY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uICgzUENBUCkKK3JvdXRpbmUgcmV0dXJucyB0aGUgcmVzb2x1dGlvbiBvZiB0aW1lIHN0YW1wcyB0aGF0IHdpbGwgYmUgc3VwcGxpZWQ7Cit3aGVuIGNhcHR1cmluZyBwYWNrZXRzLCB0aGlzIGRvZXMgbm90IHJlZmxlY3QgdGhlIGFjdHVhbCBwcmVjaXNpb24gb2YKK3RoZSB0aW1lIHN0YW1wIHN1cHBsaWVkIGJ5IHRoZSBoYXJkd2FyZSBvciBvcGVyYXRpbmcgc3lzdGVtIGFuZCwgd2hlbgorcmVhZGluZyBhIHNhdmVmaWxlLCB0aGlzIGRvZXMgbm90IGluZGljYXRlIHRoZSBhY3R1YWwgcHJlY2lzaW9uIG9mIHRpbWUKK3N0YW1wcyBpbiB0aGUgZmlsZS4KKy5TSCBTRUUgQUxTTworcGNhcF9zZXRfdHN0YW1wX3R5cGUoM1BDQVApLAorcGNhcF9saXN0X3RzdGFtcF90eXBlcygzUENBUCksCitwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lKDNQQ0FQKSwKK3BjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwoM1BDQVApLAorcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbigzUENBUCksCitwY2FwX29wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oM1BDQVApLAorcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbigzUENBUCksCitwY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcC10c3RhbXAubWFubWlzYy5pbiBiL3BjYXAtdHN0YW1wLm1hbm1pc2MuaW4KaW5kZXggNzRhOWEzNS4uMmUxZWY2MSAxMDA2NDQKLS0tIGEvcGNhcC10c3RhbXAubWFubWlzYy5pbgorKysgYi9wY2FwLXRzdGFtcC5tYW5taXNjLmluCkBAIC0xOSw3ICsxOSw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUC1UU1RBTVAgQE1BTl9NSVNDX0lORk9AICIyMSBEZWNlbWJlciAyMDEzIgorLlRIIFBDQVAtVFNUQU1QIEBNQU5fTUlTQ19JTkZPQCAiOCBNYXJjaCAyMDE1IgogLlNIIE5BTUUKIHBjYXAtdHN0YW1wIFwtIHBhY2tldCB0aW1lIHN0YW1wcyBpbiBsaWJwY2FwCiAuU0ggREVTQ1JJUFRJT04KZGlmZiAtLWdpdCBhL3BjYXAtdXNiLWxpbnV4LmMgYi9wY2FwLXVzYi1saW51eC5jCmluZGV4IDk1NzI3M2EuLmZiMTE4OGEgMTAwNjQ0Ci0tLSBhL3BjYXAtdXNiLWxpbnV4LmMKKysrIGIvcGNhcC11c2ItbGludXguYwpAQCAtMTQ0LDggKzE0NCw4IEBACiB7CiAJY2hhciBkZXZfbmFtZVsxMF07CiAJY2hhciBkZXZfZGVzY3JbMzBdOwotCXNucHJpbnRmKGRldl9uYW1lLCAxMCwgVVNCX0lGQUNFIiVkIiwgbik7Ci0Jc25wcmludGYoZGV2X2Rlc2NyLCAzMCwgIlVTQiBidXMgbnVtYmVyICVkIiwgbik7CisJcGNhcF9zbnByaW50ZihkZXZfbmFtZSwgMTAsIFVTQl9JRkFDRSIlZCIsIG4pOworCXBjYXBfc25wcmludGYoZGV2X2Rlc2NyLCAzMCwgIlVTQiBidXMgbnVtYmVyICVkIiwgbik7CiAKIAlpZiAocGNhcF9hZGRfaWYoYWxsZGV2c3AsIGRldl9uYW1lLCAwLAogCSAgICBkZXZfZGVzY3IsIGVycl9zdHIpIDwgMCkKQEAgLTE1Niw2ICsxNTYsNyBAQAogaW50CiB1c2JfZmluZGFsbGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycl9zdHIpCiB7CisJaW50IGZkOwogCXN0cnVjdCBkaXJlbnQqIGRhdGE7CiAJaW50IHJldCA9IDA7CiAJRElSKiBkaXI7CkBAIC0xNjMsNyArMTY0LDQ2IEBACiAJY2hhciogbmFtZTsKIAlzaXplX3QgbGVuOwogCi0JLyogdHJ5IHNjYW5uaW5nIHN5c2ZzIHVzYiBidXMgZGlyZWN0b3J5ICovCisJLyoKKwkgKiBEbyB3ZSBoYXZlIGEgInNjYW4gYWxsIGJ1c2VzIiBkZXZpY2U/CisJICogRmlyc3QsIHRyeSB0aGUgYmluYXJ5IGRldmljZS4KKwkgKi8KKwlmZCA9IG9wZW4oTElOVVhfVVNCX01PTl9ERVYiMCIsIE9fUkRPTkxZLCAwKTsKKwlpZiAoZmQgPj0gMCkgeworCQkvKgorCQkgKiBZZXMuCisJCSAqLworCQljbG9zZShmZCk7CisJCWlmIChwY2FwX2FkZF9pZihhbGxkZXZzcCwgInVzYm1vbjAiLCAwLCAiQWxsIFVTQiBidXNlcyIsCisJCSAgICBlcnJfc3RyKSA8IDApCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTm8gYmluYXJ5IGRldmljZTsgZG8gd2UgaGF2ZSB0aGUgdGV4dCBkZXZpY2U/CisJCSAqLworCQlmZCA9IG9wZW4oVVNCX1RFWFRfRElSIi8wdCIsIE9fUkRPTkxZLCAwKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJLyoKKwkJCSAqIE5vdCBhdCB0aGUgbmV3IGxvY2F0aW9uOyB0cnkgdGhlIG9sZCBsb2NhdGlvbi4KKwkJCSAqLworCQkJZmQgPSBvcGVuKFVTQl9URVhUX0RJUl9PTEQiLzB0IiwgT19SRE9OTFksIDApOworCQl9CisJCWlmIChmZCA+PSAwKSB7CisJCQkvKgorCQkJICogV2UgZm91bmQgaXQuCisJCQkgKi8KKwkJCWNsb3NlKGZkKTsKKwkJCWlmIChwY2FwX2FkZF9pZihhbGxkZXZzcCwgInVzYm1vbjAiLCAwLCAiQWxsIFVTQiBidXNlcyIsCisJCQkgICAgZXJyX3N0cikgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qCisJICogTm93IGxvb2sgZm9yIGluZGl2aWR1YWwgVVNCIGJ1c2VzLgorCSAqCisJICogRmlyc3QsIHRyeSBzY2FubmluZyBzeXNmcyBVU0IgYnVzIGRpcmVjdG9yeS4KKwkgKi8KIAlkaXIgPSBvcGVuZGlyKFNZU19VU0JfQlVTX0RJUik7CiAJaWYgKGRpciAhPSBOVUxMKSB7CiAJCXdoaWxlICgocmV0ID09IDApICYmICgoZGF0YSA9IHJlYWRkaXIoZGlyKSkgIT0gMCkpIHsKQEAgLTE4Miw3ICsyMjIsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIHRoYXQgZGlkbid0IHdvcms7IHRyeSBzY2FubmluZyBwcm9jZnMgdXNiIGJ1cyBkaXJlY3RvcnkgKi8KKwkvKiBUaGF0IGRpZG4ndCB3b3JrOyB0cnkgc2Nhbm5pbmcgcHJvY2ZzIFVTQiBidXMgZGlyZWN0b3J5LiAqLwogCWRpciA9IG9wZW5kaXIoUFJPQ19VU0JfQlVTX0RJUik7CiAJaWYgKGRpciAhPSBOVUxMKSB7CiAJCXdoaWxlICgocmV0ID09IDApICYmICgoZGF0YSA9IHJlYWRkaXIoZGlyKSkgIT0gMCkpIHsKQEAgLTI0Nyw3ICsyODcsNyBAQAogCURJUiogZGlyOwogCiAJLyogc2NhbiB1c2IgYnVzIGRpcmVjdG9yaWVzIGZvciBkZXZpY2Ugbm9kZXMgKi8KLQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiL2Rldi9idXMvdXNiLyUwM2QiLCBidXMpOworCXBjYXBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIi9kZXYvYnVzL3VzYi8lMDNkIiwgYnVzKTsKIAlkaXIgPSBvcGVuZGlyKGJ1Zik7CiAJaWYgKCFkaXIpCiAJCXJldHVybjsKQEAgLTI1OSw3ICsyOTksNyBAQAogCQlpZiAobmFtZVswXSA9PSAnLicpCiAJCQljb250aW51ZTsKIAotCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiL2Rldi9idXMvdXNiLyUwM2QvJXMiLCBidXMsIGRhdGEtPmRfbmFtZSk7CisJCXBjYXBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIi9kZXYvYnVzL3VzYi8lMDNkLyVzIiwgYnVzLCBkYXRhLT5kX25hbWUpOwogCiAJCWZkID0gb3BlbihidWYsIE9fUkRXUik7CiAJCWlmIChmZCA9PSAtMSkKQEAgLTMyOCw3ICszNjgsNyBAQAogCS8qIE9LLCBpdCdzIHByb2JhYmx5IG91cnMuICovCiAJKmlzX291cnMgPSAxOwogCi0JcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYsIHNpemVvZiAoc3RydWN0IHBjYXBfdXNiX2xpbnV4KSk7CisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3VzYl9saW51eCkpOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiAoTlVMTCk7CiAKQEAgLTM1NSwxNSArMzk1LDE1IEBACiAJaGFuZGxlLT5zZXRub25ibG9ja19vcCA9IHBjYXBfc2V0bm9uYmxvY2tfZmQ7CiAKIAkvKmdldCB1c2IgYnVzIGluZGV4IGZyb20gZGV2aWNlIG5hbWUgKi8KLQlpZiAoc3NjYW5mKGhhbmRsZS0+b3B0LnNvdXJjZSwgVVNCX0lGQUNFIiVkIiwgJmhhbmRsZXAtPmJ1c19pbmRleCkgIT0gMSkKKwlpZiAoc3NjYW5mKGhhbmRsZS0+b3B0LmRldmljZSwgVVNCX0lGQUNFIiVkIiwgJmhhbmRsZXAtPmJ1c19pbmRleCkgIT0gMSkKIAl7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJIkNhbid0IGdldCBVU0IgYnVzIGluZGV4IGZyb20gJXMiLCBoYW5kbGUtPm9wdC5zb3VyY2UpOworCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJIkNhbid0IGdldCBVU0IgYnVzIGluZGV4IGZyb20gJXMiLCBoYW5kbGUtPm9wdC5kZXZpY2UpOwogCQlyZXR1cm4gUENBUF9FUlJPUjsKIAl9CiAKIAkvKm5vdyBzZWxlY3QgdGhlIHJlYWQgbWV0aG9kOiB0cnkgdG8gb3BlbiBiaW5hcnkgaW50ZXJmYWNlICovCi0Jc25wcmludGYoZnVsbF9wYXRoLCBVU0JfTElORV9MRU4sIExJTlVYX1VTQl9NT05fREVWIiVkIiwgaGFuZGxlcC0+YnVzX2luZGV4KTsKKwlwY2FwX3NucHJpbnRmKGZ1bGxfcGF0aCwgVVNCX0xJTkVfTEVOLCBMSU5VWF9VU0JfTU9OX0RFViIlZCIsIGhhbmRsZXAtPmJ1c19pbmRleCk7CiAJaGFuZGxlLT5mZCA9IG9wZW4oZnVsbF9wYXRoLCBPX1JET05MWSwgMCk7CiAJaWYgKGhhbmRsZS0+ZmQgPj0gMCkKIAl7CkBAIC00MDIsNyArNDQyLDcgQEAKIAl9CiAJZWxzZSB7CiAJCS8qQmluYXJ5IGludGVyZmFjZSBub3QgYXZhaWxhYmxlLCB0cnkgb3BlbiB0ZXh0IGludGVyZmFjZSAqLwotCQlzbnByaW50ZihmdWxsX3BhdGgsIFVTQl9MSU5FX0xFTiwgVVNCX1RFWFRfRElSIi8lZHQiLCBoYW5kbGVwLT5idXNfaW5kZXgpOworCQlwY2FwX3NucHJpbnRmKGZ1bGxfcGF0aCwgVVNCX0xJTkVfTEVOLCBVU0JfVEVYVF9ESVIiLyVkdCIsIGhhbmRsZXAtPmJ1c19pbmRleCk7CiAJCWhhbmRsZS0+ZmQgPSBvcGVuKGZ1bGxfcGF0aCwgT19SRE9OTFksIDApOwogCQlpZiAoaGFuZGxlLT5mZCA8IDApCiAJCXsKQEAgLTQxMiwxMiArNDUyLDEyIEBACiAJCQkJICogTm90IGZvdW5kIGF0IHRoZSBuZXcgbG9jYXRpb247IHRyeQogCQkJCSAqIHRoZSBvbGQgbG9jYXRpb24uCiAJCQkJICovCi0JCQkJc25wcmludGYoZnVsbF9wYXRoLCBVU0JfTElORV9MRU4sIFVTQl9URVhUX0RJUl9PTEQiLyVkdCIsIGhhbmRsZXAtPmJ1c19pbmRleCk7CisJCQkJcGNhcF9zbnByaW50ZihmdWxsX3BhdGgsIFVTQl9MSU5FX0xFTiwgVVNCX1RFWFRfRElSX09MRCIvJWR0IiwgaGFuZGxlcC0+YnVzX2luZGV4KTsKIAkJCQloYW5kbGUtPmZkID0gb3BlbihmdWxsX3BhdGgsIE9fUkRPTkxZLCAwKTsKIAkJCX0KIAkJCWlmIChoYW5kbGUtPmZkIDwgMCkgewogCQkJCS8qIG5vIG1vcmUgZmFsbGJhY2ssIGdpdmUgaXQgdXAqLwotCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJCSJDYW4ndCBvcGVuIFVTQiBidXMgZmlsZSAlczogJXMiLCBmdWxsX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CiAJCQkJcmV0dXJuIFBDQVBfRVJST1I7CiAJCQl9CkBAIC00NDUsNyArNDg1LDcgQEAKIAkgKiBidWZmZXIgKi8KIAloYW5kbGUtPmJ1ZmZlciA9IG1hbGxvYyhoYW5kbGUtPmJ1ZnNpemUpOwogCWlmICghaGFuZGxlLT5idWZmZXIpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCWNsb3NlKGhhbmRsZS0+ZmQpOwogCQlyZXR1cm4gUENBUF9FUlJPUjsKQEAgLTQ5Niw3ICs1MzYsNyBAQAogCQlpZiAoZXJybm8gPT0gRUFHQUlOKQogCQkJcmV0dXJuIDA7CS8qIG5vIGRhdGEgdGhlcmUgKi8KIAotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJDYW4ndCByZWFkIGZyb20gZmQgJWQ6ICVzIiwgaGFuZGxlLT5mZCwgc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTUwOSw3ICs1NDksNyBAQAogCQkmY250KTsKIAlpZiAocmV0IDwgOCkKIAl7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIkNhbid0IHBhcnNlIFVTQiBidXMgbWVzc2FnZSAnJXMnLCB0b28gZmV3IHRva2VucyAoZXhwZWN0ZWQgOCBnb3QgJWQpIiwKIAkJICAgIHN0cmluZywgcmV0KTsKIAkJcmV0dXJuIC0xOwpAQCAtNTIzLDcgKzU2Myw3IEBACiAJLyogZG9uJ3QgdXNlIHVzYm1vbiBwcm92aWRlZCB0aW1lc3RhbXAsIHNpbmNlIGl0IGhhdmUgbG93IHByZWNpc2lvbiovCiAJaWYgKGdldHRpbWVvZmRheSgmcGt0aC50cywgTlVMTCkgPCAwKQogCXsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkiQ2FuJ3QgZ2V0IHRpbWVzdGFtcCBmb3IgbWVzc2FnZSAnJXMnICVkOiVzIiwKIAkJCXN0cmluZywgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtMTsKQEAgLTU3NSw3ICs2MTUsNyBAQAogCQlzdHI1LCAmY250KTsKIAkJaWYgKHJldCA8IDUpCiAJCXsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkiQ2FuJ3QgcGFyc2UgVVNCIGJ1cyBtZXNzYWdlICclcycsIHRvbyBmZXcgdG9rZW5zIChleHBlY3RlZCA1IGdvdCAlZCkiLAogCQkJCXN0cmluZywgcmV0KTsKIAkJCXJldHVybiAtMTsKQEAgLTU5OSw3ICs2MzksNyBAQAogCXJldCA9IHNzY2FuZihzdHJpbmcsICIgJWQlbiIsICZ1cmJfbGVuLCAmY250KTsKIAlpZiAocmV0IDwgMSkKIAl7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICJDYW4ndCBwYXJzZSB1cmIgbGVuZ3RoIGZyb20gJyVzJyIsIHN0cmluZyk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC02MTcsNyArNjU3LDcgQEAKIAkvKiBjaGVjayBmb3IgZGF0YSBwcmVzZW5jZTsgZGF0YSBpcyBwcmVzZW50IGlmIGFuZCBvbmx5IGlmIHVyYiB0YWcgaXMgJz0nICovCiAJaWYgKHNzY2FuZihzdHJpbmcsICIgJWMiLCAmdXJiX3RhZykgIT0gMSkKIAl7Ci0JCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJIkNhbid0IHBhcnNlIHVyYiB0YWcgZnJvbSAnJXMnIiwgc3RyaW5nKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTYzNiw3ICs2NzYsNyBAQAogCSAqIGEgcGFydGlhbCBpbmZvcm1hdGlvbi4KIAkgKiBBdCBsZWFzdCB1bnRpbCBsaW51eCAyLjYuMTcgdGhlcmUgaXMgbm8gd2F5IHRvIHNldCB1c2Jtb24gaW50ZW5hbCBidWZmZXIKIAkgKiBsZW5ndGggYW5kIGRlZmF1bHQgdmFsdWUgaXMgMTMwLiAqLwotCXdoaWxlICgoc3RyaW5nWzBdICE9IDApICYmIChzdHJpbmdbMV0gIT0gMCkgJiYgKHBrdGguY2FwbGVuIDwgaGFuZGxlLT5zbmFwc2hvdCkpCisJd2hpbGUgKChzdHJpbmdbMF0gIT0gMCkgJiYgKHN0cmluZ1sxXSAhPSAwKSAmJiAocGt0aC5jYXBsZW4gPCAoYnBmX3VfaW50MzIpaGFuZGxlLT5zbmFwc2hvdCkpCiAJewogCQlyYXdkYXRhWzBdID0gYXNjaWlfdG9faW50KHN0cmluZ1swXSkgKiAxNiArIGFzY2lpX3RvX2ludChzdHJpbmdbMV0pOwogCQlyYXdkYXRhKys7CkBAIC02NDksOCArNjg5LDggQEAKIAogZ290OgogCXVoZHItPmRhdGFfbGVuID0gZGF0YV9sZW47Ci0JaWYgKHBrdGguY2FwbGVuID4gaGFuZGxlLT5zbmFwc2hvdCkKLQkJcGt0aC5jYXBsZW4gPSBoYW5kbGUtPnNuYXBzaG90OworCWlmIChwa3RoLmNhcGxlbiA+IChicGZfdV9pbnQzMiloYW5kbGUtPnNuYXBzaG90KQorCQlwa3RoLmNhcGxlbiA9IChicGZfdV9pbnQzMiloYW5kbGUtPnNuYXBzaG90OwogCiAJaWYgKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMgPT0gTlVMTCB8fAogCSAgICBicGZfZmlsdGVyKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMsIGhhbmRsZS0+YnVmZmVyLApAQCAtNjY1LDcgKzcwNSw3IEBACiBzdGF0aWMgaW50CiB1c2JfaW5qZWN0X2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKQogewotCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiaW5qZWN0IG5vdCBzdXBwb3J0ZWQgb24gIgorCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJpbmplY3Qgbm90IHN1cHBvcnRlZCBvbiAiCiAJCSJVU0IgZGV2aWNlcyIpOwogCXJldHVybiAoLTEpOwogfQpAQCAtNjgwLDcgKzcyMCw3IEBACiAJY2hhciAqIHB0ciA9IHN0cmluZzsKIAlpbnQgZmQ7CiAKLQlzbnByaW50ZihzdHJpbmcsIFVTQl9MSU5FX0xFTiwgVVNCX1RFWFRfRElSIi8lZHMiLCBoYW5kbGVwLT5idXNfaW5kZXgpOworCXBjYXBfc25wcmludGYoc3RyaW5nLCBVU0JfTElORV9MRU4sIFVTQl9URVhUX0RJUiIvJWRzIiwgaGFuZGxlcC0+YnVzX2luZGV4KTsKIAlmZCA9IG9wZW4oc3RyaW5nLCBPX1JET05MWSwgMCk7CiAJaWYgKGZkIDwgMCkKIAl7CkBAIC02OTAsMTEgKzczMCwxMSBAQAogCQkJICogTm90IGZvdW5kIGF0IHRoZSBuZXcgbG9jYXRpb247IHRyeSB0aGUgb2xkCiAJCQkgKiBsb2NhdGlvbi4KIAkJCSAqLwotCQkJc25wcmludGYoc3RyaW5nLCBVU0JfTElORV9MRU4sIFVTQl9URVhUX0RJUl9PTEQiLyVkcyIsIGhhbmRsZXAtPmJ1c19pbmRleCk7CisJCQlwY2FwX3NucHJpbnRmKHN0cmluZywgVVNCX0xJTkVfTEVOLCBVU0JfVEVYVF9ESVJfT0xEIi8lZHMiLCBoYW5kbGVwLT5idXNfaW5kZXgpOwogCQkJZmQgPSBvcGVuKHN0cmluZywgT19SRE9OTFksIDApOwogCQl9CiAJCWlmIChmZCA8IDApIHsKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkiQ2FuJ3Qgb3BlbiBVU0Igc3RhdHMgZmlsZSAlczogJXMiLAogCQkJCXN0cmluZywgc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAtMTsKQEAgLTcwOSw3ICs3NDksNyBAQAogCiAJaWYgKHJldCA8IDApCiAJewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSJDYW4ndCByZWFkIHN0YXRzIGZyb20gZmQgJWQgIiwgZmQpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNzYzLDcgKzgwMyw3IEBACiAJcmV0ID0gaW9jdGwoaGFuZGxlLT5mZCwgTU9OX0lPQ0dfU1RBVFMsICZzdCk7CiAJaWYgKHJldCA8IDApCiAJewotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSJDYW4ndCByZWFkIHN0YXRzIGZyb20gZmQgJWQ6JXMgIiwgaGFuZGxlLT5mZCwgc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTc4NSwxMSArODI1LDExIEBACiAJc3RydWN0IG1vbl9iaW5fZ2V0IGluZm87CiAJaW50IHJldDsKIAlzdHJ1Y3QgcGNhcF9wa3RoZHIgcGt0aDsKLQlpbnQgY2xlbiA9IGhhbmRsZS0+c25hcHNob3QgLSBzaXplb2YocGNhcF91c2JfaGVhZGVyKTsKKwl1X2ludCBjbGVuID0gaGFuZGxlLT5zbmFwc2hvdCAtIHNpemVvZihwY2FwX3VzYl9oZWFkZXIpOwogCiAJLyogdGhlIHVzYiBoZWFkZXIgaXMgZ29pbmcgdG8gYmUgcGFydCBvZiAncGFja2V0JyBkYXRhKi8KIAlpbmZvLmhkciA9IChwY2FwX3VzYl9oZWFkZXIqKSBoYW5kbGUtPmJ1ZmZlcjsKLQlpbmZvLmRhdGEgPSBoYW5kbGUtPmJ1ZmZlciArIHNpemVvZihwY2FwX3VzYl9oZWFkZXIpOworCWluZm8uZGF0YSA9ICh1X2NoYXIgKiloYW5kbGUtPmJ1ZmZlciArIHNpemVvZihwY2FwX3VzYl9oZWFkZXIpOwogCWluZm8uZGF0YV9sZW4gPSBjbGVuOwogCiAJLyogaWdub3JlIGludGVycnVwdCBzeXN0ZW0gY2FsbCBlcnJvcnMgKi8KQEAgLTgwNiw3ICs4NDYsNyBAQAogCQlpZiAoZXJybm8gPT0gRUFHQUlOKQogCQkJcmV0dXJuIDA7CS8qIG5vIGRhdGEgdGhlcmUgKi8KIAotCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJDYW4ndCByZWFkIGZyb20gZmQgJWQ6ICVzIiwgaGFuZGxlLT5mZCwgc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTg0Nyw3ICs4ODcsNyBAQAogCXBjYXBfdXNiX2hlYWRlciogaGRyOwogCWludCBuZmx1c2ggPSAwOwogCWludCBwYWNrZXRzID0gMDsKLQlpbnQgY2xlbiwgbWF4X2NsZW47CisJdV9pbnQgY2xlbiwgbWF4X2NsZW47CiAKIAltYXhfY2xlbiA9IGhhbmRsZS0+c25hcHNob3QgLSBzaXplb2YocGNhcF91c2JfaGVhZGVyKTsKIApAQCAtODc3LDcgKzkxNyw3IEBACiAJCQlpZiAoZXJybm8gPT0gRUFHQUlOKQogCQkJCXJldHVybiAwOwkvKiBubyBkYXRhIHRoZXJlICovCiAKLQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiQ2FuJ3QgbWZldGNoIGZkICVkOiAlcyIsIGhhbmRsZS0+ZmQsIHN0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTkxOCw3ICs5NTgsNyBAQAogCiAJLyogZmx1c2ggcGVuZGluZyBldmVudHMqLwogCWlmIChpb2N0bChoYW5kbGUtPmZkLCBNT05fSU9DSF9NRkxVU0gsIG5mbHVzaCkgPT0gLTEpIHsKLQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiQ2FuJ3QgbWZsdXNoIGZkICVkOiAlcyIsIGhhbmRsZS0+ZmQsIHN0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAtMTsKIAl9CmRpZmYgLS1naXQgYS9wY2FwLXdpbjMyLmMgYi9wY2FwLXdpbjMyLmMKaW5kZXggZjQ0OWY3OS4uZDk5ODYzNyAxMDA2NDQKLS0tIGEvcGNhcC13aW4zMi5jCisrKyBiL3BjYXAtd2luMzIuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgLSAyMDA1IE5ldEdyb3VwLCBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gKEl0YWx5KQotICogQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAwOCBDQUNFIFRlY2hub2xvZ2llcywgRGF2aXMgKENhbGlmb3JuaWEpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDEwIENBQ0UgVGVjaG5vbG9naWVzLCBEYXZpcyAoQ2FsaWZvcm5pYSkKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMSw4ICszMSwxMCBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8cGNhcC1pbnQuaD4KKyNkZWZpbmUgUENBUF9ET05UX0lOQ0xVREVfUENBUF9CUEZfSAogI2luY2x1ZGUgPFBhY2tldDMyLmg+CisjaW5jbHVkZSA8cGNhcC1pbnQuaD4KKyNpbmNsdWRlIDxwY2FwL2RsdC5oPgogI2lmZGVmIF9fTUlOR1czMl9fCiAjaWZkZWYgX19NSU5HVzY0X18KICNpbmNsdWRlIDxudGRkbmRpcy5oPgpAQCAtNTEsNiArNTMsOSBAQAogaW50KiBfZXJybm8oKTsKICNkZWZpbmUgZXJybm8gKCpfZXJybm8oKSkKICNlbmRpZiAvKiBfX01JTkdXMzJfXyAqLworI2lmZGVmIEhBVkVfUkVNT1RFCisjaW5jbHVkZSAicGNhcC1ycGNhcC5oIgorI2VuZGlmIC8qIEhBVkVfUkVNT1RFICovCiAKIHN0YXRpYyBpbnQgcGNhcF9zZXRmaWx0ZXJfd2luMzJfbnBmKHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7CiBzdGF0aWMgaW50IHBjYXBfc2V0ZmlsdGVyX3dpbjMyX2RhZyhwY2FwX3QgKiwgc3RydWN0IGJwZl9wcm9ncmFtICopOwpAQCAtNzEsNDUgKzc2LDY0IEBACiAgKi8KIHN0cnVjdCBwY2FwX3dpbiB7CiAJaW50IG5vbmJsb2NrOwotCi0JaW50IGZpbHRlcmluZ19pbl9rZXJuZWw7IC8qIHVzaW5nIGtlcm5lbCBmaWx0ZXIgKi8KKwlpbnQgcmZtb25fc2VsZnN0YXJ0OwkJLyogYSBmbGFnIHRlbGxzIHdoZXRoZXIgdGhlIG1vbml0b3IgbW9kZSBpcyBzZXQgYnkgaXRzZWxmICovCisJaW50IGZpbHRlcmluZ19pbl9rZXJuZWw7CS8qIHVzaW5nIGtlcm5lbCBmaWx0ZXIgKi8KIAogI2lmZGVmIEhBVkVfREFHX0FQSQotCWludAlkYWdfZmNzX2JpdHM7CS8qIE51bWJlciBvZiBjaGVja3N1bSBiaXRzIGZyb20gbGluayBsYXllciAqLworCWludAlkYWdfZmNzX2JpdHM7CQkvKiBOdW1iZXIgb2YgY2hlY2tzdW0gYml0cyBmcm9tIGxpbmsgbGF5ZXIgKi8KICNlbmRpZgogfTsKIAotLyoKLSAqIEhlYWRlciB0aGF0IHRoZSBXaW5QY2FwIGRyaXZlciBhc3NvY2lhdGVzIHRvIHRoZSBwYWNrZXRzLgotICogT25jZSB3YXMgaW4gYnBmLmgKLSAqLwotc3RydWN0IGJwZl9oZHIgewotCXN0cnVjdCB0aW1ldmFsCWJoX3RzdGFtcDsJLyogdGltZSBzdGFtcCAqLwotCWJwZl91X2ludDMyCWJoX2NhcGxlbjsJLyogbGVuZ3RoIG9mIGNhcHR1cmVkIHBvcnRpb24gKi8KLQlicGZfdV9pbnQzMgliaF9kYXRhbGVuOwkvKiBvcmlnaW5hbCBsZW5ndGggb2YgcGFja2V0ICovCi0JdV9zaG9ydAkJYmhfaGRybGVuOwkvKiBsZW5ndGggb2YgYnBmIGhlYWRlciAodGhpcyBzdHJ1Y3QKLQkJCQkJICAgcGx1cyBhbGlnbm1lbnQgcGFkZGluZykgKi8KLX07Ci0KLUNSSVRJQ0FMX1NFQ1RJT04gZ19QY2FwQ29tcGlsZUNyaXRpY2FsU2VjdGlvbjsKLQogQk9PTCBXSU5BUEkgRGxsTWFpbigKICAgSEFORExFIGhpbnN0RExMLAogICBEV09SRCBkd1JlYXNvbiwKICAgTFBWT0lEIGxwdlJlc2VydmVkCiApCiB7Ci0JaWYgKGR3UmVhc29uID09IERMTF9QUk9DRVNTX0FUVEFDSCkKLQl7Ci0JCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJmdfUGNhcENvbXBpbGVDcml0aWNhbFNlY3Rpb24pOwotCX0KLQotCXJldHVybiBUUlVFOworCXJldHVybiAoVFJVRSk7CiB9CiAKKy8qCisgKiBEZWZpbmUgc3R1YiB2ZXJzaW9ucyBvZiB0aGUgbW9uaXRvci1tb2RlIHN1cHBvcnQgcm91dGluZXMgaWYgdGhpcworICogaXNuJ3QgTnBjYXAuIEhBVkVfTlBDQVBfUEFDS0VUX0FQSSBpcyBkZWZpbmVkIGJ5IE5wY2FwIGJ1dCBub3QKKyAqIFdpblBjYXAuCisgKi8KKyNpZm5kZWYgSEFWRV9OUENBUF9QQUNLRVRfQVBJCitzdGF0aWMgaW50CitQYWNrZXRJc01vbml0b3JNb2RlU3VwcG9ydGVkKFBDSEFSIEFkYXB0ZXJOYW1lIF9VXykKK3sKKwkvKgorCSAqIFdlIGRvbid0IHN1cHBvcnQgbW9uaXRvciBtb2RlLgorCSAqLworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK1BhY2tldFNldE1vbml0b3JNb2RlKFBDSEFSIEFkYXB0ZXJOYW1lIF9VXywgaW50IG1vZGUgX1VfKQoreworCS8qCisJICogVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLCBhcyBQYWNrZXRJc01vbml0b3JNb2RlU3VwcG9ydGVkKCkKKwkgKiB3aWxsIHJldHVybiAwLCBtZWFuaW5nICJ3ZSBkb24ndCBzdXBwb3J0IG1vbml0b3IgbW9kZSwgc28KKwkgKiBkb24ndCB0cnkgdG8gdHVybiBpdCBvbiBvciBvZmYiLgorCSAqLworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK1BhY2tldEdldE1vbml0b3JNb2RlKFBDSEFSIEFkYXB0ZXJOYW1lIF9VXykKK3sKKwkvKgorCSAqIFRoaXMgc2hvdWxkIGZhaWwsIHNvIHRoYXQgcGNhcF9hY3RpdmF0ZV93aW4zMigpIHJldHVybnMKKwkgKiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUCBpZiBvdXIgY2FsbGVyIHJlcXVlc3RlZCBtb25pdG9yCisJICogbW9kZS4KKwkgKi8KKwlyZXR1cm4gKC0xKTsKK30KKyNlbmRpZgorCiAvKiBTdGFydCB3aW5zb2NrICovCiBpbnQKLXdzb2NraW5pdCgpCit3c29ja2luaXQodm9pZCkKIHsKIAlXT1JEIHdWZXJzaW9uUmVxdWVzdGVkOwogCVdTQURBVEEgd3NhRGF0YTsKQEAgLTExNywzNCArMTQxLDExNCBAQAogCXN0YXRpYyBpbnQgZG9uZSA9IDA7CiAKIAlpZiAoZG9uZSkKLQkJcmV0dXJuIGVycjsKKwkJcmV0dXJuIChlcnIpOwogCiAJd1ZlcnNpb25SZXF1ZXN0ZWQgPSBNQUtFV09SRCggMSwgMSk7CiAJZXJyID0gV1NBU3RhcnR1cCggd1ZlcnNpb25SZXF1ZXN0ZWQsICZ3c2FEYXRhICk7CiAJYXRleGl0ICgodm9pZCgqKSh2b2lkKSlXU0FDbGVhbnVwKTsKLQlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZnX1BjYXBDb21waWxlQ3JpdGljYWxTZWN0aW9uKTsKIAlkb25lID0gMTsKIAogCWlmICggZXJyICE9IDAgKQogCQllcnIgPSAtMTsKLQlyZXR1cm4gZXJyOworCXJldHVybiAoZXJyKTsKIH0KIAotaW50IHBjYXBfd3NvY2tpbml0KCkKK2ludAorcGNhcF93c29ja2luaXQodm9pZCkKIHsKLSAgICAgICByZXR1cm4gd3NvY2tpbml0KCk7CisgICAgICAgcmV0dXJuICh3c29ja2luaXQoKSk7CiB9CiAKIHN0YXRpYyBpbnQKIHBjYXBfc3RhdHNfd2luMzIocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcykKIHsKKwlzdHJ1Y3QgYnBmX3N0YXQgYnN0YXRzOworCWNoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkUrMV07CiAKLQlpZihQYWNrZXRHZXRTdGF0cyhwLT5hZGFwdGVyLCAoc3RydWN0IGJwZl9zdGF0KilwcykgIT0gVFJVRSl7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlBhY2tldEdldFN0YXRzIGVycm9yOiAlcyIsIHBjYXBfd2luMzJzdHJlcnJvcigpKTsKLQkJcmV0dXJuIC0xOworCS8qCisJICogVHJ5IHRvIGdldCBzdGF0aXN0aWNzLgorCSAqCisJICogKFBsZWFzZSBub3RlIC0gInN0cnVjdCBwY2FwX3N0YXQiIGlzICpub3QqIHRoZSBzYW1lIGFzCisJICogV2luUGNhcCdzICJzdHJ1Y3QgYnBmX3N0YXQiLiBJdCBtaWdodCBjdXJyZW50bHkgaGF2ZSB0aGUKKwkgKiBzYW1lIGxheW91dCwgYnV0IGxldCdzIG5vdCBjaGVhdC4KKwkgKgorCSAqIE5vdGUgYWxzbyB0aGF0IHdlIGRvbid0IGZpbGwgaW4gcHNfY2FwdCwgYXMgd2UgbWlnaHQgaGF2ZQorCSAqIGJlZW4gY2FsbGVkIGJ5IGNvZGUgY29tcGlsZWQgYWdhaW5zdCBhbiBlYXJsaWVyIHZlcnNpb24gb2YKKwkgKiBXaW5QY2FwIHRoYXQgZGlkbid0IGhhdmUgcHNfY2FwdCwgaW4gd2hpY2ggY2FzZSBmaWxsaW5nIGl0CisJICogaW4gd291bGQgc3RvbXAgb24gd2hhdGV2ZXIgY29tZXMgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBwYXNzZWQKKwkgKiB0byB1cy4KKwkgKi8KKwlpZiAoIVBhY2tldEdldFN0YXRzKHAtPmFkYXB0ZXIsICZic3RhdHMpKSB7CisJCXBjYXBfd2luMzJfZXJyX3RvX3N0cihHZXRMYXN0RXJyb3IoKSwgZXJyYnVmKTsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiUGFja2V0R2V0U3RhdHMgZXJyb3I6ICVzIiwgZXJyYnVmKTsKKwkJcmV0dXJuICgtMSk7CiAJfQorCXBzLT5wc19yZWN2ID0gYnN0YXRzLmJzX3JlY3Y7CisJcHMtPnBzX2Ryb3AgPSBic3RhdHMuYnNfZHJvcDsKIAotCXJldHVybiAwOworCS8qCisJICogWFhYIC0gUGFja2V0R2V0U3RhdHMoKSBkb2Vzbid0IGZpbGwgdGhpcyBpbiwgc28gd2UganVzdAorCSAqIHJldHVybiAwLgorCSAqLworI2lmIDAKKwlwcy0+cHNfaWZkcm9wID0gYnN0YXRzLnBzX2lmZHJvcDsKKyNlbHNlCisJcHMtPnBzX2lmZHJvcCA9IDA7CisjZW5kaWYKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBXaW4zMi1vbmx5IHJvdXRpbmUgZm9yIGdldHRpbmcgc3RhdGlzdGljcy4KKyAqCisgKiBUaGlzIHdheSBpcyBkZWZpbml0ZWx5IHNhZmVyIHRoYW4gcGFzc2luZyB0aGUgcGNhcF9zdGF0ICogZnJvbSB0aGUgdXNlcmxhbmQuCisgKiBJbiBmYWN0LCB0aGVyZSBjb3VsZCBoYXBwZW4gdGhhbiB0aGUgdXNlciBhbGxvY2F0ZXMgYSB2YXJpYWJsZSB3aGljaCBpcyBub3QKKyAqIGJpZyBlbm91Z2ggZm9yIHRoZSBuZXcgc3RydWN0dXJlLCBhbmQgdGhlIGxpYnJhcnkgd2lsbCB3cml0ZSBpbiBhIHpvbmUKKyAqIHdoaWNoIGlzIG5vdCBhbGxvY2F0ZWQgdG8gdGhpcyB2YXJpYWJsZS4KKyAqCisgKiBJbiB0aGlzIHdheSwgd2UncmUgcHJldHR5IHN1cmUgd2UgYXJlIHdyaXRpbmcgb24gbWVtb3J5IGFsbG9jYXRlZCB0byB0aGlzCisgKiB2YXJpYWJsZS4KKyAqCisgKiBYWFggLSBidXQgdGhpcyBpcyB0aGUgd3Jvbmcgd2F5IHRvIGhhbmRsZSBzdGF0aXN0aWNzLiAgSW5zdGVhZCwgd2Ugc2hvdWxkCisgKiBoYXZlIGFuIEFQSSB0aGF0IHJldHVybnMgZGF0YSBpbiBhIGZvcm0gbGlrZSB0aGUgT3B0aW9ucyBzZWN0aW9uIG9mIGEKKyAqIHBjYXBuZyBJbnRlcmZhY2UgU3RhdGlzdGljcyBCbG9jazoKKyAqCisgKiAgICBodHRwOi8veG1sMnJmYy50b29scy5pZXRmLm9yZy9jZ2ktYmluL3htbDJyZmMuY2dpP3VybD1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGNhcG5nL3BjYXBuZy9tYXN0ZXIvZHJhZnQtdHVleGVuLW9wc2F3Zy1wY2FwbmcueG1sJm1vZGVBc0Zvcm1hdD1odG1sL2FzY2lpJnR5cGU9YXNjaWkjcmZjLnNlY3Rpb24uNC42CisgKgorICogd2hpY2ggd291bGQgbGV0IHVzIGFkZCBuZXcgc3RhdGlzdGljcyBzdHJhaWdodGZvcndhcmRseSBhbmQgaW5kaWNhdGUgd2hpY2gKKyAqIHN0YXRpc3RpY3Mgd2UgYXJlIGFuZCBhcmUgKm5vdCogcHJvdmlkaW5nLCByYXRoZXIgdGhhbiBoYXZpbmcgdG8gcHJvdmlkZQorICogcG9zc2libHktYm9ndXMgdmFsdWVzIGZvciBzdGF0aXN0aWNzIHdlIGNhbid0IHByb3ZpZGUuCisgKi8KK3N0cnVjdCBwY2FwX3N0YXQgKgorcGNhcF9zdGF0c19leF93aW4zMihwY2FwX3QgKnAsIGludCAqcGNhcF9zdGF0X3NpemUpCit7CisJc3RydWN0IGJwZl9zdGF0IGJzdGF0czsKKwljaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFKzFdOworCisJKnBjYXBfc3RhdF9zaXplID0gc2l6ZW9mIChwLT5zdGF0KTsKKworCS8qCisJICogVHJ5IHRvIGdldCBzdGF0aXN0aWNzLgorCSAqCisJICogKFBsZWFzZSBub3RlIC0gInN0cnVjdCBwY2FwX3N0YXQiIGlzICpub3QqIHRoZSBzYW1lIGFzCisJICogV2luUGNhcCdzICJzdHJ1Y3QgYnBmX3N0YXQiLiBJdCBtaWdodCBjdXJyZW50bHkgaGF2ZSB0aGUKKwkgKiBzYW1lIGxheW91dCwgYnV0IGxldCdzIG5vdCBjaGVhdC4pCisJICovCisJaWYgKCFQYWNrZXRHZXRTdGF0c0V4KHAtPmFkYXB0ZXIsICZic3RhdHMpKSB7CisJCXBjYXBfd2luMzJfZXJyX3RvX3N0cihHZXRMYXN0RXJyb3IoKSwgZXJyYnVmKTsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiUGFja2V0R2V0U3RhdHNFeCBlcnJvcjogJXMiLCBlcnJidWYpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlwLT5zdGF0LnBzX3JlY3YgPSBic3RhdHMuYnNfcmVjdjsKKwlwLT5zdGF0LnBzX2Ryb3AgPSBic3RhdHMuYnNfZHJvcDsKKwlwLT5zdGF0LnBzX2lmZHJvcCA9IGJzdGF0cy5wc19pZmRyb3A7CisjaWZkZWYgSEFWRV9SRU1PVEUKKwlwLT5zdGF0LnBzX2NhcHQgPSBic3RhdHMuYnNfY2FwdDsKKyNlbmRpZgorCXJldHVybiAoJnAtPnN0YXQpOwogfQogCiAvKiBTZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUga2VybmVsLWxldmVsIGNhcHR1cmUgYnVmZmVyICovCkBAIC0xNTMsMTAgKzI1NywxMCBAQAogewogCWlmKFBhY2tldFNldEJ1ZmYocC0+YWRhcHRlcixkaW0pPT1GQUxTRSkKIAl7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRyaXZlciBlcnJvcjogbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGtlcm5lbCBidWZmZXIiKTsKLQkJcmV0dXJuIC0xOworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRyaXZlciBlcnJvcjogbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGtlcm5lbCBidWZmZXIiKTsKKwkJcmV0dXJuICgtMSk7CiAJfQotCXJldHVybiAwOworCXJldHVybiAoMCk7CiB9CiAKIC8qIFNldCB0aGUgZHJpdmVyIHdvcmtpbmcgbW9kZSAqLwpAQCAtMTY1LDExICsyNjksMTEgQEAKIHsKIAlpZihQYWNrZXRTZXRNb2RlKHAtPmFkYXB0ZXIsbW9kZSk9PUZBTFNFKQogCXsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZHJpdmVyIGVycm9yOiB3b3JraW5nIG1vZGUgbm90IHJlY29nbml6ZWQiKTsKLQkJcmV0dXJuIC0xOworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRyaXZlciBlcnJvcjogd29ya2luZyBtb2RlIG5vdCByZWNvZ25pemVkIik7CisJCXJldHVybiAoLTEpOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiAoMCk7CiB9CiAKIC8qc2V0IHRoZSBtaW5pbXVtIGFtb3VudCBvZiBkYXRhIHRoYXQgd2lsbCByZWxlYXNlIGEgcmVhZCBjYWxsKi8KQEAgLTE3OCwyMiArMjgyLDIxMCBAQAogewogCWlmKFBhY2tldFNldE1pblRvQ29weShwLT5hZGFwdGVyLCBzaXplKT09RkFMU0UpCiAJewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkcml2ZXIgZXJyb3I6IHVuYWJsZSB0byBzZXQgdGhlIHJlcXVlc3RlZCBtaW50b2NvcHkgc2l6ZSIpOwotCQlyZXR1cm4gLTE7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZHJpdmVyIGVycm9yOiB1bmFibGUgdG8gc2V0IHRoZSByZXF1ZXN0ZWQgbWludG9jb3B5IHNpemUiKTsKKwkJcmV0dXJuICgtMSk7CiAJfQotCXJldHVybiAwOworCXJldHVybiAoMCk7CiB9CiAKLS8qcmV0dXJuIHRoZSBBZGFwdGVyIGZvciBhIHBjYXBfdCovCi1zdGF0aWMgQWRhcHRlciAqCi1wY2FwX2dldGFkYXB0ZXJfd2luMzIocGNhcF90ICpwKQorc3RhdGljIEhBTkRMRQorcGNhcF9nZXRldmVudF93aW4zMihwY2FwX3QgKnApCiB7Ci0JcmV0dXJuIHAtPmFkYXB0ZXI7CisJcmV0dXJuIChQYWNrZXRHZXRSZWFkRXZlbnQocC0+YWRhcHRlcikpOworfQorCitzdGF0aWMgaW50CitwY2FwX29pZF9nZXRfcmVxdWVzdF93aW4zMihwY2FwX3QgKnAsIGJwZl91X2ludDMyIG9pZCwgdm9pZCAqZGF0YSwgc2l6ZV90ICpsZW5wKQoreworCVBBQ0tFVF9PSURfREFUQSAqb2lkX2RhdGFfYXJnOworCWNoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkUrMV07CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgUEFDS0VUX09JRF9EQVRBIHN0cnVjdHVyZSB0byBoYW5kIHRvIFBhY2tldFJlcXVlc3QoKS4KKwkgKiBJdCBzaG91bGQgYmUgYmlnIGVub3VnaCB0byBob2xkICIqbGVucCIgYnl0ZXMgb2YgZGF0YTsgaXQKKwkgKiB3aWxsIGFjdHVhbGx5IGJlIHNsaWdodGx5IGxhcmdlciwgYXMgUEFDS0VUX09JRF9EQVRBIGhhcyBhCisJICogMS1ieXRlIGRhdGEgYXJyYXkgYXQgdGhlIGVuZCwgc3RhbmRpbmcgaW4gZm9yIHRoZSB2YXJpYWJsZS1sZW5ndGgKKwkgKiBkYXRhIHRoYXQncyBhY3R1YWxseSB0aGVyZS4KKwkgKi8KKwlvaWRfZGF0YV9hcmcgPSBtYWxsb2Moc2l6ZW9mIChQQUNLRVRfT0lEX0RBVEEpICsgKmxlbnApOworCWlmIChvaWRfZGF0YV9hcmcgPT0gTlVMTCkgeworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJDb3VsZG4ndCBhbGxvY2F0ZSBhcmd1bWVudCBidWZmZXIgZm9yIFBhY2tldFJlcXVlc3QiKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gY29weSB0aGUgZGF0YSAtIHdlJ3JlIGRvaW5nIGEgZmV0Y2guCisJICovCisJb2lkX2RhdGFfYXJnLT5PaWQgPSBvaWQ7CisJb2lkX2RhdGFfYXJnLT5MZW5ndGggPSAoVUxPTkcpKCpsZW5wKTsJLyogWFhYIC0gY2hlY2sgZm9yIHJpZGljdWxvdXNseSBsYXJnZSB2YWx1ZT8gKi8KKwlpZiAoIVBhY2tldFJlcXVlc3QocC0+YWRhcHRlciwgRkFMU0UsIG9pZF9kYXRhX2FyZykpIHsKKwkJcGNhcF93aW4zMl9lcnJfdG9fc3RyKEdldExhc3RFcnJvcigpLCBlcnJidWYpOworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJFcnJvciBjYWxsaW5nIFBhY2tldFJlcXVlc3Q6ICVzIiwgZXJyYnVmKTsKKwkJZnJlZShvaWRfZGF0YV9hcmcpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCX0KKworCS8qCisJICogR2V0IHRoZSBsZW5ndGggYWN0dWFsbHkgc3VwcGxpZWQuCisJICovCisJKmxlbnAgPSBvaWRfZGF0YV9hcmctPkxlbmd0aDsKKworCS8qCisJICogQ29weSBiYWNrIHRoZSBkYXRhIHdlIGZldGNoZWQuCisJICovCisJbWVtY3B5KGRhdGEsIG9pZF9kYXRhX2FyZy0+RGF0YSwgKmxlbnApOworCWZyZWUob2lkX2RhdGFfYXJnKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitwY2FwX29pZF9zZXRfcmVxdWVzdF93aW4zMihwY2FwX3QgKnAsIGJwZl91X2ludDMyIG9pZCwgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBzaXplX3QgKmxlbnApCit7CisJUEFDS0VUX09JRF9EQVRBICpvaWRfZGF0YV9hcmc7CisJY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRSsxXTsKKworCS8qCisJICogQWxsb2NhdGUgYSBQQUNLRVRfT0lEX0RBVEEgc3RydWN0dXJlIHRvIGhhbmQgdG8gUGFja2V0UmVxdWVzdCgpLgorCSAqIEl0IHNob3VsZCBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgIipsZW5wIiBieXRlcyBvZiBkYXRhOyBpdAorCSAqIHdpbGwgYWN0dWFsbHkgYmUgc2xpZ2h0bHkgbGFyZ2VyLCBhcyBQQUNLRVRfT0lEX0RBVEEgaGFzIGEKKwkgKiAxLWJ5dGUgZGF0YSBhcnJheSBhdCB0aGUgZW5kLCBzdGFuZGluZyBpbiBmb3IgdGhlIHZhcmlhYmxlLWxlbmd0aAorCSAqIGRhdGEgdGhhdCdzIGFjdHVhbGx5IHRoZXJlLgorCSAqLworCW9pZF9kYXRhX2FyZyA9IG1hbGxvYyhzaXplb2YgKFBBQ0tFVF9PSURfREFUQSkgKyAqbGVucCk7CisJaWYgKG9pZF9kYXRhX2FyZyA9PSBOVUxMKSB7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNvdWxkbid0IGFsbG9jYXRlIGFyZ3VtZW50IGJ1ZmZlciBmb3IgUGFja2V0UmVxdWVzdCIpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCX0KKworCW9pZF9kYXRhX2FyZy0+T2lkID0gb2lkOworCW9pZF9kYXRhX2FyZy0+TGVuZ3RoID0gKFVMT05HKSgqbGVucCk7CS8qIFhYWCAtIGNoZWNrIGZvciByaWRpY3Vsb3VzbHkgbGFyZ2UgdmFsdWU/ICovCisJbWVtY3B5KG9pZF9kYXRhX2FyZy0+RGF0YSwgZGF0YSwgKmxlbnApOworCWlmICghUGFja2V0UmVxdWVzdChwLT5hZGFwdGVyLCBUUlVFLCBvaWRfZGF0YV9hcmcpKSB7CisJCXBjYXBfd2luMzJfZXJyX3RvX3N0cihHZXRMYXN0RXJyb3IoKSwgZXJyYnVmKTsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiRXJyb3IgY2FsbGluZyBQYWNrZXRSZXF1ZXN0OiAlcyIsIGVycmJ1Zik7CisJCWZyZWUob2lkX2RhdGFfYXJnKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgbGVuZ3RoIGFjdHVhbGx5IGNvcGllZC4KKwkgKi8KKwkqbGVucCA9IG9pZF9kYXRhX2FyZy0+TGVuZ3RoOworCisJLyoKKwkgKiBObyBuZWVkIHRvIGNvcHkgdGhlIGRhdGEgLSB3ZSdyZSBkb2luZyBhIHNldC4KKwkgKi8KKwlmcmVlKG9pZF9kYXRhX2FyZyk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHVfaW50CitwY2FwX3NlbmRxdWV1ZV90cmFuc21pdF93aW4zMihwY2FwX3QgKnAsIHBjYXBfc2VuZF9xdWV1ZSAqcXVldWUsIGludCBzeW5jKQoreworCXVfaW50IHJlczsKKwljaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFKzFdOworCisJaWYgKHAtPmFkYXB0ZXI9PU5VTEwpIHsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2Fubm90IHRyYW5zbWl0IGEgcXVldWUgdG8gYW4gb2ZmbGluZSBjYXB0dXJlIG9yIHRvIGEgVHVyYm9DYXAgcG9ydCIpOworCQlyZXR1cm4gKDApOworCX0KKworCXJlcyA9IFBhY2tldFNlbmRQYWNrZXRzKHAtPmFkYXB0ZXIsCisJCXF1ZXVlLT5idWZmZXIsCisJCXF1ZXVlLT5sZW4sCisJCShCT09MRUFOKXN5bmMpOworCisJaWYocmVzICE9IHF1ZXVlLT5sZW4peworCQlwY2FwX3dpbjMyX2Vycl90b19zdHIoR2V0TGFzdEVycm9yKCksIGVycmJ1Zik7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkVycm9yIG9wZW5pbmcgYWRhcHRlcjogJXMiLCBlcnJidWYpOworCX0KKworCXJldHVybiAocmVzKTsKK30KKworc3RhdGljIGludAorcGNhcF9zZXR1c2VyYnVmZmVyX3dpbjMyKHBjYXBfdCAqcCwgaW50IHNpemUpCit7CisJdW5zaWduZWQgY2hhciAqbmV3X2J1ZmY7CisKKwlpZiAoc2l6ZTw9MCkgeworCQkvKiBCb2d1cyBwYXJhbWV0ZXIgKi8KKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiRXJyb3I6IGludmFsaWQgc2l6ZSAlZCIsc2l6ZSk7CisJCXJldHVybiAoLTEpOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KKwluZXdfYnVmZj0odW5zaWduZWQgY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSpzaXplKTsKKworCWlmICghbmV3X2J1ZmYpIHsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiRXJyb3I6IG5vdCBlbm91Z2ggbWVtb3J5Iik7CisJCXJldHVybiAoLTEpOworCX0KKworCWZyZWUocC0+YnVmZmVyKTsKKworCXAtPmJ1ZmZlcj1uZXdfYnVmZjsKKwlwLT5idWZzaXplPXNpemU7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitwY2FwX2xpdmVfZHVtcF93aW4zMihwY2FwX3QgKnAsIGNoYXIgKmZpbGVuYW1lLCBpbnQgbWF4c2l6ZSwgaW50IG1heHBhY2tzKQoreworCUJPT0xFQU4gcmVzOworCisJLyogU2V0IHRoZSBwYWNrZXQgZHJpdmVyIGluIGR1bXAgbW9kZSAqLworCXJlcyA9IFBhY2tldFNldE1vZGUocC0+YWRhcHRlciwgUEFDS0VUX01PREVfRFVNUCk7CisJaWYocmVzID09IEZBTFNFKXsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiRXJyb3Igc2V0dGluZyBkdW1wIG1vZGUiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyogU2V0IHRoZSBuYW1lIG9mIHRoZSBkdW1wIGZpbGUgKi8KKwlyZXMgPSBQYWNrZXRTZXREdW1wTmFtZShwLT5hZGFwdGVyLCBmaWxlbmFtZSwgKGludClzdHJsZW4oZmlsZW5hbWUpKTsKKwlpZihyZXMgPT0gRkFMU0UpeworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJFcnJvciBzZXR0aW5nIGtlcm5lbCBkdW1wIGZpbGUgbmFtZSIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKiBTZXQgdGhlIGxpbWl0cyBvZiB0aGUgZHVtcCBmaWxlICovCisJcmVzID0gUGFja2V0U2V0RHVtcExpbWl0cyhwLT5hZGFwdGVyLCBtYXhzaXplLCBtYXhwYWNrcyk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitwY2FwX2xpdmVfZHVtcF9lbmRlZF93aW4zMihwY2FwX3QgKnAsIGludCBzeW5jKQoreworCXJldHVybiAoUGFja2V0SXNEdW1wRW5kZWQocC0+YWRhcHRlciwgKEJPT0xFQU4pc3luYykpOworfQorCitzdGF0aWMgUEFpcnBjYXBIYW5kbGUKK3BjYXBfZ2V0X2FpcnBjYXBfaGFuZGxlX3dpbjMyKHBjYXBfdCAqcCkKK3sKKyNpZmRlZiBIQVZFX0FJUlBDQVBfQVBJCisJcmV0dXJuIChQYWNrZXRHZXRBaXJQY2FwSGFuZGxlKHAtPmFkYXB0ZXIpKTsKKyNlbHNlCisJcmV0dXJuIChOVUxMKTsKKyNlbmRpZiAvKiBIQVZFX0FJUlBDQVBfQVBJICovCiB9CiAKIHN0YXRpYyBpbnQKIHBjYXBfcmVhZF93aW4zMl9ucGYocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKIHsKKwlQQUNLRVQgUGFja2V0OwogCWludCBjYzsKIAlpbnQgbiA9IDA7CiAJcmVnaXN0ZXIgdV9jaGFyICpicCwgKmVwOwpAQCAtMjE1LDE1ICs1MDcsMjcgQEAKIAkJCXJldHVybiAoUENBUF9FUlJPUl9CUkVBSyk7CiAJCX0KIAotCSAgICAvKiBjYXB0dXJlIHRoZSBwYWNrZXRzICovCi0JCWlmKFBhY2tldFJlY2VpdmVQYWNrZXQocC0+YWRhcHRlcixwLT5QYWNrZXQsVFJVRSk9PUZBTFNFKXsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlYWQgZXJyb3I6IFBhY2tldFJlY2VpdmVQYWNrZXQgZmFpbGVkIik7CisJCS8qCisJCSAqIENhcHR1cmUgdGhlIHBhY2tldHMuCisJCSAqCisJCSAqIFRoZSBQQUNLRVQgc3RydWN0dXJlIGhhZCBhIGJ1bmNoIG9mIGV4dHJhIHN0dWZmIGZvcgorCQkgKiBXaW5kb3dzIDl4L01lLCBidXQgdGhlIG9ubHkgaW50ZXJlc3RpbmcgZGF0YSBpbiBpdAorCQkgKiBpbiB0aGUgdmVyc2lvbnMgb2YgV2luZG93cyB0aGF0IHdlIHN1cHBvcnQgaXMganVzdAorCQkgKiBhIGNvcHkgb2YgcC0+YnVmZmVyLCBhIGNvcHkgb2YgcC0+YnVmbGVuLCBhbmQgdGhlCisJCSAqIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCByZXR1cm5lZCBmcm9tCisJCSAqIFBhY2tldFJlY2VpdmVQYWNrZXQoKSwgbm9uZSBvZiB3aGljaCBoYXMgdG8gYmUKKwkJICogcmV0YWluZWQgZnJvbSBjYWxsIHRvIGNhbGwsIHNvIHdlIGp1c3Qga2VlcCBvbmUgb24KKwkJICogdGhlIHN0YWNrLgorCQkgKi8KKwkJUGFja2V0SW5pdFBhY2tldCgmUGFja2V0LCAoQllURSAqKXAtPmJ1ZmZlciwgcC0+YnVmc2l6ZSk7CisJCWlmICghUGFja2V0UmVjZWl2ZVBhY2tldChwLT5hZGFwdGVyLCAmUGFja2V0LCBUUlVFKSkgeworCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJyZWFkIGVycm9yOiBQYWNrZXRSZWNlaXZlUGFja2V0IGZhaWxlZCIpOwogCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIAkJfQogCi0JCWNjID0gcC0+UGFja2V0LT51bEJ5dGVzUmVjZWl2ZWQ7CisJCWNjID0gUGFja2V0LnVsQnl0ZXNSZWNlaXZlZDsKIAotCQlicCA9IHAtPlBhY2tldC0+QnVmZmVyOworCQlicCA9IHAtPmJ1ZmZlcjsKIAl9CiAJZWxzZQogCQlicCA9IHAtPmJwOwpAQCAtMjUyLDcgKzU1Niw3IEBACiAJCQkJcmV0dXJuIChQQ0FQX0VSUk9SX0JSRUFLKTsKIAkJCX0gZWxzZSB7CiAJCQkJcC0+YnAgPSBicDsKLQkJCQlwLT5jYyA9IGVwIC0gYnA7CisJCQkJcC0+Y2MgPSAoaW50KSAoZXAgLSBicCk7CiAJCQkJcmV0dXJuIChuKTsKIAkJCX0KIAkJfQpAQCAtMjgyLDcgKzU4Niw3IEBACiAJCQlicCArPSBQYWNrZXRfV09SREFMSUdOKGNhcGxlbiArIGhkcmxlbik7CiAJCQlpZiAoKytuID49IGNudCAmJiAhUEFDS0VUX0NPVU5UX0lTX1VOTElNSVRFRChjbnQpKSB7CiAJCQkJcC0+YnAgPSBicDsKLQkJCQlwLT5jYyA9IGVwIC0gYnA7CisJCQkJcC0+Y2MgPSAoaW50KSAoZXAgLSBicCk7CiAJCQkJcmV0dXJuIChuKTsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTMwMiw2ICs2MDYsNyBAQAogcGNhcF9yZWFkX3dpbjMyX2RhZyhwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQogewogCXN0cnVjdCBwY2FwX3dpbiAqcHcgPSBwLT5wcml2OworCVBBQ0tFVCBQYWNrZXQ7CiAJdV9jaGFyICpkcCA9IE5VTEw7CiAJaW50CXBhY2tldF9sZW4gPSAwLCBjYXBsZW4gPSAwOwogCXN0cnVjdCBwY2FwX3BrdGhkcglwY2FwX2hlYWRlcjsKQEAgLTMxNywxNiArNjIyLDI4IEBACiAJY2MgPSBwLT5jYzsKIAlpZiAoY2MgPT0gMCkgLyogR2V0IG5ldyBwYWNrZXRzIG9ubHkgaWYgd2UgaGF2ZSBwcm9jZXNzZWQgYWxsIHRoZSBvbmVzIG9mIHRoZSBwcmV2aW91cyByZWFkICovCiAJewotCSAgICAvKiBHZXQgbmV3IHBhY2tldHMgZnJvbSB0aGUgbmV0d29yayAqLwotCQlpZihQYWNrZXRSZWNlaXZlUGFja2V0KHAtPmFkYXB0ZXIsIHAtPlBhY2tldCwgVFJVRSk9PUZBTFNFKXsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlYWQgZXJyb3I6IFBhY2tldFJlY2VpdmVQYWNrZXQgZmFpbGVkIik7CisJCS8qCisJCSAqIEdldCBuZXcgcGFja2V0cyBmcm9tIHRoZSBuZXR3b3JrLgorCQkgKgorCQkgKiBUaGUgUEFDS0VUIHN0cnVjdHVyZSBoYWQgYSBidW5jaCBvZiBleHRyYSBzdHVmZiBmb3IKKwkJICogV2luZG93cyA5eC9NZSwgYnV0IHRoZSBvbmx5IGludGVyZXN0aW5nIGRhdGEgaW4gaXQKKwkJICogaW4gdGhlIHZlcnNpb25zIG9mIFdpbmRvd3MgdGhhdCB3ZSBzdXBwb3J0IGlzIGp1c3QKKwkJICogYSBjb3B5IG9mIHAtPmJ1ZmZlciwgYSBjb3B5IG9mIHAtPmJ1ZmxlbiwgYW5kIHRoZQorCQkgKiBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgcmV0dXJuZWQgZnJvbQorCQkgKiBQYWNrZXRSZWNlaXZlUGFja2V0KCksIG5vbmUgb2Ygd2hpY2ggaGFzIHRvIGJlCisJCSAqIHJldGFpbmVkIGZyb20gY2FsbCB0byBjYWxsLCBzbyB3ZSBqdXN0IGtlZXAgb25lIG9uCisJCSAqIHRoZSBzdGFjay4KKwkJICovCisJCVBhY2tldEluaXRQYWNrZXQoJlBhY2tldCwgKEJZVEUgKilwLT5idWZmZXIsIHAtPmJ1ZnNpemUpOworCQlpZiAoIVBhY2tldFJlY2VpdmVQYWNrZXQocC0+YWRhcHRlciwgJlBhY2tldCwgVFJVRSkpIHsKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAicmVhZCBlcnJvcjogUGFja2V0UmVjZWl2ZVBhY2tldCBmYWlsZWQiKTsKIAkJCXJldHVybiAoLTEpOwogCQl9CiAKLQkJY2MgPSBwLT5QYWNrZXQtPnVsQnl0ZXNSZWNlaXZlZDsKKwkJY2MgPSBQYWNrZXQudWxCeXRlc1JlY2VpdmVkOwogCQlpZihjYyA9PSAwKQogCQkJLyogVGhlIHRpbWVvdXQgaGFzIGV4cGlyZWQgYnV0IHdlIG5vIHBhY2tldHMgYXJyaXZlZCAqLwotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gKDApOwogCQloZWFkZXIgPSAoZGFnX3JlY29yZF90KilwLT5hZGFwdGVyLT5EYWdCdWZmZXI7CiAJfQogCWVsc2UKQEAgLTM0NCw3ICs2NjEsNyBAQAogCQkJYnJlYWs7CiAKIAkJLyogSW5jcmVhc2UgdGhlIG51bWJlciBvZiBjYXB0dXJlZCBwYWNrZXRzICovCi0JCXB3LT5zdGF0LnBzX3JlY3YrKzsKKwkJcC0+c3RhdC5wc19yZWN2Kys7CiAKIAkJLyogRmluZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KIAkJZHAgPSAoKHVfY2hhciAqKWhlYWRlcikgKyBkYWdfcmVjb3JkX3NpemU7CkBAIC00NTUsNyArNzcyLDcgQEAKIAl9CiAJd2hpbGUoKHVfY2hhciopaGVhZGVyIDwgZW5kb2ZidWYpOwogCi0gIHJldHVybiAxOworCXJldHVybiAoMSk7CiB9CiAjZW5kaWYgLyogSEFWRV9EQUdfQVBJICovCiAKQEAgLTQ2OCwxNSArNzg1LDE1IEBACiAKIAlpZiAoUGFja2V0VG9TZW5kID09IE5VTEwpCiAJewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzZW5kIGVycm9yOiBQYWNrZXRBbGxvY2F0ZVBhY2tldCBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQgZXJyb3I6IFBhY2tldEFsbG9jYXRlUGFja2V0IGZhaWxlZCIpOworCQlyZXR1cm4gKC0xKTsKIAl9CiAKLQlQYWNrZXRJbml0UGFja2V0KFBhY2tldFRvU2VuZCwoUFZPSUQpYnVmLHNpemUpOworCVBhY2tldEluaXRQYWNrZXQoUGFja2V0VG9TZW5kLCAoUFZPSUQpYnVmLCAoVUlOVClzaXplKTsKIAlpZihQYWNrZXRTZW5kUGFja2V0KHAtPmFkYXB0ZXIsUGFja2V0VG9TZW5kLFRSVUUpID09IEZBTFNFKXsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZCBlcnJvcjogUGFja2V0U2VuZFBhY2tldCBmYWlsZWQiKTsKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzZW5kIGVycm9yOiBQYWNrZXRTZW5kUGFja2V0IGZhaWxlZCIpOwogCQlQYWNrZXRGcmVlUGFja2V0KFBhY2tldFRvU2VuZCk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuICgtMSk7CiAJfQogCiAJUGFja2V0RnJlZVBhY2tldChQYWNrZXRUb1NlbmQpOwpAQCAtNDg2LDE5ICs4MDMsMjAgQEAKIAkgKiAicGNhcF9pbmplY3QoKSIgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMKIAkgKiBzZW50LgogCSAqLwotCXJldHVybiBzaXplOworCXJldHVybiAoKGludClzaXplKTsKIH0KIAogc3RhdGljIHZvaWQKIHBjYXBfY2xlYW51cF93aW4zMihwY2FwX3QgKnApCiB7CisJc3RydWN0IHBjYXBfd2luICpwdyA9IHAtPnByaXY7CiAJaWYgKHAtPmFkYXB0ZXIgIT0gTlVMTCkgewogCQlQYWNrZXRDbG9zZUFkYXB0ZXIocC0+YWRhcHRlcik7CiAJCXAtPmFkYXB0ZXIgPSBOVUxMOwogCX0KLQlpZiAocC0+UGFja2V0KSB7Ci0JCVBhY2tldEZyZWVQYWNrZXQocC0+UGFja2V0KTsKLQkJcC0+UGFja2V0ID0gTlVMTDsKKwlpZiAocHctPnJmbW9uX3NlbGZzdGFydCkKKwl7CisJCVBhY2tldFNldE1vbml0b3JNb2RlKHAtPm9wdC5kZXZpY2UsIDApOwogCX0KIAlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24ocCk7CiB9CkBAIC01MDgsMzIgKzgyNiwxMjMgQEAKIHsKIAlzdHJ1Y3QgcGNhcF93aW4gKnB3ID0gcC0+cHJpdjsKIAlOZXRUeXBlIHR5cGU7CisJaW50IHJlczsKKwljaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFKzFdOworCisjaWZkZWYgSEFWRV9SRU1PVEUKKwljaGFyIGhvc3RbUENBUF9CVUZfU0laRSArIDFdOworCWNoYXIgcG9ydFtQQ0FQX0JVRl9TSVpFICsgMV07CisJY2hhciBuYW1lW1BDQVBfQlVGX1NJWkUgKyAxXTsKKwlpbnQgc3JjdHlwZTsKKwlpbnQgb3BlbnNvdXJjZV9yZW1vdGVfcmVzdWx0OworCisJc3RydWN0IHBjYXBfbWQgKm1kOwkJCQkvKiBzdHJ1Y3R1cmUgdXNlZCB3aGVuIGRvaW5nIGEgcmVtb3RlIGxpdmUgY2FwdHVyZSAqLworCW1kID0gKHN0cnVjdCBwY2FwX21kICopICgodV9jaGFyKilwLT5wcml2ICsgc2l6ZW9mKHN0cnVjdCBwY2FwX3dpbikpOworCisJLyoKKwlSZXRyb2ZpdDsgd2UgaGF2ZSB0byBtYWtlIG9sZGVyIGFwcGxpY2F0aW9ucyBjb21wYXRpYmxlIHdpdGggdGhlIHJlbW90ZSBjYXB0dXJlCisJU28sIHdlJ3JlIGNhbGxpbmcgdGhlIHBjYXBfb3Blbl9yZW1vdGUoKSBmcm9tIGhlcmUsIHRoYXQgaXMgYSB2ZXJ5IGRpcnR5IHRoaW5nLgorCU9idmlvdXNseSwgd2UgY2Fubm90IGV4cGxvaXQgYWxsIHRoZSBuZXcgZmVhdHVyZXM7IGZvciBpbnN0YW5jZSwgd2UgY2Fubm90CisJc2VuZCBhdXRoZW50aWNhdGlvbiwgd2UgY2Fubm90IHVzZSBhIFVEUCBkYXRhIGNvbm5lY3Rpb24sIGFuZCBzbyBvbi4KKwkqLworCWlmIChwY2FwX3BhcnNlc3Jjc3RyKHAtPm9wdC5kZXZpY2UsICZzcmN0eXBlLCBob3N0LCBwb3J0LCBuYW1lLCBwLT5lcnJidWYpKQorCQlyZXR1cm4gUENBUF9FUlJPUjsKKworCWlmIChzcmN0eXBlID09IFBDQVBfU1JDX0lGUkVNT1RFKQorCXsKKwkJb3BlbnNvdXJjZV9yZW1vdGVfcmVzdWx0ID0gcGNhcF9vcGVuc291cmNlX3JlbW90ZShwLCBOVUxMKTsKKworCQlpZiAob3BlbnNvdXJjZV9yZW1vdGVfcmVzdWx0ICE9IDApCisJCQlyZXR1cm4gb3BlbnNvdXJjZV9yZW1vdGVfcmVzdWx0OworCisJCW1kLT5ybXRfZmxhZ3MgPSAocC0+b3B0LnByb21pc2MpID8gUENBUF9PUEVORkxBR19QUk9NSVNDVU9VUyA6IDA7CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNyY3R5cGUgPT0gUENBUF9TUkNfSUZMT0NBTCkKKwl7CisJCS8qCisJCSogSWYgaXQgc3RhcnRzIHdpdGggcnBjYXA6Ly8sIGN1dCBkb3duIHRoZSBzdHJpbmcKKwkJKi8KKwkJaWYgKHN0cm5jbXAocC0+b3B0LmRldmljZSwgUENBUF9TUkNfSUZfU1RSSU5HLCBzdHJsZW4oUENBUF9TUkNfSUZfU1RSSU5HKSkgPT0gMCkKKwkJeworCQkJc2l6ZV90IGxlbiA9IHN0cmxlbihwLT5vcHQuZGV2aWNlKSAtIHN0cmxlbihQQ0FQX1NSQ19JRl9TVFJJTkcpICsgMTsKKwkJCWNoYXIgKm5ld19zdHJpbmc7CisJCQkvKgorCQkJKiBhbGxvY2F0ZSBhIG5ldyBzdHJpbmcgYW5kIGZyZWUgdGhlIG9sZCBvbmUKKwkJCSovCisJCQlpZiAobGVuID4gMCkKKwkJCXsKKwkJCQluZXdfc3RyaW5nID0gKGNoYXIqKW1hbGxvYyhsZW4pOworCQkJCWlmIChuZXdfc3RyaW5nICE9IE5VTEwpCisJCQkJeworCQkJCQljaGFyICp0bXA7CisJCQkJCXN0cmNweV9zKG5ld19zdHJpbmcsIGxlbiwgcC0+b3B0LmRldmljZSArIHN0cmxlbihQQ0FQX1NSQ19JRl9TVFJJTkcpKTsKKwkJCQkJdG1wID0gcC0+b3B0LmRldmljZTsKKwkJCQkJcC0+b3B0LmRldmljZSA9IG5ld19zdHJpbmc7CisJCQkJCWZyZWUodG1wKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKyNlbmRpZgkvKiBIQVZFX1JFTU9URSAqLwogCiAJaWYgKHAtPm9wdC5yZm1vbikgewogCQkvKgotCQkgKiBObyBtb25pdG9yIG1vZGUgb24gV2luZG93cy4gIEl0IGNvdWxkIGJlIGRvbmUgb24KLQkJICogVmlzdGEgd2l0aCBkcml2ZXJzIHRoYXQgc3VwcG9ydCB0aGUgbmF0aXZlIDgwMi4xMQotCQkgKiBtZWNoYW5pc20gYW5kIG1vbml0b3IgbW9kZS4KKwkJICogTW9uaXRvciBtb2RlIGlzIHN1cHBvcnRlZCBvbiBXaW5kb3dzIFZpc3RhIGFuZCBsYXRlci4KIAkJICovCi0JCXJldHVybiAoUENBUF9FUlJPUl9SRk1PTl9OT1RTVVApOworCQlpZiAoUGFja2V0R2V0TW9uaXRvck1vZGUocC0+b3B0LmRldmljZSkgPT0gMSkKKwkJeworCQkJcHctPnJmbW9uX3NlbGZzdGFydCA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKHJlcyA9IFBhY2tldFNldE1vbml0b3JNb2RlKHAtPm9wdC5kZXZpY2UsIDEpKSAhPSAxKQorCQkJeworCQkJCXB3LT5yZm1vbl9zZWxmc3RhcnQgPSAwOworCQkJCS8vIE1vbml0b3IgbW9kZSBpcyBub3Qgc3VwcG9ydGVkLgorCQkJCWlmIChyZXMgPT0gMCkKKwkJCQl7CisJCQkJCXJldHVybiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXB3LT5yZm1vbl9zZWxmc3RhcnQgPSAxOworCQkJfQorCQl9CiAJfQogCiAJLyogSW5pdCBXaW5Tb2NrICovCiAJd3NvY2tpbml0KCk7CiAKLQlwLT5hZGFwdGVyID0gUGFja2V0T3BlbkFkYXB0ZXIocC0+b3B0LnNvdXJjZSk7CisJcC0+YWRhcHRlciA9IFBhY2tldE9wZW5BZGFwdGVyKHAtPm9wdC5kZXZpY2UpOwogCiAJaWYgKHAtPmFkYXB0ZXIgPT0gTlVMTCkKIAl7CiAJCS8qIEFkYXB0ZXIgZGV0ZWN0ZWQgYnV0IHdlIGFyZSBub3QgYWJsZSB0byBvcGVuIGl0LiBSZXR1cm4gZmFpbHVyZS4gKi8KLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRXJyb3Igb3BlbmluZyBhZGFwdGVyOiAlcyIsIHBjYXBfd2luMzJzdHJlcnJvcigpKTsKLQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCXBjYXBfd2luMzJfZXJyX3RvX3N0cihHZXRMYXN0RXJyb3IoKSwgZXJyYnVmKTsKKwkJaWYgKHB3LT5yZm1vbl9zZWxmc3RhcnQpCisJCXsKKwkJCVBhY2tldFNldE1vbml0b3JNb2RlKHAtPm9wdC5kZXZpY2UsIDApOworCQl9CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkVycm9yIG9wZW5pbmcgYWRhcHRlcjogJXMiLCBlcnJidWYpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCX0KIAogCS8qZ2V0IG5ldHdvcmsgdHlwZSovCiAJaWYoUGFja2V0R2V0TmV0VHlwZSAocC0+YWRhcHRlciwmdHlwZSkgPT0gRkFMU0UpCiAJewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW5ub3QgZGV0ZXJtaW5lIHRoZSBuZXR3b3JrIHR5cGU6ICVzIiwgcGNhcF93aW4zMnN0cmVycm9yKCkpOworCQlwY2FwX3dpbjMyX2Vycl90b19zdHIoR2V0TGFzdEVycm9yKCksIGVycmJ1Zik7CisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNhbm5vdCBkZXRlcm1pbmUgdGhlIG5ldHdvcmsgdHlwZTogJXMiLCBlcnJidWYpOwogCQlnb3RvIGJhZDsKIAl9CiAKQEAgLTYyMiw3ICsxMDMxLDcgQEAKIAogCQlpZiAoUGFja2V0U2V0SHdGaWx0ZXIocC0+YWRhcHRlcixORElTX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTKSA9PSBGQUxTRSkKIAkJewotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZmFpbGVkIHRvIHNldCBoYXJkd2FyZSBmaWx0ZXIgdG8gcHJvbWlzY3VvdXMgbW9kZSIpOworCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJmYWlsZWQgdG8gc2V0IGhhcmR3YXJlIGZpbHRlciB0byBwcm9taXNjdW91cyBtb2RlIik7CiAJCQlnb3RvIGJhZDsKIAkJfQogCX0KQEAgLTYzMCw3ICsxMDM5LDcgQEAKIAl7CiAJCWlmIChQYWNrZXRTZXRId0ZpbHRlcihwLT5hZGFwdGVyLE5ESVNfUEFDS0VUX1RZUEVfQUxMX0xPQ0FMKSA9PSBGQUxTRSkKIAkJewotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZmFpbGVkIHRvIHNldCBoYXJkd2FyZSBmaWx0ZXIgdG8gbm9uLXByb21pc2N1b3VzIG1vZGUiKTsKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZmFpbGVkIHRvIHNldCBoYXJkd2FyZSBmaWx0ZXIgdG8gbm9uLXByb21pc2N1b3VzIG1vZGUiKTsKIAkJCWdvdG8gYmFkOwogCQl9CiAJfQpAQCAtNjM4LDEzICsxMDQ3LDYgQEAKIAkvKiBTZXQgdGhlIGJ1ZmZlciBzaXplICovCiAJcC0+YnVmc2l6ZSA9IFdJTjMyX0RFRkFVTFRfVVNFUl9CVUZGRVJfU0laRTsKIAotCS8qIGFsbG9jYXRlIFBhY2tldCBzdHJ1Y3R1cmUgdXNlZCBkdXJpbmcgdGhlIGNhcHR1cmUgKi8KLQlpZigocC0+UGFja2V0ID0gUGFja2V0QWxsb2NhdGVQYWNrZXQoKSk9PU5VTEwpCi0JewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJmYWlsZWQgdG8gYWxsb2NhdGUgdGhlIFBBQ0tFVCBzdHJ1Y3R1cmUiKTsKLQkJZ290byBiYWQ7Ci0JfQotCiAJaWYoIShwLT5hZGFwdGVyLT5GbGFncyAmIElORk9fRkxBR19EQUdfQ0FSRCkpCiAJewogCS8qCkBAIC02NTIsMzIgKzEwNTQsMzMgQEAKIAkgKi8KIAkJLyoKIAkJICogSWYgdGhlIGJ1ZmZlciBzaXplIHdhc24ndCBleHBsaWNpdGx5IHNldCwgZGVmYXVsdCB0bwotCQkgKiBXSU4zMl9ERUZBVUxUX1VTRVJfQlVGRkVSX1NJWkUuCisJCSAqIFdJTjMyX0RFRkFVTFRfS0VSTkVMX0JVRkZFUl9TSVpFLgogCQkgKi8KIAkgCWlmIChwLT5vcHQuYnVmZmVyX3NpemUgPT0gMCkKIAkgCQlwLT5vcHQuYnVmZmVyX3NpemUgPSBXSU4zMl9ERUZBVUxUX0tFUk5FTF9CVUZGRVJfU0laRTsKIAogCQlpZihQYWNrZXRTZXRCdWZmKHAtPmFkYXB0ZXIscC0+b3B0LmJ1ZmZlcl9zaXplKT09RkFMU0UpCiAJCXsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRyaXZlciBlcnJvcjogbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGtlcm5lbCBidWZmZXIiKTsKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZHJpdmVyIGVycm9yOiBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUga2VybmVsIGJ1ZmZlciIpOwogCQkJZ290byBiYWQ7CiAJCX0KIAotCQlwLT5idWZmZXIgPSAodV9jaGFyICopbWFsbG9jKHAtPmJ1ZnNpemUpOworCQlwLT5idWZmZXIgPSBtYWxsb2MocC0+YnVmc2l6ZSk7CiAJCWlmIChwLT5idWZmZXIgPT0gTlVMTCkKIAkJewotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCWdvdG8gYmFkOwogCQl9CiAKLQkJUGFja2V0SW5pdFBhY2tldChwLT5QYWNrZXQsKEJZVEUqKXAtPmJ1ZmZlcixwLT5idWZzaXplKTsKLQogCQlpZiAocC0+b3B0LmltbWVkaWF0ZSkKIAkJewogCQkJLyogdGVsbCB0aGUgZHJpdmVyIHRvIGNvcHkgdGhlIGJ1ZmZlciBhcyBzb29uIGFzIGRhdGEgYXJyaXZlcyAqLwogCQkJaWYoUGFja2V0U2V0TWluVG9Db3B5KHAtPmFkYXB0ZXIsMCk9PUZBTFNFKQogCQkJewotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwiRXJyb3IgY2FsbGluZyBQYWNrZXRTZXRNaW5Ub0NvcHk6ICVzIiwgcGNhcF93aW4zMnN0cmVycm9yKCkpOworCQkJCXBjYXBfd2luMzJfZXJyX3RvX3N0cihHZXRMYXN0RXJyb3IoKSwgZXJyYnVmKTsKKwkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIkVycm9yIGNhbGxpbmcgUGFja2V0U2V0TWluVG9Db3B5OiAlcyIsCisJCQkJICAgIGVycmJ1Zik7CiAJCQkJZ290byBiYWQ7CiAJCQl9CiAJCX0KQEAgLTY4Niw3ICsxMDg5LDEwIEBACiAJCQkvKiB0ZWxsIHRoZSBkcml2ZXIgdG8gY29weSB0aGUgYnVmZmVyIG9ubHkgaWYgaXQgY29udGFpbnMgYXQgbGVhc3QgMTZLICovCiAJCQlpZihQYWNrZXRTZXRNaW5Ub0NvcHkocC0+YWRhcHRlciwxNjAwMCk9PUZBTFNFKQogCQkJewotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwiRXJyb3IgY2FsbGluZyBQYWNrZXRTZXRNaW5Ub0NvcHk6ICVzIiwgcGNhcF93aW4zMnN0cmVycm9yKCkpOworCQkJCXBjYXBfd2luMzJfZXJyX3RvX3N0cihHZXRMYXN0RXJyb3IoKSwgZXJyYnVmKTsKKwkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIkVycm9yIGNhbGxpbmcgUGFja2V0U2V0TWluVG9Db3B5OiAlcyIsCisJCQkJICAgIGVycmJ1Zik7CiAJCQkJZ290byBiYWQ7CiAJCQl9CiAJCX0KQEAgLTcwNCw5ICsxMTEwLDkgQEAKIAkJaW50CQlwb3N0eXBlID0gMDsKIAkJY2hhcglrZXluYW1lWzUxMl07CiAKLQkJc25wcmludGYoa2V5bmFtZSwgc2l6ZW9mKGtleW5hbWUpLCAiJXNcXENhcmRQYXJhbXNcXCVzIiwKKwkJcGNhcF9zbnByaW50ZihrZXluYW1lLCBzaXplb2Yoa2V5bmFtZSksICIlc1xcQ2FyZFBhcmFtc1xcJXMiLAogCQkJIlNZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFxEQUciLAotCQkJc3Ryc3RyKF9zdHJsd3IocC0+b3B0LnNvdXJjZSksICJkYWciKSk7CisJCQlzdHJzdHIoX3N0cmx3cihwLT5vcHQuZGV2aWNlKSwgImRhZyIpKTsKIAkJZG8KIAkJewogCQkJc3RhdHVzID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwga2V5bmFtZSwgMCwgS0VZX1JFQUQsICZkYWdrZXkpOwpAQCAtNzY1LDEwICsxMTcxLDE4IEBACiAJcC0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX3dpbjMyOwogCXAtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja193aW4zMjsKIAlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfd2luMzI7CisJcC0+c3RhdHNfZXhfb3AgPSBwY2FwX3N0YXRzX2V4X3dpbjMyOwogCXAtPnNldGJ1ZmZfb3AgPSBwY2FwX3NldGJ1ZmZfd2luMzI7CiAJcC0+c2V0bW9kZV9vcCA9IHBjYXBfc2V0bW9kZV93aW4zMjsKIAlwLT5zZXRtaW50b2NvcHlfb3AgPSBwY2FwX3NldG1pbnRvY29weV93aW4zMjsKLQlwLT5nZXRhZGFwdGVyX29wID0gcGNhcF9nZXRhZGFwdGVyX3dpbjMyOworCXAtPmdldGV2ZW50X29wID0gcGNhcF9nZXRldmVudF93aW4zMjsKKwlwLT5vaWRfZ2V0X3JlcXVlc3Rfb3AgPSBwY2FwX29pZF9nZXRfcmVxdWVzdF93aW4zMjsKKwlwLT5vaWRfc2V0X3JlcXVlc3Rfb3AgPSBwY2FwX29pZF9zZXRfcmVxdWVzdF93aW4zMjsKKwlwLT5zZW5kcXVldWVfdHJhbnNtaXRfb3AgPSBwY2FwX3NlbmRxdWV1ZV90cmFuc21pdF93aW4zMjsKKwlwLT5zZXR1c2VyYnVmZmVyX29wID0gcGNhcF9zZXR1c2VyYnVmZmVyX3dpbjMyOworCXAtPmxpdmVfZHVtcF9vcCA9IHBjYXBfbGl2ZV9kdW1wX3dpbjMyOworCXAtPmxpdmVfZHVtcF9lbmRlZF9vcCA9IHBjYXBfbGl2ZV9kdW1wX2VuZGVkX3dpbjMyOworCXAtPmdldF9haXJwY2FwX2hhbmRsZV9vcCA9IHBjYXBfZ2V0X2FpcnBjYXBfaGFuZGxlX3dpbjMyOwogCXAtPmNsZWFudXBfb3AgPSBwY2FwX2NsZWFudXBfd2luMzI7CiAKIAlyZXR1cm4gKDApOwpAQCAtNzc3LDQ3ICsxMTkxLDMwIEBACiAJcmV0dXJuIChQQ0FQX0VSUk9SKTsKIH0KIAorLyoKKyogQ2hlY2sgaWYgcmZtb24gbW9kZSBpcyBzdXBwb3J0ZWQgb24gdGhlIHBjYXBfdCBmb3IgV2luZG93cyBzeXN0ZW1zLgorKi8KK3N0YXRpYyBpbnQKK3BjYXBfY2FuX3NldF9yZm1vbl93aW4zMihwY2FwX3QgKnApCit7CisJcmV0dXJuIChQYWNrZXRJc01vbml0b3JNb2RlU3VwcG9ydGVkKHAtPm9wdC5kZXZpY2UpID09IDEpOworfQorCiBwY2FwX3QgKgotcGNhcF9jcmVhdGVfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3BjYXBfY3JlYXRlX2ludGVyZmFjZShjb25zdCBjaGFyICpkZXZpY2UgX1VfLCBjaGFyICplYnVmKQogewogCXBjYXBfdCAqcDsKIAotCWlmIChzdHJsZW4oZGV2aWNlKSA9PSAxKQotCXsKLQkJLyoKLQkJICogSXQncyBwcm9iYWJseSBhIHVuaWNvZGUgc3RyaW5nCi0JCSAqIENvbnZlcnQgdG8gYXNjaWkgYW5kIHBhc3MgaXQgdG8gcGNhcF9jcmVhdGVfY29tbW9uCi0JCSAqCi0JCSAqIFRoaXMgd29uZGVyZnVsIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgcGNhcF9sb29rdXBkZXYgc3RpbGwgcmV0dXJucwotCQkgKiB1bmljb2RlIHN0cmluZ3MsIGFuZCBpdCdzIHVzZWQgYnkgd2luZHVtcCB3aGVuIG5vIGRldmljZSBpcyBzcGVjaWZpZWQKLQkJICogaW4gdGhlIGNvbW1hbmQgbGluZQotCQkgKi8KLQkJc2l6ZV90IGxlbmd0aDsKLQkJY2hhciogZGV2aWNlQXNjaWk7Ci0KLQkJbGVuZ3RoID0gd2NzbGVuKCh3Y2hhcl90KilkZXZpY2UpOwotCi0JCWRldmljZUFzY2lpID0gKGNoYXIqKW1hbGxvYyhsZW5ndGggKyAxKTsKLQotCQlpZiAoZGV2aWNlQXNjaWkgPT0gTlVMTCkKLQkJewotCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk1hbGxvYyBmYWlsZWQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJc25wcmludGYoZGV2aWNlQXNjaWksIGxlbmd0aCArIDEsICIld3MiLCAod2NoYXJfdCopZGV2aWNlKTsKLQkJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2VBc2NpaSwgZWJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgcGNhcF93aW4pKTsKLQkJZnJlZShkZXZpY2VBc2NpaSk7Ci0JfQotCWVsc2UKLQl7Ci0JCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmLCBzaXplb2YgKHN0cnVjdCBwY2FwX3dpbikpOwotCX0KLQorI2lmZGVmIEhBVkVfUkVNT1RFCisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihlYnVmLCBzaXplb2Yoc3RydWN0IHBjYXBfd2luKSArIHNpemVvZihzdHJ1Y3QgcGNhcF9tZCkpOworI2Vsc2UKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGVidWYsIHNpemVvZihzdHJ1Y3QgcGNhcF93aW4pKTsKKyNlbmRpZiAvKiBIQVZFX1JFTU9URSAqLwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiAoTlVMTCk7CiAKIAlwLT5hY3RpdmF0ZV9vcCA9IHBjYXBfYWN0aXZhdGVfd2luMzI7CisJcC0+Y2FuX3NldF9yZm1vbl9vcCA9IHBjYXBfY2FuX3NldF9yZm1vbl93aW4zMjsKIAlyZXR1cm4gKHApOwogfQogCkBAIC04ODcsMTYgKzEyODQsMTYgQEAKIAogCWlmKCFmcCkKIAl7Ci0JCXN0cm5jcHkocC0+ZXJyYnVmLCAic2V0ZmlsdGVyOiBObyBmaWx0ZXIgc3BlY2lmaWVkIiwgc2l6ZW9mKHAtPmVycmJ1ZikpOwotCQlyZXR1cm4gLTE7CisJCXN0cmxjcHkocC0+ZXJyYnVmLCAic2V0ZmlsdGVyOiBObyBmaWx0ZXIgc3BlY2lmaWVkIiwgc2l6ZW9mKHAtPmVycmJ1ZikpOworCQlyZXR1cm4gKC0xKTsKIAl9CiAKIAkvKiBJbnN0YWxsIGEgdXNlciBsZXZlbCBmaWx0ZXIgKi8KIAlpZiAoaW5zdGFsbF9icGZfcHJvZ3JhbShwLCBmcCkgPCAwKQogCXsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAogCQkJInNldGZpbHRlciwgdW5hYmxlIHRvIGluc3RhbGwgdGhlIGZpbHRlcjogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuICgtMSk7CiAJfQogCiAJcmV0dXJuICgwKTsKQEAgLTkyMCw2ICsxMzE3LDcgQEAKIHsKIAlzdHJ1Y3QgcGNhcF93aW4gKnB3ID0gcC0+cHJpdjsKIAlpbnQgbmV3dGltZW91dDsKKwljaGFyIHdpbl9lcnJidWZbUENBUF9FUlJCVUZfU0laRSsxXTsKIAogCWlmIChub25ibG9jaykgewogCQkvKgpAQCAtOTMwLDIyICsxMzI4LDIyMSBAQAogCQkvKgogCQkgKiBSZXN0b3JlIHRoZSB0aW1lb3V0IHNldCB3aGVuIHRoZSBkZXZpY2Ugd2FzIG9wZW5lZC4KIAkJICogKE5vdGUgdGhhdCB0aGlzIG1heSBiZSAtMSwgaW4gd2hpY2ggY2FzZSB3ZSdyZSBub3QKLQkJICogcmVhbGx5IGxlYXZpbmcgbm9uLWJsb2NraW5nIG1vZGUuKQorCQkgKiByZWFsbHkgbGVhdmluZyBub24tYmxvY2tpbmcgbW9kZS4gIEhvd2V2ZXIsIGFsdGhvdWdoCisJCSAqIHRoZSB0aW1lb3V0IGFyZ3VtZW50IHRvIHBjYXBfc2V0X3RpbWVvdXQoKSBhbmQKKwkJICogcGNhcF9vcGVuX2xpdmUoKSBpcyBhbiBpbnQsIHlvdSdyZSBub3Qgc3VwcG9zZWQgdG8KKwkJICogc3VwcGx5IGEgbmVnYXRpdmUgdmFsdWUsIHNvIHRoYXQgInNob3VsZG4ndCBoYXBwZW4iLikKIAkJICovCiAJCW5ld3RpbWVvdXQgPSBwLT5vcHQudGltZW91dDsKIAl9CiAJaWYgKCFQYWNrZXRTZXRSZWFkVGltZW91dChwLT5hZGFwdGVyLCBuZXd0aW1lb3V0KSkgewotCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCi0JCSAgICAiUGFja2V0U2V0UmVhZFRpbWVvdXQ6ICVzIiwgcGNhcF93aW4zMnN0cmVycm9yKCkpOworCQlwY2FwX3dpbjMyX2Vycl90b19zdHIoR2V0TGFzdEVycm9yKCksIHdpbl9lcnJidWYpOworCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJQYWNrZXRTZXRSZWFkVGltZW91dDogJXMiLCB3aW5fZXJyYnVmKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCXB3LT5ub25ibG9jayA9IChuZXd0aW1lb3V0ID09IC0xKTsKIAlyZXR1cm4gKDApOwogfQogCi0vKnBsYXRmb3JtLWRlcGVuZGVudCByb3V0aW5lIHRvIGFkZCBkZXZpY2VzIG90aGVyIHRoYW4gTkRJUyBpbnRlcmZhY2VzKi8KK3N0YXRpYyBpbnQKK3BjYXBfYWRkX2lmX3dpbjMyKHBjYXBfaWZfdCAqKmRldmxpc3QsIGNoYXIgKm5hbWUsIGJwZl91X2ludDMyIGZsYWdzLAorICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLCBjaGFyICplcnJidWYpCit7CisJcGNhcF9pZl90ICpjdXJkZXY7CisJbnBmX2lmX2FkZHIgaWZfYWRkcnNbTUFYX05FVFdPUktfQUREUkVTU0VTXTsKKwlMT05HIGlmX2FkZHJfc2l6ZTsKKwlpbnQgcmVzID0gMDsKKworCWlmX2FkZHJfc2l6ZSA9IE1BWF9ORVRXT1JLX0FERFJFU1NFUzsKKworCS8qCisJICogQWRkIGFuIGVudHJ5IGZvciB0aGlzIGludGVyZmFjZSwgd2l0aCBubyBhZGRyZXNzZXMuCisJICovCisJaWYgKGFkZF9vcl9maW5kX2lmKCZjdXJkZXYsIGRldmxpc3QsIG5hbWUsIGZsYWdzLCBkZXNjcmlwdGlvbiwKKwkgICAgZXJyYnVmKSA9PSAtMSkgeworCQkvKgorCQkgKiBGYWlsdXJlLgorCQkgKi8KKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGxpc3Qgb2YgYWRkcmVzc2VzIGZvciB0aGUgaW50ZXJmYWNlLgorCSAqLworCWlmICghUGFja2V0R2V0TmV0SW5mb0V4KCh2b2lkICopbmFtZSwgaWZfYWRkcnMsICZpZl9hZGRyX3NpemUpKSB7CisJCS8qCisJCSAqIEZhaWx1cmUuCisJCSAqCisJCSAqIFdlIGRvbid0IHJldHVybiBhbiBlcnJvciwgYmVjYXVzZSB0aGlzIGNhbiBoYXBwZW4gd2l0aAorCQkgKiBOZGlzV2FuIGludGVyZmFjZXMsIGFuZCB3ZSB3YW50IHRvIHN1cHBseSB0aGVtIGV2ZW4KKwkJICogaWYgd2UgY2FuJ3Qgc3VwcGx5IHRoZWlyIGFkZHJlc3Nlcy4KKwkJICoKKwkJICogV2UgcmV0dXJuIGFuIGVudHJ5IHdpdGggYW4gZW1wdHkgYWRkcmVzcyBsaXN0LgorCQkgKi8KKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqIE5vdyBhZGQgdGhlIGFkZHJlc3Nlcy4KKwkgKi8KKwl3aGlsZSAoaWZfYWRkcl9zaXplLS0gPiAwKSB7CisJCS8qCisJCSAqICJjdXJkZXYiIGlzIGFuIGVudHJ5IGZvciB0aGlzIGludGVyZmFjZTsgYWRkIGFuIGVudHJ5IGZvcgorCQkgKiB0aGlzIGFkZHJlc3MgdG8gaXRzIGxpc3Qgb2YgYWRkcmVzc2VzLgorCQkgKi8KKwkJaWYoY3VyZGV2ID09IE5VTEwpCisJCQlicmVhazsKKwkJcmVzID0gYWRkX2FkZHJfdG9fZGV2KGN1cmRldiwKKwkJICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmaWZfYWRkcnNbaWZfYWRkcl9zaXplXS5JUEFkZHJlc3MsCisJCSAgICBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSwKKwkJICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmaWZfYWRkcnNbaWZfYWRkcl9zaXplXS5TdWJuZXRNYXNrLAorCQkgICAgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSksCisJCSAgICAoc3RydWN0IHNvY2thZGRyICopJmlmX2FkZHJzW2lmX2FkZHJfc2l6ZV0uQnJvYWRjYXN0LAorCQkgICAgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSksCisJCSAgICBOVUxMLAorCQkgICAgMCwKKwkJICAgIGVycmJ1Zik7CisJCWlmIChyZXMgPT0gLTEpIHsKKwkJCS8qCisJCQkgKiBGYWlsdXJlLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAocmVzKTsKK30KKwogaW50CiBwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCiB7Ci0JcmV0dXJuICgwKTsKKwlwY2FwX2lmX3QgKmRldmxpc3QgPSBOVUxMOworCWludCByZXQgPSAwOworCWNvbnN0IGNoYXIgKmRlc2M7CisJY2hhciAqQWRhcHRlcnNOYW1lOworCVVMT05HIE5hbWVMZW5ndGg7CisJY2hhciAqbmFtZTsKKwljaGFyIG91cl9lcnJidWZbUENBUF9FUlJCVUZfU0laRSsxXTsKKworCS8qCisJICogRmluZCBvdXQgaG93IGJpZyBhIGJ1ZmZlciB3ZSBuZWVkLgorCSAqCisJICogVGhpcyBjYWxsIHNob3VsZCBhbHdheXMgcmV0dXJuIEZBTFNFOyBpZiB0aGUgZXJyb3IgaXMKKwkgKiBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSLCBOYW1lTGVuZ3RoIHdpbGwgYmUgc2V0IHRvCisJICogdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3ZSBuZWVkLCBvdGhlcndpc2UgdGhlcmUncyBhCisJICogcHJvYmxlbSwgYW5kIE5hbWVMZW5ndGggc2hvdWxkIGJlIHNldCB0byAwLgorCSAqCisJICogSXQgc2hvdWxkbid0IHJlcXVpcmUgTmFtZUxlbmd0aCB0byBiZSBzZXQsIGJ1dCwKKwkgKiBhdCBsZWFzdCBhcyBvZiBXaW5QY2FwIDQuMS4zLCBpdCBjaGVja3Mgd2hldGhlcgorCSAqIE5hbWVMZW5ndGggaXMgYmlnIGVub3VnaCBiZWZvcmUgaXQgY2hlY2tzIGZvciBhCisJICogTlVMTCBidWZmZXIgYXJndW1lbnQsIHNvLCB3aGlsZSBpdCdsbCBzdGlsbCBkbworCSAqIHRoZSByaWdodCB0aGluZyBpZiBOYW1lTGVuZ3RoIGlzIHVuaW5pdGlhbGl6ZWQgYW5kCisJICogd2hhdGV2ZXIganVuayBoYXBwZW5zIHRvIGJlIHRoZXJlIGlzIGJpZyBlbm91Z2gKKwkgKiAoYmVjYXVzZSB0aGUgcG9pbnRlciBhcmd1bWVudCB3aWxsIGJlIG51bGwpLCBpdCdzCisJICogc3RpbGwgcmVhZGluZyBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLgorCSAqLworCU5hbWVMZW5ndGggPSAwOworCWlmICghUGFja2V0R2V0QWRhcHRlck5hbWVzKE5VTEwsICZOYW1lTGVuZ3RoKSkKKwl7CisJCURXT1JEIGxhc3RfZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKworCQlpZiAobGFzdF9lcnJvciAhPSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQorCQl7CisJCQlwY2FwX3dpbjMyX2Vycl90b19zdHIobGFzdF9lcnJvciwgb3VyX2VycmJ1Zik7CisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiUGFja2V0R2V0QWRhcHRlck5hbWVzOiAlcyIsIG91cl9lcnJidWYpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9CisKKwlpZiAoTmFtZUxlbmd0aCA+IDApCisJCUFkYXB0ZXJzTmFtZSA9IChjaGFyKikgbWFsbG9jKE5hbWVMZW5ndGgpOworCWVsc2UKKwl7CisJCSphbGxkZXZzcCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKwlpZiAoQWRhcHRlcnNOYW1lID09IE5VTEwpCisJeworCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbm5vdCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHRvIGxpc3QgdGhlIGFkYXB0ZXJzLiIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlpZiAoIVBhY2tldEdldEFkYXB0ZXJOYW1lcyhBZGFwdGVyc05hbWUsICZOYW1lTGVuZ3RoKSkgeworCQlwY2FwX3dpbjMyX2Vycl90b19zdHIoR2V0TGFzdEVycm9yKCksIG91cl9lcnJidWYpOworCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlBhY2tldEdldEFkYXB0ZXJOYW1lczogJXMiLAorCQkgICAgb3VyX2VycmJ1Zik7CisJCWZyZWUoQWRhcHRlcnNOYW1lKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiAiUGFja2V0R2V0QWRhcHRlck5hbWVzKCkiIHJldHVybmVkIGEgbGlzdCBvZgorCSAqIG51bGwtdGVybWluYXRlZCBBU0NJSSBpbnRlcmZhY2UgbmFtZSBzdHJpbmdzLAorCSAqIHRlcm1pbmF0ZWQgYnkgYSBudWxsIHN0cmluZywgZm9sbG93ZWQgYnkgYSBsaXN0CisJICogb2YgbnVsbC10ZXJtaW5hdGVkIEFTQ0lJIGludGVyZmFjZSBkZXNjcmlwdGlvbgorCSAqIHN0cmluZ3MsIHRlcm1pbmF0ZWQgYnkgYSBudWxsIHN0cmluZy4KKwkgKiBUaGlzIG1lYW5zIHRoZXJlIGFyZSB0d28gQVNDSUkgbnVsbHMgYXQgdGhlIGVuZAorCSAqIG9mIHRoZSBmaXJzdCBsaXN0LgorCSAqCisJICogRmluZCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBsaXN0OyB0aGF0J3MgdGhlCisJICogYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgbGlzdC4KKwkgKi8KKwlkZXNjID0gJkFkYXB0ZXJzTmFtZVswXTsKKwl3aGlsZSAoKmRlc2MgIT0gJ1wwJyB8fCAqKGRlc2MgKyAxKSAhPSAnXDAnKQorCQlkZXNjKys7CisKKwkvKgorIAkgKiBGb3VuZCBpdCAtICJkZXNjIiBwb2ludHMgdG8gdGhlIGZpcnN0IG9mIHRoZSB0d28KKwkgKiBudWxscyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIG5hbWVzLCBzbyB0aGUKKwkgKiBmaXJzdCBieXRlIG9mIHRoZSBsaXN0IG9mIGRlc2NyaXB0aW9ucyBpcyB0d28gYnl0ZXMKKwkgKiBhZnRlciBpdC4KKwkgKi8KKwlkZXNjICs9IDI7CisKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgZWxlbWVudHMgaW4gdGhlIGZpcnN0IGxpc3QuCisJICovCisJbmFtZSA9ICZBZGFwdGVyc05hbWVbMF07CisJd2hpbGUgKCpuYW1lICE9ICdcMCcpIHsKKwkJYnBmX3VfaW50MzIgZmxhZ3MgPSAwOworI2lmZGVmIEhBVkVfUEFDS0VUX0lTX0xPT1BCQUNLX0FEQVBURVIKKwkJLyoKKwkJICogSXMgdGhpcyBhIGxvb3BiYWNrIGludGVyZmFjZT8KKwkJICovCisJCWlmIChQYWNrZXRJc0xvb3BiYWNrQWRhcHRlcihuYW1lKSkgeworCQkJLyogWWVzICovCisJCQlmbGFncyB8PSBQQ0FQX0lGX0xPT1BCQUNLOworCQl9CisjZW5kaWYKKworCQkvKgorCQkgKiBBZGQgYW4gZW50cnkgZm9yIHRoaXMgaW50ZXJmYWNlLgorCQkgKi8KKwkJaWYgKHBjYXBfYWRkX2lmX3dpbjMyKCZkZXZsaXN0LCBuYW1lLCBmbGFncywgZGVzYywKKwkJICAgIGVycmJ1ZikgPT0gLTEpIHsKKwkJCS8qCisJCQkgKiBGYWlsdXJlLgorCQkJICovCisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCW5hbWUgKz0gc3RybGVuKG5hbWUpICsgMTsKKwkJZGVzYyArPSBzdHJsZW4oZGVzYykgKyAxOworCX0KKworCWlmIChyZXQgPT0gLTEpIHsKKwkJLyoKKwkJICogV2UgaGFkIGFuIGVycm9yOyBmcmVlIHRoZSBsaXN0IHdlJ3ZlIGJlZW4gY29uc3RydWN0aW5nLgorCQkgKi8KKwkJaWYgKGRldmxpc3QgIT0gTlVMTCkgeworCQkJcGNhcF9mcmVlYWxsZGV2cyhkZXZsaXN0KTsKKwkJCWRldmxpc3QgPSBOVUxMOworCQl9CisJfQorCisJKmFsbGRldnNwID0gZGV2bGlzdDsKKwlmcmVlKEFkYXB0ZXJzTmFtZSk7CisJcmV0dXJuIChyZXQpOwogfQpkaWZmIC0tZ2l0IGEvcGNhcC4zcGNhcCBiL3BjYXAuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0MDhhMAotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAuM3BjYXAKQEAgLTAsMCArMSw5MzcgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUCAzUENBUCAiOCBNYXJjaCAyMDE1IgorLlNIIE5BTUUKK3BjYXAgXC0gUGFja2V0IENhcHR1cmUgbGlicmFyeQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuTFAKKy5mdCBCCisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCitUaGUgUGFja2V0IENhcHR1cmUgbGlicmFyeQorcHJvdmlkZXMgYSBoaWdoIGxldmVsIGludGVyZmFjZSB0byBwYWNrZXQgY2FwdHVyZSBzeXN0ZW1zLiBBbGwgcGFja2V0cworb24gdGhlIG5ldHdvcmssIGV2ZW4gdGhvc2UgZGVzdGluZWQgZm9yIG90aGVyIGhvc3RzLCBhcmUgYWNjZXNzaWJsZQordGhyb3VnaCB0aGlzIG1lY2hhbmlzbS4KK0l0IGFsc28gc3VwcG9ydHMgc2F2aW5nIGNhcHR1cmVkIHBhY2tldHMgdG8gYSBgYHNhdmVmaWxlJycsIGFuZCByZWFkaW5nCitwYWNrZXRzIGZyb20gYSBgYHNhdmVmaWxlJycuCisuU1MgT3BlbmluZyBhIGNhcHR1cmUgaGFuZGxlIGZvciByZWFkaW5nCitUbyBvcGVuIGEgaGFuZGxlIGZvciBhIGxpdmUgY2FwdHVyZSwgZ2l2ZW4gdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgb3IKK290aGVyIGludGVyZmFjZSBvbiB3aGljaCB0aGUgY2FwdHVyZSBzaG91bGQgYmUgZG9uZSwgY2FsbAorLkJSIHBjYXBfY3JlYXRlICgpLAorc2V0IHRoZSBhcHByb3ByaWF0ZSBvcHRpb25zIG9uIHRoZSBoYW5kbGUsIGFuZCB0aGVuIGFjdGl2YXRlIGl0IHdpdGgKKy5CUiBwY2FwX2FjdGl2YXRlICgpLgorLlBQCitUbyBvYnRhaW4gYSBsaXN0IG9mIGRldmljZXMgdGhhdCBjYW4gYmUgb3BlbmVkIGZvciBhIGxpdmUgY2FwdHVyZSwgY2FsbAorLkJSIHBjYXBfZmluZGFsbGRldnMgKCk7Cit0byBmcmVlIHRoZSBsaXN0IHJldHVybmVkIGJ5CisuQlIgcGNhcF9maW5kYWxsZGV2cyAoKSwKK2NhbGwKKy5CUiBwY2FwX2ZyZWVhbGxkZXZzICgpLgorLkJSIHBjYXBfbG9va3VwZGV2ICgpCit3aWxsIHJldHVybiB0aGUgZmlyc3QgZGV2aWNlIG9uIHRoYXQgbGlzdCB0aGF0IGlzIG5vdCBhIGBgbG9vcGJhY2tgYAorbmV0d29yayBpbnRlcmZhY2UuCisuUFAKK1RvIG9wZW4gYSBoYW5kbGUgZm9yIGEgYGBzYXZlZmlsZScnIGZyb20gd2hpY2ggdG8gcmVhZCBwYWNrZXRzLCBnaXZlbiB0aGUKK3BhdGhuYW1lIG9mIHRoZSBgYHNhdmVmaWxlJycsIGNhbGwKKy5CUiBwY2FwX29wZW5fb2ZmbGluZSAoKTsKK3RvIHNldCB1cCBhIGhhbmRsZSBmb3IgYSBgYHNhdmVmaWxlJycsIGdpdmVuIGEKKy5CICJGSUxFXCAqIgorcmVmZXJyaW5nIHRvIGEgZmlsZSBhbHJlYWR5IG9wZW5lZCBmb3IgcmVhZGluZywgY2FsbAorLkJSIHBjYXBfZm9wZW5fb2ZmbGluZSAoKS4KKy5QUAorSW4gb3JkZXIgdG8gZ2V0IGEgYGBmYWtlJycKKy5CIHBjYXBfdAorZm9yIHVzZSBpbiByb3V0aW5lcyB0aGF0IHJlcXVpcmUgYQorLkIgcGNhcF90CithcyBhbiBhcmd1bWVudCwgc3VjaCBhcyByb3V0aW5lcyB0byBvcGVuIGEgYGBzYXZlZmlsZScnIGZvciB3cml0aW5nIGFuZAordG8gY29tcGlsZSBhIGZpbHRlciBleHByZXNzaW9uLCBjYWxsCisuQlIgcGNhcF9vcGVuX2RlYWQgKCkuCisuUFAKKy5CUiBwY2FwX2NyZWF0ZSAoKSwKKy5CUiBwY2FwX29wZW5fb2ZmbGluZSAoKSwKKy5CUiBwY2FwX2ZvcGVuX29mZmxpbmUgKCksCithbmQKKy5CUiBwY2FwX29wZW5fZGVhZCAoKQorcmV0dXJuIGEgcG9pbnRlciB0byBhCisuQlIgcGNhcF90ICwKK3doaWNoIGlzIHRoZSBoYW5kbGUgdXNlZCBmb3IgcmVhZGluZyBwYWNrZXRzIGZyb20gdGhlIGNhcHR1cmUgc3RyZWFtIG9yCit0aGUgYGBzYXZlZmlsZScnLCBhbmQgZm9yIGZpbmRpbmcgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYXB0dXJlCitzdHJlYW0gb3IgYGBzYXZlZmlsZScnLgorVG8gY2xvc2UgYSBoYW5kbGUsIHVzZQorLkJSIHBjYXBfY2xvc2UgKCkuCisuUFAKK1RoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBvbiBhIGNhcHR1cmUgaGFuZGxlIGluY2x1ZGUKKy5JUCAic25hcHNob3QgbGVuZ3RoIgorSWYsIHdoZW4gY2FwdHVyaW5nLCB5b3UgY2FwdHVyZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQsIHRoYXQKK3JlcXVpcmVzIG1vcmUgQ1BVIHRpbWUgdG8gY29weSB0aGUgcGFja2V0IHRvIHlvdXIgYXBwbGljYXRpb24sIG1vcmUgZGlzaworYW5kIHBvc3NpYmx5IG5ldHdvcmsgYmFuZHdpZHRoIHRvIHdyaXRlIHRoZSBwYWNrZXQgZGF0YSB0byBhIGZpbGUsIGFuZAorbW9yZSBkaXNrIHNwYWNlIHRvIHNhdmUgdGhlIHBhY2tldC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBlbnRpcmUKK2NvbnRlbnRzIG9mIHRoZSBwYWNrZXQgLSBmb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlCitUQ1AgaGVhZGVycyBvZiBwYWNrZXRzIC0geW91IGNhbiBzZXQgdGhlICJzbmFwc2hvdCBsZW5ndGgiIGZvciB0aGUKK2NhcHR1cmUgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUuICBJZiB0aGUgc25hcHNob3QgbGVuZ3RoIGlzIHNldCB0bworLklSIHNuYXBsZW4gLAorYW5kCisuSSBzbmFwbGVuCitpcyBsZXNzCit0aGFuIHRoZSBzaXplIG9mIGEgcGFja2V0IHRoYXQgaXMgY2FwdHVyZWQsIG9ubHkgdGhlIGZpcnN0CisuSSBzbmFwbGVuCitieXRlcyBvZiB0aGF0IHBhY2tldCB3aWxsIGJlIGNhcHR1cmVkIGFuZCBwcm92aWRlZCBhcyBwYWNrZXQgZGF0YS4KKy5JUAorQSBzbmFwc2hvdCBsZW5ndGggb2YgNjU1MzUgc2hvdWxkIGJlIHN1ZmZpY2llbnQsIG9uIG1vc3QgaWYgbm90IGFsbAorbmV0d29ya3MsIHRvIGNhcHR1cmUgYWxsIHRoZSBkYXRhIGF2YWlsYWJsZSBmcm9tIHRoZSBwYWNrZXQuCisuSVAKK1RoZSBzbmFwc2hvdCBsZW5ndGggaXMgc2V0IHdpdGgKKy5CUiBwY2FwX3NldF9zbmFwbGVuICgpLgorLklQICJwcm9taXNjdW91cyBtb2RlIgorT24gYnJvYWRjYXN0IExBTnMgc3VjaCBhcyBFdGhlcm5ldCwgaWYgdGhlIG5ldHdvcmsgaXNuJ3Qgc3dpdGNoZWQsIG9yIGlmCit0aGUgYWRhcHRlciBpcyBjb25uZWN0ZWQgdG8gYSAibWlycm9yIHBvcnQiIG9uIGEgc3dpdGNoIHRvIHdoaWNoIGFsbAorcGFja2V0cyBwYXNzaW5nIHRocm91Z2ggdGhlIHN3aXRjaCBhcmUgc2VudCwgYSBuZXR3b3JrIGFkYXB0ZXIgcmVjZWl2ZXMKK2FsbCBwYWNrZXRzIG9uIHRoZSBMQU4sIGluY2x1ZGluZyB1bmljYXN0IG9yIG11bHRpY2FzdCBwYWNrZXRzIG5vdCBzZW50Cit0byBhIG5ldHdvcmsgYWRkcmVzcyB0aGF0IHRoZSBuZXR3b3JrIGFkYXB0ZXIgaXNuJ3QgY29uZmlndXJlZCB0bworcmVjb2duaXplLgorLklQCitOb3JtYWxseSwgdGhlIGFkYXB0ZXIgd2lsbCBkaXNjYXJkIHRob3NlIHBhY2tldHM7IGhvd2V2ZXIsIG1hbnkgbmV0d29yaworYWRhcHRlcnMgc3VwcG9ydCAicHJvbWlzY3VvdXMgbW9kZSIsIHdoaWNoIGlzIGEgbW9kZSBpbiB3aGljaCBhbGwKK3BhY2tldHMsIGV2ZW4gaWYgdGhleSBhcmUgbm90IHNlbnQgdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBhZGFwdGVyCityZWNvZ25pemVzLCBhcmUgcHJvdmlkZWQgdG8gdGhlIGhvc3QuICBUaGlzIGlzIHVzZWZ1bCBmb3IgcGFzc2l2ZWx5CitjYXB0dXJpbmcgdHJhZmZpYyBiZXR3ZWVuIHR3byBvciBtb3JlIG90aGVyIGhvc3RzIGZvciBhbmFseXNpcy4KKy5JUAorTm90ZSB0aGF0IGV2ZW4gaWYgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc2V0IHByb21pc2N1b3VzIG1vZGUsIHRoZQorYWRhcHRlciBjb3VsZCB3ZWxsIGJlIGluIHByb21pc2N1b3VzIG1vZGUgZm9yIHNvbWUgb3RoZXIgcmVhc29uLgorLklQCitGb3Igbm93LCB0aGlzIGRvZXNuJ3Qgd29yayBvbiB0aGUgImFueSIgZGV2aWNlOyBpZiBhbiBhcmd1bWVudCBvZiAiYW55Igorb3IgTlVMTCBpcyBzdXBwbGllZCwgdGhlIHNldHRpbmcgb2YgcHJvbWlzY3VvdXMgbW9kZSBpcyBpZ25vcmVkLgorLklQCitQcm9taXNjdW91cyBtb2RlIGlzIHNldCB3aXRoCisuQlIgcGNhcF9zZXRfcHJvbWlzYyAoKS4KKy5JUCAibW9uaXRvciBtb2RlIgorT24gSUVFRSA4MDIuMTEgd2lyZWxlc3MgTEFOcywgZXZlbiBpZiBhbiBhZGFwdGVyIGlzIGluIHByb21pc2N1b3VzIG1vZGUsCitpdCB3aWxsIHN1cHBseSB0byB0aGUgaG9zdCBvbmx5IGZyYW1lcyBmb3IgdGhlIG5ldHdvcmsgd2l0aCB3aGljaCBpdCdzCithc3NvY2lhdGVkLiAgSXQgbWlnaHQgYWxzbyBzdXBwbHkgb25seSBkYXRhIGZyYW1lcywgbm90IG1hbmFnZW1lbnQgb3IKK2NvbnRyb2wgZnJhbWVzLCBhbmQgbWlnaHQgbm90IHByb3ZpZGUgdGhlIDgwMi4xMSBoZWFkZXIgb3IgcmFkaW8KK2luZm9ybWF0aW9uIHBzZXVkby1oZWFkZXIgZm9yIHRob3NlIGZyYW1lcy4KKy5JUAorSW4gIm1vbml0b3IgbW9kZSIsIHNvbWV0aW1lcyBhbHNvIGNhbGxlZCAicmZtb24gbW9kZSIgKGZvciAiUmFkaW8KK0ZyZXF1ZW5jeSBNT05pdG9yIiksIHRoZSBhZGFwdGVyIHdpbGwgc3VwcGx5IGFsbCBmcmFtZXMgdGhhdCBpdAorcmVjZWl2ZXMsIHdpdGggODAyLjExIGhlYWRlcnMsIGFuZCBtaWdodCBzdXBwbHkgYSBwc2V1ZG8taGVhZGVyIHdpdGgKK3JhZGlvIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmFtZSBhcyB3ZWxsLgorLklQCitOb3RlIHRoYXQgaW4gbW9uaXRvciBtb2RlIHRoZSBhZGFwdGVyIG1pZ2h0IGRpc2Fzc29jaWF0ZSBmcm9tIHRoZQorbmV0d29yayB3aXRoIHdoaWNoIGl0J3MgYXNzb2NpYXRlZCwgc28gdGhhdCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byB1c2UKK2FueSB3aXJlbGVzcyBuZXR3b3JrcyB3aXRoIHRoYXQgYWRhcHRlci4gIFRoaXMgY291bGQgcHJldmVudCBhY2Nlc3NpbmcKK2ZpbGVzIG9uIGEgbmV0d29yayBzZXJ2ZXIsIG9yIHJlc29sdmluZyBob3N0IG5hbWVzIG9yIG5ldHdvcmsgYWRkcmVzc2VzLAoraWYgeW91IGFyZSBjYXB0dXJpbmcgaW4gbW9uaXRvciBtb2RlIGFuZCBhcmUgbm90IGNvbm5lY3RlZCB0byBhbm90aGVyCituZXR3b3JrIHdpdGggYW5vdGhlciBhZGFwdGVyLgorLklQCitNb25pdG9yIG1vZGUgaXMgc2V0IHdpdGgKKy5CUiBwY2FwX3NldF9yZm1vbiAoKSwKK2FuZAorLkJSIHBjYXBfY2FuX3NldF9yZm1vbiAoKQorY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gYWRhcHRlciBjYW4gYmUgcHV0IGludG8gbW9uaXRvcgorbW9kZS4KKy5JUCAicmVhZCB0aW1lb3V0IgorSWYsIHdoZW4gY2FwdHVyaW5nLCBwYWNrZXRzIGFyZSBkZWxpdmVyZWQgYXMgc29vbiBhcyB0aGV5IGFycml2ZSwgdGhlCithcHBsaWNhdGlvbiBjYXB0dXJpbmcgdGhlIHBhY2tldHMgd2lsbCBiZSB3b2tlbiB1cCBmb3IgZWFjaCBwYWNrZXQgYXMgaXQKK2Fycml2ZXMsIGFuZCBtaWdodCBoYXZlIHRvIG1ha2Ugb25lIG9yIG1vcmUgY2FsbHMgdG8gdGhlIG9wZXJhdGluZworc3lzdGVtIHRvIGZldGNoIGVhY2ggcGFja2V0LgorLklQCitJZiwgaW5zdGVhZCwgcGFja2V0cyBhcmUgbm90IGRlbGl2ZXJlZCBhcyBzb29uIGFzIHRoZXkgYXJyaXZlLCBidXQgYXJlCitkZWxpdmVyZWQgYWZ0ZXIgYSBzaG9ydCBkZWxheSAoY2FsbGVkIGEgInJlYWQgdGltZW91dCIpLCBtb3JlIHRoYW4gb25lCitwYWNrZXQgY2FuIGJlIGFjY3VtdWxhdGVkIGJlZm9yZSB0aGUgcGFja2V0cyBhcmUgZGVsaXZlcmVkLCBzbyB0aGF0IGEKK3NpbmdsZSB3YWtldXAgd291bGQgYmUgZG9uZSBmb3IgbXVsdGlwbGUgcGFja2V0cywgYW5kIGVhY2ggc2V0IG9mIGNhbGxzCittYWRlIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdvdWxkIHN1cHBseSBtdWx0aXBsZSBwYWNrZXRzLCByYXRoZXIgdGhhbgorYSBzaW5nbGUgcGFja2V0LiAgVGhpcyByZWR1Y2VzIHRoZSBwZXItcGFja2V0IENQVSBvdmVyaGVhZCBpZiBwYWNrZXRzCithcmUgYXJyaXZpbmcgYXQgYSBoaWdoIHJhdGUsIGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBwYWNrZXRzIHBlciBzZWNvbmQKK3RoYXQgY2FuIGJlIGNhcHR1cmVkLgorLklQCitUaGUgcmVhZCB0aW1lb3V0IGlzIHJlcXVpcmVkIHNvIHRoYXQgYW4gYXBwbGljYXRpb24gd29uJ3Qgd2FpdCBmb3IgdGhlCitvcGVyYXRpbmcgc3lzdGVtJ3MgY2FwdHVyZSBidWZmZXIgdG8gZmlsbCB1cCBiZWZvcmUgcGFja2V0cyBhcmUKK2RlbGl2ZXJlZDsgaWYgcGFja2V0cyBhcmUgYXJyaXZpbmcgc2xvd2x5LCB0aGF0IHdhaXQgY291bGQgdGFrZSBhbgorYXJiaXRyYXJpbHkgbG9uZyBwZXJpb2Qgb2YgdGltZS4KKy5JUAorTm90IGFsbCBwbGF0Zm9ybXMgc3VwcG9ydCBhIHJlYWQgdGltZW91dDsgb24gcGxhdGZvcm1zIHRoYXQKK2Rvbid0LCB0aGUgcmVhZCB0aW1lb3V0IGlzIGlnbm9yZWQuICBBIHplcm8gdmFsdWUgZm9yIHRoZSB0aW1lb3V0LAorb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBhIHJlYWQgdGltZW91dCwKK3dpbGwgY2F1c2UgYSByZWFkIHRvIHdhaXQgZm9yZXZlciB0byBhbGxvdyBlbm91Z2ggcGFja2V0cyB0bworYXJyaXZlLCB3aXRoIG5vIHRpbWVvdXQuCisuSVAKKy5CUiBOT1RFIDoKK3RoZSByZWFkIHRpbWVvdXQgY2Fubm90IGJlIHVzZWQgdG8gY2F1c2UgY2FsbHMgdGhhdCByZWFkCitwYWNrZXRzIHRvIHJldHVybiB3aXRoaW4gYSBsaW1pdGVkIHBlcmlvZCBvZiB0aW1lLCBiZWNhdXNlLCBvbiBzb21lCitwbGF0Zm9ybXMsIHRoZSByZWFkIHRpbWVvdXQgaXNuJ3Qgc3VwcG9ydGVkLCBhbmQsIG9uIG90aGVyIHBsYXRmb3JtcywKK3RoZSB0aW1lciBkb2Vzbid0IHN0YXJ0IHVudGlsIGF0IGxlYXN0IG9uZSBwYWNrZXQgYXJyaXZlcy4gIFRoaXMgbWVhbnMKK3RoYXQgdGhlIHJlYWQgdGltZW91dCBzaG91bGQKKy5CIE5PVAorYmUgdXNlZCwgZm9yIGV4YW1wbGUsIGluIGFuIGludGVyYWN0aXZlIGFwcGxpY2F0aW9uIHRvIGFsbG93IHRoZSBwYWNrZXQKK2NhcHR1cmUgbG9vcCB0byBgYHBvbGwnJyBmb3IgdXNlciBpbnB1dCBwZXJpb2RpY2FsbHksIGFzIHRoZXJlJ3Mgbm8KK2d1YXJhbnRlZSB0aGF0IGEgY2FsbCByZWFkaW5nIHBhY2tldHMgd2lsbCByZXR1cm4gYWZ0ZXIgdGhlIHRpbWVvdXQKK2V4cGlyZXMgZXZlbiBpZiBubyBwYWNrZXRzIGhhdmUgYXJyaXZlZC4KKy5JUAorVGhlIHJlYWQgdGltZW91dCBpcyBzZXQgd2l0aAorLkJSIHBjYXBfc2V0X3RpbWVvdXQgKCkuCisuSVAgImJ1ZmZlciBzaXplIgorUGFja2V0cyB0aGF0IGFycml2ZSBmb3IgYSBjYXB0dXJlIGFyZSBzdG9yZWQgaW4gYSBidWZmZXIsIHNvIHRoYXQgdGhleQorZG8gbm90IGhhdmUgdG8gYmUgcmVhZCBieSB0aGUgYXBwbGljYXRpb24gYXMgc29vbiBhcyB0aGV5IGFycml2ZS4gIE9uCitzb21lIHBsYXRmb3JtcywgdGhlIGJ1ZmZlcidzIHNpemUgY2FuIGJlIHNldDsgYSBzaXplIHRoYXQncyB0b28gc21hbGwKK2NvdWxkIG1lYW4gdGhhdCwgaWYgdG9vIG1hbnkgcGFja2V0cyBhcmUgYmVpbmcgY2FwdHVyZWQgYW5kIHRoZSBzbmFwc2hvdAorbGVuZ3RoIGRvZXNuJ3QgbGltaXQgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQncyBidWZmZXJlZCwgcGFja2V0cyBjb3VsZAorYmUgZHJvcHBlZCBpZiB0aGUgYnVmZmVyIGZpbGxzIHVwIGJlZm9yZSB0aGUgYXBwbGljYXRpb24gY2FuIHJlYWQKK3BhY2tldHMgZnJvbSBpdCwgd2hpbGUgYSBzaXplIHRoYXQncyB0b28gbGFyZ2UgY291bGQgdXNlIG1vcmUKK25vbi1wYWdlYWJsZSBvcGVyYXRpbmcgc3lzdGVtIG1lbW9yeSB0aGFuIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50CitwYWNrZXRzIGZyb20gYmVpbmcgZHJvcHBlZC4KKy5JUAorVGhlIGJ1ZmZlciBzaXplIGlzIHNldCB3aXRoCisuQlIgcGNhcF9zZXRfYnVmZmVyX3NpemUgKCkuCisuSVAgInRpbWVzdGFtcCB0eXBlIgorT24gc29tZSBwbGF0Zm9ybXMsIHRoZSB0aW1lIHN0YW1wIGdpdmVuIHRvIHBhY2tldHMgb24gbGl2ZSBjYXB0dXJlcyBjYW4KK2NvbWUgZnJvbSBkaWZmZXJlbnQgc291cmNlcyB0aGF0IGNhbiBoYXZlIGRpZmZlcmVudCByZXNvbHV0aW9ucyBvciB0aGF0CitjYW4gaGF2ZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyB0byB0aGUgdGltZSB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IHRpbWUKK3N1cHBsaWVkIGJ5IHJvdXRpbmVzIG9uIHRoZSBuYXRpdmUgb3BlcmF0aW5nIHN5c3RlbS4gIFNlZQorLkJSIHBjYXAtdHN0YW1wICg3KQorZm9yIGEgbGlzdCBvZiB0aW1lIHN0YW1wIHR5cGVzLgorLklQCitUaGUgdGltZSBzdGFtcCB0eXBlIGlzIHNldCB3aXRoCisuQlIgcGNhcF9zZXRfdHN0YW1wX3R5cGUgKCkuCisuUFAKK1JlYWRpbmcgcGFja2V0cyBmcm9tIGEgbmV0d29yayBpbnRlcmZhY2UgbWF5IHJlcXVpcmUgdGhhdCB5b3UgaGF2ZQorc3BlY2lhbCBwcml2aWxlZ2VzOgorLlRQCisuQiBVbmRlciBTdW5PUyAzLnggb3IgNC54IHdpdGggTklUIG9yIEJQRjoKK1lvdSBtdXN0IGhhdmUgcmVhZCBhY2Nlc3MgdG8KKy5JIC9kZXYvbml0CitvcgorLklSIC9kZXYvYnBmKiAuCisuVFAKKy5CIFVuZGVyIFNvbGFyaXMgd2l0aCBETFBJOgorWW91IG11c3QgaGF2ZSByZWFkL3dyaXRlIGFjY2VzcyB0byB0aGUgbmV0d29yayBwc2V1ZG8gZGV2aWNlLCBlLmcuCisuSVIgL2Rldi9sZSAuCitPbiBhdCBsZWFzdCBzb21lIHZlcnNpb25zIG9mIFNvbGFyaXMsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IHN1ZmZpY2llbnQgdG8KK2FsbG93CisuSSB0Y3BkdW1wCit0byBjYXB0dXJlIGluIHByb21pc2N1b3VzIG1vZGU7IG9uIHRob3NlIHZlcnNpb25zIG9mIFNvbGFyaXMsIHlvdSBtdXN0CitiZSByb290LCBvciB0aGUgYXBwbGljYXRpb24gY2FwdHVyaW5nIHBhY2tldHMKK211c3QgYmUgaW5zdGFsbGVkIHNldHVpZCB0byByb290LCBpbiBvcmRlciB0byBjYXB0dXJlIGluIHByb21pc2N1b3VzCittb2RlLiAgTm90ZSB0aGF0LCBvbiBtYW55IChwZXJoYXBzIGFsbCkgaW50ZXJmYWNlcywgaWYgeW91IGRvbid0IGNhcHR1cmUKK2luIHByb21pc2N1b3VzIG1vZGUsIHlvdSB3aWxsIG5vdCBzZWUgYW55IG91dGdvaW5nIHBhY2tldHMsIHNvIGEgY2FwdHVyZQorbm90IGRvbmUgaW4gcHJvbWlzY3VvdXMgbW9kZSBtYXkgbm90IGJlIHZlcnkgdXNlZnVsLgorLklQCitJbiBuZXdlciB2ZXJzaW9ucyBvZiBTb2xhcmlzLCB5b3UgbXVzdCBoYXZlIGJlZW4gZ2l2ZW4gdGhlCisuQiBuZXRfcmF3YWNjZXNzCitwcml2aWxlZ2U7IHRoaXMgaXMgYm90aCBuZWNlc3NhcnkgYW5kIHN1ZmZpY2llbnQgdG8gZ2l2ZSB5b3UgYWNjZXNzIHRvIHRoZQorbmV0d29yayBwc2V1ZG8tZGV2aWNlIC0gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIHByaXZpbGVnZXMgb24KK3RoYXQgZGV2aWNlLiAgQSB1c2VyIGNhbiBiZSBnaXZlbiB0aGF0IHByaXZpbGVnZSBieSwgZm9yIGV4YW1wbGUsIGFkZGluZwordGhhdCBwcml2aWxlZ2UgdG8gdGhlIHVzZXIncworLkIgZGVmYXVsdHByaXYKK2tleSB3aXRoIHRoZQorLkIgdXNlcm1vZCAoMU0pCitjb21tYW5kLgorLlRQCisuQiBVbmRlciBIUC1VWCB3aXRoIERMUEk6CitZb3UgbXVzdCBiZSByb290IG9yIHRoZSBhcHBsaWNhdGlvbiBjYXB0dXJpbmcgcGFja2V0cyBtdXN0IGJlIGluc3RhbGxlZAorc2V0dWlkIHRvIHJvb3QuCisuVFAKKy5CIFVuZGVyIElSSVggd2l0aCBzbm9vcDoKK1lvdSBtdXN0IGJlIHJvb3Qgb3IgdGhlIGFwcGxpY2F0aW9uIGNhcHR1cmluZyBwYWNrZXRzIG11c3QgYmUgaW5zdGFsbGVkCitzZXR1aWQgdG8gcm9vdC4KKy5UUAorLkIgVW5kZXIgTGludXg6CitZb3UgbXVzdCBiZSByb290IG9yIHRoZSBhcHBsaWNhdGlvbiBjYXB0dXJpbmcgcGFja2V0cyBtdXN0IGJlIGluc3RhbGxlZAorc2V0dWlkIHRvIHJvb3QgKHVubGVzcyB5b3VyIGRpc3RyaWJ1dGlvbiBoYXMgYSBrZXJuZWwKK3RoYXQgc3VwcG9ydHMgY2FwYWJpbGl0eSBiaXRzIHN1Y2ggYXMgQ0FQX05FVF9SQVcgYW5kIGNvZGUgdG8gYWxsb3cKK3Rob3NlIGNhcGFiaWxpdHkgYml0cyB0byBiZSBnaXZlbiB0byBwYXJ0aWN1bGFyIGFjY291bnRzIGFuZCB0byBjYXVzZQordGhvc2UgYml0cyB0byBiZSBzZXQgb24gYSB1c2VyJ3MgaW5pdGlhbCBwcm9jZXNzZXMgd2hlbiB0aGV5IGxvZyBpbiwgaW4KK3doaWNoIGNhc2UgeW91ICBtdXN0IGhhdmUgQ0FQX05FVF9SQVcgaW4gb3JkZXIgdG8gY2FwdHVyZSBhbmQKK0NBUF9ORVRfQURNSU4gdG8gZW51bWVyYXRlIG5ldHdvcmsgZGV2aWNlcyB3aXRoLCBmb3IgZXhhbXBsZSwgdGhlCisuQiBcLUQKK2ZsYWcpLgorLlRQCisuQiBVbmRlciBVTFRSSVggYW5kIERpZ2l0YWwgVU5JWC9UcnU2NCBVTklYOgorQW55IHVzZXIgbWF5IGNhcHR1cmUgbmV0d29yayB0cmFmZmljLgorSG93ZXZlciwgbm8gdXNlciAobm90IGV2ZW4gdGhlIHN1cGVyLXVzZXIpIGNhbiBjYXB0dXJlIGluIHByb21pc2N1b3VzCittb2RlIG9uIGFuIGludGVyZmFjZSB1bmxlc3MgdGhlIHN1cGVyLXVzZXIgaGFzIGVuYWJsZWQgcHJvbWlzY3VvdXMtbW9kZQorb3BlcmF0aW9uIG9uIHRoYXQgaW50ZXJmYWNlIHVzaW5nCisuSVIgcGZjb25maWcgKDgpLAorYW5kIG5vIHVzZXIgKG5vdCBldmVuIHRoZSBzdXBlci11c2VyKSBjYW4gY2FwdHVyZSB1bmljYXN0IHRyYWZmaWMKK3JlY2VpdmVkIGJ5IG9yIHNlbnQgYnkgdGhlIG1hY2hpbmUgb24gYW4gaW50ZXJmYWNlIHVubGVzcyB0aGUgc3VwZXItdXNlcgoraGFzIGVuYWJsZWQgY29weS1hbGwtbW9kZSBvcGVyYXRpb24gb24gdGhhdCBpbnRlcmZhY2UgdXNpbmcKKy5JUiBwZmNvbmZpZyAsCitzbworLkkgdXNlZnVsCitwYWNrZXQgY2FwdHVyZSBvbiBhbiBpbnRlcmZhY2UgcHJvYmFibHkgcmVxdWlyZXMgdGhhdCBlaXRoZXIKK3Byb21pc2N1b3VzLW1vZGUgb3IgY29weS1hbGwtbW9kZSBvcGVyYXRpb24sIG9yIGJvdGggbW9kZXMgb2YKK29wZXJhdGlvbiwgYmUgZW5hYmxlZCBvbiB0aGF0IGludGVyZmFjZS4KKy5UUAorLkIgVW5kZXIgQlNEICh0aGlzIGluY2x1ZGVzIE1hYyBPUyBYKToKK1lvdSBtdXN0IGhhdmUgcmVhZCBhY2Nlc3MgdG8KKy5JIC9kZXYvYnBmKgorb24gc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgYSBjbG9uaW5nIEJQRiBkZXZpY2UsIG9yIHRvCisuSSAvZGV2L2JwZgorb24gc3lzdGVtcyB0aGF0IGRvLgorT24gQlNEcyB3aXRoIGEgZGV2ZnMgKHRoaXMgaW5jbHVkZXMgTWFjIE9TIFgpLCB0aGlzIG1pZ2h0IGludm9sdmUgbW9yZQordGhhbiBqdXN0IGhhdmluZyBzb21lYm9keSB3aXRoIHN1cGVyLXVzZXIgYWNjZXNzIHNldHRpbmcgdGhlIG93bmVyc2hpcAorb3IgcGVybWlzc2lvbnMgb24gdGhlIEJQRiBkZXZpY2VzIC0gaXQgbWlnaHQgaW52b2x2ZSBjb25maWd1cmluZyBkZXZmcwordG8gc2V0IHRoZSBvd25lcnNoaXAgb3IgcGVybWlzc2lvbnMgZXZlcnkgdGltZSB0aGUgc3lzdGVtIGlzIGJvb3RlZCwKK2lmIHRoZSBzeXN0ZW0gZXZlbiBzdXBwb3J0cyB0aGF0OyBpZiBpdCBkb2Vzbid0IHN1cHBvcnQgdGhhdCwgeW91IG1pZ2h0CitoYXZlIHRvIGZpbmQgc29tZSBvdGhlciB3YXkgdG8gbWFrZSB0aGF0IGhhcHBlbiBhdCBib290IHRpbWUuCisuUFAKK1JlYWRpbmcgYSBzYXZlZCBwYWNrZXQgZmlsZSBkb2Vzbid0IHJlcXVpcmUgc3BlY2lhbCBwcml2aWxlZ2VzLgorLlBQCitUaGUgcGFja2V0cyByZWFkIGZyb20gdGhlIGhhbmRsZSBtYXkgaW5jbHVkZSBhIGBgcHNldWRvLWhlYWRlcicnCitjb250YWluaW5nIHZhcmlvdXMgZm9ybXMgb2YgcGFja2V0IG1ldGEtZGF0YSwgYW5kIHByb2JhYmx5IGluY2x1ZGVzIGEKK2xpbmstbGF5ZXIgaGVhZGVyIHdob3NlIGNvbnRlbnRzIGNhbiBkaWZmZXIgZm9yIGRpZmZlcmVudCBuZXR3b3JrCitpbnRlcmZhY2VzLiAgVG8gZGV0ZXJtaW5lIHRoZSBmb3JtYXQgb2YgdGhlIHBhY2tldHMgc3VwcGxpZWQgYnkgdGhlCitoYW5kbGUsIGNhbGwKKy5CUiBwY2FwX2RhdGFsaW5rICgpOworLkkgaHR0cDovL3d3dy50Y3BkdW1wLm9yZy9saW5rdHlwZXMuaHRtbAorbGlzdHMgdGhlIHZhbHVlcyBpdCByZXR1cm5zIGFuZCBkZXNjcmliZXMgdGhlIHBhY2tldCBmb3JtYXRzIHRoYXQKK2NvcnJlc3BvbmQgdG8gdGhvc2UgdmFsdWVzLgorLlBQCitEbworLkIgTk9UCithc3N1bWUgdGhhdCB0aGUgcGFja2V0cyBmb3IgYSBnaXZlbiBjYXB0dXJlIG9yIGBgc2F2ZWZpbGVgYCB3aWxsIGhhdmUKK2FueSBnaXZlbiBsaW5rLWxheWVyIGhlYWRlciB0eXBlLCBzdWNoIGFzCisuQiBETFRfRU4xME1CCitmb3IgRXRoZXJuZXQuICBGb3IgZXhhbXBsZSwgdGhlICJhbnkiIGRldmljZSBvbiBMaW51eCB3aWxsIGhhdmUgYQorbGluay1sYXllciBoZWFkZXIgdHlwZSBvZgorLkIgRExUX0xJTlVYX1NMTAorZXZlbiBpZiBhbGwgZGV2aWNlcyBvbiB0aGUgc3lzdGVtIGF0IHRoZSB0aW1lIHRoZSAiYW55IiBkZXZpY2UgaXMgb3BlbmVkCitoYXZlIHNvbWUgb3RoZXIgZGF0YSBsaW5rIHR5cGUsIHN1Y2ggYXMKKy5CIERMVF9FTjEwTUIKK2ZvciBFdGhlcm5ldC4KKy5QUAorVG8gb2J0YWluIHRoZQorLkIgIkZJTEVcICoiCitjb3JyZXNwb25kaW5nIHRvIGEKKy5CIHBjYXBfdAorb3BlbmVkIGZvciBhIGBgc2F2ZWZpbGUnJywgY2FsbAorLkJSIHBjYXBfZmlsZSAoKS4KKy5UUAorLkIgUm91dGluZXMKKy5SUworLlRQCisuQlIgcGNhcF9jcmVhdGUgKDNQQ0FQKQorZ2V0IGEKKy5CIHBjYXBfdAorZm9yIGxpdmUgY2FwdHVyZQorLlRQCisuQlIgcGNhcF9hY3RpdmF0ZSAoM1BDQVApCithY3RpdmF0ZSBhCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfZmluZGFsbGRldnMgKDNQQ0FQKQorZ2V0IGEgbGlzdCBvZiBkZXZpY2VzIHRoYXQgY2FuIGJlIG9wZW5lZCBmb3IgYSBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfZnJlZWFsbGRldnMgKDNQQ0FQKQorZnJlZSBsaXN0IG9mIGRldmljZXMKKy5UUAorLkJSIHBjYXBfbG9va3VwZGV2ICgzUENBUCkKK2dldCBmaXJzdCBub24tbG9vcGJhY2sgZGV2aWNlIG9uIHRoYXQgbGlzdAorLlRQCisuQlIgcGNhcF9vcGVuX29mZmxpbmUgKDNQQ0FQKQorb3BlbiBhCisuQiBwY2FwX3QKK2ZvciBhIGBgc2F2ZWZpbGUnJywgZ2l2ZW4gYSBwYXRobmFtZQorLlRQCisuQlIgcGNhcF9vcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uICgzUENBUCkKK29wZW4gYQorLkIgcGNhcF90Citmb3IgYSBgYHNhdmVmaWxlJycsIGdpdmVuIGEgcGF0aG5hbWUsIGFuZCBzcGVjaWZ5IHRoZSBwcmVjaXNpb24gdG8KK3Byb3ZpZGUgZm9yIHBhY2tldCB0aW1lIHN0YW1wcworLlRQCisuQlIgcGNhcF9mb3Blbl9vZmZsaW5lICgzUENBUCkKK29wZW4gYQorLkIgcGNhcF90Citmb3IgYSBgYHNhdmVmaWxlJycsIGdpdmVuIGEKKy5CICJGSUxFXCAqIgorLlRQCisuQlIgcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbiAoM1BDQVApCitvcGVuIGEKKy5CIHBjYXBfdAorZm9yIGEgYGBzYXZlZmlsZScnLCBnaXZlbiBhCisuQlIgIkZJTEVcICoiICwKK2FuZCBzcGVjaWZ5IHRoZSBwcmVjaXNpb24gdG8gcHJvdmlkZSBmb3IgcGFja2V0IHRpbWUgc3RhbXBzCisuVFAKKy5CUiBwY2FwX29wZW5fZGVhZCAoM1BDQVApCitjcmVhdGUgYSBgYGZha2UnJworLkIgcGNhcF90CisuVFAKKy5CUiBwY2FwX2Nsb3NlICgzUENBUCkKK2Nsb3NlIGEKKy5CIHBjYXBfdAorLlRQCisuQlIgcGNhcF9zZXRfc25hcGxlbiAoM1BDQVApCitzZXQgdGhlIHNuYXBzaG90IGxlbmd0aCBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorLkIgcGNhcF90Citmb3IgbGl2ZSBjYXB0dXJlCisuVFAKKy5CUiBwY2FwX3NuYXBzaG90ICgzUENBUCkKK2dldCB0aGUgc25hcHNob3QgbGVuZ3RoIGZvciBhCisuQiBwY2FwX3QKKy5UUAorLkJSIHBjYXBfc2V0X3Byb21pc2MgKDNQQ0FQKQorc2V0IHByb21pc2N1b3VzIG1vZGUgZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQKKy5CIHBjYXBfdAorZm9yIGxpdmUgY2FwdHVyZQorLlRQCisuQlIgcGNhcF9zZXRfcmZtb24gKDNQQ0FQKQorc2V0IG1vbml0b3IgbW9kZSBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorLkIgcGNhcF90Citmb3IgbGl2ZSBjYXB0dXJlCisuVFAKKy5CUiBwY2FwX2Nhbl9zZXRfcmZtb24gKDNQQ0FQKQorZGV0ZXJtaW5lIHdoZXRoZXIgbW9uaXRvciBtb2RlIGNhbiBiZSBzZXQgZm9yIGEKKy5CIHBjYXBfdAorZm9yIGxpdmUgY2FwdHVyZQorLlRQCisuQlIgcGNhcF9zZXRfdGltZW91dCAoM1BDQVApCitzZXQgcmVhZCB0aW1lb3V0IGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfc2V0X2J1ZmZlcl9zaXplICgzUENBUCkKK3NldCBidWZmZXIgc2l6ZSBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorLkIgcGNhcF90Citmb3IgbGl2ZSBjYXB0dXJlCisuVFAKKy5CUiBwY2FwX3NldF90c3RhbXBfdHlwZSAoM1BDQVApCitzZXQgdGltZSBzdGFtcCB0eXBlIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfbGlzdF90c3RhbXBfdHlwZXMgKDNQQ0FQKQorZ2V0IGxpc3Qgb2YgYXZhaWxhYmxlIHRpbWUgc3RhbXAgdHlwZXMgZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQKKy5CIHBjYXBfdAorZm9yIGxpdmUgY2FwdHVyZQorLlRQCisuQlIgcGNhcF9mcmVlX3RzdGFtcF90eXBlcyAoM1BDQVApCitmcmVlIGxpc3Qgb2YgYXZhaWxhYmxlIHRpbWUgc3RhbXAgdHlwZXMKKy5UUAorLkJSIHBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUgKDNQQ0FQKQorZ2V0IG5hbWUgZm9yIGEgdGltZSBzdGFtcCB0eXBlCisuVFAKKy5CUiBwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19kZXNjcmlwdGlvbiAoM1BDQVApCitnZXQgZGVzY3JpcHRpb24gZm9yIGEgdGltZSBzdGFtcCB0eXBlCisuVFAKKy5CUiBwY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsICgzUENBUCkKK2dldCB0aW1lIHN0YW1wIHR5cGUgY29ycmVzcG9uZGluZyB0byBhIG5hbWUKKy5UUAorLkJSIHBjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24gKDNQQ0FQKQorc2V0IHRpbWUgc3RhbXAgcHJlY2lzaW9uIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfZ2V0X3RzdGFtcF9wcmVjaXNpb24gKDNQQ0FQKQorZ2V0IHRoZSB0aW1lIHN0YW1wIHByZWNpc2lvbiBvZiBhCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfZGF0YWxpbmsgKDNQQ0FQKQorZ2V0IGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgZm9yIGEKKy5CIHBjYXBfdAorLlRQCisuQlIgcGNhcF9maWxlICgzUENBUCkKK2dldCB0aGUKKy5CICJGSUxFXCAqIgorZm9yIGEKKy5CIHBjYXBfdAorb3BlbmVkIGZvciBhIGBgc2F2ZWZpbGUnJworLlRQCisuQlIgcGNhcF9pc19zd2FwcGVkICgzUENBUCkKK2RldGVybWluZSB3aGV0aGVyIGEgYGBzYXZlZmlsZScnIGJlaW5nIHJlYWQgY2FtZSBmcm9tIGEgbWFjaGluZSB3aXRoIHRoZQorb3Bwb3NpdGUgYnl0ZSBvcmRlcgorLlRQCisuQlIgcGNhcF9tYWpvcl92ZXJzaW9uICgzUENBUCkKKy5QRCAwCisuVFAKKy5CUiBwY2FwX21pbm9yX3ZlcnNpb24gKDNQQ0FQKQorZ2V0IHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBvZiB0aGUgZmlsZSBmb3JtYXQgdmVyc2lvbiBmb3IgYQorYGBzYXZlZmlsZScnCisuUEQKKy5SRQorLlNTIFNlbGVjdGluZyBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgZm9yIGEgbGl2ZSBjYXB0dXJlCitTb21lIGRldmljZXMgbWF5IHByb3ZpZGUgbW9yZSB0aGFuIG9uZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlLiAgVG8KK29idGFpbiBhIGxpc3Qgb2YgYWxsIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzIHByb3ZpZGVkIGJ5IGEgZGV2aWNlLCBjYWxsCisuQlIgcGNhcF9saXN0X2RhdGFsaW5rcyAoKQorb24gYW4gYWN0aXZhdGVkCisuQiBwY2FwX3QKK2ZvciB0aGUgZGV2aWNlLgorVG8gZnJlZSBhIGxpc3Qgb2YgbGluay1sYXllciBoZWFkZXIgdHlwZXMsIGNhbGwKKy5CUiBwY2FwX2ZyZWVfZGF0YWxpbmtzICgpLgorVG8gc2V0IHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIGZvciBhIGRldmljZSwgY2FsbAorLkJSIHBjYXBfc2V0X2RhdGFsaW5rICgpLgorVGhpcyBzaG91bGQgYmUgZG9uZSBhZnRlciB0aGUgZGV2aWNlIGhhcyBiZWVuIGFjdGl2YXRlZCBidXQgYmVmb3JlIGFueQorcGFja2V0cyBhcmUgcmVhZCBhbmQgYmVmb3JlIGFueSBmaWx0ZXJzIGFyZSBjb21waWxlZCBvciBpbnN0YWxsZWQuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfbGlzdF9kYXRhbGlua3MgKDNQQ0FQKQorZ2V0IGEgbGlzdCBvZiBsaW5rLWxheWVyIGhlYWRlciB0eXBlcyBmb3IgYSBkZXZpY2UKKy5UUAorLkJSIHBjYXBfZnJlZV9kYXRhbGlua3MgKDNQQ0FQKQorZnJlZSBsaXN0IG9mIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzCisuVFAKKy5CUiBwY2FwX3NldF9kYXRhbGluayAoM1BDQVApCitzZXQgbGluay1sYXllciBoZWFkZXIgdHlwZSBmb3IgYSBkZXZpY2UKKy5UUAorLkJSIHBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUgKDNQQ0FQKQorZ2V0IG5hbWUgZm9yIGEgbGluay1sYXllciBoZWFkZXIgdHlwZQorLlRQCisuQlIgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24gKDNQQ0FQKQorZ2V0IGRlc2NyaXB0aW9uIGZvciBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUKKy5UUAorLkJSIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwgKDNQQ0FQKQorZ2V0IGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgY29ycmVzcG9uZGluZyB0byBhIG5hbWUKKy5SRQorLlNTIFJlYWRpbmcgcGFja2V0cworUGFja2V0cyBhcmUgcmVhZCB3aXRoCisuQlIgcGNhcF9kaXNwYXRjaCAoKQorb3IKKy5CUiBwY2FwX2xvb3AgKCksCit3aGljaCBwcm9jZXNzIG9uZSBvciBtb3JlIHBhY2tldHMsIGNhbGxpbmcgYSBjYWxsYmFjayByb3V0aW5lIGZvciBlYWNoCitwYWNrZXQsIG9yIHdpdGgKKy5CUiBwY2FwX25leHQgKCkKK29yCisuQlIgcGNhcF9uZXh0X2V4ICgpLAord2hpY2ggcmV0dXJuIHRoZSBuZXh0IHBhY2tldC4KK1RoZSBjYWxsYmFjayBmb3IKKy5CUiBwY2FwX2Rpc3BhdGNoICgpCithbmQKKy5CUiBwY2FwX2xvb3AgKCkKK2lzIHN1cHBsaWVkIGEgcG9pbnRlciB0byBhCisuSVIgInN0cnVjdCBwY2FwX3BrdGhkciIgLAord2hpY2ggaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgorLlJTCisuVFAKKy5CIHRzCithCisuSSBzdHJ1Y3QgdGltZXZhbAorY29udGFpbmluZyB0aGUgdGltZSB3aGVuIHRoZSBwYWNrZXQgd2FzIGNhcHR1cmVkCisuVFAKKy5CIGNhcGxlbgorYQorLkkgYnBmX3VfaW50MzIKK2dpdmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBwYWNrZXQgdGhhdCBhcmUgYXZhaWxhYmxlIGZyb20gdGhlCitjYXB0dXJlCisuVFAKKy5CIGxlbgorYQorLkkgYnBmX3VfaW50MzIKK2dpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQsIGluIGJ5dGVzICh3aGljaCBtaWdodCBiZSBtb3JlIHRoYW4gdGhlCitudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGZyb20gdGhlIGNhcHR1cmUsIGlmIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldAoraXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNhcHR1cmUpLgorLlJFCisuUFAKK1RoZSBjYWxsYmFjayBpcyBhbHNvIHN1cHBsaWVkIGEKKy5JIGNvbnN0IHVfY2hhcgorcG9pbnRlciB0byB0aGUgZmlyc3QKKy5CIGNhcGxlbgorKGFzIGdpdmVuIGluIHRoZQorLkkgc3RydWN0IHBjYXBfcGt0aGRyCittZW50aW9uZWQgYWJvdmUpCitieXRlcyBvZiBkYXRhIGZyb20gdGhlIHBhY2tldC4gIFRoaXMgd29uJ3QgbmVjZXNzYXJpbHkgYmUgdGhlIGVudGlyZQorcGFja2V0OyB0byBjYXB0dXJlIHRoZSBlbnRpcmUgcGFja2V0LCB5b3Ugd2lsbCBoYXZlIHRvIHByb3ZpZGUgYSB2YWx1ZQorZm9yCisuSSBzbmFwbGVuCitpbiB5b3VyIGNhbGwgdG8KKy5CUiBwY2FwX3NldF9zbmFwbGVuICgpCit0aGF0IGlzIHN1ZmZpY2llbnRseSBsYXJnZSB0byBnZXQgYWxsIG9mIHRoZSBwYWNrZXQncyBkYXRhIC0gYSB2YWx1ZSBvZgorNjU1MzUgc2hvdWxkIGJlIHN1ZmZpY2llbnQgb24gbW9zdCBpZiBub3QgYWxsIG5ldHdvcmtzKS4gIFdoZW4gcmVhZGluZworZnJvbSBhIGBgc2F2ZWZpbGUnJywgdGhlIHNuYXBzaG90IGxlbmd0aCBzcGVjaWZpZWQgd2hlbiB0aGUgY2FwdHVyZSB3YXMKK3BlcmZvcm1lZCB3aWxsIGxpbWl0IHRoZSBhbW91bnQgb2YgcGFja2V0IGRhdGEgYXZhaWxhYmxlLgorLlBQCisuQlIgcGNhcF9uZXh0ICgpCitpcyBwYXNzZWQgYW4gYXJndW1lbnQgdGhhdCBwb2ludHMgdG8gYQorLkkgc3RydWN0IHBjYXBfcGt0aGRyCitzdHJ1Y3R1cmUsIGFuZCBmaWxscyBpdCBpbiB3aXRoIHRoZSB0aW1lIHN0YW1wIGFuZCBsZW5ndGggdmFsdWVzIGZvciB0aGUKK3BhY2tldC4gIEl0IHJldHVybnMgYQorLkkgY29uc3QgdV9jaGFyCit0byB0aGUgZmlyc3QKKy5CIGNhcGxlbgorYnl0ZXMgb2YgdGhlIHBhY2tldCBvbiBzdWNjZXNzLCBhbmQgTlVMTCBvbiBlcnJvci4KKy5QUAorLkJSIHBjYXBfbmV4dF9leCAoKQoraXMgcGFzc2VkIHR3byBwb2ludGVyIGFyZ3VtZW50cywgb25lIG9mIHdoaWNoIHBvaW50cyB0byBhCisuSVIgc3RydWN0IHBjYXBfcGt0aGRyICoKK2FuZCBvbmUgb2Ygd2hpY2ggcG9pbnRzIHRvIGEKKy5JUiAiY29uc3QgdV9jaGFyIiAqLgorSXQgc2V0cyB0aGUgZmlyc3QgcG9pbnRlciB0byBwb2ludCB0byBhCisuSSBzdHJ1Y3QgcGNhcF9wa3RoZHIKK3N0cnVjdHVyZSB3aXRoIHRoZSB0aW1lIHN0YW1wIGFuZCBsZW5ndGggdmFsdWVzIGZvciB0aGUgcGFja2V0LCBhbmQgc2V0cwordGhlIHNlY29uZCBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBmaXJzdAorLkIgY2FwbGVuCitieXRlcyBvZiB0aGUgcGFja2V0LgorLlBQCitUbyBmb3JjZSB0aGUgbG9vcCBpbgorLkJSIHBjYXBfZGlzcGF0Y2ggKCkKK29yCisuQlIgcGNhcF9sb29wICgpCit0byB0ZXJtaW5hdGUsIGNhbGwKKy5CUiBwY2FwX2JyZWFrbG9vcCAoKS4KKy5QUAorQnkgZGVmYXVsdCwgd2hlbiByZWFkaW5nIHBhY2tldHMgZnJvbSBhbiBpbnRlcmZhY2Ugb3BlbmVkIGZvciBhIGxpdmUKK2NhcHR1cmUsCisuQlIgcGNhcF9kaXNwYXRjaCAoKSwKKy5CUiBwY2FwX25leHQgKCksCithbmQKKy5CUiBwY2FwX25leHRfZXggKCkKK3dpbGwsIGlmIG5vIHBhY2tldHMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUgdG8gYmUgcmVhZCwgYmxvY2sgd2FpdGluZworZm9yIHBhY2tldHMgdG8gYmVjb21lIGF2YWlsYWJsZS4gIE9uIHNvbWUsIGJ1dAorLkkgbm90CithbGwsIHBsYXRmb3JtcywgaWYgYSByZWFkIHRpbWVvdXQgd2FzIHNwZWNpZmllZCwgdGhlIHdhaXQgd2lsbCB0ZXJtaW5hdGUKK2FmdGVyIHRoZSByZWFkIHRpbWVvdXQgZXhwaXJlczsgYXBwbGljYXRpb25zIHNob3VsZCBiZSBwcmVwYXJlZCBmb3IKK3RoaXMsIGFzIGl0IGhhcHBlbnMgb24gc29tZSBwbGF0Zm9ybXMsIGJ1dCBzaG91bGQgbm90IHJlbHkgb24gaXQsIGFzIGl0Citkb2VzIG5vdCBoYXBwZW4gb24gb3RoZXIgcGxhdGZvcm1zLiAgTm90ZSB0aGF0IHRoZSB3YWl0IG1pZ2h0LCBvciBtaWdodAorbm90LCB0ZXJtaW5hdGUgZXZlbiBpZiBubyBwYWNrZXRzIGFyZSBhdmFpbGFibGU7IGFwcGxpY2F0aW9ucyBzaG91bGQgYmUKK3ByZXBhcmVkIGZvciB0aGlzIHRvIGhhcHBlbiwgYnV0IG11c3Qgbm90IHJlbHkgb24gaXQgaGFwcGVuaW5nLgorLlBQCitBIGhhbmRsZSBjYW4gYmUgcHV0IGludG8gYGBub24tYmxvY2tpbmcgbW9kZScnLCBzbyB0aGF0IHRob3NlIHJvdXRpbmVzCit3aWxsLCByYXRoZXIgdGhhbiBibG9ja2luZywgcmV0dXJuIGFuIGluZGljYXRpb24gdGhhdCBubyBwYWNrZXRzIGFyZQorYXZhaWxhYmxlIHRvIHJlYWQuICBDYWxsCisuQlIgcGNhcF9zZXRub25ibG9jayAoKQordG8gcHV0IGEgaGFuZGxlIGludG8gbm9uLWJsb2NraW5nIG1vZGUgb3IgdG8gdGFrZSBpdCBvdXQgb2Ygbm9uLWJsb2NraW5nCittb2RlOyBjYWxsCisuQlIgcGNhcF9nZXRub25ibG9jayAoKQordG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBoYW5kbGUgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUuICBOb3RlIHRoYXQKK25vbi1ibG9ja2luZyBtb2RlIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IGluIE1hYyBPUyBYIDEwLjYuCisuUFAKK05vbi1ibG9ja2luZyBtb2RlIGlzIG9mdGVuIGNvbWJpbmVkIHdpdGggcm91dGluZXMgc3VjaCBhcworLkJSIHNlbGVjdCAoMikKK29yCisuQlIgcG9sbCAoMikKK29yIG90aGVyIHJvdXRpbmVzIGEgcGxhdGZvcm0gb2ZmZXJzIHRvIHdhaXQgZm9yIGFueSBvZiBhIHNldCBvZgorZGVzY3JpcHRvcnMgdG8gYmUgcmVhZHkgdG8gcmVhZC4gIFRvIG9idGFpbiwgZm9yIGEgaGFuZGxlLCBhIGRlc2NyaXB0b3IKK3RoYXQgY2FuIGJlIHVzZWQgaW4gdGhvc2Ugcm91dGluZXMsIGNhbGwKKy5CUiBwY2FwX2dldF9zZWxlY3RhYmxlX2ZkICgpLgorTm90IGFsbCBoYW5kbGVzIGhhdmUgc3VjaCBhIGRlc2NyaXB0b3IgYXZhaWxhYmxlOworLkJSIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQgKCkKK3dpbGwgcmV0dXJuIFwtMSBpZiBubyBzdWNoIGRlc2NyaXB0b3IgZXhpc3RzLiAgSW4gYWRkaXRpb24sIGZvciB2YXJpb3VzCityZWFzb25zLCBvbmUgb3IgbW9yZSBvZiB0aG9zZSByb3V0aW5lcyB3aWxsIG5vdCB3b3JrIHByb3Blcmx5IHdpdGggdGhlCitkZXNjcmlwdG9yOyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKy5CUiBwY2FwX2dldF9zZWxlY3RhYmxlX2ZkICgpCitnaXZlcyBkZXRhaWxzLiAgTm90ZSB0aGF0LCBqdXN0IGFzIGFuIGF0dGVtcHQgdG8gcmVhZCBwYWNrZXRzIGZyb20gYQorLkIgcGNhcF90CittYXkgbm90IHJldHVybiBhbnkgcGFja2V0cyBpZiB0aGUgcmVhZCB0aW1lb3V0IGV4cGlyZXMsIGEKKy5CUiBzZWxlY3QgKCksCisuQlIgcG9sbCAoKSwKK29yIG90aGVyIHN1Y2ggY2FsbCBtYXksIGlmIHRoZSByZWFkIHRpbWVvdXQgZXhwaXJlcywgaW5kaWNhdGUgdGhhdCBhCitkZXNjcmlwdG9yIGlzIHJlYWR5IHRvIHJlYWQgZXZlbiBpZiB0aGVyZSBhcmUgbm8gcGFja2V0cyBhdmFpbGFibGUgdG8KK3JlYWQuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfZGlzcGF0Y2ggKDNQQ0FQKQorcmVhZCBhIGJ1ZmZlcmZ1bCBvZiBwYWNrZXRzIGZyb20gYQorLkIgcGNhcF90CitvcGVuIGZvciBhIGxpdmUgY2FwdHVyZSBvciB0aGUgZnVsbCBzZXQgb2YgcGFja2V0cyBmcm9tIGEKKy5CIHBjYXBfdAorb3BlbiBmb3IgYSBgYHNhdmVmaWxlJycKKy5UUAorLkJSIHBjYXBfbG9vcCAoM1BDQVApCityZWFkIHBhY2tldHMgZnJvbSBhCisuQiBwY2FwX3QKK3VudGlsIGFuIGludGVycnVwdCBvciBlcnJvciBvY2N1cnMKKy5UUAorLkJSIHBjYXBfbmV4dCAoM1BDQVApCityZWFkIHRoZSBuZXh0IHBhY2tldCBmcm9tIGEKKy5CIHBjYXBfdAord2l0aG91dCBhbiBpbmRpY2F0aW9uIHdoZXRoZXIgYW4gZXJyb3Igb2NjdXJyZWQKKy5UUAorLkJSIHBjYXBfbmV4dF9leCAoM1BDQVApCityZWFkIHRoZSBuZXh0IHBhY2tldCBmcm9tIGEKKy5CIHBjYXBfdAord2l0aCBhbiBlcnJvciBpbmRpY2F0aW9uIG9uIGFuIGVycm9yCisuVFAKKy5CUiBwY2FwX2JyZWFrbG9vcCAoM1BDQVApCitwcmVtYXR1cmVseSB0ZXJtaW5hdGUgdGhlIGxvb3AgaW4KKy5CUiBwY2FwX2Rpc3BhdGNoICgpCitvcgorLkJSIHBjYXBfbG9vcCAoKQorLlRQCisuQlIgcGNhcF9zZXRub25ibG9jayAoM1BDQVApCitzZXQgb3IgY2xlYXIgbm9uLWJsb2NraW5nIG1vZGUgb24gYQorLkIgcGNhcF90CisuVFAKKy5CUiBwY2FwX2dldG5vbmJsb2NrICgzUENBUCkKK2dldCB0aGUgc3RhdGUgb2Ygbm9uLWJsb2NraW5nIG1vZGUgZm9yIGEKKy5CIHBjYXBfdAorLlRQCisuQlIgcGNhcF9nZXRfc2VsZWN0YWJsZV9mZCAoM1BDQVApCithdHRlbXB0IHRvIGdldCBhIGRlc2NyaXB0b3IgZm9yIGEKKy5CIHBjYXBfdAordGhhdCBjYW4gYmUgdXNlZCBpbiBjYWxscyBzdWNoIGFzCisuQlIgc2VsZWN0ICgyKQorYW5kCisuQlIgcG9sbCAoMikKKy5SRQorLlNTIEZpbHRlcnMKK0luIG9yZGVyIHRvIGNhdXNlIG9ubHkgY2VydGFpbiBwYWNrZXRzIHRvIGJlIHJldHVybmVkIHdoZW4gcmVhZGluZworcGFja2V0cywgYSBmaWx0ZXIgY2FuIGJlIHNldCBvbiBhIGhhbmRsZS4gIEZvciBhIGxpdmUgY2FwdHVyZSwgdGhlCitmaWx0ZXJpbmcgd2lsbCBiZSBwZXJmb3JtZWQgaW4ga2VybmVsIG1vZGUsIGlmIHBvc3NpYmxlLCB0byBhdm9pZAorY29weWluZyBgYHVuaW50ZXJlc3RpbmcnJyBwYWNrZXRzIGZyb20gdGhlIGtlcm5lbCB0byB1c2VyIG1vZGUuCisuUFAKK0EgZmlsdGVyIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSB0ZXh0IHN0cmluZzsgdGhlIHN5bnRheCBhbmQgc2VtYW50aWNzIG9mCit0aGUgc3RyaW5nIGFyZSBhcyBkZXNjcmliZWQgYnkKKy5CUiBwY2FwLWZpbHRlciAoNykuCitBIGZpbHRlciBzdHJpbmcgaXMgY29tcGlsZWQgaW50byBhIHByb2dyYW0gaW4gYSBwc2V1ZG8tbWFjaGluZS1sYW5ndWFnZQorYnkKKy5CUiBwY2FwX2NvbXBpbGUgKCkKK2FuZCB0aGUgcmVzdWx0aW5nIHByb2dyYW0gY2FuIGJlIG1hZGUgYSBmaWx0ZXIgZm9yIGEgaGFuZGxlIHdpdGgKKy5CUiBwY2FwX3NldGZpbHRlciAoKS4KK1RoZSByZXN1bHQgb2YKKy5CUiBwY2FwX2NvbXBpbGUgKCkKK2NhbiBiZSBmcmVlZCB3aXRoIGEgY2FsbCB0bworLkJSIHBjYXBfZnJlZWNvZGUgKCkuCisuQlIgcGNhcF9jb21waWxlICgpCittYXkgcmVxdWlyZSBhIG5ldHdvcmsgbWFzayBmb3IgY2VydGFpbiBleHByZXNzaW9ucyBpbiB0aGUgZmlsdGVyIHN0cmluZzsKKy5CUiBwY2FwX2xvb2t1cG5ldCAoKQorY2FuIGJlIHVzZWQgdG8gZmluZCB0aGUgbmV0d29yayBhZGRyZXNzIGFuZCBuZXR3b3JrIG1hc2sgZm9yIGEgZ2l2ZW4KK2NhcHR1cmUgZGV2aWNlLgorLlBQCitBIGNvbXBpbGVkIGZpbHRlciBjYW4gYWxzbyBiZSBhcHBsaWVkIGRpcmVjdGx5IHRvIGEgcGFja2V0IHRoYXQgaGFzIGJlZW4KK3JlYWQgdXNpbmcKKy5CUiBwY2FwX29mZmxpbmVfZmlsdGVyICgpLgorLlRQCisuQiBSb3V0aW5lcworLlJTCisuVFAKKy5CUiBwY2FwX2NvbXBpbGUgKDNQQ0FQKQorY29tcGlsZSBmaWx0ZXIgZXhwcmVzc2lvbiB0byBhIHBzZXVkby1tYWNoaW5lLWxhbmd1YWdlIGNvZGUgcHJvZ3JhbQorLlRQCisuQlIgcGNhcF9mcmVlY29kZSAoM1BDQVApCitmcmVlIGEgZmlsdGVyIHByb2dyYW0KKy5UUAorLkJSIHBjYXBfc2V0ZmlsdGVyICgzUENBUCkKK3NldCBmaWx0ZXIgZm9yIGEKKy5CIHBjYXBfdAorLlRQCisuQlIgcGNhcF9sb29rdXBuZXQgKDNQQ0FQKQorZ2V0IG5ldHdvcmsgYWRkcmVzcyBhbmQgbmV0d29yayBtYXNrIGZvciBhIGNhcHR1cmUgZGV2aWNlCisuVFAKKy5CUiBwY2FwX29mZmxpbmVfZmlsdGVyICgzUENBUCkKK2FwcGx5IGEgZmlsdGVyIHByb2dyYW0gdG8gYSBwYWNrZXQKKy5SRQorLlNTIEluY29taW5nIGFuZCBvdXRnb2luZyBwYWNrZXRzCitCeSBkZWZhdWx0LCBsaWJwY2FwIHdpbGwgYXR0ZW1wdCB0byBjYXB0dXJlIGJvdGggcGFja2V0cyBzZW50IGJ5IHRoZQorbWFjaGluZSBhbmQgcGFja2V0cyByZWNlaXZlZCBieSB0aGUgbWFjaGluZS4gIFRvIGxpbWl0IGl0IHRvIGNhcHR1cmluZworb25seSBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSBtYWNoaW5lIG9yLCBpZiBwb3NzaWJsZSwgb25seSBwYWNrZXRzIHNlbnQKK2J5IHRoZSBtYWNoaW5lLCBjYWxsCisuQlIgcGNhcF9zZXRkaXJlY3Rpb24gKCkuCisuVFAKKy5CUiBSb3V0aW5lcworLlJTCisuVFAKKy5CUiBwY2FwX3NldGRpcmVjdGlvbiAoM1BDQVApCitzcGVjaWZ5IHdoZXRoZXIgdG8gY2FwdHVyZSBpbmNvbWluZyBwYWNrZXRzLCBvdXRnb2luZyBwYWNrZXRzLCBvciBib3RoCisuUkUKKy5TUyBDYXB0dXJlIHN0YXRpc3RpY3MKK1RvIGdldCBzdGF0aXN0aWNzIGFib3V0IHBhY2tldHMgcmVjZWl2ZWQgYW5kIGRyb3BwZWQgaW4gYSBsaXZlIGNhcHR1cmUsCitjYWxsCisuQlIgcGNhcF9zdGF0cyAoKS4KKy5UUAorLkIgUm91dGluZXMKKy5SUworLlRQCisuQlIgcGNhcF9zdGF0cyAoM1BDQVApCitnZXQgY2FwdHVyZSBzdGF0aXN0aWNzCisuUkUKKy5TUyBPcGVuaW5nIGEgaGFuZGxlIGZvciB3cml0aW5nIGNhcHR1cmVkIHBhY2tldHMKK1RvIG9wZW4gYSBgYHNhdmVmaWxlYGAgdG8gd2hpY2ggdG8gd3JpdGUgcGFja2V0cywgZ2l2ZW4gdGhlIHBhdGhuYW1lIHRoZQorYGBzYXZlZmlsZScnIHNob3VsZCBoYXZlLCBjYWxsCisuQlIgcGNhcF9kdW1wX29wZW4gKCkuCitUbyBvcGVuIGEgYGBzYXZlZmlsZWBgIHRvIHdoaWNoIHRvIHdyaXRlIHBhY2tldHMsIGdpdmVuIHRoZSBwYXRobmFtZSB0aGUKK2Bgc2F2ZWZpbGUnJyBzaG91bGQgaGF2ZSwgY2FsbAorLkJSIHBjYXBfZHVtcF9vcGVuICgpOwordG8gc2V0IHVwIGEgaGFuZGxlIGZvciBhIGBgc2F2ZWZpbGUnJywgZ2l2ZW4gYQorLkIgIkZJTEVcICoiCityZWZlcnJpbmcgdG8gYSBmaWxlIGFscmVhZHkgb3BlbmVkIGZvciB3cml0aW5nLCBjYWxsCisuQlIgcGNhcF9kdW1wX2ZvcGVuICgpLgorVGhleSBlYWNoIHJldHVybiBwb2ludGVycyB0byBhCisuQlIgcGNhcF9kdW1wZXJfdCAsCit3aGljaCBpcyB0aGUgaGFuZGxlIHVzZWQgZm9yIHdyaXRpbmcgcGFja2V0cyB0byB0aGUgYGBzYXZlZmlsZScnLiAgSWYgaXQKK3N1Y2NlZWRzLCBpdCB3aWxsIGhhdmUgY3JlYXRlZCB0aGUgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZAordHJ1bmNhdGVkIHRoZSBmaWxlIGlmIGl0IGRvZXMgZXhpc3QuCitUbyBjbG9zZSBhCisuQlIgcGNhcF9kdW1wZXJfdCAsCitjYWxsCisuQlIgcGNhcF9kdW1wX2Nsb3NlICgpLgorLlRQCisuQiBSb3V0aW5lcworLlJTCisuVFAKKy5CUiBwY2FwX2R1bXBfb3BlbiAoM1BDQVApCitvcGVuIGEKKy5CIHBjYXBfZHVtcGVyX3QKK2ZvciBhIGBgc2F2ZWZpbGVgYCwgZ2l2ZW4gYSBwYXRobmFtZQorLlRQCisuQlIgcGNhcF9kdW1wX2ZvcGVuICgzUENBUCkKK29wZW4gYQorLkIgcGNhcF9kdW1wZXJfdAorZm9yIGEgYGBzYXZlZmlsZWBgLCBnaXZlbiBhCisuQiAiRklMRVwgKiIKKy5UUAorLkJSIHBjYXBfZHVtcF9jbG9zZSAoM1BDQVApCitjbG9zZSBhCisuQiBwY2FwX2R1bXBlcl90CisuVFAKKy5CUiBwY2FwX2R1bXBfZmlsZSAoM1BDQVApCitnZXQgdGhlCisuQiAiRklMRVwgKiIKK2ZvciBhCisuQiBwY2FwX2R1bXBlcl90CitvcGVuZWQgZm9yIGEgYGBzYXZlZmlsZScnCisuUkUKKy5TUyBXcml0aW5nIHBhY2tldHMKK1RvIHdyaXRlIGEgcGFja2V0IHRvIGEKKy5CUiBwY2FwX2R1bXBlcl90ICwKK2NhbGwKKy5CUiBwY2FwX2R1bXAgKCkuCitQYWNrZXRzIHdyaXR0ZW4gd2l0aAorLkJSIHBjYXBfZHVtcCAoKQorbWF5IGJlIGJ1ZmZlcmVkLCByYXRoZXIgdGhhbiBiZWluZyBpbW1lZGlhdGVseSB3cml0dGVuIHRvIHRoZQorYGBzYXZlZmlsZScnLiAgQ2xvc2luZyB0aGUKKy5CIHBjYXBfZHVtcGVyX3QKK3dpbGwgY2F1c2UgYWxsIGJ1ZmZlcmVkLWJ1dC1ub3QteWV0LXdyaXR0ZW4gcGFja2V0cyB0byBiZSB3cml0dGVuIHRvIHRoZQorYGBzYXZlZmlsZScnLgorVG8gZm9yY2UgYWxsIHBhY2tldHMgd3JpdHRlbiB0byB0aGUKKy5CUiBwY2FwX2R1bXBlcl90ICwKK2FuZCBub3QgeWV0IHdyaXR0ZW4gdG8gdGhlIGBgc2F2ZWZpbGUnJyBiZWNhdXNlIHRoZXkncmUgYnVmZmVyZWQgYnkgdGhlCisuQlIgcGNhcF9kdW1wZXJfdCAsCit0byBiZSB3cml0dGVuIHRvIHRoZSBgYHNhdmVmaWxlJycsIHdpdGhvdXQgY2xvc2luZyB0aGUKKy5CUiBwY2FwX2R1bXBlcl90ICwKK2NhbGwKKy5CUiBwY2FwX2R1bXBfZmx1c2ggKCkuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfZHVtcCAoM1BDQVApCit3cml0ZSBwYWNrZXQgdG8gYQorLkIgcGNhcF9kdW1wZXJfdAorLlRQCisuQlIgcGNhcF9kdW1wX2ZsdXNoICgzUENBUCkKK2ZsdXNoIGJ1ZmZlcmVkIHBhY2tldHMgd3JpdHRlbiB0byBhCisuQiBwY2FwX2R1bXBlcl90Cit0byB0aGUgYGBzYXZlZmlsZScnCisuVFAKKy5CUiBwY2FwX2R1bXBfZnRlbGwgKDNQQ0FQKQorZ2V0IGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBmb3IgYQorLkIgcGNhcF9kdW1wZXJfdAorLlJFCisuU1MgSW5qZWN0aW5nIHBhY2tldHMKK0lmIHlvdSBoYXZlIHRoZSByZXF1aXJlZCBwcml2aWxlZ2VzLCB5b3UgY2FuIGluamVjdCBwYWNrZXRzIG9udG8gYQorbmV0d29yayB3aXRoIGEKKy5CIHBjYXBfdAorZm9yIGEgbGl2ZSBjYXB0dXJlLCB1c2luZworLkJSIHBjYXBfaW5qZWN0ICgpCitvcgorLkJSIHBjYXBfc2VuZHBhY2tldCAoKS4KKyhUaGUgdHdvIHJvdXRpbmVzIGV4aXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggYm90aCBPcGVuQlNEIGFuZCBXaW5QY2FwOwordGhleSBwZXJmb3JtIHRoZSBzYW1lIGZ1bmN0aW9uLCBidXQgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuIHZhbHVlcy4pCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfaW5qZWN0ICgzUENBUCkKKy5QRCAwCisuVFAKKy5CUiBwY2FwX3NlbmRwYWNrZXQgKDNQQ0FQKQordHJhbnNtaXQgYSBwYWNrZXQKKy5QRAorLlJFCisuU1MgUmVwb3J0aW5nIGVycm9ycworU29tZSByb3V0aW5lcyByZXR1cm4gZXJyb3Igb3Igd2FybmluZyBzdGF0dXMgY29kZXM7IHRvIGNvbnZlcnQgdGhlbSB0byBhCitzdHJpbmcsIHVzZQorLkJSIHBjYXBfc3RhdHVzdG9zdHIgKCkuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfc3RhdHVzdG9zdHIgKDNQQ0FQKQorZ2V0IGEgc3RyaW5nIGZvciBhbiBlcnJvciBvciB3YXJuaW5nIHN0YXR1cyBjb2RlCisuUkUKKy5TUyBHZXR0aW5nIGxpYnJhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbgorVG8gZ2V0IGEgc3RyaW5nIGdpdmluZyB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IGxpYnBjYXAsIGNhbGwKKy5CUiBwY2FwX2xpYl92ZXJzaW9uICgpLgorLlRQCisuQiBSb3V0aW5lcworLlJTCisuVFAKKy5CUiBwY2FwX2xpYl92ZXJzaW9uICgzUENBUCkKK2dldCBsaWJyYXJ5IHZlcnNpb24gc3RyaW5nCisuUkUKKy5TSCBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWQorLlBQCitJbiB2ZXJzaW9ucyBvZiBsaWJwY2FwIHByaW9yIHRvIDEuMCwgdGhlCisuQiBwY2FwLmgKK2hlYWRlciBmaWxlIHdhcyBub3QgaW4gYQorLkIgcGNhcAorZGlyZWN0b3J5IG9uIG1vc3QgcGxhdGZvcm1zOyBpZiB5b3UgYXJlIHdyaXRpbmcgYW4gYXBwbGljYXRpb24gdGhhdCBtdXN0Cit3b3JrIG9uIHZlcnNpb25zIG9mIGxpYnBjYXAgcHJpb3IgdG8gMS4wLCBpbmNsdWRlCisuQlIgPHBjYXAuaD4gLAord2hpY2ggd2lsbCBpbmNsdWRlCisuQiA8cGNhcC9wY2FwLmg+Citmb3IgeW91LCByYXRoZXIgdGhhbiBpbmNsdWRpbmcKKy5CUiA8cGNhcC9wY2FwLmg+IC4KKy5QUAorLkJSIHBjYXBfY3JlYXRlICgpCithbmQKKy5CUiBwY2FwX2FjdGl2YXRlICgpCit3ZXJlIG5vdCBhdmFpbGFibGUgaW4gdmVyc2lvbnMgb2YgbGlicGNhcCBwcmlvciB0byAxLjA7IGlmIHlvdSBhcmUKK3dyaXRpbmcgYW4gYXBwbGljYXRpb24gdGhhdCBtdXN0IHdvcmsgb24gdmVyc2lvbnMgb2YgbGlicGNhcCBwcmlvciB0bworMS4wLCBlaXRoZXIgdXNlCisuQlIgcGNhcF9vcGVuX2xpdmUgKCkKK3RvIGdldCBhIGhhbmRsZSBmb3IgYSBsaXZlIGNhcHR1cmUgb3IsIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIHRoZQorYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgb2ZmZXJlZCBieSB1c2luZworLkJSIHBjYXBfY3JlYXRlICgpCithbmQKKy5CUiBwY2FwX2FjdGl2YXRlICgpLAordXNlIGFuCisuQlIgYXV0b2NvbmYgKDEpCitzY3JpcHQgb3Igc29tZSBvdGhlciBjb25maWd1cmF0aW9uIHNjcmlwdCB0byBjaGVjayB3aGV0aGVyIHRoZSBsaWJwY2FwCisxLjAgQVBJcyBhcmUgYXZhaWxhYmxlIGFuZCB1c2UgdGhlbSBvbmx5IGlmIHRoZXkgYXJlLgorLlNIIFNFRSBBTFNPCithdXRvY29uZigxKSwgdGNwZHVtcCgxKSwgdGNwc2xpY2UoMSksIHBjYXAtZmlsdGVyKDcpLCBwZmNvbmZpZyg4KSwKK3VzZXJtb2QoMU0pCisuU0ggQVVUSE9SUworVGhlIG9yaWdpbmFsIGF1dGhvcnMgb2YgbGlicGNhcCBhcmU6CisuTFAKK1ZhbiBKYWNvYnNvbiwKK0NyYWlnIExlcmVzIGFuZAorU3RldmVuIE1jQ2FubmUsIGFsbCBvZiB0aGUKK0xhd3JlbmNlIEJlcmtlbGV5IE5hdGlvbmFsIExhYm9yYXRvcnksIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXksIENBLgorLkxQCitUaGUgY3VycmVudCB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBmcm9tICJUaGUgVGNwZHVtcCBHcm91cCIncyBXZWIgc2l0ZSBhdAorLkxQCisuUlMKKy5JIGh0dHA6Ly93d3cudGNwZHVtcC5vcmcvCisuUkUKKy5TSCBCVUdTCitQbGVhc2Ugc2VuZCBwcm9ibGVtcywgYnVncywgcXVlc3Rpb25zLCBkZXNpcmFibGUgZW5oYW5jZW1lbnRzLCBldGMuIHRvOgorLkxQCisuUlMKK3RjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZworLlJFCmRpZmYgLS1naXQgYS9wY2FwLjNwY2FwLmluIGIvcGNhcC4zcGNhcC5pbgppbmRleCBjMDJhYzQzLi45MzQ3OGYxIDEwMDY0NAotLS0gYS9wY2FwLjNwY2FwLmluCisrKyBiL3BjYXAuM3BjYXAuaW4KQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQIDNQQ0FQICIxNiBBcHJpbCAyMDE0IgorLlRIIFBDQVAgM1BDQVAgIjggTWFyY2ggMjAxNSIKIC5TSCBOQU1FCiBwY2FwIFwtIFBhY2tldCBDYXB0dXJlIGxpYnJhcnkKIC5TSCBTWU5PUFNJUwpkaWZmIC0tZ2l0IGEvcGNhcC5jIGIvcGNhcC5jCmluZGV4IDRlOWM5NGEuLjc3YTcwOWYgMTAwNjQ0Ci0tLSBhL3BjYXAuYworKysgYi9wY2FwLmMKQEAgLTM1LDkgKzM1LDkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCi0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgotI2Vsc2UgLyogV0lOMzIgKi8KKyNlbHNlIC8qIF9XSU4zMiAqLwogI2lmIEhBVkVfSU5UVFlQRVNfSAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjZWxpZiBIQVZFX1NURElOVF9ICkBAIC00Nyw3ICs0Nyw3IEBACiAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KICNlbmRpZgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmIC8qIFdJTjMyICovCisjZW5kaWYgLyogX1dJTjMyICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtODAsNiArODAsMTAgQEAKICNpbmNsdWRlICJwY2FwLXNuZi5oIgogI2VuZGlmIC8qIEhBVkVfU05GX0FQSSAqLwogCisjaWZkZWYgSEFWRV9UQ19BUEkKKyNpbmNsdWRlICJwY2FwLXRjLmgiCisjZW5kaWYgLyogSEFWRV9UQ19BUEkgKi8KKwogI2lmZGVmIFBDQVBfU1VQUE9SVF9VU0IKICNpbmNsdWRlICJwY2FwLXVzYi1saW51eC5oIgogI2VuZGlmCkBAIC05MiwxNCArOTYsNiBAQAogI2luY2x1ZGUgInBjYXAtYnQtbW9uaXRvci1saW51eC5oIgogI2VuZGlmCiAKLSNpZmRlZiBQQ0FQX1NVUFBPUlRfQ0FOCi0jaW5jbHVkZSAicGNhcC1jYW4tbGludXguaCIKLSNlbmRpZgotCi0jaWZkZWYgUENBUF9TVVBQT1JUX0NBTlVTQgotI2luY2x1ZGUgInBjYXAtY2FudXNiLWxpbnV4LmgiCi0jZW5kaWYKLQogI2lmZGVmIFBDQVBfU1VQUE9SVF9ORVRGSUxURVIKICNpbmNsdWRlICJwY2FwLW5ldGZpbHRlci1saW51eC5oIgogI2VuZGlmCkBAIC0xMDgsMTcgKzEwNCw0NiBAQAogI2luY2x1ZGUgInBjYXAtZGJ1cy5oIgogI2VuZGlmCiAKLWludAotcGNhcF9ub3RfaW5pdGlhbGl6ZWQocGNhcF90ICpwY2FwIF9VXykKK3N0YXRpYyBpbnQKK3BjYXBfbm90X2luaXRpYWxpemVkKHBjYXBfdCAqcGNhcCkKIHsKKwkvKiBpbiBjYXNlIHRoZSBjYWxsZXIgZG9lc24ndCBjaGVjayBmb3IgUENBUF9FUlJPUl9OT1RfQUNUSVZBVEVEICovCisJKHZvaWQpcGNhcF9zbnByaW50ZihwY2FwLT5lcnJidWYsIHNpemVvZihwY2FwLT5lcnJidWYpLAorCSAgICAiVGhpcyBoYW5kbGUgaGFzbid0IGJlZW4gYWN0aXZhdGVkIHlldCIpOwogCS8qIHRoaXMgbWVhbnMgJ25vdCBpbml0aWFsaXplZCcgKi8KIAlyZXR1cm4gKFBDQVBfRVJST1JfTk9UX0FDVElWQVRFRCk7CiB9CiAKLSNpZmRlZiBXSU4zMgotQWRhcHRlciAqCi1wY2FwX25vX2FkYXB0ZXIocGNhcF90ICpwY2FwIF9VXykKKyNpZmRlZiBfV0lOMzIKK3N0YXRpYyB2b2lkICoKK3BjYXBfbm90X2luaXRpYWxpemVkX3B0cihwY2FwX3QgKnBjYXApCiB7CisJKHZvaWQpcGNhcF9zbnByaW50ZihwY2FwLT5lcnJidWYsIHNpemVvZihwY2FwLT5lcnJidWYpLAorCSAgICAiVGhpcyBoYW5kbGUgaGFzbid0IGJlZW4gYWN0aXZhdGVkIHlldCIpOworCXJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBIQU5ETEUKK3BjYXBfZ2V0ZXZlbnRfbm90X2luaXRpYWxpemVkKHBjYXBfdCAqcGNhcCkKK3sKKwkodm9pZClwY2FwX3NucHJpbnRmKHBjYXAtPmVycmJ1Ziwgc2l6ZW9mKHBjYXAtPmVycmJ1ZiksCisJICAgICJUaGlzIGhhbmRsZSBoYXNuJ3QgYmVlbiBhY3RpdmF0ZWQgeWV0Iik7CisJcmV0dXJuIChJTlZBTElEX0hBTkRMRV9WQUxVRSk7Cit9CisKK3N0YXRpYyB1X2ludAorcGNhcF9zZW5kcXVldWVfdHJhbnNtaXRfbm90X2luaXRpYWxpemVkKHBjYXBfdCAqcGNhcCwgcGNhcF9zZW5kX3F1ZXVlKiBxdWV1ZSwgaW50IHN5bmMpCit7CisJKHZvaWQpcGNhcF9zbnByaW50ZihwY2FwLT5lcnJidWYsIHNpemVvZihwY2FwLT5lcnJidWYpLAorCSAgICAiVGhpcyBoYW5kbGUgaGFzbid0IGJlZW4gYWN0aXZhdGVkIHlldCIpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBQQWlycGNhcEhhbmRsZQorcGNhcF9nZXRfYWlycGNhcF9oYW5kbGVfbm90X2luaXRpYWxpemVkKHBjYXBfdCAqcGNhcCkKK3sKKwkodm9pZClwY2FwX3NucHJpbnRmKHBjYXAtPmVycmJ1Ziwgc2l6ZW9mKHBjYXAtPmVycmJ1ZiksCisJICAgICJUaGlzIGhhbmRsZSBoYXNuJ3QgYmVlbiBhY3RpdmF0ZWQgeWV0Iik7CiAJcmV0dXJuIChOVUxMKTsKIH0KICNlbmRpZgpAQCAtMTY1LDcgKzE5MCw3IEBACiAJCSp0c3RhbXBfdHlwZXNwID0gKGludCopY2FsbG9jKHNpemVvZigqKnRzdGFtcF90eXBlc3ApLAogCQkgICAgcC0+dHN0YW1wX3R5cGVfY291bnQpOwogCQlpZiAoKnRzdGFtcF90eXBlc3AgPT0gTlVMTCkgewotCQkJKHZvaWQpc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKKwkJCSh2b2lkKXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKIAkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAoUENBUF9FUlJPUik7CiAJCX0KQEAgLTI3MCw0NyArMjk1LDcgQEAKIAlyZXR1cm4gKHAtPnJlYWRfb3AocCwgMSwgcC0+b25lc2hvdF9jYWxsYmFjaywgKHVfY2hhciAqKSZzKSk7CiB9CiAKLSNpZiBkZWZpbmVkKERBR19PTkxZKQotaW50Ci1wY2FwX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCi17Ci0JcmV0dXJuIChkYWdfZmluZGFsbGRldnMoYWxsZGV2c3AsIGVycmJ1ZikpOwotfQotCi1wY2FwX3QgKgotcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqc291cmNlLCBjaGFyICplcnJidWYpCi17Ci0JaW50IGlzX291cnM7Ci0JcmV0dXJuIChkYWdfY3JlYXRlKHNvdXJjZSwgZXJyYnVmLCAmaXNfb3VycykpOwotfQotI2VsaWYgZGVmaW5lZChTRVBURUxfT05MWSkKLWludAotcGNhcF9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQotewotCXJldHVybiAoc2VwdGVsX2ZpbmRhbGxkZXZzKGFsbGRldnNwLCBlcnJidWYpKTsKLX0KLQotcGNhcF90ICoKLXBjYXBfY3JlYXRlKGNvbnN0IGNoYXIgKnNvdXJjZSwgY2hhciAqZXJyYnVmKQotewotCWludCBpc19vdXJzOwotCXJldHVybiAoc2VwdGVsX2NyZWF0ZShzb3VyY2UsIGVycmJ1ZiwgJmlzX291cnMpKTsKLX0KLSNlbGlmIGRlZmluZWQoU05GX09OTFkpCi1pbnQKLXBjYXBfZmluZGFsbGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKLXsKLQlyZXR1cm4gKHNuZl9maW5kYWxsZGV2cyhhbGxkZXZzcCwgZXJyYnVmKSk7Ci19Ci0KLXBjYXBfdCAqCi1wY2FwX2NyZWF0ZShjb25zdCBjaGFyICpzb3VyY2UsIGNoYXIgKmVycmJ1ZikKLXsKLQlpbnQgaXNfb3VyczsKLQlyZXR1cm4gKHNuZl9jcmVhdGUoc291cmNlLCBlcnJidWYsICZpc19vdXJzKSk7Ci19Ci0jZWxzZSAvKiByZWd1bGFyIHBjYXAgKi8KLXN0cnVjdCBjYXB0dXJlX3NvdXJjZV90eXBlIHsKK3N0YXRpYyBzdHJ1Y3QgY2FwdHVyZV9zb3VyY2VfdHlwZSB7CiAJaW50ICgqZmluZGFsbGRldnNfb3ApKHBjYXBfaWZfdCAqKiwgY2hhciAqKTsKIAlwY2FwX3QgKigqY3JlYXRlX29wKShjb25zdCBjaGFyICosIGNoYXIgKiwgaW50ICopOwogfSBjYXB0dXJlX3NvdXJjZV90eXBlc1tdID0gewpAQCAtMzIzLDE4ICszMDgsMTUgQEAKICNpZmRlZiBIQVZFX1NORl9BUEkKIAl7IHNuZl9maW5kYWxsZGV2cywgc25mX2NyZWF0ZSB9LAogI2VuZGlmCisjaWZkZWYgSEFWRV9UQ19BUEkKKwl7IFRjRmluZEFsbERldnMsIFRjQ3JlYXRlIH0sCisjZW5kaWYKICNpZmRlZiBQQ0FQX1NVUFBPUlRfQlQKIAl7IGJ0X2ZpbmRhbGxkZXZzLCBidF9jcmVhdGUgfSwKICNlbmRpZgogI2lmZGVmIFBDQVBfU1VQUE9SVF9CVF9NT05JVE9SCiAJeyBidF9tb25pdG9yX2ZpbmRhbGxkZXZzLCBidF9tb25pdG9yX2NyZWF0ZSB9LAogI2VuZGlmCi0jaWYgUENBUF9TVVBQT1JUX0NBTlVTQgotCXsgY2FudXNiX2ZpbmRhbGxkZXZzLCBjYW51c2JfY3JlYXRlIH0sCi0jZW5kaWYKLSNpZmRlZiBQQ0FQX1NVUFBPUlRfQ0FOCi0JeyBjYW5fZmluZGFsbGRldnMsIGNhbl9jcmVhdGUgfSwKLSNlbmRpZgogI2lmZGVmIFBDQVBfU1VQUE9SVF9VU0IKIAl7IHVzYl9maW5kYWxsZGV2cywgdXNiX2NyZWF0ZSB9LAogI2VuZGlmCkBAIC0zNTksMjYgKzM0MSwxMSBAQAogCXNpemVfdCBpOwogCiAJLyoKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgcmVndWxhciBpbnRlcmZhY2VzIGZpcnN0LgorCSAqIEZpbmQgYWxsIHRoZSBsb2NhbCBuZXR3b3JrIGludGVyZmFjZXMgb24gd2hpY2ggd2UKKwkgKiBjYW4gY2FwdHVyZS4KIAkgKi8KLQlpZiAocGNhcF9maW5kYWxsZGV2c19pbnRlcmZhY2VzKGFsbGRldnNwLCBlcnJidWYpID09IC0xKQotCQlyZXR1cm4gKC0xKTsJLyogZmFpbHVyZSAqLwotCi0JLyoKLQkgKiBBZGQgYW55IGludGVyZmFjZXMgdGhhdCBuZWVkIGEgcGxhdGZvcm0tc3BlY2lmaWMgbWVjaGFuaXNtCi0JICogdG8gZmluZC4KLQkgKi8KLQlpZiAocGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhhbGxkZXZzcCwgZXJyYnVmKSA9PSAtMSkgewotCQkvKgotCQkgKiBXZSBoYWQgYW4gZXJyb3I7IGZyZWUgdGhlIGxpc3Qgd2UndmUgYmVlbgotCQkgKiBjb25zdHJ1Y3RpbmcuCi0JCSAqLwotCQlpZiAoKmFsbGRldnNwICE9IE5VTEwpIHsKLQkJCXBjYXBfZnJlZWFsbGRldnMoKmFsbGRldnNwKTsKLQkJCSphbGxkZXZzcCA9IE5VTEw7Ci0JCX0KKwlpZiAocGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhhbGxkZXZzcCwgZXJyYnVmKSA9PSAtMSkKIAkJcmV0dXJuICgtMSk7Ci0JfQogCiAJLyoKIAkgKiBBc2sgZWFjaCBvZiB0aGUgbm9uLWxvY2FsLW5ldHdvcmstaW50ZXJmYWNlIGNhcHR1cmUKQEAgLTQwMiwyMSArMzY5LDUzIEBACiB9CiAKIHBjYXBfdCAqCi1wY2FwX2NyZWF0ZShjb25zdCBjaGFyICpzb3VyY2UsIGNoYXIgKmVycmJ1ZikKK3BjYXBfY3JlYXRlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZXJyYnVmKQogewogCXNpemVfdCBpOwogCWludCBpc190aGVpcnM7CiAJcGNhcF90ICpwOworCWNoYXIgKmRldmljZV9zdHI7CiAKIAkvKgotCSAqIEEgbnVsbCBzb3VyY2UgbmFtZSBpcyBlcXVpdmFsZW50IHRvIHRoZSAiYW55IiBkZXZpY2UgLQorCSAqIEEgbnVsbCBkZXZpY2UgbmFtZSBpcyBlcXVpdmFsZW50IHRvIHRoZSAiYW55IiBkZXZpY2UgLQogCSAqIHdoaWNoIG1pZ2h0IG5vdCBiZSBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSwgYnV0CiAJICogdGhpcyBtZWFucyB0aGF0IHlvdSdsbCBnZXQgYSAibm90IHN1cHBvcnRlZCIgZXJyb3IKIAkgKiByYXRoZXIgdGhhbiwgc2F5LCBhIGNyYXNoIHdoZW4gd2UgdHJ5IHRvIGRlcmVmZXJlbmNlCiAJICogdGhlIG51bGwgcG9pbnRlci4KIAkgKi8KLQlpZiAoc291cmNlID09IE5VTEwpCi0JCXNvdXJjZSA9ICJhbnkiOworCWlmIChkZXZpY2UgPT0gTlVMTCkKKwkJZGV2aWNlX3N0ciA9IHN0cmR1cCgiYW55Iik7CisJZWxzZSB7CisjaWZkZWYgX1dJTjMyCisJCS8qCisJCSAqIElmIHRoZSBzdHJpbmcgYXBwZWFycyB0byBiZSBsaXR0bGUtZW5kaWFuIFVDUy0yL1VURi0xNiwKKwkJICogY29udmVydCBpdCB0byBBU0NJSS4KKwkJICoKKwkJICogWFhYIC0gdG8gVVRGLTggaW5zdGVhZD8gIE9yIHJlcG9ydCBhbiBlcnJvciBpZiBhbnkKKwkJICogY2hhcmFjdGVyIGlzbid0IEFTQ0lJPworCQkgKi8KKwkJaWYgKGRldmljZVswXSAhPSAnXDAnICYmIGRldmljZVsxXSA9PSAnXDAnKSB7CisJCQlzaXplX3QgbGVuZ3RoOworCisJCQlsZW5ndGggPSB3Y3NsZW4oKHdjaGFyX3QgKilkZXZpY2UpOworCQkJZGV2aWNlX3N0ciA9IChjaGFyICopbWFsbG9jKGxlbmd0aCArIDEpOworCQkJaWYgKGRldmljZV9zdHIgPT0gTlVMTCkgeworCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJfQorCisJCQlwY2FwX3NucHJpbnRmKGRldmljZV9zdHIsIGxlbmd0aCArIDEsICIld3MiLAorCQkJICAgIChjb25zdCB3Y2hhcl90ICopZGV2aWNlKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJCWRldmljZV9zdHIgPSBzdHJkdXAoZGV2aWNlKTsKKwl9CisJaWYgKGRldmljZV9zdHIgPT0gTlVMTCkgeworCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKE5VTEwpOworCX0KIAogCS8qCiAJICogVHJ5IGVhY2ggb2YgdGhlIG5vbi1sb2NhbC1uZXR3b3JrLWludGVyZmFjZSBjYXB0dXJlCkBAIC00MjUsNyArNDI0LDggQEAKIAkgKi8KIAlmb3IgKGkgPSAwOyBjYXB0dXJlX3NvdXJjZV90eXBlc1tpXS5jcmVhdGVfb3AgIT0gTlVMTDsgaSsrKSB7CiAJCWlzX3RoZWlycyA9IDA7Ci0JCXAgPSBjYXB0dXJlX3NvdXJjZV90eXBlc1tpXS5jcmVhdGVfb3Aoc291cmNlLCBlcnJidWYsICZpc190aGVpcnMpOworCQlwID0gY2FwdHVyZV9zb3VyY2VfdHlwZXNbaV0uY3JlYXRlX29wKGRldmljZV9zdHIsIGVycmJ1ZiwKKwkJICAgICZpc190aGVpcnMpOwogCQlpZiAoaXNfdGhlaXJzKSB7CiAJCQkvKgogCQkJICogVGhlIGRldmljZSBuYW1lIHJlZmVycyB0byBhIGRldmljZSBvZiB0aGUKQEAgLTQzNiw2ICs0MzYsMTQgQEAKIAkJCSAqIHNob3VsZCByZXR1cm4gdGhhdCB0byByZXBvcnQgdGhlIGZhaWx1cmUKIAkJCSAqIHRvIGNyZWF0ZS4KIAkJCSAqLworCQkJaWYgKHAgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogV2UgYXNzdW1lIHRoZSBjYWxsZXIgZmlsbGVkIGluIGVycmJ1Zi4KKwkJCQkgKi8KKwkJCQlmcmVlKGRldmljZV9zdHIpOworCQkJCXJldHVybiAoTlVMTCk7CisJCQl9CisJCQlwLT5vcHQuZGV2aWNlID0gZGV2aWNlX3N0cjsKIAkJCXJldHVybiAocCk7CiAJCX0KIAl9CkBAIC00NDMsOSArNDUxLDE3IEBACiAJLyoKIAkgKiBPSywgdHJ5IGl0IGFzIGEgcmVndWxhciBuZXR3b3JrIGludGVyZmFjZS4KIAkgKi8KLQlyZXR1cm4gKHBjYXBfY3JlYXRlX2ludGVyZmFjZShzb3VyY2UsIGVycmJ1ZikpOworCXAgPSBwY2FwX2NyZWF0ZV9pbnRlcmZhY2UoZGV2aWNlX3N0ciwgZXJyYnVmKTsKKwlpZiAocCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFdlIGFzc3VtZSB0aGUgY2FsbGVyIGZpbGxlZCBpbiBlcnJidWYuCisJCSAqLworCQlmcmVlKGRldmljZV9zdHIpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlwLT5vcHQuZGV2aWNlID0gZGV2aWNlX3N0cjsKKwlyZXR1cm4gKHApOwogfQotI2VuZGlmCiAKIHN0YXRpYyB2b2lkCiBpbml0aWFsaXplX29wcyhwY2FwX3QgKnApCkBAIC00NjMsMTEgKzQ3OSwxOSBAQAogCXAtPmdldG5vbmJsb2NrX29wID0gKGdldG5vbmJsb2NrX29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CiAJcC0+c2V0bm9uYmxvY2tfb3AgPSAoc2V0bm9uYmxvY2tfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKIAlwLT5zdGF0c19vcCA9IChzdGF0c19vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOwotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCisJcC0+c3RhdHNfZXhfb3AgPSAoc3RhdHNfZXhfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZF9wdHI7CiAJcC0+c2V0YnVmZl9vcCA9IChzZXRidWZmX29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CiAJcC0+c2V0bW9kZV9vcCA9IChzZXRtb2RlX29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CiAJcC0+c2V0bWludG9jb3B5X29wID0gKHNldG1pbnRvY29weV9vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOwotCXAtPmdldGFkYXB0ZXJfb3AgPSBwY2FwX25vX2FkYXB0ZXI7CisJcC0+Z2V0ZXZlbnRfb3AgPSBwY2FwX2dldGV2ZW50X25vdF9pbml0aWFsaXplZDsKKwlwLT5vaWRfZ2V0X3JlcXVlc3Rfb3AgPSAob2lkX2dldF9yZXF1ZXN0X29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CisJcC0+b2lkX3NldF9yZXF1ZXN0X29wID0gKG9pZF9zZXRfcmVxdWVzdF9vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOworCXAtPnNlbmRxdWV1ZV90cmFuc21pdF9vcCA9IHBjYXBfc2VuZHF1ZXVlX3RyYW5zbWl0X25vdF9pbml0aWFsaXplZDsKKwlwLT5zZXR1c2VyYnVmZmVyX29wID0gKHNldHVzZXJidWZmZXJfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKKwlwLT5saXZlX2R1bXBfb3AgPSAobGl2ZV9kdW1wX29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CisJcC0+bGl2ZV9kdW1wX2VuZGVkX29wID0gKGxpdmVfZHVtcF9lbmRlZF9vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOworCXAtPmdldF9haXJwY2FwX2hhbmRsZV9vcCA9IHBjYXBfZ2V0X2FpcnBjYXBfaGFuZGxlX25vdF9pbml0aWFsaXplZDsKICNlbmRpZgogCiAJLyoKQEAgLTQ5OCw3ICs1MjIsNyBAQAogCSAqLwogCWNodW5rID0gbWFsbG9jKHNpemVvZiAocGNhcF90KSArIHNpemUpOwogCWlmIChjaHVuayA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoTlVMTCk7CiAJfQpAQCAtNTA5LDcgKzUzMyw3IEBACiAJICovCiAJcCA9IChwY2FwX3QgKiljaHVuazsKIAotI2lmbmRlZiBXSU4zMgorI2lmbmRlZiBfV0lOMzIKIAlwLT5mZCA9IC0xOwkvKiBub3Qgb3BlbmVkIHlldCAqLwogCXAtPnNlbGVjdGFibGVfZmQgPSAtMTsKICNlbmRpZgpAQCAtNTI5LDcgKzU1Myw3IEBACiB9CiAKIHBjYXBfdCAqCi1wY2FwX2NyZWF0ZV9jb21tb24oY29uc3QgY2hhciAqc291cmNlLCBjaGFyICplYnVmLCBzaXplX3Qgc2l6ZSkKK3BjYXBfY3JlYXRlX2NvbW1vbihjaGFyICplYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlwY2FwX3QgKnA7CiAKQEAgLTUzNywxNCArNTYxLDYgQEAKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gKE5VTEwpOwogCi0JcC0+b3B0LnNvdXJjZSA9IHN0cmR1cChzb3VyY2UpOwotCWlmIChwLT5vcHQuc291cmNlID09IE5VTEwpIHsKLQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAotCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCQlmcmVlKHApOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQogCS8qCiAJICogRGVmYXVsdCB0byAiY2FuJ3Qgc2V0IHJmbW9uIG1vZGUiOyBpZiBpdCdzIHN1cHBvcnRlZCBieQogCSAqIGEgcGxhdGZvcm0sIHRoZSBjcmVhdGUgcm91dGluZSB0aGF0IGNhbGxlZCB1cyBjYW4gc2V0CkBAIC01NTYsOSArNTcyLDkgQEAKIAlpbml0aWFsaXplX29wcyhwKTsKIAogCS8qIHB1dCBpbiBzb21lIGRlZmF1bHRzKi8KLSAJcGNhcF9zZXRfc25hcGxlbihwLCBNQVhJTVVNX1NOQVBMRU4pOwkvKiBtYXggcGFja2V0IHNpemUgKi8KLQlwLT5vcHQudGltZW91dCA9IDA7CQkJLyogbm8gdGltZW91dCBzcGVjaWZpZWQgKi8KLQlwLT5vcHQuYnVmZmVyX3NpemUgPSAwOwkJCS8qIHVzZSB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0ICovCisgCXAtPnNuYXBzaG90ID0gTUFYSU1VTV9TTkFQTEVOOwkvKiBtYXggcGFja2V0IHNpemUgKi8KKwlwLT5vcHQudGltZW91dCA9IDA7CQkvKiBubyB0aW1lb3V0IHNwZWNpZmllZCAqLworCXAtPm9wdC5idWZmZXJfc2l6ZSA9IDA7CQkvKiB1c2UgdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCAqLwogCXAtPm9wdC5wcm9taXNjID0gMDsKIAlwLT5vcHQucmZtb24gPSAwOwogCXAtPm9wdC5pbW1lZGlhdGUgPSAwOwpAQCAtNTc3LDcgKzU5Myw3IEBACiBwY2FwX2NoZWNrX2FjdGl2YXRlZChwY2FwX3QgKnApCiB7CiAJaWYgKHAtPmFjdGl2YXRlZCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJjYW4ndCBwZXJmb3JtICIKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJjYW4ndCBwZXJmb3JtICIKIAkJCSIgb3BlcmF0aW9uIG9uIGFjdGl2YXRlZCBjYXB0dXJlIik7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTU4OSw2ICs2MDUsMTYgQEAKIHsKIAlpZiAocGNhcF9jaGVja19hY3RpdmF0ZWQocCkpCiAJCXJldHVybiAoUENBUF9FUlJPUl9BQ1RJVkFURUQpOworCisJLyoKKwkgKiBUdXJuIGludmFsaWQgdmFsdWVzLCBvciBleGNlc3NpdmVseSBsYXJnZSB2YWx1ZXMsIGludG8KKwkgKiB0aGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlLgorCSAqCisJICogSWYgc29tZSBhcHBsaWNhdGlvbiByZWFsbHkgKm5lZWRzKiBhIGJpZ2dlciBzbmFwc2hvdAorCSAqIGxlbmd0aCwgd2Ugc2hvdWxkIGp1c3QgaW5jcmVhc2UgTUFYSU1VTV9TTkFQTEVOLgorCSAqLworCWlmIChzbmFwbGVuIDw9IDAgfHwgc25hcGxlbiA+IE1BWElNVU1fU05BUExFTikKKwkJc25hcGxlbiA9IE1BWElNVU1fU05BUExFTjsKIAlwLT5zbmFwc2hvdCA9IHNuYXBsZW47CiAJcmV0dXJuICgwKTsKIH0KQEAgLTYyOSw2ICs2NTUsMTMgQEAKIAkJcmV0dXJuIChQQ0FQX0VSUk9SX0FDVElWQVRFRCk7CiAKIAkvKgorCSAqIFRoZSBhcmd1bWVudCBzaG91bGQgaGF2ZSBiZWVuIHVfaW50LCBidXQgdGhhdCdzIHRvbyBsYXRlCisJICogdG8gY2hhbmdlIG5vdyAtIGl0J3MgYW4gQVBJLgorCSAqLworCWlmICh0c3RhbXBfdHlwZSA8IDApCisJCXJldHVybiAoUENBUF9XQVJOSU5HX1RTVEFNUF9UWVBFX05PVFNVUCk7CisKKwkvKgogCSAqIElmIHAtPnRzdGFtcF90eXBlX2NvdW50IGlzIDAsIHdlIG9ubHkgc3VwcG9ydCBQQ0FQX1RTVEFNUF9IT1NUOwogCSAqIHRoZSBkZWZhdWx0IHRpbWUgc3RhbXAgdHlwZSBpcyBQQ0FQX1RTVEFNUF9IT1NULgogCSAqLwpAQCAtNjQyLDcgKzY3NSw3IEBACiAJCSAqIENoZWNrIHdoZXRoZXIgd2UgY2xhaW0gdG8gc3VwcG9ydCB0aGlzIHR5cGUgb2YgdGltZSBzdGFtcC4KIAkJICovCiAJCWZvciAoaSA9IDA7IGkgPCBwLT50c3RhbXBfdHlwZV9jb3VudDsgaSsrKSB7Ci0JCQlpZiAocC0+dHN0YW1wX3R5cGVfbGlzdFtpXSA9PSB0c3RhbXBfdHlwZSkgeworCQkJaWYgKHAtPnRzdGFtcF90eXBlX2xpc3RbaV0gPT0gKHVfaW50KXRzdGFtcF90eXBlKSB7CiAJCQkJLyoKIAkJCQkgKiBZZXMuCiAJCQkJICovCkBAIC02NzIsNiArNzA1LDEyIEBACiB7CiAJaWYgKHBjYXBfY2hlY2tfYWN0aXZhdGVkKHApKQogCQlyZXR1cm4gKFBDQVBfRVJST1JfQUNUSVZBVEVEKTsKKwlpZiAoYnVmZmVyX3NpemUgPD0gMCkgeworCQkvKgorCQkgKiBTaWxlbnRseSBpZ25vcmUgaW52YWxpZCB2YWx1ZXMuCisJCSAqLworCQlyZXR1cm4gKDApOworCX0KIAlwLT5vcHQuYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKIAlyZXR1cm4gKDApOwogfQpAQCAtNjg1LDYgKzcyNCwxMyBAQAogCQlyZXR1cm4gKFBDQVBfRVJST1JfQUNUSVZBVEVEKTsKIAogCS8qCisJICogVGhlIGFyZ3VtZW50IHNob3VsZCBoYXZlIGJlZW4gdV9pbnQsIGJ1dCB0aGF0J3MgdG9vIGxhdGUKKwkgKiB0byBjaGFuZ2Ugbm93IC0gaXQncyBhbiBBUEkuCisJICovCisJaWYgKHRzdGFtcF9wcmVjaXNpb24gPCAwKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfVFNUQU1QX1BSRUNJU0lPTl9OT1RTVVApOworCisJLyoKIAkgKiBJZiBwLT50c3RhbXBfcHJlY2lzaW9uX2NvdW50IGlzIDAsIHdlIG9ubHkgc3VwcG9ydCBzZXR0aW5nCiAJICogdGhlIHRpbWUgc3RhbXAgcHJlY2lzaW9uIHRvIG1pY3Jvc2Vjb25kIHByZWNpc2lvbjsgZXZlcnkKIAkgKiBwY2FwIG1vZHVsZSAqTVVTVCogc3VwcG9ydCBtaWNyb3NlY29uZCBwcmVjaXNpb24sIGV2ZW4gaWYKQEAgLTcwMiw3ICs3NDgsNyBAQAogCQkgKiB0aW1lIHN0YW1wLgogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IHAtPnRzdGFtcF9wcmVjaXNpb25fY291bnQ7IGkrKykgewotCQkJaWYgKHAtPnRzdGFtcF9wcmVjaXNpb25fbGlzdFtpXSA9PSB0c3RhbXBfcHJlY2lzaW9uKSB7CisJCQlpZiAocC0+dHN0YW1wX3ByZWNpc2lvbl9saXN0W2ldID09ICh1X2ludCl0c3RhbXBfcHJlY2lzaW9uKSB7CiAJCQkJLyoKIAkJCQkgKiBZZXMuCiAJCQkJICovCkBAIC03NDksNyArNzk1LDcgQEAKIAkJCSAqIGhhbmRsZSBlcnJvcnMgb3RoZXIgdGhhbiBQQ0FQX0VSUk9SLCByZXR1cm4gdGhlCiAJCQkgKiBlcnJvciBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXR1cy4KIAkJCSAqLwotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMiLAorCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlcyIsCiAJCQkgICAgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpKTsKIAkJfQogCkBAIC03NjMsMTIgKzgwOSwxMiBAQAogfQogCiBwY2FwX3QgKgotcGNhcF9vcGVuX2xpdmUoY29uc3QgY2hhciAqc291cmNlLCBpbnQgc25hcGxlbiwgaW50IHByb21pc2MsIGludCB0b19tcywgY2hhciAqZXJyYnVmKQorcGNhcF9vcGVuX2xpdmUoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgc25hcGxlbiwgaW50IHByb21pc2MsIGludCB0b19tcywgY2hhciAqZXJyYnVmKQogewogCXBjYXBfdCAqcDsKIAlpbnQgc3RhdHVzOwogCi0JcCA9IHBjYXBfY3JlYXRlKHNvdXJjZSwgZXJyYnVmKTsKKwlwID0gcGNhcF9jcmVhdGUoZGV2aWNlLCBlcnJidWYpOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiAoTlVMTCk7CiAJc3RhdHVzID0gcGNhcF9zZXRfc25hcGxlbihwLCBzbmFwbGVuKTsKQEAgLTc5NywxNSArODQzLDE1IEBACiAJcmV0dXJuIChwKTsKIGZhaWw6CiAJaWYgKHN0YXR1cyA9PSBQQ0FQX0VSUk9SKQotCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLCBzb3VyY2UsCisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwgZGV2aWNlLAogCQkgICAgcC0+ZXJyYnVmKTsKIAllbHNlIGlmIChzdGF0dXMgPT0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSB8fAogCSAgICBzdGF0dXMgPT0gUENBUF9FUlJPUl9QRVJNX0RFTklFRCB8fAogCSAgICBzdGF0dXMgPT0gUENBUF9FUlJPUl9QUk9NSVNDX1BFUk1fREVOSUVEKQotCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMgKCVzKSIsIHNvdXJjZSwKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMgKCVzKSIsIGRldmljZSwKIAkJICAgIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSwgcC0+ZXJyYnVmKTsKIAllbHNlCi0JCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyIsIHNvdXJjZSwKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLCBkZXZpY2UsCiAJCSAgICBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cykpOwogCXBjYXBfY2xvc2UocCk7CiAJcmV0dXJuIChOVUxMKTsKQEAgLTgyMSwxMyArODY3LDYgQEAKIAkJcmV0dXJuIChOVUxMKTsKIAogCXAtPm9wdC50c3RhbXBfcHJlY2lzaW9uID0gUENBUF9UU1RBTVBfUFJFQ0lTSU9OX01JQ1JPOwotCXAtPm9wdC5zb3VyY2UgPSBzdHJkdXAoIihzYXZlZmlsZSkiKTsKLQlpZiAocC0+b3B0LnNvdXJjZSA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKLQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJZnJlZShwKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9CiAKIAlyZXR1cm4gKHApOwogfQpAQCAtODM4LDE2ICs4NzcsNiBAQAogCXJldHVybiAocC0+cmVhZF9vcChwLCBjbnQsIGNhbGxiYWNrLCB1c2VyKSk7CiB9CiAKLS8qCi0gKiBYWFggLSBpcyB0aGlzIG5lY2Vzc2FyeT8KLSAqLwotaW50Ci1wY2FwX3JlYWQocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKLXsKLQotCXJldHVybiAocC0+cmVhZF9vcChwLCBjbnQsIGNhbGxiYWNrLCB1c2VyKSk7Ci19Ci0KIGludAogcGNhcF9sb29wKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCiB7CkBAIC05MTcsNyArOTQ2LDcgQEAKIAkJICovCiAJCSpkbHRfYnVmZmVyID0gKGludCopbWFsbG9jKHNpemVvZigqKmRsdF9idWZmZXIpKTsKIAkJaWYgKCpkbHRfYnVmZmVyID09IE5VTEwpIHsKLQkJCSh2b2lkKXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCQkodm9pZClwY2FwX3NucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCiAJCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CkBAIC05MjYsNyArOTU1LDcgQEAKIAl9IGVsc2UgewogCQkqZGx0X2J1ZmZlciA9IChpbnQqKWNhbGxvYyhzaXplb2YoKipkbHRfYnVmZmVyKSwgcC0+ZGx0X2NvdW50KTsKIAkJaWYgKCpkbHRfYnVmZmVyID09IE5VTEwpIHsKLQkJCSh2b2lkKXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCQkodm9pZClwY2FwX3NucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCiAJCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gKFBDQVBfRVJST1IpOwogCQl9CkBAIC05NTksNiArOTg4LDkgQEAKIAlpbnQgaTsKIAljb25zdCBjaGFyICpkbHRfbmFtZTsKIAorCWlmIChkbHQgPCAwKQorCQlnb3RvIHVuc3VwcG9ydGVkOworCiAJaWYgKHAtPmRsdF9jb3VudCA9PSAwIHx8IHAtPnNldF9kYXRhbGlua19vcCA9PSBOVUxMKSB7CiAJCS8qCiAJCSAqIFdlIGNvdWxkbid0IGZldGNoIHRoZSBsaXN0IG9mIERMVHMsIG9yIHdlIGRvbid0CkBAIC05NzYsNyArMTAwOCw3IEBACiAJCXJldHVybiAoMCk7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBwLT5kbHRfY291bnQ7IGkrKykKLQkJaWYgKHAtPmRsdF9saXN0W2ldID09IGRsdCkKKwkJaWYgKHAtPmRsdF9saXN0W2ldID09ICh1X2ludClkbHQpCiAJCQlicmVhazsKIAlpZiAoaSA+PSBwLT5kbHRfY291bnQpCiAJCWdvdG8gdW5zdXBwb3J0ZWQ7CkBAIC0xMDA0LDExICsxMDM2LDExIEBACiB1bnN1cHBvcnRlZDoKIAlkbHRfbmFtZSA9IHBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUoZGx0KTsKIAlpZiAoZGx0X25hbWUgIT0gTlVMTCkgewotCQkodm9pZCkgc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKKwkJKHZvaWQpIHBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKIAkJICAgICIlcyBpcyBub3Qgb25lIG9mIHRoZSBETFRzIHN1cHBvcnRlZCBieSB0aGlzIGRldmljZSIsCiAJCSAgICBkbHRfbmFtZSk7CiAJfSBlbHNlIHsKLQkJKHZvaWQpIHNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCSh2b2lkKSBwY2FwX3NucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCiAJCSAgICAiRExUICVkIGlzIG5vdCBvbmUgb2YgdGhlIERMVHMgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlIiwKIAkJICAgIGRsdCk7CiAJfQpAQCAtMTEwNiwxMzMgKzExMzgsMTM5IEBACiAJaW50CWRsdDsKIH07CiAKLSNkZWZpbmUgRExUX0NIT0lDRShjb2RlLCBkZXNjcmlwdGlvbikgeyAjY29kZSwgZGVzY3JpcHRpb24sIGNvZGUgfQorI2RlZmluZSBETFRfQ0hPSUNFKGNvZGUsIGRlc2NyaXB0aW9uKSB7ICNjb2RlLCBkZXNjcmlwdGlvbiwgRExUXyAjIyBjb2RlIH0KICNkZWZpbmUgRExUX0NIT0lDRV9TRU5USU5FTCB7IE5VTEwsIE5VTEwsIDAgfQogCiBzdGF0aWMgc3RydWN0IGRsdF9jaG9pY2UgZGx0X2Nob2ljZXNbXSA9IHsKLQlETFRfQ0hPSUNFKERMVF9OVUxMLCAiQlNEIGxvb3BiYWNrIiksCi0JRExUX0NIT0lDRShETFRfRU4xME1CLCAiRXRoZXJuZXQiKSwKLQlETFRfQ0hPSUNFKERMVF9JRUVFODAyLCAiVG9rZW4gcmluZyIpLAotCURMVF9DSE9JQ0UoRExUX0FSQ05FVCwgIkJTRCBBUkNORVQiKSwKLQlETFRfQ0hPSUNFKERMVF9TTElQLCAiU0xJUCIpLAotCURMVF9DSE9JQ0UoRExUX1BQUCwgIlBQUCIpLAotCURMVF9DSE9JQ0UoRExUX0ZEREksICJGRERJIiksCi0JRExUX0NIT0lDRShETFRfQVRNX1JGQzE0ODMsICJSRkMgMTQ4MyBMTEMtZW5jYXBzdWxhdGVkIEFUTSIpLAotCURMVF9DSE9JQ0UoRExUX1JBVywgIlJhdyBJUCIpLAotCURMVF9DSE9JQ0UoRExUX1NMSVBfQlNET1MsICJCU0QvT1MgU0xJUCIpLAotCURMVF9DSE9JQ0UoRExUX1BQUF9CU0RPUywgIkJTRC9PUyBQUFAiKSwKLQlETFRfQ0hPSUNFKERMVF9BVE1fQ0xJUCwgIkxpbnV4IENsYXNzaWNhbCBJUC1vdmVyLUFUTSIpLAotCURMVF9DSE9JQ0UoRExUX1BQUF9TRVJJQUwsICJQUFAgb3ZlciBzZXJpYWwiKSwKLQlETFRfQ0hPSUNFKERMVF9QUFBfRVRIRVIsICJQUFBvRSIpLAotICAgICAgICBETFRfQ0hPSUNFKERMVF9TWU1BTlRFQ19GSVJFV0FMTCwgIlN5bWFudGVjIEZpcmV3YWxsIiksCi0JRExUX0NIT0lDRShETFRfQ19IRExDLCAiQ2lzY28gSERMQyIpLAotCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTEsICI4MDIuMTEiKSwKLQlETFRfQ0hPSUNFKERMVF9GUkVMQVksICJGcmFtZSBSZWxheSIpLAotCURMVF9DSE9JQ0UoRExUX0xPT1AsICJPcGVuQlNEIGxvb3BiYWNrIiksCi0JRExUX0NIT0lDRShETFRfRU5DLCAiT3BlbkJTRCBlbmNhcHN1bGF0ZWQgSVAiKSwKLQlETFRfQ0hPSUNFKERMVF9MSU5VWF9TTEwsICJMaW51eCBjb29rZWQiKSwKLQlETFRfQ0hPSUNFKERMVF9MVEFMSywgIkxvY2FsdGFsayIpLAotCURMVF9DSE9JQ0UoRExUX1BGTE9HLCAiT3BlbkJTRCBwZmxvZyBmaWxlIiksCi0JRExUX0NIT0lDRShETFRfUEZTWU5DLCAiUGFja2V0IGZpbHRlciBzdGF0ZSBzeW5jaW5nIiksCi0JRExUX0NIT0lDRShETFRfUFJJU01fSEVBREVSLCAiODAyLjExIHBsdXMgUHJpc20gaGVhZGVyIiksCi0JRExUX0NIT0lDRShETFRfSVBfT1ZFUl9GQywgIlJGQyAyNjI1IElQLW92ZXItRmlicmUgQ2hhbm5lbCIpLAotCURMVF9DSE9JQ0UoRExUX1NVTkFUTSwgIlN1biByYXcgQVRNIiksCi0JRExUX0NIT0lDRShETFRfSUVFRTgwMl8xMV9SQURJTywgIjgwMi4xMSBwbHVzIHJhZGlvdGFwIGhlYWRlciIpLAotCURMVF9DSE9JQ0UoRExUX0FSQ05FVF9MSU5VWCwgIkxpbnV4IEFSQ05FVCIpLAotICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX01MUFBQLCAiSnVuaXBlciBNdWx0aS1MaW5rIFBQUCIpLAotCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfTUxGUiwgIkp1bmlwZXIgTXVsdGktTGluayBGcmFtZSBSZWxheSIpLAotICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0VTLCAiSnVuaXBlciBFbmNyeXB0aW9uIFNlcnZpY2VzIFBJQyIpLAotICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0dHU04sICJKdW5pcGVyIEdHU04gUElDIiksCi0JRExUX0NIT0lDRShETFRfSlVOSVBFUl9NRlIsICJKdW5pcGVyIEZSRi4xNiBGcmFtZSBSZWxheSIpLAotICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0FUTTIsICJKdW5pcGVyIEFUTTIgUElDIiksCi0gICAgICAgIERMVF9DSE9JQ0UoRExUX0pVTklQRVJfU0VSVklDRVMsICJKdW5pcGVyIEFkdmFuY2VkIFNlcnZpY2VzIFBJQyIpLAotICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0FUTTEsICJKdW5pcGVyIEFUTTEgUElDIiksCi0JRExUX0NIT0lDRShETFRfQVBQTEVfSVBfT1ZFUl9JRUVFMTM5NCwgIkFwcGxlIElQLW92ZXItSUVFRSAxMzk0IiksCi0JRExUX0NIT0lDRShETFRfTVRQMl9XSVRIX1BIRFIsICJTUzcgTVRQMiB3aXRoIFBzZXVkby1oZWFkZXIiKSwKLQlETFRfQ0hPSUNFKERMVF9NVFAyLCAiU1M3IE1UUDIiKSwKLQlETFRfQ0hPSUNFKERMVF9NVFAzLCAiU1M3IE1UUDMiKSwKLQlETFRfQ0hPSUNFKERMVF9TQ0NQLCAiU1M3IFNDQ1AiKSwKLQlETFRfQ0hPSUNFKERMVF9ET0NTSVMsICJET0NTSVMiKSwKLQlETFRfQ0hPSUNFKERMVF9MSU5VWF9JUkRBLCAiTGludXggSXJEQSIpLAotCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTLCAiODAyLjExIHBsdXMgQVZTIHJhZGlvIGluZm9ybWF0aW9uIGhlYWRlciIpLAotICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX01PTklUT1IsICJKdW5pcGVyIFBhc3NpdmUgTW9uaXRvciBQSUMiKSwKLQlETFRfQ0hPSUNFKERMVF9CQUNORVRfTVNfVFAsICJCQUNuZXQgTVMvVFAiKSwKLQlETFRfQ0hPSUNFKERMVF9QUFBfUFBQRCwgIlBQUCBmb3IgcHBwZCwgd2l0aCBkaXJlY3Rpb24gZmxhZyIpLAotCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfUFBQT0UsICJKdW5pcGVyIFBQUG9FIiksCi0JRExUX0NIT0lDRShETFRfSlVOSVBFUl9QUFBPRV9BVE0sICJKdW5pcGVyIFBQUG9FL0FUTSIpLAotCURMVF9DSE9JQ0UoRExUX0dQUlNfTExDLCAiR1BSUyBMTEMiKSwKLQlETFRfQ0hPSUNFKERMVF9HUEZfVCwgIkdQRi1UIiksCi0JRExUX0NIT0lDRShETFRfR1BGX0YsICJHUEYtRiIpLAotCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfUElDX1BFRVIsICJKdW5pcGVyIFBJQyBQZWVyIiksCi0JRExUX0NIT0lDRShETFRfRVJGX0VUSCwJIkV0aGVybmV0IHdpdGggRW5kYWNlIEVSRiBoZWFkZXIiKSwKLQlETFRfQ0hPSUNFKERMVF9FUkZfUE9TLCAiUGFja2V0LW92ZXItU09ORVQgd2l0aCBFbmRhY2UgRVJGIGhlYWRlciIpLAotCURMVF9DSE9JQ0UoRExUX0xJTlVYX0xBUEQsICJMaW51eCB2SVNETiBMQVBEIiksCi0JRExUX0NIT0lDRShETFRfSlVOSVBFUl9FVEhFUiwgIkp1bmlwZXIgRXRoZXJuZXQiKSwKLQlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX1BQUCwgIkp1bmlwZXIgUFBQIiksCi0JRExUX0NIT0lDRShETFRfSlVOSVBFUl9GUkVMQVksICJKdW5pcGVyIEZyYW1lIFJlbGF5IiksCi0JRExUX0NIT0lDRShETFRfSlVOSVBFUl9DSERMQywgIkp1bmlwZXIgQy1IRExDIiksCi0JRExUX0NIT0lDRShETFRfTUZSLCAiRlJGLjE2IEZyYW1lIFJlbGF5IiksCi0JRExUX0NIT0lDRShETFRfSlVOSVBFUl9WUCwgIkp1bmlwZXIgVm9pY2UgUElDIiksCi0JRExUX0NIT0lDRShETFRfQTQyOSwgIkFyaW5jIDQyOSIpLAotCURMVF9DSE9JQ0UoRExUX0E2NTNfSUNNLCAiQXJpbmMgNjUzIEludGVycGFydGl0aW9uIENvbW11bmljYXRpb24iKSwKLQlETFRfQ0hPSUNFKERMVF9VU0IsICJVU0IiKSwKLQlETFRfQ0hPSUNFKERMVF9CTFVFVE9PVEhfSENJX0g0LCAiQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllciIpLAotCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTZfTUFDX0NQUywgIklFRUUgODAyLjE2IE1BQyBDb21tb24gUGFydCBTdWJsYXllciIpLAotCURMVF9DSE9JQ0UoRExUX1VTQl9MSU5VWCwgIlVTQiB3aXRoIExpbnV4IGhlYWRlciIpLAotCURMVF9DSE9JQ0UoRExUX0NBTjIwQiwgIkNvbnRyb2xsZXIgQXJlYSBOZXR3b3JrIChDQU4pIHYuIDIuMEIiKSwKLQlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzE1XzRfTElOVVgsICJJRUVFIDgwMi4xNS40IHdpdGggTGludXggcGFkZGluZyIpLAotCURMVF9DSE9JQ0UoRExUX1BQSSwgIlBlci1QYWNrZXQgSW5mb3JtYXRpb24iKSwKLQlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzE2X01BQ19DUFNfUkFESU8sICJJRUVFIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXIgcGx1cyByYWRpb3RhcCBoZWFkZXIiKSwKLQlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0lTTSwgIkp1bmlwZXIgSW50ZWdyYXRlZCBTZXJ2aWNlIE1vZHVsZSIpLAotCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTVfNCwgIklFRUUgODAyLjE1LjQgd2l0aCBGQ1MiKSwKLQlETFRfQ0hPSUNFKERMVF9TSVRBLCAiU0lUQSBwc2V1ZG8taGVhZGVyIiksCi0JRExUX0NIT0lDRShETFRfRVJGLCAiRW5kYWNlIEVSRiBoZWFkZXIiKSwKLQlETFRfQ0hPSUNFKERMVF9SQUlGMSwgIkV0aGVybmV0IHdpdGggdTEwIE5ldHdvcmtzIHBzZXVkby1oZWFkZXIiKSwKLQlETFRfQ0hPSUNFKERMVF9JUE1CLCAiSVBNQiIpLAotCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfU1QsICJKdW5pcGVyIFNlY3VyZSBUdW5uZWwiKSwKLQlETFRfQ0hPSUNFKERMVF9CTFVFVE9PVEhfSENJX0g0X1dJVEhfUEhEUiwgIkJsdWV0b290aCBIQ0kgVUFSVCB0cmFuc3BvcnQgbGF5ZXIgcGx1cyBwc2V1ZG8taGVhZGVyIiksCi0JRExUX0NIT0lDRShETFRfQVgyNV9LSVNTLCAiQVguMjUgd2l0aCBLSVNTIGhlYWRlciIpLAotCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTVfNF9OT05BU0tfUEhZLCAiSUVFRSA4MDIuMTUuNCB3aXRoIG5vbi1BU0sgUEhZIGRhdGEiKSwKLQlETFRfQ0hPSUNFKERMVF9NUExTLCAiTVBMUyB3aXRoIGxhYmVsIGFzIGxpbmstbGF5ZXIgaGVhZGVyIiksCi0JRExUX0NIT0lDRShETFRfTElOVVhfRVZERVYsICJMaW51eCBldmRldiBldmVudHMiKSwKLQlETFRfQ0hPSUNFKERMVF9VU0JfTElOVVhfTU1BUFBFRCwgIlVTQiB3aXRoIHBhZGRlZCBMaW51eCBoZWFkZXIiKSwKLQlETFRfQ0hPSUNFKERMVF9ERUNULCAiREVDVCIpLAotCURMVF9DSE9JQ0UoRExUX0FPUywgIkFPUyBTcGFjZSBEYXRhIExpbmsgcHJvdG9jb2wiKSwKLQlETFRfQ0hPSUNFKERMVF9XSUhBUlQsICJXaXJlbGVzcyBIQVJUIiksCi0JRExUX0NIT0lDRShETFRfRkNfMiwgIkZpYnJlIENoYW5uZWwgRkMtMiIpLAotCURMVF9DSE9JQ0UoRExUX0ZDXzJfV0lUSF9GUkFNRV9ERUxJTVMsICJGaWJyZSBDaGFubmVsIEZDLTIgd2l0aCBmcmFtZSBkZWxpbWl0ZXJzIiksCi0JRExUX0NIT0lDRShETFRfSVBORVQsICJTb2xhcmlzIGlwbmV0IiksCi0JRExUX0NIT0lDRShETFRfQ0FOX1NPQ0tFVENBTiwgIkNBTi1idXMgd2l0aCBTb2NrZXRDQU4gaGVhZGVycyIpLAotCURMVF9DSE9JQ0UoRExUX0lQVjQsICJSYXcgSVB2NCIpLAotCURMVF9DSE9JQ0UoRExUX0lQVjYsICJSYXcgSVB2NiIpLAotCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTVfNF9OT0ZDUywgIklFRUUgODAyLjE1LjQgd2l0aG91dCBGQ1MiKSwKLQlETFRfQ0hPSUNFKERMVF9EQlVTLCAiRC1CdXMiKSwKLQlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX1ZTLCAiSnVuaXBlciBWaXJ0dWFsIFNlcnZlciIpLAotCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfU1JYX0UyRSwgIkp1bmlwZXIgU1JYIEUyRSIpLAotCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfRklCUkVDSEFOTkVMLCAiSnVuaXBlciBGaWJyZSBDaGFubmVsIiksCi0JRExUX0NIT0lDRShETFRfRFZCX0NJLCAiRFZCLUNJIiksCi0JRExUX0NIT0lDRShETFRfTVVYMjcwMTAsICJNVVgyNzAxMCIpLAotCURMVF9DSE9JQ0UoRExUX1NUQU5BR181MDY2X0RfUERVLCAiU1RBTkFHIDUwNjYgRF9QRFVzIiksCi0JRExUX0NIT0lDRShETFRfSlVOSVBFUl9BVE1fQ0VNSUMsICJKdW5pcGVyIEFUTSBDRU1JQyIpLAotCURMVF9DSE9JQ0UoRExUX05GTE9HLCAiTGludXggbmV0ZmlsdGVyIGxvZyBtZXNzYWdlcyIpLAotCURMVF9DSE9JQ0UoRExUX05FVEFOQUxZWkVSLCAiRXRoZXJuZXQgd2l0aCBIaWxzY2hlciBuZXRBTkFMWVpFUiBwc2V1ZG8taGVhZGVyIiksCi0JRExUX0NIT0lDRShETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQsICJFdGhlcm5ldCB3aXRoIEhpbHNjaGVyIG5ldEFOQUxZWkVSIHBzZXVkby1oZWFkZXIgYW5kIHdpdGggcHJlYW1ibGUgYW5kIFNGRCIpLAotCURMVF9DSE9JQ0UoRExUX0lQT0lCLCAiUkZDIDQzOTEgSVAtb3Zlci1JbmZpbmliYW5kIiksCi0JRExUX0NIT0lDRShETFRfTVBFR18yX1RTLCAiTVBFRy0yIHRyYW5zcG9ydCBzdHJlYW0iKSwKLQlETFRfQ0hPSUNFKERMVF9ORzQwLCAibmc0MCBwcm90b2NvbCB0ZXN0ZXIgSXViL0l1ciIpLAotCURMVF9DSE9JQ0UoRExUX05GQ19MTENQLCAiTkZDIExMQ1AgUERVcyB3aXRoIHBzZXVkby1oZWFkZXIiKSwKLQlETFRfQ0hPSUNFKERMVF9JTkZJTklCQU5ELCAiSW5maW5pQmFuZCIpLAotCURMVF9DSE9JQ0UoRExUX1NDVFAsICJTQ1RQIiksCi0JRExUX0NIT0lDRShETFRfVVNCUENBUCwgIlVTQiB3aXRoIFVTQlBjYXAgaGVhZGVyIiksCi0JRExUX0NIT0lDRShETFRfUlRBQ19TRVJJQUwsICJTY2h3ZWl0emVyIEVuZ2luZWVyaW5nIExhYm9yYXRvcmllcyBSVEFDIHBhY2tldHMiKSwKLQlETFRfQ0hPSUNFKERMVF9CTFVFVE9PVEhfTEVfTEwsICJCbHVldG9vdGggTG93IEVuZXJneSBhaXIgaW50ZXJmYWNlIiksCi0JRExUX0NIT0lDRShETFRfTkVUTElOSywgIkxpbnV4IG5ldGxpbmsiKSwKLQlETFRfQ0hPSUNFKERMVF9CTFVFVE9PVEhfTElOVVhfTU9OSVRPUiwgIkJsdWV0b290aCBMaW51eCBNb25pdG9yIiksCi0JRExUX0NIT0lDRShETFRfQkxVRVRPT1RIX0JSRURSX0JCLCAiQmx1ZXRvb3RoIEJhc2ljIFJhdGUvRW5oYW5jZWQgRGF0YSBSYXRlIGJhc2ViYW5kIHBhY2tldHMiKSwKLQlETFRfQ0hPSUNFKERMVF9CTFVFVE9PVEhfTEVfTExfV0lUSF9QSERSLCAiQmx1ZXRvb3RoIExvdyBFbmVyZ3kgYWlyIGludGVyZmFjZSB3aXRoIHBzZXVkby1oZWFkZXIiKSwKLQlETFRfQ0hPSUNFKERMVF9QUk9GSUJVU19ETCwgIlBST0ZJQlVTIGRhdGEgbGluayBsYXllciIpLAotCURMVF9DSE9JQ0UoRExUX1BLVEFQLCAiQXBwbGUgRExUX1BLVEFQIiksCi0JRExUX0NIT0lDRShETFRfRVBPTiwgIkV0aGVybmV0IHdpdGggODAyLjMgQ2xhdXNlIDY1IEVQT04gcHJlYW1ibGUiKSwKKwlETFRfQ0hPSUNFKE5VTEwsICJCU0QgbG9vcGJhY2siKSwKKwlETFRfQ0hPSUNFKEVOMTBNQiwgIkV0aGVybmV0IiksCisJRExUX0NIT0lDRShJRUVFODAyLCAiVG9rZW4gcmluZyIpLAorCURMVF9DSE9JQ0UoQVJDTkVULCAiQlNEIEFSQ05FVCIpLAorCURMVF9DSE9JQ0UoU0xJUCwgIlNMSVAiKSwKKwlETFRfQ0hPSUNFKFBQUCwgIlBQUCIpLAorCURMVF9DSE9JQ0UoRkRESSwgIkZEREkiKSwKKwlETFRfQ0hPSUNFKEFUTV9SRkMxNDgzLCAiUkZDIDE0ODMgTExDLWVuY2Fwc3VsYXRlZCBBVE0iKSwKKwlETFRfQ0hPSUNFKFJBVywgIlJhdyBJUCIpLAorCURMVF9DSE9JQ0UoU0xJUF9CU0RPUywgIkJTRC9PUyBTTElQIiksCisJRExUX0NIT0lDRShQUFBfQlNET1MsICJCU0QvT1MgUFBQIiksCisJRExUX0NIT0lDRShBVE1fQ0xJUCwgIkxpbnV4IENsYXNzaWNhbCBJUC1vdmVyLUFUTSIpLAorCURMVF9DSE9JQ0UoUFBQX1NFUklBTCwgIlBQUCBvdmVyIHNlcmlhbCIpLAorCURMVF9DSE9JQ0UoUFBQX0VUSEVSLCAiUFBQb0UiKSwKKwlETFRfQ0hPSUNFKFNZTUFOVEVDX0ZJUkVXQUxMLCAiU3ltYW50ZWMgRmlyZXdhbGwiKSwKKwlETFRfQ0hPSUNFKENfSERMQywgIkNpc2NvIEhETEMiKSwKKwlETFRfQ0hPSUNFKElFRUU4MDJfMTEsICI4MDIuMTEiKSwKKwlETFRfQ0hPSUNFKEZSRUxBWSwgIkZyYW1lIFJlbGF5IiksCisJRExUX0NIT0lDRShMT09QLCAiT3BlbkJTRCBsb29wYmFjayIpLAorCURMVF9DSE9JQ0UoRU5DLCAiT3BlbkJTRCBlbmNhcHN1bGF0ZWQgSVAiKSwKKwlETFRfQ0hPSUNFKExJTlVYX1NMTCwgIkxpbnV4IGNvb2tlZCIpLAorCURMVF9DSE9JQ0UoTFRBTEssICJMb2NhbHRhbGsiKSwKKwlETFRfQ0hPSUNFKFBGTE9HLCAiT3BlbkJTRCBwZmxvZyBmaWxlIiksCisJRExUX0NIT0lDRShQRlNZTkMsICJQYWNrZXQgZmlsdGVyIHN0YXRlIHN5bmNpbmciKSwKKwlETFRfQ0hPSUNFKFBSSVNNX0hFQURFUiwgIjgwMi4xMSBwbHVzIFByaXNtIGhlYWRlciIpLAorCURMVF9DSE9JQ0UoSVBfT1ZFUl9GQywgIlJGQyAyNjI1IElQLW92ZXItRmlicmUgQ2hhbm5lbCIpLAorCURMVF9DSE9JQ0UoU1VOQVRNLCAiU3VuIHJhdyBBVE0iKSwKKwlETFRfQ0hPSUNFKElFRUU4MDJfMTFfUkFESU8sICI4MDIuMTEgcGx1cyByYWRpb3RhcCBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKEFSQ05FVF9MSU5VWCwgIkxpbnV4IEFSQ05FVCIpLAorCURMVF9DSE9JQ0UoSlVOSVBFUl9NTFBQUCwgIkp1bmlwZXIgTXVsdGktTGluayBQUFAiKSwKKwlETFRfQ0hPSUNFKEpVTklQRVJfTUxGUiwgIkp1bmlwZXIgTXVsdGktTGluayBGcmFtZSBSZWxheSIpLAorCURMVF9DSE9JQ0UoSlVOSVBFUl9FUywgIkp1bmlwZXIgRW5jcnlwdGlvbiBTZXJ2aWNlcyBQSUMiKSwKKwlETFRfQ0hPSUNFKEpVTklQRVJfR0dTTiwgIkp1bmlwZXIgR0dTTiBQSUMiKSwKKwlETFRfQ0hPSUNFKEpVTklQRVJfTUZSLCAiSnVuaXBlciBGUkYuMTYgRnJhbWUgUmVsYXkiKSwKKwlETFRfQ0hPSUNFKEpVTklQRVJfQVRNMiwgIkp1bmlwZXIgQVRNMiBQSUMiKSwKKwlETFRfQ0hPSUNFKEpVTklQRVJfU0VSVklDRVMsICJKdW5pcGVyIEFkdmFuY2VkIFNlcnZpY2VzIFBJQyIpLAorCURMVF9DSE9JQ0UoSlVOSVBFUl9BVE0xLCAiSnVuaXBlciBBVE0xIFBJQyIpLAorCURMVF9DSE9JQ0UoQVBQTEVfSVBfT1ZFUl9JRUVFMTM5NCwgIkFwcGxlIElQLW92ZXItSUVFRSAxMzk0IiksCisJRExUX0NIT0lDRShNVFAyX1dJVEhfUEhEUiwgIlNTNyBNVFAyIHdpdGggUHNldWRvLWhlYWRlciIpLAorCURMVF9DSE9JQ0UoTVRQMiwgIlNTNyBNVFAyIiksCisJRExUX0NIT0lDRShNVFAzLCAiU1M3IE1UUDMiKSwKKwlETFRfQ0hPSUNFKFNDQ1AsICJTUzcgU0NDUCIpLAorCURMVF9DSE9JQ0UoRE9DU0lTLCAiRE9DU0lTIiksCisJRExUX0NIT0lDRShMSU5VWF9JUkRBLCAiTGludXggSXJEQSIpLAorCURMVF9DSE9JQ0UoSUVFRTgwMl8xMV9SQURJT19BVlMsICI4MDIuMTEgcGx1cyBBVlMgcmFkaW8gaW5mb3JtYXRpb24gaGVhZGVyIiksCisJRExUX0NIT0lDRShKVU5JUEVSX01PTklUT1IsICJKdW5pcGVyIFBhc3NpdmUgTW9uaXRvciBQSUMiKSwKKwlETFRfQ0hPSUNFKEJBQ05FVF9NU19UUCwgIkJBQ25ldCBNUy9UUCIpLAorCURMVF9DSE9JQ0UoUFBQX1BQUEQsICJQUFAgZm9yIHBwcGQsIHdpdGggZGlyZWN0aW9uIGZsYWciKSwKKwlETFRfQ0hPSUNFKEpVTklQRVJfUFBQT0UsICJKdW5pcGVyIFBQUG9FIiksCisJRExUX0NIT0lDRShKVU5JUEVSX1BQUE9FX0FUTSwgIkp1bmlwZXIgUFBQb0UvQVRNIiksCisJRExUX0NIT0lDRShHUFJTX0xMQywgIkdQUlMgTExDIiksCisJRExUX0NIT0lDRShHUEZfVCwgIkdQRi1UIiksCisJRExUX0NIT0lDRShHUEZfRiwgIkdQRi1GIiksCisJRExUX0NIT0lDRShKVU5JUEVSX1BJQ19QRUVSLCAiSnVuaXBlciBQSUMgUGVlciIpLAorCURMVF9DSE9JQ0UoRVJGX0VUSCwJIkV0aGVybmV0IHdpdGggRW5kYWNlIEVSRiBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKEVSRl9QT1MsICJQYWNrZXQtb3Zlci1TT05FVCB3aXRoIEVuZGFjZSBFUkYgaGVhZGVyIiksCisJRExUX0NIT0lDRShMSU5VWF9MQVBELCAiTGludXggdklTRE4gTEFQRCIpLAorCURMVF9DSE9JQ0UoSlVOSVBFUl9FVEhFUiwgIkp1bmlwZXIgRXRoZXJuZXQiKSwKKwlETFRfQ0hPSUNFKEpVTklQRVJfUFBQLCAiSnVuaXBlciBQUFAiKSwKKwlETFRfQ0hPSUNFKEpVTklQRVJfRlJFTEFZLCAiSnVuaXBlciBGcmFtZSBSZWxheSIpLAorCURMVF9DSE9JQ0UoSlVOSVBFUl9DSERMQywgIkp1bmlwZXIgQy1IRExDIiksCisJRExUX0NIT0lDRShNRlIsICJGUkYuMTYgRnJhbWUgUmVsYXkiKSwKKwlETFRfQ0hPSUNFKEpVTklQRVJfVlAsICJKdW5pcGVyIFZvaWNlIFBJQyIpLAorCURMVF9DSE9JQ0UoQTQyOSwgIkFyaW5jIDQyOSIpLAorCURMVF9DSE9JQ0UoQTY1M19JQ00sICJBcmluYyA2NTMgSW50ZXJwYXJ0aXRpb24gQ29tbXVuaWNhdGlvbiIpLAorCURMVF9DSE9JQ0UoVVNCX0ZSRUVCU0QsICJVU0Igd2l0aCBGcmVlQlNEIGhlYWRlciIpLAorCURMVF9DSE9JQ0UoQkxVRVRPT1RIX0hDSV9INCwgIkJsdWV0b290aCBIQ0kgVUFSVCB0cmFuc3BvcnQgbGF5ZXIiKSwKKwlETFRfQ0hPSUNFKElFRUU4MDJfMTZfTUFDX0NQUywgIklFRUUgODAyLjE2IE1BQyBDb21tb24gUGFydCBTdWJsYXllciIpLAorCURMVF9DSE9JQ0UoVVNCX0xJTlVYLCAiVVNCIHdpdGggTGludXggaGVhZGVyIiksCisJRExUX0NIT0lDRShDQU4yMEIsICJDb250cm9sbGVyIEFyZWEgTmV0d29yayAoQ0FOKSB2LiAyLjBCIiksCisJRExUX0NIT0lDRShJRUVFODAyXzE1XzRfTElOVVgsICJJRUVFIDgwMi4xNS40IHdpdGggTGludXggcGFkZGluZyIpLAorCURMVF9DSE9JQ0UoUFBJLCAiUGVyLVBhY2tldCBJbmZvcm1hdGlvbiIpLAorCURMVF9DSE9JQ0UoSUVFRTgwMl8xNl9NQUNfQ1BTX1JBRElPLCAiSUVFRSA4MDIuMTYgTUFDIENvbW1vbiBQYXJ0IFN1YmxheWVyIHBsdXMgcmFkaW90YXAgaGVhZGVyIiksCisJRExUX0NIT0lDRShKVU5JUEVSX0lTTSwgIkp1bmlwZXIgSW50ZWdyYXRlZCBTZXJ2aWNlIE1vZHVsZSIpLAorCURMVF9DSE9JQ0UoSUVFRTgwMl8xNV80LCAiSUVFRSA4MDIuMTUuNCB3aXRoIEZDUyIpLAorCURMVF9DSE9JQ0UoU0lUQSwgIlNJVEEgcHNldWRvLWhlYWRlciIpLAorCURMVF9DSE9JQ0UoRVJGLCAiRW5kYWNlIEVSRiBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKFJBSUYxLCAiRXRoZXJuZXQgd2l0aCB1MTAgTmV0d29ya3MgcHNldWRvLWhlYWRlciIpLAorCURMVF9DSE9JQ0UoSVBNQiwgIklQTUIiKSwKKwlETFRfQ0hPSUNFKEpVTklQRVJfU1QsICJKdW5pcGVyIFNlY3VyZSBUdW5uZWwiKSwKKwlETFRfQ0hPSUNFKEJMVUVUT09USF9IQ0lfSDRfV0lUSF9QSERSLCAiQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllciBwbHVzIHBzZXVkby1oZWFkZXIiKSwKKwlETFRfQ0hPSUNFKEFYMjVfS0lTUywgIkFYLjI1IHdpdGggS0lTUyBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKElFRUU4MDJfMTVfNF9OT05BU0tfUEhZLCAiSUVFRSA4MDIuMTUuNCB3aXRoIG5vbi1BU0sgUEhZIGRhdGEiKSwKKwlETFRfQ0hPSUNFKE1QTFMsICJNUExTIHdpdGggbGFiZWwgYXMgbGluay1sYXllciBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKExJTlVYX0VWREVWLCAiTGludXggZXZkZXYgZXZlbnRzIiksCisJRExUX0NIT0lDRShVU0JfTElOVVhfTU1BUFBFRCwgIlVTQiB3aXRoIHBhZGRlZCBMaW51eCBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERFQ1QsICJERUNUIiksCisJRExUX0NIT0lDRShBT1MsICJBT1MgU3BhY2UgRGF0YSBMaW5rIHByb3RvY29sIiksCisJRExUX0NIT0lDRShXSUhBUlQsICJXaXJlbGVzcyBIQVJUIiksCisJRExUX0NIT0lDRShGQ18yLCAiRmlicmUgQ2hhbm5lbCBGQy0yIiksCisJRExUX0NIT0lDRShGQ18yX1dJVEhfRlJBTUVfREVMSU1TLCAiRmlicmUgQ2hhbm5lbCBGQy0yIHdpdGggZnJhbWUgZGVsaW1pdGVycyIpLAorCURMVF9DSE9JQ0UoSVBORVQsICJTb2xhcmlzIGlwbmV0IiksCisJRExUX0NIT0lDRShDQU5fU09DS0VUQ0FOLCAiQ0FOLWJ1cyB3aXRoIFNvY2tldENBTiBoZWFkZXJzIiksCisJRExUX0NIT0lDRShJUFY0LCAiUmF3IElQdjQiKSwKKwlETFRfQ0hPSUNFKElQVjYsICJSYXcgSVB2NiIpLAorCURMVF9DSE9JQ0UoSUVFRTgwMl8xNV80X05PRkNTLCAiSUVFRSA4MDIuMTUuNCB3aXRob3V0IEZDUyIpLAorCURMVF9DSE9JQ0UoREJVUywgIkQtQnVzIiksCisJRExUX0NIT0lDRShKVU5JUEVSX1ZTLCAiSnVuaXBlciBWaXJ0dWFsIFNlcnZlciIpLAorCURMVF9DSE9JQ0UoSlVOSVBFUl9TUlhfRTJFLCAiSnVuaXBlciBTUlggRTJFIiksCisJRExUX0NIT0lDRShKVU5JUEVSX0ZJQlJFQ0hBTk5FTCwgIkp1bmlwZXIgRmlicmUgQ2hhbm5lbCIpLAorCURMVF9DSE9JQ0UoRFZCX0NJLCAiRFZCLUNJIiksCisJRExUX0NIT0lDRShNVVgyNzAxMCwgIk1VWDI3MDEwIiksCisJRExUX0NIT0lDRShTVEFOQUdfNTA2Nl9EX1BEVSwgIlNUQU5BRyA1MDY2IERfUERVcyIpLAorCURMVF9DSE9JQ0UoSlVOSVBFUl9BVE1fQ0VNSUMsICJKdW5pcGVyIEFUTSBDRU1JQyIpLAorCURMVF9DSE9JQ0UoTkZMT0csICJMaW51eCBuZXRmaWx0ZXIgbG9nIG1lc3NhZ2VzIiksCisJRExUX0NIT0lDRShORVRBTkFMWVpFUiwgIkV0aGVybmV0IHdpdGggSGlsc2NoZXIgbmV0QU5BTFlaRVIgcHNldWRvLWhlYWRlciIpLAorCURMVF9DSE9JQ0UoTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQsICJFdGhlcm5ldCB3aXRoIEhpbHNjaGVyIG5ldEFOQUxZWkVSIHBzZXVkby1oZWFkZXIgYW5kIHdpdGggcHJlYW1ibGUgYW5kIFNGRCIpLAorCURMVF9DSE9JQ0UoSVBPSUIsICJSRkMgNDM5MSBJUC1vdmVyLUluZmluaWJhbmQiKSwKKwlETFRfQ0hPSUNFKE1QRUdfMl9UUywgIk1QRUctMiB0cmFuc3BvcnQgc3RyZWFtIiksCisJRExUX0NIT0lDRShORzQwLCAibmc0MCBwcm90b2NvbCB0ZXN0ZXIgSXViL0l1ciIpLAorCURMVF9DSE9JQ0UoTkZDX0xMQ1AsICJORkMgTExDUCBQRFVzIHdpdGggcHNldWRvLWhlYWRlciIpLAorCURMVF9DSE9JQ0UoSU5GSU5JQkFORCwgIkluZmluaUJhbmQiKSwKKwlETFRfQ0hPSUNFKFNDVFAsICJTQ1RQIiksCisJRExUX0NIT0lDRShVU0JQQ0FQLCAiVVNCIHdpdGggVVNCUGNhcCBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKFJUQUNfU0VSSUFMLCAiU2Nod2VpdHplciBFbmdpbmVlcmluZyBMYWJvcmF0b3JpZXMgUlRBQyBwYWNrZXRzIiksCisJRExUX0NIT0lDRShCTFVFVE9PVEhfTEVfTEwsICJCbHVldG9vdGggTG93IEVuZXJneSBhaXIgaW50ZXJmYWNlIiksCisJRExUX0NIT0lDRShORVRMSU5LLCAiTGludXggbmV0bGluayIpLAorCURMVF9DSE9JQ0UoQkxVRVRPT1RIX0xJTlVYX01PTklUT1IsICJCbHVldG9vdGggTGludXggTW9uaXRvciIpLAorCURMVF9DSE9JQ0UoQkxVRVRPT1RIX0JSRURSX0JCLCAiQmx1ZXRvb3RoIEJhc2ljIFJhdGUvRW5oYW5jZWQgRGF0YSBSYXRlIGJhc2ViYW5kIHBhY2tldHMiKSwKKwlETFRfQ0hPSUNFKEJMVUVUT09USF9MRV9MTF9XSVRIX1BIRFIsICJCbHVldG9vdGggTG93IEVuZXJneSBhaXIgaW50ZXJmYWNlIHdpdGggcHNldWRvLWhlYWRlciIpLAorCURMVF9DSE9JQ0UoUFJPRklCVVNfREwsICJQUk9GSUJVUyBkYXRhIGxpbmsgbGF5ZXIiKSwKKwlETFRfQ0hPSUNFKFBLVEFQLCAiQXBwbGUgRExUX1BLVEFQIiksCisJRExUX0NIT0lDRShFUE9OLCAiRXRoZXJuZXQgd2l0aCA4MDIuMyBDbGF1c2UgNjUgRVBPTiBwcmVhbWJsZSIpLAorCURMVF9DSE9JQ0UoSVBNSV9IUE1fMiwgIklQTUkgdHJhY2UgcGFja2V0cyIpLAorCURMVF9DSE9JQ0UoWldBVkVfUjFfUjIsICJaLVdhdmUgUkYgcHJvZmlsZSBSMSBhbmQgUjIgcGFja2V0cyIpLAorCURMVF9DSE9JQ0UoWldBVkVfUjMsICJaLVdhdmUgUkYgcHJvZmlsZSBSMyBwYWNrZXRzIiksCisJRExUX0NIT0lDRShXQVRUU1RPUFBFUl9ETE0sICJXYXR0U3RvcHBlciBEaWdpdGFsIExpZ2h0aW5nIE1hbmFnZW1lbnQgKERMTSkgYW5kIExlZ3JhbmQgTml0b28gT3BlbiBwcm90b2NvbCIpLAorCURMVF9DSE9JQ0UoSVNPXzE0NDQzLCAiSVNPIDE0NDQzIG1lc3NhZ2VzIiksCisJRExUX0NIT0lDRShSRFMsICJJRUMgNjIxMDYgUmFkaW8gRGF0YSBTeXN0ZW0gZ3JvdXBzIiksCiAJRExUX0NIT0lDRV9TRU5USU5FTAogfTsKIApAQCAtMTI0Miw4ICsxMjgwLDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGRsdF9jaG9pY2VzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7Ci0JCWlmIChwY2FwX3N0cmNhc2VjbXAoZGx0X2Nob2ljZXNbaV0ubmFtZSArIHNpemVvZigiRExUXyIpIC0gMSwKLQkJICAgIG5hbWUpID09IDApCisJCWlmIChwY2FwX3N0cmNhc2VjbXAoZGx0X2Nob2ljZXNbaV0ubmFtZSwgbmFtZSkgPT0gMCkKIAkJCXJldHVybiAoZGx0X2Nob2ljZXNbaV0uZGx0KTsKIAl9CiAJcmV0dXJuICgtMSk7CkBAIC0xMjU2LDcgKzEyOTMsNyBAQAogCiAJZm9yIChpID0gMDsgZGx0X2Nob2ljZXNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKIAkJaWYgKGRsdF9jaG9pY2VzW2ldLmRsdCA9PSBkbHQpCi0JCQlyZXR1cm4gKGRsdF9jaG9pY2VzW2ldLm5hbWUgKyBzaXplb2YoIkRMVF8iKSAtIDEpOworCQkJcmV0dXJuIChkbHRfY2hvaWNlc1tpXS5uYW1lKTsKIAl9CiAJcmV0dXJuIChOVUxMKTsKIH0KQEAgLTEzNjUsNyArMTQwMiw3IEBACiBpbnQKIHBjYXBfZmlsZW5vKHBjYXBfdCAqcCkKIHsKLSNpZm5kZWYgV0lOMzIKKyNpZm5kZWYgX1dJTjMyCiAJcmV0dXJuIChwLT5mZCk7CiAjZWxzZQogCWlmIChwLT5hZGFwdGVyICE9IE5VTEwpCkBAIC0xMzc1LDcgKzE0MTIsNyBAQAogI2VuZGlmCiB9CiAKLSNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChNU0RPUykKIGludAogcGNhcF9nZXRfc2VsZWN0YWJsZV9mZChwY2FwX3QgKnApCiB7CkBAIC0xMzg0LDcgKzE0MjEsNyBAQAogI2VuZGlmCiAKIHZvaWQKLXBjYXBfcGVycm9yKHBjYXBfdCAqcCwgY2hhciAqcHJlZml4KQorcGNhcF9wZXJyb3IocGNhcF90ICpwLCBjb25zdCBjaGFyICpwcmVmaXgpCiB7CiAJZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIHByZWZpeCwgcC0+ZXJyYnVmKTsKIH0KQEAgLTE0MTUsMTEgKzE0NTIsOCBAQAogLyoKICAqIEdldCB0aGUgY3VycmVudCBub24tYmxvY2tpbmcgbW9kZSBzZXR0aW5nLCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0CiAgKiBpdCdzIGp1c3QgdGhlIHN0YW5kYXJkIFBPU0lYIG5vbi1ibG9ja2luZyBmbGFnLgotICoKLSAqIFdlIGRvbid0IGxvb2sgYXQgInAtPm5vbmJsb2NrIiwgaW4gY2FzZSBzb21lYm9keSB0d2Vha2VkIHRoZSBGRAotICogZGlyZWN0bHkuCiAgKi8KLSNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChNU0RPUykKIGludAogcGNhcF9nZXRub25ibG9ja19mZChwY2FwX3QgKnAsIGNoYXIgKmVycmJ1ZikKIHsKQEAgLTE0MjcsNyArMTQ2MSw3IEBACiAKIAlmZGZsYWdzID0gZmNudGwocC0+ZmQsIEZfR0VURkwsIDApOwogCWlmIChmZGZsYWdzID09IC0xKSB7Ci0JCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkZfR0VURkw6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGX0dFVEZMOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTE0NTUsNyArMTQ4OSw3IEBACiAJcmV0dXJuIChyZXQpOwogfQogCi0jaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQorI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCiAvKgogICogU2V0IG5vbi1ibG9ja2luZyBtb2RlLCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0J3MganVzdCB0aGUKICAqIHN0YW5kYXJkIFBPU0lYIG5vbi1ibG9ja2luZyBmbGFnLiAgKFRoaXMgY2FuIGJlIGNhbGxlZCBieSB0aGUKQEAgLTE0NjksNyArMTUwMyw3IEBACiAKIAlmZGZsYWdzID0gZmNudGwocC0+ZmQsIEZfR0VURkwsIDApOwogCWlmIChmZGZsYWdzID09IC0xKSB7Ci0JCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkZfR0VURkw6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGX0dFVEZMOiAlcyIsCiAJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoLTEpOwogCX0KQEAgLTE0NzgsNyArMTUxMiw3IEBACiAJZWxzZQogCQlmZGZsYWdzICY9IH5PX05PTkJMT0NLOwogCWlmIChmY250bChwLT5mZCwgRl9TRVRGTCwgZmRmbGFncykgPT0gLTEpIHsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRl9TRVRGTDogJXMiLAorCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkZfU0VURkw6ICVzIiwKIAkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuICgtMSk7CiAJfQpAQCAtMTQ4NiwyMSArMTUyMCwxOCBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBXSU4zMgorI2lmZGVmIF9XSU4zMgogLyoKLSAqIEdlbmVyYXRlIGEgc3RyaW5nIGZvciB0aGUgbGFzdCBXaW4zMi1zcGVjaWZpYyBlcnJvciAoaS5lLiBhbiBlcnJvciBnZW5lcmF0ZWQgd2hlbgorICogR2VuZXJhdGUgYSBzdHJpbmcgZm9yIGEgV2luMzItc3BlY2lmaWMgZXJyb3IgKGkuZS4gYW4gZXJyb3IgZ2VuZXJhdGVkIHdoZW4KICAqIGNhbGxpbmcgYSBXaW4zMiBBUEkpLgogICogRm9yIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgc3RhbmRhcmQgQyBjYWxscywgd2Ugc3RpbGwgdXNlIHBjYXBfc3RyZXJyb3IoKQogICovCi1jaGFyICoKLXBjYXBfd2luMzJzdHJlcnJvcih2b2lkKQordm9pZAorcGNhcF93aW4zMl9lcnJfdG9fc3RyKERXT1JEIGVycm9yLCBjaGFyICplcnJidWYpCiB7Ci0JRFdPUkQgZXJyb3I7Ci0Jc3RhdGljIGNoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkUrMV07Ci0JaW50IGVycmxlbjsKKwlzaXplX3QgZXJybGVuOwogCWNoYXIgKnA7CiAKLQllcnJvciA9IEdldExhc3RFcnJvcigpOwogCUZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sIE5VTEwsIGVycm9yLCAwLCBlcnJidWYsCiAJICAgIFBDQVBfRVJSQlVGX1NJWkUsIE5VTEwpOwogCkBAIC0xNTE0LDggKzE1NDUsNyBAQAogCQllcnJidWZbZXJybGVuIC0gMl0gPSAnXDAnOwogCX0KIAlwID0gc3RyY2hyKGVycmJ1ZiwgJ1wwJyk7Ci0Jc25wcmludGYgKHAsIHNpemVvZihlcnJidWYpLShwLWVycmJ1ZiksICIgKCVsdSkiLCBlcnJvcik7Ci0JcmV0dXJuIChlcnJidWYpOworCXBjYXBfc25wcmludGYgKHAsIFBDQVBfRVJSQlVGX1NJWkUrMS0ocC1lcnJidWYpLCAiICglbHUpIiwgZXJyb3IpOwogfQogI2VuZGlmCiAKQEAgLTE1NzQsNyArMTYwNCw3IEBACiAJY2FzZSBQQ0FQX0VSUk9SX1RTVEFNUF9QUkVDSVNJT05fTk9UU1VQOgogCQlyZXR1cm4gKCJUaGF0IGRldmljZSBkb2Vzbid0IHN1cHBvcnQgdGhhdCB0aW1lIHN0YW1wIHByZWNpc2lvbiIpOwogCX0KLQkodm9pZClzbnByaW50ZihlYnVmLCBzaXplb2YgZWJ1ZiwgIlVua25vd24gZXJyb3I6ICVkIiwgZXJybnVtKTsKKwkodm9pZClwY2FwX3NucHJpbnRmKGVidWYsIHNpemVvZiBlYnVmLCAiVW5rbm93biBlcnJvcjogJWQiLCBlcnJudW0pOwogCXJldHVybihlYnVmKTsKIH0KIApAQCAtMTU4NSwxNiArMTYxNSwyNSBAQAogcGNhcF9zdHJlcnJvcihpbnQgZXJybnVtKQogewogI2lmZGVmIEhBVkVfU1RSRVJST1IKKyNpZmRlZiBfV0lOMzIKKwlzdGF0aWMgY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRV07CisJZXJybm9fdCBlcnJubzsKKwllcnJubyA9IHN0cmVycm9yX3MoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCBlcnJudW0pOworCWlmIChlcnJubyAhPSAwKSAvKiBlcnJubyA9IDAgaWYgc3VjY2Vzc2Z1bCAqLworCQlzdHJsY3B5KGVycmJ1ZiwgInN0cmVycm9yX3MoKSBlcnJvciIsIFBDQVBfRVJSQlVGX1NJWkUpOworCXJldHVybiAoZXJyYnVmKTsKKyNlbHNlCiAJcmV0dXJuIChzdHJlcnJvcihlcnJudW0pKTsKKyNlbmRpZiAvKiBfV0lOMzIgKi8KICNlbHNlCiAJZXh0ZXJuIGludCBzeXNfbmVycjsKIAlleHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc3lzX2Vycmxpc3RbXTsKLQlzdGF0aWMgY2hhciBlYnVmWzE1KzEwKzFdOworCXN0YXRpYyBjaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKIAogCWlmICgodW5zaWduZWQgaW50KWVycm51bSA8IHN5c19uZXJyKQogCQlyZXR1cm4gKChjaGFyICopc3lzX2Vycmxpc3RbZXJybnVtXSk7Ci0JKHZvaWQpc25wcmludGYoZWJ1Ziwgc2l6ZW9mIGVidWYsICJVbmtub3duIGVycm9yOiAlZCIsIGVycm51bSk7Ci0JcmV0dXJuKGVidWYpOworCSh2b2lkKXBjYXBfc25wcmludGYoZXJyYnVmLCBzaXplb2YgZXJyYnVmLCAiVW5rbm93biBlcnJvcjogJWQiLCBlcnJudW0pOworCXJldHVybiAoZXJyYnVmKTsKICNlbmRpZgogfQogCkBAIC0xNjE0LDcgKzE2NTMsNyBAQAogcGNhcF9zZXRkaXJlY3Rpb24ocGNhcF90ICpwLCBwY2FwX2RpcmVjdGlvbl90IGQpCiB7CiAJaWYgKHAtPnNldGRpcmVjdGlvbl9vcCA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiU2V0dGluZyBkaXJlY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKIAkJcmV0dXJuICgtMSk7CiAJfSBlbHNlCkBAIC0xNjMwLDEyICsxNjY5LDE4IEBACiBzdGF0aWMgaW50CiBwY2FwX3N0YXRzX2RlYWQocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcyBfVV8pCiB7Ci0Jc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCSAgICAiU3RhdGlzdGljcyBhcmVuJ3QgYXZhaWxhYmxlIGZyb20gYSBwY2FwX29wZW5fZGVhZCBwY2FwX3QiKTsKIAlyZXR1cm4gKC0xKTsKIH0KIAotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCitzdHJ1Y3QgcGNhcF9zdGF0ICoKK3BjYXBfc3RhdHNfZXgocGNhcF90ICpwLCBpbnQgKnBjYXBfc3RhdF9zaXplKQoreworCXJldHVybiAocC0+c3RhdHNfZXhfb3AocCwgcGNhcF9zdGF0X3NpemUpKTsKK30KKwogaW50CiBwY2FwX3NldGJ1ZmYocGNhcF90ICpwLCBpbnQgZGltKQogewpAQCAtMTY0NSw3ICsxNjkwLDcgQEAKIHN0YXRpYyBpbnQKIHBjYXBfc2V0YnVmZl9kZWFkKHBjYXBfdCAqcCwgaW50IGRpbSkKIHsKLQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJICAgICJUaGUga2VybmVsIGJ1ZmZlciBzaXplIGNhbm5vdCBiZSBzZXQgb24gYSBwY2FwX29wZW5fZGVhZCBwY2FwX3QiKTsKIAlyZXR1cm4gKC0xKTsKIH0KQEAgLTE2NTksNyArMTcwNCw3IEBACiBzdGF0aWMgaW50CiBwY2FwX3NldG1vZGVfZGVhZChwY2FwX3QgKnAsIGludCBtb2RlKQogewotCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkgICAgImltcG9zc2libGUgdG8gc2V0IG1vZGUgb24gYSBwY2FwX29wZW5fZGVhZCBwY2FwX3QiKTsKIAlyZXR1cm4gKC0xKTsKIH0KQEAgLTE2NzAsMTkgKzE3MTUsMTgxIEBACiAJcmV0dXJuIChwLT5zZXRtaW50b2NvcHlfb3AocCwgc2l6ZSkpOwogfQogCi1BZGFwdGVyICoKLXBjYXBfZ2V0X2FkYXB0ZXIocGNhcF90ICpwKQotewotCXJldHVybiAocC0+Z2V0YWRhcHRlcl9vcChwKSk7Ci19Ci0KIHN0YXRpYyBpbnQKIHBjYXBfc2V0bWludG9jb3B5X2RlYWQocGNhcF90ICpwLCBpbnQgc2l6ZSkKIHsKLQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJICAgICJUaGUgbWludG9jb3B5IHBhcmFtZXRlciBjYW5ub3QgYmUgc2V0IG9uIGEgcGNhcF9vcGVuX2RlYWQgcGNhcF90Iik7CiAJcmV0dXJuICgtMSk7CiB9CisKK0hBTkRMRQorcGNhcF9nZXRldmVudChwY2FwX3QgKnApCit7CisJcmV0dXJuIChwLT5nZXRldmVudF9vcChwKSk7Cit9CisKK3N0YXRpYyBIQU5ETEUKK3BjYXBfZ2V0ZXZlbnRfZGVhZChwY2FwX3QgKnApCit7CisJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJBIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCBoYXMgbm8gZXZlbnQgaGFuZGxlIik7CisJcmV0dXJuIChJTlZBTElEX0hBTkRMRV9WQUxVRSk7Cit9CisKK2ludAorcGNhcF9vaWRfZ2V0X3JlcXVlc3QocGNhcF90ICpwLCBicGZfdV9pbnQzMiBvaWQsIHZvaWQgKmRhdGEsIHNpemVfdCAqbGVucCkKK3sKKwlyZXR1cm4gKHAtPm9pZF9nZXRfcmVxdWVzdF9vcChwLCBvaWQsIGRhdGEsIGxlbnApKTsKK30KKworc3RhdGljIGludAorcGNhcF9vaWRfZ2V0X3JlcXVlc3RfZGVhZChwY2FwX3QgKnAsIGJwZl91X2ludDMyIG9pZCBfVV8sIHZvaWQgKmRhdGEgX1VfLAorICAgIHNpemVfdCAqbGVucCBfVV8pCit7CisJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJBbiBPSUQgZ2V0IHJlcXVlc3QgY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBhIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCIpOworCXJldHVybiAoUENBUF9FUlJPUik7Cit9CisKK2ludAorcGNhcF9vaWRfc2V0X3JlcXVlc3QocGNhcF90ICpwLCBicGZfdV9pbnQzMiBvaWQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCAqbGVucCkKK3sKKwlyZXR1cm4gKHAtPm9pZF9zZXRfcmVxdWVzdF9vcChwLCBvaWQsIGRhdGEsIGxlbnApKTsKK30KKworc3RhdGljIGludAorcGNhcF9vaWRfc2V0X3JlcXVlc3RfZGVhZChwY2FwX3QgKnAsIGJwZl91X2ludDMyIG9pZCBfVV8sIGNvbnN0IHZvaWQgKmRhdGEgX1VfLAorICAgIHNpemVfdCAqbGVucCBfVV8pCit7CisJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJBbiBPSUQgc2V0IHJlcXVlc3QgY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBhIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCIpOworCXJldHVybiAoUENBUF9FUlJPUik7Cit9CisKK3BjYXBfc2VuZF9xdWV1ZSAqCitwY2FwX3NlbmRxdWV1ZV9hbGxvYyh1X2ludCBtZW1zaXplKQoreworCXBjYXBfc2VuZF9xdWV1ZSAqdHF1ZXVlOworCisJLyogQWxsb2NhdGUgdGhlIHF1ZXVlICovCisJdHF1ZXVlID0gKHBjYXBfc2VuZF9xdWV1ZSAqKW1hbGxvYyhzaXplb2YocGNhcF9zZW5kX3F1ZXVlKSk7CisJaWYgKHRxdWV1ZSA9PSBOVUxMKXsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCisJdHF1ZXVlLT5idWZmZXIgPSAoY2hhciAqKW1hbGxvYyhtZW1zaXplKTsKKwlpZiAodHF1ZXVlLT5idWZmZXIgPT0gTlVMTCkgeworCQlmcmVlKHRxdWV1ZSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJdHF1ZXVlLT5tYXhsZW4gPSBtZW1zaXplOworCXRxdWV1ZS0+bGVuID0gMDsKKworCXJldHVybiAodHF1ZXVlKTsKK30KKwordm9pZAorcGNhcF9zZW5kcXVldWVfZGVzdHJveShwY2FwX3NlbmRfcXVldWUgKnF1ZXVlKQoreworCWZyZWUocXVldWUtPmJ1ZmZlcik7CisJZnJlZShxdWV1ZSk7Cit9CisKK2ludAorcGNhcF9zZW5kcXVldWVfcXVldWUocGNhcF9zZW5kX3F1ZXVlICpxdWV1ZSwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpwa3RfaGVhZGVyLCBjb25zdCB1X2NoYXIgKnBrdF9kYXRhKQoreworCWlmIChxdWV1ZS0+bGVuICsgc2l6ZW9mKHN0cnVjdCBwY2FwX3BrdGhkcikgKyBwa3RfaGVhZGVyLT5jYXBsZW4gPiBxdWV1ZS0+bWF4bGVuKXsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyogQ29weSB0aGUgcGNhcF9wa3RoZHIgaGVhZGVyKi8KKwltZW1jcHkocXVldWUtPmJ1ZmZlciArIHF1ZXVlLT5sZW4sIHBrdF9oZWFkZXIsIHNpemVvZihzdHJ1Y3QgcGNhcF9wa3RoZHIpKTsKKwlxdWV1ZS0+bGVuICs9IHNpemVvZihzdHJ1Y3QgcGNhcF9wa3RoZHIpOworCisJLyogY29weSB0aGUgcGFja2V0ICovCisJbWVtY3B5KHF1ZXVlLT5idWZmZXIgKyBxdWV1ZS0+bGVuLCBwa3RfZGF0YSwgcGt0X2hlYWRlci0+Y2FwbGVuKTsKKwlxdWV1ZS0+bGVuICs9IHBrdF9oZWFkZXItPmNhcGxlbjsKKworCXJldHVybiAoMCk7Cit9CisKK3VfaW50CitwY2FwX3NlbmRxdWV1ZV90cmFuc21pdChwY2FwX3QgKnAsIHBjYXBfc2VuZF9xdWV1ZSAqcXVldWUsIGludCBzeW5jKQoreworCXJldHVybiAocC0+c2VuZHF1ZXVlX3RyYW5zbWl0X29wKHAsIHF1ZXVlLCBzeW5jKSk7Cit9CisKK3N0YXRpYyB1X2ludAorcGNhcF9zZW5kcXVldWVfdHJhbnNtaXRfZGVhZChwY2FwX3QgKnAsIHBjYXBfc2VuZF9xdWV1ZSAqcXVldWUsIGludCBzeW5jKQoreworCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiUGFja2V0cyBjYW5ub3QgYmUgdHJhbnNtaXR0ZWQgb24gYSBwY2FwX29wZW5fZGVhZCBwY2FwX3QiKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK3BjYXBfc2V0dXNlcmJ1ZmZlcihwY2FwX3QgKnAsIGludCBzaXplKQoreworCXJldHVybiAocC0+c2V0dXNlcmJ1ZmZlcl9vcChwLCBzaXplKSk7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfc2V0dXNlcmJ1ZmZlcl9kZWFkKHBjYXBfdCAqcCwgaW50IHNpemUpCit7CisJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJUaGUgdXNlciBidWZmZXIgY2Fubm90IGJlIHNldCBvbiBhIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCIpOworCXJldHVybiAoLTEpOworfQorCitpbnQKK3BjYXBfbGl2ZV9kdW1wKHBjYXBfdCAqcCwgY2hhciAqZmlsZW5hbWUsIGludCBtYXhzaXplLCBpbnQgbWF4cGFja3MpCit7CisJcmV0dXJuIChwLT5saXZlX2R1bXBfb3AocCwgZmlsZW5hbWUsIG1heHNpemUsIG1heHBhY2tzKSk7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfbGl2ZV9kdW1wX2RlYWQocGNhcF90ICpwLCBjaGFyICpmaWxlbmFtZSwgaW50IG1heHNpemUsIGludCBtYXhwYWNrcykKK3sKKwlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIkxpdmUgcGFja2V0IGR1bXBpbmcgY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBhIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCIpOworCXJldHVybiAoLTEpOworfQorCitpbnQKK3BjYXBfbGl2ZV9kdW1wX2VuZGVkKHBjYXBfdCAqcCwgaW50IHN5bmMpCit7CisJcmV0dXJuIChwLT5saXZlX2R1bXBfZW5kZWRfb3AocCwgc3luYykpOworfQorCitzdGF0aWMgaW50CitwY2FwX2xpdmVfZHVtcF9lbmRlZF9kZWFkKHBjYXBfdCAqcCwgaW50IHN5bmMpCit7CisJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJMaXZlIHBhY2tldCBkdW1waW5nIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gYSBwY2FwX29wZW5fZGVhZCBwY2FwX3QiKTsKKwlyZXR1cm4gKC0xKTsKK30KKworUEFpcnBjYXBIYW5kbGUKK3BjYXBfZ2V0X2FpcnBjYXBfaGFuZGxlKHBjYXBfdCAqcCkKK3sKKwlQQWlycGNhcEhhbmRsZSBoYW5kbGU7CisKKwloYW5kbGUgPSBwLT5nZXRfYWlycGNhcF9oYW5kbGVfb3AocCk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCSh2b2lkKXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKKwkJICAgICJUaGlzIGlzbid0IGFuIEFpclBjYXAgZGV2aWNlIik7CisJfQorCXJldHVybiAoaGFuZGxlKTsKK30KKworc3RhdGljIFBBaXJwY2FwSGFuZGxlCitwY2FwX2dldF9haXJwY2FwX2hhbmRsZV9kZWFkKHBjYXBfdCAqcCkKK3sKKwlyZXR1cm4gKE5VTEwpOworfQogI2VuZGlmCiAKIC8qCkBAIC0xNzI3LDEyICsxOTM0LDExIEBACiAJICogInBjYXBfY2xvc2VfYWxsKCkiIGNhbGxlZCB3aGVuIHdlIGV4aXQuCiAJICovCiAJaWYgKCFkaWRfYXRleGl0KSB7Ci0JCWlmIChhdGV4aXQocGNhcF9jbG9zZV9hbGwpID09IC0xKSB7CisJCWlmIChhdGV4aXQocGNhcF9jbG9zZV9hbGwpICE9IDApIHsKIAkJCS8qCiAJCQkgKiAiYXRleGl0KCkiIGZhaWxlZDsgbGV0IG91ciBjYWxsZXIga25vdy4KIAkJCSAqLwotCQkJc3RybmNweShwLT5lcnJidWYsICJhdGV4aXQgZmFpbGVkIiwKLQkJCSAgICBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJCXN0cmxjcHkocC0+ZXJyYnVmLCAiYXRleGl0IGZhaWxlZCIsIFBDQVBfRVJSQlVGX1NJWkUpOwogCQkJcmV0dXJuICgwKTsKIAkJfQogCQlkaWRfYXRleGl0ID0gMTsKQEAgLTE3OTcsNyArMjAwMyw3IEBACiAJCXAtPnRzdGFtcF9wcmVjaXNpb25fY291bnQgPSAwOwogCX0KIAlwY2FwX2ZyZWVjb2RlKCZwLT5mY29kZSk7Ci0jaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQorI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCiAJaWYgKHAtPmZkID49IDApIHsKIAkJY2xvc2UocC0+ZmQpOwogCQlwLT5mZCA9IC0xOwpAQCAtMTgzNCwxMCArMjA0MCwxOSBAQAogCXAtPmxpbmt0eXBlID0gbGlua3R5cGU7CiAJcC0+b3B0LnRzdGFtcF9wcmVjaXNpb24gPSBwcmVjaXNpb247CiAJcC0+c3RhdHNfb3AgPSBwY2FwX3N0YXRzX2RlYWQ7Ci0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKKwlwLT5zdGF0c19leF9vcCA9IChzdGF0c19leF9vcF90KXBjYXBfbm90X2luaXRpYWxpemVkX3B0cjsKIAlwLT5zZXRidWZmX29wID0gcGNhcF9zZXRidWZmX2RlYWQ7CiAJcC0+c2V0bW9kZV9vcCA9IHBjYXBfc2V0bW9kZV9kZWFkOwogCXAtPnNldG1pbnRvY29weV9vcCA9IHBjYXBfc2V0bWludG9jb3B5X2RlYWQ7CisJcC0+Z2V0ZXZlbnRfb3AgPSBwY2FwX2dldGV2ZW50X2RlYWQ7CisJcC0+b2lkX2dldF9yZXF1ZXN0X29wID0gcGNhcF9vaWRfZ2V0X3JlcXVlc3RfZGVhZDsKKwlwLT5vaWRfc2V0X3JlcXVlc3Rfb3AgPSBwY2FwX29pZF9zZXRfcmVxdWVzdF9kZWFkOworCXAtPnNlbmRxdWV1ZV90cmFuc21pdF9vcCA9IHBjYXBfc2VuZHF1ZXVlX3RyYW5zbWl0X2RlYWQ7CisJcC0+c2V0dXNlcmJ1ZmZlcl9vcCA9IHBjYXBfc2V0dXNlcmJ1ZmZlcl9kZWFkOworCXAtPmxpdmVfZHVtcF9vcCA9IHBjYXBfbGl2ZV9kdW1wX2RlYWQ7CisJcC0+bGl2ZV9kdW1wX2VuZGVkX29wID0gcGNhcF9saXZlX2R1bXBfZW5kZWRfZGVhZDsKKwlwLT5nZXRfYWlycGNhcF9oYW5kbGVfb3AgPSBwY2FwX2dldF9haXJwY2FwX2hhbmRsZV9kZWFkOwogI2VuZGlmCiAJcC0+Y2xlYW51cF9vcCA9IHBjYXBfY2xlYW51cF9kZWFkOwogCkBAIC0xODg0LDggKzIwOTksOCBAQAogdm9pZAogcGNhcF9jbG9zZShwY2FwX3QgKnApCiB7Ci0JaWYgKHAtPm9wdC5zb3VyY2UgIT0gTlVMTCkKLQkJZnJlZShwLT5vcHQuc291cmNlKTsKKwlpZiAocC0+b3B0LmRldmljZSAhPSBOVUxMKQorCQlmcmVlKHAtPm9wdC5kZXZpY2UpOwogCXAtPmNsZWFudXBfb3AocCk7CiAJZnJlZShwKTsKIH0KQEAgLTE5MDgsMzcgKzIxMjMsMzAgQEAKIAkJcmV0dXJuICgwKTsKIH0KIAotLyoKLSAqIFdlIG1ha2UgdGhlIHZlcnNpb24gc3RyaW5nIHN0YXRpYywgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQsIHJhdGhlcgotICogdGhhbiBleHBvcnRpbmcgdGhlIHZlcnNpb24gc3RyaW5nIGRpcmVjdGx5LiAgT24gYXQgbGVhc3Qgc29tZSBVTklYZXMsCi0gKiBpZiB5b3UgaW1wb3J0IGRhdGEgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5IGludG8gYW4gcHJvZ3JhbSwgdGhlIGRhdGEgaXMKLSAqIGJvdW5kIGludG8gdGhlIHByb2dyYW0gYmluYXJ5LCBzbyBpZiB0aGUgc3RyaW5nIGluIHRoZSB2ZXJzaW9uIG9mIHRoZQotICogbGlicmFyeSB3aXRoIHdoaWNoIHRoZSBwcm9ncmFtIHdhcyBsaW5rZWQgaXNuJ3QgdGhlIHNhbWUgYXMgdGhlCi0gKiBzdHJpbmcgaW4gdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgd2l0aCB3aGljaCB0aGUgcHJvZ3JhbSBpcyBiZWluZwotICogcnVuLCB2YXJpb3VzIHVuZGVzaXJhYmxlIHRoaW5ncyBtYXkgaGFwcGVuICh3YXJuaW5ncywgdGhlIHN0cmluZwotICogYmVpbmcgdGhlIG9uZSBmcm9tIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHdpdGggd2hpY2ggdGhlIHByb2dyYW0KLSAqIHdhcyBsaW5rZWQsIG9yIGV2ZW4gd2VpcmRlciB0aGluZ3MsIHN1Y2ggYXMgdGhlIHN0cmluZyBiZWluZyB0aGUgb25lCi0gKiBmcm9tIHRoZSBsaWJyYXJ5IGJ1dCBiZWluZyB0cnVuY2F0ZWQpLgotICovCi0jaWZkZWYgSEFWRV9WRVJTSU9OX0gKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgcGNhcF92ZXJzaW9uX3N0cmluZ1tdID0gImxpYnBjYXAgdmVyc2lvbiAxLngueSI7Ci0jZW5kaWYKKyNpbmNsdWRlICJwY2FwX3ZlcnNpb24uaCIKIAotI2lmZGVmIFdJTjMyCi0vKgotICogWFhYIC0gaXQnZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHNvbWVob3cgZ2VuZXJhdGUgdGhlIFdpblBjYXAgYW5kIGxpYnBjYXAKLSAqIHZlcnNpb24gbnVtYmVycyB3aGVuIGJ1aWxkaW5nIFdpblBjYXAuICAoSXQnZCBiZSBuaWNlIHRvIGRvIHNvIGZvcgotICogdGhlIHBhY2tldC5kbGwgdmVyc2lvbiBudW1iZXIgYXMgd2VsbC4pCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyIHdwY2FwX3ZlcnNpb25fc3RyaW5nW10gPSAiNC4wIjsKLXN0YXRpYyBjb25zdCBjaGFyIHBjYXBfdmVyc2lvbl9zdHJpbmdfZm10W10gPQotICAgICJXaW5QY2FwIHZlcnNpb24gJXMsIGJhc2VkIG9uICVzIjsKLXN0YXRpYyBjb25zdCBjaGFyIHBjYXBfdmVyc2lvbl9zdHJpbmdfcGFja2V0X2RsbF9mbXRbXSA9Ci0gICAgIldpblBjYXAgdmVyc2lvbiAlcyAocGFja2V0LmRsbCB2ZXJzaW9uICVzKSwgYmFzZWQgb24gJXMiOworI2lmZGVmIF9XSU4zMgorCiBzdGF0aWMgY2hhciAqZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nOwogCisjaWZkZWYgSEFWRV9WRVJTSU9OX0gKKy8qCisgKiBsaWJwY2FwIGJlaW5nIGJ1aWx0IGZvciBXaW5kb3dzLCBhcyBwYXJ0IG9mIGEgV2luUGNhcC9OcGNhcCBzb3VyY2UKKyAqIHRyZWUuICBJbmNsdWRlIHZlcnNpb24uaCBmcm9tIHRoYXQgc291cmNlIHRyZWUgdG8gZ2V0IHRoZSBXaW5QY2FwL05wY2FwCisgKiB2ZXJzaW9uLgorICoKKyAqIFhYWCAtIGl0J2QgYmUgbmljZSBpZiB3ZSBjb3VsZCBzb21laG93IGdlbmVyYXRlIHRoZSBXaW5QY2FwIHZlcnNpb24gbnVtYmVyCisgKiB3aGVuIGJ1aWxkaW5nIFdpblBjYXAuICAoSXQnZCBiZSBuaWNlIHRvIGRvIHNvIGZvciB0aGUgcGFja2V0LmRsbCB2ZXJzaW9uCisgKiBudW1iZXIgYXMgd2VsbC4pCisgKi8KKyNpbmNsdWRlICIuLi8uLi92ZXJzaW9uLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHdwY2FwX3ZlcnNpb25fc3RyaW5nW10gPSBXSU5QQ0FQX1ZFUl9TVFJJTkc7CitzdGF0aWMgY29uc3QgY2hhciBwY2FwX3ZlcnNpb25fc3RyaW5nX2ZtdFtdID0KKwlXSU5QQ0FQX1BST0RVQ1RfTkFNRSAiIHZlcnNpb24gJXMsIGJhc2VkIG9uICVzIjsKK3N0YXRpYyBjb25zdCBjaGFyIHBjYXBfdmVyc2lvbl9zdHJpbmdfcGFja2V0X2RsbF9mbXRbXSA9CisJV0lOUENBUF9QUk9EVUNUX05BTUUgIiB2ZXJzaW9uICVzIChwYWNrZXQuZGxsIHZlcnNpb24gJXMpLCBiYXNlZCBvbiAlcyI7CisKIGNvbnN0IGNoYXIgKgogcGNhcF9saWJfdmVyc2lvbih2b2lkKQogewpAQCAtMTk2NCw4ICsyMTcyLDEwIEBACiAJCQkgICAgbWFsbG9jKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZ19sZW4pOwogCQkJaWYgKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZyA9PSBOVUxMKQogCQkJCXJldHVybiAoTlVMTCk7Ci0JCQlzcHJpbnRmKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZywKLQkJCSAgICBwY2FwX3ZlcnNpb25fc3RyaW5nX2ZtdCwgd3BjYXBfdmVyc2lvbl9zdHJpbmcsCisJCQlwY2FwX3NucHJpbnRmKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZywKKwkJCSAgICBmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmdfbGVuLAorCQkJICAgIHBjYXBfdmVyc2lvbl9zdHJpbmdfZm10LAorCQkJICAgIHdwY2FwX3ZlcnNpb25fc3RyaW5nLAogCQkJICAgIHBjYXBfdmVyc2lvbl9zdHJpbmcpOwogCQl9IGVsc2UgewogCQkJLyoKQEAgLTE5ODMsMTUgKzIxOTMsNTUgQEAKIAkJCWZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZyA9IG1hbGxvYyhmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmdfbGVuKTsKIAkJCWlmIChmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcgPT0gTlVMTCkKIAkJCQlyZXR1cm4gKE5VTEwpOwotCQkJc3ByaW50ZihmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcsCisJCQlwY2FwX3NucHJpbnRmKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZywKKwkJCSAgICBmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmdfbGVuLAogCQkJICAgIHBjYXBfdmVyc2lvbl9zdHJpbmdfcGFja2V0X2RsbF9mbXQsCi0JCQkgICAgd3BjYXBfdmVyc2lvbl9zdHJpbmcsIHBhY2tldF92ZXJzaW9uX3N0cmluZywKKwkJCSAgICB3cGNhcF92ZXJzaW9uX3N0cmluZywKKwkJCSAgICBwYWNrZXRfdmVyc2lvbl9zdHJpbmcsCiAJCQkgICAgcGNhcF92ZXJzaW9uX3N0cmluZyk7CiAJCX0KIAl9CiAJcmV0dXJuIChmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcpOwogfQogCisjZWxzZSAvKiBIQVZFX1ZFUlNJT05fSCAqLworCisvKgorICogbGlicGNhcCBiZWluZyBidWlsdCBmb3IgV2luZG93cywgbm90IGFzIHBhcnQgb2YgYSBXaW5QY2FwL05wY2FwIHNvdXJjZQorICogdHJlZS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgcGNhcF92ZXJzaW9uX3N0cmluZ19wYWNrZXRfZGxsX2ZtdFtdID0KKwkiJXMgKHBhY2tldC5kbGwgdmVyc2lvbiAlcykiOworY29uc3QgY2hhciAqCitwY2FwX2xpYl92ZXJzaW9uKHZvaWQpCit7CisJY2hhciAqcGFja2V0X3ZlcnNpb25fc3RyaW5nOworCXNpemVfdCBmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmdfbGVuOworCisJaWYgKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZyA9PSBOVUxMKSB7CisJCS8qCisJCSAqIEdlbmVyYXRlIHRoZSB2ZXJzaW9uIHN0cmluZy4gIFJlcG9ydCB0aGUgcGFja2V0LmRsbAorCQkgKiB2ZXJzaW9uLgorCQkgKi8KKwkJcGFja2V0X3ZlcnNpb25fc3RyaW5nID0gUGFja2V0R2V0VmVyc2lvbigpOworCQlmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmdfbGVuID0KKwkJICAgIChzaXplb2YgcGNhcF92ZXJzaW9uX3N0cmluZ19wYWNrZXRfZGxsX2ZtdCAtIDQpICsKKwkJICAgIHN0cmxlbihwY2FwX3ZlcnNpb25fc3RyaW5nKSArCisJCSAgICBzdHJsZW4ocGFja2V0X3ZlcnNpb25fc3RyaW5nKTsKKwkJZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nID0gbWFsbG9jKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZ19sZW4pOworCQlpZiAoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nID09IE5VTEwpCisJCQlyZXR1cm4gKE5VTEwpOworCQlwY2FwX3NucHJpbnRmKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZywKKwkJICAgIGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZ19sZW4sCisJCSAgICBwY2FwX3ZlcnNpb25fc3RyaW5nX3BhY2tldF9kbGxfZm10LAorCQkgICAgcGNhcF92ZXJzaW9uX3N0cmluZywKKwkJICAgIHBhY2tldF92ZXJzaW9uX3N0cmluZyk7CisJfQorCXJldHVybiAoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nKTsKK30KKworI2VuZGlmIC8qIEhBVkVfVkVSU0lPTl9IICovCisKICNlbGlmIGRlZmluZWQoTVNET1MpCiAKIHN0YXRpYyBjaGFyICpmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmc7CkBAIC0yMDI3LDMgKzIyNzcsNTEgQEAKIAlyZXR1cm4gKHBjYXBfdmVyc2lvbl9zdHJpbmcpOwogfQogI2VuZGlmCisKKyNpZmRlZiBZWURFQlVHCisvKgorICogU2V0IHRoZSBpbnRlcm5hbCAiZGVidWcgcHJpbnRvdXQiIGZsYWcgZm9yIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiBwYXJzZXIuCisgKiBUaGUgY29kZSB0byBwcmludCB0aGF0IHN0dWZmIGlzIHByZXNlbnQgb25seSBpZiBZWURFQlVHIGlzIGRlZmluZWQsIHNvCisgKiB0aGUgZmxhZywgYW5kIHRoZSByb3V0aW5lIHRvIHNldCBpdCwgYXJlIGRlZmluZWQgb25seSBpZiBZWURFQlVHIGlzCisgKiBkZWZpbmVkLgorICoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgZm9yIGxpYnBjYXAgZGV2ZWxvcGVycywgbm90IGZvciBnZW5lcmFsIHVzZS4KKyAqIElmIHlvdSB3YW50IHRvIHNldCB0aGVzZSBpbiBhIHByb2dyYW0sIHlvdSdsbCBoYXZlIHRvIGRlY2xhcmUgdGhpcworICogcm91dGluZSB5b3Vyc2VsZiwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgRExMIGltcG9ydCBhdHRyaWJ1dGUgb24gV2luZG93czsKKyAqIGl0J3Mgbm90IGRlY2xhcmVkIGluIGFueSBoZWFkZXIgZmlsZSwgYW5kIHdvbid0IGJlIGRlY2xhcmVkIGluIGFueQorICogaGVhZGVyIGZpbGUgcHJvdmlkZWQgYnkgbGlicGNhcC4KKyAqLworUENBUF9BUEkgdm9pZCBwY2FwX3NldF9wYXJzZXJfZGVidWcoaW50IHZhbHVlKTsKKworUENBUF9BUElfREVGIHZvaWQKK3BjYXBfc2V0X3BhcnNlcl9kZWJ1ZyhpbnQgdmFsdWUpCit7CisJZXh0ZXJuIGludCBwY2FwX2RlYnVnOworCisJcGNhcF9kZWJ1ZyA9IHZhbHVlOworfQorI2VuZGlmCisKKyNpZmRlZiBCREVCVUcKKy8qCisgKiBTZXQgdGhlIGludGVybmFsICJkZWJ1ZyBwcmludG91dCIgZmxhZyBmb3IgdGhlIGZpbHRlciBleHByZXNzaW9uIG9wdGltaXplci4KKyAqIFRoZSBjb2RlIHRvIHByaW50IHRoYXQgc3R1ZmYgaXMgcHJlc2VudCBvbmx5IGlmIEJERUJVRyBpcyBkZWZpbmVkLCBzbworICogdGhlIGZsYWcsIGFuZCB0aGUgcm91dGluZSB0byBzZXQgaXQsIGFyZSBkZWZpbmVkIG9ubHkgaWYgQkRFQlVHIGlzCisgKiBkZWZpbmVkLgorICoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgZm9yIGxpYnBjYXAgZGV2ZWxvcGVycywgbm90IGZvciBnZW5lcmFsIHVzZS4KKyAqIElmIHlvdSB3YW50IHRvIHNldCB0aGVzZSBpbiBhIHByb2dyYW0sIHlvdSdsbCBoYXZlIHRvIGRlY2xhcmUgdGhpcworICogcm91dGluZSB5b3Vyc2VsZiwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgRExMIGltcG9ydCBhdHRyaWJ1dGUgb24gV2luZG93czsKKyAqIGl0J3Mgbm90IGRlY2xhcmVkIGluIGFueSBoZWFkZXIgZmlsZSwgYW5kIHdvbid0IGJlIGRlY2xhcmVkIGluIGFueQorICogaGVhZGVyIGZpbGUgcHJvdmlkZWQgYnkgbGlicGNhcC4KKyAqLworUENBUF9BUEkgdm9pZCBwY2FwX3NldF9vcHRpbWl6ZXJfZGVidWcoaW50IHZhbHVlKTsKKworUENBUF9BUElfREVGIHZvaWQKK3BjYXBfc2V0X29wdGltaXplcl9kZWJ1ZyhpbnQgdmFsdWUpCit7CisJZXh0ZXJuIGludCBwY2FwX29wdGltaXplcl9kZWJ1ZzsKKworCXBjYXBfb3B0aW1pemVyX2RlYnVnID0gdmFsdWU7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3BjYXAvYmx1ZXRvb3RoLmggYi9wY2FwL2JsdWV0b290aC5oCmluZGV4IDAxYmQ1YTIuLmM1ZjM3OGEgMTAwNjQ0Ci0tLSBhL3BjYXAvYmx1ZXRvb3RoLmgKKysrIGIvcGNhcC9ibHVldG9vdGguaApAQCAtMzEsOCArMzEsOCBAQAogICogQnkgUGFvbG8gQWJlbmkgPHBhb2xvLmFiZW5pQGVtYWlsLml0PgogICovCiAKLSNpZm5kZWYgX1BDQVBfQkxVRVRPT1RIX1NUUlVDVFNfSF9fCi0jZGVmaW5lIF9QQ0FQX0JMVUVUT09USF9TVFJVQ1RTX0hfXworI2lmbmRlZiBsaWJfcGNhcF9ibHVldG9vdGhfaAorI2RlZmluZSBsaWJfcGNhcF9ibHVldG9vdGhfaAogCiAvKgogICogSGVhZGVyIHByZXBlbmRlZCBsaWJwY2FwIHRvIGVhY2ggYmx1ZXRvb3RoIGg0IGZyYW1lLApkaWZmIC0tZ2l0IGEvcGNhcC9icGYuaCBiL3BjYXAvYnBmLmgKaW5kZXggNjZiN2EyNy4uNzhhZDg5MCAxMDA2NDQKLS0tIGEvcGNhcC9icGYuaAorKysgYi9wY2FwL2JwZi5oCkBAIC03Miw2ICs3Miw4IEBACiAjaWYgIWRlZmluZWQoX05FVF9CUEZfSF8pICYmICFkZWZpbmVkKF9ORVRfQlBGX0hfSU5DTFVERUQpICYmICFkZWZpbmVkKF9CUEZfSF8pICYmICFkZWZpbmVkKF9IX0JQRikgJiYgIWRlZmluZWQobGliX3BjYXBfYnBmX2gpCiAjZGVmaW5lIGxpYl9wY2FwX2JwZl9oCiAKKyNpbmNsdWRlIDxwY2FwL2V4cG9ydC1kZWZzLmg+CisKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKQEAgLTEwOCwxMjQzICsxMTAsNyBAQAogCXN0cnVjdCBicGZfaW5zbiAqYmZfaW5zbnM7CiB9OwogCi0vKgotICogTGluay1sYXllciBoZWFkZXIgdHlwZSBjb2Rlcy4KLSAqCi0gKiBEbyAqTk9UKiBhZGQgbmV3IHZhbHVlcyB0byB0aGlzIGxpc3Qgd2l0aG91dCBhc2tpbmcKLSAqICJ0Y3BkdW1wLXdvcmtlcnNAbGlzdHMudGNwZHVtcC5vcmciIGZvciBhIHZhbHVlLiAgT3RoZXJ3aXNlLCB5b3UgcnVuCi0gKiB0aGUgcmlzayBvZiB1c2luZyBhIHZhbHVlIHRoYXQncyBhbHJlYWR5IGJlaW5nIHVzZWQgZm9yIHNvbWUgb3RoZXIKLSAqIHB1cnBvc2UsIGFuZCBvZiBoYXZpbmcgdG9vbHMgdGhhdCByZWFkIGxpYnBjYXAtZm9ybWF0IGNhcHR1cmVzIG5vdAotICogYmVpbmcgYWJsZSB0byBoYW5kbGUgY2FwdHVyZXMgd2l0aCB5b3VyIG5ldyBETFRfIHZhbHVlLCB3aXRoIG5vIGhvcGUKLSAqIHRoYXQgdGhleSB3aWxsIGV2ZXIgYmUgY2hhbmdlZCB0byBkbyBzbyAoYXMgdGhhdCB3b3VsZCBkZXN0cm95IHRoZWlyCi0gKiBhYmlsaXR5IHRvIHJlYWQgY2FwdHVyZXMgdXNpbmcgdGhhdCB2YWx1ZSBmb3IgdGhhdCBvdGhlciBwdXJwb3NlKS4KLSAqCi0gKiBTZWUKLSAqCi0gKglodHRwOi8vd3d3LnRjcGR1bXAub3JnL2xpbmt0eXBlcy5odG1sCi0gKgotICogZm9yIGRldGFpbGVkIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZXNlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzLgotICovCi0KLS8qCi0gKiBUaGVzZSBhcmUgdGhlIHR5cGVzIHRoYXQgYXJlIHRoZSBzYW1lIG9uIGFsbCBwbGF0Zm9ybXMsIGFuZCB0aGF0Ci0gKiBoYXZlIGJlZW4gZGVmaW5lZCBieSA8bmV0L2JwZi5oPiBmb3IgYWdlcy4KLSAqLwotI2RlZmluZSBETFRfTlVMTAkwCS8qIEJTRCBsb29wYmFjayBlbmNhcHN1bGF0aW9uICovCi0jZGVmaW5lIERMVF9FTjEwTUIJMQkvKiBFdGhlcm5ldCAoMTBNYikgKi8KLSNkZWZpbmUgRExUX0VOM01CCTIJLyogRXhwZXJpbWVudGFsIEV0aGVybmV0ICgzTWIpICovCi0jZGVmaW5lIERMVF9BWDI1CTMJLyogQW1hdGV1ciBSYWRpbyBBWC4yNSAqLwotI2RlZmluZSBETFRfUFJPTkVUCTQJLyogUHJvdGVvbiBQcm9ORVQgVG9rZW4gUmluZyAqLwotI2RlZmluZSBETFRfQ0hBT1MJNQkvKiBDaGFvcyAqLwotI2RlZmluZSBETFRfSUVFRTgwMgk2CS8qIDgwMi41IFRva2VuIFJpbmcgKi8KLSNkZWZpbmUgRExUX0FSQ05FVAk3CS8qIEFSQ05FVCwgd2l0aCBCU0Qtc3R5bGUgaGVhZGVyICovCi0jZGVmaW5lIERMVF9TTElQCTgJLyogU2VyaWFsIExpbmUgSVAgKi8KLSNkZWZpbmUgRExUX1BQUAkJOQkvKiBQb2ludC10by1wb2ludCBQcm90b2NvbCAqLwotI2RlZmluZSBETFRfRkRESQkxMAkvKiBGRERJICovCi0KLS8qCi0gKiBUaGVzZSBhcmUgdHlwZXMgdGhhdCBhcmUgZGlmZmVyZW50IG9uIHNvbWUgcGxhdGZvcm1zLCBhbmQgdGhhdAotICogaGF2ZSBiZWVuIGRlZmluZWQgYnkgPG5ldC9icGYuaD4gZm9yIGFnZXMuICBXZSB1c2UgI2lmZGVmcyB0bwotICogZGV0ZWN0IHRoZSBCU0RzIHRoYXQgZGVmaW5lIHRoZW0gZGlmZmVyZW50bHkgZnJvbSB0aGUgdHJhZGl0aW9uYWwKLSAqIGxpYnBjYXAgPG5ldC9icGYuaD4KLSAqCi0gKiBYWFggLSBETFRfQVRNX1JGQzE0ODMgaXMgMTMgaW4gQlNEL09TLCBhbmQgRExUX1JBVyBpcyAxNCBpbiBCU0QvT1MsCi0gKiBidXQgSSBkb24ndCBrbm93IHdoYXQgdGhlIHJpZ2h0ICNkZWZpbmUgaXMgZm9yIEJTRC9PUy4KLSAqLwotI2RlZmluZSBETFRfQVRNX1JGQzE0ODMJMTEJLyogTExDLWVuY2Fwc3VsYXRlZCBBVE0gKi8KLQotI2lmZGVmIF9fT3BlbkJTRF9fCi0jZGVmaW5lIERMVF9SQVcJCTE0CS8qIHJhdyBJUCAqLwotI2Vsc2UKLSNkZWZpbmUgRExUX1JBVwkJMTIJLyogcmF3IElQICovCi0jZW5kaWYKLQotLyoKLSAqIEdpdmVuIHRoYXQgdGhlIG9ubHkgT1MgdGhhdCBjdXJyZW50bHkgZ2VuZXJhdGVzIEJTRC9PUyBTTElQIG9yIFBQUAotICogaXMsIHdlbGwsIEJTRC9PUywgYXJndWFibHkgZXZlcnlib2R5IHNob3VsZCBoYXZlIGNob3NlbiBpdHMgdmFsdWVzCi0gKiBmb3IgRExUX1NMSVBfQlNET1MgYW5kIERMVF9QUFBfQlNET1MsIHdoaWNoIGFyZSAxNSBhbmQgMTYsIGJ1dCB0aGV5Ci0gKiBkaWRuJ3QuICBTbyBpdCBnb2VzLgotICovCi0jaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotI2lmbmRlZiBETFRfU0xJUF9CU0RPUwotI2RlZmluZSBETFRfU0xJUF9CU0RPUwkxMwkvKiBCU0QvT1MgU2VyaWFsIExpbmUgSVAgKi8KLSNkZWZpbmUgRExUX1BQUF9CU0RPUwkxNAkvKiBCU0QvT1MgUG9pbnQtdG8tcG9pbnQgUHJvdG9jb2wgKi8KLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgRExUX1NMSVBfQlNET1MJMTUJLyogQlNEL09TIFNlcmlhbCBMaW5lIElQICovCi0jZGVmaW5lIERMVF9QUFBfQlNET1MJMTYJLyogQlNEL09TIFBvaW50LXRvLXBvaW50IFByb3RvY29sICovCi0jZW5kaWYKLQotLyoKLSAqIDE3IHdhcyB1c2VkIGZvciBETFRfUEZMT0cgaW4gT3BlbkJTRDsgaXQgbm8gbG9uZ2VyIGlzLgotICoKLSAqIEl0IHdhcyBETFRfTEFORTgwMjMgaW4gU3VTRSA2LjMsIHNvIHdlIGRlZmluZWQgTElOS1RZUEVfUEZMT0cKLSAqIGFzIDExNyBzbyB0aGF0IHBmbG9nIGNhcHR1cmVzIHdvdWxkIHVzZSBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUKLSAqIHZhbHVlIHRoYXQgZGlkbid0IGNvbGxpZGUgd2l0aCBhbnkgb3RoZXIgdmFsdWVzLiAgT24gYWxsCi0gKiBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBPcGVuQlNELCB3ZSBkZWZpbmVkIERMVF9QRkxPRyBhcyAxMTcsCi0gKiBhbmQgd2UgbWFwcGVkIGJldHdlZW4gTElOS1RZUEVfUEZMT0cgYW5kIERMVF9QRkxPRy4KLSAqCi0gKiBPcGVuQlNEIGV2ZW50dWFsbHkgc3dpdGNoZWQgdG8gdXNpbmcgMTE3IGZvciBETFRfUEZMT0cgYXMgd2VsbC4KLSAqCi0gKiBEb24ndCB1c2UgMTcgZm9yIGFueXRoaW5nIGVsc2UuCi0gKi8KLQotLyoKLSAqIDE4IGlzIHVzZWQgZm9yIERMVF9QRlNZTkMgaW4gT3BlbkJTRCwgTmV0QlNELCBEcmFnb25GbHkgQlNEIGFuZAotICogTWFjIE9TIFg7IGRvbid0IHVzZSBpdCBmb3IgYW55dGhpbmcgZWxzZS4gIChGcmVlQlNEIHVzZXMgMTIxLAotICogd2hpY2ggY29sbGlkZXMgd2l0aCBETFRfSEhETEMsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgdXNlIDE4Ci0gKiBmb3IgYW55dGhpbmcgYW5kIGRvZXNuJ3QgYXBwZWFyIHRvIGhhdmUgZXZlciB1c2VkIGl0IGZvciBhbnl0aGluZy4pCi0gKgotICogV2UgZGVmaW5lIGl0IGFzIDE4IG9uIHRob3NlIHBsYXRmb3JtczsgaXQgaXMsIHVuZm9ydHVuYXRlbHksIHVzZWQKLSAqIGZvciBETFRfQ0lQIGluIFN1c2UgNi4zLCBzbyB3ZSBkb24ndCBkZWZpbmUgaXQgYXMgRExUX1BGU1lOQwotICogaW4gZ2VuZXJhbC4gIEFzIHRoZSBwYWNrZXQgZm9ybWF0IGZvciBpdCwgbGlrZSB0aGF0IGZvcgotICogRExUX1BGTE9HLCBpcyBub3Qgb25seSBPUy1kZXBlbmRlbnQgYnV0IE9TLXZlcnNpb24tZGVwZW5kZW50LAotICogd2UgZG9uJ3Qgc3VwcG9ydCBwcmludGluZyBpdCBpbiB0Y3BkdW1wIGV4Y2VwdCBvbiBPU2VzIHRoYXQKLSAqIGhhdmUgdGhlIHJlbGV2YW50IGhlYWRlciBmaWxlcywgc28gaXQncyBub3QgdGhhdCB1c2VmdWwgb24KLSAqIG90aGVyIHBsYXRmb3Jtcy4KLSAqLwotI2lmIGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0RyYWdvbkZseV9fKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKLSNkZWZpbmUgRExUX1BGU1lOQwkxOAotI2VuZGlmCi0KLSNkZWZpbmUgRExUX0FUTV9DTElQCTE5CS8qIExpbnV4IENsYXNzaWNhbC1JUCBvdmVyIEFUTSAqLwotCi0vKgotICogQXBwYXJlbnRseSBSZWRiYWNrIHVzZXMgdGhpcyBmb3IgaXRzIFNtYXJ0RWRnZSA0MDAvODAwLiAgSSBob3BlCi0gKiBub2JvZHkgZWxzZSBkZWNpZGVkIHRvIHVzZSBpdCwgdG9vLgotICovCi0jZGVmaW5lIERMVF9SRURCQUNLX1NNQVJURURHRQkzMgotCi0vKgotICogVGhlc2UgdmFsdWVzIGFyZSBkZWZpbmVkIGJ5IE5ldEJTRDsgb3RoZXIgcGxhdGZvcm1zIHNob3VsZCByZWZyYWluIGZyb20KLSAqIHVzaW5nIHRoZW0gZm9yIG90aGVyIHB1cnBvc2VzLCBzbyB0aGF0IE5ldEJTRCBzYXZlZmlsZXMgd2l0aCBsaW5rCi0gKiB0eXBlcyBvZiA1MCBvciA1MSBjYW4gYmUgcmVhZCBhcyB0aGlzIHR5cGUgb24gYWxsIHBsYXRmb3Jtcy4KLSAqLwotI2RlZmluZSBETFRfUFBQX1NFUklBTAk1MAkvKiBQUFAgb3ZlciBzZXJpYWwgd2l0aCBIRExDIGVuY2Fwc3VsYXRpb24gKi8KLSNkZWZpbmUgRExUX1BQUF9FVEhFUgk1MQkvKiBQUFAgb3ZlciBFdGhlcm5ldCAqLwotCi0vKgotICogVGhlIEF4ZW50IFJhcHRvciBmaXJld2FsbCAtIG5vdyB0aGUgU3ltYW50ZWMgRW50ZXJwcmlzZSBGaXJld2FsbCAtIHVzZXMKLSAqIGEgbGluay1sYXllciB0eXBlIG9mIDk5IGZvciB0aGUgdGNwZHVtcCBpdCBzdXBwbGllcy4gIFRoZSBsaW5rLWxheWVyCi0gKiBoZWFkZXIgaGFzIDYgYnl0ZXMgb2YgdW5rbm93biBkYXRhLCBzb21ldGhpbmcgdGhhdCBhcHBlYXJzIHRvIGJlIGFuCi0gKiBFdGhlcm5ldCB0eXBlLCBhbmQgMzYgYnl0ZXMgdGhhdCBhcHBlYXIgdG8gYmUgMCBpbiBhdCBsZWFzdCBvbmUgY2FwdHVyZQotICogSSd2ZSBzZWVuLgotICovCi0jZGVmaW5lIERMVF9TWU1BTlRFQ19GSVJFV0FMTAk5OQotCi0vKgotICogVmFsdWVzIGJldHdlZW4gMTAwIGFuZCAxMDMgYXJlIHVzZWQgaW4gY2FwdHVyZSBmaWxlIGhlYWRlcnMgYXMKLSAqIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgTElOS1RZUEVfIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIERMVF8gdHlwZXMKLSAqIHRoYXQgZGlmZmVyIGJldHdlZW4gcGxhdGZvcm1zOyBkb24ndCB1c2UgdGhvc2UgdmFsdWVzIGZvciBuZXcgRExUXwotICogbmV3IHR5cGVzLgotICovCi0KLS8qCi0gKiBWYWx1ZXMgc3RhcnRpbmcgd2l0aCAxMDQgYXJlIHVzZWQgZm9yIG5ld2x5LWFzc2lnbmVkIGxpbmstbGF5ZXIKLSAqIGhlYWRlciB0eXBlIHZhbHVlczsgZm9yIHRob3NlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzLCB0aGUgRExUXwotICogdmFsdWUgcmV0dXJuZWQgYnkgcGNhcF9kYXRhbGluaygpIGFuZCBwYXNzZWQgdG8gcGNhcF9vcGVuX2RlYWQoKSwKLSAqIGFuZCB0aGUgTElOS1RZUEVfIHZhbHVlIHRoYXQgYXBwZWFycyBpbiBjYXB0dXJlIGZpbGVzLCBhcmUgdGhlCi0gKiBzYW1lLgotICoKLSAqIERMVF9NQVRDSElOR19NSU4gaXMgdGhlIGxvd2VzdCBzdWNoIHZhbHVlOyBETFRfTUFUQ0hJTkdfTUFYIGlzCi0gKiB0aGUgaGlnaGVzdCBzdWNoIHZhbHVlLgotICovCi0jZGVmaW5lIERMVF9NQVRDSElOR19NSU4JMTA0Ci0KLS8qCi0gKiBUaGlzIHZhbHVlIHdhcyBkZWZpbmVkIGJ5IGxpYnBjYXAgMC41OyBwbGF0Zm9ybXMgdGhhdCBoYXZlIGRlZmluZWQKLSAqIGl0IHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgc2hvdWxkIGRlZmluZSBpdCBoZXJlIHdpdGggdGhhdCB2YWx1ZSAtCi0gKiBhIGxpbmsgdHlwZSBvZiAxMDQgaW4gYSBzYXZlIGZpbGUgd2lsbCBiZSBtYXBwZWQgdG8gRExUX0NfSERMQywKLSAqIHdoYXRldmVyIHZhbHVlIHRoYXQgaGFwcGVucyB0byBiZSwgc28gcHJvZ3JhbXMgd2lsbCBjb3JyZWN0bHkKLSAqIGhhbmRsZSBmaWxlcyB3aXRoIHRoYXQgbGluayB0eXBlIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mCi0gKiBETFRfQ19IRExDLgotICoKLSAqIFRoZSBuYW1lIERMVF9DX0hETEMgd2FzIHVzZWQgYnkgQlNEL09TOyB3ZSB1c2UgdGhhdCBuYW1lIGZvciBzb3VyY2UKLSAqIGNvbXBhdGliaWxpdHkgd2l0aCBwcm9ncmFtcyB3cml0dGVuIGZvciBCU0QvT1MuCi0gKgotICogbGlicGNhcCAwLjUgZGVmaW5lZCBpdCBhcyBETFRfQ0hETEM7IHdlIGRlZmluZSBETFRfQ0hETEMgYXMgd2VsbCwKLSAqIGZvciBzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIHByb2dyYW1zIHdyaXR0ZW4gZm9yIGxpYnBjYXAgMC41LgotICovCi0jZGVmaW5lIERMVF9DX0hETEMJMTA0CS8qIENpc2NvIEhETEMgKi8KLSNkZWZpbmUgRExUX0NIRExDCURMVF9DX0hETEMKLQotI2RlZmluZSBETFRfSUVFRTgwMl8xMQkxMDUJLyogSUVFRSA4MDIuMTEgd2lyZWxlc3MgKi8KLQotLyoKLSAqIDEwNiBpcyByZXNlcnZlZCBmb3IgTGludXggQ2xhc3NpY2FsIElQIG92ZXIgQVRNOyBpdCdzIGxpa2UgRExUX1JBVywKLSAqIGV4Y2VwdCB3aGVuIGl0IGlzbid0LiAgKEkuZS4sIHNvbWV0aW1lcyBpdCdzIGp1c3QgcmF3IElQLCBhbmQKLSAqIHNvbWV0aW1lcyBpdCBpc24ndC4pICBXZSBjdXJyZW50bHkgaGFuZGxlIGl0IGFzIERMVF9MSU5VWF9TTEwsCi0gKiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLikKLSAqLwotCi0vKgotICogRnJhbWUgUmVsYXk7IEJTRC9PUyBoYXMgYSBETFRfRlIgd2l0aCBhIHZhbHVlIG9mIDExLCBidXQgdGhhdCBjb2xsaWRlcwotICogd2l0aCBvdGhlciB2YWx1ZXMuCi0gKiBETFRfRlIgYW5kIERMVF9GUkVMQVkgcGFja2V0cyBzdGFydCB3aXRoIHRoZSBRLjkyMiBGcmFtZSBSZWxheSBoZWFkZXIKLSAqIChETENJLCBldGMuKS4KLSAqLwotI2RlZmluZSBETFRfRlJFTEFZCTEwNwotCi0vKgotICogT3BlbkJTRCBETFRfTE9PUCwgZm9yIGxvb3BiYWNrIGRldmljZXM7IGl0J3MgbGlrZSBETFRfTlVMTCwgZXhjZXB0Ci0gKiB0aGF0IHRoZSBBRl8gdHlwZSBpbiB0aGUgbGluay1sYXllciBoZWFkZXIgaXMgaW4gbmV0d29yayBieXRlIG9yZGVyLgotICoKLSAqIERMVF9MT09QIGlzIDEyIGluIE9wZW5CU0QsIGJ1dCB0aGF0J3MgRExUX1JBVyBpbiBvdGhlciBPU2VzLCBzbwotICogd2UgZG9uJ3QgdXNlIDEyIGZvciBpdCBpbiBPU2VzIG90aGVyIHRoYW4gT3BlbkJTRC4KLSAqLwotI2lmZGVmIF9fT3BlbkJTRF9fCi0jZGVmaW5lIERMVF9MT09QCTEyCi0jZWxzZQotI2RlZmluZSBETFRfTE9PUAkxMDgKLSNlbmRpZgotCi0vKgotICogRW5jYXBzdWxhdGVkIHBhY2tldHMgZm9yIElQc2VjOyBETFRfRU5DIGlzIDEzIGluIE9wZW5CU0QsIGJ1dCB0aGF0J3MKLSAqIERMVF9TTElQX0JTRE9TIGluIE5ldEJTRCwgc28gd2UgZG9uJ3QgdXNlIDEzIGZvciBpdCBpbiBPU2VzIG90aGVyCi0gKiB0aGFuIE9wZW5CU0QuCi0gKi8KLSNpZmRlZiBfX09wZW5CU0RfXwotI2RlZmluZSBETFRfRU5DCQkxMwotI2Vsc2UKLSNkZWZpbmUgRExUX0VOQwkJMTA5Ci0jZW5kaWYKLQotLyoKLSAqIFZhbHVlcyBiZXR3ZWVuIDExMCBhbmQgMTEyIGFyZSByZXNlcnZlZCBmb3IgdXNlIGluIGNhcHR1cmUgZmlsZSBoZWFkZXJzCi0gKiBhcyBsaW5rLWxheWVyIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gRExUXyB0eXBlcyB0aGF0IG1pZ2h0IGRpZmZlcgotICogYmV0d2VlbiBwbGF0Zm9ybXM7IGRvbid0IHVzZSB0aG9zZSB2YWx1ZXMgZm9yIG5ldyBETFRfIHR5cGVzCi0gKiBvdGhlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIERMVF8gdHlwZXMuCi0gKi8KLQotLyoKLSAqIFRoaXMgaXMgZm9yIExpbnV4IGNvb2tlZCBzb2NrZXRzLgotICovCi0jZGVmaW5lIERMVF9MSU5VWF9TTEwJMTEzCi0KLS8qCi0gKiBBcHBsZSBMb2NhbFRhbGsgaGFyZHdhcmUuCi0gKi8KLSNkZWZpbmUgRExUX0xUQUxLCTExNAotCi0vKgotICogQWNvcm4gRWNvbmV0LgotICovCi0jZGVmaW5lIERMVF9FQ09ORVQJMTE1Ci0KLS8qCi0gKiBSZXNlcnZlZCBmb3IgdXNlIHdpdGggT3BlbkJTRCBpcGZpbHRlci4KLSAqLwotI2RlZmluZSBETFRfSVBGSUxURVIJMTE2Ci0KLS8qCi0gKiBPcGVuQlNEIERMVF9QRkxPRy4KLSAqLwotI2RlZmluZSBETFRfUEZMT0cJMTE3Ci0KLS8qCi0gKiBSZWdpc3RlcmVkIGZvciBDaXNjby1pbnRlcm5hbCB1c2UuCi0gKi8KLSNkZWZpbmUgRExUX0NJU0NPX0lPUwkxMTgKLQotLyoKLSAqIEZvciA4MDIuMTEgY2FyZHMgdXNpbmcgdGhlIFByaXNtIElJIGNoaXBzLCB3aXRoIGEgbGluay1sYXllcgotICogaGVhZGVyIGluY2x1ZGluZyBQcmlzbSBtb25pdG9yIG1vZGUgaW5mb3JtYXRpb24gcGx1cyBhbiA4MDIuMTEKLSAqIGhlYWRlci4KLSAqLwotI2RlZmluZSBETFRfUFJJU01fSEVBREVSCTExOQotCi0vKgotICogUmVzZXJ2ZWQgZm9yIEFpcm9uZXQgODAyLjExIGNhcmRzLCB3aXRoIGFuIEFpcm9uZXQgbGluay1sYXllciBoZWFkZXIKLSAqIChzZWUgRG91ZyBBbWJyaXNrbydzIEZyZWVCU0QgcGF0Y2hlcykuCi0gKi8KLSNkZWZpbmUgRExUX0FJUk9ORVRfSEVBREVSCTEyMAotCi0vKgotICogU2lnaC4KLSAqCi0gKiBUaGlzIHdhcyByZXNlcnZlZCBmb3IgU2llbWVucyBIaVBhdGggSERMQyBvbiAyMDAyLTAxLTI1LCBhcwotICogcmVxdWVzdGVkIGJ5IFRvbWFzIEt1a29zYS4KLSAqCi0gKiBPbiAyMDA0LTAyLTI1LCBhIEZyZWVCU0QgY2hlY2tpbiB0byBzeXMvbmV0L2JwZi5oIHdhcyBtYWRlIHRoYXQKLSAqIGFzc2lnbmVkIDEyMSBhcyBETFRfUEZTWU5DLiAgSXRzIGxpYnBjYXAgZG9lcyBETFRfIDwtPiBMSU5LVFlQRV8KLSAqIG1hcHBpbmcsIHNvIGl0IHByb2JhYmx5IHN1cHBvcnRzIGNhcHR1cmluZyBvbiB0aGUgcGZzeW5jIGRldmljZQotICogYnV0IG5vdCBzYXZpbmcgdGhlIGNhcHR1cmVkIGRhdGEgdG8gYSBwY2FwIGZpbGUuCi0gKgotICogT3BlbkJTRCwgZnJvbSB3aGljaCBwZiBjYW1lLCBob3dldmVyLCB1c2VzIDE4IGZvciBETFRfUEZTWU5DOwotICogdGhlaXIgbGlicGNhcCBkb2VzIG5vIERMVF8gPC0+IExJTktUWVBFXyBtYXBwaW5nLCBzbyBpdCB3b3VsZAotICogdXNlIDE4IGluIHBjYXAgZmlsZXMgYXMgd2VsbC4KLSAqCi0gKiBOZXRCU0QgYW5kIERyYWdvbkZseSBCU0QgYWxzbyB1c2UgMTggZm9yIERMVF9QRlNZTkM7IHRoZWlyCi0gKiBsaWJwY2FwcyBkbyBETFRfIDwtPiBMSU5LVFlQRV8gbWFwcGluZywgYW5kIG5laXRoZXIgaGFzIGFuIGVudHJ5Ci0gKiBmb3IgRExUX1BGU1lOQywgc28gaXQgbWlnaHQgbm90IGJlIGFibGUgdG8gd3JpdGUgb3V0IGR1bXAgZmlsZXMKLSAqIHdpdGggMTggYXMgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUuICAoRWFybGllciB2ZXJzaW9ucyBtaWdodAotICogbm90IGhhdmUgZG9uZSBtYXBwaW5nLCBpbiB3aGljaCBjYXNlIHRoZXknZCB3b3JrIHRoZSBzYW1lIHdheQotICogT3BlbkJTRCBkb2VzLikKLSAqCi0gKiBNYWMgT1MgWCBkZWZpbmVzIGl0IGFzIDE4LCBidXQgZG9lc24ndCBhcHBlYXIgdG8gdXNlIGl0IGFzIG9mCi0gKiBNYWMgT1MgWCAxMC43LjMuICBJdHMgbGlicGNhcCBkb2VzIERMVF8gPC0+IExJTktUWVBFXyBtYXBwaW5nLgotICoKLSAqIFdlJ2xsIGRlZmluZSBETFRfUEZTWU5DIGFzIDEyMSBvbiBGcmVlQlNEIGFuZCBkZWZpbmUgaXQgYXMgMTggb24KLSAqIGFsbCBvdGhlciBwbGF0Zm9ybXMuICBXZSdsbCBkZWZpbmUgRExUX0hIRExDIGFzIDEyMSBvbiBldmVyeXRoaW5nCi0gKiBleGNlcHQgZm9yIEZyZWVCU0Q7IGFueWJvZHkgd2hvIHdhbnRzIHRvIGNvbXBpbGUsIG9uIEZyZWVCU0QsIGNvZGUKLSAqIHRoYXQgdXNlcyBETFRfSEhETEMgaXMgb3V0IG9mIGx1Y2suCi0gKgotICogV2UnbGwgZGVmaW5lIExJTktUWVBFX1BGU1lOQyBhcyAxOCwgKmV2ZW4gb24gRnJlZUJTRCosIGFuZCBtYXAKLSAqIGl0LCBzbyB0aGF0IHNhdmVmaWxlcyB3b24ndCB1c2UgMTIxIGZvciBQRlNZTkMgLSB0aGV5J2xsIGFsbAotICogdXNlIDE4LiAgQ29kZSB0aGF0IHVzZXMgcGNhcF9kYXRhbGluaygpIHRvIGRldGVybWluZSB0aGUgbGluay1sYXllcgotICogaGVhZGVyIHR5cGUgb2YgYSBzYXZlZmlsZSB3b24ndCwgd2hlbiBidWlsdCBhbmQgcnVuIG9uIEZyZWVCU0QsCi0gKiBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gTElOS1RZUEVfUEZTWU5DIGFuZCBMSU5LVFlQRV9ISERMQwotICogY2FwdHVyZSBmaWxlczsgY29kZSB0aGF0IGRvZXNuJ3QsIHN1Y2ggYXMgdGhlIGNvZGUgaW4gV2lyZXNoYXJrLAotICogd2lsbCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlbS4KLSAqLwotI2lmZGVmIF9fRnJlZUJTRF9fCi0jZGVmaW5lIERMVF9QRlNZTkMJCTEyMQotI2Vsc2UKLSNkZWZpbmUgRExUX0hIRExDCQkxMjEKLSNlbmRpZgotCi0vKgotICogVGhpcyBpcyBmb3IgUkZDIDI2MjUgSVAtb3Zlci1GaWJyZSBDaGFubmVsLgotICoKLSAqIFRoaXMgaXMgbm90IGZvciB1c2Ugd2l0aCByYXcgRmlicmUgQ2hhbm5lbCwgd2hlcmUgdGhlIGxpbmstbGF5ZXIKLSAqIGhlYWRlciBzdGFydHMgd2l0aCBhIEZpYnJlIENoYW5uZWwgZnJhbWUgaGVhZGVyOyBpdCdzIGZvciBJUC1vdmVyLUZDLAotICogd2hlcmUgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHN0YXJ0cyB3aXRoIGFuIFJGQyAyNjI1IE5ldHdvcmtfSGVhZGVyCi0gKiBmaWVsZC4KLSAqLwotI2RlZmluZSBETFRfSVBfT1ZFUl9GQwkJMTIyCi0KLS8qCi0gKiBUaGlzIGlzIGZvciBGdWxsIEZyb250YWwgQVRNIG9uIFNvbGFyaXMgd2l0aCBTdW5BVE0sIHdpdGggYQotICogcHNldWRvLWhlYWRlciBmb2xsb3dlZCBieSBhbiBBQUxuIFBEVS4KLSAqCi0gKiBUaGVyZSBtYXkgYmUgb3RoZXIgZm9ybXMgb2YgRnVsbCBGcm9udGFsIEFUTSBvbiBvdGhlciBPU2VzLAotICogd2l0aCBkaWZmZXJlbnQgcHNldWRvLWhlYWRlcnMuCi0gKgotICogSWYgQVRNIHNvZnR3YXJlIHJldHVybnMgYSBwc2V1ZG8taGVhZGVyIHdpdGggVlBJL1ZDSSBpbmZvcm1hdGlvbgotICogKGFuZCwgaWRlYWxseSwgcGFja2V0IHR5cGUgaW5mb3JtYXRpb24sIGUuZy4gc2lnbmFsbGluZywgSUxNSSwKLSAqIExBTkUsIExMQy1tdWx0aXBsZXhlZCB0cmFmZmljLCBldGMuKSwgaXQgc2hvdWxkIG5vdCB1c2UKLSAqIERMVF9BVE1fUkZDMTQ4MywgYnV0IHNob3VsZCBnZXQgYSBuZXcgRExUXyB2YWx1ZSwgc28gdGNwZHVtcAotICogYW5kIHRoZSBsaWtlIGRvbid0IGhhdmUgdG8gaW5mZXIgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYQotICogcHNldWRvLWhlYWRlciBhbmQgdGhlIGZvcm0gb2YgdGhlIHBzZXVkby1oZWFkZXIuCi0gKi8KLSNkZWZpbmUgRExUX1NVTkFUTQkJMTIzCS8qIFNvbGFyaXMrU3VuQVRNICovCi0KLS8qCi0gKiBSZXNlcnZlZCBhcyBwZXIgcmVxdWVzdCBmcm9tIEtlbnQgRGFobGdyZW4gPGtlbnRAcHJhZXN1bS5jb20+Ci0gKiBmb3IgcHJpdmF0ZSB1c2UuCi0gKi8KLSNkZWZpbmUgRExUX1JJTyAgICAgICAgICAgICAgICAgMTI0ICAgICAvKiBSYXBpZElPICovCi0jZGVmaW5lIERMVF9QQ0lfRVhQICAgICAgICAgICAgIDEyNSAgICAgLyogUENJIEV4cHJlc3MgKi8KLSNkZWZpbmUgRExUX0FVUk9SQSAgICAgICAgICAgICAgMTI2ICAgICAvKiBYaWxpbnggQXVyb3JhIGxpbmsgbGF5ZXIgKi8KLQotLyoKLSAqIEhlYWRlciBmb3IgODAyLjExIHBsdXMgYSBudW1iZXIgb2YgYml0cyBvZiBsaW5rLWxheWVyIGluZm9ybWF0aW9uCi0gKiBpbmNsdWRpbmcgcmFkaW8gaW5mb3JtYXRpb24sIHVzZWQgYnkgc29tZSByZWNlbnQgQlNEIGRyaXZlcnMgYXMKLSAqIHdlbGwgYXMgdGhlIG1hZHdpZmkgQXRoZXJvcyBkcml2ZXIgZm9yIExpbnV4LgotICovCi0jZGVmaW5lIERMVF9JRUVFODAyXzExX1JBRElPCTEyNwkvKiA4MDIuMTEgcGx1cyByYWRpb3RhcCByYWRpbyBoZWFkZXIgKi8KLQotLyoKLSAqIFJlc2VydmVkIGZvciB0aGUgVFpTUCBlbmNhcHN1bGF0aW9uLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBDaHJpcyBXYXRlcnMgPGNocmlzLndhdGVyc0BuZXR3b3JrY2hlbWlzdHJ5LmNvbT4KLSAqIFRaU1AgaXMgYSBnZW5lcmljIGVuY2Fwc3VsYXRpb24gZm9yIGFueSBvdGhlciBsaW5rIHR5cGUsCi0gKiB3aGljaCBpbmNsdWRlcyBhIG1lYW5zIHRvIGluY2x1ZGUgbWV0YS1pbmZvcm1hdGlvbgotICogd2l0aCB0aGUgcGFja2V0LCBlLmcuIHNpZ25hbCBzdHJlbmd0aCBhbmQgY2hhbm5lbAotICogZm9yIDgwMi4xMSBwYWNrZXRzLgotICovCi0jZGVmaW5lIERMVF9UWlNQICAgICAgICAgICAgICAgIDEyOCAgICAgLyogVGF6bWVuIFNuaWZmZXIgUHJvdG9jb2wgKi8KLQotLyoKLSAqIEJTRCdzIEFSQ05FVCBoZWFkZXJzIGhhdmUgdGhlIHNvdXJjZSBob3N0LCBkZXN0aW5hdGlvbiBob3N0LAotICogYW5kIHR5cGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0OyB0aGF0J3Mgd2hhdCdzIGhhbmRlZAotICogdXAgdG8gdXNlcmxhbmQgdmlhIEJQRi4KLSAqCi0gKiBMaW51eCdzIEFSQ05FVCBoZWFkZXJzLCBob3dldmVyLCBoYXZlIGEgMi1ieXRlIG9mZnNldCBmaWVsZAotICogYmV0d2VlbiB0aGUgaG9zdCBJRHMgYW5kIHRoZSB0eXBlOyB0aGF0J3Mgd2hhdCdzIGhhbmRlZCB1cAotICogdG8gdXNlcmxhbmQgdmlhIFBGX1BBQ0tFVCBzb2NrZXRzLgotICoKLSAqIFdlIHRoZXJlZm9yZSBoYXZlIHRvIGhhdmUgc2VwYXJhdGUgRExUXyB2YWx1ZXMgZm9yIHRoZW0uCi0gKi8KLSNkZWZpbmUgRExUX0FSQ05FVF9MSU5VWAkxMjkJLyogQVJDTkVUICovCi0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGVzLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBETFRfcyBhcmUgdXNlZAotICogZm9yIHBhc3Npbmcgb24gY2hhc3Npcy1pbnRlcm5hbCBtZXRhaW5mb3JtYXRpb24gc3VjaCBhcwotICogUU9TIHByb2ZpbGVzLCBldGMuLgotICovCi0jZGVmaW5lIERMVF9KVU5JUEVSX01MUFBQICAgICAgIDEzMAotI2RlZmluZSBETFRfSlVOSVBFUl9NTEZSICAgICAgICAxMzEKLSNkZWZpbmUgRExUX0pVTklQRVJfRVMgICAgICAgICAgMTMyCi0jZGVmaW5lIERMVF9KVU5JUEVSX0dHU04gICAgICAgIDEzMwotI2RlZmluZSBETFRfSlVOSVBFUl9NRlIgICAgICAgICAxMzQKLSNkZWZpbmUgRExUX0pVTklQRVJfQVRNMiAgICAgICAgMTM1Ci0jZGVmaW5lIERMVF9KVU5JUEVSX1NFUlZJQ0VTICAgIDEzNgotI2RlZmluZSBETFRfSlVOSVBFUl9BVE0xICAgICAgICAxMzcKLQotLyoKLSAqIEFwcGxlIElQLW92ZXItSUVFRSAxMzk0LCBhcyBwZXIgYSByZXF1ZXN0IGZyb20gRGlldGVyIFNpZWdtdW5kCi0gKiA8ZGlldGVyQGFwcGxlLmNvbT4uICBUaGUgaGVhZGVyIHRoYXQncyBwcmVzZW50ZWQgaXMgYW4gRXRoZXJuZXQtbGlrZQotICogaGVhZGVyOgotICoKLSAqCSNkZWZpbmUgRklSRVdJUkVfRVVJNjRfTEVOCTgKLSAqCXN0cnVjdCBmaXJld2lyZV9oZWFkZXIgewotICoJCXVfY2hhciAgZmlyZXdpcmVfZGhvc3RbRklSRVdJUkVfRVVJNjRfTEVOXTsKLSAqCQl1X2NoYXIgIGZpcmV3aXJlX3Nob3N0W0ZJUkVXSVJFX0VVSTY0X0xFTl07Ci0gKgkJdV9zaG9ydCBmaXJld2lyZV90eXBlOwotICoJfTsKLSAqCi0gKiB3aXRoICJmaXJld2lyZV90eXBlIiBiZWluZyBhbiBFdGhlcm5ldCB0eXBlIHZhbHVlLCByYXRoZXIgdGhhbiwKLSAqIGZvciBleGFtcGxlLCByYXcgR0FTUCBmcmFtZXMgYmVpbmcgaGFuZGVkIHVwLgotICovCi0jZGVmaW5lIERMVF9BUFBMRV9JUF9PVkVSX0lFRUUxMzk0CTEzOAotCi0vKgotICogVmFyaW91cyBTUzcgZW5jYXBzdWxhdGlvbnMsIGFzIHBlciBhIHJlcXVlc3QgZnJvbSBKZWZmIE1vcnJpc3MKLSAqIDxqZWZmLm1vcnJpc3NbQVRddWx0aWNvbS5jb20+IGFuZCBzdWJzZXF1ZW50IGRpc2N1c3Npb25zLgotICovCi0jZGVmaW5lIERMVF9NVFAyX1dJVEhfUEhEUgkxMzkJLyogcHNldWRvLWhlYWRlciB3aXRoIHZhcmlvdXMgaW5mbywgZm9sbG93ZWQgYnkgTVRQMiAqLwotI2RlZmluZSBETFRfTVRQMgkJMTQwCS8qIE1UUDIsIHdpdGhvdXQgcHNldWRvLWhlYWRlciAqLwotI2RlZmluZSBETFRfTVRQMwkJMTQxCS8qIE1UUDMsIHdpdGhvdXQgcHNldWRvLWhlYWRlciBvciBNVFAyICovCi0jZGVmaW5lIERMVF9TQ0NQCQkxNDIJLyogU0NDUCwgd2l0aG91dCBwc2V1ZG8taGVhZGVyIG9yIE1UUDIgb3IgTVRQMyAqLwotCi0vKgotICogRE9DU0lTIE1BQyBmcmFtZXMuCi0gKi8KLSNkZWZpbmUgRExUX0RPQ1NJUwkJMTQzCi0KLS8qCi0gKiBMaW51eC1JckRBIHBhY2tldHMuIFByb3RvY29sIGRlZmluZWQgYXQgaHR0cDovL3d3dy5pcmRhLm9yZy4KLSAqIFRob3NlIHBhY2tldHMgaW5jbHVkZSBJckxBUCBoZWFkZXJzIGFuZCBhYm92ZSAoSXJMTVAuLi4pLCBidXQKLSAqIGRvbid0IGluY2x1ZGUgUGh5IGZyYW1pbmcgKFNPRi9FT0YvQ1JDICYgYnl0ZSBzdHVmZmluZyksIGJlY2F1c2UgUGh5Ci0gKiBmcmFtaW5nIGNhbiBiZSBoYW5kbGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQgZGVwZW5kIG9uIHRoZSBiaXRyYXRlLgotICogVGhpcyBpcyBleGFjdGx5IHRoZSBmb3JtYXQgeW91IHdvdWxkIGdldCBjYXB0dXJpbmcgb24gYSBMaW51eC1JckRBCi0gKiBpbnRlcmZhY2UgKGlyZGFYKSwgYnV0IG5vdCBvbiBhIHJhdyBzZXJpYWwgcG9ydC4KLSAqIE5vdGUgdGhlIGNhcHR1cmUgaXMgZG9uZSBpbiAiTGludXgtY29va2VkIiBtb2RlLCBzbyBlYWNoIHBhY2tldCBpbmNsdWRlCi0gKiBhIGZha2UgcGFja2V0IGhlYWRlciAoc3RydWN0IHNsbF9oZWFkZXIpLiBUaGlzIGlzIGJlY2F1c2UgSXJEQSBwYWNrZXQKLSAqIGRlY29kaW5nIGlzIGRlcGVuZGFudCBvbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBwYWNrZXQgKGluY29tbWluZyBvcgotICogb3V0Z29pbmcpLgotICogV2hlbi9pZiBvdGhlciBwbGF0Zm9ybSBpbXBsZW1lbnQgSXJEQSBjYXB0dXJlLCB3ZSBtYXkgcmV2aXNpdCB0aGUKLSAqIGlzc3VlIGFuZCBkZWZpbmUgYSByZWFsIERMVF9JUkRBLi4uCi0gKiBKZWFuIElJCi0gKi8KLSNkZWZpbmUgRExUX0xJTlVYX0lSREEJCTE0NAotCi0vKgotICogUmVzZXJ2ZWQgZm9yIElCTSBTUCBzd2l0Y2ggYW5kIElCTSBOZXh0IEZlZGVyYXRpb24gc3dpdGNoLgotICovCi0jZGVmaW5lIERMVF9JQk1fU1AJCTE0NQotI2RlZmluZSBETFRfSUJNX1NOCQkxNDYKLQotLyoKLSAqIFJlc2VydmVkIGZvciBwcml2YXRlIHVzZS4gIElmIHlvdSBoYXZlIHNvbWUgbGluay1sYXllciBoZWFkZXIgdHlwZQotICogdGhhdCB5b3Ugd2FudCB0byB1c2Ugd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLCB3aXRoIHRoZSBjYXB0dXJlIGZpbGVzCi0gKiB1c2luZyB0aGF0IGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgbm90IGV2ZXIgYmUgc2VudCBvdXRzaWRlIHlvdXIKLSAqIG9yZ2FuaXphdGlvbiwgeW91IGNhbiB1c2UgdGhlc2UgdmFsdWVzLgotICoKLSAqIE5vIGxpYnBjYXAgcmVsZWFzZSB3aWxsIHVzZSB0aGVzZSBmb3IgYW55IHB1cnBvc2UsIG5vciB3aWxsIGFueQotICogdGNwZHVtcCByZWxlYXNlIHVzZSB0aGVtLCBlaXRoZXIuCi0gKgotICogRG8gKk5PVCogdXNlIHRoZXNlIGluIGNhcHR1cmUgZmlsZXMgdGhhdCB5b3UgZXhwZWN0IGFueWJvZHkgbm90IHVzaW5nCi0gKiB5b3VyIHByaXZhdGUgdmVyc2lvbnMgb2YgY2FwdHVyZS1maWxlLXJlYWRpbmcgdG9vbHMgdG8gcmVhZDsgaW4KLSAqIHBhcnRpY3VsYXIsIGRvICpOT1QqIHVzZSB0aGVtIGluIHByb2R1Y3RzLCBvdGhlcndpc2UgeW91IG1heSBmaW5kIHRoYXQKLSAqIHBlb3BsZSB3b24ndCBiZSBhYmxlIHRvIHVzZSB0Y3BkdW1wLCBvciBzbm9ydCwgb3IgRXRoZXJlYWwsIG9yLi4uIHRvCi0gKiByZWFkIGNhcHR1cmUgZmlsZXMgZnJvbSB5b3VyIGZpcmV3YWxsL2ludHJ1c2lvbiBkZXRlY3Rpb24vdHJhZmZpYwotICogbW9uaXRvcmluZy9ldGMuIGFwcGxpYW5jZSwgb3Igd2hhdGV2ZXIgcHJvZHVjdCB1c2VzIHRoYXQgRExUXyB2YWx1ZSwKLSAqIGFuZCB5b3UgbWF5IGFsc28gZmluZCB0aGF0IHRoZSBkZXZlbG9wZXJzIG9mIHRob3NlIGFwcGxpY2F0aW9ucyB3aWxsCi0gKiBub3QgYWNjZXB0IHBhdGNoZXMgdG8gbGV0IHRoZW0gcmVhZCB0aG9zZSBmaWxlcy4KLSAqCi0gKiBBbHNvLCBkbyBub3QgdXNlIHRoZW0gaWYgc29tZWJvZHkgbWlnaHQgc2VuZCB5b3UgYSBjYXB0dXJlIHVzaW5nIHRoZW0KLSAqIGZvciAqdGhlaXIqIHByaXZhdGUgdHlwZSBhbmQgdG9vbHMgdXNpbmcgdGhlbSBmb3IgKnlvdXIqIHByaXZhdGUgdHlwZQotICogd291bGQgaGF2ZSB0byByZWFkIHRoZW0uCi0gKgotICogSW5zdGVhZCwgYXNrICJ0Y3BkdW1wLXdvcmtlcnNAbGlzdHMudGNwZHVtcC5vcmciIGZvciBhIG5ldyBETFRfIHZhbHVlLAotICogYXMgcGVyIHRoZSBjb21tZW50IGFib3ZlLCBhbmQgdXNlIHRoZSB0eXBlIHlvdSdyZSBnaXZlbi4KLSAqLwotI2RlZmluZSBETFRfVVNFUjAJCTE0NwotI2RlZmluZSBETFRfVVNFUjEJCTE0OAotI2RlZmluZSBETFRfVVNFUjIJCTE0OQotI2RlZmluZSBETFRfVVNFUjMJCTE1MAotI2RlZmluZSBETFRfVVNFUjQJCTE1MQotI2RlZmluZSBETFRfVVNFUjUJCTE1MgotI2RlZmluZSBETFRfVVNFUjYJCTE1MwotI2RlZmluZSBETFRfVVNFUjcJCTE1NAotI2RlZmluZSBETFRfVVNFUjgJCTE1NQotI2RlZmluZSBETFRfVVNFUjkJCTE1NgotI2RlZmluZSBETFRfVVNFUjEwCQkxNTcKLSNkZWZpbmUgRExUX1VTRVIxMQkJMTU4Ci0jZGVmaW5lIERMVF9VU0VSMTIJCTE1OQotI2RlZmluZSBETFRfVVNFUjEzCQkxNjAKLSNkZWZpbmUgRExUX1VTRVIxNAkJMTYxCi0jZGVmaW5lIERMVF9VU0VSMTUJCTE2MgotCi0vKgotICogRm9yIGZ1dHVyZSB1c2Ugd2l0aCA4MDIuMTEgY2FwdHVyZXMgLSBkZWZpbmVkIGJ5IEFic29sdXRlVmFsdWUKLSAqIFN5c3RlbXMgdG8gc3RvcmUgYSBudW1iZXIgb2YgYml0cyBvZiBsaW5rLWxheWVyIGluZm9ybWF0aW9uCi0gKiBpbmNsdWRpbmcgcmFkaW8gaW5mb3JtYXRpb246Ci0gKgotICoJaHR0cDovL3d3dy5zaGFmdG5ldC5vcmcvfnBpenphL3NvZnR3YXJlL2NhcHR1cmVmcm0udHh0Ci0gKgotICogYnV0IGl0IG1pZ2h0IGJlIHVzZWQgYnkgc29tZSBub24tQVZTIGRyaXZlcnMgbm93IG9yIGluIHRoZQotICogZnV0dXJlLgotICovCi0jZGVmaW5lIERMVF9JRUVFODAyXzExX1JBRElPX0FWUyAxNjMJLyogODAyLjExIHBsdXMgQVZTIHJhZGlvIGhlYWRlciAqLwotCi0vKgotICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBETFRfcyBhcmUgdXNlZAotICogZm9yIHBhc3Npbmcgb24gY2hhc3Npcy1pbnRlcm5hbCBtZXRhaW5mb3JtYXRpb24gc3VjaCBhcwotICogUU9TIHByb2ZpbGVzLCBldGMuLgotICovCi0jZGVmaW5lIERMVF9KVU5JUEVSX01PTklUT1IgICAgIDE2NAotCi0vKgotICogQkFDbmV0IE1TL1RQIGZyYW1lcy4KLSAqLwotI2RlZmluZSBETFRfQkFDTkVUX01TX1RQCTE2NQotCi0vKgotICogQW5vdGhlciBQUFAgdmFyaWFudCBhcyBwZXIgcmVxdWVzdCBmcm9tIEthcnN0ZW4gS2VpbCA8a2tlaWxAc3VzZS5kZT4uCi0gKgotICogVGhpcyBpcyB1c2VkIGluIHNvbWUgT1NlcyB0byBhbGxvdyBhIGtlcm5lbCBzb2NrZXQgZmlsdGVyIHRvIGRpc3Rpbmd1aXNoCi0gKiBiZXR3ZWVuIGluY29taW5nIGFuZCBvdXRnb2luZyBwYWNrZXRzLCBvbiBhIHNvY2tldCBpbnRlbmRlZCB0bwotICogc3VwcGx5IHBwcGQgd2l0aCBvdXRnb2luZyBwYWNrZXRzIHNvIGl0IGNhbiBkbyBkaWFsLW9uLWRlbWFuZCBhbmQKLSAqIGhhbmd1cC1vbi1sYWNrLW9mLWRlbWFuZDsgaW5jb21pbmcgcGFja2V0cyBhcmUgZmlsdGVyZWQgb3V0IHNvIHRoZXkKLSAqIGRvbid0IGNhdXNlIHBwcGQgdG8gaG9sZCB0aGUgY29ubmVjdGlvbiB1cCAoeW91IGRvbid0IHdhbnQgcmFuZG9tCi0gKiBpbnB1dCBwYWNrZXRzIHN1Y2ggYXMgcG9ydCBzY2FucywgcGFja2V0cyBmcm9tIG9sZCBsb3N0IGNvbm5lY3Rpb25zLAotICogZXRjLiB0byBmb3JjZSB0aGUgY29ubmVjdGlvbiB0byBzdGF5IHVwKS4KLSAqCi0gKiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgUFBQIGhlYWRlciAoMHhmZjAzKSBpcyBtb2RpZmllZCB0byBhY2NvbW9kYXRlCi0gKiB0aGUgZGlyZWN0aW9uIC0gMHgwMCA9IElOLCAweDAxID0gT1VULgotICovCi0jZGVmaW5lIERMVF9QUFBfUFBQRAkJMTY2Ci0KLS8qCi0gKiBOYW1lcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBzb21lIFBQUAotICogc29mdHdhcmU7IG5ldyBzb2Z0d2FyZSBzaG91bGQgdXNlIERMVF9QUFBfUFBQRC4KLSAqLwotI2RlZmluZSBETFRfUFBQX1dJVEhfRElSRUNUSU9OCURMVF9QUFBfUFBQRAotI2RlZmluZSBETFRfTElOVVhfUFBQX1dJVEhESVJFQ1RJT04JRExUX1BQUF9QUFBECi0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KLSAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAgVGhlIERMVF9zIGFyZSB1c2VkCi0gKiBmb3IgcGFzc2luZyBvbiBjaGFzc2lzLWludGVybmFsIG1ldGFpbmZvcm1hdGlvbiBzdWNoIGFzCi0gKiBRT1MgcHJvZmlsZXMsIGNvb2tpZXMsIGV0Yy4uCi0gKi8KLSNkZWZpbmUgRExUX0pVTklQRVJfUFBQT0UgICAgICAgMTY3Ci0jZGVmaW5lIERMVF9KVU5JUEVSX1BQUE9FX0FUTSAgIDE2OAotCi0jZGVmaW5lIERMVF9HUFJTX0xMQwkJMTY5CS8qIEdQUlMgTExDICovCi0jZGVmaW5lIERMVF9HUEZfVAkJMTcwCS8qIEdQRi1UIChJVFUtVCBHLjcwNDEvWS4xMzAzKSAqLwotI2RlZmluZSBETFRfR1BGX0YJCTE3MQkvKiBHUEYtRiAoSVRVLVQgRy43MDQxL1kuMTMwMykgKi8KLQotLyoKLSAqIFJlcXVlc3RlZCBieSBPb2xhbiBaaW1tZXIgPG96QGdjb20uY29tPiBmb3IgdXNlIGluIEdjb20ncyBUMS9FMSBsaW5lCi0gKiBtb25pdG9yaW5nIGVxdWlwbWVudC4KLSAqLwotI2RlZmluZSBETFRfR0NPTV9UMUUxCQkxNzIKLSNkZWZpbmUgRExUX0dDT01fU0VSSUFMCQkxNzMKLQotLyoKLSAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQotICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgRExUXyBpcyB1c2VkCi0gKiBmb3IgaW50ZXJuYWwgY29tbXVuaWNhdGlvbiB0byBQaHlzaWNhbCBJbnRlcmZhY2UgQ2FyZHMgKFBJQykKLSAqLwotI2RlZmluZSBETFRfSlVOSVBFUl9QSUNfUEVFUiAgICAxNzQKLQotLyoKLSAqIExpbmsgdHlwZXMgcmVxdWVzdGVkIGJ5IEdyZWdvciBNYWllciA8Z3JlZ29yQGVuZGFjZS5jb20+IG9mIEVuZGFjZQotICogTWVhc3VyZW1lbnQgU3lzdGVtcy4gIFRoZXkgYWRkIGFuIEVSRiBoZWFkZXIgKHNlZQotICogaHR0cDovL3d3dy5lbmRhY2UuY29tL3N1cHBvcnQvRW5kYWNlUmVjb3JkRm9ybWF0LnBkZikgaW4gZnJvbnQgb2YKLSAqIHRoZSBsaW5rLWxheWVyIGhlYWRlci4KLSAqLwotI2RlZmluZSBETFRfRVJGX0VUSAkJMTc1CS8qIEV0aGVybmV0ICovCi0jZGVmaW5lIERMVF9FUkZfUE9TCQkxNzYJLyogUGFja2V0LW92ZXItU09ORVQgKi8KLQotLyoKLSAqIFJlcXVlc3RlZCBieSBEYW5pZWxlIE9ybGFuZGkgPGRhbmllbGVAb3JsYW5kaS5jb20+IGZvciByYXcgTEFQRAotICogZm9yIHZJU0ROIChodHRwOi8vd3d3Lm9ybGFuZGkuY29tL3Zpc2RuLykuICBJdHMgbGluay1sYXllciBoZWFkZXIKLSAqIGluY2x1ZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBMQVBEIGhlYWRlciwgc28gaXQncwotICogbm90IG5lY2Vzc2FyaWx5IGEgZ2VuZXJpYyBMQVBEIGhlYWRlci4KLSAqLwotI2RlZmluZSBETFRfTElOVVhfTEFQRAkJMTc3Ci0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KLSAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LgotICogVGhlIERMVF8gYXJlIHVzZWQgZm9yIHByZXBlbmRpbmcgbWV0YS1pbmZvcm1hdGlvbgotICogbGlrZSBpbnRlcmZhY2UgaW5kZXgsIGludGVyZmFjZSBuYW1lCi0gKiBiZWZvcmUgc3RhbmRhcmQgRXRoZXJuZXQsIFBQUCwgRnJlbGF5ICYgQy1IRExDIEZyYW1lcwotICovCi0jZGVmaW5lIERMVF9KVU5JUEVSX0VUSEVSICAgICAgIDE3OAotI2RlZmluZSBETFRfSlVOSVBFUl9QUFAgICAgICAgICAxNzkKLSNkZWZpbmUgRExUX0pVTklQRVJfRlJFTEFZICAgICAgMTgwCi0jZGVmaW5lIERMVF9KVU5JUEVSX0NIRExDICAgICAgIDE4MQotCi0vKgotICogTXVsdGkgTGluayBGcmFtZSBSZWxheSAoRlJGLjE2KQotICovCi0jZGVmaW5lIERMVF9NRlIgICAgICAgICAgICAgICAgIDE4MgotCi0vKgotICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4KLSAqIFRoZSBETFRfIGlzIHVzZWQgZm9yIGludGVybmFsIGNvbW11bmljYXRpb24gd2l0aCBhCi0gKiB2b2ljZSBBZGFwdGVyIENhcmQgKFBJQykKLSAqLwotI2RlZmluZSBETFRfSlVOSVBFUl9WUCAgICAgICAgICAxODMKLQotLyoKLSAqIEFyaW5jIDQyOSBmcmFtZXMuCi0gKiBETFRfIHJlcXVlc3RlZCBieSBHaWFubHVjYSBWYXJlbm5pIDxnaWFubHVjYS52YXJlbm5pQGNhY2V0ZWNoLmNvbT4uCi0gKiBFdmVyeSBmcmFtZSBjb250YWlucyBhIDMyYml0IEE0MjkgbGFiZWwuCi0gKiBNb3JlIGRvY3VtZW50YXRpb24gb24gQXJpbmMgNDI5IGNhbiBiZSBmb3VuZCBhdAotICogaHR0cDovL3d3dy5jb25kb3JlbmcuY29tL3N1cHBvcnQvZG93bmxvYWRzL3R1dG9yaWFscy9BUklOQ1R1dG9yaWFsLnBkZgotICovCi0jZGVmaW5lIERMVF9BNDI5ICAgICAgICAgICAgICAgIDE4NAotCi0vKgotICogQXJpbmMgNjUzIEludGVycGFydGl0aW9uIENvbW11bmljYXRpb24gbWVzc2FnZXMuCi0gKiBETFRfIHJlcXVlc3RlZCBieSBHaWFubHVjYSBWYXJlbm5pIDxnaWFubHVjYS52YXJlbm5pQGNhY2V0ZWNoLmNvbT4uCi0gKiBQbGVhc2UgcmVmZXIgdG8gdGhlIEE2NTMtMSBzdGFuZGFyZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqLwotI2RlZmluZSBETFRfQTY1M19JQ00gICAgICAgICAgICAxODUKLQotLyoKLSAqIFVTQiBwYWNrZXRzLCBiZWdpbm5pbmcgd2l0aCBhIFVTQiBzZXR1cCBoZWFkZXI7IHJlcXVlc3RlZCBieQotICogUGFvbG8gQWJlbmkgPHBhb2xvLmFiZW5pQGVtYWlsLml0Pi4KLSAqLwotI2RlZmluZSBETFRfVVNCCQkJMTg2Ci0KLS8qCi0gKiBCbHVldG9vdGggSENJIFVBUlQgdHJhbnNwb3J0IGxheWVyIChwYXJ0IEg6NCk7IHJlcXVlc3RlZCBieQotICogUGFvbG8gQWJlbmkuCi0gKi8KLSNkZWZpbmUgRExUX0JMVUVUT09USF9IQ0lfSDQJMTg3Ci0KLS8qCi0gKiBJRUVFIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXI7IHJlcXVlc3RlZCBieSBNYXJpYSBDcnV6Ci0gKiA8Y3J1el9wZXRhZ2F5QGJhaC5jb20+LgotICovCi0jZGVmaW5lIERMVF9JRUVFODAyXzE2X01BQ19DUFMJMTg4Ci0KLS8qCi0gKiBVU0IgcGFja2V0cywgYmVnaW5uaW5nIHdpdGggYSBMaW51eCBVU0IgaGVhZGVyOyByZXF1ZXN0ZWQgYnkKLSAqIFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4uCi0gKi8KLSNkZWZpbmUgRExUX1VTQl9MSU5VWAkJMTg5Ci0KLS8qCi0gKiBDb250cm9sbGVyIEFyZWEgTmV0d29yayAoQ0FOKSB2LiAyLjBCIHBhY2tldHMuCi0gKiBETFRfIHJlcXVlc3RlZCBieSBHaWFubHVjYSBWYXJlbm5pIDxnaWFubHVjYS52YXJlbm5pQGNhY2V0ZWNoLmNvbT4uCi0gKiBVc2VkIHRvIGR1bXAgQ0FOIHBhY2tldHMgY29taW5nIGZyb20gYSBDQU4gVmVjdG9yIGJvYXJkLgotICogTW9yZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBDQU4gdjIuMEIgZnJhbWVzIGNhbiBiZSBmb3VuZCBhdAotICogaHR0cDovL3d3dy5jYW4tY2lhLm9yZy9kb3dubG9hZHMvPzI2OQotICovCi0jZGVmaW5lIERMVF9DQU4yMEIgICAgICAgICAgICAgIDE5MAotCi0vKgotICogSUVFRSA4MDIuMTUuNCwgd2l0aCBhZGRyZXNzIGZpZWxkcyBwYWRkZWQsIGFzIGlzIGRvbmUgYnkgTGludXgKLSAqIGRyaXZlcnM7IHJlcXVlc3RlZCBieSBKdWVyZ2VuIFNjaGltbWVyLgotICovCi0jZGVmaW5lIERMVF9JRUVFODAyXzE1XzRfTElOVVgJMTkxCi0KLS8qCi0gKiBQZXIgUGFja2V0IEluZm9ybWF0aW9uIGVuY2Fwc3VsYXRlZCBwYWNrZXRzLgotICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgotICovCi0jZGVmaW5lIERMVF9QUEkJCQkxOTIKLQotLyoKLSAqIEhlYWRlciBmb3IgODAyLjE2IE1BQyBDb21tb24gUGFydCBTdWJsYXllciBwbHVzIGEgcmFkaW90YXAgcmFkaW8gaGVhZGVyOwotICogcmVxdWVzdGVkIGJ5IENoYXJsZXMgQ2xhbmN5LgotICovCi0jZGVmaW5lIERMVF9JRUVFODAyXzE2X01BQ19DUFNfUkFESU8JMTkzCi0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KLSAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LgotICogVGhlIERMVF8gaXMgdXNlZCBmb3IgaW50ZXJuYWwgY29tbXVuaWNhdGlvbiB3aXRoIGEKLSAqIGludGVncmF0ZWQgc2VydmljZSBtb2R1bGUgKElTTSkuCi0gKi8KLSNkZWZpbmUgRExUX0pVTklQRVJfSVNNICAgICAgICAgMTk0Ci0KLS8qCi0gKiBJRUVFIDgwMi4xNS40LCBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4gdGhlIHNwZWMgKG5vIHBhZGRpbmcsIG5vCi0gKiBub3RoaW5nKTsgcmVxdWVzdGVkIGJ5IE1pa2tvIFNhYXJuaXZhbGEgPG1pa2tvLnNhYXJuaXZhbGFAc2Vuc2lub2RlLmNvbT4uCi0gKiBGb3IgdGhpcyBvbmUsIHdlIGV4cGVjdCB0aGUgRkNTIHRvIGJlIHByZXNlbnQgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWU7Ci0gKiBpZiB0aGUgZnJhbWUgaGFzIG5vIEZDUywgRExUX0lFRUU4MDJfMTVfNF9OT0ZDUyBzaG91bGQgYmUgdXNlZC4KLSAqLwotI2RlZmluZSBETFRfSUVFRTgwMl8xNV80CTE5NQotCi0vKgotICogVmFyaW91cyBsaW5rLWxheWVyIHR5cGVzLCB3aXRoIGEgcHNldWRvLWhlYWRlciwgZm9yIFNJVEEKLSAqIChodHRwOi8vd3d3LnNpdGEuYWVyby8pOyByZXF1ZXN0ZWQgYnkgRnVsa28gSGV3IChmdWxrby5oZXdAZ21haWwuY29tKS4KLSAqLwotI2RlZmluZSBETFRfU0lUQQkJMTk2Ci0KLS8qCi0gKiBWYXJpb3VzIGxpbmstbGF5ZXIgdHlwZXMsIHdpdGggYSBwc2V1ZG8taGVhZGVyLCBmb3IgRW5kYWNlIERBRyBjYXJkczsKLSAqIGVuY2Fwc3VsYXRlcyBFbmRhY2UgRVJGIHJlY29yZHMuICBSZXF1ZXN0ZWQgYnkgU3RlcGhlbiBEb25uZWxseQotICogPHN0ZXBoZW5AZW5kYWNlLmNvbT4uCi0gKi8KLSNkZWZpbmUgRExUX0VSRgkJCTE5NwotCi0vKgotICogU3BlY2lhbCBoZWFkZXIgcHJlcGVuZGVkIHRvIEV0aGVybmV0IHBhY2tldHMgd2hlbiBjYXB0dXJpbmcgZnJvbSBhCi0gKiB1MTAgTmV0d29ya3MgYm9hcmQuICBSZXF1ZXN0ZWQgYnkgUGhpbCBNdWxob2xsYW5kCi0gKiA8cGhpbEB1MTBuZXR3b3Jrcy5jb20+LgotICovCi0jZGVmaW5lIERMVF9SQUlGMQkJMTk4Ci0KLS8qCi0gKiBJUE1CIHBhY2tldCBmb3IgSVBNSSwgYmVnaW5uaW5nIHdpdGggdGhlIEkyQyBzbGF2ZSBhZGRyZXNzLCBmb2xsb3dlZAotICogYnkgdGhlIG5ldEZuIGFuZCBMVU4sIGV0Yy4uICBSZXF1ZXN0ZWQgYnkgQ2hhbnRoeSBUb2V1bmcKLSAqIDxjaGFudGh5LnRvZXVuZ0BjYS5rb250cm9uLmNvbT4uCi0gKi8KLSNkZWZpbmUgRExUX0lQTUIJCTE5OQotCi0vKgotICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4KLSAqIFRoZSBETFRfIGlzIHVzZWQgZm9yIGNhcHR1cmluZyBkYXRhIG9uIGEgc2VjdXJlIHR1bm5lbCBpbnRlcmZhY2UuCi0gKi8KLSNkZWZpbmUgRExUX0pVTklQRVJfU1QgICAgICAgICAgMjAwCi0KLS8qCi0gKiBCbHVldG9vdGggSENJIFVBUlQgdHJhbnNwb3J0IGxheWVyIChwYXJ0IEg6NCksIHdpdGggcHNldWRvLWhlYWRlcgotICogdGhhdCBpbmNsdWRlcyBkaXJlY3Rpb24gaW5mb3JtYXRpb247IHJlcXVlc3RlZCBieSBQYW9sbyBBYmVuaS4KLSAqLwotI2RlZmluZSBETFRfQkxVRVRPT1RIX0hDSV9INF9XSVRIX1BIRFIJMjAxCi0KLS8qCi0gKiBBWC4yNSBwYWNrZXQgd2l0aCBhIDEtYnl0ZSBLSVNTIGhlYWRlcjsgc2VlCi0gKgotICoJaHR0cDovL3d3dy5heDI1Lm5ldC9raXNzLmh0bQotICoKLSAqIGFzIHBlciBSaWNoYXJkIFN0ZWFybiA8cmljaGFyZEBybnMtc3RlYXJuLmRlbW9uLmNvLnVrPi4KLSAqLwotI2RlZmluZSBETFRfQVgyNV9LSVNTCQkyMDIKLQotLyoKLSAqIExBUEQgcGFja2V0cyBmcm9tIGFuIElTRE4gY2hhbm5lbCwgc3RhcnRpbmcgd2l0aCB0aGUgYWRkcmVzcyBmaWVsZCwKLSAqIHdpdGggbm8gcHNldWRvLWhlYWRlci4KLSAqIFJlcXVlc3RlZCBieSBWYXJ1bmEgRGUgU2lsdmEgPHZhcnVuYXhAZ21haWwuY29tPi4KLSAqLwotI2RlZmluZSBETFRfTEFQRAkJMjAzCi0KLS8qCi0gKiBWYXJpYW50cyBvZiB2YXJpb3VzIGxpbmstbGF5ZXIgaGVhZGVycywgd2l0aCBhIG9uZS1ieXRlIGRpcmVjdGlvbgotICogcHNldWRvLWhlYWRlciBwcmVwZW5kZWQgLSB6ZXJvIG1lYW5zICJyZWNlaXZlZCBieSB0aGlzIGhvc3QiLAotICogbm9uLXplcm8gKGFueSBub24temVybyB2YWx1ZSkgbWVhbnMgInNlbnQgYnkgdGhpcyBob3N0IiAtIGFzIHBlcgotICogV2lsbCBCYXJrZXIgPHcuYmFya2VyQHplbi5jby51az4uCi0gKi8KLSNkZWZpbmUgRExUX1BQUF9XSVRIX0RJUgkyMDQJLyogUFBQIC0gZG9uJ3QgY29uZnVzZSB3aXRoIERMVF9QUFBfV0lUSF9ESVJFQ1RJT04gKi8KLSNkZWZpbmUgRExUX0NfSERMQ19XSVRIX0RJUgkyMDUJLyogQ2lzY28gSERMQyAqLwotI2RlZmluZSBETFRfRlJFTEFZX1dJVEhfRElSCTIwNgkvKiBGcmFtZSBSZWxheSAqLwotI2RlZmluZSBETFRfTEFQQl9XSVRIX0RJUgkyMDcJLyogTEFQQiAqLwotCi0vKgotICogMjA4IGlzIHJlc2VydmVkIGZvciBhbiBhcy15ZXQtdW5zcGVjaWZpZWQgcHJvcHJpZXRhcnkgbGluay1sYXllcgotICogdHlwZSwgYXMgcmVxdWVzdGVkIGJ5IFdpbGwgQmFya2VyLgotICovCi0KLS8qCi0gKiBJUE1CIHdpdGggYSBMaW51eC1zcGVjaWZpYyBwc2V1ZG8taGVhZGVyOyBhcyByZXF1ZXN0ZWQgYnkgQWxleGV5IE5leW1hbgotICogPGF2bkBwaWdlb25wb2ludC5jb20+LgotICovCi0jZGVmaW5lIERMVF9JUE1CX0xJTlVYCQkyMDkKLQotLyoKLSAqIEZsZXhSYXkgYXV0b21vdGl2ZSBidXMgLSBodHRwOi8vd3d3LmZsZXhyYXkuY29tLyAtIGFzIHJlcXVlc3RlZAotICogYnkgSGFubmVzIEthZWxiZXIgPGhhbm5lcy5rYWVsYmVyQHgyZS5kZT4uCi0gKi8KLSNkZWZpbmUgRExUX0ZMRVhSQVkJCTIxMAotCi0vKgotICogTWVkaWEgT3JpZW50ZWQgU3lzdGVtcyBUcmFuc3BvcnQgKE1PU1QpIGJ1cyBmb3IgbXVsdGltZWRpYQotICogdHJhbnNwb3J0IC0gaHR0cDovL3d3dy5tb3N0Y29vcGVyYXRpb24uY29tLyAtIGFzIHJlcXVlc3RlZAotICogYnkgSGFubmVzIEthZWxiZXIgPGhhbm5lcy5rYWVsYmVyQHgyZS5kZT4uCi0gKi8KLSNkZWZpbmUgRExUX01PU1QJCTIxMQotCi0vKgotICogTG9jYWwgSW50ZXJjb25uZWN0IE5ldHdvcmsgKExJTikgYnVzIGZvciB2ZWhpY2xlIG5ldHdvcmtzIC0KLSAqIGh0dHA6Ly93d3cubGluLXN1YmJ1cy5vcmcvIC0gYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyCi0gKiA8aGFubmVzLmthZWxiZXJAeDJlLmRlPi4KLSAqLwotI2RlZmluZSBETFRfTElOCQkJMjEyCi0KLS8qCi0gKiBYMkUtcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSB1c2VkIGZvciBzZXJpYWwgbGluZSBjYXB0dXJlLAotICogYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgotICovCi0jZGVmaW5lIERMVF9YMkVfU0VSSUFMCQkyMTMKLQotLyoKLSAqIFgyRS1wcml2YXRlIGRhdGEgbGluayB0eXBlIHVzZWQgZm9yIHRoZSBYb3JheWEgZGF0YSBsb2dnZXIKLSAqIGZhbWlseSwgYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgotICovCi0jZGVmaW5lIERMVF9YMkVfWE9SQVlBCQkyMTQKLQotLyoKLSAqIElFRUUgODAyLjE1LjQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAobm8gcGFkZGluZywgbm8KLSAqIG5vdGhpbmcpLCBidXQgd2l0aCB0aGUgUEhZLWxldmVsIGRhdGEgZm9yIG5vbi1BU0sgUEhZcyAoNCBvY3RldHMKLSAqIG9mIDAgYXMgcHJlYW1ibGUsIG9uZSBvY3RldCBvZiBTRkQsIG9uZSBvY3RldCBvZiBmcmFtZSBsZW5ndGgrCi0gKiByZXNlcnZlZCBiaXQsIGFuZCB0aGVuIHRoZSBNQUMtbGF5ZXIgZGF0YSwgc3RhcnRpbmcgd2l0aCB0aGUKLSAqIGZyYW1lIGNvbnRyb2wgZmllbGQpLgotICoKLSAqIFJlcXVlc3RlZCBieSBNYXggRmlsaXBwb3YgPGpjbXZia2JjQGdtYWlsLmNvbT4uCi0gKi8KLSNkZWZpbmUgRExUX0lFRUU4MDJfMTVfNF9OT05BU0tfUEhZCTIxNQotCi0vKgotICogRGF2aWQgR2lic29uIDxkYXZpZEBnaWJzb24uZHJvcGJlYXIuaWQuYXU+IHJlcXVlc3RlZCB0aGlzIGZvcgotICogY2FwdHVyZXMgZnJvbSB0aGUgTGludXgga2VybmVsIC9kZXYvaW5wdXQvZXZlbnROIGRldmljZXMuIFRoaXMKLSAqIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUga2V5c3Ryb2tlcyBhbmQgbW91c2UgbW92ZW1lbnRzIGZyb20gdGhlCi0gKiBMaW51eCBrZXJuZWwgdG8gZGlzcGxheSBzeXN0ZW1zLCBzdWNoIGFzIFhvcmcuCi0gKi8KLSNkZWZpbmUgRExUX0xJTlVYX0VWREVWCQkyMTYKLQotLyoKLSAqIEdTTSBVbSBhbmQgQWJpcyBpbnRlcmZhY2VzLCBwcmVjZWRlZCBieSBhICJnc210YXAiIGhlYWRlci4KLSAqCi0gKiBSZXF1ZXN0ZWQgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4uCi0gKi8KLSNkZWZpbmUgRExUX0dTTVRBUF9VTQkJMjE3Ci0jZGVmaW5lIERMVF9HU01UQVBfQUJJUwkJMjE4Ci0KLS8qCi0gKiBNUExTLCB3aXRoIGFuIE1QTFMgbGFiZWwgYXMgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLgotICogUmVxdWVzdGVkIGJ5IE1pY2hlbGUgTWFyY2hldHRvIDxtaWNoZWxlQG9wZW5ic2Qub3JnPiBvbiBiZWhhbGYKLSAqIG9mIE9wZW5CU0QuCi0gKi8KLSNkZWZpbmUgRExUX01QTFMJCTIxOQotCi0vKgotICogVVNCIHBhY2tldHMsIGJlZ2lubmluZyB3aXRoIGEgTGludXggVVNCIGhlYWRlciwgd2l0aCB0aGUgVVNCIGhlYWRlcgotICogcGFkZGVkIHRvIDY0IGJ5dGVzOyByZXF1aXJlZCBmb3IgbWVtb3J5LW1hcHBlZCBhY2Nlc3MuCi0gKi8KLSNkZWZpbmUgRExUX1VTQl9MSU5VWF9NTUFQUEVECTIyMAotCi0vKgotICogREVDVCBwYWNrZXRzLCB3aXRoIGEgcHNldWRvLWhlYWRlcjsgcmVxdWVzdGVkIGJ5Ci0gKiBNYXR0aGlhcyBXZW56ZWwgPHRjcGR1bXBAbWF6em9vLmRlPi4KLSAqLwotI2RlZmluZSBETFRfREVDVAkJMjIxCi0KLS8qCi0gKiBGcm9tOiAiTGlkd2EsIEVyaWMgKEdTRkMtNTgyLjApW1NHVCBJTkNdIiA8ZXJpYy5saWR3YS0xQG5hc2EuZ292PgotICogRGF0ZTogTW9uLCAxMSBNYXkgMjAwOSAxMToxODozMCAtMDUwMAotICoKLSAqIERMVF9BT1MuIFdlIG5lZWQgaXQgZm9yIEFPUyBTcGFjZSBEYXRhIExpbmsgUHJvdG9jb2wuCi0gKiAgIEkgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gZGlzc2VjdG9ycyBmb3IgYnV0IG5lZWQgYW4gT0sgZnJvbQotICogICBsZWdhbCBiZWZvcmUgSSBjYW4gc3VibWl0IGEgcGF0Y2guCi0gKgotICovCi0jZGVmaW5lIERMVF9BT1MgICAgICAgICAgICAgICAgIDIyMgotCi0vKgotICogV2lyZWxlc3MgSEFSVCAoSGlnaHdheSBBZGRyZXNzYWJsZSBSZW1vdGUgVHJhbnNkdWNlcikKLSAqIEZyb20gdGhlIEhBUlQgQ29tbXVuaWNhdGlvbiBGb3VuZGF0aW9uCi0gKiBJRVMvUEFTIDYyNTkxCi0gKgotICogUmVxdWVzdGVkIGJ5IFNhbSBSb2JlcnRzIDx2aWV1eHRlY2hAZ21haWwuY29tPi4KLSAqLwotI2RlZmluZSBETFRfV0lIQVJUCQkyMjMKLQotLyoKLSAqIEZpYnJlIENoYW5uZWwgRkMtMiBmcmFtZXMsIGJlZ2lubmluZyB3aXRoIGEgRnJhbWVfSGVhZGVyLgotICogUmVxdWVzdGVkIGJ5IEthaG91IExlaSA8a2Fob3U4MkBnbWFpbC5jb20+LgotICovCi0jZGVmaW5lIERMVF9GQ18yCQkyMjQKLQotLyoKLSAqIEZpYnJlIENoYW5uZWwgRkMtMiBmcmFtZXMsIGJlZ2lubmluZyB3aXRoIGFuIGVuY29kaW5nIG9mIHRoZQotICogU09GLCBhbmQgZW5kaW5nIHdpdGggYW4gZW5jb2Rpbmcgb2YgdGhlIEVPRi4KLSAqCi0gKiBUaGUgZW5jb2RpbmdzIHJlcHJlc2VudCB0aGUgZnJhbWUgZGVsaW1pdGVycyBhcyA0LWJ5dGUgc2VxdWVuY2VzCi0gKiByZXByZXNlbnRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXJlZCBzZXRzLCB3aXRoIEsyOC41Ci0gKiByZXByZXNlbnRlZCBhcyAweEJDLCBhbmQgdGhlIEQgc3ltYm9scyBhcyB0aGUgY29ycmVzcG9uZGluZwotICogYnl0ZSB2YWx1ZXM7IGZvciBleGFtcGxlLCBTT0ZpMiwgd2hpY2ggaXMgSzI4LjUgLSBEMjEuNSAtIEQxLjIgLSBEMjEuMiwKLSAqIGlzIHJlcHJlc2VudGVkIGFzIDB4QkMgMHhCNSAweDU1IDB4NTUuCi0gKgotICogUmVxdWVzdGVkIGJ5IEthaG91IExlaSA8a2Fob3U4MkBnbWFpbC5jb20+LgotICovCi0jZGVmaW5lIERMVF9GQ18yX1dJVEhfRlJBTUVfREVMSU1TCTIyNQotCi0vKgotICogU29sYXJpcyBpcG5ldCBwc2V1ZG8taGVhZGVyOyByZXF1ZXN0ZWQgYnkgRGFycmVuIFJlZWQgPERhcnJlbi5SZWVkQFN1bi5DT00+LgotICoKLSAqIFRoZSBwc2V1ZG8taGVhZGVyIHN0YXJ0cyB3aXRoIGEgb25lLWJ5dGUgdmVyc2lvbiBudW1iZXI7IGZvciB2ZXJzaW9uIDIsCi0gKiB0aGUgcHNldWRvLWhlYWRlciBpczoKLSAqCi0gKiBzdHJ1Y3QgZGxfaXBuZXRpbmZvIHsKLSAqICAgICB1X2ludDhfdCAgIGRsaV92ZXJzaW9uOwotICogICAgIHVfaW50OF90ICAgZGxpX2ZhbWlseTsKLSAqICAgICB1X2ludDE2X3QgIGRsaV9odHlwZTsKLSAqICAgICB1X2ludDMyX3QgIGRsaV9wa3RsZW47Ci0gKiAgICAgdV9pbnQzMl90ICBkbGlfaWZpbmRleDsKLSAqICAgICB1X2ludDMyX3QgIGRsaV9ncmlmaW5kZXg7Ci0gKiAgICAgdV9pbnQzMl90ICBkbGlfenNyYzsKLSAqICAgICB1X2ludDMyX3QgIGRsaV96ZHN0OwotICogfTsKLSAqCi0gKiBkbGlfdmVyc2lvbiBpcyAyIGZvciB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBwc2V1ZG8taGVhZGVyLgotICoKLSAqIGRsaV9mYW1pbHkgaXMgYSBTb2xhcmlzIGFkZHJlc3MgZmFtaWx5IHZhbHVlLCBzbyBpdCdzIDIgZm9yIElQdjQKLSAqIGFuZCAyNiBmb3IgSVB2Ni4KLSAqCi0gKiBkbGlfaHR5cGUgaXMgYSAiaG9vayB0eXBlIiAtIDAgZm9yIGluY29taW5nIHBhY2tldHMsIDEgZm9yIG91dGdvaW5nCi0gKiBwYWNrZXRzLCBhbmQgMiBmb3IgcGFja2V0cyBhcnJpdmluZyBmcm9tIGFub3RoZXIgem9uZSBvbiB0aGUgc2FtZQotICogbWFjaGluZS4KLSAqCi0gKiBkbGlfcGt0bGVuIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBkYXRhIGZvbGxvd2luZyB0aGUgcHNldWRvLWhlYWRlcgotICogKHNvIHRoZSBjYXB0dXJlZCBsZW5ndGggbWludXMgZGxpX3BrdGxlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZQotICogcHNldWRvLWhlYWRlciwgYXNzdW1pbmcgdGhlIGVudGlyZSBwc2V1ZG8taGVhZGVyIHdhcyBjYXB0dXJlZCkuCi0gKgotICogZGxpX2lmaW5kZXggaXMgdGhlIGludGVyZmFjZSBpbmRleCBvZiB0aGUgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZQotICogcGFja2V0IGFycml2ZWQuCi0gKgotICogZGxpX2dyaWZpbmRleCBpcyB0aGUgZ3JvdXAgaW50ZXJmYWNlIGluZGV4IG51bWJlciAoZm9yIElQTVAgaW50ZXJmYWNlcykuCi0gKgotICogZGxpX3pzcmMgaXMgdGhlIHpvbmUgaWRlbnRpZmllciBmb3IgdGhlIHNvdXJjZSBvZiB0aGUgcGFja2V0LgotICoKLSAqIGRsaV96ZHN0IGlzIHRoZSB6b25lIGlkZW50aWZpZXIgZm9yIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcGFja2V0LgotICoKLSAqIEEgem9uZSBudW1iZXIgb2YgMCBpcyB0aGUgZ2xvYmFsIHpvbmU7IGEgem9uZSBudW1iZXIgb2YgMHhmZmZmZmZmZgotICogbWVhbnMgdGhhdCB0aGUgcGFja2V0IGFycml2ZWQgZnJvbSBhbm90aGVyIGhvc3Qgb24gdGhlIG5ldHdvcmssIG5vdAotICogZnJvbSBhbm90aGVyIHpvbmUgb24gdGhlIHNhbWUgbWFjaGluZS4KLSAqCi0gKiBBbiBJUHY0IG9yIElQdjYgZGF0YWdyYW0gZm9sbG93cyB0aGUgcHNldWRvLWhlYWRlcjsgZGxpX2ZhbWlseSBpbmRpY2F0ZXMKLSAqIHdoaWNoIG9mIHRob3NlIGl0IGlzLgotICovCi0jZGVmaW5lIERMVF9JUE5FVAkJMjI2Ci0KLS8qCi0gKiBDQU4gKENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrKSBmcmFtZXMsIHdpdGggYSBwc2V1ZG8taGVhZGVyIGFzIHN1cHBsaWVkCi0gKiBieSBMaW51eCBTb2NrZXRDQU4uICBTZWUgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2Nhbi50eHQgaW4gdGhlIExpbnV4Ci0gKiBzb3VyY2UuCi0gKgotICogUmVxdWVzdGVkIGJ5IEZlbGl4IE9iZW5odWJlciA8ZmVsaXhAb2Jlbmh1YmVyLmRlPi4KLSAqLwotI2RlZmluZSBETFRfQ0FOX1NPQ0tFVENBTgkyMjcKLQotLyoKLSAqIFJhdyBJUHY0L0lQdjY7IGRpZmZlcmVudCBmcm9tIERMVF9SQVcgaW4gdGhhdCB0aGUgRExUXyB2YWx1ZSBzcGVjaWZpZXMKLSAqIHdoZXRoZXIgaXQncyB2NCBvciB2Ni4gIFJlcXVlc3RlZCBieSBEYXJyZW4gUmVlZCA8RGFycmVuLlJlZWRAU3VuLkNPTT4uCi0gKi8KLSNkZWZpbmUgRExUX0lQVjQJCTIyOAotI2RlZmluZSBETFRfSVBWNgkJMjI5Ci0KLS8qCi0gKiBJRUVFIDgwMi4xNS40LCBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4gdGhlIHNwZWMgKG5vIHBhZGRpbmcsIG5vCi0gKiBub3RoaW5nKSwgYW5kIHdpdGggbm8gRkNTIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lOyByZXF1ZXN0ZWQgYnkKLSAqIEpvbiBTbWlybCA8am9uc21pcmxAZ21haWwuY29tPi4KLSAqLwotI2RlZmluZSBETFRfSUVFRTgwMl8xNV80X05PRkNTCTIzMAotCi0vKgotICogUmF3IEQtQnVzOgotICoKLSAqCWh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3dpa2kvU29mdHdhcmUvZGJ1cwotICoKLSAqIG1lc3NhZ2VzOgotICoKLSAqCWh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjbWVzc2FnZS1wcm90b2NvbC1tZXNzYWdlcwotICoKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGVuZGlhbm5lc3MgZmxhZywgZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UgdHlwZSwgZXRjLiwKLSAqIGJ1dCB3aXRob3V0IHRoZSBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UgYmVmb3JlIHRoZSBtZXNzYWdlIHNlcXVlbmNlOgotICoKLSAqCWh0dHA6Ly9kYnVzLmZyZWVkZXNrdG9wLm9yZy9kb2MvZGJ1cy1zcGVjaWZpY2F0aW9uLmh0bWwjYXV0aC1wcm90b2NvbAotICoKLSAqIFJlcXVlc3RlZCBieSBNYXJ0aW4gVmlkbmVyIDxtYXJ0aW5AdmlkbmVyLm5ldD4uCi0gKi8KLSNkZWZpbmUgRExUX0RCVVMJCTIzMQotCi0vKgotICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCi0gKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4KLSAqLwotI2RlZmluZSBETFRfSlVOSVBFUl9WUwkJCTIzMgotI2RlZmluZSBETFRfSlVOSVBFUl9TUlhfRTJFCQkyMzMKLSNkZWZpbmUgRExUX0pVTklQRVJfRklCUkVDSEFOTkVMCTIzNAotCi0vKgotICogRFZCLUNJIChEVkIgQ29tbW9uIEludGVyZmFjZSBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGEgUEMgQ2FyZAotICogbW9kdWxlIGFuZCBhIERWQiByZWNlaXZlcikuICBTZWUKLSAqCi0gKglodHRwOi8vd3d3LmthaXNlci5jeC9wY2FwLWR2YmNpLmh0bWwKLSAqCi0gKiBmb3IgdGhlIHNwZWNpZmljYXRpb24uCi0gKgotICogUmVxdWVzdGVkIGJ5IE1hcnRpbiBLYWlzZXIgPG1hcnRpbkBrYWlzZXIuY3g+LgotICovCi0jZGVmaW5lIERMVF9EVkJfQ0kJCTIzNQotCi0vKgotICogVmFyaWFudCBvZiAzR1BQIFRTIDI3LjAxMCBtdWx0aXBsZXhpbmcgcHJvdG9jb2wgKHNpbWlsYXIgdG8sIGJ1dAotICogKm5vdCogdGhlIHNhbWUgYXMsIDI3LjAxMCkuICBSZXF1ZXN0ZWQgYnkgSGFucy1DaHJpc3RvcGggU2NoZW1tZWwKLSAqIDxoYW5zLWNocmlzdG9waC5zY2hlbW1lbEBjaW50ZXJpb24uY29tPi4KLSAqLwotI2RlZmluZSBETFRfTVVYMjcwMTAJCTIzNgotCi0vKgotICogU1RBTkFHIDUwNjYgRF9QRFVzLiAgUmVxdWVzdGVkIGJ5IE0uIEJhcmlzIERlbWlyYXkKLSAqIDxiYXJpc2RlbWlyYXlAZ21haWwuY29tPi4KLSAqLwotI2RlZmluZSBETFRfU1RBTkFHXzUwNjZfRF9QRFUJMjM3Ci0KLS8qCi0gKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KLSAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LgotICovCi0jZGVmaW5lIERMVF9KVU5JUEVSX0FUTV9DRU1JQwkyMzgKLQotLyoKLSAqIE5ldEZpbHRlciBMT0cgbWVzc2FnZXMKLSAqIChwYXlsb2FkIG9mIG5ldGxpbmsgTkZOTF9TVUJTWVNfVUxPRy9ORlVMTkxfTVNHX1BBQ0tFVCBwYWNrZXRzKQotICoKLSAqIFJlcXVlc3RlZCBieSBKYWt1YiBaYXdhZHpraSA8ZGFya2phbWVzLXdzQGRhcmtqYW1lcy5wbD4KLSAqLwotI2RlZmluZSBETFRfTkZMT0cJCTIzOQotCi0vKgotICogSGlsc2NoZXIgR2VzZWxsc2NoYWZ0IGZ1ZXIgU3lzdGVtYXV0b21hdGlvbiBtYkggbGluay1sYXllciB0eXBlCi0gKiBmb3IgRXRoZXJuZXQgcGFja2V0cyB3aXRoIGEgNC1ieXRlIHBzZXVkby1oZWFkZXIgYW5kIGFsd2F5cwotICogd2l0aCB0aGUgcGF5bG9hZCBpbmNsdWRpbmcgdGhlIEZDUywgYXMgc3VwcGxpZWQgYnkgdGhlaXIKLSAqIG5ldEFOQUxZWkVSIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZS4KLSAqCi0gKiBSZXF1ZXN0ZWQgYnkgSG9sZ2VyIFAuIEZyb21tZXIgPEhQZnJvbW1lckBoaWxzY2hlci5jb20+Ci0gKi8KLSNkZWZpbmUgRExUX05FVEFOQUxZWkVSCQkyNDAKLQotLyoKLSAqIEhpbHNjaGVyIEdlc2VsbHNjaGFmdCBmdWVyIFN5c3RlbWF1dG9tYXRpb24gbWJIIGxpbmstbGF5ZXIgdHlwZQotICogZm9yIEV0aGVybmV0IHBhY2tldHMgd2l0aCBhIDQtYnl0ZSBwc2V1ZG8taGVhZGVyIGFuZCBGQ1MgYW5kCi0gKiB3aXRoIHRoZSBFdGhlcm5ldCBoZWFkZXIgcHJlY2VkZWQgYnkgNyBieXRlcyBvZiBwcmVhbWJsZSBhbmQKLSAqIDEgYnl0ZSBvZiBTRkQsIGFzIHN1cHBsaWVkIGJ5IHRoZWlyIG5ldEFOQUxZWkVSIGhhcmR3YXJlIGFuZAotICogc29mdHdhcmUuCi0gKgotICogUmVxdWVzdGVkIGJ5IEhvbGdlciBQLiBGcm9tbWVyIDxIUGZyb21tZXJAaGlsc2NoZXIuY29tPgotICovCi0jZGVmaW5lIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVAkyNDEKLQotLyoKLSAqIElQLW92ZXItSW5maW5pQmFuZCwgYXMgc3BlY2lmaWVkIGJ5IFJGQyA0MzkxLgotICoKLSAqIFJlcXVlc3RlZCBieSBQZXRyIFN1bWJlcmEgPHBldHIuc3VtYmVyYUBvcmFjbGUuY29tPi4KLSAqLwotI2RlZmluZSBETFRfSVBPSUIJCTI0MgotCi0vKgotICogTVBFRy0yIHRyYW5zcG9ydCBzdHJlYW0gKElTTyAxMzgxOC0xL0lUVS1UIEguMjIyLjApLgotICoKLSAqIFJlcXVlc3RlZCBieSBHdXkgTWFydGluIDxnbXNvZnRAdHV4aWNvbWFuLmJlPi4KLSAqLwotI2RlZmluZSBETFRfTVBFR18yX1RTCQkyNDMKLQotLyoKLSAqIG5nNFQgR21iSCdzIFVNVFMgSXViL0l1ci1vdmVyLUFUTSBhbmQgSXViL0l1ci1vdmVyLUlQIGZvcm1hdCBhcwotICogdXNlZCBieSB0aGVpciBuZzQwIHByb3RvY29sIHRlc3Rlci4KLSAqCi0gKiBSZXF1ZXN0ZWQgYnkgSmVucyBHcmltbWVyIDxqZW5zLmdyaW1tZXJAbmc0dC5jb20+LgotICovCi0jZGVmaW5lIERMVF9ORzQwCQkyNDQKLQotLyoKLSAqIFBzZXVkby1oZWFkZXIgZ2l2aW5nIGFkYXB0ZXIgbnVtYmVyIGFuZCBmbGFncywgZm9sbG93ZWQgYnkgYW4gTkZDCi0gKiAoTmVhci1GaWVsZCBDb21tdW5pY2F0aW9ucykgTG9naWNhbCBMaW5rIENvbnRyb2wgUHJvdG9jb2wgKExMQ1ApIFBEVSwKLSAqIGFzIHNwZWNpZmllZCBieSBORkMgRm9ydW0gTG9naWNhbCBMaW5rIENvbnRyb2wgUHJvdG9jb2wgVGVjaG5pY2FsCi0gKiBTcGVjaWZpY2F0aW9uIExMQ1AgMS4xLgotICoKLSAqIFJlcXVlc3RlZCBieSBNaWtlIFdha2VybHkgPG1pa2V5QGdvb2dsZS5jb20+LgotICovCi0jZGVmaW5lIERMVF9ORkNfTExDUAkJMjQ1Ci0KLS8qCi0gKiAyNDUgaXMgdXNlZCBhcyBMSU5LVFlQRV9QRlNZTkM7IGRvIG5vdCB1c2UgaXQgZm9yIGFueSBvdGhlciBwdXJwb3NlLgotICoKLSAqIERMVF9QRlNZTkMgaGFzIGRpZmZlcmVudCB2YWx1ZXMgb24gZGlmZmVyZW50IHBsYXRmb3JtcywgYW5kIGFsbCBvZgotICogdGhlbSBjb2xsaWRlIHdpdGggc29tZXRoaW5nIHVzZWQgZWxzZXdoZXJlLiAgT24gcGxhdGZvcm1zIHRoYXQKLSAqIGRvbid0IGFscmVhZHkgZGVmaW5lIGl0LCBkZWZpbmUgaXQgYXMgMjQ1LgotICovCi0jaWYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKSAmJiAhZGVmaW5lZChfX0RyYWdvbkZseV9fKSAmJiAhZGVmaW5lZChfX0FQUExFX18pCi0jZGVmaW5lIERMVF9QRlNZTkMJCTI0NgotI2VuZGlmCi0KLS8qCi0gKiBSYXcgSW5maW5pQmFuZCBwYWNrZXRzLCBzdGFydGluZyB3aXRoIHRoZSBMb2NhbCBSb3V0aW5nIEhlYWRlci4KLSAqCi0gKiBSZXF1ZXN0ZWQgYnkgT3JlbiBLbGFkbml0c2t5IDxvcmVua0BtZWxsYW5veC5jb20+LgotICovCi0jZGVmaW5lIERMVF9JTkZJTklCQU5ECQkyNDcKLQotLyoKLSAqIFNDVFAsIHdpdGggbm8gbG93ZXItbGV2ZWwgcHJvdG9jb2xzIChpLmUuLCBubyBJUHY0IG9yIElQdjYpLgotICoKLSAqIFJlcXVlc3RlZCBieSBNaWNoYWVsIFR1ZXhlbiA8TWljaGFlbC5UdWV4ZW5AbHVyY2hpLmZyYW5rZW4uZGU+LgotICovCi0jZGVmaW5lIERMVF9TQ1RQCQkyNDgKLQotLyoKLSAqIFVTQiBwYWNrZXRzLCBiZWdpbm5pbmcgd2l0aCBhIFVTQlBjYXAgaGVhZGVyLgotICoKLSAqIFJlcXVlc3RlZCBieSBUb21hc3ogTW9uIDxkZXNvd2luQGdtYWlsLmNvbT4KLSAqLwotI2RlZmluZSBETFRfVVNCUENBUAkJMjQ5Ci0KLS8qCi0gKiBTY2h3ZWl0emVyIEVuZ2luZWVyaW5nIExhYm9yYXRvcmllcyAiUlRBQyIgcHJvZHVjdCBzZXJpYWwtbGluZQotICogcGFja2V0cy4KLSAqCi0gKiBSZXF1ZXN0ZWQgYnkgQ2hyaXMgQm9udGplIDxjaHJpc19ib250amVAc2VsaW5jLmNvbT4uCi0gKi8KLSNkZWZpbmUgRExUX1JUQUNfU0VSSUFMCQkyNTAKLQotLyoKLSAqIEJsdWV0b290aCBMb3cgRW5lcmd5IGFpciBpbnRlcmZhY2UgbGluay1sYXllciBwYWNrZXRzLgotICoKLSAqIFJlcXVlc3RlZCBieSBNaWtlIEtlcnNoYXcgPGRyYWdvcm5Aa2lzbWV0d2lyZWxlc3MubmV0Pi4KLSAqLwotI2RlZmluZSBETFRfQkxVRVRPT1RIX0xFX0xMCTI1MQotCi0vKgotICogRExUIHR5cGUgZm9yIHVwcGVyLXByb3RvY29sIGxheWVyIFBEVSBzYXZlcyBmcm9tIHdpcmVzaGFyay4KLSAqCi0gKiB0aGUgYWN0dWFsIGNvbnRlbnRzIGFyZSBkZXRlcm1pbmVkIGJ5IHR3byBUQUdzIHN0b3JlZCB3aXRoIGVhY2gKLSAqIHBhY2tldDoKLSAqICAgRVhQX1BEVV9UQUdfTElOS1RZUEUgICAgICAgICAgdGhlIGxpbmsgdHlwZSAoTElOS1RZUEVfIHZhbHVlKSBvZiB0aGUKLSAqCQkJCSAgIG9yaWdpbmFsIHBhY2tldC4KLSAqCi0gKiAgIEVYUF9QRFVfVEFHX1BST1RPX05BTUUgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB3aXJlc2hhcmsgZGlzc2VjdG9yCi0gKiAJCQkJICAgdGhhdCBjYW4gbWFrZSBzZW5zZSBvZiB0aGUgZGF0YSBzdG9yZWQuCi0gKi8KLSNkZWZpbmUgRExUX1dJUkVTSEFSS19VUFBFUl9QRFUJMjUyCi0KLS8qCi0gKiBETFQgdHlwZSBmb3IgdGhlIG5ldGxpbmsgcHJvdG9jb2wgKG5sbW9uIGRldmljZXMpLgotICovCi0jZGVmaW5lIERMVF9ORVRMSU5LCQkyNTMKLQotLyoKLSAqIEJsdWV0b290aCBMaW51eCBNb25pdG9yIGhlYWRlcnMgZm9yIHRoZSBCbHVlWiBzdGFjay4KLSAqLwotI2RlZmluZSBETFRfQkxVRVRPT1RIX0xJTlVYX01PTklUT1IJMjU0Ci0KLS8qCi0gKiBCbHVldG9vdGggQmFzaWMgUmF0ZS9FbmhhbmNlZCBEYXRhIFJhdGUgYmFzZWJhbmQgcGFja2V0cywgYXMKLSAqIGNhcHR1cmVkIGJ5IFViZXJ0b290aC4KLSAqLwotI2RlZmluZSBETFRfQkxVRVRPT1RIX0JSRURSX0JCCTI1NQotCi0vKgotICogQmx1ZXRvb3RoIExvdyBFbmVyZ3kgbGluayBsYXllciBwYWNrZXRzLCBhcyBjYXB0dXJlZCBieSBVYmVydG9vdGguCi0gKi8KLSNkZWZpbmUgRExUX0JMVUVUT09USF9MRV9MTF9XSVRIX1BIRFIJMjU2Ci0KLS8qCi0gKiBQUk9GSUJVUyBkYXRhIGxpbmsgbGF5ZXIuCi0gKi8KLSNkZWZpbmUgRExUX1BST0ZJQlVTX0RMCQkyNTcKLQotLyoKLSAqIEFwcGxlJ3MgRExUX1BLVEFQIGhlYWRlcnMuCi0gKgotICogU2FkbHksIHRoZSBmb2xrcyBhdCBBcHBsZSBlaXRoZXIgaGFkIG5vIGNsdWUgdGhhdCB0aGUgRExUX1VTRVJuIHZhbHVlcwotICogYXJlIGZvciBpbnRlcm5hbCB1c2Ugd2l0aGluIGFuIG9yZ2FuaXphdGlvbiBhbmQgcGFydG5lcnMgb25seSwgYW5kCi0gKiBkaWRuJ3Qga25vdyB0aGF0IHRoZSByaWdodCB3YXkgdG8gZ2V0IGEgbGluay1sYXllciBoZWFkZXIgdHlwZSBpcyB0bwotICogYXNrIHRjcGR1bXAub3JnIGZvciBvbmUsIG9yIGtuZXcgYW5kIGRpZG4ndCBjYXJlLCBzbyB0aGV5IGp1c3QKLSAqIHVzZWQgRExUX1VTRVIyLCB3aGljaCBjYXVzZXMgcHJvYmxlbXMgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0IGZvcgotICogdGhlaXIgdmVyc2lvbiBvZiB0Y3BkdW1wLgotICoKLSAqIFNvIEknbGwganVzdCBnaXZlIHRoZW0gb25lOyBob3BlZnVsbHkgdGhpcyB3aWxsIHNob3cgdXAgaW4gYQotICogbGlicGNhcCByZWxlYXNlIGluIHRpbWUgZm9yIHRoZW0gdG8gZ2V0IHRoaXMgaW50byAxMC4xMCBCaWcgU3VyCi0gKiBvciB3aGF0ZXZlciBNYXZlcmlja3MnIHN1Y2Nlc3NvciBpcyBjYWxsZWQuICBMSU5LVFlQRV9QS1RBUAotICogd2lsbCBiZSAyNTggKmV2ZW4gb24gT1MgWCo7IHRoYXQgaXMgKmludGVudGlvbmFsKiwgc28gdGhhdAotICogUEtUQVAgZmlsZXMgbG9vayB0aGUgc2FtZSBvbiAqYWxsKiBPU2VzIChkaWZmZXJlbnQgT1NlcyBjYW4gaGF2ZQotICogZGlmZmVyZW50IG51bWVyaWNhbCB2YWx1ZXMgZm9yIGEgZ2l2ZW4gRExUXywgYnV0ICpNVVNUIE5PVCogaGF2ZQotICogZGlmZmVyZW50IHZhbHVlcyBmb3Igd2hhdCBnb2VzIGluIGEgZmlsZSwgYXMgZmlsZXMgY2FuIGJlIG1vdmVkCi0gKiBiZXR3ZWVuIE9TZXMhKS4KLSAqCi0gKiBXaGVuIGNhcHR1cmluZywgb24gYSBzeXN0ZW0gd2l0aCBhIERhcndpbi1iYXNlZCBPUywgb24gYSBkZXZpY2UKLSAqIHRoYXQgcmV0dXJucyAxNDkgKERMVF9VU0VSMiBhbmQgQXBwbGUncyBETFRfUEtUQVApIHdpdGggdGhpcwotICogdmVyc2lvbiBvZiBsaWJwY2FwLCB0aGUgRExUXyB2YWx1ZSBmb3IgdGhlIHBjYXBfdCAgd2lsbCBiZSBETFRfUEtUQVAsCi0gKiBhbmQgdGhhdCB3aWxsIGNvbnRpbnVlIHRvIGJlIERMVF9VU0VSMiBvbiBEYXJ3aW4tYmFzZWQgT1Nlcy4gVGhhdCB3YXksCi0gKiBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIE1hdmVyaWNrcyBpcyBwcmVzZXJ2ZWQgZm9yIHByb2dyYW1zIHVzaW5nCi0gKiB0aGlzIHZlcnNpb24gb2YgbGlicGNhcC4gIFRoaXMgZG9lcyBtZWFuIHRoYXQgaWYgeW91IHdlcmUgdXNpbmcKLSAqIERMVF9VU0VSMiBmb3Igc29tZSBjYXB0dXJlIGRldmljZSBvbiBPUyBYLCB5b3UgY2FuJ3QgZG8gc28gd2l0aAotICogdGhpcyB2ZXJzaW9uIG9mIGxpYnBjYXAsIGp1c3QgYXMgeW91IGNhbid0IHdpdGggQXBwbGUncyBsaWJwY2FwIC0KLSAqIG9uIE9TIFgsIHRoZXkgZGVmaW5lIERMVF9QS1RBUCB0byBiZSBETFRfVVNFUjIsIHNvIHByb2dyYW1zIHdvbid0Ci0gKiBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gUEtUQVAgYW5kIHdoYXRldmVyIHlvdSB3ZXJlIHVzaW5nCi0gKiBETFRfVVNFUjIgZm9yLgotICoKLSAqIElmIHRoZSBwcm9ncmFtIHNhdmVzIHRoZSBjYXB0dXJlIHRvIGEgZmlsZSB1c2luZyB0aGlzIHZlcnNpb24gb2YKLSAqIGxpYnBjYXAncyBwY2FwX2R1bXAgY29kZSwgdGhlIExJTktUWVBFXyB2YWx1ZSBpbiB0aGUgZmlsZSB3aWxsIGJlCi0gKiBMSU5LVFlQRV9QS1RBUCwgd2hpY2ggd2lsbCBiZSAyNTgsIGV2ZW4gb24gRGFyd2luLWJhc2VkIE9TZXMuCi0gKiBUaGF0IHdheSwgdGhlIGZpbGUgd2lsbCAqbm90KiBiZSBhIERMVF9VU0VSMiBmaWxlLiAgVGhhdCBtZWFucwotICogdGhhdCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGNwZHVtcCwgd2hlbiBidWlsdCB3aXRoIHRoaXMgdmVyc2lvbgotICogb2YgbGlicGNhcCwgYW5kIHN1ZmZpY2llbnRseSByZWNlbnQgdmVyc2lvbnMgb2YgV2lyZXNoYXJrIHdpbGwKLSAqIGJlIGFibGUgdG8gcmVhZCB0aG9zZSBmaWxlcyBhbmQgaW50ZXJwcmV0IHRoZW0gY29ycmVjdGx5OyBob3dldmVyLAotICogQXBwbGUncyB2ZXJzaW9uIG9mIHRjcGR1bXAgaW4gT1MgWCAxMC45IHdvbid0IGJlIGFibGUgdG8gaGFuZGxlCi0gKiB0aGVtLiAgKEhvcGVmdWxseSwgQXBwbGUgd2lsbCBwaWNrIHVwIHRoaXMgdmVyc2lvbiBvZiBsaWJwY2FwLAotICogYW5kIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gb2YgdGNwZHVtcCwgc28gdGhhdCB0Y3BkdW1wIHdpbGwKLSAqIGJlIGFibGUgdG8gaGFuZGxlIHRoZSBvbGQgTElOS1RZUEVfVVNFUjIgY2FwdHVyZXMgKmFuZCogdGhlIG5ldwotICogTElOS1RZUEVfUEtUQVAgY2FwdHVyZXMuKQotICovCi0jaWZkZWYgX19BUFBMRV9fCi0jZGVmaW5lIERMVF9QS1RBUAlETFRfVVNFUjIKLSNlbHNlCi0jZGVmaW5lIERMVF9QS1RBUAkyNTgKLSNlbmRpZgotCi0vKgotICogRXRoZXJuZXQgcGFja2V0cyBwcmVjZWRlZCBieSBhIGhlYWRlciBnaXZpbmcgdGhlIGxhc3QgNiBvY3RldHMKLSAqIG9mIHRoZSBwcmVhbWJsZSBzcGVjaWZpZWQgYnkgODAyLjMtMjAxMiBDbGF1c2UgNjUsIHNlY3Rpb24KLSAqIDY1LjEuMy4yICJUcmFuc21pdCIuCi0gKi8KLSNkZWZpbmUgRExUX0VQT04JMjU5Ci0KLS8qCi0gKiBJUE1JIHRyYWNlIHBhY2tldHMsIGFzIHNwZWNpZmllZCBieSBUYWJsZSAzLTIwICJUcmFjZSBEYXRhIEJsb2NrIEZvcm1hdCIKLSAqIGluIHRoZSBQSUNNRyBIUE0uMiBzcGVjaWZpY2F0aW9uLgotICovCi0jZGVmaW5lIERMVF9JUE1JX0hQTV8yCTI2MAotCi0vKgotICogcGVyICBKb3NodWEgV3JpZ2h0IDxqd3JpZ2h0QGhhc2JvcmcuY29tPiwgZm9ybWF0cyBmb3IgWndhdmUgY2FwdHVyZXMuCi0gKi8KLSNkZWZpbmUgRExUX1pXQVZFX1IxX1IyICAyNjEKLSNkZWZpbmUgRExUX1pXQVZFX1IzICAgICAyNjIKLQotLyoKLSAqIHBlciBTdGV2ZSBLYXJnIDxza2FyZ0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LCBmb3JtYXRzIGZvciBXYXR0c3RvcHBlcgotICogRGlnaXRhbCBMaWdodGluZyBNYW5hZ2VtZW50IHJvb20gYnVzIHNlcmlhbCBwcm90b2NvbCBjYXB0dXJlcy4KLSAqLwotI2RlZmluZSBETFRfV0FUVFNUT1BQRVJfRExNICAgICAyNjMKLQotI2RlZmluZSBETFRfTUFUQ0hJTkdfTUFYCTI2MwkvKiBoaWdoZXN0IHZhbHVlIGluIHRoZSAibWF0Y2hpbmciIHJhbmdlICovCi0KLS8qCi0gKiBETFQgYW5kIHNhdmVmaWxlIGxpbmsgdHlwZSB2YWx1ZXMgYXJlIHNwbGl0IGludG8gYSBjbGFzcyBhbmQKLSAqIGEgbWVtYmVyIG9mIHRoYXQgY2xhc3MuICBBIGNsYXNzIHZhbHVlIG9mIDAgaW5kaWNhdGVzIGEgcmVndWxhcgotICogRExUXy9MSU5LVFlQRV8gdmFsdWUuCi0gKi8KLSNkZWZpbmUgRExUX0NMQVNTKHgpCQkoKHgpICYgMHgwM2ZmMDAwMCkKLQotLyoKLSAqIE5ldEJTRC1zcGVjaWZpYyBnZW5lcmljICJyYXciIGxpbmsgdHlwZS4gIFRoZSBjbGFzcyB2YWx1ZSBpbmRpY2F0ZXMKLSAqIHRoYXQgdGhpcyBpcyB0aGUgZ2VuZXJpYyByYXcgdHlwZSwgYW5kIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0aGUKLSAqIGFkZHJlc3MgZmFtaWx5IHdlJ3JlIGRlYWxpbmcgd2l0aC4gIFRob3NlIHZhbHVlcyBhcmUgTmV0QlNELXNwZWNpZmljOwotICogZG8gbm90IGFzc3VtZSB0aGF0IHRoZXkgY29ycmVzcG9uZCB0byBBRl8gdmFsdWVzIGZvciB5b3VyIG9wZXJhdGluZwotICogc3lzdGVtLgotICovCi0jZGVmaW5lCURMVF9DTEFTU19ORVRCU0RfUkFXQUYJMHgwMjI0MDAwMAotI2RlZmluZQlETFRfTkVUQlNEX1JBV0FGKGFmKQkoRExUX0NMQVNTX05FVEJTRF9SQVdBRiB8IChhZikpCi0jZGVmaW5lCURMVF9ORVRCU0RfUkFXQUZfQUYoeCkJKCh4KSAmIDB4MDAwMGZmZmYpCi0jZGVmaW5lCURMVF9JU19ORVRCU0RfUkFXQUYoeCkJKERMVF9DTEFTUyh4KSA9PSBETFRfQ0xBU1NfTkVUQlNEX1JBV0FGKQotCisjaW5jbHVkZSA8cGNhcC9kbHQuaD4KIAogLyoKICAqIFRoZSBpbnN0cnVjdGlvbiBlbmNvZGluZ3MuCkBAIC0xNDg5LDIxICsyNTUsMTcgQEAKIC8qCiAgKiBNYWNyb3MgZm9yIGluc24gYXJyYXkgaW5pdGlhbGl6ZXJzLgogICovCi0jaWZuZGVmIEJQRl9TVE1UCiAjZGVmaW5lIEJQRl9TVE1UKGNvZGUsIGspIHsgKHVfc2hvcnQpKGNvZGUpLCAwLCAwLCBrIH0KLSNlbmRpZgotI2lmbmRlZiBCUEZfSlVNUAogI2RlZmluZSBCUEZfSlVNUChjb2RlLCBrLCBqdCwgamYpIHsgKHVfc2hvcnQpKGNvZGUpLCBqdCwgamYsIGsgfQotI2VuZGlmCiAKICNpZiBfX1NURENfXyB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuIGludCBicGZfdmFsaWRhdGUoY29uc3Qgc3RydWN0IGJwZl9pbnNuICosIGludCk7Ci1leHRlcm4gdV9pbnQgYnBmX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX2luc24gKiwgY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7CitQQ0FQX0FQSSBpbnQgYnBmX3ZhbGlkYXRlKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqLCBpbnQpOworUENBUF9BUEkgdV9pbnQgYnBmX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX2luc24gKiwgY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7CiBleHRlcm4gdV9pbnQgYnBmX2ZpbHRlcl93aXRoX2F1eF9kYXRhKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50LCBjb25zdCBzdHJ1Y3QgYnBmX2F1eF9kYXRhICopOwogI2Vsc2UKLWV4dGVybiBpbnQgYnBmX3ZhbGlkYXRlKCk7Ci1leHRlcm4gdV9pbnQgYnBmX2ZpbHRlcigpOwotZXh0ZXJuIHVfaW50IGJwZl9maWx0ZXIoKTsKK1BDQVBfQVBJIGludCBicGZfdmFsaWRhdGUoKTsKK1BDQVBfQVBJIHVfaW50IGJwZl9maWx0ZXIoKTsKK2V4dGVybiB1X2ludCBicGZfZmlsdGVyX3dpdGhfYXV4X2RhdGEoKTsKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvV2luMzIvU3JjL2Zmcy5jIGIvcGNhcC9jYW5fc29ja2V0Y2FuLmgKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gV2luMzIvU3JjL2Zmcy5jCnJlbmFtZSB0byBwY2FwL2Nhbl9zb2NrZXRjYW4uaAppbmRleCAwOTlmZjhlLi42OGQyYTEzIDEwMDY0NAotLS0gYS9XaW4zMi9TcmMvZmZzLmMKKysrIGIvcGNhcC9jYW5fc29ja2V0Y2FuLmgKQEAgLTEsNyArMSwxMiBAQAogLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTMKKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwogICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgU3RhbmZvcmQvQ01VIGVuZXQgcGFja2V0IGZpbHRlciwKKyAqIChuZXQvZW5ldC5jKSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIDQuM0JTRCwgYW5kIGNvZGUgY29udHJpYnV0ZWQKKyAqIHRvIEJlcmtlbGV5IGJ5IFN0ZXZlbiBNY0Nhbm5lIGFuZCBWYW4gSmFjb2Jzb24gYm90aCBvZiBMYXdyZW5jZQorICogQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICogYXJlIG1ldDoKQEAgLTEyLDggKzE3LDggQEAKICAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKICAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgogICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCkBAIC0zMSwyNCArMzYsMTkgQEAKICAqIFNVQ0ggREFNQUdFLgogICovCiAKLSNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKLXN0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylmZnMuYwk4LjEgKEJlcmtlbGV5KSA2LzQvOTMiOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmbmRlZiBsaWJfcGNhcF9jYW5fc29ja2V0Y2FuX2gKKyNkZWZpbmUgbGliX3BjYXBfY2FuX3NvY2tldGNhbl9oCiAKIC8qCi0gKiBmZnMgLS0gdmF4IGZmcyBpbnN0cnVjdGlvbgorICogU29ja2V0Q0FOIGhlYWRlciwgYXMgcGVyIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYW4udHh0IGluIHRoZQorICogTGludXggc291cmNlLgogICovCi1pbnQKLWZmcyhtYXNrKQotCXJlZ2lzdGVyIGludCBtYXNrOwotewotCXJlZ2lzdGVyIGludCBiaXQ7Cit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQzMl90IGNhbl9pZDsKKwl1X2ludDhfdCBwYXlsb2FkX2xlbmd0aDsKKwl1X2ludDhfdCBwYWQ7CisJdV9pbnQ4X3QgcmVzZXJ2ZWQxOworCXVfaW50OF90IHJlc2VydmVkMjsKK30gcGNhcF9jYW5fc29ja2V0Y2FuX2hkcjsKIAotCWlmIChtYXNrID09IDApCi0JCXJldHVybigwKTsKLQlmb3IgKGJpdCA9IDE7ICEobWFzayAmIDEpOyBiaXQrKykKLQkJbWFzayA+Pj0gMTsKLQlyZXR1cm4oYml0KTsKLX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGNhcC9kbHQuaCBiL3BjYXAvZGx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3NDcxMwotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAvZGx0LmgKQEAgLTAsMCArMSwxMzQwIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgU3RhbmZvcmQvQ01VIGVuZXQgcGFja2V0IGZpbHRlciwKKyAqIChuZXQvZW5ldC5jKSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIDQuM0JTRCwgYW5kIGNvZGUgY29udHJpYnV0ZWQKKyAqIHRvIEJlcmtlbGV5IGJ5IFN0ZXZlbiBNY0Nhbm5lIGFuZCBWYW4gSmFjb2Jzb24gYm90aCBvZiBMYXdyZW5jZQorICogQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAgICAgIEAoIylicGYuaCAgICAgICA3LjEgKEJlcmtlbGV5KSA1LzcvOTEKKyAqLworCisjaWZuZGVmIGxpYl9wY2FwX2RsdF9oCisjZGVmaW5lIGxpYl9wY2FwX2RsdF9oCisKKy8qCisgKiBMaW5rLWxheWVyIGhlYWRlciB0eXBlIGNvZGVzLgorICoKKyAqIERvICpOT1QqIGFkZCBuZXcgdmFsdWVzIHRvIHRoaXMgbGlzdCB3aXRob3V0IGFza2luZworICogInRjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZyIgZm9yIGEgdmFsdWUuICBPdGhlcndpc2UsIHlvdSBydW4KKyAqIHRoZSByaXNrIG9mIHVzaW5nIGEgdmFsdWUgdGhhdCdzIGFscmVhZHkgYmVpbmcgdXNlZCBmb3Igc29tZSBvdGhlcgorICogcHVycG9zZSwgYW5kIG9mIGhhdmluZyB0b29scyB0aGF0IHJlYWQgbGlicGNhcC1mb3JtYXQgY2FwdHVyZXMgbm90CisgKiBiZWluZyBhYmxlIHRvIGhhbmRsZSBjYXB0dXJlcyB3aXRoIHlvdXIgbmV3IERMVF8gdmFsdWUsIHdpdGggbm8gaG9wZQorICogdGhhdCB0aGV5IHdpbGwgZXZlciBiZSBjaGFuZ2VkIHRvIGRvIHNvIChhcyB0aGF0IHdvdWxkIGRlc3Ryb3kgdGhlaXIKKyAqIGFiaWxpdHkgdG8gcmVhZCBjYXB0dXJlcyB1c2luZyB0aGF0IHZhbHVlIGZvciB0aGF0IG90aGVyIHB1cnBvc2UpLgorICoKKyAqIFNlZQorICoKKyAqCWh0dHA6Ly93d3cudGNwZHVtcC5vcmcvbGlua3R5cGVzLmh0bWwKKyAqCisgKiBmb3IgZGV0YWlsZWQgZGVzY3JpcHRpb25zIG9mIHNvbWUgb2YgdGhlc2UgbGluay1sYXllciBoZWFkZXIgdHlwZXMuCisgKi8KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgdHlwZXMgdGhhdCBhcmUgdGhlIHNhbWUgb24gYWxsIHBsYXRmb3JtcywgYW5kIHRoYXQKKyAqIGhhdmUgYmVlbiBkZWZpbmVkIGJ5IDxuZXQvYnBmLmg+IGZvciBhZ2VzLgorICovCisjZGVmaW5lIERMVF9OVUxMCTAJLyogQlNEIGxvb3BiYWNrIGVuY2Fwc3VsYXRpb24gKi8KKyNkZWZpbmUgRExUX0VOMTBNQgkxCS8qIEV0aGVybmV0ICgxME1iKSAqLworI2RlZmluZSBETFRfRU4zTUIJMgkvKiBFeHBlcmltZW50YWwgRXRoZXJuZXQgKDNNYikgKi8KKyNkZWZpbmUgRExUX0FYMjUJMwkvKiBBbWF0ZXVyIFJhZGlvIEFYLjI1ICovCisjZGVmaW5lIERMVF9QUk9ORVQJNAkvKiBQcm90ZW9uIFByb05FVCBUb2tlbiBSaW5nICovCisjZGVmaW5lIERMVF9DSEFPUwk1CS8qIENoYW9zICovCisjZGVmaW5lIERMVF9JRUVFODAyCTYJLyogODAyLjUgVG9rZW4gUmluZyAqLworI2RlZmluZSBETFRfQVJDTkVUCTcJLyogQVJDTkVULCB3aXRoIEJTRC1zdHlsZSBoZWFkZXIgKi8KKyNkZWZpbmUgRExUX1NMSVAJOAkvKiBTZXJpYWwgTGluZSBJUCAqLworI2RlZmluZSBETFRfUFBQCQk5CS8qIFBvaW50LXRvLXBvaW50IFByb3RvY29sICovCisjZGVmaW5lIERMVF9GRERJCTEwCS8qIEZEREkgKi8KKworLyoKKyAqIFRoZXNlIGFyZSB0eXBlcyB0aGF0IGFyZSBkaWZmZXJlbnQgb24gc29tZSBwbGF0Zm9ybXMsIGFuZCB0aGF0CisgKiBoYXZlIGJlZW4gZGVmaW5lZCBieSA8bmV0L2JwZi5oPiBmb3IgYWdlcy4gIFdlIHVzZSAjaWZkZWZzIHRvCisgKiBkZXRlY3QgdGhlIEJTRHMgdGhhdCBkZWZpbmUgdGhlbSBkaWZmZXJlbnRseSBmcm9tIHRoZSB0cmFkaXRpb25hbAorICogbGlicGNhcCA8bmV0L2JwZi5oPgorICoKKyAqIFhYWCAtIERMVF9BVE1fUkZDMTQ4MyBpcyAxMyBpbiBCU0QvT1MsIGFuZCBETFRfUkFXIGlzIDE0IGluIEJTRC9PUywKKyAqIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB0aGUgcmlnaHQgI2RlZmluZSBpcyBmb3IgQlNEL09TLgorICovCisjZGVmaW5lIERMVF9BVE1fUkZDMTQ4MwkxMQkvKiBMTEMtZW5jYXBzdWxhdGVkIEFUTSAqLworCisjaWZkZWYgX19PcGVuQlNEX18KKyNkZWZpbmUgRExUX1JBVwkJMTQJLyogcmF3IElQICovCisjZWxzZQorI2RlZmluZSBETFRfUkFXCQkxMgkvKiByYXcgSVAgKi8KKyNlbmRpZgorCisvKgorICogR2l2ZW4gdGhhdCB0aGUgb25seSBPUyB0aGF0IGN1cnJlbnRseSBnZW5lcmF0ZXMgQlNEL09TIFNMSVAgb3IgUFBQCisgKiBpcywgd2VsbCwgQlNEL09TLCBhcmd1YWJseSBldmVyeWJvZHkgc2hvdWxkIGhhdmUgY2hvc2VuIGl0cyB2YWx1ZXMKKyAqIGZvciBETFRfU0xJUF9CU0RPUyBhbmQgRExUX1BQUF9CU0RPUywgd2hpY2ggYXJlIDE1IGFuZCAxNiwgYnV0IHRoZXkKKyAqIGRpZG4ndC4gIFNvIGl0IGdvZXMuCisgKi8KKyNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisjaWZuZGVmIERMVF9TTElQX0JTRE9TCisjZGVmaW5lIERMVF9TTElQX0JTRE9TCTEzCS8qIEJTRC9PUyBTZXJpYWwgTGluZSBJUCAqLworI2RlZmluZSBETFRfUFBQX0JTRE9TCTE0CS8qIEJTRC9PUyBQb2ludC10by1wb2ludCBQcm90b2NvbCAqLworI2VuZGlmCisjZWxzZQorI2RlZmluZSBETFRfU0xJUF9CU0RPUwkxNQkvKiBCU0QvT1MgU2VyaWFsIExpbmUgSVAgKi8KKyNkZWZpbmUgRExUX1BQUF9CU0RPUwkxNgkvKiBCU0QvT1MgUG9pbnQtdG8tcG9pbnQgUHJvdG9jb2wgKi8KKyNlbmRpZgorCisvKgorICogMTcgd2FzIHVzZWQgZm9yIERMVF9QRkxPRyBpbiBPcGVuQlNEOyBpdCBubyBsb25nZXIgaXMuCisgKgorICogSXQgd2FzIERMVF9MQU5FODAyMyBpbiBTdVNFIDYuMywgc28gd2UgZGVmaW5lZCBMSU5LVFlQRV9QRkxPRworICogYXMgMTE3IHNvIHRoYXQgcGZsb2cgY2FwdHVyZXMgd291bGQgdXNlIGEgbGluay1sYXllciBoZWFkZXIgdHlwZQorICogdmFsdWUgdGhhdCBkaWRuJ3QgY29sbGlkZSB3aXRoIGFueSBvdGhlciB2YWx1ZXMuICBPbiBhbGwKKyAqIHBsYXRmb3JtcyBvdGhlciB0aGFuIE9wZW5CU0QsIHdlIGRlZmluZWQgRExUX1BGTE9HIGFzIDExNywKKyAqIGFuZCB3ZSBtYXBwZWQgYmV0d2VlbiBMSU5LVFlQRV9QRkxPRyBhbmQgRExUX1BGTE9HLgorICoKKyAqIE9wZW5CU0QgZXZlbnR1YWxseSBzd2l0Y2hlZCB0byB1c2luZyAxMTcgZm9yIERMVF9QRkxPRyBhcyB3ZWxsLgorICoKKyAqIERvbid0IHVzZSAxNyBmb3IgYW55dGhpbmcgZWxzZS4KKyAqLworCisvKgorICogMTggaXMgdXNlZCBmb3IgRExUX1BGU1lOQyBpbiBPcGVuQlNELCBOZXRCU0QsIERyYWdvbkZseSBCU0QgYW5kCisgKiBNYWMgT1MgWDsgZG9uJ3QgdXNlIGl0IGZvciBhbnl0aGluZyBlbHNlLiAgKEZyZWVCU0QgdXNlcyAxMjEsCisgKiB3aGljaCBjb2xsaWRlcyB3aXRoIERMVF9ISERMQywgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCB1c2UgMTgKKyAqIGZvciBhbnl0aGluZyBhbmQgZG9lc24ndCBhcHBlYXIgdG8gaGF2ZSBldmVyIHVzZWQgaXQgZm9yIGFueXRoaW5nLikKKyAqCisgKiBXZSBkZWZpbmUgaXQgYXMgMTggb24gdGhvc2UgcGxhdGZvcm1zOyBpdCBpcywgdW5mb3J0dW5hdGVseSwgdXNlZAorICogZm9yIERMVF9DSVAgaW4gU3VzZSA2LjMsIHNvIHdlIGRvbid0IGRlZmluZSBpdCBhcyBETFRfUEZTWU5DCisgKiBpbiBnZW5lcmFsLiAgQXMgdGhlIHBhY2tldCBmb3JtYXQgZm9yIGl0LCBsaWtlIHRoYXQgZm9yCisgKiBETFRfUEZMT0csIGlzIG5vdCBvbmx5IE9TLWRlcGVuZGVudCBidXQgT1MtdmVyc2lvbi1kZXBlbmRlbnQsCisgKiB3ZSBkb24ndCBzdXBwb3J0IHByaW50aW5nIGl0IGluIHRjcGR1bXAgZXhjZXB0IG9uIE9TZXMgdGhhdAorICogaGF2ZSB0aGUgcmVsZXZhbnQgaGVhZGVyIGZpbGVzLCBzbyBpdCdzIG5vdCB0aGF0IHVzZWZ1bCBvbgorICogb3RoZXIgcGxhdGZvcm1zLgorICovCisjaWYgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pIHx8IGRlZmluZWQoX19BUFBMRV9fKQorI2RlZmluZSBETFRfUEZTWU5DCTE4CisjZW5kaWYKKworI2RlZmluZSBETFRfQVRNX0NMSVAJMTkJLyogTGludXggQ2xhc3NpY2FsLUlQIG92ZXIgQVRNICovCisKKy8qCisgKiBBcHBhcmVudGx5IFJlZGJhY2sgdXNlcyB0aGlzIGZvciBpdHMgU21hcnRFZGdlIDQwMC84MDAuICBJIGhvcGUKKyAqIG5vYm9keSBlbHNlIGRlY2lkZWQgdG8gdXNlIGl0LCB0b28uCisgKi8KKyNkZWZpbmUgRExUX1JFREJBQ0tfU01BUlRFREdFCTMyCisKKy8qCisgKiBUaGVzZSB2YWx1ZXMgYXJlIGRlZmluZWQgYnkgTmV0QlNEOyBvdGhlciBwbGF0Zm9ybXMgc2hvdWxkIHJlZnJhaW4gZnJvbQorICogdXNpbmcgdGhlbSBmb3Igb3RoZXIgcHVycG9zZXMsIHNvIHRoYXQgTmV0QlNEIHNhdmVmaWxlcyB3aXRoIGxpbmsKKyAqIHR5cGVzIG9mIDUwIG9yIDUxIGNhbiBiZSByZWFkIGFzIHRoaXMgdHlwZSBvbiBhbGwgcGxhdGZvcm1zLgorICovCisjZGVmaW5lIERMVF9QUFBfU0VSSUFMCTUwCS8qIFBQUCBvdmVyIHNlcmlhbCB3aXRoIEhETEMgZW5jYXBzdWxhdGlvbiAqLworI2RlZmluZSBETFRfUFBQX0VUSEVSCTUxCS8qIFBQUCBvdmVyIEV0aGVybmV0ICovCisKKy8qCisgKiBUaGUgQXhlbnQgUmFwdG9yIGZpcmV3YWxsIC0gbm93IHRoZSBTeW1hbnRlYyBFbnRlcnByaXNlIEZpcmV3YWxsIC0gdXNlcworICogYSBsaW5rLWxheWVyIHR5cGUgb2YgOTkgZm9yIHRoZSB0Y3BkdW1wIGl0IHN1cHBsaWVzLiAgVGhlIGxpbmstbGF5ZXIKKyAqIGhlYWRlciBoYXMgNiBieXRlcyBvZiB1bmtub3duIGRhdGEsIHNvbWV0aGluZyB0aGF0IGFwcGVhcnMgdG8gYmUgYW4KKyAqIEV0aGVybmV0IHR5cGUsIGFuZCAzNiBieXRlcyB0aGF0IGFwcGVhciB0byBiZSAwIGluIGF0IGxlYXN0IG9uZSBjYXB0dXJlCisgKiBJJ3ZlIHNlZW4uCisgKi8KKyNkZWZpbmUgRExUX1NZTUFOVEVDX0ZJUkVXQUxMCTk5CisKKy8qCisgKiBWYWx1ZXMgYmV0d2VlbiAxMDAgYW5kIDEwMyBhcmUgdXNlZCBpbiBjYXB0dXJlIGZpbGUgaGVhZGVycyBhcworICogbGluay1sYXllciBoZWFkZXIgdHlwZSBMSU5LVFlQRV8gdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gRExUXyB0eXBlcworICogdGhhdCBkaWZmZXIgYmV0d2VlbiBwbGF0Zm9ybXM7IGRvbid0IHVzZSB0aG9zZSB2YWx1ZXMgZm9yIG5ldyBETFRfCisgKiBuZXcgdHlwZXMuCisgKi8KKworLyoKKyAqIFZhbHVlcyBzdGFydGluZyB3aXRoIDEwNCBhcmUgdXNlZCBmb3IgbmV3bHktYXNzaWduZWQgbGluay1sYXllcgorICogaGVhZGVyIHR5cGUgdmFsdWVzOyBmb3IgdGhvc2UgbGluay1sYXllciBoZWFkZXIgdHlwZXMsIHRoZSBETFRfCisgKiB2YWx1ZSByZXR1cm5lZCBieSBwY2FwX2RhdGFsaW5rKCkgYW5kIHBhc3NlZCB0byBwY2FwX29wZW5fZGVhZCgpLAorICogYW5kIHRoZSBMSU5LVFlQRV8gdmFsdWUgdGhhdCBhcHBlYXJzIGluIGNhcHR1cmUgZmlsZXMsIGFyZSB0aGUKKyAqIHNhbWUuCisgKgorICogRExUX01BVENISU5HX01JTiBpcyB0aGUgbG93ZXN0IHN1Y2ggdmFsdWU7IERMVF9NQVRDSElOR19NQVggaXMKKyAqIHRoZSBoaWdoZXN0IHN1Y2ggdmFsdWUuCisgKi8KKyNkZWZpbmUgRExUX01BVENISU5HX01JTgkxMDQKKworLyoKKyAqIFRoaXMgdmFsdWUgd2FzIGRlZmluZWQgYnkgbGlicGNhcCAwLjU7IHBsYXRmb3JtcyB0aGF0IGhhdmUgZGVmaW5lZAorICogaXQgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBzaG91bGQgZGVmaW5lIGl0IGhlcmUgd2l0aCB0aGF0IHZhbHVlIC0KKyAqIGEgbGluayB0eXBlIG9mIDEwNCBpbiBhIHNhdmUgZmlsZSB3aWxsIGJlIG1hcHBlZCB0byBETFRfQ19IRExDLAorICogd2hhdGV2ZXIgdmFsdWUgdGhhdCBoYXBwZW5zIHRvIGJlLCBzbyBwcm9ncmFtcyB3aWxsIGNvcnJlY3RseQorICogaGFuZGxlIGZpbGVzIHdpdGggdGhhdCBsaW5rIHR5cGUgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YKKyAqIERMVF9DX0hETEMuCisgKgorICogVGhlIG5hbWUgRExUX0NfSERMQyB3YXMgdXNlZCBieSBCU0QvT1M7IHdlIHVzZSB0aGF0IG5hbWUgZm9yIHNvdXJjZQorICogY29tcGF0aWJpbGl0eSB3aXRoIHByb2dyYW1zIHdyaXR0ZW4gZm9yIEJTRC9PUy4KKyAqCisgKiBsaWJwY2FwIDAuNSBkZWZpbmVkIGl0IGFzIERMVF9DSERMQzsgd2UgZGVmaW5lIERMVF9DSERMQyBhcyB3ZWxsLAorICogZm9yIHNvdXJjZSBjb21wYXRpYmlsaXR5IHdpdGggcHJvZ3JhbXMgd3JpdHRlbiBmb3IgbGlicGNhcCAwLjUuCisgKi8KKyNkZWZpbmUgRExUX0NfSERMQwkxMDQJLyogQ2lzY28gSERMQyAqLworI2RlZmluZSBETFRfQ0hETEMJRExUX0NfSERMQworCisjZGVmaW5lIERMVF9JRUVFODAyXzExCTEwNQkvKiBJRUVFIDgwMi4xMSB3aXJlbGVzcyAqLworCisvKgorICogMTA2IGlzIHJlc2VydmVkIGZvciBMaW51eCBDbGFzc2ljYWwgSVAgb3ZlciBBVE07IGl0J3MgbGlrZSBETFRfUkFXLAorICogZXhjZXB0IHdoZW4gaXQgaXNuJ3QuICAoSS5lLiwgc29tZXRpbWVzIGl0J3MganVzdCByYXcgSVAsIGFuZAorICogc29tZXRpbWVzIGl0IGlzbid0LikgIFdlIGN1cnJlbnRseSBoYW5kbGUgaXQgYXMgRExUX0xJTlVYX1NMTCwKKyAqIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgbGluay1sYXllciBoZWFkZXIuKQorICovCisKKy8qCisgKiBGcmFtZSBSZWxheTsgQlNEL09TIGhhcyBhIERMVF9GUiB3aXRoIGEgdmFsdWUgb2YgMTEsIGJ1dCB0aGF0IGNvbGxpZGVzCisgKiB3aXRoIG90aGVyIHZhbHVlcy4KKyAqIERMVF9GUiBhbmQgRExUX0ZSRUxBWSBwYWNrZXRzIHN0YXJ0IHdpdGggdGhlIFEuOTIyIEZyYW1lIFJlbGF5IGhlYWRlcgorICogKERMQ0ksIGV0Yy4pLgorICovCisjZGVmaW5lIERMVF9GUkVMQVkJMTA3CisKKy8qCisgKiBPcGVuQlNEIERMVF9MT09QLCBmb3IgbG9vcGJhY2sgZGV2aWNlczsgaXQncyBsaWtlIERMVF9OVUxMLCBleGNlcHQKKyAqIHRoYXQgdGhlIEFGXyB0eXBlIGluIHRoZSBsaW5rLWxheWVyIGhlYWRlciBpcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKgorICogRExUX0xPT1AgaXMgMTIgaW4gT3BlbkJTRCwgYnV0IHRoYXQncyBETFRfUkFXIGluIG90aGVyIE9TZXMsIHNvCisgKiB3ZSBkb24ndCB1c2UgMTIgZm9yIGl0IGluIE9TZXMgb3RoZXIgdGhhbiBPcGVuQlNELgorICovCisjaWZkZWYgX19PcGVuQlNEX18KKyNkZWZpbmUgRExUX0xPT1AJMTIKKyNlbHNlCisjZGVmaW5lIERMVF9MT09QCTEwOAorI2VuZGlmCisKKy8qCisgKiBFbmNhcHN1bGF0ZWQgcGFja2V0cyBmb3IgSVBzZWM7IERMVF9FTkMgaXMgMTMgaW4gT3BlbkJTRCwgYnV0IHRoYXQncworICogRExUX1NMSVBfQlNET1MgaW4gTmV0QlNELCBzbyB3ZSBkb24ndCB1c2UgMTMgZm9yIGl0IGluIE9TZXMgb3RoZXIKKyAqIHRoYW4gT3BlbkJTRC4KKyAqLworI2lmZGVmIF9fT3BlbkJTRF9fCisjZGVmaW5lIERMVF9FTkMJCTEzCisjZWxzZQorI2RlZmluZSBETFRfRU5DCQkxMDkKKyNlbmRpZgorCisvKgorICogVmFsdWVzIGJldHdlZW4gMTEwIGFuZCAxMTIgYXJlIHJlc2VydmVkIGZvciB1c2UgaW4gY2FwdHVyZSBmaWxlIGhlYWRlcnMKKyAqIGFzIGxpbmstbGF5ZXIgdHlwZXMgY29ycmVzcG9uZGluZyB0byBETFRfIHR5cGVzIHRoYXQgbWlnaHQgZGlmZmVyCisgKiBiZXR3ZWVuIHBsYXRmb3JtczsgZG9uJ3QgdXNlIHRob3NlIHZhbHVlcyBmb3IgbmV3IERMVF8gdHlwZXMKKyAqIG90aGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgRExUXyB0eXBlcy4KKyAqLworCisvKgorICogVGhpcyBpcyBmb3IgTGludXggY29va2VkIHNvY2tldHMuCisgKi8KKyNkZWZpbmUgRExUX0xJTlVYX1NMTAkxMTMKKworLyoKKyAqIEFwcGxlIExvY2FsVGFsayBoYXJkd2FyZS4KKyAqLworI2RlZmluZSBETFRfTFRBTEsJMTE0CisKKy8qCisgKiBBY29ybiBFY29uZXQuCisgKi8KKyNkZWZpbmUgRExUX0VDT05FVAkxMTUKKworLyoKKyAqIFJlc2VydmVkIGZvciB1c2Ugd2l0aCBPcGVuQlNEIGlwZmlsdGVyLgorICovCisjZGVmaW5lIERMVF9JUEZJTFRFUgkxMTYKKworLyoKKyAqIE9wZW5CU0QgRExUX1BGTE9HLgorICovCisjZGVmaW5lIERMVF9QRkxPRwkxMTcKKworLyoKKyAqIFJlZ2lzdGVyZWQgZm9yIENpc2NvLWludGVybmFsIHVzZS4KKyAqLworI2RlZmluZSBETFRfQ0lTQ09fSU9TCTExOAorCisvKgorICogRm9yIDgwMi4xMSBjYXJkcyB1c2luZyB0aGUgUHJpc20gSUkgY2hpcHMsIHdpdGggYSBsaW5rLWxheWVyCisgKiBoZWFkZXIgaW5jbHVkaW5nIFByaXNtIG1vbml0b3IgbW9kZSBpbmZvcm1hdGlvbiBwbHVzIGFuIDgwMi4xMQorICogaGVhZGVyLgorICovCisjZGVmaW5lIERMVF9QUklTTV9IRUFERVIJMTE5CisKKy8qCisgKiBSZXNlcnZlZCBmb3IgQWlyb25ldCA4MDIuMTEgY2FyZHMsIHdpdGggYW4gQWlyb25ldCBsaW5rLWxheWVyIGhlYWRlcgorICogKHNlZSBEb3VnIEFtYnJpc2tvJ3MgRnJlZUJTRCBwYXRjaGVzKS4KKyAqLworI2RlZmluZSBETFRfQUlST05FVF9IRUFERVIJMTIwCisKKy8qCisgKiBTaWdoLgorICoKKyAqIDEyMSB3YXMgcmVzZXJ2ZWQgZm9yIFNpZW1lbnMgSGlQYXRoIEhETEMgb24gMjAwMi0wMS0yNSwgYXMKKyAqIHJlcXVlc3RlZCBieSBUb21hcyBLdWtvc2EuCisgKgorICogT24gMjAwNC0wMi0yNSwgYSBGcmVlQlNEIGNoZWNraW4gdG8gc3lzL25ldC9icGYuaCB3YXMgbWFkZSB0aGF0CisgKiBhc3NpZ25lZCAxMjEgYXMgRExUX1BGU1lOQy4gIEluIGN1cnJlbnQgdmVyc2lvbnMsIGl0cyBsaWJwY2FwCisgKiBkb2VzIERMVF8gPC0+IExJTktUWVBFXyBtYXBwaW5nLCBtYXBwaW5nIERMVF9QRlNZTkMgdG8gYQorICogTElOS1RZUEVfUEZTWU5DIHZhbHVlIG9mIDI0Niwgc28gaXQgc2hvdWxkIHdyaXRlIG91dCBETFRfUEZTWU5DCisgKiBkdW1wIGZpbGVzIHdpdGggMjQ2IGFzIHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlLiAgKEVhcmxpZXIKKyAqIHZlcnNpb25zIG1pZ2h0IG5vdCBoYXZlIGRvbmUgbWFwcGluZywgaW4gd2hpY2ggY2FzZSB0aGV5IHdvdWxkCisgKiBoYXZlIHdyaXR0ZW4gdGhlbSBvdXQgd2l0aCBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgb2YgMTIxLikKKyAqCisgKiBPcGVuQlNELCBmcm9tIHdoaWNoIHBmIGNhbWUsIGhvd2V2ZXIsIHVzZXMgMTggZm9yIERMVF9QRlNZTkM7CisgKiBpdHMgbGlicGNhcCBkb2VzIG5vIERMVF8gPC0+IExJTktUWVBFXyBtYXBwaW5nLCBzbyBpdCB3b3VsZAorICogd3JpdGUgb3V0IERMVF9QRlNZTkMgZHVtcCBmaWxlcyB3aXRoIHVzZSAxOCBhcyB0aGUgbGluay1sYXllcgorICogaGVhZGVyIHR5cGUuCisgKgorICogTmV0QlNELCBEcmFnb25GbHkgQlNELCBhbmQgRGFyd2luIGFsc28gdXNlIDE4IGZvciBETFRfUEZTWU5DOyBpbgorICogY3VycmVudCB2ZXJzaW9ucywgdGhlaXIgbGlicGNhcHMgZG8gRExUXyA8LT4gTElOS1RZUEVfIG1hcHBpbmcsCisgKiBtYXBwaW5nIERMVF9QRlNZTkMgdG8gYSBMSU5LVFlQRV9QRlNZTkMgdmFsdWUgb2YgMjQ2LCBzbyB0aGV5CisgKiBzaG91bGQgd3JpdGUgb3V0IERMVF9QRlNZTkMgZHVtcCBmaWxlcyB3aXRoIDI0NiBhcyB0aGUgbGluay1sYXllcgorICogaGVhZGVyIHR5cGUuICAoRWFybGllciB2ZXJzaW9ucyBtaWdodCBub3QgaGF2ZSBkb25lIG1hcHBpbmcsCisgKiBpbiB3aGljaCBjYXNlIHRoZXknZCB3b3JrIHRoZSBzYW1lIHdheSBPcGVuQlNEIGRvZXMsIHdyaXRpbmcKKyAqIHRoZW0gb3V0IHdpdGggYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIG9mIDE4LikKKyAqCisgKiBXZSdsbCBkZWZpbmUgRExUX1BGU1lOQyBhczoKKyAqCisgKiAgICAxOCBvbiBOZXRCU0QsIE9wZW5CU0QsIERyYWdvbkZseSBCU0QsIGFuZCBEYXJ3aW47CisgKgorICogICAgMTIxIG9uIEZyZWVCU0Q7CisgKgorICogICAgMjQ2IGV2ZXJ5d2hlcmUgZWxzZS4KKyAqCisgKiBXZSdsbCBkZWZpbmUgRExUX0hIRExDIGFzIDEyMSBvbiBldmVyeXRoaW5nIGV4Y2VwdCBmb3IgRnJlZUJTRDsKKyAqIGFueWJvZHkgd2hvIHdhbnRzIHRvIGNvbXBpbGUsIG9uIEZyZWVCU0QsIGNvZGUgdGhhdCB1c2VzIERMVF9ISERMQworICogaXMgb3V0IG9mIGx1Y2suCisgKgorICogV2UnbGwgZGVmaW5lIExJTktUWVBFX1BGU1lOQyBhcyAyNDYgb24gKmFsbCogcGxhdGZvcm1zLCBzbyB0aGF0CisgKiBzYXZlZmlsZXMgd3JpdHRlbiB1c2luZyAqdGhpcyogY29kZSB3b24ndCB1c2UgMTggb3IgMTIxIGZvciBQRlNZTkMsCisgKiB0aGV5J2xsIGFsbCB1c2UgMjQ2LgorICoKKyAqIENvZGUgdGhhdCB1c2VzIHBjYXBfZGF0YWxpbmsoKSB0byBkZXRlcm1pbmUgdGhlIGxpbmstbGF5ZXIgaGVhZGVyCisgKiB0eXBlIG9mIGEgc2F2ZWZpbGUgd29uJ3QsIHdoZW4gYnVpbHQgYW5kIHJ1biBvbiBGcmVlQlNELCBiZSBhYmxlCisgKiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIExJTktUWVBFX1BGU1lOQyBhbmQgTElOS1RZUEVfSEhETEMgY2FwdHVyZQorICogZmlsZXMsIGFzIHBjYXBfZGF0YWxpbmsoKSB3aWxsIGdpdmUgMTIxIGZvciBib3RoIG9mIHRoZW0uICBDb2RlCisgKiB0aGF0IGRvZXNuJ3QsIHN1Y2ggYXMgdGhlIGNvZGUgaW4gV2lyZXNoYXJrLCB3aWxsIGJlIGFibGUgdG8KKyAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlbS4KKyAqCisgKiBGcmVlQlNEJ3MgbGlicGNhcCB3b24ndCBtYXAgYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIG9mIDE4IC0gaS5lLiwKKyAqIERMVF9QRlNZTkMgZmlsZXMgZnJvbSBPcGVuQlNEIGFuZCBwb3NzaWJseSBvbGRlciB2ZXJzaW9ucyBvZiBOZXRCU0QsCisgKiBEcmFnb25GbHkgQlNELCBhbmQgT1MgWCAtIHRvIERMVF9QRlNZTkMsIHNvIGNvZGUgYnVpbHQgd2l0aCBGcmVlQlNEJ3MKKyAqIGxpYnBjYXAgd29uJ3QgdHJlYXQgdGhvc2UgZmlsZXMgYXMgRExUX1BGU1lOQyBmaWxlcy4KKyAqCisgKiBPdGhlciBsaWJwY2FwcyB3b24ndCBtYXAgYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIG9mIDEyMSB0byBETFRfUEZTWU5DOworICogdGhpcyBtZWFucyB0aGV5IGNhbiByZWFkIERMVF9ISERMQyBmaWxlcywgaWYgYW55IGV4aXN0LCBidXQgd29uJ3QKKyAqIHRyZWF0IHBjYXAgZmlsZXMgd3JpdHRlbiBieSBhbnkgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCBsaWJwY2FwIHRoYXQKKyAqIGRpZG4ndCBtYXAgdG8gMjQ2IGFzIERMVF9QRlNZTkMgZmlsZXMuCisgKi8KKyNpZmRlZiBfX0ZyZWVCU0RfXworI2RlZmluZSBETFRfUEZTWU5DCQkxMjEKKyNlbHNlCisjZGVmaW5lIERMVF9ISERMQwkJMTIxCisjZW5kaWYKKworLyoKKyAqIFRoaXMgaXMgZm9yIFJGQyAyNjI1IElQLW92ZXItRmlicmUgQ2hhbm5lbC4KKyAqCisgKiBUaGlzIGlzIG5vdCBmb3IgdXNlIHdpdGggcmF3IEZpYnJlIENoYW5uZWwsIHdoZXJlIHRoZSBsaW5rLWxheWVyCisgKiBoZWFkZXIgc3RhcnRzIHdpdGggYSBGaWJyZSBDaGFubmVsIGZyYW1lIGhlYWRlcjsgaXQncyBmb3IgSVAtb3Zlci1GQywKKyAqIHdoZXJlIHRoZSBsaW5rLWxheWVyIGhlYWRlciBzdGFydHMgd2l0aCBhbiBSRkMgMjYyNSBOZXR3b3JrX0hlYWRlcgorICogZmllbGQuCisgKi8KKyNkZWZpbmUgRExUX0lQX09WRVJfRkMJCTEyMgorCisvKgorICogVGhpcyBpcyBmb3IgRnVsbCBGcm9udGFsIEFUTSBvbiBTb2xhcmlzIHdpdGggU3VuQVRNLCB3aXRoIGEKKyAqIHBzZXVkby1oZWFkZXIgZm9sbG93ZWQgYnkgYW4gQUFMbiBQRFUuCisgKgorICogVGhlcmUgbWF5IGJlIG90aGVyIGZvcm1zIG9mIEZ1bGwgRnJvbnRhbCBBVE0gb24gb3RoZXIgT1NlcywKKyAqIHdpdGggZGlmZmVyZW50IHBzZXVkby1oZWFkZXJzLgorICoKKyAqIElmIEFUTSBzb2Z0d2FyZSByZXR1cm5zIGEgcHNldWRvLWhlYWRlciB3aXRoIFZQSS9WQ0kgaW5mb3JtYXRpb24KKyAqIChhbmQsIGlkZWFsbHksIHBhY2tldCB0eXBlIGluZm9ybWF0aW9uLCBlLmcuIHNpZ25hbGxpbmcsIElMTUksCisgKiBMQU5FLCBMTEMtbXVsdGlwbGV4ZWQgdHJhZmZpYywgZXRjLiksIGl0IHNob3VsZCBub3QgdXNlCisgKiBETFRfQVRNX1JGQzE0ODMsIGJ1dCBzaG91bGQgZ2V0IGEgbmV3IERMVF8gdmFsdWUsIHNvIHRjcGR1bXAKKyAqIGFuZCB0aGUgbGlrZSBkb24ndCBoYXZlIHRvIGluZmVyIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIGEKKyAqIHBzZXVkby1oZWFkZXIgYW5kIHRoZSBmb3JtIG9mIHRoZSBwc2V1ZG8taGVhZGVyLgorICovCisjZGVmaW5lIERMVF9TVU5BVE0JCTEyMwkvKiBTb2xhcmlzK1N1bkFUTSAqLworCisvKgorICogUmVzZXJ2ZWQgYXMgcGVyIHJlcXVlc3QgZnJvbSBLZW50IERhaGxncmVuIDxrZW50QHByYWVzdW0uY29tPgorICogZm9yIHByaXZhdGUgdXNlLgorICovCisjZGVmaW5lIERMVF9SSU8gICAgICAgICAgICAgICAgIDEyNCAgICAgLyogUmFwaWRJTyAqLworI2RlZmluZSBETFRfUENJX0VYUCAgICAgICAgICAgICAxMjUgICAgIC8qIFBDSSBFeHByZXNzICovCisjZGVmaW5lIERMVF9BVVJPUkEgICAgICAgICAgICAgIDEyNiAgICAgLyogWGlsaW54IEF1cm9yYSBsaW5rIGxheWVyICovCisKKy8qCisgKiBIZWFkZXIgZm9yIDgwMi4xMSBwbHVzIGEgbnVtYmVyIG9mIGJpdHMgb2YgbGluay1sYXllciBpbmZvcm1hdGlvbgorICogaW5jbHVkaW5nIHJhZGlvIGluZm9ybWF0aW9uLCB1c2VkIGJ5IHNvbWUgcmVjZW50IEJTRCBkcml2ZXJzIGFzCisgKiB3ZWxsIGFzIHRoZSBtYWR3aWZpIEF0aGVyb3MgZHJpdmVyIGZvciBMaW51eC4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xMV9SQURJTwkxMjcJLyogODAyLjExIHBsdXMgcmFkaW90YXAgcmFkaW8gaGVhZGVyICovCisKKy8qCisgKiBSZXNlcnZlZCBmb3IgdGhlIFRaU1AgZW5jYXBzdWxhdGlvbiwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogQ2hyaXMgV2F0ZXJzIDxjaHJpcy53YXRlcnNAbmV0d29ya2NoZW1pc3RyeS5jb20+CisgKiBUWlNQIGlzIGEgZ2VuZXJpYyBlbmNhcHN1bGF0aW9uIGZvciBhbnkgb3RoZXIgbGluayB0eXBlLAorICogd2hpY2ggaW5jbHVkZXMgYSBtZWFucyB0byBpbmNsdWRlIG1ldGEtaW5mb3JtYXRpb24KKyAqIHdpdGggdGhlIHBhY2tldCwgZS5nLiBzaWduYWwgc3RyZW5ndGggYW5kIGNoYW5uZWwKKyAqIGZvciA4MDIuMTEgcGFja2V0cy4KKyAqLworI2RlZmluZSBETFRfVFpTUCAgICAgICAgICAgICAgICAxMjggICAgIC8qIFRhem1lbiBTbmlmZmVyIFByb3RvY29sICovCisKKy8qCisgKiBCU0QncyBBUkNORVQgaGVhZGVycyBoYXZlIHRoZSBzb3VyY2UgaG9zdCwgZGVzdGluYXRpb24gaG9zdCwKKyAqIGFuZCB0eXBlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldDsgdGhhdCdzIHdoYXQncyBoYW5kZWQKKyAqIHVwIHRvIHVzZXJsYW5kIHZpYSBCUEYuCisgKgorICogTGludXgncyBBUkNORVQgaGVhZGVycywgaG93ZXZlciwgaGF2ZSBhIDItYnl0ZSBvZmZzZXQgZmllbGQKKyAqIGJldHdlZW4gdGhlIGhvc3QgSURzIGFuZCB0aGUgdHlwZTsgdGhhdCdzIHdoYXQncyBoYW5kZWQgdXAKKyAqIHRvIHVzZXJsYW5kIHZpYSBQRl9QQUNLRVQgc29ja2V0cy4KKyAqCisgKiBXZSB0aGVyZWZvcmUgaGF2ZSB0byBoYXZlIHNlcGFyYXRlIERMVF8gdmFsdWVzIGZvciB0aGVtLgorICovCisjZGVmaW5lIERMVF9BUkNORVRfTElOVVgJMTI5CS8qIEFSQ05FVCAqLworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlcywgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgRExUX3MgYXJlIHVzZWQKKyAqIGZvciBwYXNzaW5nIG9uIGNoYXNzaXMtaW50ZXJuYWwgbWV0YWluZm9ybWF0aW9uIHN1Y2ggYXMKKyAqIFFPUyBwcm9maWxlcywgZXRjLi4KKyAqLworI2RlZmluZSBETFRfSlVOSVBFUl9NTFBQUCAgICAgICAxMzAKKyNkZWZpbmUgRExUX0pVTklQRVJfTUxGUiAgICAgICAgMTMxCisjZGVmaW5lIERMVF9KVU5JUEVSX0VTICAgICAgICAgIDEzMgorI2RlZmluZSBETFRfSlVOSVBFUl9HR1NOICAgICAgICAxMzMKKyNkZWZpbmUgRExUX0pVTklQRVJfTUZSICAgICAgICAgMTM0CisjZGVmaW5lIERMVF9KVU5JUEVSX0FUTTIgICAgICAgIDEzNQorI2RlZmluZSBETFRfSlVOSVBFUl9TRVJWSUNFUyAgICAxMzYKKyNkZWZpbmUgRExUX0pVTklQRVJfQVRNMSAgICAgICAgMTM3CisKKy8qCisgKiBBcHBsZSBJUC1vdmVyLUlFRUUgMTM5NCwgYXMgcGVyIGEgcmVxdWVzdCBmcm9tIERpZXRlciBTaWVnbXVuZAorICogPGRpZXRlckBhcHBsZS5jb20+LiAgVGhlIGhlYWRlciB0aGF0J3MgcHJlc2VudGVkIGlzIGFuIEV0aGVybmV0LWxpa2UKKyAqIGhlYWRlcjoKKyAqCisgKgkjZGVmaW5lIEZJUkVXSVJFX0VVSTY0X0xFTgk4CisgKglzdHJ1Y3QgZmlyZXdpcmVfaGVhZGVyIHsKKyAqCQl1X2NoYXIgIGZpcmV3aXJlX2Rob3N0W0ZJUkVXSVJFX0VVSTY0X0xFTl07CisgKgkJdV9jaGFyICBmaXJld2lyZV9zaG9zdFtGSVJFV0lSRV9FVUk2NF9MRU5dOworICoJCXVfc2hvcnQgZmlyZXdpcmVfdHlwZTsKKyAqCX07CisgKgorICogd2l0aCAiZmlyZXdpcmVfdHlwZSIgYmVpbmcgYW4gRXRoZXJuZXQgdHlwZSB2YWx1ZSwgcmF0aGVyIHRoYW4sCisgKiBmb3IgZXhhbXBsZSwgcmF3IEdBU1AgZnJhbWVzIGJlaW5nIGhhbmRlZCB1cC4KKyAqLworI2RlZmluZSBETFRfQVBQTEVfSVBfT1ZFUl9JRUVFMTM5NAkxMzgKKworLyoKKyAqIFZhcmlvdXMgU1M3IGVuY2Fwc3VsYXRpb25zLCBhcyBwZXIgYSByZXF1ZXN0IGZyb20gSmVmZiBNb3JyaXNzCisgKiA8amVmZi5tb3JyaXNzW0FUXXVsdGljb20uY29tPiBhbmQgc3Vic2VxdWVudCBkaXNjdXNzaW9ucy4KKyAqLworI2RlZmluZSBETFRfTVRQMl9XSVRIX1BIRFIJMTM5CS8qIHBzZXVkby1oZWFkZXIgd2l0aCB2YXJpb3VzIGluZm8sIGZvbGxvd2VkIGJ5IE1UUDIgKi8KKyNkZWZpbmUgRExUX01UUDIJCTE0MAkvKiBNVFAyLCB3aXRob3V0IHBzZXVkby1oZWFkZXIgKi8KKyNkZWZpbmUgRExUX01UUDMJCTE0MQkvKiBNVFAzLCB3aXRob3V0IHBzZXVkby1oZWFkZXIgb3IgTVRQMiAqLworI2RlZmluZSBETFRfU0NDUAkJMTQyCS8qIFNDQ1AsIHdpdGhvdXQgcHNldWRvLWhlYWRlciBvciBNVFAyIG9yIE1UUDMgKi8KKworLyoKKyAqIERPQ1NJUyBNQUMgZnJhbWVzLgorICovCisjZGVmaW5lIERMVF9ET0NTSVMJCTE0MworCisvKgorICogTGludXgtSXJEQSBwYWNrZXRzLiBQcm90b2NvbCBkZWZpbmVkIGF0IGh0dHA6Ly93d3cuaXJkYS5vcmcuCisgKiBUaG9zZSBwYWNrZXRzIGluY2x1ZGUgSXJMQVAgaGVhZGVycyBhbmQgYWJvdmUgKElyTE1QLi4uKSwgYnV0CisgKiBkb24ndCBpbmNsdWRlIFBoeSBmcmFtaW5nIChTT0YvRU9GL0NSQyAmIGJ5dGUgc3R1ZmZpbmcpLCBiZWNhdXNlIFBoeQorICogZnJhbWluZyBjYW4gYmUgaGFuZGxlZCBieSB0aGUgaGFyZHdhcmUgYW5kIGRlcGVuZCBvbiB0aGUgYml0cmF0ZS4KKyAqIFRoaXMgaXMgZXhhY3RseSB0aGUgZm9ybWF0IHlvdSB3b3VsZCBnZXQgY2FwdHVyaW5nIG9uIGEgTGludXgtSXJEQQorICogaW50ZXJmYWNlIChpcmRhWCksIGJ1dCBub3Qgb24gYSByYXcgc2VyaWFsIHBvcnQuCisgKiBOb3RlIHRoZSBjYXB0dXJlIGlzIGRvbmUgaW4gIkxpbnV4LWNvb2tlZCIgbW9kZSwgc28gZWFjaCBwYWNrZXQgaW5jbHVkZQorICogYSBmYWtlIHBhY2tldCBoZWFkZXIgKHN0cnVjdCBzbGxfaGVhZGVyKS4gVGhpcyBpcyBiZWNhdXNlIElyREEgcGFja2V0CisgKiBkZWNvZGluZyBpcyBkZXBlbmRhbnQgb24gdGhlIGRpcmVjdGlvbiBvZiB0aGUgcGFja2V0IChpbmNvbW1pbmcgb3IKKyAqIG91dGdvaW5nKS4KKyAqIFdoZW4vaWYgb3RoZXIgcGxhdGZvcm0gaW1wbGVtZW50IElyREEgY2FwdHVyZSwgd2UgbWF5IHJldmlzaXQgdGhlCisgKiBpc3N1ZSBhbmQgZGVmaW5lIGEgcmVhbCBETFRfSVJEQS4uLgorICogSmVhbiBJSQorICovCisjZGVmaW5lIERMVF9MSU5VWF9JUkRBCQkxNDQKKworLyoKKyAqIFJlc2VydmVkIGZvciBJQk0gU1Agc3dpdGNoIGFuZCBJQk0gTmV4dCBGZWRlcmF0aW9uIHN3aXRjaC4KKyAqLworI2RlZmluZSBETFRfSUJNX1NQCQkxNDUKKyNkZWZpbmUgRExUX0lCTV9TTgkJMTQ2CisKKy8qCisgKiBSZXNlcnZlZCBmb3IgcHJpdmF0ZSB1c2UuICBJZiB5b3UgaGF2ZSBzb21lIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUKKyAqIHRoYXQgeW91IHdhbnQgdG8gdXNlIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbiwgd2l0aCB0aGUgY2FwdHVyZSBmaWxlcworICogdXNpbmcgdGhhdCBsaW5rLWxheWVyIGhlYWRlciB0eXBlIG5vdCBldmVyIGJlIHNlbnQgb3V0c2lkZSB5b3VyCisgKiBvcmdhbml6YXRpb24sIHlvdSBjYW4gdXNlIHRoZXNlIHZhbHVlcy4KKyAqCisgKiBObyBsaWJwY2FwIHJlbGVhc2Ugd2lsbCB1c2UgdGhlc2UgZm9yIGFueSBwdXJwb3NlLCBub3Igd2lsbCBhbnkKKyAqIHRjcGR1bXAgcmVsZWFzZSB1c2UgdGhlbSwgZWl0aGVyLgorICoKKyAqIERvICpOT1QqIHVzZSB0aGVzZSBpbiBjYXB0dXJlIGZpbGVzIHRoYXQgeW91IGV4cGVjdCBhbnlib2R5IG5vdCB1c2luZworICogeW91ciBwcml2YXRlIHZlcnNpb25zIG9mIGNhcHR1cmUtZmlsZS1yZWFkaW5nIHRvb2xzIHRvIHJlYWQ7IGluCisgKiBwYXJ0aWN1bGFyLCBkbyAqTk9UKiB1c2UgdGhlbSBpbiBwcm9kdWN0cywgb3RoZXJ3aXNlIHlvdSBtYXkgZmluZCB0aGF0CisgKiBwZW9wbGUgd29uJ3QgYmUgYWJsZSB0byB1c2UgdGNwZHVtcCwgb3Igc25vcnQsIG9yIEV0aGVyZWFsLCBvci4uLiB0bworICogcmVhZCBjYXB0dXJlIGZpbGVzIGZyb20geW91ciBmaXJld2FsbC9pbnRydXNpb24gZGV0ZWN0aW9uL3RyYWZmaWMKKyAqIG1vbml0b3JpbmcvZXRjLiBhcHBsaWFuY2UsIG9yIHdoYXRldmVyIHByb2R1Y3QgdXNlcyB0aGF0IERMVF8gdmFsdWUsCisgKiBhbmQgeW91IG1heSBhbHNvIGZpbmQgdGhhdCB0aGUgZGV2ZWxvcGVycyBvZiB0aG9zZSBhcHBsaWNhdGlvbnMgd2lsbAorICogbm90IGFjY2VwdCBwYXRjaGVzIHRvIGxldCB0aGVtIHJlYWQgdGhvc2UgZmlsZXMuCisgKgorICogQWxzbywgZG8gbm90IHVzZSB0aGVtIGlmIHNvbWVib2R5IG1pZ2h0IHNlbmQgeW91IGEgY2FwdHVyZSB1c2luZyB0aGVtCisgKiBmb3IgKnRoZWlyKiBwcml2YXRlIHR5cGUgYW5kIHRvb2xzIHVzaW5nIHRoZW0gZm9yICp5b3VyKiBwcml2YXRlIHR5cGUKKyAqIHdvdWxkIGhhdmUgdG8gcmVhZCB0aGVtLgorICoKKyAqIEluc3RlYWQsIGFzayAidGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnIiBmb3IgYSBuZXcgRExUXyB2YWx1ZSwKKyAqIGFzIHBlciB0aGUgY29tbWVudCBhYm92ZSwgYW5kIHVzZSB0aGUgdHlwZSB5b3UncmUgZ2l2ZW4uCisgKi8KKyNkZWZpbmUgRExUX1VTRVIwCQkxNDcKKyNkZWZpbmUgRExUX1VTRVIxCQkxNDgKKyNkZWZpbmUgRExUX1VTRVIyCQkxNDkKKyNkZWZpbmUgRExUX1VTRVIzCQkxNTAKKyNkZWZpbmUgRExUX1VTRVI0CQkxNTEKKyNkZWZpbmUgRExUX1VTRVI1CQkxNTIKKyNkZWZpbmUgRExUX1VTRVI2CQkxNTMKKyNkZWZpbmUgRExUX1VTRVI3CQkxNTQKKyNkZWZpbmUgRExUX1VTRVI4CQkxNTUKKyNkZWZpbmUgRExUX1VTRVI5CQkxNTYKKyNkZWZpbmUgRExUX1VTRVIxMAkJMTU3CisjZGVmaW5lIERMVF9VU0VSMTEJCTE1OAorI2RlZmluZSBETFRfVVNFUjEyCQkxNTkKKyNkZWZpbmUgRExUX1VTRVIxMwkJMTYwCisjZGVmaW5lIERMVF9VU0VSMTQJCTE2MQorI2RlZmluZSBETFRfVVNFUjE1CQkxNjIKKworLyoKKyAqIEZvciBmdXR1cmUgdXNlIHdpdGggODAyLjExIGNhcHR1cmVzIC0gZGVmaW5lZCBieSBBYnNvbHV0ZVZhbHVlCisgKiBTeXN0ZW1zIHRvIHN0b3JlIGEgbnVtYmVyIG9mIGJpdHMgb2YgbGluay1sYXllciBpbmZvcm1hdGlvbgorICogaW5jbHVkaW5nIHJhZGlvIGluZm9ybWF0aW9uOgorICoKKyAqCWh0dHA6Ly93d3cuc2hhZnRuZXQub3JnL35waXp6YS9zb2Z0d2FyZS9jYXB0dXJlZnJtLnR4dAorICoKKyAqIGJ1dCBpdCBtaWdodCBiZSB1c2VkIGJ5IHNvbWUgbm9uLUFWUyBkcml2ZXJzIG5vdyBvciBpbiB0aGUKKyAqIGZ1dHVyZS4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlMgMTYzCS8qIDgwMi4xMSBwbHVzIEFWUyByYWRpbyBoZWFkZXIgKi8KKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgRExUX3MgYXJlIHVzZWQKKyAqIGZvciBwYXNzaW5nIG9uIGNoYXNzaXMtaW50ZXJuYWwgbWV0YWluZm9ybWF0aW9uIHN1Y2ggYXMKKyAqIFFPUyBwcm9maWxlcywgZXRjLi4KKyAqLworI2RlZmluZSBETFRfSlVOSVBFUl9NT05JVE9SICAgICAxNjQKKworLyoKKyAqIEJBQ25ldCBNUy9UUCBmcmFtZXMuCisgKi8KKyNkZWZpbmUgRExUX0JBQ05FVF9NU19UUAkxNjUKKworLyoKKyAqIEFub3RoZXIgUFBQIHZhcmlhbnQgYXMgcGVyIHJlcXVlc3QgZnJvbSBLYXJzdGVuIEtlaWwgPGtrZWlsQHN1c2UuZGU+LgorICoKKyAqIFRoaXMgaXMgdXNlZCBpbiBzb21lIE9TZXMgdG8gYWxsb3cgYSBrZXJuZWwgc29ja2V0IGZpbHRlciB0byBkaXN0aW5ndWlzaAorICogYmV0d2VlbiBpbmNvbWluZyBhbmQgb3V0Z29pbmcgcGFja2V0cywgb24gYSBzb2NrZXQgaW50ZW5kZWQgdG8KKyAqIHN1cHBseSBwcHBkIHdpdGggb3V0Z29pbmcgcGFja2V0cyBzbyBpdCBjYW4gZG8gZGlhbC1vbi1kZW1hbmQgYW5kCisgKiBoYW5ndXAtb24tbGFjay1vZi1kZW1hbmQ7IGluY29taW5nIHBhY2tldHMgYXJlIGZpbHRlcmVkIG91dCBzbyB0aGV5CisgKiBkb24ndCBjYXVzZSBwcHBkIHRvIGhvbGQgdGhlIGNvbm5lY3Rpb24gdXAgKHlvdSBkb24ndCB3YW50IHJhbmRvbQorICogaW5wdXQgcGFja2V0cyBzdWNoIGFzIHBvcnQgc2NhbnMsIHBhY2tldHMgZnJvbSBvbGQgbG9zdCBjb25uZWN0aW9ucywKKyAqIGV0Yy4gdG8gZm9yY2UgdGhlIGNvbm5lY3Rpb24gdG8gc3RheSB1cCkuCisgKgorICogVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIFBQUCBoZWFkZXIgKDB4ZmYwMykgaXMgbW9kaWZpZWQgdG8gYWNjb21vZGF0ZQorICogdGhlIGRpcmVjdGlvbiAtIDB4MDAgPSBJTiwgMHgwMSA9IE9VVC4KKyAqLworI2RlZmluZSBETFRfUFBQX1BQUEQJCTE2NgorCisvKgorICogTmFtZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2Ygc29tZSBQUFAKKyAqIHNvZnR3YXJlOyBuZXcgc29mdHdhcmUgc2hvdWxkIHVzZSBETFRfUFBQX1BQUEQuCisgKi8KKyNkZWZpbmUgRExUX1BQUF9XSVRIX0RJUkVDVElPTglETFRfUFBQX1BQUEQKKyNkZWZpbmUgRExUX0xJTlVYX1BQUF9XSVRIRElSRUNUSU9OCURMVF9QUFBfUFBQRAorCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBETFRfcyBhcmUgdXNlZAorICogZm9yIHBhc3Npbmcgb24gY2hhc3Npcy1pbnRlcm5hbCBtZXRhaW5mb3JtYXRpb24gc3VjaCBhcworICogUU9TIHByb2ZpbGVzLCBjb29raWVzLCBldGMuLgorICovCisjZGVmaW5lIERMVF9KVU5JUEVSX1BQUE9FICAgICAgIDE2NworI2RlZmluZSBETFRfSlVOSVBFUl9QUFBPRV9BVE0gICAxNjgKKworI2RlZmluZSBETFRfR1BSU19MTEMJCTE2OQkvKiBHUFJTIExMQyAqLworI2RlZmluZSBETFRfR1BGX1QJCTE3MAkvKiBHUEYtVCAoSVRVLVQgRy43MDQxL1kuMTMwMykgKi8KKyNkZWZpbmUgRExUX0dQRl9GCQkxNzEJLyogR1BGLUYgKElUVS1UIEcuNzA0MS9ZLjEzMDMpICovCisKKy8qCisgKiBSZXF1ZXN0ZWQgYnkgT29sYW4gWmltbWVyIDxvekBnY29tLmNvbT4gZm9yIHVzZSBpbiBHY29tJ3MgVDEvRTEgbGluZQorICogbW9uaXRvcmluZyBlcXVpcG1lbnQuCisgKi8KKyNkZWZpbmUgRExUX0dDT01fVDFFMQkJMTcyCisjZGVmaW5lIERMVF9HQ09NX1NFUklBTAkJMTczCisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAgVGhlIERMVF8gaXMgdXNlZAorICogZm9yIGludGVybmFsIGNvbW11bmljYXRpb24gdG8gUGh5c2ljYWwgSW50ZXJmYWNlIENhcmRzIChQSUMpCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfUElDX1BFRVIgICAgMTc0CisKKy8qCisgKiBMaW5rIHR5cGVzIHJlcXVlc3RlZCBieSBHcmVnb3IgTWFpZXIgPGdyZWdvckBlbmRhY2UuY29tPiBvZiBFbmRhY2UKKyAqIE1lYXN1cmVtZW50IFN5c3RlbXMuICBUaGV5IGFkZCBhbiBFUkYgaGVhZGVyIChzZWUKKyAqIGh0dHA6Ly93d3cuZW5kYWNlLmNvbS9zdXBwb3J0L0VuZGFjZVJlY29yZEZvcm1hdC5wZGYpIGluIGZyb250IG9mCisgKiB0aGUgbGluay1sYXllciBoZWFkZXIuCisgKi8KKyNkZWZpbmUgRExUX0VSRl9FVEgJCTE3NQkvKiBFdGhlcm5ldCAqLworI2RlZmluZSBETFRfRVJGX1BPUwkJMTc2CS8qIFBhY2tldC1vdmVyLVNPTkVUICovCisKKy8qCisgKiBSZXF1ZXN0ZWQgYnkgRGFuaWVsZSBPcmxhbmRpIDxkYW5pZWxlQG9ybGFuZGkuY29tPiBmb3IgcmF3IExBUEQKKyAqIGZvciB2SVNETiAoaHR0cDovL3d3dy5vcmxhbmRpLmNvbS92aXNkbi8pLiAgSXRzIGxpbmstbGF5ZXIgaGVhZGVyCisgKiBpbmNsdWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgTEFQRCBoZWFkZXIsIHNvIGl0J3MKKyAqIG5vdCBuZWNlc3NhcmlseSBhIGdlbmVyaWMgTEFQRCBoZWFkZXIuCisgKi8KKyNkZWZpbmUgRExUX0xJTlVYX0xBUEQJCTE3NworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4KKyAqIFRoZSBETFRfIGFyZSB1c2VkIGZvciBwcmVwZW5kaW5nIG1ldGEtaW5mb3JtYXRpb24KKyAqIGxpa2UgaW50ZXJmYWNlIGluZGV4LCBpbnRlcmZhY2UgbmFtZQorICogYmVmb3JlIHN0YW5kYXJkIEV0aGVybmV0LCBQUFAsIEZyZWxheSAmIEMtSERMQyBGcmFtZXMKKyAqLworI2RlZmluZSBETFRfSlVOSVBFUl9FVEhFUiAgICAgICAxNzgKKyNkZWZpbmUgRExUX0pVTklQRVJfUFBQICAgICAgICAgMTc5CisjZGVmaW5lIERMVF9KVU5JUEVSX0ZSRUxBWSAgICAgIDE4MAorI2RlZmluZSBETFRfSlVOSVBFUl9DSERMQyAgICAgICAxODEKKworLyoKKyAqIE11bHRpIExpbmsgRnJhbWUgUmVsYXkgKEZSRi4xNikKKyAqLworI2RlZmluZSBETFRfTUZSICAgICAgICAgICAgICAgICAxODIKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uCisgKiBUaGUgRExUXyBpcyB1c2VkIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIHdpdGggYQorICogdm9pY2UgQWRhcHRlciBDYXJkIChQSUMpCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfVlAgICAgICAgICAgMTgzCisKKy8qCisgKiBBcmluYyA0MjkgZnJhbWVzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogRXZlcnkgZnJhbWUgY29udGFpbnMgYSAzMmJpdCBBNDI5IGxhYmVsLgorICogTW9yZSBkb2N1bWVudGF0aW9uIG9uIEFyaW5jIDQyOSBjYW4gYmUgZm91bmQgYXQKKyAqIGh0dHA6Ly93d3cuY29uZG9yZW5nLmNvbS9zdXBwb3J0L2Rvd25sb2Fkcy90dXRvcmlhbHMvQVJJTkNUdXRvcmlhbC5wZGYKKyAqLworI2RlZmluZSBETFRfQTQyOSAgICAgICAgICAgICAgICAxODQKKworLyoKKyAqIEFyaW5jIDY1MyBJbnRlcnBhcnRpdGlvbiBDb21tdW5pY2F0aW9uIG1lc3NhZ2VzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBBNjUzLTEgc3RhbmRhcmQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgRExUX0E2NTNfSUNNICAgICAgICAgICAgMTg1CisKKy8qCisgKiBUaGlzIHVzZWQgdG8gYmUgIlVTQiBwYWNrZXRzLCBiZWdpbm5pbmcgd2l0aCBhIFVTQiBzZXR1cCBoZWFkZXI7CisgKiByZXF1ZXN0ZWQgYnkgUGFvbG8gQWJlbmkgPHBhb2xvLmFiZW5pQGVtYWlsLml0Pi4iCisgKgorICogSG93ZXZlciwgdGhhdCBoZWFkZXIgZGlkbid0IHdvcmsgYWxsIHRoYXQgd2VsbCAtIGl0IGxlZnQgb3V0IHNvbWUKKyAqIHVzZWZ1bCBpbmZvcm1hdGlvbiAtIGFuZCB3YXMgYWJhbmRvbmVkIGluIGZhdm9yIG9mIHRoZSBETFRfVVNCX0xJTlVYCisgKiBoZWFkZXIuCisgKgorICogVGhpcyBpcyBub3cgdXNlZCBieSBGcmVlQlNEIGZvciBpdHMgQlBGIHRhcHMgZm9yIFVTQjsgdGhhdCBoYXMgaXRzCisgKiBvd24gaGVhZGVycy4gIFNvIGl0IGlzIHdyaXR0ZW4sIHNvIGl0IGlzIGRvbmUuCisgKgorICogRm9yIHNvdXJjZS1jb2RlIGNvbXBhdGliaWxpdHksIHdlIGFsc28gZGVmaW5lIERMVF9VU0IgdG8gaGF2ZSB0aGlzCisgKiB2YWx1ZS4gIFdlIGRvIGl0IG51bWVyaWNhbGx5IHNvIHRoYXQsIGlmIGNvZGUgdGhhdCBpbmNsdWRlcyB0aGlzCisgKiBmaWxlIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBhbHNvIGluY2x1ZGVzIGFuIE9TIGhlYWRlciB0aGF0IGFsc28KKyAqIGRlZmluZXMgRExUX1VTQiBhcyAxODYsIHdlIGRvbid0IGdldCBhIHJlZGVmaW5pdGlvbiB3YXJuaW5nLgorICogKE5ldEJTRCA3IGRvZXMgdGhhdC4pCisgKi8KKyNkZWZpbmUgRExUX1VTQl9GUkVFQlNECQkxODYKKyNkZWZpbmUgRExUX1VTQgkJCTE4NgorCisvKgorICogQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllciAocGFydCBIOjQpOyByZXF1ZXN0ZWQgYnkKKyAqIFBhb2xvIEFiZW5pLgorICovCisjZGVmaW5lIERMVF9CTFVFVE9PVEhfSENJX0g0CTE4NworCisvKgorICogSUVFRSA4MDIuMTYgTUFDIENvbW1vbiBQYXJ0IFN1YmxheWVyOyByZXF1ZXN0ZWQgYnkgTWFyaWEgQ3J1egorICogPGNydXpfcGV0YWdheUBiYWguY29tPi4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xNl9NQUNfQ1BTCTE4OAorCisvKgorICogVVNCIHBhY2tldHMsIGJlZ2lubmluZyB3aXRoIGEgTGludXggVVNCIGhlYWRlcjsgcmVxdWVzdGVkIGJ5CisgKiBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+LgorICovCisjZGVmaW5lIERMVF9VU0JfTElOVVgJCTE4OQorCisvKgorICogQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgKENBTikgdi4gMi4wQiBwYWNrZXRzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogVXNlZCB0byBkdW1wIENBTiBwYWNrZXRzIGNvbWluZyBmcm9tIGEgQ0FOIFZlY3RvciBib2FyZC4KKyAqIE1vcmUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgQ0FOIHYyLjBCIGZyYW1lcyBjYW4gYmUgZm91bmQgYXQKKyAqIGh0dHA6Ly93d3cuY2FuLWNpYS5vcmcvZG93bmxvYWRzLz8yNjkKKyAqLworI2RlZmluZSBETFRfQ0FOMjBCICAgICAgICAgICAgICAxOTAKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIHdpdGggYWRkcmVzcyBmaWVsZHMgcGFkZGVkLCBhcyBpcyBkb25lIGJ5IExpbnV4CisgKiBkcml2ZXJzOyByZXF1ZXN0ZWQgYnkgSnVlcmdlbiBTY2hpbW1lci4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xNV80X0xJTlVYCTE5MQorCisvKgorICogUGVyIFBhY2tldCBJbmZvcm1hdGlvbiBlbmNhcHN1bGF0ZWQgcGFja2V0cy4KKyAqIERMVF8gcmVxdWVzdGVkIGJ5IEdpYW5sdWNhIFZhcmVubmkgPGdpYW5sdWNhLnZhcmVubmlAY2FjZXRlY2guY29tPi4KKyAqLworI2RlZmluZSBETFRfUFBJCQkJMTkyCisKKy8qCisgKiBIZWFkZXIgZm9yIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXIgcGx1cyBhIHJhZGlvdGFwIHJhZGlvIGhlYWRlcjsKKyAqIHJlcXVlc3RlZCBieSBDaGFybGVzIENsYW5jeS4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xNl9NQUNfQ1BTX1JBRElPCTE5MworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4KKyAqIFRoZSBETFRfIGlzIHVzZWQgZm9yIGludGVybmFsIGNvbW11bmljYXRpb24gd2l0aCBhCisgKiBpbnRlZ3JhdGVkIHNlcnZpY2UgbW9kdWxlIChJU00pLgorICovCisjZGVmaW5lIERMVF9KVU5JUEVSX0lTTSAgICAgICAgIDE5NAorCisvKgorICogSUVFRSA4MDIuMTUuNCwgZXhhY3RseSBhcyBpdCBhcHBlYXJzIGluIHRoZSBzcGVjIChubyBwYWRkaW5nLCBubworICogbm90aGluZyk7IHJlcXVlc3RlZCBieSBNaWtrbyBTYWFybml2YWxhIDxtaWtrby5zYWFybml2YWxhQHNlbnNpbm9kZS5jb20+LgorICogRm9yIHRoaXMgb25lLCB3ZSBleHBlY3QgdGhlIEZDUyB0byBiZSBwcmVzZW50IGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lOworICogaWYgdGhlIGZyYW1lIGhhcyBubyBGQ1MsIERMVF9JRUVFODAyXzE1XzRfTk9GQ1Mgc2hvdWxkIGJlIHVzZWQuCisgKi8KKyNkZWZpbmUgRExUX0lFRUU4MDJfMTVfNAkxOTUKKworLyoKKyAqIFZhcmlvdXMgbGluay1sYXllciB0eXBlcywgd2l0aCBhIHBzZXVkby1oZWFkZXIsIGZvciBTSVRBCisgKiAoaHR0cDovL3d3dy5zaXRhLmFlcm8vKTsgcmVxdWVzdGVkIGJ5IEZ1bGtvIEhldyAoZnVsa28uaGV3QGdtYWlsLmNvbSkuCisgKi8KKyNkZWZpbmUgRExUX1NJVEEJCTE5NgorCisvKgorICogVmFyaW91cyBsaW5rLWxheWVyIHR5cGVzLCB3aXRoIGEgcHNldWRvLWhlYWRlciwgZm9yIEVuZGFjZSBEQUcgY2FyZHM7CisgKiBlbmNhcHN1bGF0ZXMgRW5kYWNlIEVSRiByZWNvcmRzLiAgUmVxdWVzdGVkIGJ5IFN0ZXBoZW4gRG9ubmVsbHkKKyAqIDxzdGVwaGVuQGVuZGFjZS5jb20+LgorICovCisjZGVmaW5lIERMVF9FUkYJCQkxOTcKKworLyoKKyAqIFNwZWNpYWwgaGVhZGVyIHByZXBlbmRlZCB0byBFdGhlcm5ldCBwYWNrZXRzIHdoZW4gY2FwdHVyaW5nIGZyb20gYQorICogdTEwIE5ldHdvcmtzIGJvYXJkLiAgUmVxdWVzdGVkIGJ5IFBoaWwgTXVsaG9sbGFuZAorICogPHBoaWxAdTEwbmV0d29ya3MuY29tPi4KKyAqLworI2RlZmluZSBETFRfUkFJRjEJCTE5OAorCisvKgorICogSVBNQiBwYWNrZXQgZm9yIElQTUksIGJlZ2lubmluZyB3aXRoIHRoZSBJMkMgc2xhdmUgYWRkcmVzcywgZm9sbG93ZWQKKyAqIGJ5IHRoZSBuZXRGbiBhbmQgTFVOLCBldGMuLiAgUmVxdWVzdGVkIGJ5IENoYW50aHkgVG9ldW5nCisgKiA8Y2hhbnRoeS50b2V1bmdAY2Eua29udHJvbi5jb20+LgorICovCisjZGVmaW5lIERMVF9JUE1CCQkxOTkKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uCisgKiBUaGUgRExUXyBpcyB1c2VkIGZvciBjYXB0dXJpbmcgZGF0YSBvbiBhIHNlY3VyZSB0dW5uZWwgaW50ZXJmYWNlLgorICovCisjZGVmaW5lIERMVF9KVU5JUEVSX1NUICAgICAgICAgIDIwMAorCisvKgorICogQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllciAocGFydCBIOjQpLCB3aXRoIHBzZXVkby1oZWFkZXIKKyAqIHRoYXQgaW5jbHVkZXMgZGlyZWN0aW9uIGluZm9ybWF0aW9uOyByZXF1ZXN0ZWQgYnkgUGFvbG8gQWJlbmkuCisgKi8KKyNkZWZpbmUgRExUX0JMVUVUT09USF9IQ0lfSDRfV0lUSF9QSERSCTIwMQorCisvKgorICogQVguMjUgcGFja2V0IHdpdGggYSAxLWJ5dGUgS0lTUyBoZWFkZXI7IHNlZQorICoKKyAqCWh0dHA6Ly93d3cuYXgyNS5uZXQva2lzcy5odG0KKyAqCisgKiBhcyBwZXIgUmljaGFyZCBTdGVhcm4gPHJpY2hhcmRAcm5zLXN0ZWFybi5kZW1vbi5jby51az4uCisgKi8KKyNkZWZpbmUgRExUX0FYMjVfS0lTUwkJMjAyCisKKy8qCisgKiBMQVBEIHBhY2tldHMgZnJvbSBhbiBJU0ROIGNoYW5uZWwsIHN0YXJ0aW5nIHdpdGggdGhlIGFkZHJlc3MgZmllbGQsCisgKiB3aXRoIG5vIHBzZXVkby1oZWFkZXIuCisgKiBSZXF1ZXN0ZWQgYnkgVmFydW5hIERlIFNpbHZhIDx2YXJ1bmF4QGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX0xBUEQJCTIwMworCisvKgorICogVmFyaWFudHMgb2YgdmFyaW91cyBsaW5rLWxheWVyIGhlYWRlcnMsIHdpdGggYSBvbmUtYnl0ZSBkaXJlY3Rpb24KKyAqIHBzZXVkby1oZWFkZXIgcHJlcGVuZGVkIC0gemVybyBtZWFucyAicmVjZWl2ZWQgYnkgdGhpcyBob3N0IiwKKyAqIG5vbi16ZXJvIChhbnkgbm9uLXplcm8gdmFsdWUpIG1lYW5zICJzZW50IGJ5IHRoaXMgaG9zdCIgLSBhcyBwZXIKKyAqIFdpbGwgQmFya2VyIDx3LmJhcmtlckB6ZW4uY28udWs+LgorICovCisjZGVmaW5lIERMVF9QUFBfV0lUSF9ESVIJMjA0CS8qIFBQUCAtIGRvbid0IGNvbmZ1c2Ugd2l0aCBETFRfUFBQX1dJVEhfRElSRUNUSU9OICovCisjZGVmaW5lIERMVF9DX0hETENfV0lUSF9ESVIJMjA1CS8qIENpc2NvIEhETEMgKi8KKyNkZWZpbmUgRExUX0ZSRUxBWV9XSVRIX0RJUgkyMDYJLyogRnJhbWUgUmVsYXkgKi8KKyNkZWZpbmUgRExUX0xBUEJfV0lUSF9ESVIJMjA3CS8qIExBUEIgKi8KKworLyoKKyAqIDIwOCBpcyByZXNlcnZlZCBmb3IgYW4gYXMteWV0LXVuc3BlY2lmaWVkIHByb3ByaWV0YXJ5IGxpbmstbGF5ZXIKKyAqIHR5cGUsIGFzIHJlcXVlc3RlZCBieSBXaWxsIEJhcmtlci4KKyAqLworCisvKgorICogSVBNQiB3aXRoIGEgTGludXgtc3BlY2lmaWMgcHNldWRvLWhlYWRlcjsgYXMgcmVxdWVzdGVkIGJ5IEFsZXhleSBOZXltYW4KKyAqIDxhdm5AcGlnZW9ucG9pbnQuY29tPi4KKyAqLworI2RlZmluZSBETFRfSVBNQl9MSU5VWAkJMjA5CisKKy8qCisgKiBGbGV4UmF5IGF1dG9tb3RpdmUgYnVzIC0gaHR0cDovL3d3dy5mbGV4cmF5LmNvbS8gLSBhcyByZXF1ZXN0ZWQKKyAqIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgorICovCisjZGVmaW5lIERMVF9GTEVYUkFZCQkyMTAKKworLyoKKyAqIE1lZGlhIE9yaWVudGVkIFN5c3RlbXMgVHJhbnNwb3J0IChNT1NUKSBidXMgZm9yIG11bHRpbWVkaWEKKyAqIHRyYW5zcG9ydCAtIGh0dHA6Ly93d3cubW9zdGNvb3BlcmF0aW9uLmNvbS8gLSBhcyByZXF1ZXN0ZWQKKyAqIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgorICovCisjZGVmaW5lIERMVF9NT1NUCQkyMTEKKworLyoKKyAqIExvY2FsIEludGVyY29ubmVjdCBOZXR3b3JrIChMSU4pIGJ1cyBmb3IgdmVoaWNsZSBuZXR3b3JrcyAtCisgKiBodHRwOi8vd3d3Lmxpbi1zdWJidXMub3JnLyAtIGFzIHJlcXVlc3RlZCBieSBIYW5uZXMgS2FlbGJlcgorICogPGhhbm5lcy5rYWVsYmVyQHgyZS5kZT4uCisgKi8KKyNkZWZpbmUgRExUX0xJTgkJCTIxMgorCisvKgorICogWDJFLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUgdXNlZCBmb3Igc2VyaWFsIGxpbmUgY2FwdHVyZSwKKyAqIGFzIHJlcXVlc3RlZCBieSBIYW5uZXMgS2FlbGJlciA8aGFubmVzLmthZWxiZXJAeDJlLmRlPi4KKyAqLworI2RlZmluZSBETFRfWDJFX1NFUklBTAkJMjEzCisKKy8qCisgKiBYMkUtcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSB1c2VkIGZvciB0aGUgWG9yYXlhIGRhdGEgbG9nZ2VyCisgKiBmYW1pbHksIGFzIHJlcXVlc3RlZCBieSBIYW5uZXMgS2FlbGJlciA8aGFubmVzLmthZWxiZXJAeDJlLmRlPi4KKyAqLworI2RlZmluZSBETFRfWDJFX1hPUkFZQQkJMjE0CisKKy8qCisgKiBJRUVFIDgwMi4xNS40LCBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4gdGhlIHNwZWMgKG5vIHBhZGRpbmcsIG5vCisgKiBub3RoaW5nKSwgYnV0IHdpdGggdGhlIFBIWS1sZXZlbCBkYXRhIGZvciBub24tQVNLIFBIWXMgKDQgb2N0ZXRzCisgKiBvZiAwIGFzIHByZWFtYmxlLCBvbmUgb2N0ZXQgb2YgU0ZELCBvbmUgb2N0ZXQgb2YgZnJhbWUgbGVuZ3RoKworICogcmVzZXJ2ZWQgYml0LCBhbmQgdGhlbiB0aGUgTUFDLWxheWVyIGRhdGEsIHN0YXJ0aW5nIHdpdGggdGhlCisgKiBmcmFtZSBjb250cm9sIGZpZWxkKS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgTWF4IEZpbGlwcG92IDxqY212YmtiY0BnbWFpbC5jb20+LgorICovCisjZGVmaW5lIERMVF9JRUVFODAyXzE1XzRfTk9OQVNLX1BIWQkyMTUKKworLyoKKyAqIERhdmlkIEdpYnNvbiA8ZGF2aWRAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiByZXF1ZXN0ZWQgdGhpcyBmb3IKKyAqIGNhcHR1cmVzIGZyb20gdGhlIExpbnV4IGtlcm5lbCAvZGV2L2lucHV0L2V2ZW50TiBkZXZpY2VzLiBUaGlzCisgKiBpcyB1c2VkIHRvIGNvbW11bmljYXRlIGtleXN0cm9rZXMgYW5kIG1vdXNlIG1vdmVtZW50cyBmcm9tIHRoZQorICogTGludXgga2VybmVsIHRvIGRpc3BsYXkgc3lzdGVtcywgc3VjaCBhcyBYb3JnLgorICovCisjZGVmaW5lIERMVF9MSU5VWF9FVkRFVgkJMjE2CisKKy8qCisgKiBHU00gVW0gYW5kIEFiaXMgaW50ZXJmYWNlcywgcHJlY2VkZWQgYnkgYSAiZ3NtdGFwIiBoZWFkZXIuCisgKgorICogUmVxdWVzdGVkIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+LgorICovCisjZGVmaW5lIERMVF9HU01UQVBfVU0JCTIxNworI2RlZmluZSBETFRfR1NNVEFQX0FCSVMJCTIxOAorCisvKgorICogTVBMUywgd2l0aCBhbiBNUExTIGxhYmVsIGFzIHRoZSBsaW5rLWxheWVyIGhlYWRlci4KKyAqIFJlcXVlc3RlZCBieSBNaWNoZWxlIE1hcmNoZXR0byA8bWljaGVsZUBvcGVuYnNkLm9yZz4gb24gYmVoYWxmCisgKiBvZiBPcGVuQlNELgorICovCisjZGVmaW5lIERMVF9NUExTCQkyMTkKKworLyoKKyAqIFVTQiBwYWNrZXRzLCBiZWdpbm5pbmcgd2l0aCBhIExpbnV4IFVTQiBoZWFkZXIsIHdpdGggdGhlIFVTQiBoZWFkZXIKKyAqIHBhZGRlZCB0byA2NCBieXRlczsgcmVxdWlyZWQgZm9yIG1lbW9yeS1tYXBwZWQgYWNjZXNzLgorICovCisjZGVmaW5lIERMVF9VU0JfTElOVVhfTU1BUFBFRAkyMjAKKworLyoKKyAqIERFQ1QgcGFja2V0cywgd2l0aCBhIHBzZXVkby1oZWFkZXI7IHJlcXVlc3RlZCBieQorICogTWF0dGhpYXMgV2VuemVsIDx0Y3BkdW1wQG1henpvby5kZT4uCisgKi8KKyNkZWZpbmUgRExUX0RFQ1QJCTIyMQorCisvKgorICogRnJvbTogIkxpZHdhLCBFcmljIChHU0ZDLTU4Mi4wKVtTR1QgSU5DXSIgPGVyaWMubGlkd2EtMUBuYXNhLmdvdj4KKyAqIERhdGU6IE1vbiwgMTEgTWF5IDIwMDkgMTE6MTg6MzAgLTA1MDAKKyAqCisgKiBETFRfQU9TLiBXZSBuZWVkIGl0IGZvciBBT1MgU3BhY2UgRGF0YSBMaW5rIFByb3RvY29sLgorICogICBJIGhhdmUgYWxyZWFkeSB3cml0dGVuIGRpc3NlY3RvcnMgZm9yIGJ1dCBuZWVkIGFuIE9LIGZyb20KKyAqICAgbGVnYWwgYmVmb3JlIEkgY2FuIHN1Ym1pdCBhIHBhdGNoLgorICoKKyAqLworI2RlZmluZSBETFRfQU9TICAgICAgICAgICAgICAgICAyMjIKKworLyoKKyAqIFdpcmVsZXNzIEhBUlQgKEhpZ2h3YXkgQWRkcmVzc2FibGUgUmVtb3RlIFRyYW5zZHVjZXIpCisgKiBGcm9tIHRoZSBIQVJUIENvbW11bmljYXRpb24gRm91bmRhdGlvbgorICogSUVTL1BBUyA2MjU5MQorICoKKyAqIFJlcXVlc3RlZCBieSBTYW0gUm9iZXJ0cyA8dmlldXh0ZWNoQGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX1dJSEFSVAkJMjIzCisKKy8qCisgKiBGaWJyZSBDaGFubmVsIEZDLTIgZnJhbWVzLCBiZWdpbm5pbmcgd2l0aCBhIEZyYW1lX0hlYWRlci4KKyAqIFJlcXVlc3RlZCBieSBLYWhvdSBMZWkgPGthaG91ODJAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBETFRfRkNfMgkJMjI0CisKKy8qCisgKiBGaWJyZSBDaGFubmVsIEZDLTIgZnJhbWVzLCBiZWdpbm5pbmcgd2l0aCBhbiBlbmNvZGluZyBvZiB0aGUKKyAqIFNPRiwgYW5kIGVuZGluZyB3aXRoIGFuIGVuY29kaW5nIG9mIHRoZSBFT0YuCisgKgorICogVGhlIGVuY29kaW5ncyByZXByZXNlbnQgdGhlIGZyYW1lIGRlbGltaXRlcnMgYXMgNC1ieXRlIHNlcXVlbmNlcworICogcmVwcmVzZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyZWQgc2V0cywgd2l0aCBLMjguNQorICogcmVwcmVzZW50ZWQgYXMgMHhCQywgYW5kIHRoZSBEIHN5bWJvbHMgYXMgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGJ5dGUgdmFsdWVzOyBmb3IgZXhhbXBsZSwgU09GaTIsIHdoaWNoIGlzIEsyOC41IC0gRDIxLjUgLSBEMS4yIC0gRDIxLjIsCisgKiBpcyByZXByZXNlbnRlZCBhcyAweEJDIDB4QjUgMHg1NSAweDU1LgorICoKKyAqIFJlcXVlc3RlZCBieSBLYWhvdSBMZWkgPGthaG91ODJAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBETFRfRkNfMl9XSVRIX0ZSQU1FX0RFTElNUwkyMjUKKworLyoKKyAqIFNvbGFyaXMgaXBuZXQgcHNldWRvLWhlYWRlcjsgcmVxdWVzdGVkIGJ5IERhcnJlbiBSZWVkIDxEYXJyZW4uUmVlZEBTdW4uQ09NPi4KKyAqCisgKiBUaGUgcHNldWRvLWhlYWRlciBzdGFydHMgd2l0aCBhIG9uZS1ieXRlIHZlcnNpb24gbnVtYmVyOyBmb3IgdmVyc2lvbiAyLAorICogdGhlIHBzZXVkby1oZWFkZXIgaXM6CisgKgorICogc3RydWN0IGRsX2lwbmV0aW5mbyB7CisgKiAgICAgdV9pbnQ4X3QgICBkbGlfdmVyc2lvbjsKKyAqICAgICB1X2ludDhfdCAgIGRsaV9mYW1pbHk7CisgKiAgICAgdV9pbnQxNl90ICBkbGlfaHR5cGU7CisgKiAgICAgdV9pbnQzMl90ICBkbGlfcGt0bGVuOworICogICAgIHVfaW50MzJfdCAgZGxpX2lmaW5kZXg7CisgKiAgICAgdV9pbnQzMl90ICBkbGlfZ3JpZmluZGV4OworICogICAgIHVfaW50MzJfdCAgZGxpX3pzcmM7CisgKiAgICAgdV9pbnQzMl90ICBkbGlfemRzdDsKKyAqIH07CisgKgorICogZGxpX3ZlcnNpb24gaXMgMiBmb3IgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcHNldWRvLWhlYWRlci4KKyAqCisgKiBkbGlfZmFtaWx5IGlzIGEgU29sYXJpcyBhZGRyZXNzIGZhbWlseSB2YWx1ZSwgc28gaXQncyAyIGZvciBJUHY0CisgKiBhbmQgMjYgZm9yIElQdjYuCisgKgorICogZGxpX2h0eXBlIGlzIGEgImhvb2sgdHlwZSIgLSAwIGZvciBpbmNvbWluZyBwYWNrZXRzLCAxIGZvciBvdXRnb2luZworICogcGFja2V0cywgYW5kIDIgZm9yIHBhY2tldHMgYXJyaXZpbmcgZnJvbSBhbm90aGVyIHpvbmUgb24gdGhlIHNhbWUKKyAqIG1hY2hpbmUuCisgKgorICogZGxpX3BrdGxlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgZGF0YSBmb2xsb3dpbmcgdGhlIHBzZXVkby1oZWFkZXIKKyAqIChzbyB0aGUgY2FwdHVyZWQgbGVuZ3RoIG1pbnVzIGRsaV9wa3RsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIHBzZXVkby1oZWFkZXIsIGFzc3VtaW5nIHRoZSBlbnRpcmUgcHNldWRvLWhlYWRlciB3YXMgY2FwdHVyZWQpLgorICoKKyAqIGRsaV9pZmluZGV4IGlzIHRoZSBpbnRlcmZhY2UgaW5kZXggb2YgdGhlIGludGVyZmFjZSBvbiB3aGljaCB0aGUKKyAqIHBhY2tldCBhcnJpdmVkLgorICoKKyAqIGRsaV9ncmlmaW5kZXggaXMgdGhlIGdyb3VwIGludGVyZmFjZSBpbmRleCBudW1iZXIgKGZvciBJUE1QIGludGVyZmFjZXMpLgorICoKKyAqIGRsaV96c3JjIGlzIHRoZSB6b25lIGlkZW50aWZpZXIgZm9yIHRoZSBzb3VyY2Ugb2YgdGhlIHBhY2tldC4KKyAqCisgKiBkbGlfemRzdCBpcyB0aGUgem9uZSBpZGVudGlmaWVyIGZvciB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHBhY2tldC4KKyAqCisgKiBBIHpvbmUgbnVtYmVyIG9mIDAgaXMgdGhlIGdsb2JhbCB6b25lOyBhIHpvbmUgbnVtYmVyIG9mIDB4ZmZmZmZmZmYKKyAqIG1lYW5zIHRoYXQgdGhlIHBhY2tldCBhcnJpdmVkIGZyb20gYW5vdGhlciBob3N0IG9uIHRoZSBuZXR3b3JrLCBub3QKKyAqIGZyb20gYW5vdGhlciB6b25lIG9uIHRoZSBzYW1lIG1hY2hpbmUuCisgKgorICogQW4gSVB2NCBvciBJUHY2IGRhdGFncmFtIGZvbGxvd3MgdGhlIHBzZXVkby1oZWFkZXI7IGRsaV9mYW1pbHkgaW5kaWNhdGVzCisgKiB3aGljaCBvZiB0aG9zZSBpdCBpcy4KKyAqLworI2RlZmluZSBETFRfSVBORVQJCTIyNgorCisvKgorICogQ0FOIChDb250cm9sbGVyIEFyZWEgTmV0d29yaykgZnJhbWVzLCB3aXRoIGEgcHNldWRvLWhlYWRlciBhcyBzdXBwbGllZAorICogYnkgTGludXggU29ja2V0Q0FOLCBhbmQgd2l0aCBtdWx0aS1ieXRlIG51bWVyaWNhbCBmaWVsZHMgaW4gdGhhdCBoZWFkZXIKKyAqIGluIGJpZy1lbmRpYW4gYnl0ZSBvcmRlci4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2Nhbi50eHQgaW4gdGhlIExpbnV4IHNvdXJjZS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgRmVsaXggT2Jlbmh1YmVyIDxmZWxpeEBvYmVuaHViZXIuZGU+LgorICovCisjZGVmaW5lIERMVF9DQU5fU09DS0VUQ0FOCTIyNworCisvKgorICogUmF3IElQdjQvSVB2NjsgZGlmZmVyZW50IGZyb20gRExUX1JBVyBpbiB0aGF0IHRoZSBETFRfIHZhbHVlIHNwZWNpZmllcworICogd2hldGhlciBpdCdzIHY0IG9yIHY2LiAgUmVxdWVzdGVkIGJ5IERhcnJlbiBSZWVkIDxEYXJyZW4uUmVlZEBTdW4uQ09NPi4KKyAqLworI2RlZmluZSBETFRfSVBWNAkJMjI4CisjZGVmaW5lIERMVF9JUFY2CQkyMjkKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAobm8gcGFkZGluZywgbm8KKyAqIG5vdGhpbmcpLCBhbmQgd2l0aCBubyBGQ1MgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWU7IHJlcXVlc3RlZCBieQorICogSm9uIFNtaXJsIDxqb25zbWlybEBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIERMVF9JRUVFODAyXzE1XzRfTk9GQ1MJMjMwCisKKy8qCisgKiBSYXcgRC1CdXM6CisgKgorICoJaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvd2lraS9Tb2Z0d2FyZS9kYnVzCisgKgorICogbWVzc2FnZXM6CisgKgorICoJaHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNtZXNzYWdlLXByb3RvY29sLW1lc3NhZ2VzCisgKgorICogc3RhcnRpbmcgd2l0aCB0aGUgZW5kaWFubmVzcyBmbGFnLCBmb2xsb3dlZCBieSB0aGUgbWVzc2FnZSB0eXBlLCBldGMuLAorICogYnV0IHdpdGhvdXQgdGhlIGF1dGhlbnRpY2F0aW9uIGhhbmRzaGFrZSBiZWZvcmUgdGhlIG1lc3NhZ2Ugc2VxdWVuY2U6CisgKgorICoJaHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNhdXRoLXByb3RvY29sCisgKgorICogUmVxdWVzdGVkIGJ5IE1hcnRpbiBWaWRuZXIgPG1hcnRpbkB2aWRuZXIubmV0Pi4KKyAqLworI2RlZmluZSBETFRfREJVUwkJMjMxCisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LgorICovCisjZGVmaW5lIERMVF9KVU5JUEVSX1ZTCQkJMjMyCisjZGVmaW5lIERMVF9KVU5JUEVSX1NSWF9FMkUJCTIzMworI2RlZmluZSBETFRfSlVOSVBFUl9GSUJSRUNIQU5ORUwJMjM0CisKKy8qCisgKiBEVkItQ0kgKERWQiBDb21tb24gSW50ZXJmYWNlIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gYSBQQyBDYXJkCisgKiBtb2R1bGUgYW5kIGEgRFZCIHJlY2VpdmVyKS4gIFNlZQorICoKKyAqCWh0dHA6Ly93d3cua2Fpc2VyLmN4L3BjYXAtZHZiY2kuaHRtbAorICoKKyAqIGZvciB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgTWFydGluIEthaXNlciA8bWFydGluQGthaXNlci5jeD4uCisgKi8KKyNkZWZpbmUgRExUX0RWQl9DSQkJMjM1CisKKy8qCisgKiBWYXJpYW50IG9mIDNHUFAgVFMgMjcuMDEwIG11bHRpcGxleGluZyBwcm90b2NvbCAoc2ltaWxhciB0bywgYnV0CisgKiAqbm90KiB0aGUgc2FtZSBhcywgMjcuMDEwKS4gIFJlcXVlc3RlZCBieSBIYW5zLUNocmlzdG9waCBTY2hlbW1lbAorICogPGhhbnMtY2hyaXN0b3BoLnNjaGVtbWVsQGNpbnRlcmlvbi5jb20+LgorICovCisjZGVmaW5lIERMVF9NVVgyNzAxMAkJMjM2CisKKy8qCisgKiBTVEFOQUcgNTA2NiBEX1BEVXMuICBSZXF1ZXN0ZWQgYnkgTS4gQmFyaXMgRGVtaXJheQorICogPGJhcmlzZGVtaXJheUBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIERMVF9TVEFOQUdfNTA2Nl9EX1BEVQkyMzcKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfQVRNX0NFTUlDCTIzOAorCisvKgorICogTmV0RmlsdGVyIExPRyBtZXNzYWdlcworICogKHBheWxvYWQgb2YgbmV0bGluayBORk5MX1NVQlNZU19VTE9HL05GVUxOTF9NU0dfUEFDS0VUIHBhY2tldHMpCisgKgorICogUmVxdWVzdGVkIGJ5IEpha3ViIFphd2FkemtpIDxkYXJramFtZXMtd3NAZGFya2phbWVzLnBsPgorICovCisjZGVmaW5lIERMVF9ORkxPRwkJMjM5CisKKy8qCisgKiBIaWxzY2hlciBHZXNlbGxzY2hhZnQgZnVlciBTeXN0ZW1hdXRvbWF0aW9uIG1iSCBsaW5rLWxheWVyIHR5cGUKKyAqIGZvciBFdGhlcm5ldCBwYWNrZXRzIHdpdGggYSA0LWJ5dGUgcHNldWRvLWhlYWRlciBhbmQgYWx3YXlzCisgKiB3aXRoIHRoZSBwYXlsb2FkIGluY2x1ZGluZyB0aGUgRkNTLCBhcyBzdXBwbGllZCBieSB0aGVpcgorICogbmV0QU5BTFlaRVIgaGFyZHdhcmUgYW5kIHNvZnR3YXJlLgorICoKKyAqIFJlcXVlc3RlZCBieSBIb2xnZXIgUC4gRnJvbW1lciA8SFBmcm9tbWVyQGhpbHNjaGVyLmNvbT4KKyAqLworI2RlZmluZSBETFRfTkVUQU5BTFlaRVIJCTI0MAorCisvKgorICogSGlsc2NoZXIgR2VzZWxsc2NoYWZ0IGZ1ZXIgU3lzdGVtYXV0b21hdGlvbiBtYkggbGluay1sYXllciB0eXBlCisgKiBmb3IgRXRoZXJuZXQgcGFja2V0cyB3aXRoIGEgNC1ieXRlIHBzZXVkby1oZWFkZXIgYW5kIEZDUyBhbmQKKyAqIHdpdGggdGhlIEV0aGVybmV0IGhlYWRlciBwcmVjZWRlZCBieSA3IGJ5dGVzIG9mIHByZWFtYmxlIGFuZAorICogMSBieXRlIG9mIFNGRCwgYXMgc3VwcGxpZWQgYnkgdGhlaXIgbmV0QU5BTFlaRVIgaGFyZHdhcmUgYW5kCisgKiBzb2Z0d2FyZS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgSG9sZ2VyIFAuIEZyb21tZXIgPEhQZnJvbW1lckBoaWxzY2hlci5jb20+CisgKi8KKyNkZWZpbmUgRExUX05FVEFOQUxZWkVSX1RSQU5TUEFSRU5UCTI0MQorCisvKgorICogSVAtb3Zlci1JbmZpbmlCYW5kLCBhcyBzcGVjaWZpZWQgYnkgUkZDIDQzOTEuCisgKgorICogUmVxdWVzdGVkIGJ5IFBldHIgU3VtYmVyYSA8cGV0ci5zdW1iZXJhQG9yYWNsZS5jb20+LgorICovCisjZGVmaW5lIERMVF9JUE9JQgkJMjQyCisKKy8qCisgKiBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbSAoSVNPIDEzODE4LTEvSVRVLVQgSC4yMjIuMCkuCisgKgorICogUmVxdWVzdGVkIGJ5IEd1eSBNYXJ0aW4gPGdtc29mdEB0dXhpY29tYW4uYmU+LgorICovCisjZGVmaW5lIERMVF9NUEVHXzJfVFMJCTI0MworCisvKgorICogbmc0VCBHbWJIJ3MgVU1UUyBJdWIvSXVyLW92ZXItQVRNIGFuZCBJdWIvSXVyLW92ZXItSVAgZm9ybWF0IGFzCisgKiB1c2VkIGJ5IHRoZWlyIG5nNDAgcHJvdG9jb2wgdGVzdGVyLgorICoKKyAqIFJlcXVlc3RlZCBieSBKZW5zIEdyaW1tZXIgPGplbnMuZ3JpbW1lckBuZzR0LmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX05HNDAJCTI0NAorCisvKgorICogUHNldWRvLWhlYWRlciBnaXZpbmcgYWRhcHRlciBudW1iZXIgYW5kIGZsYWdzLCBmb2xsb3dlZCBieSBhbiBORkMKKyAqIChOZWFyLUZpZWxkIENvbW11bmljYXRpb25zKSBMb2dpY2FsIExpbmsgQ29udHJvbCBQcm90b2NvbCAoTExDUCkgUERVLAorICogYXMgc3BlY2lmaWVkIGJ5IE5GQyBGb3J1bSBMb2dpY2FsIExpbmsgQ29udHJvbCBQcm90b2NvbCBUZWNobmljYWwKKyAqIFNwZWNpZmljYXRpb24gTExDUCAxLjEuCisgKgorICogUmVxdWVzdGVkIGJ5IE1pa2UgV2FrZXJseSA8bWlrZXlAZ29vZ2xlLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX05GQ19MTENQCQkyNDUKKworLyoKKyAqIDI0NiBpcyB1c2VkIGFzIExJTktUWVBFX1BGU1lOQzsgZG8gbm90IHVzZSBpdCBmb3IgYW55IG90aGVyIHB1cnBvc2UuCisgKgorICogRExUX1BGU1lOQyBoYXMgZGlmZmVyZW50IHZhbHVlcyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zLCBhbmQgYWxsIG9mCisgKiB0aGVtIGNvbGxpZGUgd2l0aCBzb21ldGhpbmcgdXNlZCBlbHNld2hlcmUuICBPbiBwbGF0Zm9ybXMgdGhhdAorICogZG9uJ3QgYWxyZWFkeSBkZWZpbmUgaXQsIGRlZmluZSBpdCBhcyAyNDYuCisgKi8KKyNpZiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgIWRlZmluZWQoX19PcGVuQlNEX18pICYmICFkZWZpbmVkKF9fTmV0QlNEX18pICYmICFkZWZpbmVkKF9fRHJhZ29uRmx5X18pICYmICFkZWZpbmVkKF9fQVBQTEVfXykKKyNkZWZpbmUgRExUX1BGU1lOQwkJMjQ2CisjZW5kaWYKKworLyoKKyAqIFJhdyBJbmZpbmlCYW5kIHBhY2tldHMsIHN0YXJ0aW5nIHdpdGggdGhlIExvY2FsIFJvdXRpbmcgSGVhZGVyLgorICoKKyAqIFJlcXVlc3RlZCBieSBPcmVuIEtsYWRuaXRza3kgPG9yZW5rQG1lbGxhbm94LmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX0lORklOSUJBTkQJCTI0NworCisvKgorICogU0NUUCwgd2l0aCBubyBsb3dlci1sZXZlbCBwcm90b2NvbHMgKGkuZS4sIG5vIElQdjQgb3IgSVB2NikuCisgKgorICogUmVxdWVzdGVkIGJ5IE1pY2hhZWwgVHVleGVuIDxNaWNoYWVsLlR1ZXhlbkBsdXJjaGkuZnJhbmtlbi5kZT4uCisgKi8KKyNkZWZpbmUgRExUX1NDVFAJCTI0OAorCisvKgorICogVVNCIHBhY2tldHMsIGJlZ2lubmluZyB3aXRoIGEgVVNCUGNhcCBoZWFkZXIuCisgKgorICogUmVxdWVzdGVkIGJ5IFRvbWFzeiBNb24gPGRlc293aW5AZ21haWwuY29tPgorICovCisjZGVmaW5lIERMVF9VU0JQQ0FQCQkyNDkKKworLyoKKyAqIFNjaHdlaXR6ZXIgRW5naW5lZXJpbmcgTGFib3JhdG9yaWVzICJSVEFDIiBwcm9kdWN0IHNlcmlhbC1saW5lCisgKiBwYWNrZXRzLgorICoKKyAqIFJlcXVlc3RlZCBieSBDaHJpcyBCb250amUgPGNocmlzX2JvbnRqZUBzZWxpbmMuY29tPi4KKyAqLworI2RlZmluZSBETFRfUlRBQ19TRVJJQUwJCTI1MAorCisvKgorICogQmx1ZXRvb3RoIExvdyBFbmVyZ3kgYWlyIGludGVyZmFjZSBsaW5rLWxheWVyIHBhY2tldHMuCisgKgorICogUmVxdWVzdGVkIGJ5IE1pa2UgS2Vyc2hhdyA8ZHJhZ29ybkBraXNtZXR3aXJlbGVzcy5uZXQ+LgorICovCisjZGVmaW5lIERMVF9CTFVFVE9PVEhfTEVfTEwJMjUxCisKKy8qCisgKiBETFQgdHlwZSBmb3IgdXBwZXItcHJvdG9jb2wgbGF5ZXIgUERVIHNhdmVzIGZyb20gd2lyZXNoYXJrLgorICoKKyAqIHRoZSBhY3R1YWwgY29udGVudHMgYXJlIGRldGVybWluZWQgYnkgdHdvIFRBR3Mgc3RvcmVkIHdpdGggZWFjaAorICogcGFja2V0OgorICogICBFWFBfUERVX1RBR19MSU5LVFlQRSAgICAgICAgICB0aGUgbGluayB0eXBlIChMSU5LVFlQRV8gdmFsdWUpIG9mIHRoZQorICoJCQkJICAgb3JpZ2luYWwgcGFja2V0LgorICoKKyAqICAgRVhQX1BEVV9UQUdfUFJPVE9fTkFNRSAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHdpcmVzaGFyayBkaXNzZWN0b3IKKyAqIAkJCQkgICB0aGF0IGNhbiBtYWtlIHNlbnNlIG9mIHRoZSBkYXRhIHN0b3JlZC4KKyAqLworI2RlZmluZSBETFRfV0lSRVNIQVJLX1VQUEVSX1BEVQkyNTIKKworLyoKKyAqIERMVCB0eXBlIGZvciB0aGUgbmV0bGluayBwcm90b2NvbCAobmxtb24gZGV2aWNlcykuCisgKi8KKyNkZWZpbmUgRExUX05FVExJTksJCTI1MworCisvKgorICogQmx1ZXRvb3RoIExpbnV4IE1vbml0b3IgaGVhZGVycyBmb3IgdGhlIEJsdWVaIHN0YWNrLgorICovCisjZGVmaW5lIERMVF9CTFVFVE9PVEhfTElOVVhfTU9OSVRPUgkyNTQKKworLyoKKyAqIEJsdWV0b290aCBCYXNpYyBSYXRlL0VuaGFuY2VkIERhdGEgUmF0ZSBiYXNlYmFuZCBwYWNrZXRzLCBhcworICogY2FwdHVyZWQgYnkgVWJlcnRvb3RoLgorICovCisjZGVmaW5lIERMVF9CTFVFVE9PVEhfQlJFRFJfQkIJMjU1CisKKy8qCisgKiBCbHVldG9vdGggTG93IEVuZXJneSBsaW5rIGxheWVyIHBhY2tldHMsIGFzIGNhcHR1cmVkIGJ5IFViZXJ0b290aC4KKyAqLworI2RlZmluZSBETFRfQkxVRVRPT1RIX0xFX0xMX1dJVEhfUEhEUgkyNTYKKworLyoKKyAqIFBST0ZJQlVTIGRhdGEgbGluayBsYXllci4KKyAqLworI2RlZmluZSBETFRfUFJPRklCVVNfREwJCTI1NworCisvKgorICogQXBwbGUncyBETFRfUEtUQVAgaGVhZGVycy4KKyAqCisgKiBTYWRseSwgdGhlIGZvbGtzIGF0IEFwcGxlIGVpdGhlciBoYWQgbm8gY2x1ZSB0aGF0IHRoZSBETFRfVVNFUm4gdmFsdWVzCisgKiBhcmUgZm9yIGludGVybmFsIHVzZSB3aXRoaW4gYW4gb3JnYW5pemF0aW9uIGFuZCBwYXJ0bmVycyBvbmx5LCBhbmQKKyAqIGRpZG4ndCBrbm93IHRoYXQgdGhlIHJpZ2h0IHdheSB0byBnZXQgYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIGlzIHRvCisgKiBhc2sgdGNwZHVtcC5vcmcgZm9yIG9uZSwgb3Iga25ldyBhbmQgZGlkbid0IGNhcmUsIHNvIHRoZXkganVzdAorICogdXNlZCBETFRfVVNFUjIsIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBmb3IgZXZlcnl0aGluZyBleGNlcHQgZm9yCisgKiB0aGVpciB2ZXJzaW9uIG9mIHRjcGR1bXAuCisgKgorICogU28gSSdsbCBqdXN0IGdpdmUgdGhlbSBvbmU7IGhvcGVmdWxseSB0aGlzIHdpbGwgc2hvdyB1cCBpbiBhCisgKiBsaWJwY2FwIHJlbGVhc2UgaW4gdGltZSBmb3IgdGhlbSB0byBnZXQgdGhpcyBpbnRvIDEwLjEwIEJpZyBTdXIKKyAqIG9yIHdoYXRldmVyIE1hdmVyaWNrcycgc3VjY2Vzc29yIGlzIGNhbGxlZC4gIExJTktUWVBFX1BLVEFQCisgKiB3aWxsIGJlIDI1OCAqZXZlbiBvbiBPUyBYKjsgdGhhdCBpcyAqaW50ZW50aW9uYWwqLCBzbyB0aGF0CisgKiBQS1RBUCBmaWxlcyBsb29rIHRoZSBzYW1lIG9uICphbGwqIE9TZXMgKGRpZmZlcmVudCBPU2VzIGNhbiBoYXZlCisgKiBkaWZmZXJlbnQgbnVtZXJpY2FsIHZhbHVlcyBmb3IgYSBnaXZlbiBETFRfLCBidXQgKk1VU1QgTk9UKiBoYXZlCisgKiBkaWZmZXJlbnQgdmFsdWVzIGZvciB3aGF0IGdvZXMgaW4gYSBmaWxlLCBhcyBmaWxlcyBjYW4gYmUgbW92ZWQKKyAqIGJldHdlZW4gT1NlcyEpLgorICoKKyAqIFdoZW4gY2FwdHVyaW5nLCBvbiBhIHN5c3RlbSB3aXRoIGEgRGFyd2luLWJhc2VkIE9TLCBvbiBhIGRldmljZQorICogdGhhdCByZXR1cm5zIDE0OSAoRExUX1VTRVIyIGFuZCBBcHBsZSdzIERMVF9QS1RBUCkgd2l0aCB0aGlzCisgKiB2ZXJzaW9uIG9mIGxpYnBjYXAsIHRoZSBETFRfIHZhbHVlIGZvciB0aGUgcGNhcF90ICB3aWxsIGJlIERMVF9QS1RBUCwKKyAqIGFuZCB0aGF0IHdpbGwgY29udGludWUgdG8gYmUgRExUX1VTRVIyIG9uIERhcndpbi1iYXNlZCBPU2VzLiBUaGF0IHdheSwKKyAqIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggTWF2ZXJpY2tzIGlzIHByZXNlcnZlZCBmb3IgcHJvZ3JhbXMgdXNpbmcKKyAqIHRoaXMgdmVyc2lvbiBvZiBsaWJwY2FwLiAgVGhpcyBkb2VzIG1lYW4gdGhhdCBpZiB5b3Ugd2VyZSB1c2luZworICogRExUX1VTRVIyIGZvciBzb21lIGNhcHR1cmUgZGV2aWNlIG9uIE9TIFgsIHlvdSBjYW4ndCBkbyBzbyB3aXRoCisgKiB0aGlzIHZlcnNpb24gb2YgbGlicGNhcCwganVzdCBhcyB5b3UgY2FuJ3Qgd2l0aCBBcHBsZSdzIGxpYnBjYXAgLQorICogb24gT1MgWCwgdGhleSBkZWZpbmUgRExUX1BLVEFQIHRvIGJlIERMVF9VU0VSMiwgc28gcHJvZ3JhbXMgd29uJ3QKKyAqIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBQS1RBUCBhbmQgd2hhdGV2ZXIgeW91IHdlcmUgdXNpbmcKKyAqIERMVF9VU0VSMiBmb3IuCisgKgorICogSWYgdGhlIHByb2dyYW0gc2F2ZXMgdGhlIGNhcHR1cmUgdG8gYSBmaWxlIHVzaW5nIHRoaXMgdmVyc2lvbiBvZgorICogbGlicGNhcCdzIHBjYXBfZHVtcCBjb2RlLCB0aGUgTElOS1RZUEVfIHZhbHVlIGluIHRoZSBmaWxlIHdpbGwgYmUKKyAqIExJTktUWVBFX1BLVEFQLCB3aGljaCB3aWxsIGJlIDI1OCwgZXZlbiBvbiBEYXJ3aW4tYmFzZWQgT1Nlcy4KKyAqIFRoYXQgd2F5LCB0aGUgZmlsZSB3aWxsICpub3QqIGJlIGEgRExUX1VTRVIyIGZpbGUuICBUaGF0IG1lYW5zCisgKiB0aGF0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0Y3BkdW1wLCB3aGVuIGJ1aWx0IHdpdGggdGhpcyB2ZXJzaW9uCisgKiBvZiBsaWJwY2FwLCBhbmQgc3VmZmljaWVudGx5IHJlY2VudCB2ZXJzaW9ucyBvZiBXaXJlc2hhcmsgd2lsbAorICogYmUgYWJsZSB0byByZWFkIHRob3NlIGZpbGVzIGFuZCBpbnRlcnByZXQgdGhlbSBjb3JyZWN0bHk7IGhvd2V2ZXIsCisgKiBBcHBsZSdzIHZlcnNpb24gb2YgdGNwZHVtcCBpbiBPUyBYIDEwLjkgd29uJ3QgYmUgYWJsZSB0byBoYW5kbGUKKyAqIHRoZW0uICAoSG9wZWZ1bGx5LCBBcHBsZSB3aWxsIHBpY2sgdXAgdGhpcyB2ZXJzaW9uIG9mIGxpYnBjYXAsCisgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBvZiB0Y3BkdW1wLCBzbyB0aGF0IHRjcGR1bXAgd2lsbAorICogYmUgYWJsZSB0byBoYW5kbGUgdGhlIG9sZCBMSU5LVFlQRV9VU0VSMiBjYXB0dXJlcyAqYW5kKiB0aGUgbmV3CisgKiBMSU5LVFlQRV9QS1RBUCBjYXB0dXJlcy4pCisgKi8KKyNpZmRlZiBfX0FQUExFX18KKyNkZWZpbmUgRExUX1BLVEFQCURMVF9VU0VSMgorI2Vsc2UKKyNkZWZpbmUgRExUX1BLVEFQCTI1OAorI2VuZGlmCisKKy8qCisgKiBFdGhlcm5ldCBwYWNrZXRzIHByZWNlZGVkIGJ5IGEgaGVhZGVyIGdpdmluZyB0aGUgbGFzdCA2IG9jdGV0cworICogb2YgdGhlIHByZWFtYmxlIHNwZWNpZmllZCBieSA4MDIuMy0yMDEyIENsYXVzZSA2NSwgc2VjdGlvbgorICogNjUuMS4zLjIgIlRyYW5zbWl0Ii4KKyAqLworI2RlZmluZSBETFRfRVBPTgkyNTkKKworLyoKKyAqIElQTUkgdHJhY2UgcGFja2V0cywgYXMgc3BlY2lmaWVkIGJ5IFRhYmxlIDMtMjAgIlRyYWNlIERhdGEgQmxvY2sgRm9ybWF0IgorICogaW4gdGhlIFBJQ01HIEhQTS4yIHNwZWNpZmljYXRpb24uCisgKi8KKyNkZWZpbmUgRExUX0lQTUlfSFBNXzIJMjYwCisKKy8qCisgKiBwZXIgIEpvc2h1YSBXcmlnaHQgPGp3cmlnaHRAaGFzYm9yZy5jb20+LCBmb3JtYXRzIGZvciBad2F2ZSBjYXB0dXJlcy4KKyAqLworI2RlZmluZSBETFRfWldBVkVfUjFfUjIgIDI2MQorI2RlZmluZSBETFRfWldBVkVfUjMgICAgIDI2MgorCisvKgorICogcGVyIFN0ZXZlIEthcmcgPHNrYXJnQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4sIGZvcm1hdHMgZm9yIFdhdHRzdG9wcGVyCisgKiBEaWdpdGFsIExpZ2h0aW5nIE1hbmFnZW1lbnQgcm9vbSBidXMgc2VyaWFsIHByb3RvY29sIGNhcHR1cmVzLgorICovCisjZGVmaW5lIERMVF9XQVRUU1RPUFBFUl9ETE0gICAgIDI2MworCisvKgorICogSVNPIDE0NDQzIGNvbnRhY3RsZXNzIHNtYXJ0IGNhcmQgbWVzc2FnZXMuCisgKi8KKyNkZWZpbmUgRExUX0lTT18xNDQ0MwkyNjQKKworLyoKKyAqIFJhZGlvIGRhdGEgc3lzdGVtIChSRFMpIGdyb3Vwcy4gIElFQyA2MjEwNi4KKyAqIFBlciBKb25hdGhhbiBCcnVja2VyIDxqb25hdGhhbi5icnVja2VAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBETFRfUkRTCQkyNjUKKworLyoKKyAqIEluIGNhc2UgdGhlIGNvZGUgdGhhdCBpbmNsdWRlcyB0aGlzIGZpbGUgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpCisgKiBoYXMgYWxzbyBpbmNsdWRlZCBPUyBmaWxlcyB0aGF0IGhhcHBlbiB0byBkZWZpbmUgRExUX01BVENISU5HX01BWCwKKyAqIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgKHBlcmhhcHMgYmVjYXVzZSB0aGF0IE9TIGhhc24ndCBwaWNrZWQgdXAKKyAqIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBvdXIgRExUIGRlZmluaXRpb25zKSwgd2UgdW5kZWZpbmUgdGhlCisgKiBwcmV2aW91cyB2YWx1ZSBvZiBETFRfTUFUQ0hJTkdfTUFYLgorICovCisjaWZkZWYgRExUX01BVENISU5HX01BWAorI3VuZGVmIERMVF9NQVRDSElOR19NQVgKKyNlbmRpZgorI2RlZmluZSBETFRfTUFUQ0hJTkdfTUFYCTI2NQkvKiBoaWdoZXN0IHZhbHVlIGluIHRoZSAibWF0Y2hpbmciIHJhbmdlICovCisKKy8qCisgKiBETFQgYW5kIHNhdmVmaWxlIGxpbmsgdHlwZSB2YWx1ZXMgYXJlIHNwbGl0IGludG8gYSBjbGFzcyBhbmQKKyAqIGEgbWVtYmVyIG9mIHRoYXQgY2xhc3MuICBBIGNsYXNzIHZhbHVlIG9mIDAgaW5kaWNhdGVzIGEgcmVndWxhcgorICogRExUXy9MSU5LVFlQRV8gdmFsdWUuCisgKi8KKyNkZWZpbmUgRExUX0NMQVNTKHgpCQkoKHgpICYgMHgwM2ZmMDAwMCkKKworLyoKKyAqIE5ldEJTRC1zcGVjaWZpYyBnZW5lcmljICJyYXciIGxpbmsgdHlwZS4gIFRoZSBjbGFzcyB2YWx1ZSBpbmRpY2F0ZXMKKyAqIHRoYXQgdGhpcyBpcyB0aGUgZ2VuZXJpYyByYXcgdHlwZSwgYW5kIHRoZSBsb3dlciAxNiBiaXRzIGFyZSB0aGUKKyAqIGFkZHJlc3MgZmFtaWx5IHdlJ3JlIGRlYWxpbmcgd2l0aC4gIFRob3NlIHZhbHVlcyBhcmUgTmV0QlNELXNwZWNpZmljOworICogZG8gbm90IGFzc3VtZSB0aGF0IHRoZXkgY29ycmVzcG9uZCB0byBBRl8gdmFsdWVzIGZvciB5b3VyIG9wZXJhdGluZworICogc3lzdGVtLgorICovCisjZGVmaW5lCURMVF9DTEFTU19ORVRCU0RfUkFXQUYJMHgwMjI0MDAwMAorI2RlZmluZQlETFRfTkVUQlNEX1JBV0FGKGFmKQkoRExUX0NMQVNTX05FVEJTRF9SQVdBRiB8IChhZikpCisjZGVmaW5lCURMVF9ORVRCU0RfUkFXQUZfQUYoeCkJKCh4KSAmIDB4MDAwMGZmZmYpCisjZGVmaW5lCURMVF9JU19ORVRCU0RfUkFXQUYoeCkJKERMVF9DTEFTUyh4KSA9PSBETFRfQ0xBU1NfTkVUQlNEX1JBV0FGKQorCisjZW5kaWYgLyogIWRlZmluZWQobGliX3BjYXBfZGx0X2gpICovCmRpZmYgLS1naXQgYS9wY2FwL2V4cG9ydC1kZWZzLmggYi9wY2FwL2V4cG9ydC1kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzNTA1NwotLS0gL2Rldi9udWxsCisrKyBiL3BjYXAvZXhwb3J0LWRlZnMuaApAQCAtMCwwICsxLDEwOCBAQAorLyogLSotIE1vZGU6IGM7IHRhYi13aWR0aDogODsgaW5kZW50LXRhYnMtbW9kZTogMTsgYy1iYXNpYy1vZmZzZXQ6IDg7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIENvbXB1dGVyIFN5c3RlbXMKKyAqCUVuZ2luZWVyaW5nIEdyb3VwIGF0IExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciBvZiB0aGUgTGFib3JhdG9yeSBtYXkgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgbGliX3BjYXBfZXhwb3J0X2RlZnNfaAorI2RlZmluZSBsaWJfcGNhcF9leHBvcnRfZGVmc19oCisKKy8qCisgKiBQQ0FQX0FQSV9ERUYgbXVzdCBiZSB1c2VkIHdoZW4gZGVmaW5pbmcgKmRhdGEqIGV4cG9ydGVkIGZyb20KKyAqIGxpYnBjYXAuICBJdCBjYW4gYmUgdXNlZCB3aGVuIGRlZmluaW5nICpmdW5jdGlvbnMqIGV4cG9ydGVkCisgKiBmcm9tIGxpYnBjYXAsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgdXNlZCB0aGVyZS4gIEl0CisgKiBzaG91bGQgbm90IGJlIHVzZWQgaW4gZGVjbGFyYXRpb25zIGluIGhlYWRlcnMuCisgKgorICogUENBUF9BUEkgbXVzdCBiZSB1c2VkIHdoZW4gKmRlY2xhcmluZyogZGF0YSBvciBmdW5jdGlvbnMKKyAqIGV4cG9ydGVkIGZyb20gbGlicGNhcDsgUENBUF9BUElfREVGIHdvbid0IHdvcmsgb24gYWxsIHBsYXRmb3Jtcy4KKyAqLworCisvKgorICogQ2hlY2sgd2hldGhlciB0aGlzIGlzIEdDQyBtYWpvci5taW5vciBvciBhIGxhdGVyIHJlbGVhc2UsIG9yIHNvbWUKKyAqIGNvbXBpbGVyIHRoYXQgY2xhaW1zIHRvIGJlICJqdXN0IGxpa2UgR0NDIiBvZiB0aGF0IHZlcnNpb24gb3IgYQorICogbGF0ZXIgcmVsZWFzZS4KKyAqLworI2RlZmluZSBJU19BVF9MRUFTVF9HTlVDX1ZFUlNJT04obWFqb3IsIG1pbm9yKSBcCisJKGRlZmluZWQoX19HTlVDX18pICYmIFwKKwkgICAgKF9fR05VQ19fID4gKG1ham9yKSB8fCBcCisJICAgICAoX19HTlVDX18gPT0gKG1ham9yKSAmJiBfX0dOVUNfTUlOT1JfXyA+PSAobWlub3IpKSkpCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgI2lmZGVmIEJVSUxESU5HX1BDQVAKKyAgICAvKgorICAgICAqIFdlJ3JlIGNvbXBpbGluZyBsaWJwY2FwLCBzbyB3ZSBzaG91bGQgZXhwb3J0IGZ1bmN0aW9ucyBpbiBvdXIKKyAgICAgKiBBUEkuCisgICAgICovCisgICAgI2RlZmluZSBQQ0FQX0FQSV9ERUYJX19kZWNsc3BlYyhkbGxleHBvcnQpCisgICNlbHNlCisgICAgI2RlZmluZSBQQ0FQX0FQSV9ERUYJX19kZWNsc3BlYyhkbGxpbXBvcnQpCisgICNlbmRpZgorI2VsaWYgZGVmaW5lZChNU0RPUykKKyAgLyogWFhYIC0gZG9lcyB0aGlzIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQ/ICovCisgICNkZWZpbmUgUENBUF9BUElfREVGCisjZWxzZSAvKiBVTipYICovCisgICNpZmRlZiBCVUlMRElOR19QQ0FQCisgICAgLyoKKyAgICAgKiBXZSdyZSBjb21waWxpbmcgbGlicGNhcCwgc28gd2Ugc2hvdWxkIGV4cG9ydCBmdW5jdGlvbnMgaW4gb3VyIEFQSS4KKyAgICAgKiBUaGUgY29tcGlsZXIgbWlnaHQgYmUgY29uZmlndXJlZCBub3QgdG8gZXhwb3J0IGZ1bmN0aW9ucyBmcm9tIGEKKyAgICAgKiBzaGFyZWQgbGlicmFyeSBieSBkZWZhdWx0LCBzbyB3ZSBtaWdodCBoYXZlIHRvIGV4cGxpY2l0bHkgbWFyaworICAgICAqIGZ1bmN0aW9ucyBhcyBleHBvcnRlZC4KKyAgICAgKi8KKyAgICAjaWYgSVNfQVRfTEVBU1RfR05VQ19WRVJTSU9OKDMsIDQpCisgICAgICAvKgorICAgICAgICogR0NDIDMuNCBvciBsYXRlciwgb3Igc29tZSBjb21waWxlciBhc3NlcnRpbmcgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgICAgKiBHQ0MgMy40IG9yIGxhdGVyLCBzbyB3ZSBoYXZlIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoKSkuCisgICAgICAgKi8KKyAgICAgICNkZWZpbmUgUENBUF9BUElfREVGCV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisgICAgI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU1MCkKKyAgICAgIC8qCisgICAgICAgKiBTdW4gQyA1LjUgb3IgbGF0ZXIsIHNvIHdlIGhhdmUgX19nbG9iYWwuCisgICAgICAgKiAoU3VuIEMgNS45IGFuZCBsYXRlciBhbHNvIGhhdmUgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgpKSwKKyAgICAgICAqIGJ1dCB0aGVyZSdzIG5vIHJlYXNvbiB0byBwcmVmZXIgaXQgd2l0aCBTdW4gQy4pCisgICAgICAgKi8KKyAgICAgICNkZWZpbmUgUENBUF9BUElfREVGCV9fZ2xvYmFsCisgICAgI2Vsc2UKKyAgICAgIC8qCisgICAgICAgKiBXZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHNheS4KKyAgICAgICAqLworICAgICAgI2RlZmluZSBQQ0FQX0FQSV9ERUYKKyAgICAjZW5kaWYKKyAgI2Vsc2UKKyAgICAvKgorICAgICAqIFdlJ3JlIG5vdCBidWlsZGluZyBsaWJwY2FwLgorICAgICAqLworICAgICNkZWZpbmUgUENBUF9BUElfREVGCisgICNlbmRpZgorI2VuZGlmIC8qIF9XSU4zMi9NU0RPUy9VTipYICovCisKKyNkZWZpbmUgUENBUF9BUEkJUENBUF9BUElfREVGIGV4dGVybgorCisjZW5kaWYgLyogbGliX3BjYXBfZXhwb3J0X2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvcGNhcC9uYW1lZGIuaCBiL3BjYXAvbmFtZWRiLmgKaW5kZXggZDNhMzQzMi4uNzNmYjQwYSAxMDA2NDQKLS0tIGEvcGNhcC9uYW1lZGIuaAorKysgYi9wY2FwL25hbWVkYi5oCkBAIC00Myw3ICs0MywxMCBAQAogICogWFhYIHRoaXMgc3R1ZmYgZG9lc24ndCBiZWxvbmcgaW4gdGhpcyBpbnRlcmZhY2UsIGJ1dCB0aGlzCiAgKiBsaWJyYXJ5IGFscmVhZHkgbXVzdCBkbyBuYW1lIHRvIGFkZHJlc3MgdHJhbnNsYXRpb24sIHNvCiAgKiBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBzdXBwb3J0IGZvciAvZXRjL2V0aGVycywgd2UKLSAqIGV4cG9ydCB0aGVzZSBob29rcyBzaW5jZSB0aGV5J2xsCisgKiBleHBvcnQgdGhlc2UgaG9va3Mgc2luY2UgdGhleSdyZSBhbHJlYWR5IGJlaW5nIHVzZWQgYnkKKyAqIHNvbWUgYXBwbGljYXRpb25zIChzdWNoIGFzIHRjcGR1bXApIGFuZCBhbHJlYWR5IGJlaW5nCisgKiBtYXJrZWQgYXMgZXhwb3J0ZWQgaW4gc29tZSBPU2VzIG9mZmVyaW5nIGxpYnBjYXAgKHN1Y2gKKyAqIGFzIERlYmlhbikuCiAgKi8KIHN0cnVjdCBwY2FwX2V0aGVyZW50IHsKIAl1X2NoYXIgYWRkcls2XTsKQEAgLTUyLDIxICs1NSwyMSBAQAogI2lmbmRlZiBQQ0FQX0VUSEVSU19GSUxFCiAjZGVmaW5lIFBDQVBfRVRIRVJTX0ZJTEUgIi9ldGMvZXRoZXJzIgogI2VuZGlmCi1zdHJ1Y3QJcGNhcF9ldGhlcmVudCAqcGNhcF9uZXh0X2V0aGVyZW50KEZJTEUgKik7Ci11X2NoYXIgKnBjYXBfZXRoZXJfaG9zdHRvbihjb25zdCBjaGFyKik7Ci11X2NoYXIgKnBjYXBfZXRoZXJfYXRvbihjb25zdCBjaGFyICopOworUENBUF9BUEkgc3RydWN0CXBjYXBfZXRoZXJlbnQgKnBjYXBfbmV4dF9ldGhlcmVudChGSUxFICopOworUENBUF9BUEkgdV9jaGFyICpwY2FwX2V0aGVyX2hvc3R0b24oY29uc3QgY2hhciopOworUENBUF9BUEkgdV9jaGFyICpwY2FwX2V0aGVyX2F0b24oY29uc3QgY2hhciAqKTsKIAotYnBmX3VfaW50MzIgKipwY2FwX25hbWV0b2FkZHIoY29uc3QgY2hhciAqKTsKK1BDQVBfQVBJIGJwZl91X2ludDMyICoqcGNhcF9uYW1ldG9hZGRyKGNvbnN0IGNoYXIgKik7CiAjaWZkZWYgSU5FVDYKLXN0cnVjdCBhZGRyaW5mbyAqcGNhcF9uYW1ldG9hZGRyaW5mbyhjb25zdCBjaGFyICopOworUENBUF9BUEkgc3RydWN0IGFkZHJpbmZvICpwY2FwX25hbWV0b2FkZHJpbmZvKGNvbnN0IGNoYXIgKik7CiAjZW5kaWYKLWJwZl91X2ludDMyIHBjYXBfbmFtZXRvbmV0YWRkcihjb25zdCBjaGFyICopOworUENBUF9BUEkgYnBmX3VfaW50MzIgcGNhcF9uYW1ldG9uZXRhZGRyKGNvbnN0IGNoYXIgKik7CiAKLWludAlwY2FwX25hbWV0b3BvcnQoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50ICopOwotaW50CXBjYXBfbmFtZXRvcG9ydHJhbmdlKGNvbnN0IGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKik7Ci1pbnQJcGNhcF9uYW1ldG9wcm90byhjb25zdCBjaGFyICopOwotaW50CXBjYXBfbmFtZXRvZXByb3RvKGNvbnN0IGNoYXIgKik7Ci1pbnQJcGNhcF9uYW1ldG9sbGMoY29uc3QgY2hhciAqKTsKK1BDQVBfQVBJIGludAlwY2FwX25hbWV0b3BvcnQoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50ICopOworUENBUF9BUEkgaW50CXBjYXBfbmFtZXRvcG9ydHJhbmdlKGNvbnN0IGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9uYW1ldG9wcm90byhjb25zdCBjaGFyICopOworUENBUF9BUEkgaW50CXBjYXBfbmFtZXRvZXByb3RvKGNvbnN0IGNoYXIgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9uYW1ldG9sbGMoY29uc3QgY2hhciAqKTsKIC8qCiAgKiBJZiBhIHByb3RvY29sIGlzIHVua25vd24sIFBST1RPX1VOREVGIGlzIHJldHVybmVkLgogICogQWxzbywgcGNhcF9uYW1ldG9wb3J0KCkgcmV0dXJucyB0aGUgcHJvdG9jb2wgYWxvbmcgd2l0aCB0aGUgcG9ydCBudW1iZXIuCkBAIC03NSwxMSArNzgsNiBAQAogICovCiAjZGVmaW5lIFBST1RPX1VOREVGCQktMQogCi0vKiBYWFggbW92ZSB0aGVzZSB0byBwY2FwLWludC5oPyAqLwotaW50IF9fcGNhcF9hdG9kbihjb25zdCBjaGFyICosIGJwZl91X2ludDMyICopOwotaW50IF9fcGNhcF9hdG9pbihjb25zdCBjaGFyICosIGJwZl91X2ludDMyICopOwotdV9zaG9ydAlfX3BjYXBfbmFtZXRvZG5hZGRyKGNvbnN0IGNoYXIgKik7Ci0KICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9wY2FwL25mbG9nLmggYi9wY2FwL25mbG9nLmgKaW5kZXggMzg4ZGQwYy4uYTM4NjdjZCAxMDA2NDQKLS0tIGEvcGNhcC9uZmxvZy5oCisrKyBiL3BjYXAvbmZsb2cuaApAQCAtMjUsOCArMjUsOCBAQAogICogREFNQUdFLgogICovCiAKLSNpZm5kZWYgX1BDQVBfTkZMT0dfSF9fCi0jZGVmaW5lIF9QQ0FQX05GTE9HX0hfXworI2lmbmRlZiBsaWJfcGNhcF9uZmxvZ19oCisjZGVmaW5lIGxpYl9wY2FwX25mbG9nX2gKIAogLyoKICAqIFN0cnVjdHVyZSBvZiBhbiBORkxPRyBoZWFkZXIgYW5kIFRMViBwYXJ0cywgYXMgZGVzY3JpYmVkIGF0CmRpZmYgLS1naXQgYS9wY2FwL3BjYXAuaCBiL3BjYXAvcGNhcC5oCmluZGV4IGM5ZmFiNGMuLjdmOTJhMzcgMTAwNjQ0Ci0tLSBhL3BjYXAvcGNhcC5oCisrKyBiL3BjYXAvcGNhcC5oCkBAIC0zNSw3ICszNSw5IEBACiAjaWZuZGVmIGxpYl9wY2FwX3BjYXBfaAogI2RlZmluZSBsaWJfcGNhcF9wY2FwX2gKIAotI2lmIGRlZmluZWQoV0lOMzIpCisjaW5jbHVkZSA8cGNhcC9leHBvcnQtZGVmcy5oPgorCisjaWYgZGVmaW5lZChfV0lOMzIpCiAgICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgogI2VsaWYgZGVmaW5lZChNU0RPUykKICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtNDMsNyArNDUsNyBAQAogI2Vsc2UgLyogVU4qWCAqLwogICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAgICNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmIC8qIFdJTjMyL01TRE9TL1VOKlggKi8KKyNlbmRpZiAvKiBfV0lOMzIvTVNET1MvVU4qWCAqLwogCiAjaWZuZGVmIFBDQVBfRE9OVF9JTkNMVURFX1BDQVBfQlBGX0gKICNpbmNsdWRlIDxwY2FwL2JwZi5oPgpAQCAtMTcwLDkgKzE3MiwxMSBAQAogCXVfaW50IHBzX3JlY3Y7CQkvKiBudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCAqLwogCXVfaW50IHBzX2Ryb3A7CQkvKiBudW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkICovCiAJdV9pbnQgcHNfaWZkcm9wOwkvKiBkcm9wcyBieSBpbnRlcmZhY2UgLS0gb25seSBzdXBwb3J0ZWQgb24gc29tZSBwbGF0Zm9ybXMgKi8KLSNpZmRlZiBXSU4zMgotCXVfaW50IGJzX2NhcHQ7CQkvKiBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHJlYWNoIHRoZSBhcHBsaWNhdGlvbiAqLwotI2VuZGlmIC8qIFdJTjMyICovCisjaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoSEFWRV9SRU1PVEUpCisJdV9pbnQgcHNfY2FwdDsJCS8qIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgcmVhY2ggdGhlIGFwcGxpY2F0aW9uICovCisJdV9pbnQgcHNfc2VudDsJCS8qIG51bWJlciBvZiBwYWNrZXRzIHNlbnQgYnkgdGhlIHNlcnZlciBvbiB0aGUgbmV0d29yayAqLworCXVfaW50IHBzX25ldGRyb3A7CS8qIG51bWJlciBvZiBwYWNrZXRzIGxvc3Qgb24gdGhlIG5ldHdvcmsgKi8KKyNlbmRpZiAvKiBfV0lOMzIgJiYgSEFWRV9SRU1PVEUgKi8KIH07CiAKICNpZmRlZiBNU0RPUwpAQCAtMjcxLDI3ICsyNzUsMjcgQEAKICAqLwogI2RlZmluZSBQQ0FQX05FVE1BU0tfVU5LTk9XTgkweGZmZmZmZmZmCiAKLWNoYXIJKnBjYXBfbG9va3VwZGV2KGNoYXIgKik7Ci1pbnQJcGNhcF9sb29rdXBuZXQoY29uc3QgY2hhciAqLCBicGZfdV9pbnQzMiAqLCBicGZfdV9pbnQzMiAqLCBjaGFyICopOworUENBUF9BUEkgY2hhcgkqcGNhcF9sb29rdXBkZXYoY2hhciAqKTsKK1BDQVBfQVBJIGludAlwY2FwX2xvb2t1cG5ldChjb25zdCBjaGFyICosIGJwZl91X2ludDMyICosIGJwZl91X2ludDMyICosIGNoYXIgKik7CiAKLXBjYXBfdAkqcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqLCBjaGFyICopOwotaW50CXBjYXBfc2V0X3NuYXBsZW4ocGNhcF90ICosIGludCk7Ci1pbnQJcGNhcF9zZXRfcHJvbWlzYyhwY2FwX3QgKiwgaW50KTsKLWludAlwY2FwX2Nhbl9zZXRfcmZtb24ocGNhcF90ICopOwotaW50CXBjYXBfc2V0X3JmbW9uKHBjYXBfdCAqLCBpbnQpOwotaW50CXBjYXBfc2V0X3RpbWVvdXQocGNhcF90ICosIGludCk7Ci1pbnQJcGNhcF9zZXRfdHN0YW1wX3R5cGUocGNhcF90ICosIGludCk7Ci1pbnQJcGNhcF9zZXRfaW1tZWRpYXRlX21vZGUocGNhcF90ICosIGludCk7Ci1pbnQJcGNhcF9zZXRfYnVmZmVyX3NpemUocGNhcF90ICosIGludCk7Ci1pbnQJcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbihwY2FwX3QgKiwgaW50KTsKLWludAlwY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uKHBjYXBfdCAqKTsKLWludAlwY2FwX2FjdGl2YXRlKHBjYXBfdCAqKTsKK1BDQVBfQVBJIHBjYXBfdAkqcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqLCBjaGFyICopOworUENBUF9BUEkgaW50CXBjYXBfc2V0X3NuYXBsZW4ocGNhcF90ICosIGludCk7CitQQ0FQX0FQSSBpbnQJcGNhcF9zZXRfcHJvbWlzYyhwY2FwX3QgKiwgaW50KTsKK1BDQVBfQVBJIGludAlwY2FwX2Nhbl9zZXRfcmZtb24ocGNhcF90ICopOworUENBUF9BUEkgaW50CXBjYXBfc2V0X3JmbW9uKHBjYXBfdCAqLCBpbnQpOworUENBUF9BUEkgaW50CXBjYXBfc2V0X3RpbWVvdXQocGNhcF90ICosIGludCk7CitQQ0FQX0FQSSBpbnQJcGNhcF9zZXRfdHN0YW1wX3R5cGUocGNhcF90ICosIGludCk7CitQQ0FQX0FQSSBpbnQJcGNhcF9zZXRfaW1tZWRpYXRlX21vZGUocGNhcF90ICosIGludCk7CitQQ0FQX0FQSSBpbnQJcGNhcF9zZXRfYnVmZmVyX3NpemUocGNhcF90ICosIGludCk7CitQQ0FQX0FQSSBpbnQJcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbihwY2FwX3QgKiwgaW50KTsKK1BDQVBfQVBJIGludAlwY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uKHBjYXBfdCAqKTsKK1BDQVBfQVBJIGludAlwY2FwX2FjdGl2YXRlKHBjYXBfdCAqKTsKIAotaW50CXBjYXBfbGlzdF90c3RhbXBfdHlwZXMocGNhcF90ICosIGludCAqKik7Ci12b2lkCXBjYXBfZnJlZV90c3RhbXBfdHlwZXMoaW50ICopOwotaW50CXBjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwoY29uc3QgY2hhciAqKTsKLWNvbnN0IGNoYXIgKnBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUoaW50KTsKLWNvbnN0IGNoYXIgKnBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX2Rlc2NyaXB0aW9uKGludCk7CitQQ0FQX0FQSSBpbnQJcGNhcF9saXN0X3RzdGFtcF90eXBlcyhwY2FwX3QgKiwgaW50ICoqKTsKK1BDQVBfQVBJIHZvaWQJcGNhcF9mcmVlX3RzdGFtcF90eXBlcyhpbnQgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF90c3RhbXBfdHlwZV9uYW1lX3RvX3ZhbChjb25zdCBjaGFyICopOworUENBUF9BUEkgY29uc3QgY2hhciAqcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZShpbnQpOworUENBUF9BUEkgY29uc3QgY2hhciAqcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fZGVzY3JpcHRpb24oaW50KTsKIAogLyoKICAqIFRpbWUgc3RhbXAgdHlwZXMuCkBAIC0zNDYsODMgKzM1MCw4NyBAQAogI2RlZmluZSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk8JMAkvKiB1c2UgdGltZXN0YW1wcyB3aXRoIG1pY3Jvc2Vjb25kIHByZWNpc2lvbiwgZGVmYXVsdCAqLwogI2RlZmluZSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTkFOTwkxCS8qIHVzZSB0aW1lc3RhbXBzIHdpdGggbmFub3NlY29uZCBwcmVjaXNpb24gKi8KIAotcGNhcF90CSpwY2FwX29wZW5fbGl2ZShjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQsIGNoYXIgKik7Ci1wY2FwX3QJKnBjYXBfb3Blbl9kZWFkKGludCwgaW50KTsKLXBjYXBfdAkqcGNhcF9vcGVuX2RlYWRfd2l0aF90c3RhbXBfcHJlY2lzaW9uKGludCwgaW50LCB1X2ludCk7Ci1wY2FwX3QJKnBjYXBfb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihjb25zdCBjaGFyICosIHVfaW50LCBjaGFyICopOwotcGNhcF90CSpwY2FwX29wZW5fb2ZmbGluZShjb25zdCBjaGFyICosIGNoYXIgKik7Ci0jaWYgZGVmaW5lZChXSU4zMikKLXBjYXBfdCAgKnBjYXBfaG9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oaW50cHRyX3QsIHVfaW50LCBjaGFyICopOwotcGNhcF90ICAqcGNhcF9ob3Blbl9vZmZsaW5lKGludHB0cl90LCBjaGFyICopOwotI2lmICFkZWZpbmVkKExJQlBDQVBfRVhQT1JUUykKLSNkZWZpbmUgcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihmLHAsYikgXAorUENBUF9BUEkgcGNhcF90CSpwY2FwX29wZW5fbGl2ZShjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQsIGNoYXIgKik7CitQQ0FQX0FQSSBwY2FwX3QJKnBjYXBfb3Blbl9kZWFkKGludCwgaW50KTsKK1BDQVBfQVBJIHBjYXBfdAkqcGNhcF9vcGVuX2RlYWRfd2l0aF90c3RhbXBfcHJlY2lzaW9uKGludCwgaW50LCB1X2ludCk7CitQQ0FQX0FQSSBwY2FwX3QJKnBjYXBfb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihjb25zdCBjaGFyICosIHVfaW50LCBjaGFyICopOworUENBUF9BUEkgcGNhcF90CSpwY2FwX29wZW5fb2ZmbGluZShjb25zdCBjaGFyICosIGNoYXIgKik7CisjaWZkZWYgX1dJTjMyCisgIFBDQVBfQVBJIHBjYXBfdCAgKnBjYXBfaG9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oaW50cHRyX3QsIHVfaW50LCBjaGFyICopOworICBQQ0FQX0FQSSBwY2FwX3QgICpwY2FwX2hvcGVuX29mZmxpbmUoaW50cHRyX3QsIGNoYXIgKik7CisgIC8qCisgICAqIElmIHdlJ3JlIGJ1aWxkaW5nIGxpYnBjYXAsIHRoZXNlIGFyZSBpbnRlcm5hbCByb3V0aW5lcyBpbiBzYXZlZmlsZS5jLAorICAgKiBzbyB3ZSBtdXN0bid0IGRlZmluZSB0aGVtIGFzIG1hY3Jvcy4KKyAgICovCisgICNpZm5kZWYgQlVJTERJTkdfUENBUAorICAgICNkZWZpbmUgcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihmLHAsYikgXAogCXBjYXBfaG9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oX2dldF9vc2ZoYW5kbGUoX2ZpbGVubyhmKSksIHAsIGIpCi0jZGVmaW5lIHBjYXBfZm9wZW5fb2ZmbGluZShmLGIpIFwKKyAgICAjZGVmaW5lIHBjYXBfZm9wZW5fb2ZmbGluZShmLGIpIFwKIAlwY2FwX2hvcGVuX29mZmxpbmUoX2dldF9vc2ZoYW5kbGUoX2ZpbGVubyhmKSksIGIpCi0jZWxzZSAvKkxJQlBDQVBfRVhQT1JUUyovCi1zdGF0aWMgcGNhcF90ICpwY2FwX2ZvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKEZJTEUgKiwgdV9pbnQsIGNoYXIgKik7Ci1zdGF0aWMgcGNhcF90ICpwY2FwX2ZvcGVuX29mZmxpbmUoRklMRSAqLCBjaGFyICopOwotI2VuZGlmCi0jZWxzZSAvKldJTjMyKi8KLXBjYXBfdAkqcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihGSUxFICosIHVfaW50LCBjaGFyICopOwotcGNhcF90CSpwY2FwX2ZvcGVuX29mZmxpbmUoRklMRSAqLCBjaGFyICopOwotI2VuZGlmIC8qV0lOMzIqLworICAjZW5kaWYKKyNlbHNlIC8qX1dJTjMyKi8KKyAgUENBUF9BUEkgcGNhcF90CSpwY2FwX2ZvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKEZJTEUgKiwgdV9pbnQsIGNoYXIgKik7CisgIFBDQVBfQVBJIHBjYXBfdAkqcGNhcF9mb3Blbl9vZmZsaW5lKEZJTEUgKiwgY2hhciAqKTsKKyNlbmRpZiAvKl9XSU4zMiovCiAKLXZvaWQJcGNhcF9jbG9zZShwY2FwX3QgKik7Ci1pbnQJcGNhcF9sb29wKHBjYXBfdCAqLCBpbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOwotaW50CXBjYXBfZGlzcGF0Y2gocGNhcF90ICosIGludCwgcGNhcF9oYW5kbGVyLCB1X2NoYXIgKik7Ci1jb25zdCB1X2NoYXIqCi0JcGNhcF9uZXh0KHBjYXBfdCAqLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKik7Ci1pbnQgCXBjYXBfbmV4dF9leChwY2FwX3QgKiwgc3RydWN0IHBjYXBfcGt0aGRyICoqLCBjb25zdCB1X2NoYXIgKiopOwotdm9pZAlwY2FwX2JyZWFrbG9vcChwY2FwX3QgKik7Ci1pbnQJcGNhcF9zdGF0cyhwY2FwX3QgKiwgc3RydWN0IHBjYXBfc3RhdCAqKTsKLWludAlwY2FwX3NldGZpbHRlcihwY2FwX3QgKiwgc3RydWN0IGJwZl9wcm9ncmFtICopOwotaW50IAlwY2FwX3NldGRpcmVjdGlvbihwY2FwX3QgKiwgcGNhcF9kaXJlY3Rpb25fdCk7Ci1pbnQJcGNhcF9nZXRub25ibG9jayhwY2FwX3QgKiwgY2hhciAqKTsKLWludAlwY2FwX3NldG5vbmJsb2NrKHBjYXBfdCAqLCBpbnQsIGNoYXIgKik7Ci1pbnQJcGNhcF9pbmplY3QocGNhcF90ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKLWludAlwY2FwX3NlbmRwYWNrZXQocGNhcF90ICosIGNvbnN0IHVfY2hhciAqLCBpbnQpOwotY29uc3QgY2hhciAqcGNhcF9zdGF0dXN0b3N0cihpbnQpOwotY29uc3QgY2hhciAqcGNhcF9zdHJlcnJvcihpbnQpOwotY2hhcgkqcGNhcF9nZXRlcnIocGNhcF90ICopOwotdm9pZAlwY2FwX3BlcnJvcihwY2FwX3QgKiwgY2hhciAqKTsKLWludAlwY2FwX2NvbXBpbGUocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqLCBjb25zdCBjaGFyICosIGludCwKK1BDQVBfQVBJIHZvaWQJcGNhcF9jbG9zZShwY2FwX3QgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9sb29wKHBjYXBfdCAqLCBpbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOworUENBUF9BUEkgaW50CXBjYXBfZGlzcGF0Y2gocGNhcF90ICosIGludCwgcGNhcF9oYW5kbGVyLCB1X2NoYXIgKik7CitQQ0FQX0FQSSBjb25zdCB1X2NoYXIgKnBjYXBfbmV4dChwY2FwX3QgKiwgc3RydWN0IHBjYXBfcGt0aGRyICopOworUENBUF9BUEkgaW50IAlwY2FwX25leHRfZXgocGNhcF90ICosIHN0cnVjdCBwY2FwX3BrdGhkciAqKiwgY29uc3QgdV9jaGFyICoqKTsKK1BDQVBfQVBJIHZvaWQJcGNhcF9icmVha2xvb3AocGNhcF90ICopOworUENBUF9BUEkgaW50CXBjYXBfc3RhdHMocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXQgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9zZXRmaWx0ZXIocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKK1BDQVBfQVBJIGludCAJcGNhcF9zZXRkaXJlY3Rpb24ocGNhcF90ICosIHBjYXBfZGlyZWN0aW9uX3QpOworUENBUF9BUEkgaW50CXBjYXBfZ2V0bm9uYmxvY2socGNhcF90ICosIGNoYXIgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9zZXRub25ibG9jayhwY2FwX3QgKiwgaW50LCBjaGFyICopOworUENBUF9BUEkgaW50CXBjYXBfaW5qZWN0KHBjYXBfdCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitQQ0FQX0FQSSBpbnQJcGNhcF9zZW5kcGFja2V0KHBjYXBfdCAqLCBjb25zdCB1X2NoYXIgKiwgaW50KTsKK1BDQVBfQVBJIGNvbnN0IGNoYXIgKnBjYXBfc3RhdHVzdG9zdHIoaW50KTsKK1BDQVBfQVBJIGNvbnN0IGNoYXIgKnBjYXBfc3RyZXJyb3IoaW50KTsKK1BDQVBfQVBJIGNoYXIJKnBjYXBfZ2V0ZXJyKHBjYXBfdCAqKTsKK1BDQVBfQVBJIHZvaWQJcGNhcF9wZXJyb3IocGNhcF90ICosIGNvbnN0IGNoYXIgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9jb21waWxlKHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwgY29uc3QgY2hhciAqLCBpbnQsCiAJICAgIGJwZl91X2ludDMyKTsKLWludAlwY2FwX2NvbXBpbGVfbm9wY2FwKGludCwgaW50LCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwKK1BDQVBfQVBJIGludAlwY2FwX2NvbXBpbGVfbm9wY2FwKGludCwgaW50LCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwKIAkgICAgY29uc3QgY2hhciAqLCBpbnQsIGJwZl91X2ludDMyKTsKLXZvaWQJcGNhcF9mcmVlY29kZShzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7Ci1pbnQJcGNhcF9vZmZsaW5lX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwKK1BDQVBfQVBJIHZvaWQJcGNhcF9mcmVlY29kZShzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9vZmZsaW5lX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwKIAkgICAgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWludAlwY2FwX2RhdGFsaW5rKHBjYXBfdCAqKTsKLWludAlwY2FwX2RhdGFsaW5rX2V4dChwY2FwX3QgKik7Ci1pbnQJcGNhcF9saXN0X2RhdGFsaW5rcyhwY2FwX3QgKiwgaW50ICoqKTsKLWludAlwY2FwX3NldF9kYXRhbGluayhwY2FwX3QgKiwgaW50KTsKLXZvaWQJcGNhcF9mcmVlX2RhdGFsaW5rcyhpbnQgKik7Ci1pbnQJcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbChjb25zdCBjaGFyICopOwotY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZShpbnQpOwotY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oaW50KTsKLWludAlwY2FwX3NuYXBzaG90KHBjYXBfdCAqKTsKLWludAlwY2FwX2lzX3N3YXBwZWQocGNhcF90ICopOwotaW50CXBjYXBfbWFqb3JfdmVyc2lvbihwY2FwX3QgKik7Ci1pbnQJcGNhcF9taW5vcl92ZXJzaW9uKHBjYXBfdCAqKTsKK1BDQVBfQVBJIGludAlwY2FwX2RhdGFsaW5rKHBjYXBfdCAqKTsKK1BDQVBfQVBJIGludAlwY2FwX2RhdGFsaW5rX2V4dChwY2FwX3QgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9saXN0X2RhdGFsaW5rcyhwY2FwX3QgKiwgaW50ICoqKTsKK1BDQVBfQVBJIGludAlwY2FwX3NldF9kYXRhbGluayhwY2FwX3QgKiwgaW50KTsKK1BDQVBfQVBJIHZvaWQJcGNhcF9mcmVlX2RhdGFsaW5rcyhpbnQgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbChjb25zdCBjaGFyICopOworUENBUF9BUEkgY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZShpbnQpOworUENBUF9BUEkgY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oaW50KTsKK1BDQVBfQVBJIGludAlwY2FwX3NuYXBzaG90KHBjYXBfdCAqKTsKK1BDQVBfQVBJIGludAlwY2FwX2lzX3N3YXBwZWQocGNhcF90ICopOworUENBUF9BUEkgaW50CXBjYXBfbWFqb3JfdmVyc2lvbihwY2FwX3QgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9taW5vcl92ZXJzaW9uKHBjYXBfdCAqKTsKIAogLyogWFhYICovCi1GSUxFCSpwY2FwX2ZpbGUocGNhcF90ICopOwotaW50CXBjYXBfZmlsZW5vKHBjYXBfdCAqKTsKK1BDQVBfQVBJIEZJTEUJKnBjYXBfZmlsZShwY2FwX3QgKik7CitQQ0FQX0FQSSBpbnQJcGNhcF9maWxlbm8ocGNhcF90ICopOwogCi1wY2FwX2R1bXBlcl90ICpwY2FwX2R1bXBfb3BlbihwY2FwX3QgKiwgY29uc3QgY2hhciAqKTsKLXBjYXBfZHVtcGVyX3QgKnBjYXBfZHVtcF9mb3BlbihwY2FwX3QgKiwgRklMRSAqZnApOwotcGNhcF9kdW1wZXJfdCAqcGNhcF9kdW1wX29wZW5fYXBwZW5kKHBjYXBfdCAqLCBjb25zdCBjaGFyICopOwotRklMRQkqcGNhcF9kdW1wX2ZpbGUocGNhcF9kdW1wZXJfdCAqKTsKLWxvbmcJcGNhcF9kdW1wX2Z0ZWxsKHBjYXBfZHVtcGVyX3QgKik7Ci1pbnQJcGNhcF9kdW1wX2ZsdXNoKHBjYXBfZHVtcGVyX3QgKik7Ci12b2lkCXBjYXBfZHVtcF9jbG9zZShwY2FwX2R1bXBlcl90ICopOwotdm9pZAlwY2FwX2R1bXAodV9jaGFyICosIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CisjaWZkZWYgX1dJTjMyCisgIFBDQVBfQVBJIGludAlwY2FwX3dzb2NraW5pdCh2b2lkKTsKKyNlbmRpZgogCi1pbnQJcGNhcF9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiosIGNoYXIgKik7Ci12b2lkCXBjYXBfZnJlZWFsbGRldnMocGNhcF9pZl90ICopOworUENBUF9BUEkgcGNhcF9kdW1wZXJfdCAqcGNhcF9kdW1wX29wZW4ocGNhcF90ICosIGNvbnN0IGNoYXIgKik7CitQQ0FQX0FQSSBwY2FwX2R1bXBlcl90ICpwY2FwX2R1bXBfZm9wZW4ocGNhcF90ICosIEZJTEUgKmZwKTsKK1BDQVBfQVBJIHBjYXBfZHVtcGVyX3QgKnBjYXBfZHVtcF9vcGVuX2FwcGVuZChwY2FwX3QgKiwgY29uc3QgY2hhciAqKTsKK1BDQVBfQVBJIEZJTEUJKnBjYXBfZHVtcF9maWxlKHBjYXBfZHVtcGVyX3QgKik7CitQQ0FQX0FQSSBsb25nCXBjYXBfZHVtcF9mdGVsbChwY2FwX2R1bXBlcl90ICopOworUENBUF9BUEkgaW50CXBjYXBfZHVtcF9mbHVzaChwY2FwX2R1bXBlcl90ICopOworUENBUF9BUEkgdm9pZAlwY2FwX2R1bXBfY2xvc2UocGNhcF9kdW1wZXJfdCAqKTsKK1BDQVBfQVBJIHZvaWQJcGNhcF9kdW1wKHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwogCi1jb25zdCBjaGFyICpwY2FwX2xpYl92ZXJzaW9uKHZvaWQpOworUENBUF9BUEkgaW50CXBjYXBfZmluZGFsbGRldnMocGNhcF9pZl90ICoqLCBjaGFyICopOworUENBUF9BUEkgdm9pZAlwY2FwX2ZyZWVhbGxkZXZzKHBjYXBfaWZfdCAqKTsKKworUENBUF9BUEkgY29uc3QgY2hhciAqcGNhcF9saWJfdmVyc2lvbih2b2lkKTsKIAogLyoKICAqIE9uIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMgb2YgTmV0QlNEIGFuZCBRTlgsIHdlIGRvbid0IHdhbnQgdG8gZGVjbGFyZQpAQCAtNDMyLDUxICs0NDAsOTYgQEAKICAqIGRlY2xhcmVkIHdoZW4gd2UgYnVpbGQgcGNhcC1icGYuYy4KICAqLwogI2lmICFkZWZpbmVkKF9fTmV0QlNEX18pICYmICFkZWZpbmVkKF9fUU5YX18pCi11X2ludAlicGZfZmlsdGVyKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKKyAgUENBUF9BUEkgdV9pbnQJYnBmX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX2luc24gKiwgY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7CiAjZW5kaWYKLWludAlicGZfdmFsaWRhdGUoY29uc3Qgc3RydWN0IGJwZl9pbnNuICpmLCBpbnQgbGVuKTsKLWNoYXIJKmJwZl9pbWFnZShjb25zdCBzdHJ1Y3QgYnBmX2luc24gKiwgaW50KTsKLXZvaWQJYnBmX2R1bXAoY29uc3Qgc3RydWN0IGJwZl9wcm9ncmFtICosIGludCk7CitQQ0FQX0FQSSBpbnQJYnBmX3ZhbGlkYXRlKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqZiwgaW50IGxlbik7CitQQ0FQX0FQSSBjaGFyCSpicGZfaW1hZ2UoY29uc3Qgc3RydWN0IGJwZl9pbnNuICosIGludCk7CitQQ0FQX0FQSSB2b2lkCWJwZl9kdW1wKGNvbnN0IHN0cnVjdCBicGZfcHJvZ3JhbSAqLCBpbnQpOwogCi0jaWYgZGVmaW5lZChXSU4zMikKKyNpZiBkZWZpbmVkKF9XSU4zMikKIAotLyoKLSAqIFdpbjMyIGRlZmluaXRpb25zCi0gKi8KKyAgLyoKKyAgICogV2luMzIgZGVmaW5pdGlvbnMKKyAgICovCiAKLWludCBwY2FwX3NldGJ1ZmYocGNhcF90ICpwLCBpbnQgZGltKTsKLWludCBwY2FwX3NldG1vZGUocGNhcF90ICpwLCBpbnQgbW9kZSk7Ci1pbnQgcGNhcF9zZXRtaW50b2NvcHkocGNhcF90ICpwLCBpbnQgc2l6ZSk7Ci1BZGFwdGVyICpwY2FwX2dldF9hZGFwdGVyKHBjYXBfdCAqcCk7CisgIC8qIQorICAgIFxicmllZiBBIHF1ZXVlIG9mIHJhdyBwYWNrZXRzIHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBuZXR3b3JrIHdpdGggcGNhcF9zZW5kcXVldWVfdHJhbnNtaXQoKS4KKyAgKi8KKyAgc3RydWN0IHBjYXBfc2VuZF9xdWV1ZQorICB7CisJdV9pbnQgbWF4bGVuOwkvKiBNYXhpbXVtIHNpemUgb2YgdGhlIHRoZSBxdWV1ZSwgaW4gYnl0ZXMuIFRoaXMKKwkJCSAgIHZhcmlhYmxlIGNvbnRhaW5zIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgZmllbGQuICovCisJdV9pbnQgbGVuOwkvKiBDdXJyZW50IHNpemUgb2YgdGhlIHF1ZXVlLCBpbiBieXRlcy4gKi8KKwljaGFyICpidWZmZXI7CS8qIEJ1ZmZlciBjb250YWluaW5nIHRoZSBwYWNrZXRzIHRvIGJlIHNlbnQuICovCisgIH07CiAKLSNpZmRlZiBXUENBUAotLyogSW5jbHVkZSBmaWxlIHdpdGggdGhlIHdwY2FwLXNwZWNpZmljIGV4dGVuc2lvbnMgKi8KLSNpbmNsdWRlIDxXaW4zMi1FeHRlbnNpb25zLmg+Ci0jZW5kaWYgLyogV1BDQVAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgcGNhcF9zZW5kX3F1ZXVlIHBjYXBfc2VuZF9xdWV1ZTsKIAotI2RlZmluZSBNT0RFX0NBUFQgMAotI2RlZmluZSBNT0RFX1NUQVQgMQotI2RlZmluZSBNT0RFX01PTiAyCisgIC8qIQorICAgIFxicmllZiBUaGlzIHR5cGVkZWYgaXMgYSBzdXBwb3J0IGZvciB0aGUgcGNhcF9nZXRfYWlycGNhcF9oYW5kbGUoKSBmdW5jdGlvbgorICAqLworICAjaWYgIWRlZmluZWQoQUlSUENBUF9IQU5ETEVfX0VBRTQwNUY1XzAxNzFfOTU5Ml9CM0MyX0MxOUVDNDI2QUQzNF9fREVGSU5FRF8pCisgICAgI2RlZmluZSBBSVJQQ0FQX0hBTkRMRV9fRUFFNDA1RjVfMDE3MV85NTkyX0IzQzJfQzE5RUM0MjZBRDM0X19ERUZJTkVEXworICAgIHR5cGVkZWYgc3RydWN0IF9BaXJwY2FwSGFuZGxlICpQQWlycGNhcEhhbmRsZTsKKyAgI2VuZGlmCisKKyAgUENBUF9BUEkgaW50IHBjYXBfc2V0YnVmZihwY2FwX3QgKnAsIGludCBkaW0pOworICBQQ0FQX0FQSSBpbnQgcGNhcF9zZXRtb2RlKHBjYXBfdCAqcCwgaW50IG1vZGUpOworICBQQ0FQX0FQSSBpbnQgcGNhcF9zZXRtaW50b2NvcHkocGNhcF90ICpwLCBpbnQgc2l6ZSk7CisKKyAgUENBUF9BUEkgSEFORExFIHBjYXBfZ2V0ZXZlbnQocGNhcF90ICpwKTsKKworICBQQ0FQX0FQSSBpbnQgcGNhcF9vaWRfZ2V0X3JlcXVlc3QocGNhcF90ICosIGJwZl91X2ludDMyLCB2b2lkICosIHNpemVfdCAqKTsKKyAgUENBUF9BUEkgaW50IHBjYXBfb2lkX3NldF9yZXF1ZXN0KHBjYXBfdCAqLCBicGZfdV9pbnQzMiwgY29uc3Qgdm9pZCAqLCBzaXplX3QgKik7CisKKyAgUENBUF9BUEkgcGNhcF9zZW5kX3F1ZXVlKiBwY2FwX3NlbmRxdWV1ZV9hbGxvYyh1X2ludCBtZW1zaXplKTsKKworICBQQ0FQX0FQSSB2b2lkIHBjYXBfc2VuZHF1ZXVlX2Rlc3Ryb3kocGNhcF9zZW5kX3F1ZXVlKiBxdWV1ZSk7CisKKyAgUENBUF9BUEkgaW50IHBjYXBfc2VuZHF1ZXVlX3F1ZXVlKHBjYXBfc2VuZF9xdWV1ZSogcXVldWUsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqcGt0X2hlYWRlciwgY29uc3QgdV9jaGFyICpwa3RfZGF0YSk7CisKKyAgUENBUF9BUEkgdV9pbnQgcGNhcF9zZW5kcXVldWVfdHJhbnNtaXQocGNhcF90ICpwLCBwY2FwX3NlbmRfcXVldWUqIHF1ZXVlLCBpbnQgc3luYyk7CisKKyAgUENBUF9BUEkgc3RydWN0IHBjYXBfc3RhdCAqcGNhcF9zdGF0c19leChwY2FwX3QgKnAsIGludCAqcGNhcF9zdGF0X3NpemUpOworCisgIFBDQVBfQVBJIGludCBwY2FwX3NldHVzZXJidWZmZXIocGNhcF90ICpwLCBpbnQgc2l6ZSk7CisKKyAgUENBUF9BUEkgaW50IHBjYXBfbGl2ZV9kdW1wKHBjYXBfdCAqcCwgY2hhciAqZmlsZW5hbWUsIGludCBtYXhzaXplLCBpbnQgbWF4cGFja3MpOworCisgIFBDQVBfQVBJIGludCBwY2FwX2xpdmVfZHVtcF9lbmRlZChwY2FwX3QgKnAsIGludCBzeW5jKTsKKworICBQQ0FQX0FQSSBpbnQgcGNhcF9zdGFydF9vZW0oY2hhciogZXJyX3N0ciwgaW50IGZsYWdzKTsKKworICBQQ0FQX0FQSSBQQWlycGNhcEhhbmRsZSBwY2FwX2dldF9haXJwY2FwX2hhbmRsZShwY2FwX3QgKnApOworCisgICNkZWZpbmUgTU9ERV9DQVBUIDAKKyAgI2RlZmluZSBNT0RFX1NUQVQgMQorICAjZGVmaW5lIE1PREVfTU9OIDIKIAogI2VsaWYgZGVmaW5lZChNU0RPUykKIAotLyoKLSAqIE1TLURPUyBkZWZpbml0aW9ucwotICovCisgIC8qCisgICAqIE1TLURPUyBkZWZpbml0aW9ucworICAgKi8KIAotaW50ICBwY2FwX3N0YXRzX2V4IChwY2FwX3QgKiwgc3RydWN0IHBjYXBfc3RhdF9leCAqKTsKLXZvaWQgcGNhcF9zZXRfd2FpdCAocGNhcF90ICpwLCB2b2lkICgqeWllbGQpKHZvaWQpLCBpbnQgd2FpdCk7Ci11X2xvbmcgcGNhcF9tYWNfcGFja2V0cyAodm9pZCk7CisgIFBDQVBfQVBJIGludCAgcGNhcF9zdGF0c19leCAocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXRfZXggKik7CisgIFBDQVBfQVBJIHZvaWQgcGNhcF9zZXRfd2FpdCAocGNhcF90ICpwLCB2b2lkICgqeWllbGQpKHZvaWQpLCBpbnQgd2FpdCk7CisgIFBDQVBfQVBJIHVfbG9uZyBwY2FwX21hY19wYWNrZXRzICh2b2lkKTsKIAogI2Vsc2UgLyogVU4qWCAqLwogCi0vKgotICogVU4qWCBkZWZpbml0aW9ucwotICovCisgIC8qCisgICAqIFVOKlggZGVmaW5pdGlvbnMKKyAgICovCiAKLWludAlwY2FwX2dldF9zZWxlY3RhYmxlX2ZkKHBjYXBfdCAqKTsKKyAgUENBUF9BUEkgaW50CXBjYXBfZ2V0X3NlbGVjdGFibGVfZmQocGNhcF90ICopOwogCi0jZW5kaWYgLyogV0lOMzIvTVNET1MvVU4qWCAqLworI2VuZGlmIC8qIF9XSU4zMi9NU0RPUy9VTipYICovCisKKyNpZmRlZiBIQVZFX1JFTU9URQorICAvKiBJbmNsdWRlcyBtb3N0IG9mIHRoZSBwdWJsaWMgc3R1ZmYgdGhhdCBpcyBuZWVkZWQgZm9yIHRoZSByZW1vdGUgY2FwdHVyZSAqLworICAjaW5jbHVkZSA8cmVtb3RlLWV4dC5oPgorI2VuZGlmCSAvKiBIQVZFX1JFTU9URSAqLwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3BjYXAvc2xsLmggYi9wY2FwL3NsbC5oCmluZGV4IDM4ZGEyOWYuLmI0NmQxNWYgMTAwNjQ0Ci0tLSBhL3BjYXAvc2xsLmgKKysrIGIvcGNhcC9zbGwuaApAQCAtMTIzLDUgKzEyMyw3IEBACiAgKi8KICNkZWZpbmUgTElOVVhfU0xMX1BfODAyXzMJMHgwMDAxCS8qIE5vdmVsbCA4MDIuMyBmcmFtZXMgd2l0aG91dCA4MDIuMiBMTEMgaGVhZGVyICovCiAjZGVmaW5lIExJTlVYX1NMTF9QXzgwMl8yCTB4MDAwNAkvKiA4MDIuMiBmcmFtZXMgKG5vdCBEL0kvWCBFdGhlcm5ldCkgKi8KKyNkZWZpbmUgTElOVVhfU0xMX1BfQ0FOCQkweDAwMEMJLyogQ0FOIGZyYW1lcywgd2l0aCBTb2NrZXRDQU4gcHNldWRvLWhlYWRlcnMgKi8KKyNkZWZpbmUgTElOVVhfU0xMX1BfQ0FORkQJMHgwMDBECS8qIENBTiBGRCBmcmFtZXMsIHdpdGggU29ja2V0Q0FOIHBzZXVkby1oZWFkZXJzICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvcGNhcC91c2IuaCBiL3BjYXAvdXNiLmgKaW5kZXggODM5NTUyNy4uMjZhOTA0NiAxMDA2NDQKLS0tIGEvcGNhcC91c2IuaAorKysgYi9wY2FwL3VzYi5oCkBAIC0zMSw4ICszMSw4IEBACiAgKiBCeSBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+CiAgKi8KIAotI2lmbmRlZiBfUENBUF9VU0JfU1RSVUNUU19IX18KLSNkZWZpbmUgX1BDQVBfVVNCX1NUUlVDVFNfSF9fCisjaWZuZGVmIGxpYl9wY2FwX3VzYl9oCisjZGVmaW5lIGxpYl9wY2FwX3VzYl9oCiAKIC8qCiAgKiBwb3NzaWJsZSB0cmFuc2ZlciBtb2RlCmRpZmYgLS1naXQgYS9wY2FwX2FjdGl2YXRlLjNwY2FwIGIvcGNhcF9hY3RpdmF0ZS4zcGNhcAppbmRleCA2MTg4N2E3Li44Yzg5OTM5IDEwMDY0NAotLS0gYS9wY2FwX2FjdGl2YXRlLjNwY2FwCisrKyBiL3BjYXBfYWN0aXZhdGUuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0FDVElWQVRFIDNQQ0FQICIyMSBTZXB0ZW1iZXIgMjAxMCIKKy5USCBQQ0FQX0FDVElWQVRFIDNQQ0FQICI3IEFwcmlsIDIwMTQiCiAuU0ggTkFNRQogcGNhcF9hY3RpdmF0ZSBcLSBhY3RpdmF0ZSBhIGNhcHR1cmUgaGFuZGxlCiAuU0ggU1lOT1BTSVMKQEAgLTM3LDQ2ICszNyw2NSBAQAogYmVpbmcgaW4gZWZmZWN0LgogLlNIIFJFVFVSTiBWQUxVRQogLkIgcGNhcF9hY3RpdmF0ZSgpCi1yZXR1cm5zIDAgb24gc3VjY2VzcyB3aXRob3V0IHdhcm5pbmdzLAorcmV0dXJucyAwIG9uIHN1Y2Nlc3Mgd2l0aG91dCB3YXJuaW5ncywgYSBub24temVybyBwb3NpdGl2ZSB2YWx1ZSBvbgorc3VjY2VzcyB3aXRoIHdhcm5pbmdzLCBhbmQgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KK0Egbm9uLXplcm8gcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGF0IHdhcm5pbmcgb3IgZXJyb3IgY29uZGl0aW9uCitvY2N1cnJlZC4KKy5MUAorVGhlIHBvc3NpYmxlIHdhcm5pbmcgdmFsdWVzIGFyZToKKy5UUAogLkIgUENBUF9XQVJOSU5HX1BST01JU0NfTk9UU1VQCi1vbiBzdWNjZXNzIG9uIGEgZGV2aWNlIHRoYXQgZG9lc24ndCBzdXBwb3J0IHByb21pc2N1b3VzIG1vZGUgaWYKLXByb21pc2N1b3VzIG1vZGUgd2FzIHJlcXVlc3RlZCwKK1Byb21pc2N1b3VzIG1vZGUgd2FzIHJlcXVlc3RlZCwgYnV0IHRoZSBjYXB0dXJlIHNvdXJjZSBkb2Vzbid0IHN1cHBvcnQKK3Byb21pc2N1b3VzIG1vZGUuCisuVFAKIC5CIFBDQVBfV0FSTklOR19UU1RBTVBfVFlQRV9OT1RTVVAKLW9uIHN1Y2Nlc3MgaWYgdGhlIHRpbWUgc3RhbXAgdHlwZSBzcGVjaWZpZWQgaW4gYSBwcmV2aW91cworVGhlIHRpbWUgc3RhbXAgdHlwZSBzcGVjaWZpZWQgaW4gYSBwcmV2aW91cwogLkIgcGNhcF9zZXRfdHN0YW1wX3R5cGUoKQogY2FsbCBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIGNhcHR1cmUgc291cmNlICh0aGUgdGltZSBzdGFtcCB0eXBlIGlzCiBsZWZ0IGFzIHRoZSBkZWZhdWx0KSwKKy5UUAogLkIgUENBUF9XQVJOSU5HCi1vbiBzdWNjZXNzIHdpdGggYW55IG90aGVyIHdhcm5pbmcsCi0uQiBQQ0FQX0VSUk9SX0FDVElWQVRFRAotaWYgdGhlIGhhbmRsZSBoYXMgYWxyZWFkeSBiZWVuIGFjdGl2YXRlZCwKLS5CIFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0UKLWlmIHRoZSBjYXB0dXJlIHNvdXJjZSBzcGVjaWZpZWQgd2hlbiB0aGUgaGFuZGxlIHdhcyBjcmVhdGVkIGRvZXNuJ3QKLWV4aXN0LAotLkIgUENBUF9FUlJPUl9QRVJNX0RFTklFRAotaWYgdGhlIHByb2Nlc3MgZG9lc24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiB0aGUgY2FwdHVyZSBzb3VyY2UsCi0uQiBQQ0FQX0VSUk9SX1BST01JU0NfUEVSTV9ERU5JRUQKLWlmIHRoZSBwcm9jZXNzIGhhcyBwZXJtaXNzaW9uIHRvIG9wZW4gdGhlIGNhcHR1cmUgc291cmNlIGJ1dCBkb2Vzbid0Ci1oYXZlIHBlcm1pc3Npb24gdG8gcHV0IGl0IGludG8gcHJvbWlzY3VvdXMgbW9kZSwKLS5CIFBDQVBfRVJST1JfUkZNT05fTk9UU1VQCi1pZiBtb25pdG9yIG1vZGUgd2FzIHNwZWNpZmllZCBidXQgdGhlIGNhcHR1cmUgc291cmNlIGRvZXNuJ3Qgc3VwcG9ydAotbW9uaXRvciBtb2RlLAotLkIgUENBUF9FUlJPUl9JRkFDRV9OT1RfVVAKLWlmIHRoZSBjYXB0dXJlIHNvdXJjZSBpcyBub3QgdXAsIGFuZAotLkIgUENBUF9FUlJPUgotaWYgYW5vdGhlciBlcnJvciBvY2N1cnJlZC4KLUlmCi0uQiBQQ0FQX1dBUk5JTkcKLW9yCi0uQiBQQ0FQX0VSUk9SCi1pcyByZXR1cm5lZCwKK0Fub3RoZXIgd2FybmluZyBjb25kaXRpb24gb2NjdXJyZWQ7CiAuQiBwY2FwX2dldGVycigpCiBvcgogLkIgcGNhcF9wZXJyb3IoKQogbWF5IGJlIGNhbGxlZCB3aXRoCiAuSSBwCi1hcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSB3YXJuaW5nIG9yCi1lcnJvci4KK2FzIGFuIGFyZ3VtZW50IHRvIGZldGNoIG9yIGRpc3BsYXkgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIHdhcm5pbmcKK2NvbmRpdGlvbi4KKy5MUAorVGhlIHBvc3NpYmxlIGVycm9yIHZhbHVlcyBhcmU6CisuVFAKKy5CIFBDQVBfRVJST1JfQUNUSVZBVEVECitUaGUgaGFuZGxlIGhhcyBhbHJlYWR5IGJlZW4gYWN0aXZhdGVkLgorLlRQCisuQiBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFCitUaGUgY2FwdHVyZSBzb3VyY2Ugc3BlY2lmaWVkIHdoZW4gdGhlIGhhbmRsZSB3YXMgY3JlYXRlZCBkb2Vzbid0CitleGlzdC4KKy5UUAorLkIgUENBUF9FUlJPUl9QRVJNX0RFTklFRAorVGhlIHByb2Nlc3MgZG9lc24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiB0aGUgY2FwdHVyZSBzb3VyY2UuCisuVFAKKy5CIFBDQVBfRVJST1JfUFJPTUlTQ19QRVJNX0RFTklFRAorVGhlIHByb2Nlc3MgaGFzIHBlcm1pc3Npb24gdG8gb3BlbiB0aGUgY2FwdHVyZSBzb3VyY2UgYnV0IGRvZXNuJ3QKK2hhdmUgcGVybWlzc2lvbiB0byBwdXQgaXQgaW50byBwcm9taXNjdW91cyBtb2RlLgorLlRQCisuQiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUAorTW9uaXRvciBtb2RlIHdhcyBzcGVjaWZpZWQgYnV0IHRoZSBjYXB0dXJlIHNvdXJjZSBkb2Vzbid0IHN1cHBvcnQKK21vbml0b3IgbW9kZS4KKy5UUAorLkIgUENBUF9FUlJPUl9JRkFDRV9OT1RfVVAKK1RoZSBjYXB0dXJlIHNvdXJjZSBkZXZpY2UgaXMgbm90IHVwLgorLlRQCisuQiBQQ0FQX0VSUk9SCitBbm90aGVyIGVycm9yIG9jY3VycmVkLgorLkIgcGNhcF9nZXRlcnIoKQorb3IKKy5CIHBjYXBfcGVycm9yKCkKK21heSBiZSBjYWxsZWQgd2l0aAorLkkgcAorYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisuTFAKIElmCiAuQlIgUENBUF9XQVJOSU5HX1BST01JU0NfTk9UU1VQICwKIC5CUiBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFICwKQEAgLTkxLDUgKzExMCwxMyBAQAogYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSBhbiBtZXNzYWdlIGdpdmluZyBhZGRpdGlvbmFsIGRldGFpbHMKIGFib3V0IHRoZSBwcm9ibGVtIHRoYXQgbWlnaHQgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgdGhlIHByb2JsZW0gaWYgaXQncwogdW5leHBlY3RlZC4KKy5MUAorQWRkaXRpb25hbCB3YXJuaW5nIGFuZCBlcnJvciBjb2RlcyBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZTsgYSBwcm9ncmFtCitzaG91bGQgY2hlY2sgZm9yIHBvc2l0aXZlLCBuZWdhdGl2ZSwgYW5kIHplcm8gcmV0dXJuIGNvZGVzLCBhbmQgdHJlYXQKK2FsbCBwb3NpdGl2ZSByZXR1cm4gY29kZXMgYXMgd2FybmluZ3MgYW5kIGFsbCBuZWdhdGl2ZSByZXR1cm4KK2NvZGVzIGFzIGVycm9ycy4KKy5CIHBjYXBfc3RhdHVzdG9zdHIoKQorY2FuIGJlIGNhbGxlZCwgd2l0aCBhIHdhcm5pbmcgb3IgZXJyb3IgY29kZSBhcyBhbiBhcmd1bWVudCwgdG8gZmV0Y2ggYQorbWVzc2FnZSBkZXNjcmliaW5nIHRoZSB3YXJuaW5nIG9yIGVycm9yIGNvZGUuCiAuU0ggU0VFIEFMU08KIHBjYXAoM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX2JyZWFrbG9vcC4zcGNhcCBiL3BjYXBfYnJlYWtsb29wLjNwY2FwCmluZGV4IDY3NDQ5MjQuLjNmOTMyN2IgMTAwNjQ0Ci0tLSBhL3BjYXBfYnJlYWtsb29wLjNwY2FwCisrKyBiL3BjYXBfYnJlYWtsb29wLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9CUkVBS0xPT1AgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5USCBQQ0FQX0JSRUFLTE9PUCAzUENBUCAiOCBNYXJjaCAyMDE1IgogLlNIIE5BTUUKIHBjYXBfYnJlYWtsb29wIFwtIGZvcmNlIGEgcGNhcF9kaXNwYXRjaCgpIG9yIHBjYXBfbG9vcCgpIGNhbGwgdG8gcmV0dXJuCiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfY2FuX3NldF9yZm1vbi4zcGNhcCBiL3BjYXBfY2FuX3NldF9yZm1vbi4zcGNhcAppbmRleCBiNTc5ODA0Li4zODllNTBkIDEwMDY0NAotLS0gYS9wY2FwX2Nhbl9zZXRfcmZtb24uM3BjYXAKKysrIGIvcGNhcF9jYW5fc2V0X3JmbW9uLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9DQU5fU0VUX1JGTU9OIDNQQ0FQICIxOCBNYXkgMjAxMCIKKy5USCBQQ0FQX0NBTl9TRVRfUkZNT04gM1BDQVAgIjMgSmFudWFyeSAyMDE0IgogLlNIIE5BTUUKIHBjYXBfY2FuX3NldF9yZm1vbiBcLSBjaGVjayB3aGV0aGVyIG1vbml0b3IgbW9kZSBjYW4gYmUgc2V0IGZvciBhCiBub3QteWV0LWFjdGl2YXRlZCBjYXB0dXJlIGhhbmRsZQpAQCAtMzcsMjYgKzM3LDM2IEBACiAuU0ggUkVUVVJOIFZBTFVFCiAuQiBwY2FwX2Nhbl9zZXRfcmZtb24oKQogcmV0dXJucyAwIGlmIG1vbml0b3IgbW9kZSBjb3VsZCBub3QgYmUgc2V0LAotMSBpZiBtb25pdG9yIG1vZGUgY291bGQgYmUgc2V0LAorMSBpZiBtb25pdG9yIG1vZGUgY291bGQgYmUgc2V0LCBhbmQgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KK0EgbmVnYXRpdmUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGF0IGVycm9yIGNvbmRpdGlvbiBvY2N1cnJlZC4KK1RoZSBwb3NzaWJsZSBlcnJvciB2YWx1ZXMgYXJlOgorLlRQCiAuQiBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFCi1pZiB0aGUgY2FwdHVyZSBzb3VyY2Ugc3BlY2lmaWVkIHdoZW4gdGhlIGhhbmRsZSB3YXMgY3JlYXRlZCBkb2Vzbid0Ci1leGlzdCwKK1RoZSBjYXB0dXJlIHNvdXJjZSBzcGVjaWZpZWQgd2hlbiB0aGUgaGFuZGxlIHdhcyBjcmVhdGVkIGRvZXNuJ3QKK2V4aXN0LgorLlRQCiAuQiBQQ0FQX0VSUk9SX1BFUk1fREVOSUVECi1pZiB0aGUgcHJvY2VzcyBkb2Vzbid0IGhhdmUgcGVybWlzc2lvbiB0byBjaGVjayB3aGV0aGVyIG1vbml0b3IgbW9kZQotY291bGQgYmUgc3VwcG9ydGVkLAorVGhlIHByb2Nlc3MgZG9lc24ndCBoYXZlIHBlcm1pc3Npb24gdG8gY2hlY2sgd2hldGhlciBtb25pdG9yIG1vZGUKK2NvdWxkIGJlIHN1cHBvcnRlZC4KKy5UUAogLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKLWlmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkLCBvcgorVGhlIGNhcHR1cmUgaGFuZGxlIGhhcyBhbHJlYWR5IGJlZW4gYWN0aXZhdGVkLgorLlRQCiAuQiBQQ0FQX0VSUk9SCi1pZiBhbiBlcnJvciBvY2N1cnJlZC4KLUlmCi0uQiBQQ0FQX0VSUk9SCi1pcyByZXR1cm5lZCwKK0Fub3RoZXIgZXJyb3Igb2NjdXJyZWQuCiAuQiBwY2FwX2dldGVycigpCiBvcgogLkIgcGNhcF9wZXJyb3IoKQogbWF5IGJlIGNhbGxlZCB3aXRoCiAuSSBwCi1hcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisuTFAKK0FkZGl0aW9uYWwgZXJyb3IgY29kZXMgbWF5IGJlIGFkZGVkIGluIHRoZSBmdXR1cmU7IGEgcHJvZ3JhbSBzaG91bGQKK2NoZWNrIGZvciAwLCAxLCBhbmQgbmVnYXRpdmUsIHJldHVybiBjb2RlcywgYW5kIHRyZWF0IGFsbCBuZWdhdGl2ZQorcmV0dXJuIGNvZGVzIGFzIGVycm9ycy4KKy5CIHBjYXBfc3RhdHVzdG9zdHIoKQorY2FuIGJlIGNhbGxlZCwgd2l0aCBhIHdhcm5pbmcgb3IgZXJyb3IgY29kZSBhcyBhbiBhcmd1bWVudCwgdG8gZmV0Y2ggYQorbWVzc2FnZSBkZXNjcmliaW5nIHRoZSB3YXJuaW5nIG9yIGVycm9yIGNvZGUuCiAuU0ggU0VFIEFMU08KIHBjYXAoM1BDQVApLCBwY2FwX2NyZWF0ZSgzUENBUCksIHBjYXBfYWN0aXZhdGUoM1BDQVApLAogcGNhcF9zZXRfcmZtb24oM1BDQVApCmRpZmYgLS1naXQgYS9wY2FwX2Nsb3NlLjNwY2FwIGIvcGNhcF9jbG9zZS4zcGNhcAppbmRleCA5MWViNjc3Li5lMjMxNmE0IDEwMDY0NAotLS0gYS9wY2FwX2Nsb3NlLjNwY2FwCisrKyBiL3BjYXBfY2xvc2UuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0NMT1NFIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuVEggUENBUF9DTE9TRSAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCiAuU0ggTkFNRQogcGNhcF9jbG9zZSBcLSBjbG9zZSBhIGNhcHR1cmUgZGV2aWNlIG9yIHNhdmVmaWxlCiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfY29tcGlsZS4zcGNhcCBiL3BjYXBfY29tcGlsZS4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWIyMGJlCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9jb21waWxlLjNwY2FwCkBAIC0wLDAgKzEsNzAgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9DT01QSUxFIDNQQ0FQICI3IEFwcmlsIDIwMTQiCisuU0ggTkFNRQorcGNhcF9jb21waWxlIFwtIGNvbXBpbGUgYSBmaWx0ZXIgZXhwcmVzc2lvbgorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX2NvbXBpbGUocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwLAorLnRpICs4Citjb25zdCBjaGFyICpzdHIsIGludCBvcHRpbWl6ZSwgYnBmX3VfaW50MzIgbmV0bWFzayk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2NvbXBpbGUoKQoraXMgdXNlZCB0byBjb21waWxlIHRoZSBzdHJpbmcKKy5JIHN0cgoraW50byBhIGZpbHRlciBwcm9ncmFtLiAgU2VlCisuQlIgcGNhcC1maWx0ZXIgKDcpCitmb3IgdGhlIHN5bnRheCBvZiB0aGF0IHN0cmluZy4KKy5JIHByb2dyYW0KK2lzIGEgcG9pbnRlciB0byBhCisuSSBicGZfcHJvZ3JhbQorc3RydWN0IGFuZCBpcyBmaWxsZWQgaW4gYnkKKy5CUiBwY2FwX2NvbXBpbGUoKSAuCisuSSBvcHRpbWl6ZQorY29udHJvbHMgd2hldGhlciBvcHRpbWl6YXRpb24gb24gdGhlIHJlc3VsdGluZyBjb2RlIGlzIHBlcmZvcm1lZC4KKy5JIG5ldG1hc2sKK3NwZWNpZmllcyB0aGUgSVB2NCBuZXRtYXNrIG9mIHRoZSBuZXR3b3JrIG9uIHdoaWNoIHBhY2tldHMgYXJlIGJlaW5nCitjYXB0dXJlZDsgaXQgaXMgdXNlZCBvbmx5IHdoZW4gY2hlY2tpbmcgZm9yIElQdjQgYnJvYWRjYXN0IGFkZHJlc3NlcyBpbgordGhlIGZpbHRlciBwcm9ncmFtLiAgSWYgdGhlIG5ldG1hc2sgb2YgdGhlIG5ldHdvcmsgb24gd2hpY2ggcGFja2V0cyBhcmUKK2JlaW5nIGNhcHR1cmVkIGlzbid0IGtub3duIHRvIHRoZSBwcm9ncmFtLCBvciBpZiBwYWNrZXRzIGFyZSBiZWluZworY2FwdHVyZWQgb24gdGhlIExpbnV4ICJhbnkiIHBzZXVkby1pbnRlcmZhY2UgdGhhdCBjYW4gY2FwdHVyZSBvbiBtb3JlCit0aGFuIG9uZSBuZXR3b3JrLCBhIHZhbHVlIG9mIFBDQVBfTkVUTUFTS19VTktOT1dOIGNhbiBiZSBzdXBwbGllZDsgdGVzdHMKK2ZvciBJUHY0IGJyb2FkY2FzdCBhZGRyZXNzZXMgd2lsbCBmYWlsIHRvIGNvbXBpbGUsIGJ1dCBhbGwgb3RoZXIgdGVzdHMgaW4KK3RoZSBmaWx0ZXIgcHJvZ3JhbSB3aWxsIGJlIE9LLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9jb21waWxlKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBcLTEgb24gZmFpbHVyZS4KK0lmIFwtMSBpcyByZXR1cm5lZCwKKy5CIHBjYXBfZ2V0ZXJyKCkKK29yCisuQiBwY2FwX3BlcnJvcigpCittYXkgYmUgY2FsbGVkIHdpdGgKKy5JIHAKK2FzIGFuIGFyZ3VtZW50IHRvIGZldGNoIG9yIGRpc3BsYXkgdGhlIGVycm9yIHRleHQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX3NldGZpbHRlcigzUENBUCksIHBjYXBfZnJlZWNvZGUoM1BDQVApLAorcGNhcF9nZXRlcnIoM1BDQVApLCBwY2FwLWZpbHRlcig3KQpkaWZmIC0tZ2l0IGEvcGNhcF9jb21waWxlLjNwY2FwLmluIGIvcGNhcF9jb21waWxlLjNwY2FwLmluCmluZGV4IDBlNTI3NmEuLjJiZDBlYjQgMTAwNjQ0Ci0tLSBhL3BjYXBfY29tcGlsZS4zcGNhcC5pbgorKysgYi9wY2FwX2NvbXBpbGUuM3BjYXAuaW4KQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0NPTVBJTEUgM1BDQVAgIjEgRGVjZW1iZXIgMjAwOSIKKy5USCBQQ0FQX0NPTVBJTEUgM1BDQVAgIjcgQXByaWwgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX2NvbXBpbGUgXC0gY29tcGlsZSBhIGZpbHRlciBleHByZXNzaW9uCiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfY3JlYXRlLjNwY2FwIGIvcGNhcF9jcmVhdGUuM3BjYXAKaW5kZXggNWM1MzdmYy4uMzA0MGIzYiAxMDA2NDQKLS0tIGEvcGNhcF9jcmVhdGUuM3BjYXAKKysrIGIvcGNhcF9jcmVhdGUuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0NSRUFURSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlRIIFBDQVBfQ1JFQVRFIDNQQ0FQICIzIEphbnVhcnkgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX2NyZWF0ZSBcLSBjcmVhdGUgYSBsaXZlIGNhcHR1cmUgaGFuZGxlCiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfZGF0YWxpbmsuM3BjYXAgYi9wY2FwX2RhdGFsaW5rLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYjEwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2RhdGFsaW5rLjNwY2FwCkBAIC0wLDAgKzEsNjggQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9EQVRBTElOSyAzUENBUCAiNyBBcHJpbCAyMDE0IgorLlNIIE5BTUUKK3BjYXBfZGF0YWxpbmsgXC0gZ2V0IHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfZGF0YWxpbmsocGNhcF90ICpwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfZGF0YWxpbmsoKQorcmV0dXJucyB0aGUgbGluay1sYXllciBoZWFkZXIgdHlwZSBmb3IgdGhlIGxpdmUgY2FwdHVyZSBvciBgYHNhdmVmaWxlJycKK3NwZWNpZmllZCBieQorLklSIHAgLgorLlBQCitJdCBtdXN0IG5vdCBiZSBjYWxsZWQgb24gYSBwY2FwIGRlc2NyaXB0b3IgY3JlYXRlZCBieQorLkIgcGNhcF9jcmVhdGUoKQordGhhdCBoYXMgbm90IHlldCBiZWVuIGFjdGl2YXRlZCBieQorLkJSIHBjYXBfYWN0aXZhdGUoKSAuCisuUFAKKy5JIGh0dHA6Ly93d3cudGNwZHVtcC5vcmcvbGlua3R5cGVzLmh0bWwKK2xpc3RzIHRoZSB2YWx1ZXMKKy5CIHBjYXBfZGF0YWxpbmsoKQorY2FuIHJldHVybiBhbmQgZGVzY3JpYmVzIHRoZSBwYWNrZXQgZm9ybWF0cyB0aGF0Citjb3JyZXNwb25kIHRvIHRob3NlIHZhbHVlcy4KKy5QUAorRG8KKy5CIE5PVAorYXNzdW1lIHRoYXQgdGhlIHBhY2tldHMgZm9yIGEgZ2l2ZW4gY2FwdHVyZSBvciBgYHNhdmVmaWxlYGAgd2lsbCBoYXZlCithbnkgZ2l2ZW4gbGluay1sYXllciBoZWFkZXIgdHlwZSwgc3VjaCBhcworLkIgRExUX0VOMTBNQgorZm9yIEV0aGVybmV0LiAgRm9yIGV4YW1wbGUsIHRoZSAiYW55IiBkZXZpY2Ugb24gTGludXggd2lsbCBoYXZlIGEKK2xpbmstbGF5ZXIgaGVhZGVyIHR5cGUgb2YKKy5CIERMVF9MSU5VWF9TTEwKK2V2ZW4gaWYgYWxsIGRldmljZXMgb24gdGhlIHN5c3RlbSBhdCB0aGUgdGltZSB0aGUgImFueSIgZGV2aWNlIGlzIG9wZW5lZAoraGF2ZSBzb21lIG90aGVyIGRhdGEgbGluayB0eXBlLCBzdWNoIGFzCisuQiBETFRfRU4xME1CCitmb3IgRXRoZXJuZXQuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX2RhdGFsaW5rKCkKK3JldHVybnMgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgb24gc3VjY2VzcyBhbmQKKy5CIFBDQVBfRVJST1JfTk9UX0FDVElWQVRFRAoraWYgY2FsbGVkIG9uIGEgY2FwdHVyZSBoYW5kbGUgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIGJ1dCBub3QgYWN0aXZhdGVkLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcC1saW5rdHlwZSg3KQpkaWZmIC0tZ2l0IGEvcGNhcF9kYXRhbGluay4zcGNhcC5pbiBiL3BjYXBfZGF0YWxpbmsuM3BjYXAuaW4KaW5kZXggYjA3ZmMyOC4uYmU1MGE2NCAxMDA2NDQKLS0tIGEvcGNhcF9kYXRhbGluay4zcGNhcC5pbgorKysgYi9wY2FwX2RhdGFsaW5rLjNwY2FwLmluCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9EQVRBTElOSyAzUENBUCAiMTMgT2N0b2JlciAyMDEzIgorLlRIIFBDQVBfREFUQUxJTksgM1BDQVAgIjcgQXByaWwgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX2RhdGFsaW5rIFwtIGdldCB0aGUgbGluay1sYXllciBoZWFkZXIgdHlwZQogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsLjNwY2FwIGIvcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbC4zcGNhcAppbmRleCA0YmMxNzI4Li44YTY5MDVhIDEwMDY0NAotLS0gYS9wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsLjNwY2FwCisrKyBiL3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWwuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0RBVEFMSU5LX05BTUVfVE9fVkFMIDNQQ0FQICIyMiBBdWd1c3QgMjAxMCIKKy5USCBQQ0FQX0RBVEFMSU5LX05BTUVfVE9fVkFMIDNQQ0FQICI1IERlY2VtYmVyIDIwMTQiCiAuU0ggTkFNRQogcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCBcLSBnZXQgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgdmFsdWUKIGNvcnJlc3BvbmRpbmcgdG8gYSBoZWFkZXIgdHlwZSBuYW1lCkBAIC00MSw2ICs0MSw3IEBACiB0cmFuc2xhdGlvbiBpcyBjYXNlLWluc2Vuc2l0aXZlLgogLlNIIFJFVFVSTiBWQUxVRQogLkIgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCgpCi1yZXR1cm5zIHR5cGUgdmFsdWUgb24gc3VjY2VzcyBhbmQgXC0xIG9uIGZhaWx1cmUuCityZXR1cm5zIHRoZSB0eXBlIHZhbHVlIG9uIHN1Y2Nlc3MgYW5kIFwtMSBpZiB0aGUgbmFtZSBpcyBub3QgYSBrbm93bgordHlwZSBuYW1lLi4KIC5TSCBTRUUgQUxTTwogcGNhcCgzUENBUCkKZGlmZiAtLWdpdCBhL3BjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUuM3BjYXAgYi9wY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lLjNwY2FwCmluZGV4IDBiMTc4MjUuLmFhM2U4OWEgMTAwNjQ0Ci0tLSBhL3BjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUuM3BjYXAKKysrIGIvcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZS4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfREFUQUxJTktfVkFMX1RPX05BTUUgM1BDQVAgIjIyIEF1Z3VzdCAyMDEwIgorLlRIIFBDQVBfREFUQUxJTktfVkFMX1RPX05BTUUgM1BDQVAgIjMgSmFudWFyeSAyMDE0IgogLlNIIE5BTUUKIHBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUsIHBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uIFwtIGdldCBhCiBuYW1lIG9yIGRlc2NyaXB0aW9uIGZvciBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgdmFsdWUKQEAgLTM1LDEyICszNSwyMCBAQAogLlNIIERFU0NSSVBUSU9OCiAuQiBwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKCkKIHRyYW5zbGF0ZXMgYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIHZhbHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nCi1saW5rLWxheWVyIGhlYWRlciB0eXBlIG5hbWUuCitsaW5rLWxheWVyIGhlYWRlciB0eXBlIG5hbWUsIHdoaWNoIGlzIHRoZQorLkIgRExUXworbmFtZSBmb3IgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgdmFsdWUgd2l0aCB0aGUKKy5CIERMVF8KK3JlbW92ZWQuCiAuQiBOVUxMCi1pcyByZXR1cm5lZCBvbiBmYWlsdXJlLgoraXMgcmV0dXJuZWQgaWYgdGhlIHR5cGUgdmFsdWUgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGtub3duCisuQiBETFRfCit2YWx1ZS4KIC5QUAogLkIgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oKQogdHJhbnNsYXRlcyBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgdmFsdWUgdG8gYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGF0CiBsaW5rLWxheWVyIGhlYWRlciB0eXBlLgogLkIgTlVMTAotaXMgcmV0dXJuZWQgb24gZmFpbHVyZS4KK2lzIHJldHVybmVkIGlmIHRoZSB0eXBlIHZhbHVlIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBrbm93bgorLkIgRExUXwordmFsdWUuCmRpZmYgLS1naXQgYS9wY2FwX2R1bXAuM3BjYXAgYi9wY2FwX2R1bXAuM3BjYXAKaW5kZXggOTVmMzA0MC4uNjQwMmI0YiAxMDA2NDQKLS0tIGEvcGNhcF9kdW1wLjNwY2FwCisrKyBiL3BjYXBfZHVtcC4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfRFVNUCAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlRIIFBDQVBfRFVNUCAzUENBUCAiOCBNYXJjaCAyMDE1IgogLlNIIE5BTUUKIHBjYXBfZHVtcCBcLSB3cml0ZSBhIHBhY2tldCB0byBhIGNhcHR1cmUgZmlsZQogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX2R1bXBfY2xvc2UuM3BjYXAgYi9wY2FwX2R1bXBfY2xvc2UuM3BjYXAKaW5kZXggYWZkMDBjYi4uYmQ5NWE1MiAxMDA2NDQKLS0tIGEvcGNhcF9kdW1wX2Nsb3NlLjNwY2FwCisrKyBiL3BjYXBfZHVtcF9jbG9zZS4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfRFVNUF9DTE9TRSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlRIIFBDQVBfRFVNUF9DTE9TRSAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCiAuU0ggTkFNRQogcGNhcF9kdW1wX2Nsb3NlIFwtIGNsb3NlIGEgc2F2ZWZpbGUgYmVpbmcgd3JpdHRlbiB0bwogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX2R1bXBfZmlsZS4zcGNhcCBiL3BjYXBfZHVtcF9maWxlLjNwY2FwCmluZGV4IDk4MmIwZGMuLjhmZWE2MTAgMTAwNjQ0Ci0tLSBhL3BjYXBfZHVtcF9maWxlLjNwY2FwCisrKyBiL3BjYXBfZHVtcF9maWxlLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9EVU1QX0ZJTEUgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5USCBQQ0FQX0RVTVBfRklMRSAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCiAuU0ggTkFNRQogcGNhcF9kdW1wX2ZpbGUgXC0gZ2V0IHRoZSBzdGFuZGFyZCBJL08gc3RyZWFtIGZvciBhIHNhdmVmaWxlIGJlaW5nIHdyaXR0ZW4KIC5TSCBTWU5PUFNJUwpkaWZmIC0tZ2l0IGEvcGNhcF9kdW1wX2ZsdXNoLjNwY2FwIGIvcGNhcF9kdW1wX2ZsdXNoLjNwY2FwCmluZGV4IGJhOThkZWUuLmM4ZjExMGIgMTAwNjQ0Ci0tLSBhL3BjYXBfZHVtcF9mbHVzaC4zcGNhcAorKysgYi9wY2FwX2R1bXBfZmx1c2guM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0RVTVBfRkxVU0ggM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5USCBQQ0FQX0RVTVBfRkxVU0ggM1BDQVAgIjMgSmFudWFyeSAyMDE0IgogLlNIIE5BTUUKIHBjYXBfZHVtcF9mbHVzaCBcLSBmbHVzaCB0byBhIHNhdmVmaWxlIHBhY2tldHMgZHVtcGVkCiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfZHVtcF9mdGVsbC4zcGNhcCBiL3BjYXBfZHVtcF9mdGVsbC4zcGNhcAppbmRleCA2ZDVjODI4Li43NTdlOTQ4IDEwMDY0NAotLS0gYS9wY2FwX2R1bXBfZnRlbGwuM3BjYXAKKysrIGIvcGNhcF9kdW1wX2Z0ZWxsLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9EVU1QX0ZURUxMIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuVEggUENBUF9EVU1QX0ZURUxMIDNQQ0FQICIzIEphbnVhcnkgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX2R1bXBfZnRlbGwgXC0gZ2V0IHRoZSBjdXJyZW50IGZpbGUgb2Zmc2V0IGZvciBhIHNhdmVmaWxlIGJlaW5nIHdyaXR0ZW4KIC5TSCBTWU5PUFNJUwpkaWZmIC0tZ2l0IGEvcGNhcF9kdW1wX29wZW4uM3BjYXAgYi9wY2FwX2R1bXBfb3Blbi4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDk2YWFiCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9kdW1wX29wZW4uM3BjYXAKQEAgLTAsMCArMSw5NiBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0RVTVBfT1BFTiAzUENBUCAiMTYgRmVicnVhcnkgMjAxNSIKKy5TSCBOQU1FCitwY2FwX2R1bXBfb3BlbiwgcGNhcF9kdW1wX2ZvcGVuIFwtIG9wZW4gYSBmaWxlIHRvIHdoaWNoIHRvIHdyaXRlIHBhY2tldHMKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisubmYKKy5MUAorLmZ0IEIKK3BjYXBfZHVtcGVyX3QgKnBjYXBfZHVtcF9vcGVuKHBjYXBfdCAqcCwgY29uc3QgY2hhciAqZm5hbWUpOworcGNhcF9kdW1wZXJfdCAqcGNhcF9kdW1wX29wZW5fYXBwZW5kKHBjYXBfdCAqcCwgY29uc3QgY2hhciAqZm5hbWUpOworcGNhcF9kdW1wZXJfdCAqcGNhcF9kdW1wX2ZvcGVuKHBjYXBfdCAqcCwgRklMRSAqZnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9kdW1wX29wZW4oKQoraXMgY2FsbGVkIHRvIG9wZW4gYSBgYHNhdmVmaWxlJycgZm9yIHdyaXRpbmcuCisuSSBmbmFtZQorc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIG9wZW4uIFRoZSBmaWxlIHdpbGwgaGF2ZQordGhlIHNhbWUgZm9ybWF0IGFzIHRob3NlIHVzZWQgYnkKKy5CUiB0Y3BkdW1wICgxKQorYW5kCisuQlIgdGNwc2xpY2UgKDEpLgorVGhlIG5hbWUgIi0iIGlzIGEgc3lub255bQorZm9yCisuQlIgc3Rkb3V0IC4KKy5QUAorLkIgcGNhcF9kdW1wX2ZvcGVuKCkKK2lzIGNhbGxlZCB0byB3cml0ZSBkYXRhIHRvIGFuIGV4aXN0aW5nIG9wZW4gc3RyZWFtCisuSVIgZnAgLgorTm90ZSB0aGF0IG9uIFdpbmRvd3MsIHRoYXQgc3RyZWFtIHNob3VsZCBiZSBvcGVuZWQgaW4gYmluYXJ5IG1vZGUuCisuUFAKKy5JIHAKK2lzIGEgY2FwdHVyZSBvciBgYHNhdmVmaWxlJycgaGFuZGxlIHJldHVybmVkIGJ5IGFuIGVhcmxpZXIgY2FsbCB0bworLkIgcGNhcF9jcmVhdGUoKQorYW5kIGFjdGl2YXRlZCBieSBhbiBlYXJsaWVyIGNhbGwgdG8KKy5CUiBwY2FwX2FjdGl2YXRlKCkgLAorb3IgcmV0dXJuZWQgYnkgYW4gZWFybGllciBjYWxsIHRvCisuQlIgcGNhcF9vcGVuX29mZmxpbmUoKSAsCisuQlIgcGNhcF9vcGVuX2xpdmUoKSAsCitvcgorLkJSIHBjYXBfb3Blbl9kZWFkKCkgLgorVGhlIHRpbWUgc3RhbXAgcHJlY2lzaW9uLCBsaW5rLWxheWVyIHR5cGUsIGFuZCBzbmFwc2hvdCBsZW5ndGggZnJvbQorLkkgcAorYXJlIHVzZWQgYXMgdGhlIGxpbmstbGF5ZXIgdHlwZSBhbmQgc25hcHNob3QgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgZmlsZS4KKy5QUAorLkIgcGNhcF9kdW1wX29wZW5fYXBwZW5kKCkKK2lzIGxpa2UKKy5CIHBjYXBfZHVtcF9vcGVuCitidXQgZG9lcyBub3QgY3JlYXRlIHRoZSBmaWxlIGlmIGl0IGRvZXMgbm90IGV4aXN0IGFuZCwgaWYgaXQgZG9lcworYWxyZWFkeSBleGlzdCwgYW5kIGlzIGEgcGNhcCBmaWxlIHdpdGggdGhlIHNhbWUgYnl0ZSBvcmRlciBhcyB0aGUgaG9zdAorb3BlbmluZyB0aGUgZmlsZSwgYW5kIGhhcyB0aGUgc2FtZSB0aW1lIHN0YW1wIHByZWNpc2lvbiwgbGluay1sYXllcgoraGVhZGVyIHR5cGUsIGFuZCBzbmFwc2hvdCBsZW5ndGggYXMKKy5JUiBwICwKK2l0IHdpbGwgd3JpdGUgbmV3IHBhY2tldHMgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKy5TSCBSRVRVUk4gVkFMVUVTCitBIHBvaW50ZXIgdG8gYQorLkIgcGNhcF9kdW1wZXJfdAorc3RydWN0dXJlIHRvIHVzZSBpbiBzdWJzZXF1ZW50CisuQiBwY2FwX2R1bXAoKQorYW5kCisuQiBwY2FwX2R1bXBfY2xvc2UoKQorY2FsbHMgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4KKy5CIE5VTEwKK2lzIHJldHVybmVkIG9uIGZhaWx1cmUuCitJZgorLkIgTlVMTAoraXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycihcZklwXGZCKQorY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKSwKK3BjYXBfb3Blbl9vZmZsaW5lKDNQQ0FQKSwgcGNhcF9vcGVuX2xpdmUoM1BDQVApLCBwY2FwX29wZW5fZGVhZCgzUENBUCksCitwY2FwX2R1bXAoM1BDQVApLCBwY2FwX2R1bXBfY2xvc2UoM1BDQVApLCBwY2FwX2dldGVycigzUENBUCksCitwY2FwLXNhdmVmaWxlKDUpCmRpZmYgLS1naXQgYS9wY2FwX2R1bXBfb3Blbi4zcGNhcC5pbiBiL3BjYXBfZHVtcF9vcGVuLjNwY2FwLmluCmluZGV4IDBiMmUzYzYuLjNmOTFkMTMgMTAwNjQ0Ci0tLSBhL3BjYXBfZHVtcF9vcGVuLjNwY2FwLmluCisrKyBiL3BjYXBfZHVtcF9vcGVuLjNwY2FwLmluCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9EVU1QX09QRU4gM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5USCBQQ0FQX0RVTVBfT1BFTiAzUENBUCAiMTYgRmVicnVhcnkgMjAxNSIKIC5TSCBOQU1FCiBwY2FwX2R1bXBfb3BlbiwgcGNhcF9kdW1wX2ZvcGVuIFwtIG9wZW4gYSBmaWxlIHRvIHdoaWNoIHRvIHdyaXRlIHBhY2tldHMKIC5TSCBTWU5PUFNJUwpkaWZmIC0tZ2l0IGEvcGNhcF9maWxlLjNwY2FwIGIvcGNhcF9maWxlLjNwY2FwCmluZGV4IDdiMThjODEuLmNkNmIwNmIgMTAwNjQ0Ci0tLSBhL3BjYXBfZmlsZS4zcGNhcAorKysgYi9wY2FwX2ZpbGUuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0ZJTEUgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5USCBQQ0FQX0ZJTEUgM1BDQVAgIjMgSmFudWFyeSAyMDE0IgogLlNIIE5BTUUKIHBjYXBfZmlsZSBcLSBnZXQgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gZm9yIGEgc2F2ZWZpbGUgYmVpbmcgcmVhZAogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX2ZpbGVuby4zcGNhcCBiL3BjYXBfZmlsZW5vLjNwY2FwCmluZGV4IDM5ZDA2OGIuLjdhZWIwNjkgMTAwNjQ0Ci0tLSBhL3BjYXBfZmlsZW5vLjNwY2FwCisrKyBiL3BjYXBfZmlsZW5vLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9GSUxFTk8gM1BDQVAgIjMgTm92ZW1iZXIgMjAwOSIKKy5USCBQQ0FQX0ZJTEVOTyAzUENBUCAiNyBBcHJpbCAyMDE0IgogLlNIIE5BTUUKIHBjYXBfZmlsZW5vIFwtIGdldCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciBhIGxpdmUgY2FwdHVyZQogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX2ZpbmRhbGxkZXZzLjNwY2FwIGIvcGNhcF9maW5kYWxsZGV2cy4zcGNhcAppbmRleCAwMGJiOTExLi4yZGQzZTU5IDEwMDY0NAotLS0gYS9wY2FwX2ZpbmRhbGxkZXZzLjNwY2FwCisrKyBiL3BjYXBfZmluZGFsbGRldnMuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0ZJTkRBTExERVZTIDNQQ0FQICIxMCBKYW51YXJ5IDIwMTQiCisuVEggUENBUF9GSU5EQUxMREVWUyAzUENBUCAiNyBBcHJpbCAyMDE0IgogLlNIIE5BTUUKIHBjYXBfZmluZGFsbGRldnMsIHBjYXBfZnJlZWFsbGRldnMgXC0gZ2V0IGEgbGlzdCBvZiBjYXB0dXJlIGRldmljZXMsIGFuZAogZnJlZSB0aGF0IGxpc3QKZGlmZiAtLWdpdCBhL3BjYXBfZnJlZWNvZGUuM3BjYXAgYi9wY2FwX2ZyZWVjb2RlLjNwY2FwCmluZGV4IGMzYzNlYTYuLmZhYzRiM2QgMTAwNjQ0Ci0tLSBhL3BjYXBfZnJlZWNvZGUuM3BjYXAKKysrIGIvcGNhcF9mcmVlY29kZS4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfRlJFRUNPREUgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5USCBQQ0FQX0ZSRUVDT0RFIDNQQ0FQICIzIEphbnVhcnkgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX2ZyZWVjb2RlIFwtIGZyZWUgYSBCUEYgcHJvZ3JhbQogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX2dldF9zZWxlY3RhYmxlX2ZkLjNwY2FwIGIvcGNhcF9nZXRfc2VsZWN0YWJsZV9mZC4zcGNhcAppbmRleCA2NjQwNTc3Li44NmIwYzI2IDEwMDY0NAotLS0gYS9wY2FwX2dldF9zZWxlY3RhYmxlX2ZkLjNwY2FwCisrKyBiL3BjYXBfZ2V0X3NlbGVjdGFibGVfZmQuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0dFVF9TRUxFQ1RBQkxFX0ZEIDNQQ0FQICIyMiBKdWx5IDIwMTEiCisuVEggUENBUF9HRVRfU0VMRUNUQUJMRV9GRCAzUENBUCAiMTggT2N0b2JlciAyMDE0IgogLlNIIE5BTUUKIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQgXC0gZ2V0IGEgZmlsZSBkZXNjcmlwdG9yIG9uIHdoaWNoIGEgc2VsZWN0KCkgY2FuCiBiZSBkb25lIGZvciBhIGxpdmUgY2FwdHVyZQpkaWZmIC0tZ2l0IGEvcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcCBiL3BjYXBfZ2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5MTQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfZ2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAKQEAgLTAsMCArMSw1MiBAQAorLlwiQ29weXJpZ2h0IChjKSAyMDEzLCBNaWNoYWwgU2VrbGV0YXIKKy5cIkFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIlJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwibW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCJhcmUgbWV0OgorLlwiCisuXCIgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisuXCIgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy5cIiAgICAgZGlzdHJpYnV0aW9uLgorLlwiICAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorLlwiICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKy5cIklNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisuXCJXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKy5USCBQQ0FQX0dFVF9UU1RBTVBfUFJFQ0lTSU9OIDNQQ0FQICIxOCBEZWNlbWJlciAyMDEzIgorLlNIIE5BTUUKK3BjYXBfZ2V0X3RzdGFtcF9wcmVjaXNpb24gXC0gZ2V0IHRoZSB0aW1lIHN0YW1wIHByZWNpc2lvbiByZXR1cm5lZCBpbgorY2FwdHVyZXMKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbihwY2FwX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbigpCityZXR1cm5zIHRoZSBwcmVjaXNpb24gb2YgdGhlIHRpbWUgc3RhbXAgcmV0dXJuZWQgaW4gcGFja2V0IGNhcHR1cmVzIG9uIHRoZSBwY2FwCitkZXNjcmlwdG9yLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbigpCityZXR1cm5zCisuQiBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk8KK29yCisuQlIgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX05BTk8gLAord2hpY2ggaW5kaWNhdGVzCit0aGF0IHBjYXAgY2FwdHVyZXMgY29udGFpbnMgdGltZSBzdGFtcHMgaW4gbWljcm9zZWNvbmRzIG9yIG5hbm9zZWNvbmRzCityZXNwZWN0aXZlbHkuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLAorcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbigzUENBUCksCitwY2FwLXRzdGFtcCg3KQpkaWZmIC0tZ2l0IGEvcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcC5pbiBiL3BjYXBfZ2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAuaW4KaW5kZXggNjU2YzE0Mi4uMjg1ZTc3MCAxMDA2NDQKLS0tIGEvcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcC5pbgorKysgYi9wY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwLmluCkBAIC0xOSw3ICsxOSw3IEBACiAuXCJJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAogLlwiV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogCi0uVEggUENBUF9HRVRfVFNUQU1QX1BSRUNJU0lPTiAzUENBUCAiMjcgQXVndXN0IDIwMTMiCisuVEggUENBUF9HRVRfVFNUQU1QX1BSRUNJU0lPTiAzUENBUCAiMTggRGVjZW1iZXIgMjAxMyIKIC5TSCBOQU1FCiBwY2FwX2dldF90c3RhbXBfcHJlY2lzaW9uIFwtIGdldCB0aGUgdGltZSBzdGFtcCBwcmVjaXNpb24gcmV0dXJuZWQgaW4KIGNhcHR1cmVzCmRpZmYgLS1naXQgYS9wY2FwX2dldGVyci4zcGNhcCBiL3BjYXBfZ2V0ZXJyLjNwY2FwCmluZGV4IGZjYWJlYzMuLjJlOTljMzcgMTAwNjQ0Ci0tLSBhL3BjYXBfZ2V0ZXJyLjNwY2FwCisrKyBiL3BjYXBfZ2V0ZXJyLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9HRVRFUlIgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5USCBQQ0FQX0dFVEVSUiAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCiAuU0ggTkFNRQogcGNhcF9nZXRlcnIsIHBjYXBfcGVycm9yIFwtIGdldCBvciBwcmludCBsaWJwY2FwIGVycm9yIG1lc3NhZ2UgdGV4dAogLlNIIFNZTk9QU0lTCkBAIC0yOCw3ICsyOCw3IEBACiAuTFAKIC5mdCBCCiBjaGFyICpwY2FwX2dldGVycihwY2FwX3QgKnApOwotdm9pZCBwY2FwX3BlcnJvcihwY2FwX3QgKnAsIGNoYXIgKnByZWZpeCk7Cit2b2lkIHBjYXBfcGVycm9yKHBjYXBfdCAqcCwgY29uc3QgY2hhciAqcHJlZml4KTsKIC5mdAogLmZpCiAuU0ggREVTQ1JJUFRJT04KZGlmZiAtLWdpdCBhL3BjYXBfaW5qZWN0LjNwY2FwIGIvcGNhcF9pbmplY3QuM3BjYXAKaW5kZXggN2NjZGYyYy4uZmY5NzkyZCAxMDA2NDQKLS0tIGEvcGNhcF9pbmplY3QuM3BjYXAKKysrIGIvcGNhcF9pbmplY3QuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0lOSkVDVCAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlRIIFBDQVBfSU5KRUNUIDNQQ0FQICIzIEphbnVhcnkgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX2luamVjdCwgcGNhcF9zZW5kcGFja2V0IFwtIHRyYW5zbWl0IGEgcGFja2V0CiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfaXNfc3dhcHBlZC4zcGNhcCBiL3BjYXBfaXNfc3dhcHBlZC4zcGNhcAppbmRleCBhMTIwNjE2Li5jNGU2MmFlIDEwMDY0NAotLS0gYS9wY2FwX2lzX3N3YXBwZWQuM3BjYXAKKysrIGIvcGNhcF9pc19zd2FwcGVkLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9JU19TV0FQUEVEIDNQQ0FQICIxNyBTZXB0ZW1iZXIgMjAxMyIKKy5USCBQQ0FQX0lTX1NXQVBQRUQgM1BDQVAgIjcgQXByaWwgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX2lzX3N3YXBwZWQgXC0gZmluZCBvdXQgd2hldGhlciBhIHNhdmVmaWxlIGhhcyB0aGUgbmF0aXZlIGJ5dGUgb3JkZXIKIC5TSCBTWU5PUFNJUwpkaWZmIC0tZ2l0IGEvcGNhcF9saWJfdmVyc2lvbi4zcGNhcCBiL3BjYXBfbGliX3ZlcnNpb24uM3BjYXAKaW5kZXggM2VjMmUzMi4uNGI4NmIyZCAxMDA2NDQKLS0tIGEvcGNhcF9saWJfdmVyc2lvbi4zcGNhcAorKysgYi9wY2FwX2xpYl92ZXJzaW9uLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9MSUJfVkVSU0lPTiAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlRIIFBDQVBfTElCX1ZFUlNJT04gM1BDQVAgIjMgSmFudWFyeSAyMDE0IgogLlNIIE5BTUUKIHBjYXBfbGliX3ZlcnNpb24gXC0gZ2V0IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciBsaWJwY2FwCiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAgYi9wY2FwX2xpc3RfZGF0YWxpbmtzLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGU3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2xpc3RfZGF0YWxpbmtzLjNwY2FwCkBAIC0wLDAgKzEsNzMgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9MSVNUX0RBVEFMSU5LUyAzUENBUCAiOCBNYXJjaCAyMDE1IgorLlNIIE5BTUUKK3BjYXBfbGlzdF9kYXRhbGlua3MsIHBjYXBfZnJlZV9kYXRhbGlua3MgXC0gZ2V0IGEgbGlzdCBvZiBsaW5rLWxheWVyIGhlYWRlcgordHlwZXMgc3VwcG9ydGVkIGJ5IGEgY2FwdHVyZSBkZXZpY2UsIGFuZCBmcmVlIHRoYXQgbGlzdAorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX2xpc3RfZGF0YWxpbmtzKHBjYXBfdCAqcCwgaW50ICoqZGx0X2J1Zik7Cit2b2lkIHBjYXBfZnJlZV9kYXRhbGlua3MoaW50ICpkbHRfbGlzdCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2xpc3RfZGF0YWxpbmtzKCkKK2lzIHVzZWQgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgc3VwcG9ydGVkIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzIG9mIHRoZQoraW50ZXJmYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGNhcCBkZXNjcmlwdG9yLgorLkIgcGNhcF9saXN0X2RhdGFsaW5rcygpCithbGxvY2F0ZXMgYW4gYXJyYXkgdG8gaG9sZCB0aGUgbGlzdCBhbmQgc2V0cworLklSICpkbHRfYnVmCit0byBwb2ludCB0byB0aGF0IGFycmF5LgorLkxQCitUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBhcnJheSB3aXRoCisuQlIgcGNhcF9mcmVlX2RhdGFsaW5rcygpICwKK3doaWNoIGZyZWVzIHRoZSBsaXN0IG9mIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzIHBvaW50ZWQgdG8gYnkKKy5JUiBkbHRfbGlzdCAuCisuTFAKK0l0IG11c3Qgbm90IGJlIGNhbGxlZCBvbiBhIHBjYXAgZGVzY3JpcHRvciBjcmVhdGVkIGJ5CisuQiBwY2FwX2NyZWF0ZSgpCit0aGF0IGhhcyBub3QgeWV0IGJlZW4gYWN0aXZhdGVkIGJ5CisuQlIgcGNhcF9hY3RpdmF0ZSgpIC4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfbGlzdF9kYXRhbGlua3MoKQorcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzIGluIHRoZSBhcnJheSBvbiBzdWNjZXNzLAorLkIgUENBUF9FUlJPUl9OT1RfQUNUSVZBVEVECitpZiBjYWxsZWQgb24gYSBjYXB0dXJlIGhhbmRsZSB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgYnV0IG5vdCBhY3RpdmF0ZWQsCithbmQKKy5CIFBDQVBfRVJST1IKKyhcLTEpIG9uIG90aGVyIGVycm9ycy4KK0lmCisuQiBQQ0FQX0VSUk9SCitpcyByZXR1cm5lZCwKKy5CIHBjYXBfZ2V0ZXJyKCkKK29yCisuQiBwY2FwX3BlcnJvcigpCittYXkgYmUgY2FsbGVkIHdpdGgKKy5JIHAKK2FzIGFuIGFyZ3VtZW50IHRvIGZldGNoIG9yIGRpc3BsYXkgdGhlIGVycm9yIHRleHQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2dldGVycigzUENBUCksCitwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKDNQQ0FQKSwKK3BjYXAtbGlua3R5cGUoNykKZGlmZiAtLWdpdCBhL3BjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAuaW4gYi9wY2FwX2xpc3RfZGF0YWxpbmtzLjNwY2FwLmluCmluZGV4IGY4NDkzNDYuLjlmNTJiNjMgMTAwNjQ0Ci0tLSBhL3BjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAuaW4KKysrIGIvcGNhcF9saXN0X2RhdGFsaW5rcy4zcGNhcC5pbgpAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfTElTVF9EQVRBTElOS1MgM1BDQVAgIjE3IFNlcHRlbWJlciAyMDEzIgorLlRIIFBDQVBfTElTVF9EQVRBTElOS1MgM1BDQVAgIjggTWFyY2ggMjAxNSIKIC5TSCBOQU1FCiBwY2FwX2xpc3RfZGF0YWxpbmtzLCBwY2FwX2ZyZWVfZGF0YWxpbmtzIFwtIGdldCBhIGxpc3Qgb2YgbGluay1sYXllciBoZWFkZXIKIHR5cGVzIHN1cHBvcnRlZCBieSBhIGNhcHR1cmUgZGV2aWNlLCBhbmQgZnJlZSB0aGF0IGxpc3QKZGlmZiAtLWdpdCBhL3BjYXBfbGlzdF90c3RhbXBfdHlwZXMuM3BjYXAgYi9wY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZmEzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwCkBAIC0wLDAgKzEsNzAgQEAKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0xJU1RfVFNUQU1QX1RZUEVTIDNQQ0FQICIyMiBBdWd1c3QgMjAxMCIKKy5TSCBOQU1FCitwY2FwX2xpc3RfdHN0YW1wX3R5cGVzLCBwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzIFwtIGdldCBhIGxpc3Qgb2YgdGltZQorc3RhbXAgdHlwZXMgc3VwcG9ydGVkIGJ5IGEgY2FwdHVyZSBkZXZpY2UsIGFuZCBmcmVlIHRoYXQgbGlzdAorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzKHBjYXBfdCAqcCwgaW50ICoqdHN0YW1wX3R5cGVzcCk7Cit2b2lkIHBjYXBfZnJlZV90c3RhbXBfdHlwZXMoaW50ICp0c3RhbXBfdHlwZXMpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9saXN0X3RzdGFtcF90eXBlcygpCitpcyB1c2VkIHRvIGdldCBhIGxpc3Qgb2YgdGhlIHN1cHBvcnRlZCB0aW1lIHN0YW1wIHR5cGVzIG9mIHRoZSBpbnRlcmZhY2UKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgcGNhcCBkZXNjcmlwdG9yLgorLkIgcGNhcF9saXN0X3RzdGFtcF90eXBlcygpCithbGxvY2F0ZXMgYW4gYXJyYXkgdG8gaG9sZCB0aGUgbGlzdCBhbmQgc2V0cworLkkgKnRzdGFtcF90eXBlc3AKK3RvIHBvaW50IHRvIHRoZSBhcnJheS4KK1NlZQorLkJSIHBjYXAtdHN0YW1wICg3KQorZm9yIGEgbGlzdCBvZiBhbGwgdGhlIHRpbWUgc3RhbXAgdHlwZXMuCisuUFAKK1RoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIGFycmF5IHdpdGgKKy5CUiBwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzKCkgLAord2hpY2ggZnJlZXMgdGhlIGxpc3QgcG9pbnRlZCB0byBieQorLklSIHRzdGFtcF90eXBlcyAuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzKCkKK3JldHVybnMgdGhlIG51bWJlciBvZiB0aW1lIHN0YW1wIHR5cGVzIGluIHRoZSBhcnJheSBvbiBzdWNjZXNzIGFuZAorLkIgUENBUF9FUlJPUgorb24gZmFpbHVyZS4KK0EgcmV0dXJuIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhhdCB5b3UgY2Fubm90IHNwZWNpZnkgYSB0aW1lIHN0YW1wIHR5cGU7Cit5b3UgYXJlIGxpbWl0ZWQgdG8gdGhlIGNhcHR1cmUgZGV2aWNlJ3MgZGVmYXVsdCB0aW1lIHN0YW1wIHR5cGUuCitJZgorLkIgUENBUF9FUlJPUgoraXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9nZXRlcnIoM1BDQVApLCBwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lKDNQQ0FQKSwKK3BjYXAtdHN0YW1wKDcpCmRpZmYgLS1naXQgYS9wY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwLmluIGIvcGNhcF9saXN0X3RzdGFtcF90eXBlcy4zcGNhcC5pbgppbmRleCA2NmQzZDY2Li5hMTM5MzI0IDEwMDY0NAotLS0gYS9wY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwLmluCisrKyBiL3BjYXBfbGlzdF90c3RhbXBfdHlwZXMuM3BjYXAuaW4KQEAgLTE4LDcgKzE4LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX0xJU1RfVFNUQU1QX1RZUEVTIDNQQ0FQICIyMSBBdWd1c3QgMjAxMCIKKy5USCBQQ0FQX0xJU1RfVFNUQU1QX1RZUEVTIDNQQ0FQICIyMiBBdWd1c3QgMjAxMCIKIC5TSCBOQU1FCiBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzLCBwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzIFwtIGdldCBhIGxpc3Qgb2YgdGltZQogc3RhbXAgdHlwZXMgc3VwcG9ydGVkIGJ5IGEgY2FwdHVyZSBkZXZpY2UsIGFuZCBmcmVlIHRoYXQgbGlzdApkaWZmIC0tZ2l0IGEvcGNhcF9sb29rdXBkZXYuM3BjYXAgYi9wY2FwX2xvb2t1cGRldi4zcGNhcAppbmRleCA3OWRkYTQyLi5hYWEzYTIwIDEwMDY0NAotLS0gYS9wY2FwX2xvb2t1cGRldi4zcGNhcAorKysgYi9wY2FwX2xvb2t1cGRldi4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfTE9PS1VQREVWIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuVEggUENBUF9MT09LVVBERVYgM1BDQVAgIjMgSmFudWFyeSAyMDE0IgogLlNIIE5BTUUKIHBjYXBfbG9va3VwZGV2IFwtIGZpbmQgdGhlIGRlZmF1bHQgZGV2aWNlIG9uIHdoaWNoIHRvIGNhcHR1cmUKIC5TSCBTWU5PUFNJUwpkaWZmIC0tZ2l0IGEvcGNhcF9sb29rdXBuZXQuM3BjYXAgYi9wY2FwX2xvb2t1cG5ldC4zcGNhcAppbmRleCBhM2QxNGFlLi5jMzhmZjNhIDEwMDY0NAotLS0gYS9wY2FwX2xvb2t1cG5ldC4zcGNhcAorKysgYi9wY2FwX2xvb2t1cG5ldC4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfTE9PS1VQTkVUIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuVEggUENBUF9MT09LVVBORVQgM1BDQVAgIjMgSmFudWFyeSAyMDE0IgogLlNIIE5BTUUKIHBjYXBfbG9va3VwbmV0IFwtIGZpbmQgdGhlIElQdjQgbmV0d29yayBudW1iZXIgYW5kIG5ldG1hc2sgZm9yIGEgZGV2aWNlCiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfbG9vcC4zcGNhcCBiL3BjYXBfbG9vcC4zcGNhcAppbmRleCAwMTFkODVjLi4wZWFmNmU1IDEwMDY0NAotLS0gYS9wY2FwX2xvb3AuM3BjYXAKKysrIGIvcGNhcF9sb29wLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9MT09QIDNQQ0FQICIxMyBPY3RvYmVyIDIwMTMiCisuVEggUENBUF9MT09QIDNQQ0FQICIxOCBPY3RvYmVyIDIwMTQiCiAuU0ggTkFNRQogcGNhcF9sb29wLCBwY2FwX2Rpc3BhdGNoIFwtIHByb2Nlc3MgcGFja2V0cyBmcm9tIGEgbGl2ZSBjYXB0dXJlIG9yIHNhdmVmaWxlCiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfbWFqb3JfdmVyc2lvbi4zcGNhcCBiL3BjYXBfbWFqb3JfdmVyc2lvbi4zcGNhcAppbmRleCBhMDg1ODM4Li44MzM0ZTE2IDEwMDY0NAotLS0gYS9wY2FwX21ham9yX3ZlcnNpb24uM3BjYXAKKysrIGIvcGNhcF9tYWpvcl92ZXJzaW9uLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9NQUpPUl9WRVJTSU9OIDNQQ0FQICIyMSBEZWNlbWJlciAyMDExIgorLlRIIFBDQVBfTUFKT1JfVkVSU0lPTiAzUENBUCAiNyBBcHJpbCAyMDE0IgogLlNIIE5BTUUKIHBjYXBfbWFqb3JfdmVyc2lvbiwgcGNhcF9taW5vcl92ZXJzaW9uIFwtIGdldCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgYSBzYXZlZmlsZQogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX25leHRfZXguM3BjYXAgYi9wY2FwX25leHRfZXguM3BjYXAKaW5kZXggYzMxMGMyZi4uZDY5ZTcyOCAxMDA2NDQKLS0tIGEvcGNhcF9uZXh0X2V4LjNwY2FwCisrKyBiL3BjYXBfbmV4dF9leC4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfTkVYVF9FWCAzUENBUCAiMTMgT2N0b2JlciAyMDEzIgorLlRIIFBDQVBfTkVYVF9FWCAzUENBUCAiNyBBcHJpbCAyMDE0IgogLlNIIE5BTUUKIHBjYXBfbmV4dF9leCwgcGNhcF9uZXh0IFwtIHJlYWQgdGhlIG5leHQgcGFja2V0IGZyb20gYSBwY2FwX3QKIC5TSCBTWU5PUFNJUwpkaWZmIC0tZ2l0IGEvcGNhcF9vZmZsaW5lX2ZpbHRlci4zcGNhcCBiL3BjYXBfb2ZmbGluZV9maWx0ZXIuM3BjYXAKaW5kZXggYjQ3MWM2YS4uMDhjMGI2NiAxMDA2NDQKLS0tIGEvcGNhcF9vZmZsaW5lX2ZpbHRlci4zcGNhcAorKysgYi9wY2FwX29mZmxpbmVfZmlsdGVyLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9PRkZMSU5FX0ZJTFRFUiAzUENBUCAiMjUgTm92ZW1iZXIgMjAxMiIKKy5USCBQQ0FQX09GRkxJTkVfRklMVEVSIDNQQ0FQICI3IEFwcmlsIDIwMTQiCiAuU0ggTkFNRQogcGNhcF9vZmZsaW5lX2ZpbHRlciBcLSBjaGVjayB3aGV0aGVyIGEgZmlsdGVyIG1hdGNoZXMgYSBwYWNrZXQKIC5TSCBTWU5PUFNJUwpkaWZmIC0tZ2l0IGEvcGNhcF9vcGVuX2RlYWQuM3BjYXAgYi9wY2FwX29wZW5fZGVhZC4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc1YzMyCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF9vcGVuX2RlYWQuM3BjYXAKQEAgLTAsMCArMSw3OSBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX09QRU5fREVBRCAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCisuU0ggTkFNRQorcGNhcF9vcGVuX2RlYWQsIHBjYXBfb3Blbl9kZWFkX3dpdGhfdHN0YW1wX3ByZWNpc2lvbiBcLSBvcGVuIGEgZmFrZQorcGNhcF90IGZvciBjb21waWxpbmcgZmlsdGVycyBvciBvcGVuaW5nIGEgY2FwdHVyZSBmb3Igb3V0cHV0CisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgorcGNhcF90ICpwY2FwX29wZW5fZGVhZChpbnQgbGlua3R5cGUsIGludCBzbmFwbGVuKTsKK3BjYXBfdCAqcGNhcF9vcGVuX2RlYWRfd2l0aF90c3RhbXBfcHJlY2lzaW9uKGludCBsaW5rdHlwZSwgaW50IHNuYXBsZW4sCisgICAgdV9pbnQgcHJlY2lzaW9uKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5QUAorLkIgcGNhcF9vcGVuX2RlYWQoKQorYW5kCisuQiBwY2FwX29wZW5fZGVhZF93aXRoX3RzdGFtcF9wcmVjaXNpb24oKQorYXJlIHVzZWQgZm9yIGNyZWF0aW5nIGEKKy5CIHBjYXBfdAorc3RydWN0dXJlIHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIG90aGVyIGZ1bmN0aW9ucyBpbiBsaWJwY2FwLiAgSXQgaXMKK3R5cGljYWxseSB1c2VkIHdoZW4ganVzdCB1c2luZyBsaWJwY2FwIGZvciBjb21waWxpbmcgQlBGIGNvZGU7IGl0IGNhbgorYWxzbyBiZSB1c2VkIGlmIHVzaW5nCisuQlIgcGNhcF9kdW1wX29wZW4oKSAsCisuQlIgcGNhcF9kdW1wKCkgLAorYW5kCisuQiBwY2FwX2R1bXBfY2xvc2UoKQordG8gd3JpdGUgYSBzYXZlZmlsZSBpZiB0aGVyZSBpcyBubworLkIgcGNhcF90Cit0aGF0IHN1cHBsaWVzIHRoZSBwYWNrZXRzIHRvIGJlIHdyaXR0ZW4uCisuUFAKKy5JIGxpbmt0eXBlCitzcGVjaWZpZXMgdGhlIGxpbmstbGF5ZXIgdHlwZSBmb3IgdGhlCisuQlIgcGNhcF90IC4KKy5QUAorLkkgc25hcGxlbgorc3BlY2lmaWVzIHRoZSBzbmFwc2hvdCBsZW5ndGggZm9yIHRoZQorLkJSIHBjYXBfdCAuCisuUFAKK1doZW4KKy5CUiBwY2FwX29wZW5fZGVhZF93aXRoX3RzdGFtcF9wcmVjaXNpb24oKSAsCitpcyB1c2VkIHRvIGNyZWF0ZSBhCisuQiBwY2FwX3QKK2ZvciB1c2Ugd2l0aAorLkJSIHBjYXBfZHVtcF9vcGVuKCkgLAorLkkgcHJlY2lzaW9uCitzcGVjaWZpZXMgdGhlIHRpbWUgc3RhbXAgcHJlY2lzaW9uIGZvciBwYWNrZXRzOworLkIgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX01JQ1JPCitzaG91bGQgYmUgc3BlY2lmaWVkIGlmIHRoZSBwYWNrZXRzIHRvIGJlIHdyaXR0ZW4gaGF2ZSB0aW1lIHN0YW1wcyBpbgorc2Vjb25kcyBhbmQgbWljcm9zZWNvbmRzLCBhbmQKKy5CIFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9OQU5PCitzaG91bGQgYmUgc3BlY2lmaWVkIGlmIHRoZSBwYWNrZXRzIHRvIGJlIHdyaXR0ZW4gaGF2ZSB0aW1lIHN0YW1wcyBpbgorc2Vjb25kcyBhbmQgbmFub3NlY29uZHMuICBJdHMgdmFsdWUgZG9lcyBub3QgYWZmZWN0CisuQlIgcGNhcF9jb21waWxlKCkgLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jb21waWxlKDNQQ0FQKSwgcGNhcF9kdW1wX29wZW4oM1BDQVApLAorcGNhcC1saW5rdHlwZSg3KQpkaWZmIC0tZ2l0IGEvcGNhcF9vcGVuX2RlYWQuM3BjYXAuaW4gYi9wY2FwX29wZW5fZGVhZC4zcGNhcC5pbgppbmRleCAyZDFiNDhjLi5hM2RjNTkyIDEwMDY0NAotLS0gYS9wY2FwX29wZW5fZGVhZC4zcGNhcC5pbgorKysgYi9wY2FwX29wZW5fZGVhZC4zcGNhcC5pbgpAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfT1BFTl9ERUFEIDNQQ0FQICIxIEp1bHkgMjAxMyIKKy5USCBQQ0FQX09QRU5fREVBRCAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCiAuU0ggTkFNRQogcGNhcF9vcGVuX2RlYWQsIHBjYXBfb3Blbl9kZWFkX3dpdGhfdHN0YW1wX3ByZWNpc2lvbiBcLSBvcGVuIGEgZmFrZQogcGNhcF90IGZvciBjb21waWxpbmcgZmlsdGVycyBvciBvcGVuaW5nIGEgY2FwdHVyZSBmb3Igb3V0cHV0CmRpZmYgLS1naXQgYS9wY2FwX29wZW5fbGl2ZS4zcGNhcCBiL3BjYXBfb3Blbl9saXZlLjNwY2FwCmluZGV4IDcxNTk5NGIuLjhjNWQ0NzQgMTAwNjQ0Ci0tLSBhL3BjYXBfb3Blbl9saXZlLjNwY2FwCisrKyBiL3BjYXBfb3Blbl9saXZlLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9PUEVOX0xJVkUgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5USCBQQ0FQX09QRU5fTElWRSAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCiAuU0ggTkFNRQogcGNhcF9vcGVuX2xpdmUgXC0gb3BlbiBhIGRldmljZSBmb3IgY2FwdHVyaW5nCiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfb3Blbl9vZmZsaW5lLjNwY2FwIGIvcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2NTcyYQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfb3Blbl9vZmZsaW5lLjNwY2FwCkBAIC0wLDAgKzEsMTA5IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfT1BFTl9PRkZMSU5FIDNQQ0FQICIzIEphbnVhcnkgMjAxNCIKKy5TSCBOQU1FCitwY2FwX29wZW5fb2ZmbGluZSwgcGNhcF9vcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uLAorcGNhcF9mb3Blbl9vZmZsaW5lLCBwY2FwX2ZvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uIFwtIG9wZW4gYSBzYXZlZCBjYXB0dXJlIGZpbGUgZm9yIHJlYWRpbmcKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5uZgorLmZ0IEIKK2NoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworLmZ0CisuTFAKKy5mdCBCCitwY2FwX3QgKnBjYXBfb3Blbl9vZmZsaW5lKGNvbnN0IGNoYXIgKmZuYW1lLCBjaGFyICplcnJidWYpOworcGNhcF90ICpwY2FwX29wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oY29uc3QgY2hhciAqZm5hbWUsCisgICAgdV9pbnQgcHJlY2lzaW9uLCBjaGFyICplcnJidWYpOworcGNhcF90ICpwY2FwX2ZvcGVuX29mZmxpbmUoRklMRSAqZnAsIGNoYXIgKmVycmJ1Zik7CitwY2FwX3QgKnBjYXBfZm9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oRklMRSAqZnAsCisgICAgdV9pbnQgcHJlY2lzaW9uLCBjaGFyICplcnJidWYpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9vcGVuX29mZmxpbmUoKQorYW5kCisuQiBwY2FwX29wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oKQorYXJlIGNhbGxlZCB0byBvcGVuIGEgYGBzYXZlZmlsZScnIGZvciByZWFkaW5nLgorLlBQCisuSSBmbmFtZQorc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIG9wZW4uIFRoZSBmaWxlIGNhbiBoYXZlIHRoZSBwY2FwIGZpbGUKK2Zvcm1hdCBhcyBkZXNjcmliZWQgaW4KKy5CUiBwY2FwLXNhdmVmaWxlICg1KSwKK3doaWNoIGlzIHRoZSBmaWxlIGZvcm1hdCB1c2VkIGJ5LCBhbW9uZyBvdGhlciBwcm9ncmFtcywKKy5CUiB0Y3BkdW1wICgxKQorYW5kCisuQlIgdGNwc2xpY2UgKDEpLAorb3IgY2FuIGhhdmUgdGhlIHBjYXAtbmcgZmlsZSBmb3JtYXQsIGFsdGhvdWdoIG5vdCBhbGwgcGNhcC1uZyBmaWxlcyBjYW4KK2JlIHJlYWQuCitUaGUgbmFtZSAiLSIgaXMgYSBzeW5vbnltIGZvcgorLkJSIHN0ZGluIC4KKy5QUAorLkIgcGNhcF9vcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKCkKK3Rha2VzIGFuIGFkZGl0aW9uYWwKKy5JIHByZWNpc2lvbgorYXJndW1lbnQgc3BlY2lmeWluZyB0aGUgdGltZSBzdGFtcCBwcmVjaXNpb24gZGVzaXJlZDsKK2lmCisuQiBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk8KK2lzIHNwZWNpZmllZCwgcGFja2V0IHRpbWUgc3RhbXBzIHdpbGwgYmUgc3VwcGxpZWQgaW4gc2Vjb25kcyBhbmQKK21pY3Jvc2Vjb25kcywKK2FuZCBpZgorLkIgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX05BTk8KK2lzIHNwZWNpZmllZCwgcGFja2V0IHRpbWUgc3RhbXBzIHdpbGwgYmUgc3VwcGxpZWQgaW4gc2Vjb25kcyBhbmQKK25hbm9zZWNvbmRzLiAgSWYgdGhlIHRpbWUgc3RhbXBzIGluIHRoZSBmaWxlIGRvIG5vdCBoYXZlIHRoZSBzYW1lCitwcmVjaXNpb24gYXMgdGhlIHJlcXVlc3RlZCBwcmVjaXNpb24sIHRoZXkgd2lsbCBiZSBzY2FsZWQgdXAgb3IgZG93biBhcworbmVjZXNzYXJ5IGJlZm9yZSBiZWluZyBzdXBwbGllZC4KKy5QUAorQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjYWxsCisuQiBwY2FwX2ZvcGVuX29mZmxpbmUoKQorb3IKKy5CIHBjYXBfZm9wZW5fb2ZmbGluZV93aXRoX3RzdGFtcF9wcmVjaXNpb24oKQordG8gcmVhZCBkdW1wZWQgZGF0YSBmcm9tIGFuIGV4aXN0aW5nIG9wZW4gc3RyZWFtCisuSVIgZnAgLgorLkIgcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbigpIHRha2VzIGFuIGFkZGl0aW9uYWwKKy5JIHByZWNpc2lvbgorYXJndW1lbnQgYXMgZGVzY3JpYmVkIGFib3ZlLgorTm90ZSB0aGF0IG9uIFdpbmRvd3MsIHRoYXQgc3RyZWFtIHNob3VsZCBiZSBvcGVuZWQgaW4gYmluYXJ5IG1vZGUuCisuU0ggUkVUVVJOIFZBTFVFCisuQlIgcGNhcF9vcGVuX29mZmxpbmUoKSAsCisuQlIgcGNhcF9vcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKCkgLAorLkJSIHBjYXBfZm9wZW5fb2ZmbGluZSgpICwKK2FuZAorLkIgcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbigpCityZXR1cm4gYQorLkkgcGNhcF90ICoKK29uIHN1Y2Nlc3MgYW5kCisuQiBOVUxMCitvbiBmYWlsdXJlLgorSWYKKy5CIE5VTEwKK2lzIHJldHVybmVkLAorLkkgZXJyYnVmCitpcyBmaWxsZWQgaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlLgorLkkgZXJyYnVmCitpcyBhc3N1bWVkIHRvIGJlIGFibGUgdG8gaG9sZCBhdCBsZWFzdAorLkIgUENBUF9FUlJCVUZfU0laRQorY2hhcnMuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwLXNhdmVmaWxlKDUpCmRpZmYgLS1naXQgYS9wY2FwX29wZW5fb2ZmbGluZS4zcGNhcC5pbiBiL3BjYXBfb3Blbl9vZmZsaW5lLjNwY2FwLmluCmluZGV4IDcyMzk3MjkuLjdmZTU1MWUgMTAwNjQ0Ci0tLSBhL3BjYXBfb3Blbl9vZmZsaW5lLjNwY2FwLmluCisrKyBiL3BjYXBfb3Blbl9vZmZsaW5lLjNwY2FwLmluCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9PUEVOX09GRkxJTkUgM1BDQVAgIjEgSnVseSAyMDEzIgorLlRIIFBDQVBfT1BFTl9PRkZMSU5FIDNQQ0FQICIzIEphbnVhcnkgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX29wZW5fb2ZmbGluZSwgcGNhcF9vcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uLAogcGNhcF9mb3Blbl9vZmZsaW5lLCBwY2FwX2ZvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uIFwtIG9wZW4gYSBzYXZlZCBjYXB0dXJlIGZpbGUgZm9yIHJlYWRpbmcKZGlmZiAtLWdpdCBhL3BjYXBfc2V0X2J1ZmZlcl9zaXplLjNwY2FwIGIvcGNhcF9zZXRfYnVmZmVyX3NpemUuM3BjYXAKaW5kZXggZmVhMWRmNy4uNjg0ZjczOSAxMDA2NDQKLS0tIGEvcGNhcF9zZXRfYnVmZmVyX3NpemUuM3BjYXAKKysrIGIvcGNhcF9zZXRfYnVmZmVyX3NpemUuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX1NFVF9CVUZGRVJfU0laRSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlRIIFBDQVBfU0VUX0JVRkZFUl9TSVpFIDNQQ0FQICIzIEphbnVhcnkgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX3NldF9idWZmZXJfc2l6ZSBcLSBzZXQgdGhlIGJ1ZmZlciBzaXplIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCiBjYXB0dXJlIGhhbmRsZQpkaWZmIC0tZ2l0IGEvcGNhcF9zZXRfZGF0YWxpbmsuM3BjYXAgYi9wY2FwX3NldF9kYXRhbGluay4zcGNhcAppbmRleCA2MGE3YmZjLi4yNGQ1N2E1IDEwMDY0NAotLS0gYS9wY2FwX3NldF9kYXRhbGluay4zcGNhcAorKysgYi9wY2FwX3NldF9kYXRhbGluay4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfU0VUX0RBVEFMSU5LIDNQQ0FQICIyMiBBdWd1c3QgMjAxMCIKKy5USCBQQ0FQX1NFVF9EQVRBTElOSyAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCiAuU0ggTkFNRQogcGNhcF9zZXRfZGF0YWxpbmsgXC0gc2V0IHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIHRvIGJlIHVzZWQgYnkgYQogY2FwdHVyZSBkZXZpY2UKZGlmZiAtLWdpdCBhL3BjYXBfc2V0X2ltbWVkaWF0ZV9tb2RlLjNwY2FwIGIvcGNhcF9zZXRfaW1tZWRpYXRlX21vZGUuM3BjYXAKaW5kZXggODdlYzk4Yi4uYjNhZDI0MyAxMDA2NDQKLS0tIGEvcGNhcF9zZXRfaW1tZWRpYXRlX21vZGUuM3BjYXAKKysrIGIvcGNhcF9zZXRfaW1tZWRpYXRlX21vZGUuM3BjYXAKQEAgLTE4LDcgKzE4LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX1NFVF9JTU1FRElBVEVfTU9ERSAzUENBUCAiOCBNYXkgMjAxMyIKKy5USCBQQ0FQX1NFVF9JTU1FRElBVEVfTU9ERSAzUENBUCAiNSBEZWNlbWJlciAyMDEzIgogLlNIIE5BTUUKIHBjYXBfc2V0X2ltbWVkaWF0ZV9tb2RlIFwtIHNldCBpbW1lZGlhdGUgbW9kZSBmb3IgYSBub3QteWV0LWFjdGl2YXRlZCBjYXB0dXJlCiBoYW5kbGUKZGlmZiAtLWdpdCBhL3BjYXBfc2V0X3Byb21pc2MuM3BjYXAgYi9wY2FwX3NldF9wcm9taXNjLjNwY2FwCmluZGV4IDVkMTc1NzIuLmZjZDc5N2EgMTAwNjQ0Ci0tLSBhL3BjYXBfc2V0X3Byb21pc2MuM3BjYXAKKysrIGIvcGNhcF9zZXRfcHJvbWlzYy4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfU0VUX1BST01JU0MgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5USCBQQ0FQX1NFVF9QUk9NSVNDIDNQQ0FQICIzIEphbnVhcnkgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX3NldF9wcm9taXNjIFwtIHNldCBwcm9taXNjdW91cyBtb2RlIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCiBjYXB0dXJlIGhhbmRsZQpkaWZmIC0tZ2l0IGEvcGNhcF9zZXRfcmZtb24uM3BjYXAgYi9wY2FwX3NldF9yZm1vbi4zcGNhcAppbmRleCBhMzg2ZThiLi42OTE1MThhIDEwMDY0NAotLS0gYS9wY2FwX3NldF9yZm1vbi4zcGNhcAorKysgYi9wY2FwX3NldF9yZm1vbi4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfU0VUX1JGTU9OIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuVEggUENBUF9TRVRfUkZNT04gM1BDQVAgIjMgSmFudWFyeSAyMDE0IgogLlNIIE5BTUUKIHBjYXBfc2V0X3JmbW9uIFwtIHNldCBtb25pdG9yIG1vZGUgZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQgY2FwdHVyZQogaGFuZGxlCmRpZmYgLS1naXQgYS9wY2FwX3NldF9zbmFwbGVuLjNwY2FwIGIvcGNhcF9zZXRfc25hcGxlbi4zcGNhcAppbmRleCA4MDgwZWExLi40NGViMTU0IDEwMDY0NAotLS0gYS9wY2FwX3NldF9zbmFwbGVuLjNwY2FwCisrKyBiL3BjYXBfc2V0X3NuYXBsZW4uM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX1NFVF9TTkFQTEVOIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuVEggUENBUF9TRVRfU05BUExFTiAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCiAuU0ggTkFNRQogcGNhcF9zZXRfc25hcGxlbiBcLSBzZXQgdGhlIHNuYXBzaG90IGxlbmd0aCBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAogY2FwdHVyZSBoYW5kbGUKZGlmZiAtLWdpdCBhL3BjYXBfc2V0X3RpbWVvdXQuM3BjYXAgYi9wY2FwX3NldF90aW1lb3V0LjNwY2FwCmluZGV4IGI3MjgyMDMuLmE4OTMyN2YgMTAwNjQ0Ci0tLSBhL3BjYXBfc2V0X3RpbWVvdXQuM3BjYXAKKysrIGIvcGNhcF9zZXRfdGltZW91dC4zcGNhcApAQCAtMTcsNyArMTcsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfU0VUX1RJTUVPVVQgM1BDQVAgIjE2IEFwcmlsIDIwMTQiCisuVEggUENBUF9TRVRfVElNRU9VVCAzUENBUCAiMSBEZWNlbWJlciAyMDE1IgogLlNIIE5BTUUKIHBjYXBfc2V0X3RpbWVvdXQgXC0gc2V0IHRoZSByZWFkIHRpbWVvdXQgZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQKIGNhcHR1cmUgaGFuZGxlCkBAIC0zNiwxMCArMzYsMTUgQEAKIHRoZSBoYW5kbGUgaXMgYWN0aXZhdGVkIHRvCiAuSVIgdG9fbXMgLAogd2hpY2ggaXMgaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzLgorLkxQCitUaGUgYmVoYXZpb3IsIGlmIHRoZSB0aW1lb3V0IGlzbid0IHNwZWNpZmllZCwgaXMgdW5kZWZpbmVkLiAgV2UKK3JlY29tbWVuZCBhbHdheXMgc2V0dGluZyB0aGUgdGltZW91dCB0byBhIG5vbi16ZXJvIHZhbHVlIHVubGVzcworaW1tZWRpYXRlIG1vZGUgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSB0aW1lb3V0IGhhcyBubyBlZmZlY3QuCiAuU0ggUkVUVVJOIFZBTFVFCiAuQiBwY2FwX3NldF90aW1lb3V0KCkKIHJldHVybnMgMCBvbiBzdWNjZXNzIG9yCiAuQiBQQ0FQX0VSUk9SX0FDVElWQVRFRAogaWYgY2FsbGVkIG9uIGEgY2FwdHVyZSBoYW5kbGUgdGhhdCBoYXMgYmVlbiBhY3RpdmF0ZWQuCiAuU0ggU0VFIEFMU08KLXBjYXAoM1BDQVApLCBwY2FwX2NyZWF0ZSgzUENBUCksIHBjYXBfYWN0aXZhdGUoM1BDQVApCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKSwKK3BjYXBfc2V0X2ltbWVkaWF0ZV9tb2RlKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcCBiL3BjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczYWEzMgotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAKQEAgLTAsMCArMSw2MSBAQAorLlwiQ29weXJpZ2h0IChjKSAyMDEzLCBNaWNoYWwgU2VrbGV0YXIKKy5cIkFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIlJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwibW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCJhcmUgbWV0OgorLlwiCisuXCIgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisuXCIgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisuXCIgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy5cIiAgICAgZGlzdHJpYnV0aW9uLgorLlwiICAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorLlwiICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIgorLlwiVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKy5cIklNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisuXCJXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKy5USCBQQ0FQX1NFVF9UU1RBTVBfUFJFQ0lTSU9OIDNQQ0FQICI1IEZlYnJ1YXJ5IDIwMTUiCisuU0ggTkFNRQorcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbiBcLSBzZXQgdGhlIHRpbWUgc3RhbXAgcHJlY2lzaW9uIHJldHVybmVkIGluCitjYXB0dXJlcworLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX3NldF90c3RhbXBfcHJlY2lzaW9uKHBjYXBfdCAqcCwgaW50IHRzdGFtcF9wcmVjaXNpb24pOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbigpCitzZXRzIHRoZSBwcmVjaXNpb24gb2YgdGhlIHRpbWUgc3RhbXAgZGVzaXJlZCBmb3IgcGFja2V0cyBjYXB0dXJlZCBvbiB0aGUgcGNhcAorZGVzY3JpcHRvciB0byB0aGUgdHlwZSBzcGVjaWZpZWQgYnkKKy5JUiB0c3RhbXBfcHJlY2lzaW9uIC4KK0l0IG11c3QgYmUgY2FsbGVkIG9uIGEgcGNhcCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkKKy5CIHBjYXBfY3JlYXRlKCkKK3RoYXQgaGFzIG5vdCB5ZXQgYmVlbiBhY3RpdmF0ZWQgYnkKKy5CUiBwY2FwX2FjdGl2YXRlKCkgLgorVHdvIHRpbWUgc3RhbXAgcHJlY2lzaW9ucyBhcmUgc3VwcG9ydGVkLCBtaWNyb3NlY29uZHMgYW5kIG5hbm9zZWNvbmRzLiBPbmUgY2FuCit1c2Ugb3B0aW9ucworLkIgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX01JQ1JPIGFuZAorLkIgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX05BTk8KK3RvIHJlcXVlc3QgZGVzaXJlZCBwcmVjaXNpb24uIEJ5IGRlZmF1bHQsIHRpbWUgc3RhbXBzIGFyZSBpbiBtaWNyb3NlY29uZHMuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3NldF90c3RhbXBfcHJlY2lzaW9uKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIGlmIHRoZSBzcGVjaWZpZWQgdGltZSBzdGFtcCBwcmVjaXNpb24gaXMgZXhwZWN0ZWQgdG8gYmUKK3N1cHBvcnRlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSwKKy5CIFBDQVBfRVJST1JfVFNUQU1QX1BSRUNJU0lPTl9OT1RTVVAKK2lmIG9wZXJhdGluZyBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCByZXF1ZXN0ZWQgdGltZSBzdGFtcCBwcmVjaXNpb24sCisuQiBQQ0FQX0VSUk9SX0FDVElWQVRFRAoraWYgY2FsbGVkIG9uIGEgY2FwdHVyZSBoYW5kbGUgdGhhdCBoYXMgYmVlbiBhY3RpdmF0ZWQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLAorcGNhcF9nZXRfdHN0YW1wX3ByZWNpc2lvbigzUENBUCksCitwY2FwLXRzdGFtcCg3KQpkaWZmIC0tZ2l0IGEvcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcC5pbiBiL3BjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24uM3BjYXAuaW4KaW5kZXggODVmYTg0ZC4uNTdjNGVhMyAxMDA2NDQKLS0tIGEvcGNhcF9zZXRfdHN0YW1wX3ByZWNpc2lvbi4zcGNhcC5pbgorKysgYi9wY2FwX3NldF90c3RhbXBfcHJlY2lzaW9uLjNwY2FwLmluCkBAIC0xOSw3ICsxOSw3IEBACiAuXCJJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAogLlwiV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogCi0uVEggUENBUF9TRVRfVFNUQU1QX1BSRUNJU0lPTiAzUENBUCAiMjcgQXVndXN0IDIwMTMiCisuVEggUENBUF9TRVRfVFNUQU1QX1BSRUNJU0lPTiAzUENBUCAiNSBGZWJydWFyeSAyMDE1IgogLlNIIE5BTUUKIHBjYXBfc2V0X3RzdGFtcF9wcmVjaXNpb24gXC0gc2V0IHRoZSB0aW1lIHN0YW1wIHByZWNpc2lvbiByZXR1cm5lZCBpbgogY2FwdHVyZXMKZGlmZiAtLWdpdCBhL3BjYXBfc2V0X3RzdGFtcF90eXBlLjNwY2FwIGIvcGNhcF9zZXRfdHN0YW1wX3R5cGUuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzYmRhMAotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfc2V0X3RzdGFtcF90eXBlLjNwY2FwCkBAIC0wLDAgKzEsNjUgQEAKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX1NFVF9UU1RBTVBfVFlQRSAzUENBUCAiNSBEZWNlbWJlciAyMDE0IgorLlNIIE5BTUUKK3BjYXBfc2V0X3RzdGFtcF90eXBlIFwtIHNldCB0aGUgdGltZSBzdGFtcCB0eXBlIHRvIGJlIHVzZWQgYnkgYQorY2FwdHVyZSBkZXZpY2UKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9zZXRfdHN0YW1wX3R5cGUocGNhcF90ICpwLCBpbnQgdHN0YW1wX3R5cGUpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9zZXRfdHN0YW1wX3R5cGUoKQorc2V0cyB0aGUgdGhlIHR5cGUgb2YgdGltZSBzdGFtcCBkZXNpcmVkIGZvciBwYWNrZXRzIGNhcHR1cmVkIG9uIHRoZSBwY2FwCitkZXNjcmlwdG9yIHRvIHRoZSB0eXBlIHNwZWNpZmllZCBieQorLklSIHRzdGFtcF90eXBlIC4KK0l0IG11c3QgYmUgY2FsbGVkIG9uIGEgcGNhcCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkKKy5CIHBjYXBfY3JlYXRlKCkKK3RoYXQgaGFzIG5vdCB5ZXQgYmVlbiBhY3RpdmF0ZWQgYnkKKy5CUiBwY2FwX2FjdGl2YXRlKCkgLgorLkIgcGNhcF9saXN0X3RzdGFtcF90eXBlcygpCit3aWxsIGdpdmUgYSBsaXN0IG9mIHRoZSB0aW1lIHN0YW1wIHR5cGVzIHN1cHBvcnRlZCBieSBhIGdpdmVuIGNhcHR1cmUKK2RldmljZS4KK1NlZQorLkJSIHBjYXAtdHN0YW1wICg3KQorZm9yIGEgbGlzdCBvZiBhbGwgdGhlIHRpbWUgc3RhbXAgdHlwZXMuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3NldF90c3RhbXBfdHlwZSgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBpZiB0aGUgc3BlY2lmaWVkIHRpbWUgc3RhbXAgdHlwZSBpcyBleHBlY3RlZCB0byBiZQorc3VwcG9ydGVkIGJ5IHRoZSBjYXB0dXJlIGRldmljZSwKKy5CIFBDQVBfV0FSTklOR19UU1RBTVBfVFlQRV9OT1RTVVAKK2lmIHRoZSBzcGVjaWZpZWQgdGltZSBzdGFtcCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCitjYXB0dXJlIGRldmljZSwKKy5CIFBDQVBfRVJST1JfQUNUSVZBVEVECitpZiBjYWxsZWQgb24gYSBjYXB0dXJlIGhhbmRsZSB0aGF0IGhhcyBiZWVuIGFjdGl2YXRlZCwgYW5kCisuQiBQQ0FQX0VSUk9SX0NBTlRTRVRfVFNUQU1QX1RZUEUKK2lmIHRoZSBjYXB0dXJlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgc2V0dGluZyB0aGUgdGltZSBzdGFtcCB0eXBlLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwKK3BjYXBfbGlzdF90c3RhbXBfdHlwZXMoM1BDQVApLAorcGNhcF90c3RhbXBfdHlwZV9uYW1lX3RvX3ZhbCgzUENBUCksCitwY2FwLXRzdGFtcCg3KQpkaWZmIC0tZ2l0IGEvcGNhcF9zZXRfdHN0YW1wX3R5cGUuM3BjYXAuaW4gYi9wY2FwX3NldF90c3RhbXBfdHlwZS4zcGNhcC5pbgppbmRleCBmZDY3M2JkLi5lNThjZGQ0IDEwMDY0NAotLS0gYS9wY2FwX3NldF90c3RhbXBfdHlwZS4zcGNhcC5pbgorKysgYi9wY2FwX3NldF90c3RhbXBfdHlwZS4zcGNhcC5pbgpAQCAtMTgsNyArMTgsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfU0VUX1RTVEFNUF9UWVBFIDNQQ0FQICIyMSBBdWd1c3QgMjAxMCIKKy5USCBQQ0FQX1NFVF9UU1RBTVBfVFlQRSAzUENBUCAiNSBEZWNlbWJlciAyMDE0IgogLlNIIE5BTUUKIHBjYXBfc2V0X3RzdGFtcF90eXBlIFwtIHNldCB0aGUgdGltZSBzdGFtcCB0eXBlIHRvIGJlIHVzZWQgYnkgYQogY2FwdHVyZSBkZXZpY2UKZGlmZiAtLWdpdCBhL3BjYXBfc2V0ZGlyZWN0aW9uLjNwY2FwIGIvcGNhcF9zZXRkaXJlY3Rpb24uM3BjYXAKaW5kZXggODcxYTViMC4uMTE5NDVmNSAxMDA2NDQKLS0tIGEvcGNhcF9zZXRkaXJlY3Rpb24uM3BjYXAKKysrIGIvcGNhcF9zZXRkaXJlY3Rpb24uM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX1NFVERJUkVDVElPTiAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlRIIFBDQVBfU0VURElSRUNUSU9OIDNQQ0FQICI4IE1hcmNoIDIwMTUiCiAuU0ggTkFNRQogcGNhcF9zZXRkaXJlY3Rpb24gXC0gc2V0IHRoZSBkaXJlY3Rpb24gZm9yIHdoaWNoIHBhY2tldHMgd2lsbCBiZSBjYXB0dXJlZAogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX3NldGZpbHRlci4zcGNhcCBiL3BjYXBfc2V0ZmlsdGVyLjNwY2FwCmluZGV4IGM3Mzc3OTcuLjZlZmQyNTMgMTAwNjQ0Ci0tLSBhL3BjYXBfc2V0ZmlsdGVyLjNwY2FwCisrKyBiL3BjYXBfc2V0ZmlsdGVyLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9TRVRGSUxURVIgM1BDQVAgIjEzIE1heSAyMDA4IgorLlRIIFBDQVBfU0VURklMVEVSIDNQQ0FQICI3IEFwcmlsIDIwMTQiCiAuU0ggTkFNRQogcGNhcF9zZXRmaWx0ZXIgXC0gc2V0IHRoZSBmaWx0ZXIKIC5TSCBTWU5PUFNJUwpkaWZmIC0tZ2l0IGEvcGNhcF9zZXRub25ibG9jay4zcGNhcCBiL3BjYXBfc2V0bm9uYmxvY2suM3BjYXAKaW5kZXggYTk5ZWEwNy4uNjk1OTEyNyAxMDA2NDQKLS0tIGEvcGNhcF9zZXRub25ibG9jay4zcGNhcAorKysgYi9wY2FwX3NldG5vbmJsb2NrLjNwY2FwCkBAIC0xNyw3ICsxNyw3IEBACiAuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIC5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogLlwiCi0uVEggUENBUF9TRVROT05CTE9DSyAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlRIIFBDQVBfU0VUTk9OQkxPQ0sgM1BDQVAgIjE4IE9jdG9iZXIgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX3NldG5vbmJsb2NrLCBwY2FwX2dldG5vbmJsb2NrIFwtIHNldCBvciBnZXQgdGhlIHN0YXRlIG9mCiBub24tYmxvY2tpbmcgbW9kZSBvbiBhIGNhcHR1cmUgZGV2aWNlCmRpZmYgLS1naXQgYS9wY2FwX3NuYXBzaG90LjNwY2FwIGIvcGNhcF9zbmFwc2hvdC4zcGNhcAppbmRleCA0N2ViNDJhLi43YWY4YzMzIDEwMDY0NAotLS0gYS9wY2FwX3NuYXBzaG90LjNwY2FwCisrKyBiL3BjYXBfc25hcHNob3QuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX1NOQVBTSE9UIDNQQ0FQICIxNyBTZXB0ZW1iZXIgMjAxMyIKKy5USCBQQ0FQX1NOQVBTSE9UIDNQQ0FQICI3IEFwcmlsIDIwMTQiCiAuU0ggTkFNRQogcGNhcF9zbmFwc2hvdCBcLSBnZXQgdGhlIHNuYXBzaG90IGxlbmd0aAogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX3N0YXRzLjNwY2FwIGIvcGNhcF9zdGF0cy4zcGNhcAppbmRleCAxNTkwNTRlLi4yZGNlNGI1IDEwMDY0NAotLS0gYS9wY2FwX3N0YXRzLjNwY2FwCisrKyBiL3BjYXBfc3RhdHMuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX1NUQVRTIDNQQ0FQICI3IFNlcHRlbWJlciAyMDA5IgorLlRIIFBDQVBfU1RBVFMgM1BDQVAgIjMgSmFudWFyeSAyMDE0IgogLlNIIE5BTUUKIHBjYXBfc3RhdHMgXC0gZ2V0IGNhcHR1cmUgc3RhdGlzdGljcwogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX3N0YXR1c3Rvc3RyLjNwY2FwIGIvcGNhcF9zdGF0dXN0b3N0ci4zcGNhcAppbmRleCA3N2I4YzVmLi45YzIwNTdhIDEwMDY0NAotLS0gYS9wY2FwX3N0YXR1c3Rvc3RyLjNwY2FwCisrKyBiL3BjYXBfc3RhdHVzdG9zdHIuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX1NUQVRVU1RPU1RSIDNQQ0FQICI5IEFwcmlsIDIwMDgiCisuVEggUENBUF9TVEFUVVNUT1NUUiAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCiAuU0ggTkFNRQogcGNhcF9zdGF0dXN0b3N0ciBcLSBjb252ZXJ0IGEgUENBUF9FUlJPUl8gb3IgUENBUF9XQVJOSU5HXyB2YWx1ZSB0byBhIHN0cmluZwogLlNIIFNZTk9QU0lTCmRpZmYgLS1naXQgYS9wY2FwX3N0cmVycm9yLjNwY2FwIGIvcGNhcF9zdHJlcnJvci4zcGNhcAppbmRleCA3MTg1MTYyLi43YzdkNTNmIDEwMDY0NAotLS0gYS9wY2FwX3N0cmVycm9yLjNwY2FwCisrKyBiL3BjYXBfc3RyZXJyb3IuM3BjYXAKQEAgLTE3LDcgKzE3LDcgQEAKIC5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAuXCIKLS5USCBQQ0FQX1NUUkVSUk9SIDNQQ0FQICI0IEFwcmlsIDIwMDgiCisuVEggUENBUF9TVFJFUlJPUiAzUENBUCAiMyBKYW51YXJ5IDIwMTQiCiAuU0ggTkFNRQogcGNhcF9zdHJlcnJvciBcLSBjb252ZXJ0IGFuIGVycm5vIHZhbHVlIHRvIGEgc3RyaW5nCiAuU0ggU1lOT1BTSVMKZGlmZiAtLWdpdCBhL3BjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwuM3BjYXAgYi9wY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsLjNwY2FwCmluZGV4IDIyZGQxNWYuLmFjMmUzNWQgMTAwNjQ0Ci0tLSBhL3BjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwuM3BjYXAKKysrIGIvcGNhcF90c3RhbXBfdHlwZV9uYW1lX3RvX3ZhbC4zcGNhcApAQCAtMTgsNyArMTgsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfVFNUQU1QX1RZUEVfTkFNRV9UT19WQUwgM1BDQVAgIjIxIEF1Z3VzdCAyMDEwIgorLlRIIFBDQVBfVFNUQU1QX1RZUEVfTkFNRV9UT19WQUwgM1BDQVAgIjUgRGVjZW1iZXIgMjAxNCIKIC5TSCBOQU1FCiBwY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsIFwtIGdldCB0aGUgdGltZSBzdGFtcCB0eXBlIHZhbHVlCiBjb3JyZXNwb25kaW5nIHRvIGEgdGltZSBzdGFtcCB0eXBlIG5hbWUKZGlmZiAtLWdpdCBhL3BjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUuM3BjYXAgYi9wY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lLjNwY2FwCmluZGV4IDkwM2NlYTcuLjI2MTU1NGUgMTAwNjQ0Ci0tLSBhL3BjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUuM3BjYXAKKysrIGIvcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZS4zcGNhcApAQCAtMTgsNyArMTgsNyBAQAogLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KIC5cIgotLlRIIFBDQVBfVFNUQU1QX1RZUEVfVkFMX1RPX05BTUUgM1BDQVAgIjIxIEF1Z3VzdCAyMDEwIgorLlRIIFBDQVBfVFNUQU1QX1RZUEVfVkFMX1RPX05BTUUgM1BDQVAgIjEyIERlY2VtYmVyIDIwMTMiCiAuU0ggTkFNRQogcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZSwgcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fZGVzY3JpcHRpb24gXC0gZ2V0CiBhIG5hbWUgb3IgZGVzY3JpcHRpb24gZm9yIGEgdGltZSBzdGFtcCB0eXBlIHZhbHVlCmRpZmYgLS1naXQgYS9wY2FwX3ZlcnNpb24uaCBiL3BjYXBfdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOWM2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwX3ZlcnNpb24uaApAQCAtMCwwICsxLDEzIEBACisvKgorICogV2UgbWFrZSB0aGUgdmVyc2lvbiBzdHJpbmcgc3RhdGljLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdCwgcmF0aGVyCisgKiB0aGFuIGV4cG9ydGluZyB0aGUgdmVyc2lvbiBzdHJpbmcgZGlyZWN0bHkuICBPbiBhdCBsZWFzdCBzb21lIFVOSVhlcywKKyAqIGlmIHlvdSBpbXBvcnQgZGF0YSBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgaW50byBhbiBwcm9ncmFtLCB0aGUgZGF0YSBpcworICogYm91bmQgaW50byB0aGUgcHJvZ3JhbSBiaW5hcnksIHNvIGlmIHRoZSBzdHJpbmcgaW4gdGhlIHZlcnNpb24gb2YgdGhlCisgKiBsaWJyYXJ5IHdpdGggd2hpY2ggdGhlIHByb2dyYW0gd2FzIGxpbmtlZCBpc24ndCB0aGUgc2FtZSBhcyB0aGUKKyAqIHN0cmluZyBpbiB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB3aXRoIHdoaWNoIHRoZSBwcm9ncmFtIGlzIGJlaW5nCisgKiBydW4sIHZhcmlvdXMgdW5kZXNpcmFibGUgdGhpbmdzIG1heSBoYXBwZW4gKHdhcm5pbmdzLCB0aGUgc3RyaW5nCisgKiBiZWluZyB0aGUgb25lIGZyb20gdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgd2l0aCB3aGljaCB0aGUgcHJvZ3JhbQorICogd2FzIGxpbmtlZCwgb3IgZXZlbiB3ZWlyZGVyIHRoaW5ncywgc3VjaCBhcyB0aGUgc3RyaW5nIGJlaW5nIHRoZSBvbmUKKyAqIGZyb20gdGhlIGxpYnJhcnkgYnV0IGJlaW5nIHRydW5jYXRlZCkuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHBjYXBfdmVyc2lvbl9zdHJpbmdbXSA9ICJsaWJwY2FwIHZlcnNpb24gMS44LjEiOwpkaWZmIC0tZ2l0IGEvcGNhcF92ZXJzaW9uLmguaW4gYi9wY2FwX3ZlcnNpb24uaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTA0YzhlCi0tLSAvZGV2L251bGwKKysrIGIvcGNhcF92ZXJzaW9uLmguaW4KQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIFdlIG1ha2UgdGhlIHZlcnNpb24gc3RyaW5nIHN0YXRpYywgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQsIHJhdGhlcgorICogdGhhbiBleHBvcnRpbmcgdGhlIHZlcnNpb24gc3RyaW5nIGRpcmVjdGx5LiAgT24gYXQgbGVhc3Qgc29tZSBVTklYZXMsCisgKiBpZiB5b3UgaW1wb3J0IGRhdGEgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5IGludG8gYW4gcHJvZ3JhbSwgdGhlIGRhdGEgaXMKKyAqIGJvdW5kIGludG8gdGhlIHByb2dyYW0gYmluYXJ5LCBzbyBpZiB0aGUgc3RyaW5nIGluIHRoZSB2ZXJzaW9uIG9mIHRoZQorICogbGlicmFyeSB3aXRoIHdoaWNoIHRoZSBwcm9ncmFtIHdhcyBsaW5rZWQgaXNuJ3QgdGhlIHNhbWUgYXMgdGhlCisgKiBzdHJpbmcgaW4gdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgd2l0aCB3aGljaCB0aGUgcHJvZ3JhbSBpcyBiZWluZworICogcnVuLCB2YXJpb3VzIHVuZGVzaXJhYmxlIHRoaW5ncyBtYXkgaGFwcGVuICh3YXJuaW5ncywgdGhlIHN0cmluZworICogYmVpbmcgdGhlIG9uZSBmcm9tIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHdpdGggd2hpY2ggdGhlIHByb2dyYW0KKyAqIHdhcyBsaW5rZWQsIG9yIGV2ZW4gd2VpcmRlciB0aGluZ3MsIHN1Y2ggYXMgdGhlIHN0cmluZyBiZWluZyB0aGUgb25lCisgKiBmcm9tIHRoZSBsaWJyYXJ5IGJ1dCBiZWluZyB0cnVuY2F0ZWQpLgorICovCitzdGF0aWMgY29uc3QgY2hhciBwY2FwX3ZlcnNpb25fc3RyaW5nW10gPSAibGlicGNhcCB2ZXJzaW9uICUlTElCUENBUF9WRVJTSU9OJSUiOwpkaWZmIC0tZ2l0IGEvcG9ydGFiaWxpdHkuaCBiL3BvcnRhYmlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2YmY0MAotLS0gL2Rldi9udWxsCisrKyBiL3BvcnRhYmlsaXR5LmgKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zCisgKglFbmdpbmVlcmluZyBHcm91cCBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3Igb2YgdGhlIExhYm9yYXRvcnkgbWF5IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIHBvcnRhYmlsaXR5X2gKKyNkZWZpbmUJcG9ydGFiaWxpdHlfaAorCisvKgorICogSGVscGVycyBmb3IgcG9ydGFiaWxpdHkgYmV0d2VlbiBXaW5kb3dzIGFuZCBVTipYIGFuZCBiZXR3ZWVuIGRpZmZlcmVudAorICogZmxhdm9ycyBvZiBVTipYLgorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkxDUFkKKyAvKgorICAqIE1hY3JvIHRoYXQgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBzdHJsY3B5KCkuCisgICovCisgI2lmZGVmIF9NU0NfVkVSCisgIC8qCisgICAqIHN0cm5jcHlfcygpIGlzIHN1cHBvcnRlZCBhdCBsZWFzdCBiYWNrIHRvIFZpc3VhbAorICAgKiBTdHVkaW8gMjAwNS4KKyAgICovCisgICNkZWZpbmUgc3RybGNweSh4LCB5LCB6KSBcCisJc3RybmNweV9zKCh4KSwgKHopLCAoeSksIF9UUlVOQ0FURSkKKworICNlbHNlCisgICNkZWZpbmUgc3RybGNweSh4LCB5LCB6KSBcCisJKHN0cm5jcHkoKHgpLCAoeSksICh6KSksIFwKKwkgKCh6KSA8PSAwID8gMCA6ICgoeClbKHopIC0gMV0gPSAnXDAnKSksIFwKKwkgKHZvaWQpIHN0cmxlbigoeSkpKQorICNlbmRpZgorI2VuZGlmCisKKy8qCisgKiBGb3IgZmxhZ2dpbmcgYXJndW1lbnRzIGFzIGZvcm1hdCBzdHJpbmdzIGluIE1TVkMuCisgKi8KKyNpZiBfTVNDX1ZFUiA+PSAxNDAwCisgI2luY2x1ZGUgPHNhbC5oPgorICNpZiBfTVNDX1ZFUiA+IDE0MDAKKyAgI2RlZmluZSBGT1JNQVRfU1RSSU5HKHApIF9QcmludGZfZm9ybWF0X3N0cmluZ18gcAorICNlbHNlCisgICNkZWZpbmUgRk9STUFUX1NUUklORyhwKSBfX2Zvcm1hdF9zdHJpbmcgcAorICNlbmRpZgorI2Vsc2UKKyAjZGVmaW5lIEZPUk1BVF9TVFJJTkcocCkgcAorI2VuZGlmCisKKyNpZmRlZiBfTVNDX1ZFUgorICAjZGVmaW5lIHN0cmR1cAlfc3RyZHVwCisgICNkZWZpbmUgc3NjYW5mCXNzY2FuZl9zCisgICNkZWZpbmUgc2V0YnVmKHgsIHkpIFwKKwlzZXR2YnVmKCh4KSwgKHkpLCBfSU9OQkYsIDApCisgICNkZWZpbmUgZm9wZW4oeCwgeSkgXAorCWZvcGVuX3NhZmUoKHgpLCAoeSkpCisgIEZJTEUgKmZvcGVuX3NhZmUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIqIG1vZGUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAjZGVmaW5lIHN0cmxjYXQoeCwgeSwgeikgXAorCXN0cm5jYXRfcygoeCksICh6KSwgKHkpLCBfVFJVTkNBVEUpCisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCisgIC8qCisgICAqIE1TVkMuCisgICAqLworICAjaWYgX01TQ19WRVIgPj0gMTkwMAorICAgIC8qCisgICAgICogVlMgMjAxNSBvciBuZXdlcjsgd2UgaGF2ZSBzbnByaW50ZigpIGZ1bmN0aW9uLgorICAgICAqLworICAgICNkZWZpbmUgSEFWRV9TTlBSSU5URgorICAjZW5kaWYKKyNlbmRpZgorCisvKgorICogT24gV2luZG93cywgc25wcmludGYoKSwgd2l0aCB0aGF0IG5hbWUgYW5kIHdpdGggQzk5IGJlaGF2aW9yIC0gaS5lLiwKKyAqIGd1YXJhbnRlZWluZyB0aGF0IHRoZSBmb3JtYXR0ZWQgc3RyaW5nIGlzIG51bGwtdGVybWluYXRlZCAtIGRpZG4ndAorICogYXBwZWFyIHVudGlsIFZpc3VhbCBTdHVkaW8gMjAxNS4gIFByaW9yIHRvIHRoYXQsIHRoZSBDIHJ1bnRpbWUgaGFkCisgKiBvbmx5IF9zbnByaW50ZigpLCB3aGljaCAqZG9lc24ndCogZ3VhcmFudGVlIHRoYXQgdGhlIHN0cmluZyBpcworICogbnVsbC10ZXJtaW5hdGVkIGlmIGl0IGlzIHRydW5jYXRlZCBkdWUgdG8gdGhlIGJ1ZmZlciBiZWluZyB0b28KKyAqIHNtYWxsLiAgV2UgdGhlcmVmb3JlIGNhbid0IGp1c3QgZGVmaW5lIHNucHJpbnRmIHRvIGJlIF9zbnByaW50ZgorICogYW5kIGRlZmluZSB2c25wcmludGYgdG8gYmUgX3ZzbnByaW50ZiwgYXMgd2UncmUgcmVseWluZyBvbiBudWxsLQorICogdGVybWluYXRpb24gb2Ygc3RyaW5ncyBpbiBhbGwgY2FzZXMuCisgKgorICogV2UgYWxzbyB3YW50IHRvIGFsbG93IHRoaXMgdG8gYmUgYnVpbHQgd2l0aCB2ZXJzaW9ucyBvZiBWaXN1YWwgU3R1ZGlvCisgKiBwcmlvciB0byBWUyAyMDE1LCBzbyB3ZSBjYW4ndCByZWx5IG9uIHNucHJpbnRmKCkgYmVpbmcgcHJlc2VudC4KKyAqCisgKiBBbmQgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCwgaWYgd2Ugc3VwcG9ydCBwbHVnaW5zIGluIHRoZSBmdXR1cmUsCisgKiBhIHJvdXRpbmUgd2l0aCBDOTkgc25wcmludGYoKSBiZWhhdmlvciB3aWxsIGJlIGF2YWlsYWJsZSB0byB0aGVtLgorICogV2UgYWxzbyBkb24ndCB3YW50IGl0IHRvIGNvbGxpZGUgd2l0aCB0aGUgQyBsaWJyYXJ5IHNucHJpbnRmKCkgaWYKKyAqIHRoZXJlIGlzIG9uZS4KKyAqCisgKiBTbyB3ZSBtYWtlIHBjYXBfc25wcmludGYoKSBhbmQgcGNhcF92c25wcmludGYoKSBhdmFpbGFibGUsIGVpdGhlciBieQorICogI2RlZmluaW5nIHRoZW0gdG8gYmUgc25wcmludGYgb3IgdnNucHJpbnRmLCByZXNwZWN0aXZlbHksIG9yIGJ5CisgKiBkZWZpbmluZyBvdXIgb3duIHZlcnNpb25zIGFuZCBleHBvcnRpbmcgdGhlbS4KKyAqLworI2lmZGVmIEhBVkVfU05QUklOVEYKKyNkZWZpbmUgcGNhcF9zbnByaW50ZiBzbnByaW50ZgorI2Vsc2UKK2V4dGVybiBpbnQgcGNhcF9zbnByaW50ZihjaGFyICosIHNpemVfdCwgRk9STUFUX1NUUklORyhjb25zdCBjaGFyICopLCAuLi4pCisjaWZkZWYgX19BVFRSSUJVVEVfX19GT1JNQVRfT0sKKyAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKQorI2VuZGlmIC8qIF9fQVRUUklCVVRFX19fRk9STUFUX09LICovCisgICAgOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZTTlBSSU5URgorI2RlZmluZSBwY2FwX3ZzbnByaW50ZiB2c25wcmludGYKKyNlbHNlCitleHRlcm4gaW50IHBjYXBfdnNucHJpbnRmKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIHZhX2xpc3QgYXApOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUlRPS19SCisgICNkZWZpbmUgcGNhcF9zdHJ0b2tfcglzdHJ0b2tfcgorI2Vsc2UKKyAgI2lmZGVmIF9NU0NfVkVSCisgICAgLyoKKyAgICAgKiBNaWNyb3NvZnQgZ2l2ZXMgaXQgYSBkaWZmZXJlbnQgbmFtZS4KKyAgICAgKi8KKyAgICAjZGVmaW5lIHBjYXBfc3RydG9rX3IJc3RydG9rX3MKKyAgI2Vsc2UKKyAgICAvKgorICAgICAqIERlZmluZSBpdCBvdXJzZWx2ZXMuCisgICAgICovCisgICAgI2RlZmluZSBORUVEX1NUUlRPS19SCisgICAgZXh0ZXJuIGludCBwY2FwX3N0cnRva19yKGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICoqKTsKKyAgI2VuZGlmCisjZW5kaWYgLyogSEFWRV9TVFJUT0tfUiAqLworCisjaWZkZWYgX1dJTjMyCisgIC8qCisgICAqIFRoZXNlIG1heSBiZSBkZWZpbmVkIGJ5IDxpbnR0eXBlcy5oPi4KKyAgICoKKyAgICogWFhYIC0gZm9yIE1TVkMsIHdlIGFsd2F5cyB3YW50IHRoZSBfTVNDX0VYVEVOU0lPTlMgdmVyc2lvbnMuCisgICAqIFdoYXQgYWJvdXQgb3RoZXIgY29tcGlsZXJzPyAgSWYsIGFzIHRoZSBNaW5HVyBXZWIgc2l0ZSBzYXlzIE1pbkdXCisgICAqIGRvZXMsIHRoZSBvdGhlciBjb21waWxlcnMganVzdCB1c2UgTWljcm9zb2Z0J3MgcnVuLXRpbWUgbGlicmFyeSwKKyAgICogdGhlbiB0aGV5IHNob3VsZCBwcm9iYWJseSB1c2UgdGhlIF9NU0NfRVhURU5TSU9OUyBldmVuIGlmIHRoZQorICAgKiBjb21waWxlciBkb2Vzbid0IGRlZmluZSBfTVNDX0VYVEVOU0lPTlMuCisgICAqCisgICAqIFhYWCAtIHdlIGN1cnJlbnRseSBhcmVuJ3QgdXNpbmcgYW55IG9mIHRoZXNlLCBidXQgdGhpcyBhbGxvd3MKKyAgICogdGhlaXIgdXNlIGluIHRoZSBmdXR1cmUuCisgICAqLworICAjaWZuZGVmIFBSSWQ2NAorICAgICNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKKyAgICAgICNkZWZpbmUgUFJJZDY0CSJJNjRkIgorICAgICNlbHNlCisgICAgICAjZGVmaW5lIFBSSWQ2NAkibGxkIgorICAgICNlbmRpZgorICAjZW5kaWYgLyogUFJJZDY0ICovCisKKyAgI2lmbmRlZiBQUklvNjQKKyAgICAjaWZkZWYgX01TQ19FWFRFTlNJT05TCisgICAgICAjZGVmaW5lIFBSSW82NAkiSTY0byIKKyAgICAjZWxzZQorICAgICAgI2RlZmluZSBQUklvNjQJImxsbyIKKyAgICAjZW5kaWYKKyAgI2VuZGlmIC8qIFBSSW82NCAqLworCisgICNpZm5kZWYgUFJJeDY0CisgICAgI2lmZGVmIF9NU0NfRVhURU5TSU9OUworICAgICAgI2RlZmluZSBQUkl4NjQJIkk2NHgiCisgICAgI2Vsc2UKKyAgICAgICNkZWZpbmUgUFJJeDY0CSJsbHgiCisgICAgI2VuZGlmCisgICNlbmRpZgorCisgICNpZm5kZWYgUFJJdTY0CisgICAgI2lmZGVmIF9NU0NfRVhURU5TSU9OUworICAgICAgI2RlZmluZSBQUkl1NjQJIkk2NHUiCisgICAgI2Vsc2UKKyAgICAgICNkZWZpbmUgUFJJdTY0CSJsbHUiCisgICAgI2VuZGlmCisgICNlbmRpZgorCisgICNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyAgICAjZGVmaW5lIGlubGluZSBfX2lubGluZQorICAjZW5kaWYKKyNlbmRpZiAvKiBfV0lOMzIgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yZW1vdGUtZXh0LmggYi9yZW1vdGUtZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyZjliYgotLS0gL2Rldi9udWxsCisrKyBiL3JlbW90ZS1leHQuaApAQCAtMCwwICsxLDQ2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiAtIDIwMDMKKyAqIE5ldEdyb3VwLCBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gKEl0YWx5KQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKworI2lmbmRlZiBfX1JFTU9URV9FWFRfSF9fCisjZGVmaW5lIF9fUkVNT1RFX0VYVF9IX18KKworCisjaWZuZGVmIEhBVkVfUkVNT1RFCisjZXJyb3IgUGxlYXNlIGRvIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gSnVzdCBkZWZpbmUgSEFWRV9SRU1PVEUgYW5kIHRoZW4gaW5jbHVkZSBwY2FwLmgKKyNlbmRpZgorCisvKi8vIERlZmluaXRpb24gZm9yIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvICovCisjaWYgX01TQ19WRVIgPiAxMDAwCisjcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBcZmlsZSByZW1vdGUtZXh0LmgKKyAqCisgKiBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXQgdG8gaW5jbHVkZSBtb3N0IG9mIHRoZSBuZXcgZGVmaW5pdGlvbnMgdGhhdCBzaG91bGQgYmUKKyAqIHBsYWNlZCBpbnRvIHRoZSBwY2FwLmggZmlsZS4KKyAqCisgKiBJdCBpbmNsdWRlcyBhbGwgbmV3IGRlZmluaXRpb25zIChzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgbGlrZSBwY2FwX29wZW4oKS4KKyAqIFNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgbm90IHJlYWxseSBhIHJlbW90ZSBmZWF0dXJlLCBidXQsIHJpZ2h0IG5vdywKKyAqIHRoZXkgYXJlIHBsYWNlZCBoZXJlLgorICovCisKKworCisvKi8vIEFsbCB0aGlzIHN0dWZmIGlzIHB1YmxpYyAqLworLyoKKyAqIFxhZGR0b2dyb3VwIHJlbW90ZV9zdHJ1Y3QKKyAqIFx7CisgKi8KKworCisKKworLyoKKyAqIFxicmllZiBEZWZpbmVzIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIGluIHdoaWNoIGFkZHJlc3MsIHBvcnQsIGludGVyZmFjZSBuYW1lcyBhcmUga2VwdC4KKyAqCisgKiBJbiBjYXNlIHRoZSBhZGFwdGVyIG5hbWUgb3Igc3VjaCBpcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBpdCBpcyB0cnVuY2F0ZWQuCisgKiBUaGlzIGlzIG5vdCB1c2VkIGJ5IHRoZSB1c2VyOyBob3dldmVyIGl0IG11c3QgYmUgYXdhcmUgdGhhdCBhbiBob3N0bmFtZSAvIGludGVyZmFjZQorICogbmFtZSBsb25nZXIgdGhhbiB0aGlzIHZhbHVlIHdpbGwgYmUgdHJ1bmNhdGVkLgorICovCisjZGVmaW5lIFBDQVBfQlVGX1NJWkUgMTAyNAorCisKKy8qCisgKiBcYWRkdG9ncm91cCByZW1vdGVfc291cmNlX0lECisgKiBceworICovCisKKworLyoKKyAqIFxicmllZiBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiBzb3VyY2UgaW4gdXNlIChmaWxlLAorICogcmVtb3RlL2xvY2FsIGludGVyZmFjZSkuCisgKgorICogVGhpcyBpbmRpY2F0ZXMgYSBmaWxlLCBpLmUuIHRoZSB1c2VyIHdhbnQgdG8gb3BlbiBhIGNhcHR1cmUgZnJvbSBhIGxvY2FsIGZpbGUuCisgKi8KKyNkZWZpbmUgUENBUF9TUkNfRklMRSAyCisvKgorICogXGJyaWVmIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlIG9mIHNvdXJjZSBpbiB1c2UgKGZpbGUsCisgKiByZW1vdGUvbG9jYWwgaW50ZXJmYWNlKS4KKyAqCisgKiBUaGlzIGluZGljYXRlcyBhIGxvY2FsIGludGVyZmFjZSwgaS5lLiB0aGUgdXNlciB3YW50IHRvIG9wZW4gYSBjYXB0dXJlIGZyb20KKyAqIGEgbG9jYWwgaW50ZXJmYWNlLiBUaGlzIGRvZXMgbm90IGludm9sdmUgdGhlIFJQQ0FQIHByb3RvY29sLgorICovCisjZGVmaW5lIFBDQVBfU1JDX0lGTE9DQUwgMworLyoKKyAqIFxicmllZiBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBvZiBzb3VyY2UgaW4gdXNlIChmaWxlLAorICogcmVtb3RlL2xvY2FsIGludGVyZmFjZSkuCisgKgorICogVGhpcyBpbmRpY2F0ZXMgYSByZW1vdGUgaW50ZXJmYWNlLCBpLmUuIHRoZSB1c2VyIHdhbnQgdG8gb3BlbiBhIGNhcHR1cmUgZnJvbQorICogYW4gaW50ZXJmYWNlIG9uIGEgcmVtb3RlIGhvc3QuIFRoaXMgZG9lcyBpbnZvbHZlIHRoZSBSUENBUCBwcm90b2NvbC4KKyAqLworI2RlZmluZSBQQ0FQX1NSQ19JRlJFTU9URSA0CisKKy8qCisgKiBcfQorICovCisKKworCisvKiBcYWRkdG9ncm91cCByZW1vdGVfc291cmNlX3N0cmluZworICoKKyAqIFRoZSBmb3JtYXRzIGFsbG93ZWQgYnkgdGhlIHBjYXBfb3BlbigpIGFyZSB0aGUgZm9sbG93aW5nOgorICogLSBmaWxlOi8vcGF0aF9hbmRfZmlsZW5hbWUgW29wZW5zIGEgbG9jYWwgZmlsZV0KKyAqIC0gcnBjYXA6Ly9kZXZpY2VuYW1lIFtvcGVucyB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRldmljZXMgYXZhaWxhYmxlIG9uIHRoZSBsb2NhbCBob3N0LCB3aXRob3V0IHVzaW5nIHRoZSBSUENBUCBwcm90b2NvbF0KKyAqIC0gcnBjYXA6Ly9ob3N0L2RldmljZW5hbWUgW29wZW5zIHRoZSBzZWxlY3RlZCBkZXZpY2UgYXZhaWxhYmxlIG9uIGEgcmVtb3RlIGhvc3RdCisgKiAtIHJwY2FwOi8vaG9zdDpwb3J0L2RldmljZW5hbWUgW29wZW5zIHRoZSBzZWxlY3RlZCBkZXZpY2UgYXZhaWxhYmxlIG9uIGEgcmVtb3RlIGhvc3QsIHVzaW5nIGEgbm9uLXN0YW5kYXJkIHBvcnQgZm9yIFJQQ0FQXQorICogLSBhZGFwdGVybmFtZSBbdG8gb3BlbiBhIGxvY2FsIGFkYXB0ZXI7IGtlcHQgZm9yIGNvbXBhYmlsaXR5LCBidXQgaXQgaXMgc3Ryb25nbHkgZGlzY291cmFnZWRdCisgKiAtIChOVUxMKSBbdG8gb3BlbiB0aGUgZmlyc3QgbG9jYWwgYWRhcHRlcjsga2VwdCBmb3IgY29tcGFiaWxpdHksIGJ1dCBpdCBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZF0KKyAqCisgKiBUaGUgZm9ybWF0cyBhbGxvd2VkIGJ5IHRoZSBwY2FwX2ZpbmRhbGxkZXZzX2V4KCkgYXJlIHRoZSBmb2xsb3dpbmc6CisgKiAtIGZpbGU6Ly9mb2xkZXIvIFtsaXN0cyBhbGwgdGhlIGZpbGVzIGluIHRoZSBnaXZlbiBmb2xkZXJdCisgKiAtIHJwY2FwOi8vIFtsaXN0cyBhbGwgbG9jYWwgYWRhcHRlcnNdCisgKiAtIHJwY2FwOi8vaG9zdDpwb3J0LyBbbGlzdHMgdGhlIGRldmljZXMgYXZhaWxhYmxlIG9uIGEgcmVtb3RlIGhvc3RdCisgKgorICogUmVmZXJyaW5nIHRvIHRoZSAnaG9zdCcgYW5kICdwb3J0JyBwYXJhbWV0ZXJzLCB0aGV5IGNhbiBiZSBlaXRoZXIgbnVtZXJpYyBvciBsaXRlcmFsLiBTaW5jZQorICogSVB2NiBpcyBmdWxseSBzdXBwb3J0ZWQsIHRoZXNlIGFyZSB0aGUgYWxsb3dlZCBmb3JtYXRzOgorICoKKyAqIC0gaG9zdCAobGl0ZXJhbCk6IGUuZy4gaG9zdC5mb28uYmFyCisgKiAtIGhvc3QgKG51bWVyaWMgSVB2NCk6IGUuZy4gMTAuMTEuMTIuMTMKKyAqIC0gaG9zdCAobnVtZXJpYyBJUHY0LCBJUHY2IHN0eWxlKTogZS5nLiBbMTAuMTEuMTIuMTNdCisgKiAtIGhvc3QgKG51bWVyaWMgSVB2Nik6IGUuZy4gWzE6MjozOjo0XQorICogLSBwb3J0OiBjYW4gYmUgZWl0aGVyIG51bWVyaWMgKGUuZy4gJzgwJykgb3IgbGl0ZXJhbCAoZS5nLiAnaHR0cCcpCisgKgorICogSGVyZSB5b3UgZmluZCBzb21lIGFsbG93ZWQgZXhhbXBsZXM6CisgKiAtIHJwY2FwOi8vaG9zdC5mb28uYmFyL2RldmljZW5hbWUgW2V2ZXJ5dGhpbmcgbGl0ZXJhbCwgbm8gcG9ydCBudW1iZXJdCisgKiAtIHJwY2FwOi8vaG9zdC5mb28uYmFyOjEyMzQvZGV2aWNlbmFtZSBbZXZlcnl0aGluZyBsaXRlcmFsLCB3aXRoIHBvcnQgbnVtYmVyXQorICogLSBycGNhcDovLzEwLjExLjEyLjEzL2RldmljZW5hbWUgW0lQdjQgbnVtZXJpYywgbm8gcG9ydCBudW1iZXJdCisgKiAtIHJwY2FwOi8vMTAuMTEuMTIuMTM6MTIzNC9kZXZpY2VuYW1lIFtJUHY0IG51bWVyaWMsIHdpdGggcG9ydCBudW1iZXJdCisgKiAtIHJwY2FwOi8vWzEwLjExLjEyLjEzXToxMjM0L2RldmljZW5hbWUgW0lQdjQgbnVtZXJpYyB3aXRoIElQdjYgZm9ybWF0LCB3aXRoIHBvcnQgbnVtYmVyXQorICogLSBycGNhcDovL1sxOjI6Mzo6NF0vZGV2aWNlbmFtZSBbSVB2NiBudW1lcmljLCBubyBwb3J0IG51bWJlcl0KKyAqIC0gcnBjYXA6Ly9bMToyOjM6OjRdOjEyMzQvZGV2aWNlbmFtZSBbSVB2NiBudW1lcmljLCB3aXRoIHBvcnQgbnVtYmVyXQorICogLSBycGNhcDovL1sxOjI6Mzo6NF06aHR0cC9kZXZpY2VuYW1lIFtJUHY2IG51bWVyaWMsIHdpdGggbGl0ZXJhbCBwb3J0IG51bWJlcl0KKyAqCisgKiBceworICovCisKKworLyoKKyAqIFxicmllZiBTdHJpbmcgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHNvdXJjZSBpbiB1c2UgKGZpbGUsCisgKiByZW1vdGUvbG9jYWwgaW50ZXJmYWNlKS4KKyAqCisgKiBUaGlzIHN0cmluZyB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgaW50ZXJmYWNlIG5hbWUgaW4gb3JkZXIgdG8gY3JlYXRlIGEgc3RyaW5nCisgKiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gb3BlbiB0aGUgc291cmNlLgorICoKKyAqIFRoaXMgc3RyaW5nIGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHdhbnRzIHRvIG9wZW4gYSBjYXB0dXJlIGZyb20gYSBsb2NhbCBmaWxlLgorICovCisjZGVmaW5lIFBDQVBfU1JDX0ZJTEVfU1RSSU5HICJmaWxlOi8vIgorLyoKKyAqIFxicmllZiBTdHJpbmcgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHNvdXJjZSBpbiB1c2UgKGZpbGUsCisgKiByZW1vdGUvbG9jYWwgaW50ZXJmYWNlKS4KKyAqCisgKiBUaGlzIHN0cmluZyB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgaW50ZXJmYWNlIG5hbWUgaW4gb3JkZXIgdG8gY3JlYXRlIGEgc3RyaW5nCisgKiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gb3BlbiB0aGUgc291cmNlLgorICoKKyAqIFRoaXMgc3RyaW5nIGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHdhbnRzIHRvIG9wZW4gYSBjYXB0dXJlIGZyb20gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIFRoaXMgc3RyaW5nIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGludm9sdmUgdGhlIHVzZSBvZiB0aGUgUlBDQVAgcHJvdG9jb2wuIElmIHRoZQorICogaW50ZXJmYWNlIHJlcXVpcmVkIHJlc2lkZXMgb24gdGhlIGxvY2FsIGhvc3QsIHRoZSBSUENBUCBwcm90b2NvbCBpcyBub3QgaW52b2x2ZWQKKyAqIGFuZCB0aGUgbG9jYWwgZnVuY3Rpb25zIGFyZSB1c2VkLgorICovCisjZGVmaW5lIFBDQVBfU1JDX0lGX1NUUklORyAicnBjYXA6Ly8iCisKKy8qCisgKiBcfQorICovCisKKworCisKKworLyoKKyAqIFxhZGR0b2dyb3VwIHJlbW90ZV9vcGVuX2ZsYWdzCisgKiBceworICovCisKKy8qCisgKiBcYnJpZWYgRGVmaW5lcyBpZiB0aGUgYWRhcHRlciBoYXMgdG8gZ28gaW4gcHJvbWlzY3VvdXMgbW9kZS4KKyAqCisgKiBJdCBpcyAnMScgaWYgeW91IGhhdmUgdG8gb3BlbiB0aGUgYWRhcHRlciBpbiBwcm9taXNjdW91cyBtb2RlLCAnMCcgb3RoZXJ3aXNlLgorICogTm90ZSB0aGF0IGV2ZW4gaWYgdGhpcyBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZSBpbnRlcmZhY2UgY291bGQgd2VsbCBiZSBpbiBwcm9taXNjdW91cworICogbW9kZSBmb3Igc29tZSBvdGhlciByZWFzb24gKGZvciBleGFtcGxlIGJlY2F1c2UgYW5vdGhlciBjYXB0dXJlIHByb2Nlc3Mgd2l0aAorICogcHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkIGlzIGN1cnJlbnRseSB1c2luZyB0aGF0IGludGVyZmFjZSkuCisgKiBPbiBvbiBMaW51eCBzeXN0ZW1zIHdpdGggMi4yIG9yIGxhdGVyIGtlcm5lbHMgKHRoYXQgaGF2ZSB0aGUgImFueSIgZGV2aWNlKSwgdGhpcworICogZmxhZyBkb2VzIG5vdCB3b3JrIG9uIHRoZSAiYW55IiBkZXZpY2U7IGlmIGFuIGFyZ3VtZW50IG9mICJhbnkiIGlzIHN1cHBsaWVkLAorICogdGhlICdwcm9taXNjJyBmbGFnIGlzIGlnbm9yZWQuCisgKi8KKyNkZWZpbmUgUENBUF9PUEVORkxBR19QUk9NSVNDVU9VUwkJMQorCisvKgorICogXGJyaWVmIERlZmluZXMgaWYgdGhlIGRhdGEgdHJhbnNmZXIgKGluIGNhc2Ugb2YgYSByZW1vdGUKKyAqIGNhcHR1cmUpIGhhcyB0byBiZSBkb25lIHdpdGggVURQIHByb3RvY29sLgorICoKKyAqIElmIGl0IGlzICcxJyBpZiB5b3Ugd2FudCBhIFVEUCBkYXRhIGNvbm5lY3Rpb24sICcwJyBpZiB5b3Ugd2FudAorICogYSBUQ1AgZGF0YSBjb25uZWN0aW9uOyBjb250cm9sIGNvbm5lY3Rpb24gaXMgYWx3YXlzIFRDUC1iYXNlZC4KKyAqIEEgVURQIGNvbm5lY3Rpb24gaXMgbXVjaCBsaWdodGVyLCBidXQgaXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgYWxsCisgKiB0aGUgY2FwdHVyZWQgcGFja2V0cyBhcnJpdmUgdG8gdGhlIGNsaWVudCB3b3Jrc3RhdGlvbi4gTW9yZW92ZXIsCisgKiBpdCBjb3VsZCBiZSBoYXJtZnVsIGluIGNhc2Ugb2YgbmV0d29yayBjb25nZXN0aW9uLgorICogVGhpcyBmbGFnIGlzIG1lYW5pbmdsZXNzIGlmIHRoZSBzb3VyY2UgaXMgbm90IGEgcmVtb3RlIGludGVyZmFjZS4KKyAqIEluIHRoYXQgY2FzZSwgaXQgaXMgc2ltcGx5IGlnbm9yZWQuCisgKi8KKyNkZWZpbmUgUENBUF9PUEVORkxBR19EQVRBVFhfVURQCQkJMgorCisKKy8qCisgKiBcYnJpZWYgRGVmaW5lcyBpZiB0aGUgcmVtb3RlIHByb2JlIHdpbGwgY2FwdHVyZSBpdHMgb3duIGdlbmVyYXRlZCB0cmFmZmljLgorICoKKyAqIEluIGNhc2UgdGhlIHJlbW90ZSBwcm9iZSB1c2VzIHRoZSBzYW1lIGludGVyZmFjZSB0byBjYXB0dXJlIHRyYWZmaWMgYW5kIHRvIHNlbmQKKyAqIGRhdGEgYmFjayB0byB0aGUgY2FsbGVyLCB0aGUgY2FwdHVyZWQgdHJhZmZpYyBpbmNsdWRlcyB0aGUgUlBDQVAgdHJhZmZpYyBhcyB3ZWxsLgorICogSWYgdGhpcyBmbGFnIGlzIHR1cm5lZCBvbiwgdGhlIFJQQ0FQIHRyYWZmaWMgaXMgZXhjbHVkZWQgZnJvbSB0aGUgY2FwdHVyZSwgc28gdGhhdAorICogdGhlIHRyYWNlIHJldHVybmVkIGJhY2sgdG8gdGhlIGNvbGxlY3RvciBpcyBkb2VzIG5vdCBpbmNsdWRlIHRoaXMgdHJhZmZpYy4KKyAqLworI2RlZmluZSBQQ0FQX09QRU5GTEFHX05PQ0FQVFVSRV9SUENBUAk0CisKKy8qCisgKiBcYnJpZWYgRGVmaW5lcyBpZiB0aGUgbG9jYWwgYWRhcHRlciB3aWxsIGNhcHR1cmUgaXRzIG93biBnZW5lcmF0ZWQgdHJhZmZpYy4KKyAqCisgKiBUaGlzIGZsYWcgdGVsbHMgdGhlIHVuZGVybHlpbmcgY2FwdHVyZSBkcml2ZXIgdG8gZHJvcCB0aGUgcGFja2V0cyB0aGF0IHdlcmUgc2VudCBieSBpdHNlbGYuCisgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGFwcGxpY2F0aW9ucyBsaWtlIGJyaWRnZXMsIHRoYXQgc2hvdWxkIGlnbm9yZSB0aGUgdHJhZmZpYworICogdGhleSBqdXN0IHNlbnQuCisgKi8KKyNkZWZpbmUgUENBUF9PUEVORkxBR19OT0NBUFRVUkVfTE9DQUwJOAorCisvKgorICogXGJyaWVmIFRoaXMgZmxhZyBjb25maWd1cmVzIHRoZSBhZGFwdGVyIGZvciBtYXhpbXVtIHJlc3BvbnNpdmVuZXNzLgorICoKKyAqIEluIHByZXNlbmNlIG9mIGEgbGFyZ2UgdmFsdWUgZm9yIG5ieXRlcywgV2luUGNhcCB3YWl0cyBmb3IgdGhlIGFycml2YWwgb2Ygc2V2ZXJhbCBwYWNrZXRzIGJlZm9yZQorICogY29weWluZyB0aGUgZGF0YSB0byB0aGUgdXNlci4gVGhpcyBndWFyYW50ZWVzIGEgbG93IG51bWJlciBvZiBzeXN0ZW0gY2FsbHMsIGkuZS4gbG93ZXIgcHJvY2Vzc29yIHVzYWdlLAorICogaS5lLiBiZXR0ZXIgcGVyZm9ybWFuY2UsIHdoaWNoIGlzIGdvb2QgZm9yIGFwcGxpY2F0aW9ucyBsaWtlIHNuaWZmZXJzLiBJZiB0aGUgdXNlciBzZXRzIHRoZQorICogUENBUF9PUEVORkxBR19NQVhfUkVTUE9OU0lWRU5FU1MgZmxhZywgdGhlIGNhcHR1cmUgZHJpdmVyIHdpbGwgY29weSB0aGUgcGFja2V0cyBhcyBzb29uIGFzIHRoZSBhcHBsaWNhdGlvbgorICogaXMgcmVhZHkgdG8gcmVjZWl2ZSB0aGVtLiBUaGlzIGlzIHN1Z2dlc3RlZCBmb3IgcmVhbCB0aW1lIGFwcGxpY2F0aW9ucyAobGlrZSwgZm9yIGV4YW1wbGUsIGEgYnJpZGdlKQorICogdGhhdCBuZWVkIHRoZSBiZXN0IHJlc3BvbnNpdmVuZXNzLgorICovCisjZGVmaW5lIFBDQVBfT1BFTkZMQUdfTUFYX1JFU1BPTlNJVkVORVNTCTE2CisKKy8qCisgKiBcfQorICovCisKKworLyoKKyAqIFxhZGR0b2dyb3VwIHJlbW90ZV9zYW1wX21ldGhvZHMKKyAqIFx7CisgKi8KKworLyoKKyAqXGJyaWVmIE5vIHNhbXBsaW5nIGhhcyB0byBiZSBkb25lIG9uIHRoZSBjdXJyZW50IGNhcHR1cmUuCisgKgorICogSW4gdGhpcyBjYXNlLCBubyBzYW1wbGluZyBhbGdvcml0aG1zIGFyZSBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IGNhcHR1cmUuCisgKi8KKyNkZWZpbmUgUENBUF9TQU1QX05PU0FNUAkwCisKKy8qCisgKiBcYnJpZWYgSXQgZGVmaW5lcyB0aGF0IG9ubHkgMSBvdXQgb2YgTiBwYWNrZXRzIG11c3QgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIuCisgKgorICogSW4gdGhpcyBjYXNlLCB0aGUgJ3ZhbHVlJyBmaWVsZCBvZiB0aGUgJ3BjYXBfc2FtcCcgc3RydWN0dXJlIGluZGljYXRlcyB0aGUKKyAqIG51bWJlciBvZiBwYWNrZXRzIChtaW51cyAxKSB0aGF0IG11c3QgYmUgZGlzY2FyZGVkIGJlZm9yZSBvbmUgcGFja2V0IGdvdCBhY2NlcHRlZC4KKyAqIEluIG90aGVyIHdvcmRzLCBpZiAndmFsdWUgPSAxMCcsIHRoZSBmaXJzdCBwYWNrZXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgd2hpbGUKKyAqIHRoZSBmb2xsb3dpbmcgOSBhcmUgZGlzY2FyZGVkLgorICovCisjZGVmaW5lIFBDQVBfU0FNUF8xX0VWRVJZX04JMQorCisvKgorICogXGJyaWVmIEl0IGRlZmluZXMgdGhhdCB3ZSBoYXZlIHRvIHJldHVybiAxIHBhY2tldCBldmVyeSBOIG1pbGxpc2Vjb25kcy4KKyAqCisgKiBJbiB0aGlzIGNhc2UsIHRoZSAndmFsdWUnIGZpZWxkIG9mIHRoZSAncGNhcF9zYW1wJyBzdHJ1Y3R1cmUgaW5kaWNhdGVzIHRoZSAnd2FpdGluZworICogdGltZScgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBvbmUgcGFja2V0IGdvdCBhY2NlcHRlZC4KKyAqIEluIG90aGVyIHdvcmRzLCBpZiAndmFsdWUgPSAxMCcsIHRoZSBmaXJzdCBwYWNrZXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlcjsgdGhlIG5leHQKKyAqIHJldHVybmVkIG9uZSB3aWxsIGJlIHRoZSBmaXJzdCBwYWNrZXQgdGhhdCBhcnJpdmVzIHdoZW4gMTBtcyBoYXZlIGVsYXBzZWQuCisgKi8KKyNkZWZpbmUgUENBUF9TQU1QX0ZJUlNUX0FGVEVSX05fTVMgMgorCisvKgorICogXH0KKyAqLworCisKKy8qCisgKiBcYWRkdG9ncm91cCByZW1vdGVfYXV0aF9tZXRob2RzCisgKiBceworICovCisKKy8qCisgKiBcYnJpZWYgSXQgZGVmaW5lcyB0aGUgTlVMTCBhdXRoZW50aWNhdGlvbi4KKyAqCisgKiBUaGlzIHZhbHVlIGhhcyB0byBiZSB1c2VkIHdpdGhpbiB0aGUgJ3R5cGUnIG1lbWJlciBvZiB0aGUgcGNhcF9ybXRhdXRoIHN0cnVjdHVyZS4KKyAqIFRoZSAnTlVMTCcgYXV0aGVudGljYXRpb24gaGFzIHRvIGJlIGVxdWFsIHRvICd6ZXJvJywgc28gdGhhdCBvbGQgYXBwbGljYXRpb25zCisgKiBjYW4ganVzdCBwdXQgZXZlcnkgZmllbGQgb2Ygc3RydWN0IHBjYXBfcm10YXV0aCB0byB6ZXJvLCBhbmQgaXQgZG9lcyB3b3JrLgorICovCisjZGVmaW5lIFJQQ0FQX1JNVEFVVEhfTlVMTCAwCisvKgorICogXGJyaWVmIEl0IGRlZmluZXMgdGhlIHVzZXJuYW1lL3Bhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLgorICoKKyAqIFdpdGggdGhpcyB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uLCB0aGUgUlBDQVAgcHJvdG9jb2wgd2lsbCB1c2UgdGhlIHVzZXJuYW1lLworICogcGFzc3dvcmQgcHJvdmlkZWQgdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyIG9uIHRoZSByZW1vdGUgbWFjaGluZS4gSWYgdGhlCisgKiBhdXRoZW50aWNhdGlvbiBpcyBzdWNjZXNzZnVsIChhbmQgdGhlIHVzZXIgaGFzIHRoZSByaWdodCB0byBvcGVuIG5ldHdvcmsgZGV2aWNlcykKKyAqIHRoZSBSUENBUCBjb25uZWN0aW9uIHdpbGwgY29udGludWU7IG90aGVyd2lzZSBpdCB3aWxsIGJlIGRyb3BwZWQuCisgKgorICogVGhpcyB2YWx1ZSBoYXMgdG8gYmUgdXNlZCB3aXRoaW4gdGhlICd0eXBlJyBtZW1iZXIgb2YgdGhlIHBjYXBfcm10YXV0aCBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgUlBDQVBfUk1UQVVUSF9QV0QgMQorCisvKgorICogXH0KKyAqLworCisKKworCisvKgorICogXGJyaWVmIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYXV0aGV0aWNhdGUKKyAqIHRoZSB1c2VyIG9uIGEgcmVtb3RlIG1hY2hpbmUuCisgKgorICogVGhlIHJlbW90ZSBtYWNoaW5lIGNhbiBlaXRoZXIgZ3JhbnQgb3IgcmVmdXNlIHRoZSBhY2Nlc3MgYWNjb3JkaW5nCisgKiB0byB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQuCisgKiBJbiBjYXNlIHRoZSBOVUxMIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLCBib3RoICd1c2VybmFtZScgYW5kCisgKiAncGFzc3dvcmQnIGNhbiBiZSBOVUxMIHBvaW50ZXJzLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIG1lYW5pbmdsZXNzIGlmIHRoZSBzb3VyY2UgaXMgbm90IGEgcmVtb3RlIGludGVyZmFjZTsKKyAqIGluIHRoYXQgY2FzZSwgdGhlIGZ1bmN0aW9ucyB3aGljaCByZXF1aXJlcyBzdWNoIGEgc3RydWN0dXJlIGNhbiBhY2NlcHQKKyAqIGEgTlVMTCBwb2ludGVyIGFzIHdlbGwuCisgKi8KK3N0cnVjdCBwY2FwX3JtdGF1dGgKK3sKKwkvKgorCSAqIFxicmllZiBUeXBlIG9mIHRoZSBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4KKwkgKgorCSAqIEluIG9yZGVyIHRvIHByb3ZpZGUgbWF4aW11bSBmbGV4aWJpbGl0eSwgd2UgY2FuIHN1cHBvcnQgZGlmZmVyZW50IHR5cGVzCisJICogb2YgYXV0aGVudGljYXRpb24gYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoaXMgJ3R5cGUnIHZhcmlhYmxlLiBUaGUgY3VycmVudGx5CisJICogc3VwcG9ydGVkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgYXJlIGRlZmluZWQgaW50byB0aGUKKwkgKiBcbGluayByZW1vdGVfYXV0aF9tZXRob2RzIFJlbW90ZSBBdXRoZW50aWNhdGlvbiBNZXRob2RzIFNlY3Rpb25cZW5kbGluay4KKwkgKi8KKwlpbnQgdHlwZTsKKwkvKgorCSAqIFxicmllZiBaZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lIHRoYXQgaGFzIHRvIGJlCisJICogdXNlZCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUgZm9yIGF1dGhlbnRpY2F0aW9uLgorCSAqCisJICogVGhpcyBmaWVsZCBpcyBtZWFuaW5nbGVzcyBpbiBjYXNlIG9mIHRoZSBSUENBUF9STVRBVVRIX05VTEwgYXV0aGVudGljYXRpb24KKwkgKiBhbmQgaXQgY2FuIGJlIE5VTEwuCisJICovCisJY2hhciAqdXNlcm5hbWU7CisJLyoKKwkgKiBcYnJpZWYgWmVyby10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIHRoZSBwYXNzd29yZCB0aGF0IGhhcyB0byBiZQorCSAqIHVzZWQgb24gdGhlIHJlbW90ZSBtYWNoaW5lIGZvciBhdXRoZW50aWNhdGlvbi4KKwkgKgorCSAqIFRoaXMgZmllbGQgaXMgbWVhbmluZ2xlc3MgaW4gY2FzZSBvZiB0aGUgUlBDQVBfUk1UQVVUSF9OVUxMIGF1dGhlbnRpY2F0aW9uCisJICogYW5kIGl0IGNhbiBiZSBOVUxMLgorCSAqLworCWNoYXIgKnBhc3N3b3JkOworfTsKKworCisvKgorICogXGJyaWVmIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gc2FtcGxpbmcuCisgKgorICogSW4gY2FzZSB0aGUgc2FtcGxpbmcgaXMgcmVxdWVzdGVkLCB0aGUgY2FwdHVyaW5nIGRldmljZSBzaG91bGQgcmVhZAorICogb25seSBhIHN1YnNldCBvZiB0aGUgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgc291cmNlLiBUaGUgcmV0dXJuZWQgcGFja2V0cyBkZXBlbmQKKyAqIG9uIHRoZSBzYW1wbGluZyBwYXJhbWV0ZXJzLgorICoKKyAqIFx3YXJuaW5nIFRoZSBzYW1wbGluZyBwcm9jZXNzIGlzIGFwcGxpZWQgPHN0cm9uZz5hZnRlcjwvc3Ryb25nPiB0aGUgZmlsdGVyaW5nIHByb2Nlc3MuCisgKiBJbiBvdGhlciB3b3JkcywgcGFja2V0cyBhcmUgZmlsdGVyZWQgZmlyc3QsIHRoZW4gdGhlIHNhbXBsaW5nIHByb2Nlc3Mgc2VsZWN0cyBhCisgKiBzdWJzZXQgb2YgdGhlICdmaWx0ZXJlZCcgcGFja2V0cyBhbmQgaXQgcmV0dXJucyB0aGVtIHRvIHRoZSBjYWxsZXIuCisgKi8KK3N0cnVjdCBwY2FwX3NhbXAKK3sKKwkvKgorCSAqIE1ldGhvZCB1c2VkIGZvciBzYW1wbGluZy4gQ3VycmVudGx5LCB0aGUgc3VwcG9ydGVkIG1ldGhvZHMgYXJlIGxpc3RlZCBpbiB0aGUKKwkgKiBcbGluayByZW1vdGVfc2FtcF9tZXRob2RzIFNhbXBsaW5nIE1ldGhvZHMgU2VjdGlvblxlbmRsaW5rLgorCSAqLworCWludCBtZXRob2Q7CisKKwkvKgorCSAqIFRoaXMgdmFsdWUgZGVwZW5kcyBvbiB0aGUgc2FtcGxpbmcgbWV0aG9kIGRlZmluZWQuIEZvciBpdHMgbWVhbmluZywgcGxlYXNlIGNoZWNrCisJICogYXQgdGhlIFxsaW5rIHJlbW90ZV9zYW1wX21ldGhvZHMgU2FtcGxpbmcgTWV0aG9kcyBTZWN0aW9uXGVuZGxpbmsuCisJICovCisJaW50IHZhbHVlOworfTsKKworCisKKworLy8gTWF4aW11bSBsZW5ndGggb2YgYW4gaG9zdCBuYW1lIChuZWVkZWQgZm9yIHRoZSBSUENBUCBhY3RpdmUgbW9kZSkKKyNkZWZpbmUgUlBDQVBfSE9TVExJU1RfU0laRSAxMDI0CisKKworLyoKKyAqIFx9CisgKi8gLy8gZW5kIG9mIHB1YmxpYyBkb2N1bWVudGF0aW9uCisKKworLy8gRXhwb3J0ZWQgZnVuY3Rpb25zCisKKworCisvKgorICogXG5hbWUgTmV3IFdpblBjYXAgZnVuY3Rpb25zCisgKgorICogVGhpcyBzZWN0aW9uIGxpc3RzIHRoZSBuZXcgZnVuY3Rpb25zIHRoYXQgYXJlIGFibGUgdG8gaGVscCBjb25zaWRlcmFibHkgaW4gd3JpdGluZworICogV2luUGNhcCBwcm9ncmFtcyBiZWNhdXNlIG9mIHRoZWlyIGVhc2luZXNzIG9mIHVzZS4KKyAqLworLy8gXHsKK1BDQVBfQVBJIHBjYXBfdCAqcGNhcF9vcGVuKGNvbnN0IGNoYXIgKnNvdXJjZSwgaW50IHNuYXBsZW4sIGludCBmbGFncywgaW50IHJlYWRfdGltZW91dCwgc3RydWN0IHBjYXBfcm10YXV0aCAqYXV0aCwgY2hhciAqZXJyYnVmKTsKK1BDQVBfQVBJIGludCBwY2FwX2NyZWF0ZXNyY3N0cihjaGFyICpzb3VyY2UsIGludCB0eXBlLCBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpwb3J0LCBjb25zdCBjaGFyICpuYW1lLCBjaGFyICplcnJidWYpOworUENBUF9BUEkgaW50IHBjYXBfcGFyc2VzcmNzdHIoY29uc3QgY2hhciAqc291cmNlLCBpbnQgKnR5cGUsIGNoYXIgKmhvc3QsIGNoYXIgKnBvcnQsIGNoYXIgKm5hbWUsIGNoYXIgKmVycmJ1Zik7CitQQ0FQX0FQSSBpbnQgcGNhcF9maW5kYWxsZGV2c19leChjaGFyICpzb3VyY2UsIHN0cnVjdCBwY2FwX3JtdGF1dGggKmF1dGgsIHBjYXBfaWZfdCAqKmFsbGRldnMsIGNoYXIgKmVycmJ1Zik7CitQQ0FQX0FQSSBzdHJ1Y3QgcGNhcF9zYW1wICpwY2FwX3NldHNhbXBsaW5nKHBjYXBfdCAqcCk7CisKKy8vIFx9CisvLyBFbmQgb2YgbmV3IFdpblBjYXAgZnVuY3Rpb25zCisKKy8qCisgKiBcbmFtZSBSZW1vdGUgQ2FwdHVyZSBmdW5jdGlvbnMKKyAqLworCisvKgorICogU29tZSBtaW5vciBkaWZmZXJlbmNlcyBiZXR3ZWVuIFVOKlggc29ja2V0cyBhbmQgYW5kIFdpbnNvY2sgc29ja2V0cy4KKyAqLworI2lmbmRlZiBfV0lOMzIKKyAgLyohCisgICAqIFxicmllZiBJbiBXaW5zb2NrLCBhIHNvY2tldCBoYW5kbGUgaXMgb2YgdHlwZSBTT0NLRVQ7IGluIFVOKlgsIGl0J3MKKyAgICogYSBmaWxlIGRlc2NyaXB0b3IsIGFuZCB0aGVyZWZvcmUgYSBzaWduZWQgaW50ZWdlci4KKyAgICogV2UgZGVmaW5lIFNPQ0tFVCB0byBiZSBhIHNpZ25lZCBpbnRlZ2VyIG9uIFVOKlgsIHNvIHRoYXQgaXQgY2FuCisgICAqIGJlIHVzZWQgb24gYm90aCBwbGF0Zm9ybXMuCisgICAqLworICAjZGVmaW5lIFNPQ0tFVCBpbnQKKworICAvKiEKKyAgICogXGJyaWVmIEluIFdpbnNvY2ssIHRoZSBlcnJvciByZXR1cm4gaWYgc29ja2V0KCkgZmFpbHMgaXMgSU5WQUxJRF9TT0NLRVQ7CisgICAqIGluIFVOKlgsIGl0J3MgLTEuCisgICAqIFdlIGRlZmluZSBJTlZBTElEX1NPQ0tFVCB0byBiZSAtMSBvbiBVTipYLCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIG9uCisgICAqIGJvdGggcGxhdGZvcm1zLgorICAgKi8KKyAgI2RlZmluZSBJTlZBTElEX1NPQ0tFVCAtMQorI2VuZGlmCisKKy8vIFx7CitQQ0FQX0FQSSBTT0NLRVQgcGNhcF9yZW1vdGVhY3RfYWNjZXB0KGNvbnN0IGNoYXIgKmFkZHJlc3MsIGNvbnN0IGNoYXIgKnBvcnQsIGNvbnN0IGNoYXIgKmhvc3RsaXN0LCBjaGFyICpjb25uZWN0aW5naG9zdCwgc3RydWN0IHBjYXBfcm10YXV0aCAqYXV0aCwgY2hhciAqZXJyYnVmKTsKK1BDQVBfQVBJIGludCBwY2FwX3JlbW90ZWFjdF9saXN0KGNoYXIgKmhvc3RsaXN0LCBjaGFyIHNlcCwgaW50IHNpemUsIGNoYXIgKmVycmJ1Zik7CitQQ0FQX0FQSSBpbnQgcGNhcF9yZW1vdGVhY3RfY2xvc2UoY29uc3QgY2hhciAqaG9zdCwgY2hhciAqZXJyYnVmKTsKK1BDQVBfQVBJIHZvaWQgcGNhcF9yZW1vdGVhY3RfY2xlYW51cCgpOworLy8gXH0KKy8vIEVuZCBvZiByZW1vdGUgY2FwdHVyZSBmdW5jdGlvbnMKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvcnVubGV4LnNoIGIvcnVubGV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNmI4YmQ0Li4wMDAwMDAwCi0tLSBhL3J1bmxleC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0jISAvYmluL3NoCi0KLSMKLSMgcnVubGV4LnNoCi0jIFNjcmlwdCB0byBydW4gTGV4L0ZsZXguCi0jIEZpcnN0IGFyZ3VtZW50IGlzIHRoZSAocXVvdGVkKSBuYW1lIG9mIHRoZSBjb21tYW5kOyBpZiBpdCdzIG51bGwsIHRoYXQKLSMgbWVhbnMgdGhhdCBuZWl0aGVyIEZsZXggbm9yIExleCB3YXMgZm91bmQsIHNvIHdlIHJlcG9ydCBhbiBlcnJvciBhbmQKLSMgcXVpdC4KLSMKLQotIwotIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgdG8gcnVuLCBhbmQgdGhlbiBzaGlmdCB0byBnZXQgdGhlIGFyZ3VtZW50cy4KLSMKLWlmIFsgJCMgLWVxIDAgXQotdGhlbgotCWVjaG8gIlVzYWdlOiBydW5sZXggPGxleC9mbGV4IGNvbW1hbmQgdG8gcnVuPiBbIGFyZ3VtZW50cyBdIiAxPiYyCi0JZXhpdCAxCi1maQotTEVYPSIkMSIKLXNoaWZ0Ci0KLSMKLSMgQ2hlY2sgd2hldGhlciB3ZSBoYXZlIExleCBvciBGbGV4LgotIwotaWYgWyAteiAiJHtMRVh9IiBdCi10aGVuCi0JZWNobyAiTmVpdGhlciBsZXggbm9yIGZsZXggd2FzIGZvdW5kIiAxPiYyCi0JZXhpdCAxCi1maQotCi0jCi0jIFByb2Nlc3MgdGhlIGZsYWdzLiAgV2UgZG9uJ3QgdXNlIGdldG9wdCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8KLSMgZW1iZWQgY29tcGxldGUga25vd2xlZGdlIG9mIHdoYXQgb3B0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IExleC9GbGV4LgotIwotZmxhZ3M9IiIKLW91dGZpbGU9bGV4Lnl5LmMKLXdoaWxlIFsgJCMgLW5lIDAgXQotZG8KLQljYXNlICIkMSIgaW4KLQotCS1vKikKLQkJIwotCQkjIFNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KLQkJIwotCQlvdXRmaWxlPWBlY2hvICIkMSIgfCBzZWQgJ3MvLW9cKC4qXCkvXDEvJ2AKLQkJOzsKLQotCS0qKQotCQkjCi0JCSMgQWRkIHRoaXMgdG8gdGhlIGxpc3Qgb2YgZmxhZ3MuCi0JCSMKLQkJZmxhZ3M9IiRmbGFncyAkMSIKLQkJOzsKLQotCS0tfCopCi0JCSMKLQkJIyBFbmQgb2YgZmxhZ3MuCi0JCSMKLQkJYnJlYWsKLQkJOzsKLQllc2FjCi0Jc2hpZnQKLWRvbmUKLQotIwotIyBJcyBpdCBMZXgsIG9yIGlzIGl0IEZsZXg/Ci0jCi1pZiBbICIke0xFWH0iID0gZmxleCBdCi10aGVuCi0JIwotCSMgSXQncyBGbGV4LgotCSMKLQloYXZlX2ZsZXg9eWVzCi0KLQkjCi0JIyBEb2VzIGl0IHN1cHBvcnQgdGhlIC0tbm9GVU5DVElPTiBvcHRpb25zPyAgSWYgc28sIHdlIHBhc3MKLQkjIC0tbm91bnB1dCwgYXMgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UKLQkjIG9wdGlvbnMgZG9uJ3Qgc3VwcG9ydCBkaXNhYmxpbmcgeXl1bnB1dCBieSBkZWZpbmluZwotCSMgWVlfTk9fVU5QVVQuCi0JIwotCWlmIGZsZXggLS1oZWxwIHwgZWdyZXAgbm9GVU5DVElPTiA+L2Rldi9udWxsCi0JdGhlbgotCQlmbGFncz0iJGZsYWdzIC0tbm91bnB1dCIKLQotCQkjCi0JCSMgRG9lcyBpdCBzdXBwb3J0IC1SLCBmb3IgZ2VuZXJhdGluZyByZWVudHJhbnQgc2Nhbm5lcnM/Ci0JCSMgSWYgc28sIHdlJ3JlIG5vdCBjdXJyZW50bHkgdXNpbmcgdGhhdCBmZWF0dXJlLCBidXQKLQkJIyBpdCdsbCBnZW5lcmF0ZSBzb21lIHVudXNlZCBmdW5jdGlvbnMgYW55d2F5IC0gYW5kIHRoZXJlCi0JCSMgd29uJ3QgYmUgYW55IGhlYWRlciBmaWxlIGRlY2xhcmluZyB0aGVtLCBzbyB0aGVyZSdsbCBiZQotCQkjIGRlZmluZWQtYnV0LW5vdC1kZWNsYXJlZCB3YXJuaW5ncy4gIFRoZXJlZm9yZSwgd2UgdXNlCi0JCSMgLS1ub0ZVTkNUSU9OIG9wdGlvbnMgdG8gc3VwcHJlc3MgZ2VuZXJhdGluZyB0aG9zZQotCQkjIGZ1bmN0aW9ucy4KLQkJIwotCQlpZiBmbGV4IC0taGVscCB8IGVncmVwIHJlZW50cmFudCA+L2Rldi9udWxsCi0JCXRoZW4KLQkJCWZsYWdzPSIkZmxhZ3MgLS1ub3l5Z2V0X2xpbmVubyAtLW5veXlnZXRfaW4gLS1ub3l5Z2V0X291dCAtLW5veXlnZXRfbGVuZyAtLW5veXlnZXRfdGV4dCAtLW5veXlzZXRfbGluZW5vIC0tbm95eXNldF9pbiAtLW5veXlzZXRfb3V0IgotCQlmaQotCWZpCi1lbHNlCi0JIwotCSMgSXQncyBMZXguCi0JIwotCWhhdmVfZmxleD1ubwotZmkKLQotIwotIyBPSywgcnVuIGl0LgotIyBJZiBpdCdzIGxleCwgaXQgZG9lc24ndCBzdXBwb3J0IC1vLCBzbyB3ZSBqdXN0IHdyaXRlIHRvCi0jIGxleC55eS5jIGFuZCwgaWYgaXQgc3VjY2VlZHMsIHJlbmFtZSBpdCB0byB0aGUgcmlnaHQgbmFtZSwKLSMgb3RoZXJ3aXNlIHdlIHJlbW92ZSBsZXgueXkuYy4KLSMgSWYgaXQncyBmbGV4LCBpdCBzdXBwb3J0cyAtbywgc28gd2UgdXNlIHRoYXQgLSBmbGV4IHdpdGggLVAgZG9lc24ndAotIyB3cml0ZSB0byBsZXgueXkuYywgaXQgd3JpdGVzIHRvIGEgbGV4LntwcmVmaXggZnJvbSAtUH0uYy4KLSMKLWlmIFsgJGhhdmVfZmxleCA9IHllcyBdCi10aGVuCi0JJHtMRVh9ICRmbGFncyAtbyIkb3V0ZmlsZSIgIiRAIgotCi0JIwotCSMgRGlkIGl0IHN1Y2NlZWQ/Ci0JIwotCXN0YXR1cz0kPwotCWlmIFsgJHN0YXR1cyAtbmUgMCBdCi0JdGhlbgotCQkjCi0JCSMgTm8uICBFeGl0IHdpdGggdGhlIGZhaWxpbmcgZXhpdCBzdGF0dXMuCi0JCSMKLQkJZXhpdCAkc3RhdHVzCi0JZmkKLQotCSMKLQkjIEZsZXggaGFzIHRoZSBhbm5veWluZyBoYWJpdCBvZiBzdHJpcHBpbmcgYWxsIGJ1dCB0aGUgbGFzdAotCSMgY29tcG9uZW50IG9mIHRoZSAiLW8iIGZsYWcgYXJndW1lbnQgYW5kIHVzaW5nIHRoYXQgYXMgdGhlCi0JIyBwbGFjZSB0byBwdXQgdGhlIG91dHB1dC4gIFRoaXMgZ2V0cyBpbiB0aGUgd2F5IG9mIGJ1aWxkaW5nCi0JIyBpbiBhIGRpcmVjdG9yeSBkaWZmZXJlbnQgZnJvbSB0aGUgc291cmNlIGRpcmVjdG9yeS4gIFRyeQotCSMgdG8gd29yayBhcm91bmQgdGhpcy4KLQkjCi0JIyBJcyB0aGUgb3V0ZmlsZSB3aGVyZSB3ZSB0aGluayBpdCBpcz8KLQkjCi0Jb3V0ZmlsZV9iYXNlPWBiYXNlbmFtZSAiJG91dGZpbGUiYAotCWlmIFsgIiRvdXRmaWxlX2Jhc2UiICE9ICIkb3V0ZmlsZSIgLWEgXCggISAtciAiJG91dGZpbGUiIFwpIC1hIC1yICIkb3V0ZmlsZV9iYXNlIiBdCi0JdGhlbgotCQkjCi0JCSMgTm8sIGl0J3Mgbm90LCBidXQgaXQgaXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgUHV0IGl0Ci0JCSMgd2hlcmUgaXQncyBzdXBwb3NlZCB0byBiZS4KLQkJIwotCQltdiAiJG91dGZpbGVfYmFzZSIgIiRvdXRmaWxlIgotCi0JCSMKLQkJIyBEaWQgdGhhdCBzdWNjZWVkPwotCQkjCi0JCXN0YXR1cz0kPwotCQlpZiBbICRzdGF0dXMgLW5lIDAgXQotCQl0aGVuCi0JCQkjCi0JCQkjIE5vLiAgRXhpdCB3aXRoIHRoZSBmYWlsaW5nIGV4aXQgc3RhdHVzLgotCQkJIwotCQkJZXhpdCAkc3RhdHVzCi0JCWZpCi0JZmkKLWVsc2UKLQkke0xFWH0gJGZsYWdzICIkQCIKLQotCSMKLQkjIERpZCBpdCBzdWNjZWVkPwotCSMKLQlzdGF0dXM9JD8KLQlpZiBbICRzdGF0dXMgLW5lIDAgXQotCXRoZW4KLQkJIwotCQkjIE5vLiAgR2V0IHJpZCBvZiBhbnkgbGV4Lnl5LmMgZmlsZSB3ZSBnZW5lcmF0ZWQsIGFuZAotCQkjIGV4aXQgd2l0aCB0aGUgZmFpbGluZyBleGl0IHN0YXR1cy4KLQkJIwotCQlybSAtZiBsZXgueXkuYwotCQlleGl0ICRzdGF0dXMKLQlmaQotCi0JIwotCSMgT0ssIHJlbmFtZSBsZXgueXkuYyB0byB0aGUgcmlnaHQgb3V0cHV0IGZpbGUuCi0JIwotCW12IGxleC55eS5jICIkb3V0ZmlsZSIKLQotCSMKLQkjIERpZCB0aGF0IHN1Y2NlZWQ/Ci0JIwotCXN0YXR1cz0kPwotCWlmIFsgJHN0YXR1cyAtbmUgMCBdCi0JdGhlbgotCQkjCi0JCSMgTm8uICBHZXQgcmlkIG9mIGFueSBsZXgueXkuYyBmaWxlIHdlIGdlbmVyYXRlZCwgYW5kCi0JCSMgZXhpdCB3aXRoIHRoZSBmYWlsaW5nIGV4aXQgc3RhdHVzLgotCQkjCi0JCXJtIC1mIGxleC55eS5jCi0JCWV4aXQgJHN0YXR1cwotCWZpCi1maQotCi0jCi0jIE9LLCBub3cgbGV0J3MgZ2VuZXJhdGUgYSBoZWFkZXIgZmlsZSBkZWNsYXJpbmcgdGhlIHJlbGV2YW50IGZ1bmN0aW9ucwotIyBkZWZpbmVkIGJ5IHRoZSAuYyBmaWxlOyBpZiB0aGUgLmMgZmlsZSBpcyAuLi4vZm9vLmMsIHRoZSBoZWFkZXIgZmlsZQotIyB3aWxsIGJlIC4uLi9mb28uaC4KLSMKLSMgVGhpcyB3b3JrcyBhcm91bmQgc29tZSBvdGhlciBGbGV4IHN1Y2thZ2UsIHdoZXJlaW4gaXQgZG9lc24ndCBkZWNsYXJlCi0jIHRoZSBsZXggcm91dGluZSBiZWZvcmUgZGVmaW5pbmcgaXQsIGNhdXNpbmcgY29tcGlsZXIgd2FybmluZ3MuCi0jIFhYWCAtIG5ld2VyIHZlcnNpb25zIG9mIEZsZXggc3VwcG9ydCAtLWhlYWRlci1maWxlPSwgdG8gZ2VuZXJhdGUgdGhlCi0jIGFwcHJvcHJpYXRlIGhlYWRlciBmaWxlLiAgV2l0aCB0aG9zZSB2ZXJzaW9ucywgd2Ugc2hvdWxkIHVzZSB0aGF0IG9wdGlvbi4KLSMKLQotIwotIyBHZXQgdGhlIG5hbWUgb2YgdGhlIHByZWZpeDsgc2NhbiB0aGUgc291cmNlIGZpbGVzIGZvciBhICVvcHRpb24gcHJlZml4Ci0jIGxpbmUuICBXZSB1c2UgdGhlIGxhc3Qgb25lLgotIwotcHJlZml4PWBzZWQgLW4gJ3MvJW9wdGlvblsgCV1bIAldKnByZWZpeD0iXCguKlwpIi4qL1wxL3AnICIkQCIgfCB0YWlsIC0xYAotaWYgWyAhIC16ICIkcHJlZml4IiBdCi10aGVuCi0JcHJlZml4bGluZT0iI2RlZmluZSB5eWxleCAke3ByZWZpeH1sZXgiCi1maQotCi0jCi0jIENvbnN0cnVjdCB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIGZpbGUuCi0jCi1oZWFkZXJfZmlsZT1gZGlybmFtZSAiJG91dGZpbGUiYC9gYmFzZW5hbWUgIiRvdXRmaWxlIiAuY2AuaAotCi0jCi0jIFNwZXcgb3V0IHRoZSBkZWNsYXJhdGlvbi4KLSMKLWNhdCA8PEVPRiA+JGhlYWRlcl9maWxlCi0vKiBUaGlzIGlzIGdlbmVyYXRlZCBieSBydW5sZXguc2guICBEbyBub3QgZWRpdCBpdC4gKi8KLSRwcmVmaXhsaW5lCi0jaWZuZGVmIFlZX0RFQ0wKLSNkZWZpbmUgWVlfREVDTCBpbnQgeXlsZXgodm9pZCkKLSNlbmRpZgotWVlfREVDTDsKLUVPRgpkaWZmIC0tZ2l0IGEvc2F2ZWZpbGUuYyBiL3NhdmVmaWxlLmMKaW5kZXggNzgzZWM0NS4uMjQ3MzM4YyAxMDA2NDQKLS0tIGEvc2F2ZWZpbGUuYworKysgYi9zYXZlZmlsZS5jCkBAIC0zMiw5ICszMiw5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKIAotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCiAjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KLSNlbHNlIC8qIFdJTjMyICovCisjZWxzZSAvKiBfV0lOMzIgKi8KICNpZiBIQVZFX0lOVFRZUEVTX0gKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2VsaWYgSEFWRV9TVERJTlRfSApAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIF9XSU4zMiAqLwogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxtZW1vcnkuaD4KQEAgLTUzLDcgKzUzLDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgInBjYXAtaW50LmgiCi0jaW5jbHVkZSAicGNhcC91c2IuaCIKIAogI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAogI2luY2x1ZGUgIm9zLXByb3RvLmgiCkBAIC02MiwxMCArNjEsMjcgQEAKICNpbmNsdWRlICJzZi1wY2FwLmgiCiAjaW5jbHVkZSAic2YtcGNhcC1uZy5oIgogCisjaWZkZWYgX1dJTjMyCisvKgorICogVGhlc2UgYXJlbid0IGV4cG9ydGVkIG9uIFdpbmRvd3MsIGJlY2F1c2UgdGhleSB3b3VsZCBvbmx5IHdvcmsgaWYgYm90aAorICogV2luUGNhcCBhbmQgdGhlIGNvZGUgdXNpbmcgaXQgd2VyZSB0byB1c2UgdGhlIFVuaXZlcnNhbCBDUlQ7IG90aGVyd2lzZSwKKyAqIGEgRklMRSBzdHJ1Y3R1cmUgaW4gV2luUGNhcCBhbmQgYSBGSUxFIHN0cnVjdHVyZSBpbiB0aGUgY29kZSB1c2luZyBpdAorICogY291bGQgYmUgZGlmZmVyZW50IGlmIHRoZXkncmUgdXNpbmcgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBDIHJ1bnRpbWUuCisgKgorICogSW5zdGVhZCwgcGNhcC9wY2FwLmggZGVmaW5lcyB0aGVtIGFzIG1hY3JvcyB0aGF0IHdyYXAgdGhlIGhvcGVuIHZlcnNpb25zLAorICogd2l0aCB0aGUgd3JhcHBlcnMgY2FsbGluZyBfZmlsZW5vKCkgYW5kIF9nZXRfb3NmaGFuZGxlKCkgdGhlbXNlbHZlcywKKyAqIHNvIHRoYXQgdGhleSBjb252ZXJ0IHRoZSBhcHByb3ByaWF0ZSBDUlQgdmVyc2lvbidzIEZJTEUgc3RydWN0dXJlIHRvCisgKiBhIEhBTkRMRSAod2hpY2ggaXMgT1MtZGVmaW5lZCwgbm90IENSVC1kZWZpbmVkLCBhbmQgaXMgcGFydCBvZiB0aGUgV2luMzIKKyAqIGFuZCBXaW42NCBBQklzKS4KKyAqLworc3RhdGljIHBjYXBfdCAqcGNhcF9mb3Blbl9vZmZsaW5lX3dpdGhfdHN0YW1wX3ByZWNpc2lvbihGSUxFICosIHVfaW50LCBjaGFyICopOworc3RhdGljIHBjYXBfdCAqcGNhcF9mb3Blbl9vZmZsaW5lKEZJTEUgKiwgY2hhciAqKTsKKyNlbmRpZgorCiAvKgogICogU2V0dGluZyBPX0JJTkFSWSBvbiBET1MvV2luZG93cyBpcyBhIGJpdCB0cmlja3kKICAqLwotI2lmIGRlZmluZWQoV0lOMzIpCisjaWYgZGVmaW5lZChfV0lOMzIpCiAgICNkZWZpbmUgU0VUX0JJTk1PREUoZikgIF9zZXRtb2RlKF9maWxlbm8oZiksIF9PX0JJTkFSWSkKICNlbGlmIGRlZmluZWQoTVNET1MpCiAgICNpZiBkZWZpbmVkKF9fSElHSENfXykKQEAgLTk2LDcgKzExMiw3IEBACiAJICogYXMgaXQgd291bGQgaGF2ZSB0byBoYW5kbGUgcmVhZGluZyBwYXJ0aWFsIHBhY2tldHMgYW5kCiAJICoga2VlcGluZyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQuKQogCSAqLwotCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkgICAgIlNhdmVmaWxlcyBjYW5ub3QgYmUgcHV0IGludG8gbm9uLWJsb2NraW5nIG1vZGUiKTsKIAlyZXR1cm4gKC0xKTsKIH0KQEAgLTEwNCwxNiArMTIwLDI0IEBACiBzdGF0aWMgaW50CiBzZl9zdGF0cyhwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKQogewotCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkgICAgIlN0YXRpc3RpY3MgYXJlbid0IGF2YWlsYWJsZSBmcm9tIHNhdmVmaWxlcyIpOwogCXJldHVybiAoLTEpOwogfQogCi0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKK3N0YXRpYyBzdHJ1Y3QgcGNhcF9zdGF0ICoKK3NmX3N0YXRzX2V4KHBjYXBfdCAqcCwgaW50ICpzaXplKQoreworCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiU3RhdGlzdGljcyBhcmVuJ3QgYXZhaWxhYmxlIGZyb20gc2F2ZWZpbGVzIik7CisJcmV0dXJuIChOVUxMKTsKK30KKwogc3RhdGljIGludAogc2Zfc2V0YnVmZihwY2FwX3QgKnAsIGludCBkaW0pCiB7Ci0Jc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCSAgICAiVGhlIGtlcm5lbCBidWZmZXIgc2l6ZSBjYW5ub3QgYmUgc2V0IHdoaWxlIHJlYWRpbmcgZnJvbSBhIGZpbGUiKTsKIAlyZXR1cm4gKC0xKTsKIH0KQEAgLTEyMSw3ICsxNDUsNyBAQAogc3RhdGljIGludAogc2Zfc2V0bW9kZShwY2FwX3QgKnAsIGludCBtb2RlKQogewotCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkgICAgImltcG9zc2libGUgdG8gc2V0IG1vZGUgd2hpbGUgcmVhZGluZyBmcm9tIGEgZmlsZSIpOwogCXJldHVybiAoLTEpOwogfQpAQCAtMTI5LDEwICsxNTMsNzQgQEAKIHN0YXRpYyBpbnQKIHNmX3NldG1pbnRvY29weShwY2FwX3QgKnAsIGludCBzaXplKQogewotCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkgICAgIlRoZSBtaW50b2NvcHkgcGFyYW1ldGVyIGNhbm5vdCBiZSBzZXQgd2hpbGUgcmVhZGluZyBmcm9tIGEgZmlsZSIpOwogCXJldHVybiAoLTEpOwogfQorCitzdGF0aWMgSEFORExFCitzZl9nZXRldmVudChwY2FwX3QgKnBjYXApCit7CisJKHZvaWQpcGNhcF9zbnByaW50ZihwY2FwLT5lcnJidWYsIHNpemVvZihwY2FwLT5lcnJidWYpLAorCSAgICAiVGhlIHJlYWQgZXZlbnQgY2Fubm90IGJlIHJldHJpZXZlZCB3aGlsZSByZWFkaW5nIGZyb20gYSBmaWxlIik7CisJcmV0dXJuIChJTlZBTElEX0hBTkRMRV9WQUxVRSk7Cit9CisKK3N0YXRpYyBpbnQKK3NmX29pZF9nZXRfcmVxdWVzdChwY2FwX3QgKnAsIGJwZl91X2ludDMyIG9pZCBfVV8sIHZvaWQgKmRhdGEgX1VfLAorICAgIHNpemVfdCAqbGVucCBfVV8pCit7CisJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJBbiBPSUQgZ2V0IHJlcXVlc3QgY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBhIGZpbGUiKTsKKwlyZXR1cm4gKFBDQVBfRVJST1IpOworfQorCitzdGF0aWMgaW50CitzZl9vaWRfc2V0X3JlcXVlc3QocGNhcF90ICpwLCBicGZfdV9pbnQzMiBvaWQgX1VfLCBjb25zdCB2b2lkICpkYXRhIF9VXywKKyAgICBzaXplX3QgKmxlbnAgX1VfKQoreworCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiQW4gT0lEIHNldCByZXF1ZXN0IGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gYSBmaWxlIik7CisJcmV0dXJuIChQQ0FQX0VSUk9SKTsKK30KKworc3RhdGljIHVfaW50CitzZl9zZW5kcXVldWVfdHJhbnNtaXQocGNhcF90ICpwLCBwY2FwX3NlbmRfcXVldWUgKnF1ZXVlLCBpbnQgc3luYykKK3sKKwlzdHJsY3B5KHAtPmVycmJ1ZiwgIlNlbmRpbmcgcGFja2V0cyBpc24ndCBzdXBwb3J0ZWQgb24gc2F2ZWZpbGVzIiwKKwkgICAgUENBUF9FUlJCVUZfU0laRSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorc2Zfc2V0dXNlcmJ1ZmZlcihwY2FwX3QgKnAsIGludCBzaXplKQoreworCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiVGhlIHVzZXIgYnVmZmVyIGNhbm5vdCBiZSBzZXQgd2hlbiByZWFkaW5nIGZyb20gYSBmaWxlIik7CisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NmX2xpdmVfZHVtcChwY2FwX3QgKnAsIGNoYXIgKmZpbGVuYW1lLCBpbnQgbWF4c2l6ZSwgaW50IG1heHBhY2tzKQoreworCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiTGl2ZSBwYWNrZXQgZHVtcGluZyBjYW5ub3QgYmUgcGVyZm9ybWVkIHdoZW4gcmVhZGluZyBmcm9tIGEgZmlsZSIpOworCXJldHVybiAoLTEpOworfQorCitzdGF0aWMgaW50CitzZl9saXZlX2R1bXBfZW5kZWQocGNhcF90ICpwLCBpbnQgc3luYykKK3sKKwlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIkxpdmUgcGFja2V0IGR1bXBpbmcgY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBhIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCIpOworCXJldHVybiAoLTEpOworfQorCitzdGF0aWMgUEFpcnBjYXBIYW5kbGUKK3NmX2dldF9haXJwY2FwX2hhbmRsZShwY2FwX3QgKnBjYXApCit7CisJcmV0dXJuIChOVUxMKTsKK30KICNlbmRpZgogCiBzdGF0aWMgaW50CkBAIC0xNTAsNyArMjM4LDcgQEAKIHN0YXRpYyBpbnQKIHNmX3NldGRpcmVjdGlvbihwY2FwX3QgKnAsIHBjYXBfZGlyZWN0aW9uX3QgZCkKIHsKLQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKIAkgICAgIlNldHRpbmcgZGlyZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gc2F2ZWZpbGVzIik7CiAJcmV0dXJuICgtMSk7CiB9CkBAIC0xNjUsMTcgKzI1MywzOCBAQAogCXBjYXBfZnJlZWNvZGUoJnAtPmZjb2RlKTsKIH0KIAorLyoKKyogZm9wZW4ncyBzYWZlIHZlcnNpb24gb24gV2luZG93cy4KKyovCisjaWZkZWYgX01TQ19WRVIKK0ZJTEUgKmZvcGVuX3NhZmUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIqIG1vZGUpCit7CisJRklMRSAqZnAgPSBOVUxMOworCWVycm5vX3QgZXJybm87CisJZXJybm8gPSBmb3Blbl9zKCZmcCwgZmlsZW5hbWUsIG1vZGUpOworCWlmIChlcnJubyA9PSAwKQorCQlyZXR1cm4gZnA7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCiBwY2FwX3QgKgogcGNhcF9vcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKGNvbnN0IGNoYXIgKmZuYW1lLCB1X2ludCBwcmVjaXNpb24sCi0gICAgY2hhciAqZXJyYnVmKQorCQkJCQljaGFyICplcnJidWYpCiB7CiAJRklMRSAqZnA7CiAJcGNhcF90ICpwOwogCisJaWYgKGZuYW1lID09IE5VTEwpIHsKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQSBudWxsIHBvaW50ZXIgd2FzIHN1cHBsaWVkIGFzIHRoZSBmaWxlIG5hbWUiKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CiAJaWYgKGZuYW1lWzBdID09ICctJyAmJiBmbmFtZVsxXSA9PSAnXDAnKQogCXsKIAkJZnAgPSBzdGRpbjsKLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKE1TRE9TKQorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKE1TRE9TKQogCQkvKgogCQkgKiBXZSdyZSByZWFkaW5nIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LCBzbyBwdXQgaXQgaW4gYmluYXJ5CiAJCSAqIG1vZGUsIGFzIHNhdmVmaWxlcyBhcmUgYmluYXJ5IGZpbGVzLgpAQCAtMTg0LDEzICsyOTMsMTMgQEAKICNlbmRpZgogCX0KIAllbHNlIHsKLSNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChNU0RPUykKIAkJZnAgPSBmb3BlbihmbmFtZSwgInIiKTsKICNlbHNlCiAJCWZwID0gZm9wZW4oZm5hbWUsICJyYiIpOwogI2VuZGlmCiAJCWlmIChmcCA9PSBOVUxMKSB7Ci0JCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLCBmbmFtZSwKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwgZm5hbWUsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJcmV0dXJuIChOVUxMKTsKIAkJfQpAQCAtMjEwLDcgKzMxOSw3IEBACiAJICAgIFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9NSUNSTywgZXJyYnVmKSk7CiB9CiAKLSNpZmRlZiBXSU4zMgorI2lmZGVmIF9XSU4zMgogcGNhcF90KiBwY2FwX2hvcGVuX29mZmxpbmVfd2l0aF90c3RhbXBfcHJlY2lzaW9uKGludHB0cl90IG9zZmQsIHVfaW50IHByZWNpc2lvbiwKICAgICBjaGFyICplcnJidWYpCiB7CkBAIC0yMjAsMTQgKzMyOSwxNCBAQAogCWZkID0gX29wZW5fb3NmaGFuZGxlKG9zZmQsIF9PX1JET05MWSk7CiAJaWYgKCBmZCA8IDAgKQogCXsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWZpbGUgPSBfZmRvcGVuKGZkLCAicmIiKTsKIAlpZiAoIGZpbGUgPT0gTlVMTCApCiAJewotCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0yNDksNyArMzU4LDcgQEAKIAogI2RlZmluZQlOX0ZJTEVfVFlQRVMJKHNpemVvZiBjaGVja19oZWFkZXJzIC8gc2l6ZW9mIGNoZWNrX2hlYWRlcnNbMF0pCiAKLSNpZmRlZiBXSU4zMgorI2lmZGVmIF9XSU4zMgogc3RhdGljCiAjZW5kaWYKIHBjYXBfdCAqCkBAIC0yNzIsMTEgKzM4MSwxMSBAQAogCWFtdF9yZWFkID0gZnJlYWQoKGNoYXIgKikmbWFnaWMsIDEsIHNpemVvZihtYWdpYyksIGZwKTsKIAlpZiAoYW10X3JlYWQgIT0gc2l6ZW9mKG1hZ2ljKSkgewogCQlpZiAoZmVycm9yKGZwKSkgewotCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQl9IGVsc2UgewotCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgInRydW5jYXRlZCBkdW1wIGZpbGU7IHRyaWVkIHRvIHJlYWQgJWx1IGZpbGUgaGVhZGVyIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAogCQkJICAgICh1bnNpZ25lZCBsb25nKXNpemVvZihtYWdpYyksCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcpYW10X3JlYWQpOwpAQCAtMzA0LDcgKzQxMyw3IEBACiAJLyoKIAkgKiBXZWxsLCB3aG8ga25vd3Mgd2hhdCB0aGlzIG1lc3MgaXMuLi4uCiAJICovCi0Jc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAidW5rbm93biBmaWxlIGZvcm1hdCIpOworCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAidW5rbm93biBmaWxlIGZvcm1hdCIpOwogCXJldHVybiAoTlVMTCk7CiAKIGZvdW5kOgpAQCAtMzEzLDcgKzQyMiw3IEBACiAJLyogUGFkZGluZyBvbmx5IG5lZWRlZCBmb3IgbGl2ZSBjYXB0dXJlIGZjb2RlICovCiAJcC0+ZmRkaXBhZCA9IDA7CiAKLSNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChNU0RPUykKIAkvKgogCSAqIFlvdSBjYW4gZG8gInNlbGVjdCgpIiBhbmQgInBvbGwoKSIgb24gcGxhaW4gZmlsZXMgb24gbW9zdAogCSAqIHBsYXRmb3JtcywgYW5kIHNob3VsZCBiZSBhYmxlIHRvIGRvIHNvIG9uIHBpcGVzLgpAQCAtMzMyLDEwICs0NDEsMTkgQEAKIAlwLT5nZXRub25ibG9ja19vcCA9IHNmX2dldG5vbmJsb2NrOwogCXAtPnNldG5vbmJsb2NrX29wID0gc2Zfc2V0bm9uYmxvY2s7CiAJcC0+c3RhdHNfb3AgPSBzZl9zdGF0czsKLSNpZmRlZiBXSU4zMgorI2lmZGVmIF9XSU4zMgorCXAtPnN0YXRzX2V4X29wID0gc2Zfc3RhdHNfZXg7CiAJcC0+c2V0YnVmZl9vcCA9IHNmX3NldGJ1ZmY7CiAJcC0+c2V0bW9kZV9vcCA9IHNmX3NldG1vZGU7CiAJcC0+c2V0bWludG9jb3B5X29wID0gc2Zfc2V0bWludG9jb3B5OworCXAtPmdldGV2ZW50X29wID0gc2ZfZ2V0ZXZlbnQ7CisJcC0+b2lkX2dldF9yZXF1ZXN0X29wID0gc2Zfb2lkX2dldF9yZXF1ZXN0OworCXAtPm9pZF9zZXRfcmVxdWVzdF9vcCA9IHNmX29pZF9zZXRfcmVxdWVzdDsKKwlwLT5zZW5kcXVldWVfdHJhbnNtaXRfb3AgPSBzZl9zZW5kcXVldWVfdHJhbnNtaXQ7CisJcC0+c2V0dXNlcmJ1ZmZlcl9vcCA9IHNmX3NldHVzZXJidWZmZXI7CisJcC0+bGl2ZV9kdW1wX29wID0gc2ZfbGl2ZV9kdW1wOworCXAtPmxpdmVfZHVtcF9lbmRlZF9vcCA9IHNmX2xpdmVfZHVtcF9lbmRlZDsKKwlwLT5nZXRfYWlycGNhcF9oYW5kbGVfb3AgPSBzZl9nZXRfYWlycGNhcF9oYW5kbGU7CiAjZW5kaWYKIAogCS8qCkBAIC0zNTQsNyArNDcyLDcgQEAKIAlyZXR1cm4gKHApOwogfQogCi0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKIHN0YXRpYwogI2VuZGlmCiBwY2FwX3QgKgpkaWZmIC0tZ2l0IGEvc2Nhbm5lci5jIGIvc2Nhbm5lci5jCmluZGV4IGRmNzg2ODIuLmIzNjIzOWEgMTAwNjQ0Ci0tLSBhL3NjYW5uZXIuYworKysgYi9zY2FubmVyLmMKQEAgLTEsMzMgKzEsMTggQEAKKyNsaW5lIDIgInNjYW5uZXIuYyIKKyNsaW5lIDIgInNjYW5uZXIubCIKKy8qIE11c3QgY29tZSBmaXJzdCBmb3IgX0xBUkdFX0ZJTEVfQVBJIG9uIEFJWC4gKi8KICNpZmRlZiBIQVZFX0NPTkZJR19ICiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKLSNsaW5lIDIgInNjYW5uZXIuYyIKIAotI2xpbmUgNCAic2Nhbm5lci5jIgorCisKKyNsaW5lIDExICJzY2FubmVyLmMiCiAKICNkZWZpbmUgIFlZX0lOVF9BTElHTkVEIHNob3J0IGludAogCiAvKiBBIGxleGljYWwgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgZmxleCAqLwogCi0jZGVmaW5lIHl5X2NyZWF0ZV9idWZmZXIgcGNhcF9fY3JlYXRlX2J1ZmZlcgotI2RlZmluZSB5eV9kZWxldGVfYnVmZmVyIHBjYXBfX2RlbGV0ZV9idWZmZXIKLSNkZWZpbmUgeXlfZmxleF9kZWJ1ZyBwY2FwX19mbGV4X2RlYnVnCi0jZGVmaW5lIHl5X2luaXRfYnVmZmVyIHBjYXBfX2luaXRfYnVmZmVyCi0jZGVmaW5lIHl5X2ZsdXNoX2J1ZmZlciBwY2FwX19mbHVzaF9idWZmZXIKLSNkZWZpbmUgeXlfbG9hZF9idWZmZXJfc3RhdGUgcGNhcF9fbG9hZF9idWZmZXJfc3RhdGUKLSNkZWZpbmUgeXlfc3dpdGNoX3RvX2J1ZmZlciBwY2FwX19zd2l0Y2hfdG9fYnVmZmVyCi0jZGVmaW5lIHl5aW4gcGNhcF9pbgotI2RlZmluZSB5eWxlbmcgcGNhcF9sZW5nCi0jZGVmaW5lIHl5bGV4IHBjYXBfbGV4Ci0jZGVmaW5lIHl5bGluZW5vIHBjYXBfbGluZW5vCi0jZGVmaW5lIHl5b3V0IHBjYXBfb3V0Ci0jZGVmaW5lIHl5cmVzdGFydCBwY2FwX3Jlc3RhcnQKLSNkZWZpbmUgeXl0ZXh0IHBjYXBfdGV4dAotI2RlZmluZSB5eXdyYXAgcGNhcF93cmFwCi0jZGVmaW5lIHl5YWxsb2MgcGNhcF9hbGxvYwotI2RlZmluZSB5eXJlYWxsb2MgcGNhcF9yZWFsbG9jCi0jZGVmaW5lIHl5ZnJlZSBwY2FwX2ZyZWUKLQogI2RlZmluZSBGTEVYX1NDQU5ORVIKICNkZWZpbmUgWVlfRkxFWF9NQUpPUl9WRVJTSU9OIDIKICNkZWZpbmUgWVlfRkxFWF9NSU5PUl9WRVJTSU9OIDUKQEAgLTE0MSwyNCArMTI2LDQxIEBACiAgKi8KICNkZWZpbmUgWVlfU0NfVE9fVUkoYykgKCh1bnNpZ25lZCBpbnQpICh1bnNpZ25lZCBjaGFyKSBjKQogCisvKiBBbiBvcGFxdWUgcG9pbnRlci4gKi8KKyNpZm5kZWYgWVlfVFlQRURFRl9ZWV9TQ0FOTkVSX1QKKyNkZWZpbmUgWVlfVFlQRURFRl9ZWV9TQ0FOTkVSX1QKK3R5cGVkZWYgdm9pZCogeXlzY2FuX3Q7CisjZW5kaWYKKworLyogRm9yIGNvbnZlbmllbmNlLCB0aGVzZSB2YXJzIChwbHVzIHRoZSBiaXNvbiB2YXJzIGZhciBiZWxvdykKKyAgIGFyZSBtYWNyb3MgaW4gdGhlIHJlZW50cmFudCBzY2FubmVyLiAqLworI2RlZmluZSB5eWluIHl5Zy0+eXlpbl9yCisjZGVmaW5lIHl5b3V0IHl5Zy0+eXlvdXRfcgorI2RlZmluZSB5eWV4dHJhIHl5Zy0+eXlleHRyYV9yCisjZGVmaW5lIHl5bGVuZyB5eWctPnl5bGVuZ19yCisjZGVmaW5lIHl5dGV4dCB5eWctPnl5dGV4dF9yCisjZGVmaW5lIHl5bGluZW5vIChZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2JzX2xpbmVubykKKyNkZWZpbmUgeXljb2x1bW4gKFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnNfY29sdW1uKQorI2RlZmluZSB5eV9mbGV4X2RlYnVnIHl5Zy0+eXlfZmxleF9kZWJ1Z19yCisKIC8qIEVudGVyIGEgc3RhcnQgY29uZGl0aW9uLiAgVGhpcyBtYWNybyByZWFsbHkgb3VnaHQgdG8gdGFrZSBhIHBhcmFtZXRlciwKICAqIGJ1dCB3ZSBkbyBpdCB0aGUgZGlzZ3VzdGluZyBjcnVmdHkgd2F5IGZvcmNlZCBvbiB1cyBieSB0aGUgKCktbGVzcwogICogZGVmaW5pdGlvbiBvZiBCRUdJTi4KICAqLwotI2RlZmluZSBCRUdJTiAoeXlfc3RhcnQpID0gMSArIDIgKgorI2RlZmluZSBCRUdJTiB5eWctPnl5X3N0YXJ0ID0gMSArIDIgKgogCiAvKiBUcmFuc2xhdGUgdGhlIGN1cnJlbnQgc3RhcnQgc3RhdGUgaW50byBhIHZhbHVlIHRoYXQgY2FuIGJlIGxhdGVyIGhhbmRlZAogICogdG8gQkVHSU4gdG8gcmV0dXJuIHRvIHRoZSBzdGF0ZS4gIFRoZSBZWVNUQVRFIGFsaWFzIGlzIGZvciBsZXgKICAqIGNvbXBhdGliaWxpdHkuCiAgKi8KLSNkZWZpbmUgWVlfU1RBUlQgKCgoeXlfc3RhcnQpIC0gMSkgLyAyKQorI2RlZmluZSBZWV9TVEFSVCAoKHl5Zy0+eXlfc3RhcnQgLSAxKSAvIDIpCiAjZGVmaW5lIFlZU1RBVEUgWVlfU1RBUlQKIAogLyogQWN0aW9uIG51bWJlciBmb3IgRU9GIHJ1bGUgb2YgYSBnaXZlbiBzdGFydCBzdGF0ZS4gKi8KICNkZWZpbmUgWVlfU1RBVEVfRU9GKHN0YXRlKSAoWVlfRU5EX09GX0JVRkZFUiArIHN0YXRlICsgMSkKIAogLyogU3BlY2lhbCBhY3Rpb24gbWVhbmluZyAic3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBmaWxlIi4gKi8KLSNkZWZpbmUgWVlfTkVXX0ZJTEUgcGNhcF9yZXN0YXJ0KHBjYXBfaW4gICkKKyNkZWZpbmUgWVlfTkVXX0ZJTEUgcGNhcF9yZXN0YXJ0KHl5aW4gLHl5c2Nhbm5lciApCiAKICNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUl9DSEFSIDAKIApAQCAtMTg5LDEwICsxOTEsNiBAQAogdHlwZWRlZiBzaXplX3QgeXlfc2l6ZV90OwogI2VuZGlmCiAKLWV4dGVybiB5eV9zaXplX3QgcGNhcF9sZW5nOwotCi1leHRlcm4gRklMRSAqcGNhcF9pbiwgKnBjYXBfb3V0OwotCiAjZGVmaW5lIEVPQl9BQ1RfQ09OVElOVUVfU0NBTiAwCiAjZGVmaW5lIEVPQl9BQ1RfRU5EX09GX0ZJTEUgMQogI2RlZmluZSBFT0JfQUNUX0xBU1RfTUFUQ0ggMgpAQCAtMjA0LDE3ICsyMDIsMTcgQEAKICNkZWZpbmUgeXlsZXNzKG4pIFwKIAlkbyBcCiAJCXsgXAotCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCBwY2FwX3RleHQuICovIFwKKwkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgeXl0ZXh0LiAqLyBcCiAgICAgICAgIGludCB5eWxlc3NfbWFjcm9fYXJnID0gKG4pOyBcCiAgICAgICAgIFlZX0xFU1NfTElORU5PKHl5bGVzc19tYWNyb19hcmcpO1wKLQkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IFwKKwkJKnl5X2NwID0geXlnLT55eV9ob2xkX2NoYXI7IFwKIAkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVCBcCi0JCSh5eV9jX2J1Zl9wKSA9IHl5X2NwID0geXlfYnAgKyB5eWxlc3NfbWFjcm9fYXJnIC0gWVlfTU9SRV9BREo7IFwKLQkJWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHBjYXBfdGV4dCBhZ2FpbiAqLyBcCisJCXl5Zy0+eXlfY19idWZfcCA9IHl5X2NwID0geXlfYnAgKyB5eWxlc3NfbWFjcm9fYXJnIC0gWVlfTU9SRV9BREo7IFwKKwkJWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHl5dGV4dCBhZ2FpbiAqLyBcCiAJCX0gXAogCXdoaWxlICggMCApCiAKLSNkZWZpbmUgdW5wdXQoYykgeXl1bnB1dCggYywgKHl5dGV4dF9wdHIpICApCisjZGVmaW5lIHVucHV0KGMpIHl5dW5wdXQoIGMsIHl5Zy0+eXl0ZXh0X3B0ciAsIHl5c2Nhbm5lciApCiAKICNpZm5kZWYgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQogI2RlZmluZSBZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFCkBAIC0yNzQsNzggKzI3Miw1OCBAQAogCSAqCiAJICogV2hlbiB3ZSBhY3R1YWxseSBzZWUgdGhlIEVPRiwgd2UgY2hhbmdlIHRoZSBzdGF0dXMgdG8gIm5ldyIKIAkgKiAodmlhIHBjYXBfcmVzdGFydCgpKSwgc28gdGhhdCB0aGUgdXNlciBjYW4gY29udGludWUgc2Nhbm5pbmcgYnkKLQkgKiBqdXN0IHBvaW50aW5nIHBjYXBfaW4gYXQgYSBuZXcgaW5wdXQgZmlsZS4KKwkgKiBqdXN0IHBvaW50aW5nIHl5aW4gYXQgYSBuZXcgaW5wdXQgZmlsZS4KIAkgKi8KICNkZWZpbmUgWVlfQlVGRkVSX0VPRl9QRU5ESU5HIDIKIAogCX07CiAjZW5kaWYgLyogIVlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUgKi8KIAotLyogU3RhY2sgb2YgaW5wdXQgYnVmZmVycy4gKi8KLXN0YXRpYyBzaXplX3QgeXlfYnVmZmVyX3N0YWNrX3RvcCA9IDA7IC8qKjwgaW5kZXggb2YgdG9wIG9mIHN0YWNrLiAqLwotc3RhdGljIHNpemVfdCB5eV9idWZmZXJfc3RhY2tfbWF4ID0gMDsgLyoqPCBjYXBhY2l0eSBvZiBzdGFjay4gKi8KLXN0YXRpYyBZWV9CVUZGRVJfU1RBVEUgKiB5eV9idWZmZXJfc3RhY2sgPSAwOyAvKio8IFN0YWNrIGFzIGFuIGFycmF5LiAqLwotCiAvKiBXZSBwcm92aWRlIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGJ1ZmZlciBzdGF0ZXMgaW4gY2FzZSBpbiB0aGUKICAqIGZ1dHVyZSB3ZSB3YW50IHRvIHB1dCB0aGUgYnVmZmVyIHN0YXRlcyBpbiBhIG1vcmUgZ2VuZXJhbAogICogInNjYW5uZXIgc3RhdGUiLgogICoKICAqIFJldHVybnMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG9yIE5VTEwuCiAgKi8KLSNkZWZpbmUgWVlfQ1VSUkVOVF9CVUZGRVIgKCAoeXlfYnVmZmVyX3N0YWNrKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gKHl5X2J1ZmZlcl9zdGFjaylbKHl5X2J1ZmZlcl9zdGFja190b3ApXSBcCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSICggeXlnLT55eV9idWZmZXJfc3RhY2sgXAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IHl5Zy0+eXlfYnVmZmVyX3N0YWNrW3l5Zy0+eXlfYnVmZmVyX3N0YWNrX3RvcF0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpCiAKIC8qIFNhbWUgYXMgcHJldmlvdXMgbWFjcm8sIGJ1dCB1c2VmdWwgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIGJ1ZmZlciBzdGFjayBpcyBub3QKICAqIE5VTEwgb3Igd2hlbiB3ZSBuZWVkIGFuIGx2YWx1ZS4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICovCi0jZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSAoeXlfYnVmZmVyX3N0YWNrKVsoeXlfYnVmZmVyX3N0YWNrX3RvcCldCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSB5eWctPnl5X2J1ZmZlcl9zdGFja1t5eWctPnl5X2J1ZmZlcl9zdGFja190b3BdCiAKLS8qIHl5X2hvbGRfY2hhciBob2xkcyB0aGUgY2hhcmFjdGVyIGxvc3Qgd2hlbiBwY2FwX3RleHQgaXMgZm9ybWVkLiAqLwotc3RhdGljIGNoYXIgeXlfaG9sZF9jaGFyOwotc3RhdGljIHl5X3NpemVfdCB5eV9uX2NoYXJzOwkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1ZiAqLwoteXlfc2l6ZV90IHBjYXBfbGVuZzsKK3ZvaWQgcGNhcF9yZXN0YXJ0IChGSUxFICppbnB1dF9maWxlICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3ZvaWQgcGNhcF9fc3dpdGNoX3RvX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworWVlfQlVGRkVSX1NUQVRFIHBjYXBfX2NyZWF0ZV9idWZmZXIgKEZJTEUgKmZpbGUsaW50IHNpemUgLHl5c2Nhbl90IHl5c2Nhbm5lciApOwordm9pZCBwY2FwX19kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkIHBjYXBfX2ZsdXNoX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOwordm9pZCBwY2FwX3B1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkIHBjYXBfcG9wX2J1ZmZlcl9zdGF0ZSAoeXlzY2FuX3QgeXlzY2FubmVyICk7CiAKLS8qIFBvaW50cyB0byBjdXJyZW50IGNoYXJhY3RlciBpbiBidWZmZXIuICovCi1zdGF0aWMgY2hhciAqeXlfY19idWZfcCA9IChjaGFyICopIDA7Ci1zdGF0aWMgaW50IHl5X2luaXQgPSAwOwkJLyogd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgKi8KLXN0YXRpYyBpbnQgeXlfc3RhcnQgPSAwOwkvKiBzdGFydCBzdGF0ZSBudW1iZXIgKi8KK3N0YXRpYyB2b2lkIHBjYXBfZW5zdXJlX2J1ZmZlcl9zdGFjayAoeXlzY2FuX3QgeXlzY2FubmVyICk7CitzdGF0aWMgdm9pZCBwY2FwX19sb2FkX2J1ZmZlcl9zdGF0ZSAoeXlzY2FuX3QgeXlzY2FubmVyICk7CitzdGF0aWMgdm9pZCBwY2FwX19pbml0X2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIsRklMRSAqZmlsZSAseXlzY2FuX3QgeXlzY2FubmVyICk7CiAKLS8qIEZsYWcgd2hpY2ggaXMgdXNlZCB0byBhbGxvdyBwY2FwX3dyYXAoKSdzIHRvIGRvIGJ1ZmZlciBzd2l0Y2hlcwotICogaW5zdGVhZCBvZiBzZXR0aW5nIHVwIGEgZnJlc2ggcGNhcF9pbi4gIEEgYml0IG9mIGEgaGFjayAuLi4KLSAqLwotc3RhdGljIGludCB5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2Y7CisjZGVmaW5lIFlZX0ZMVVNIX0JVRkZFUiBwY2FwX19mbHVzaF9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgLHl5c2Nhbm5lcikKIAotdm9pZCBwY2FwX3Jlc3RhcnQgKEZJTEUgKmlucHV0X2ZpbGUgICk7Ci12b2lkIHBjYXBfX3N3aXRjaF90b19idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICApOwotWVlfQlVGRkVSX1NUQVRFIHBjYXBfX2NyZWF0ZV9idWZmZXIgKEZJTEUgKmZpbGUsaW50IHNpemUgICk7Ci12b2lkIHBjYXBfX2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiICApOwotdm9pZCBwY2FwX19mbHVzaF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiICApOwotdm9pZCBwY2FwX3B1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAgKTsKLXZvaWQgcGNhcF9wb3BfYnVmZmVyX3N0YXRlICh2b2lkICk7CitZWV9CVUZGRVJfU1RBVEUgcGNhcF9fc2Nhbl9idWZmZXIgKGNoYXIgKmJhc2UseXlfc2l6ZV90IHNpemUgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworWVlfQlVGRkVSX1NUQVRFIHBjYXBfX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKnl5X3N0ciAseXlzY2FuX3QgeXlzY2FubmVyICk7CitZWV9CVUZGRVJfU1RBVEUgcGNhcF9fc2Nhbl9ieXRlcyAoeXljb25zdCBjaGFyICpieXRlcyx5eV9zaXplX3QgbGVuICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKIAotc3RhdGljIHZvaWQgcGNhcF9lbnN1cmVfYnVmZmVyX3N0YWNrICh2b2lkICk7Ci1zdGF0aWMgdm9pZCBwY2FwX19sb2FkX2J1ZmZlcl9zdGF0ZSAodm9pZCApOwotc3RhdGljIHZvaWQgcGNhcF9faW5pdF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiLEZJTEUgKmZpbGUgICk7Ci0KLSNkZWZpbmUgWVlfRkxVU0hfQlVGRkVSIHBjYXBfX2ZsdXNoX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiApCi0KLVlZX0JVRkZFUl9TVEFURSBwY2FwX19zY2FuX2J1ZmZlciAoY2hhciAqYmFzZSx5eV9zaXplX3Qgc2l6ZSAgKTsKLVlZX0JVRkZFUl9TVEFURSBwY2FwX19zY2FuX3N0cmluZyAoeXljb25zdCBjaGFyICp5eV9zdHIgICk7Ci1ZWV9CVUZGRVJfU1RBVEUgcGNhcF9fc2Nhbl9ieXRlcyAoeXljb25zdCBjaGFyICpieXRlcyx5eV9zaXplX3QgbGVuICApOwotCi12b2lkICpwY2FwX2FsbG9jICh5eV9zaXplX3QgICk7Ci12b2lkICpwY2FwX3JlYWxsb2MgKHZvaWQgKix5eV9zaXplX3QgICk7Ci12b2lkIHBjYXBfZnJlZSAodm9pZCAqICApOwordm9pZCAqcGNhcF9hbGxvYyAoeXlfc2l6ZV90ICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3ZvaWQgKnBjYXBfcmVhbGxvYyAodm9pZCAqLHl5X3NpemVfdCAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkIHBjYXBfZnJlZSAodm9pZCAqICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKIAogI2RlZmluZSB5eV9uZXdfYnVmZmVyIHBjYXBfX2NyZWF0ZV9idWZmZXIKIAogI2RlZmluZSB5eV9zZXRfaW50ZXJhY3RpdmUoaXNfaW50ZXJhY3RpdmUpIFwKIAl7IFwKIAlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXsgXAotICAgICAgICBwY2FwX2Vuc3VyZV9idWZmZXJfc3RhY2sgKCk7IFwKKyAgICAgICAgcGNhcF9lbnN1cmVfYnVmZmVyX3N0YWNrICh5eXNjYW5uZXIpOyBcCiAJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9ICAgIFwKLSAgICAgICAgICAgIHBjYXBfX2NyZWF0ZV9idWZmZXIocGNhcF9pbixZWV9CVUZfU0laRSApOyBcCisgICAgICAgICAgICBwY2FwX19jcmVhdGVfYnVmZmVyKHl5aW4sWVlfQlVGX1NJWkUgLHl5c2Nhbm5lcik7IFwKIAl9IFwKIAlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lzX2ludGVyYWN0aXZlID0gaXNfaW50ZXJhY3RpdmU7IFwKIAl9CkBAIC0zNTMsOSArMzMxLDkgQEAKICNkZWZpbmUgeXlfc2V0X2JvbChhdF9ib2wpIFwKIAl7IFwKIAlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXtcCi0gICAgICAgIHBjYXBfZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsgXAorICAgICAgICBwY2FwX2Vuc3VyZV9idWZmZXJfc3RhY2sgKHl5c2Nhbm5lcik7IFwKIAkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gICAgXAotICAgICAgICAgICAgcGNhcF9fY3JlYXRlX2J1ZmZlcihwY2FwX2luLFlZX0JVRl9TSVpFICk7IFwKKyAgICAgICAgICAgIHBjYXBfX2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSAseXlzY2FubmVyKTsgXAogCX0gXAogCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sID0gYXRfYm9sOyBcCiAJfQpAQCAtMzY0LDMzICszNDIsMjkgQEAKIAogLyogQmVnaW4gdXNlciBzZWN0MyAqLwogCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgWVlfQ0hBUjsKKyNkZWZpbmUgcGNhcF93cmFwKHl5c2Nhbm5lcikgMQorI2RlZmluZSBZWV9TS0lQX1lZV1JBUAogCi1GSUxFICpwY2FwX2luID0gKEZJTEUgKikgMCwgKnBjYXBfb3V0ID0gKEZJTEUgKikgMDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBZWV9DSEFSOwogCiB0eXBlZGVmIGludCB5eV9zdGF0ZV90eXBlOwogCi1leHRlcm4gaW50IHBjYXBfbGluZW5vOworI2RlZmluZSB5eXRleHRfcHRyIHl5dGV4dF9yCiAKLWludCBwY2FwX2xpbmVubyA9IDE7Ci0KLWV4dGVybiBjaGFyICpwY2FwX3RleHQ7Ci0jZGVmaW5lIHl5dGV4dF9wdHIgcGNhcF90ZXh0Ci0KLXN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSAodm9pZCApOwotc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyAoeXlfc3RhdGVfdHlwZSBjdXJyZW50X3N0YXRlICApOwotc3RhdGljIGludCB5eV9nZXRfbmV4dF9idWZmZXIgKHZvaWQgKTsKLXN0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIgbXNnW10gICk7CitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9nZXRfcHJldmlvdXNfc3RhdGUgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyAoeXlfc3RhdGVfdHlwZSBjdXJyZW50X3N0YXRlICAseXlzY2FuX3QgeXlzY2FubmVyKTsKK3N0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3N0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIgbXNnW10gLHl5c2Nhbl90IHl5c2Nhbm5lciApOwogCiAvKiBEb25lIGFmdGVyIHRoZSBjdXJyZW50IHBhdHRlcm4gaGFzIGJlZW4gbWF0Y2hlZCBhbmQgYmVmb3JlIHRoZQotICogY29ycmVzcG9uZGluZyBhY3Rpb24gLSBzZXRzIHVwIHBjYXBfdGV4dC4KKyAqIGNvcnJlc3BvbmRpbmcgYWN0aW9uIC0gc2V0cyB1cCB5eXRleHQuCiAgKi8KICNkZWZpbmUgWVlfRE9fQkVGT1JFX0FDVElPTiBcCi0JKHl5dGV4dF9wdHIpID0geXlfYnA7IFwKLQlwY2FwX2xlbmcgPSAoc2l6ZV90KSAoeXlfY3AgLSB5eV9icCk7IFwKLQkoeXlfaG9sZF9jaGFyKSA9ICp5eV9jcDsgXAorCXl5Zy0+eXl0ZXh0X3B0ciA9IHl5X2JwOyBcCisJeXlsZW5nID0gKHNpemVfdCkgKHl5X2NwIC0geXlfYnApOyBcCisJeXlnLT55eV9ob2xkX2NoYXIgPSAqeXlfY3A7IFwKIAkqeXlfY3AgPSAnXDAnOyBcCi0JKHl5X2NfYnVmX3ApID0geXlfY3A7CisJeXlnLT55eV9jX2J1Zl9wID0geXlfY3A7CiAKICNkZWZpbmUgWVlfTlVNX1JVTEVTIDE1NQogI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSIDE1NgpAQCAtMjY5MiwxMiArMjY2Niw2IEBACiAgICAgIDE0NjMsIDE0NjMsIDE0NjMKICAgICB9IDsKIAotc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfbGFzdF9hY2NlcHRpbmdfc3RhdGU7Ci1zdGF0aWMgY2hhciAqeXlfbGFzdF9hY2NlcHRpbmdfY3BvczsKLQotZXh0ZXJuIGludCBwY2FwX19mbGV4X2RlYnVnOwotaW50IHBjYXBfX2ZsZXhfZGVidWcgPSAwOwotCiAvKiBUaGUgaW50ZW50IGJlaGluZCB0aGlzIGRlZmluaXRpb24gaXMgdGhhdCBpdCdsbCBjYXRjaAogICogYW55IHVzZXMgb2YgUkVKRUNUIHdoaWNoIGZsZXggbWlzc2VkLgogICovCkBAIC0yNzA1LDkgKzI2NzMsMzIgQEAKICNkZWZpbmUgeXltb3JlKCkgeXltb3JlX3VzZWRfYnV0X25vdF9kZXRlY3RlZAogI2RlZmluZSBZWV9NT1JFX0FESiAwCiAjZGVmaW5lIFlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKLWNoYXIgKnBjYXBfdGV4dDsKICNsaW5lIDEgInNjYW5uZXIubCIKLSNsaW5lIDIgInNjYW5uZXIubCIKKworLyoKKyAqIFdlIHdhbnQgYSByZWVudHJhbnQgc2Nhbm5lci4KKyAqLworLyoKKyAqIEFuZCB3ZSBuZWVkIHRvIHBhc3MgdGhlIGNvbXBpbGVyIHN0YXRlIHRvIHRoZSBzY2FubmVyLgorICovCisvKgorICogV2UgZG9uJ3QgdXNlIGlucHV0LCBzbyBkb24ndCBnZW5lcmF0ZSBjb2RlIGZvciBpdC4KKyAqLworI2RlZmluZSBZWV9OT19JTlBVVCAxCisvKgorICogV2UgZG9uJ3QgdXNlIHVucHV0LCBzbyBkb24ndCBnZW5lcmF0ZSBjb2RlIGZvciBpdC4KKyAqLworLyoKKyAqIFdlIGRvbid0IHJlYWQgZnJvbSB0aGUgdGVybWluYWwuCisgKi8KKy8qCisgKiBXZSB3YW50IHRvIHN0b3AgcHJvY2Vzc2luZyB3aGVuIHdlIGdldCB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dC4KKyAqLworLyoKKyAqIFdlIHdhbnQgdG8gZ2VuZXJhdGUgY29kZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgcmVlbnRyYW50IHBhcnNlcgorICogZ2VuZXJhdGVkIGJ5IEJpc29uIG9yIEJlcmtlbGV5IFlBQ0MuCisgKi8KKyNsaW5lIDQ1ICJzY2FubmVyLmwiCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CiAgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KQEAgLTI3MjksMTkgKzI3MjAsMTkgQEAKICAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKi8KIAotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KLSNlbHNlIC8qIFdJTjMyICovCi0jaWYgSEFWRV9JTlRUWVBFU19ICi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbGlmIEhBVkVfU1RESU5UX0gKLSNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZmRlZiBfV0lOMzIKKyAgI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZWxzZQorICAjaWYgSEFWRV9JTlRUWVBFU19ICisgICAgI2luY2x1ZGUgPGludHR5cGVzLmg+CisgICNlbGlmIEhBVkVfU1RESU5UX0gKKyAgICAjaW5jbHVkZSA8c3RkaW50Lmg+CisgICNlbmRpZgorICAjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisgICAgI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisgICNlbmRpZgorICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKLSNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYgLyogV0lOMzIgKi8KIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0yNzQ5LDI1ICsyNzQwLDU2IEBACiAjaW5jbHVkZSAicGNhcC1pbnQuaCIKIAogI2luY2x1ZGUgImdlbmNvZGUuaCIKLSNpZmRlZiBJTkVUNgotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KIAotI2lmZGVmIF9fTUlOR1czMl9fCi0jaW5jbHVkZSAiaXA2X21pc2MuaCIKLSNlbmRpZgotI2Vsc2UgLyogV0lOMzIgKi8KKyNpbmNsdWRlICJncmFtbWFyLmgiCisKKy8qCisgKiBFYXJsaWVyIHZlcnNpb25zIG9mIEZsZXggZG9uJ3QgZGVjbGFyZSB0aGVzZSwgc28gd2UgZGVjbGFyZSB0aGVtCisgKiBvdXJzZWx2ZXMgdG8gc3F1ZWxjaCB3YXJuaW5ncy4KKyAqLworaW50IHBjYXBfZ2V0X2NvbHVtbih5eXNjYW5fdCk7Cit2b2lkIHBjYXBfc2V0X2NvbHVtbihpbnQsIHl5c2Nhbl90KTsKKworI2lmZGVmIElORVQ2CisKKyNpZmRlZiBfV0lOMzIKKy8qCisgKiBUbyBxdW90ZSB0aGUgTVNETiBwYWdlIGZvciBnZXRhZGRyaW5mbygpIGF0CisgKgorICogICAgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM3Mzg1MjAodj12cy44NSkuYXNweAorICoKKyAqICJTdXBwb3J0IGZvciBnZXRhZGRyaW5mbyBvbiBXaW5kb3dzIDIwMDAgYW5kIG9sZGVyIHZlcnNpb25zCisgKiBUaGUgZ2V0YWRkcmluZm8gZnVuY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBXczJfMzIuZGxsIG9uIFdpbmRvd3MgWFAgYW5kCisgKiBsYXRlci4gVG8gZXhlY3V0ZSBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhpcyBmdW5jdGlvbiBvbiBlYXJsaWVyCisgKiB2ZXJzaW9ucyBvZiBXaW5kb3dzLCB0aGVuIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIFdzMnRjcGlwLmggYW5kCisgKiBXc3BpYXBpLmggZmlsZXMuIFdoZW4gdGhlIFdzcGlhcGkuaCBpbmNsdWRlIGZpbGUgaXMgYWRkZWQsIHRoZQorICogZ2V0YWRkcmluZm8gZnVuY3Rpb24gaXMgZGVmaW5lZCB0byB0aGUgV3NwaWFwaUdldEFkZHJJbmZvIGlubGluZQorICogZnVuY3Rpb24gaW4gdGhlIFdzcGlhcGkuaCBmaWxlLiBBdCBydW50aW1lLCB0aGUgV3NwaWFwaUdldEFkZHJJbmZvCisgKiBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgaWYgdGhlIFdzMl8zMi5kbGwgb3IgdGhlCisgKiBXc2hpcDYuZGxsICh0aGUgZmlsZSBjb250YWluaW5nIGdldGFkZHJpbmZvIGluIHRoZSBJUHY2IFRlY2hub2xvZ3kKKyAqIFByZXZpZXcgZm9yIFdpbmRvd3MgMjAwMCkgZG9lcyBub3QgaW5jbHVkZSBnZXRhZGRyaW5mbywgdGhlbiBhCisgKiB2ZXJzaW9uIG9mIGdldGFkZHJpbmZvIGlzIGltcGxlbWVudGVkIGlubGluZSBiYXNlZCBvbiBjb2RlIGluIHRoZQorICogV3NwaWFwaS5oIGhlYWRlciBmaWxlLiBUaGlzIGlubGluZSBjb2RlIHdpbGwgYmUgdXNlZCBvbiBvbGRlciBXaW5kb3dzCisgKiBwbGF0Zm9ybXMgdGhhdCBkbyBub3QgbmF0aXZlbHkgc3VwcG9ydCB0aGUgZ2V0YWRkcmluZm8gZnVuY3Rpb24uIgorICoKKyAqIFdlIHVzZSBnZXRhZGRyaW5mbygpLCBzbyB3ZSBpbmNsdWRlIFdzcGlhcGkuaCBoZXJlLiAgcGNhcC1zdGRpbmMuaAorICogaW5jbHVkZXMgV3MydGNwaXAuaCwgc28gd2UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIGl0IG91cnNlbHZlcy4KKyAqLworI2luY2x1ZGUgPFdzcGlhcGkuaD4KKyNlbHNlIC8qIF9XSU4zMiAqLwogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4JLyogZm9yICJzdHJ1Y3Qgc29ja2FkZHIiIGluICJzdHJ1Y3QgYWRkcmluZm8iICovCiAjaW5jbHVkZSA8bmV0ZGIuaD4JLyogZm9yICJzdHJ1Y3QgYWRkcmluZm8iICovCi0jZW5kaWYgLyogV0lOMzIgKi8KKyNlbmRpZiAvKiBfV0lOMzIgKi8KIAogLyogV29ya2Fyb3VuZCBmb3IgQUlYIDQuMyAqLwogI2lmICFkZWZpbmVkKEFJX05VTUVSSUNIT1NUKQogI2RlZmluZSBBSV9OVU1FUklDSE9TVCAweDA0CiAjZW5kaWYKKwogI2VuZGlmIC8qSU5FVDYqLworCiAjaW5jbHVkZSA8cGNhcC9uYW1lZGIuaD4KLSNpbmNsdWRlICJ0b2tkZWZzLmgiCisjaW5jbHVkZSAiZ3JhbW1hci5oIgogCiAjaWZkZWYgSEFWRV9PU19QUk9UT19ICiAjaW5jbHVkZSAib3MtcHJvdG8uaCIKQEAgLTI3NzYsMjEgKzI3OTgsNyBAQAogc3RhdGljIGludCBzdG9pKGNoYXIgKik7CiBzdGF0aWMgaW5saW5lIGludCB4ZHRvaShpbnQpOwogCi0jaWZkZWYgRkxFWF9TQ0FOTkVSCi0jZGVmaW5lIFlZX05PX0lOUFVUCi0jZGVmaW5lIFlZX05PX1VOUFVUCi1zdGF0aWMgWVlfQlVGRkVSX1NUQVRFIGluX2J1ZmZlcjsKLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciAqaW5fYnVmZmVyOwotCi0jdW5kZWYgZ2V0YwotI2RlZmluZSBnZXRjKGZwKSAgKCppbl9idWZmZXIgPT0gMCA/IEVPRiA6ICppbl9idWZmZXIrKykKLSNlbmRpZgotCi0jZGVmaW5lIHl5bHZhbCBwY2FwX2x2YWwKLWV4dGVybiBZWVNUWVBFIHl5bHZhbDsKLQotI2xpbmUgMjc5MSAic2Nhbm5lci5jIgorI2xpbmUgMjgwMiAic2Nhbm5lci5jIgogCiAjZGVmaW5lIElOSVRJQUwgMAogCkBAIC0yODAyLDI0ICsyODEwLDkwIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKIAotI2lmbmRlZiBZWV9FWFRSQV9UWVBFCi0jZGVmaW5lIFlZX0VYVFJBX1RZUEUgdm9pZCAqCi0jZW5kaWYKKyNkZWZpbmUgWVlfRVhUUkFfVFlQRSBjb21waWxlcl9zdGF0ZV90ICoKIAotc3RhdGljIGludCB5eV9pbml0X2dsb2JhbHMgKHZvaWQgKTsKKy8qIEhvbGRzIHRoZSBlbnRpcmUgc3RhdGUgb2YgdGhlIHJlZW50cmFudCBzY2FubmVyLiAqLworc3RydWN0IHl5Z3V0c190CisgICAgeworCisgICAgLyogVXNlci1kZWZpbmVkLiBOb3QgdG91Y2hlZCBieSBmbGV4LiAqLworICAgIFlZX0VYVFJBX1RZUEUgeXlleHRyYV9yOworCisgICAgLyogVGhlIHJlc3QgYXJlIHRoZSBzYW1lIGFzIHRoZSBnbG9iYWxzIGRlY2xhcmVkIGluIHRoZSBub24tcmVlbnRyYW50IHNjYW5uZXIuICovCisgICAgRklMRSAqeXlpbl9yLCAqeXlvdXRfcjsKKyAgICBzaXplX3QgeXlfYnVmZmVyX3N0YWNrX3RvcDsgLyoqPCBpbmRleCBvZiB0b3Agb2Ygc3RhY2suICovCisgICAgc2l6ZV90IHl5X2J1ZmZlcl9zdGFja19tYXg7IC8qKjwgY2FwYWNpdHkgb2Ygc3RhY2suICovCisgICAgWVlfQlVGRkVSX1NUQVRFICogeXlfYnVmZmVyX3N0YWNrOyAvKio8IFN0YWNrIGFzIGFuIGFycmF5LiAqLworICAgIGNoYXIgeXlfaG9sZF9jaGFyOworICAgIHl5X3NpemVfdCB5eV9uX2NoYXJzOworICAgIHl5X3NpemVfdCB5eWxlbmdfcjsKKyAgICBjaGFyICp5eV9jX2J1Zl9wOworICAgIGludCB5eV9pbml0OworICAgIGludCB5eV9zdGFydDsKKyAgICBpbnQgeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mOworICAgIGludCB5eV9zdGFydF9zdGFja19wdHI7CisgICAgaW50IHl5X3N0YXJ0X3N0YWNrX2RlcHRoOworICAgIGludCAqeXlfc3RhcnRfc3RhY2s7CisgICAgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKKyAgICBjaGFyKiB5eV9sYXN0X2FjY2VwdGluZ19jcG9zOworCisgICAgaW50IHl5bGluZW5vX3I7CisgICAgaW50IHl5X2ZsZXhfZGVidWdfcjsKKworICAgIGNoYXIgKnl5dGV4dF9yOworICAgIGludCB5eV9tb3JlX2ZsYWc7CisgICAgaW50IHl5X21vcmVfbGVuOworCisgICAgWVlTVFlQRSAqIHl5bHZhbF9yOworCisgICAgfTsgLyogZW5kIHN0cnVjdCB5eWd1dHNfdCAqLworCitzdGF0aWMgaW50IHl5X2luaXRfZ2xvYmFscyAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKKyAgICAvKiBUaGlzIG11c3QgZ28gaGVyZSBiZWNhdXNlIFlZU1RZUEUgYW5kIFlZTFRZUEUgYXJlIGluY2x1ZGVkCisgICAgICogZnJvbSBiaXNvbiBvdXRwdXQgaW4gc2VjdGlvbiAxLiovCisgICAgIyAgICBkZWZpbmUgeXlsdmFsIHl5Zy0+eXlsdmFsX3IKKyAgICAKK2ludCBwY2FwX2xleF9pbml0ICh5eXNjYW5fdCogc2Nhbm5lcik7CisKK2ludCBwY2FwX2xleF9pbml0X2V4dHJhIChZWV9FWFRSQV9UWVBFIHVzZXJfZGVmaW5lZCx5eXNjYW5fdCogc2Nhbm5lcik7CiAKIC8qIEFjY2Vzc29yIG1ldGhvZHMgdG8gZ2xvYmFscy4KICAgIFRoZXNlIGFyZSBtYWRlIHZpc2libGUgdG8gbm9uLXJlZW50cmFudCBzY2FubmVycyBmb3IgY29udmVuaWVuY2UuICovCiAKLWludCBwY2FwX2xleF9kZXN0cm95ICh2b2lkICk7CitpbnQgcGNhcF9sZXhfZGVzdHJveSAoeXlzY2FuX3QgeXlzY2FubmVyICk7CiAKLWludCBwY2FwX2dldF9kZWJ1ZyAodm9pZCApOworaW50IHBjYXBfZ2V0X2RlYnVnICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKIAotdm9pZCBwY2FwX3NldF9kZWJ1ZyAoaW50IGRlYnVnX2ZsYWcgICk7Cit2b2lkIHBjYXBfc2V0X2RlYnVnIChpbnQgZGVidWdfZmxhZyAseXlzY2FuX3QgeXlzY2FubmVyICk7CiAKLVlZX0VYVFJBX1RZUEUgcGNhcF9nZXRfZXh0cmEgKHZvaWQgKTsKK1lZX0VYVFJBX1RZUEUgcGNhcF9nZXRfZXh0cmEgKHl5c2Nhbl90IHl5c2Nhbm5lciApOwogCi12b2lkIHBjYXBfc2V0X2V4dHJhIChZWV9FWFRSQV9UWVBFIHVzZXJfZGVmaW5lZCAgKTsKK3ZvaWQgcGNhcF9zZXRfZXh0cmEgKFlZX0VYVFJBX1RZUEUgdXNlcl9kZWZpbmVkICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworRklMRSAqcGNhcF9nZXRfaW4gKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCit2b2lkIHBjYXBfc2V0X2luICAoRklMRSAqIGluX3N0ciAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKK0ZJTEUgKnBjYXBfZ2V0X291dCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKK3ZvaWQgcGNhcF9zZXRfb3V0ICAoRklMRSAqIG91dF9zdHIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCit5eV9zaXplX3QgcGNhcF9nZXRfbGVuZyAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKK2NoYXIgKnBjYXBfZ2V0X3RleHQgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitpbnQgcGNhcF9nZXRfbGluZW5vICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCBwY2FwX3NldF9saW5lbm8gKGludCBsaW5lX251bWJlciAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKK2ludCBwY2FwX2dldF9jb2x1bW4gICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCBwY2FwX3NldF9jb2x1bW4gKGludCBjb2x1bW5fbm8gLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitZWVNUWVBFICogcGNhcF9nZXRfbHZhbCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKK3ZvaWQgcGNhcF9zZXRfbHZhbCAoWVlTVFlQRSAqIHl5bHZhbF9wYXJhbSAseXlzY2FuX3QgeXlzY2FubmVyICk7CiAKIC8qIE1hY3JvcyBhZnRlciB0aGlzIHBvaW50IGNhbiBhbGwgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIGRlZmluaXRpb25zIGluCiAgKiBzZWN0aW9uIDEuCkBAIC0yODI3LDI2ICsyOTAxLDI2IEBACiAKICNpZm5kZWYgWVlfU0tJUF9ZWVdSQVAKICNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiBpbnQgcGNhcF93cmFwICh2b2lkICk7CitleHRlcm4gIkMiIGludCBwY2FwX3dyYXAgKHl5c2Nhbl90IHl5c2Nhbm5lciApOwogI2Vsc2UKLWV4dGVybiBpbnQgcGNhcF93cmFwICh2b2lkICk7CitleHRlcm4gaW50IHBjYXBfd3JhcCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CiAjZW5kaWYKICNlbmRpZgogCiAjaWZuZGVmIHl5dGV4dF9wdHIKLXN0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciAqLHl5Y29uc3QgY2hhciAqLGludCApOworc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyICoseXljb25zdCBjaGFyICosaW50ICx5eXNjYW5fdCB5eXNjYW5uZXIpOwogI2VuZGlmCiAKICNpZmRlZiBZWV9ORUVEX1NUUkxFTgotc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogKTsKK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqICx5eXNjYW5fdCB5eXNjYW5uZXIpOwogI2VuZGlmCiAKICNpZm5kZWYgWVlfTk9fSU5QVVQKIAogI2lmZGVmIF9fY3BsdXNwbHVzCi1zdGF0aWMgaW50IHl5aW5wdXQgKHZvaWQgKTsKK3N0YXRpYyBpbnQgeXlpbnB1dCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CiAjZWxzZQotc3RhdGljIGludCBpbnB1dCAodm9pZCApOworc3RhdGljIGludCBpbnB1dCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CiAjZW5kaWYKIAogI2VuZGlmCkBAIC0yODY2LDcgKzI5NDAsNyBAQAogLyogVGhpcyB1c2VkIHRvIGJlIGFuIGZwdXRzKCksIGJ1dCBzaW5jZSB0aGUgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gTlVMJ3MsCiAgKiB3ZSBub3cgdXNlIGZ3cml0ZSgpLgogICovCi0jZGVmaW5lIEVDSE8gZG8geyBpZiAoZndyaXRlKCBwY2FwX3RleHQsIHBjYXBfbGVuZywgMSwgcGNhcF9vdXQgKSkge30gfSB3aGlsZSAoMCkKKyNkZWZpbmUgRUNITyBkbyB7IGlmIChmd3JpdGUoIHl5dGV4dCwgeXlsZW5nLCAxLCB5eW91dCApKSB7fSB9IHdoaWxlICgwKQogI2VuZGlmCiAKIC8qIEdldHMgaW5wdXQgYW5kIHN0dWZmcyBpdCBpbnRvICJidWYiLiAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCwgb3IgWVlfTlVMTCwKQEAgLTI4NzksMTggKzI5NTMsMTggQEAKIAkJaW50IGMgPSAnKic7IFwKIAkJc2l6ZV90IG47IFwKIAkJZm9yICggbiA9IDA7IG4gPCBtYXhfc2l6ZSAmJiBcCi0JCQkgICAgIChjID0gZ2V0YyggcGNhcF9pbiApKSAhPSBFT0YgJiYgYyAhPSAnXG4nOyArK24gKSBcCisJCQkgICAgIChjID0gZ2V0YyggeXlpbiApKSAhPSBFT0YgJiYgYyAhPSAnXG4nOyArK24gKSBcCiAJCQlidWZbbl0gPSAoY2hhcikgYzsgXAogCQlpZiAoIGMgPT0gJ1xuJyApIFwKIAkJCWJ1ZltuKytdID0gKGNoYXIpIGM7IFwKLQkJaWYgKCBjID09IEVPRiAmJiBmZXJyb3IoIHBjYXBfaW4gKSApIFwKKwkJaWYgKCBjID09IEVPRiAmJiBmZXJyb3IoIHl5aW4gKSApIFwKIAkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAogCQlyZXN1bHQgPSBuOyBcCiAJCX0gXAogCWVsc2UgXAogCQl7IFwKIAkJZXJybm89MDsgXAotCQl3aGlsZSAoIChyZXN1bHQgPSBmcmVhZChidWYsIDEsIG1heF9zaXplLCBwY2FwX2luKSk9PTAgJiYgZmVycm9yKHBjYXBfaW4pKSBcCisJCXdoaWxlICggKHJlc3VsdCA9IGZyZWFkKGJ1ZiwgMSwgbWF4X3NpemUsIHl5aW4pKT09MCAmJiBmZXJyb3IoeXlpbikpIFwKIAkJCXsgXAogCQkJaWYoIGVycm5vICE9IEVJTlRSKSBcCiAJCQkJeyBcCkBAIC0yODk4LDcgKzI5NzIsNyBAQAogCQkJCWJyZWFrOyBcCiAJCQkJfSBcCiAJCQllcnJubz0wOyBcCi0JCQljbGVhcmVycihwY2FwX2luKTsgXAorCQkJY2xlYXJlcnIoeXlpbik7IFwKIAkJCX0gXAogCQl9XAogXApAQCAtMjkyMCw3ICsyOTk0LDcgQEAKIAogLyogUmVwb3J0IGEgZmF0YWwgZXJyb3IuICovCiAjaWZuZGVmIFlZX0ZBVEFMX0VSUk9SCi0jZGVmaW5lIFlZX0ZBVEFMX0VSUk9SKG1zZykgeXlfZmF0YWxfZXJyb3IoIG1zZyApCisjZGVmaW5lIFlZX0ZBVEFMX0VSUk9SKG1zZykgeXlfZmF0YWxfZXJyb3IoIG1zZyAsIHl5c2Nhbm5lcikKICNlbmRpZgogCiAvKiBlbmQgdGFibGVzIHNlcmlhbGl6YXRpb24gc3RydWN0dXJlcyBhbmQgcHJvdG90eXBlcyAqLwpAQCAtMjkzMSwxMiArMzAwNSwxNCBAQAogI2lmbmRlZiBZWV9ERUNMCiAjZGVmaW5lIFlZX0RFQ0xfSVNfT1VSUyAxCiAKLWV4dGVybiBpbnQgcGNhcF9sZXggKHZvaWQpOworZXh0ZXJuIGludCBwY2FwX2xleCBcCisgICAgICAgICAgICAgICAoWVlTVFlQRSAqIHl5bHZhbF9wYXJhbSAseXlzY2FuX3QgeXlzY2FubmVyKTsKIAotI2RlZmluZSBZWV9ERUNMIGludCBwY2FwX2xleCAodm9pZCkKKyNkZWZpbmUgWVlfREVDTCBpbnQgcGNhcF9sZXggXAorICAgICAgICAgICAgICAgKFlZU1RZUEUgKiB5eWx2YWxfcGFyYW0gLCB5eXNjYW5fdCB5eXNjYW5uZXIpCiAjZW5kaWYgLyogIVlZX0RFQ0wgKi8KIAotLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcnVsZSwgYWZ0ZXIgcGNhcF90ZXh0IGFuZCBwY2FwX2xlbmcKKy8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bGUsIGFmdGVyIHl5dGV4dCBhbmQgeXlsZW5nCiAgKiBoYXZlIGJlZW4gc2V0IHVwLgogICovCiAjaWZuZGVmIFlZX1VTRVJfQUNUSU9OCkBAIC0yOTU4LDU5ICszMDM0LDYyIEBACiAJcmVnaXN0ZXIgeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOwogCXJlZ2lzdGVyIGNoYXIgKnl5X2NwLCAqeXlfYnA7CiAJcmVnaXN0ZXIgaW50IHl5X2FjdDsKLSAgICAKLQlpZiAoICEoeXlfaW5pdCkgKQorICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKworICAgIHl5bHZhbCA9IHl5bHZhbF9wYXJhbTsKKworCWlmICggIXl5Zy0+eXlfaW5pdCApCiAJCXsKLQkJKHl5X2luaXQpID0gMTsKKwkJeXlnLT55eV9pbml0ID0gMTsKIAogI2lmZGVmIFlZX1VTRVJfSU5JVAogCQlZWV9VU0VSX0lOSVQ7CiAjZW5kaWYKIAotCQlpZiAoICEgKHl5X3N0YXJ0KSApCi0JCQkoeXlfc3RhcnQpID0gMTsJLyogZmlyc3Qgc3RhcnQgc3RhdGUgKi8KKwkJaWYgKCAhIHl5Zy0+eXlfc3RhcnQgKQorCQkJeXlnLT55eV9zdGFydCA9IDE7CS8qIGZpcnN0IHN0YXJ0IHN0YXRlICovCiAKLQkJaWYgKCAhIHBjYXBfaW4gKQotCQkJcGNhcF9pbiA9IHN0ZGluOworCQlpZiAoICEgeXlpbiApCisJCQl5eWluID0gc3RkaW47CiAKLQkJaWYgKCAhIHBjYXBfb3V0ICkKLQkJCXBjYXBfb3V0ID0gc3Rkb3V0OworCQlpZiAoICEgeXlvdXQgKQorCQkJeXlvdXQgPSBzdGRvdXQ7CiAKIAkJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICkgewotCQkJcGNhcF9lbnN1cmVfYnVmZmVyX3N0YWNrICgpOworCQkJcGNhcF9lbnN1cmVfYnVmZmVyX3N0YWNrICh5eXNjYW5uZXIpOwogCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0KLQkJCQlwY2FwX19jcmVhdGVfYnVmZmVyKHBjYXBfaW4sWVlfQlVGX1NJWkUgKTsKKwkJCQlwY2FwX19jcmVhdGVfYnVmZmVyKHl5aW4sWVlfQlVGX1NJWkUgLHl5c2Nhbm5lcik7CiAJCX0KIAotCQlwY2FwX19sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKwkJcGNhcF9fbG9hZF9idWZmZXJfc3RhdGUoeXlzY2FubmVyICk7CiAJCX0KIAogCXsKLSNsaW5lIDE4MCAic2Nhbm5lci5sIgorI2xpbmUgMjQwICJzY2FubmVyLmwiCiAKLSNsaW5lIDI5ODkgInNjYW5uZXIuYyIKKyNsaW5lIDMwNzEgInNjYW5uZXIuYyIKIAogCXdoaWxlICggMSApCQkvKiBsb29wcyB1bnRpbCBlbmQtb2YtZmlsZSBpcyByZWFjaGVkICovCiAJCXsKLQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCXl5X2NwID0geXlnLT55eV9jX2J1Zl9wOwogCi0JCS8qIFN1cHBvcnQgb2YgcGNhcF90ZXh0LiAqLwotCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKKwkJLyogU3VwcG9ydCBvZiB5eXRleHQuICovCisJCSp5eV9jcCA9IHl5Zy0+eXlfaG9sZF9jaGFyOwogCiAJCS8qIHl5X2JwIHBvaW50cyB0byB0aGUgcG9zaXRpb24gaW4geXlfY2hfYnVmIG9mIHRoZSBzdGFydCBvZgogCQkgKiB0aGUgY3VycmVudCBydW4uCiAJCSAqLwogCQl5eV9icCA9IHl5X2NwOwogCi0JCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfc3RhcnQpOworCQl5eV9jdXJyZW50X3N0YXRlID0geXlnLT55eV9zdGFydDsKIHl5X21hdGNoOgogCQlkbwogCQkJewogCQkJcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0geXlfZWNbWVlfU0NfVE9fVUkoKnl5X2NwKV0gOwogCQkJaWYgKCB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV0gKQogCQkJCXsKLQkJCQkoeXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUpID0geXlfY3VycmVudF9zdGF0ZTsKLQkJCQkoeXlfbGFzdF9hY2NlcHRpbmdfY3BvcykgPSB5eV9jcDsKKwkJCQl5eWctPnl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKKwkJCQl5eWctPnl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MgPSB5eV9jcDsKIAkJCQl9CiAJCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCiAJCQkJewpAQCAtMzAyMSwxNiArMzEwMCwxMiBAQAogCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107CiAJCQkrK3l5X2NwOwogCQkJfQotCQl3aGlsZSAoIHl5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gIT0gNzQyMCApOworCQl3aGlsZSAoIHl5X2N1cnJlbnRfc3RhdGUgIT0gMTQ2MyApOworCQl5eV9jcCA9IHl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfY3BvczsKKwkJeXlfY3VycmVudF9zdGF0ZSA9IHl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfc3RhdGU7CiAKIHl5X2ZpbmRfYWN0aW9uOgogCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07Ci0JCWlmICggeXlfYWN0ID09IDAgKQotCQkJeyAvKiBoYXZlIHRvIGJhY2sgdXAgKi8KLQkJCXl5X2NwID0gKHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MpOwotCQkJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSk7Ci0JCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07Ci0JCQl9CiAKIAkJWVlfRE9fQkVGT1JFX0FDVElPTjsKIApAQCAtMzA0MCwyNjcgKzMxMTUsMjY3IEBACiAJeyAvKiBiZWdpbm5pbmcgb2YgYWN0aW9uIHN3aXRjaCAqLwogCQkJY2FzZSAwOiAvKiBtdXN0IGJhY2sgdXAgKi8KIAkJCS8qIHVuZG8gdGhlIGVmZmVjdHMgb2YgWVlfRE9fQkVGT1JFX0FDVElPTiAqLwotCQkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7Ci0JCQl5eV9jcCA9ICh5eV9sYXN0X2FjY2VwdGluZ19jcG9zKTsKLQkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUpOworCQkJKnl5X2NwID0geXlnLT55eV9ob2xkX2NoYXI7CisJCQl5eV9jcCA9IHl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfY3BvczsKKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eWctPnl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlOwogCQkJZ290byB5eV9maW5kX2FjdGlvbjsKIAogY2FzZSAxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTgxICJzY2FubmVyLmwiCisjbGluZSAyNDEgInNjYW5uZXIubCIKIHJldHVybiBEU1Q7CiAJWVlfQlJFQUsKIGNhc2UgMjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE4MiAic2Nhbm5lci5sIgorI2xpbmUgMjQyICJzY2FubmVyLmwiCiByZXR1cm4gU1JDOwogCVlZX0JSRUFLCiBjYXNlIDM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxODQgInNjYW5uZXIubCIKKyNsaW5lIDI0NCAic2Nhbm5lci5sIgogcmV0dXJuIExJTks7CiAJWVlfQlJFQUsKIGNhc2UgNDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE4NSAic2Nhbm5lci5sIgorI2xpbmUgMjQ1ICJzY2FubmVyLmwiCiByZXR1cm4gTElOSzsKIAlZWV9CUkVBSwogY2FzZSA1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTg2ICJzY2FubmVyLmwiCisjbGluZSAyNDYgInNjYW5uZXIubCIKIHJldHVybiBBUlA7CiAJWVlfQlJFQUsKIGNhc2UgNjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE4NyAic2Nhbm5lci5sIgorI2xpbmUgMjQ3ICJzY2FubmVyLmwiCiByZXR1cm4gUkFSUDsKIAlZWV9CUkVBSwogY2FzZSA3OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTg4ICJzY2FubmVyLmwiCisjbGluZSAyNDggInNjYW5uZXIubCIKIHJldHVybiBJUDsKIAlZWV9CUkVBSwogY2FzZSA4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTg5ICJzY2FubmVyLmwiCisjbGluZSAyNDkgInNjYW5uZXIubCIKIHJldHVybiBTQ1RQOwogCVlZX0JSRUFLCiBjYXNlIDk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxOTAgInNjYW5uZXIubCIKKyNsaW5lIDI1MCAic2Nhbm5lci5sIgogcmV0dXJuIFRDUDsKIAlZWV9CUkVBSwogY2FzZSAxMDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE5MSAic2Nhbm5lci5sIgorI2xpbmUgMjUxICJzY2FubmVyLmwiCiByZXR1cm4gVURQOwogCVlZX0JSRUFLCiBjYXNlIDExOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTkyICJzY2FubmVyLmwiCisjbGluZSAyNTIgInNjYW5uZXIubCIKIHJldHVybiBJQ01QOwogCVlZX0JSRUFLCiBjYXNlIDEyOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTkzICJzY2FubmVyLmwiCisjbGluZSAyNTMgInNjYW5uZXIubCIKIHJldHVybiBJR01QOwogCVlZX0JSRUFLCiBjYXNlIDEzOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTk0ICJzY2FubmVyLmwiCisjbGluZSAyNTQgInNjYW5uZXIubCIKIHJldHVybiBJR1JQOwogCVlZX0JSRUFLCiBjYXNlIDE0OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTk1ICJzY2FubmVyLmwiCisjbGluZSAyNTUgInNjYW5uZXIubCIKIHJldHVybiBQSU07CiAJWVlfQlJFQUsKIGNhc2UgMTU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxOTYgInNjYW5uZXIubCIKKyNsaW5lIDI1NiAic2Nhbm5lci5sIgogcmV0dXJuIFZSUlA7CiAJWVlfQlJFQUsKIGNhc2UgMTY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxOTcgInNjYW5uZXIubCIKKyNsaW5lIDI1NyAic2Nhbm5lci5sIgogcmV0dXJuIENBUlA7CiAJWVlfQlJFQUsKIGNhc2UgMTc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxOTggInNjYW5uZXIubCIKKyNsaW5lIDI1OCAic2Nhbm5lci5sIgogcmV0dXJuIFJBRElPOwogCVlZX0JSRUFLCiBjYXNlIDE4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjAwICJzY2FubmVyLmwiCisjbGluZSAyNjAgInNjYW5uZXIubCIKIHJldHVybiBJUFY2OwogCVlZX0JSRUFLCiBjYXNlIDE5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjAxICJzY2FubmVyLmwiCisjbGluZSAyNjEgInNjYW5uZXIubCIKIHJldHVybiBJQ01QVjY7CiAJWVlfQlJFQUsKIGNhc2UgMjA6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDIgInNjYW5uZXIubCIKKyNsaW5lIDI2MiAic2Nhbm5lci5sIgogcmV0dXJuIEFIOwogCVlZX0JSRUFLCiBjYXNlIDIxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjAzICJzY2FubmVyLmwiCisjbGluZSAyNjMgInNjYW5uZXIubCIKIHJldHVybiBFU1A7CiAJWVlfQlJFQUsKIGNhc2UgMjI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDUgInNjYW5uZXIubCIKKyNsaW5lIDI2NSAic2Nhbm5lci5sIgogcmV0dXJuIEFUQUxLOwogCVlZX0JSRUFLCiBjYXNlIDIzOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjA2ICJzY2FubmVyLmwiCisjbGluZSAyNjYgInNjYW5uZXIubCIKIHJldHVybiBBQVJQOwogCVlZX0JSRUFLCiBjYXNlIDI0OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjA3ICJzY2FubmVyLmwiCisjbGluZSAyNjcgInNjYW5uZXIubCIKIHJldHVybiBERUNORVQ7CiAJWVlfQlJFQUsKIGNhc2UgMjU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDggInNjYW5uZXIubCIKKyNsaW5lIDI2OCAic2Nhbm5lci5sIgogcmV0dXJuIExBVDsKIAlZWV9CUkVBSwogY2FzZSAyNjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIwOSAic2Nhbm5lci5sIgorI2xpbmUgMjY5ICJzY2FubmVyLmwiCiByZXR1cm4gU0NBOwogCVlZX0JSRUFLCiBjYXNlIDI3OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjEwICJzY2FubmVyLmwiCisjbGluZSAyNzAgInNjYW5uZXIubCIKIHJldHVybiBNT1BSQzsKIAlZWV9CUkVBSwogY2FzZSAyODoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIxMSAic2Nhbm5lci5sIgorI2xpbmUgMjcxICJzY2FubmVyLmwiCiByZXR1cm4gTU9QREw7CiAJWVlfQlJFQUsKIGNhc2UgMjk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMTMgInNjYW5uZXIubCIKKyNsaW5lIDI3MyAic2Nhbm5lci5sIgogcmV0dXJuIElTTzsKIAlZWV9CUkVBSwogY2FzZSAzMDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIxNCAic2Nhbm5lci5sIgorI2xpbmUgMjc0ICJzY2FubmVyLmwiCiByZXR1cm4gRVNJUzsKIAlZWV9CUkVBSwogY2FzZSAzMToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIxNSAic2Nhbm5lci5sIgorI2xpbmUgMjc1ICJzY2FubmVyLmwiCiByZXR1cm4gRVNJUzsKIAlZWV9CUkVBSwogY2FzZSAzMjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIxNiAic2Nhbm5lci5sIgorI2xpbmUgMjc2ICJzY2FubmVyLmwiCiByZXR1cm4gSVNJUzsKIAlZWV9CUkVBSwogY2FzZSAzMzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIxNyAic2Nhbm5lci5sIgorI2xpbmUgMjc3ICJzY2FubmVyLmwiCiByZXR1cm4gSVNJUzsKIAlZWV9CUkVBSwogY2FzZSAzNDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIxOCAic2Nhbm5lci5sIgorI2xpbmUgMjc4ICJzY2FubmVyLmwiCiByZXR1cm4gTDE7CiAJWVlfQlJFQUsKIGNhc2UgMzU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMTkgInNjYW5uZXIubCIKKyNsaW5lIDI3OSAic2Nhbm5lci5sIgogcmV0dXJuIEwyOwogCVlZX0JSRUFLCiBjYXNlIDM2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjIwICJzY2FubmVyLmwiCisjbGluZSAyODAgInNjYW5uZXIubCIKIHJldHVybiBJSUg7CiAJWVlfQlJFQUsKIGNhc2UgMzc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMjEgInNjYW5uZXIubCIKKyNsaW5lIDI4MSAic2Nhbm5lci5sIgogcmV0dXJuIExTUDsKIAlZWV9CUkVBSwogY2FzZSAzODoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIyMiAic2Nhbm5lci5sIgorI2xpbmUgMjgyICJzY2FubmVyLmwiCiByZXR1cm4gU05QOwogCVlZX0JSRUFLCiBjYXNlIDM5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjIzICJzY2FubmVyLmwiCisjbGluZSAyODMgInNjYW5uZXIubCIKIHJldHVybiBDU05QOwogCVlZX0JSRUFLCiBjYXNlIDQwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjI0ICJzY2FubmVyLmwiCisjbGluZSAyODQgInNjYW5uZXIubCIKIHJldHVybiBQU05QOwogCVlZX0JSRUFLCiBjYXNlIDQxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjI2ICJzY2FubmVyLmwiCisjbGluZSAyODYgInNjYW5uZXIubCIKIHJldHVybiBDTE5QOwogCVlZX0JSRUFLCiBjYXNlIDQyOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjI4ICJzY2FubmVyLmwiCisjbGluZSAyODggInNjYW5uZXIubCIKIHJldHVybiBTVFA7CiAJWVlfQlJFQUsKIGNhc2UgNDM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMzAgInNjYW5uZXIubCIKKyNsaW5lIDI5MCAic2Nhbm5lci5sIgogcmV0dXJuIElQWDsKIAlZWV9CUkVBSwogY2FzZSA0NDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIzMiAic2Nhbm5lci5sIgorI2xpbmUgMjkyICJzY2FubmVyLmwiCiByZXR1cm4gTkVUQkVVSTsKIAlZWV9CUkVBSwogY2FzZSA0NToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIzNCAic2Nhbm5lci5sIgorI2xpbmUgMjk0ICJzY2FubmVyLmwiCiByZXR1cm4gSE9TVDsKIAlZWV9CUkVBSwogY2FzZSA0NjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIzNSAic2Nhbm5lci5sIgorI2xpbmUgMjk1ICJzY2FubmVyLmwiCiByZXR1cm4gTkVUOwogCVlZX0JSRUFLCiBjYXNlIDQ3OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjM2ICJzY2FubmVyLmwiCisjbGluZSAyOTYgInNjYW5uZXIubCIKIHJldHVybiBORVRNQVNLOwogCVlZX0JSRUFLCiBjYXNlIDQ4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjM3ICJzY2FubmVyLmwiCisjbGluZSAyOTcgInNjYW5uZXIubCIKIHJldHVybiBQT1JUOwogCVlZX0JSRUFLCiBjYXNlIDQ5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjM4ICJzY2FubmVyLmwiCisjbGluZSAyOTggInNjYW5uZXIubCIKIHJldHVybiBQT1JUUkFOR0U7CiAJWVlfQlJFQUsKIGNhc2UgNTA6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMzkgInNjYW5uZXIubCIKKyNsaW5lIDI5OSAic2Nhbm5lci5sIgogcmV0dXJuIFBST1RPOwogCVlZX0JSRUFLCiBjYXNlIDUxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjQwICJzY2FubmVyLmwiCisjbGluZSAzMDAgInNjYW5uZXIubCIKIHsKICNpZmRlZiBOT19QUk9UT0NIQUlOCi0JCSAgYnBmX2Vycm9yKCIlcyBub3Qgc3VwcG9ydGVkIiwgcGNhcF90ZXh0KTsKKwkJICBicGZfZXJyb3IoeXlleHRyYSwgIiVzIG5vdCBzdXBwb3J0ZWQiLCB5eXRleHQpOwogI2Vsc2UKIAkJICByZXR1cm4gUFJPVE9DSEFJTjsKICNlbmRpZgpAQCAtMzMwOCw1NzUgKzMzODMsNTc1IEBACiAJWVlfQlJFQUsKIGNhc2UgNTI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNDggInNjYW5uZXIubCIKKyNsaW5lIDMwOCAic2Nhbm5lci5sIgogcmV0dXJuIEdBVEVXQVk7CiAJWVlfQlJFQUsKIGNhc2UgNTM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNTAgInNjYW5uZXIubCIKKyNsaW5lIDMxMCAic2Nhbm5lci5sIgogcmV0dXJuIFRZUEU7CiAJWVlfQlJFQUsKIGNhc2UgNTQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNTEgInNjYW5uZXIubCIKKyNsaW5lIDMxMSAic2Nhbm5lci5sIgogcmV0dXJuIFNVQlRZUEU7CiAJWVlfQlJFQUsKIGNhc2UgNTU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNTIgInNjYW5uZXIubCIKKyNsaW5lIDMxMiAic2Nhbm5lci5sIgogcmV0dXJuIERJUjsKIAlZWV9CUkVBSwogY2FzZSA1NjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI1MyAic2Nhbm5lci5sIgorI2xpbmUgMzEzICJzY2FubmVyLmwiCiByZXR1cm4gQUREUjE7CiAJWVlfQlJFQUsKIGNhc2UgNTc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNTQgInNjYW5uZXIubCIKKyNsaW5lIDMxNCAic2Nhbm5lci5sIgogcmV0dXJuIEFERFIyOwogCVlZX0JSRUFLCiBjYXNlIDU4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjU1ICJzY2FubmVyLmwiCisjbGluZSAzMTUgInNjYW5uZXIubCIKIHJldHVybiBBRERSMzsKIAlZWV9CUkVBSwogY2FzZSA1OToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI1NiAic2Nhbm5lci5sIgorI2xpbmUgMzE2ICJzY2FubmVyLmwiCiByZXR1cm4gQUREUjQ7CiAJWVlfQlJFQUsKIGNhc2UgNjA6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNTcgInNjYW5uZXIubCIKKyNsaW5lIDMxNyAic2Nhbm5lci5sIgogcmV0dXJuIFJBOwogCVlZX0JSRUFLCiBjYXNlIDYxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjU4ICJzY2FubmVyLmwiCisjbGluZSAzMTggInNjYW5uZXIubCIKIHJldHVybiBUQTsKIAlZWV9CUkVBSwogY2FzZSA2MjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI2MCAic2Nhbm5lci5sIgorI2xpbmUgMzIwICJzY2FubmVyLmwiCiByZXR1cm4gTEVTUzsKIAlZWV9CUkVBSwogY2FzZSA2MzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI2MSAic2Nhbm5lci5sIgorI2xpbmUgMzIxICJzY2FubmVyLmwiCiByZXR1cm4gR1JFQVRFUjsKIAlZWV9CUkVBSwogY2FzZSA2NDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI2MiAic2Nhbm5lci5sIgorI2xpbmUgMzIyICJzY2FubmVyLmwiCiByZXR1cm4gQ0JZVEU7CiAJWVlfQlJFQUsKIGNhc2UgNjU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNjMgInNjYW5uZXIubCIKKyNsaW5lIDMyMyAic2Nhbm5lci5sIgogcmV0dXJuIFRLX0JST0FEQ0FTVDsKIAlZWV9CUkVBSwogY2FzZSA2NjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI2NCAic2Nhbm5lci5sIgorI2xpbmUgMzI0ICJzY2FubmVyLmwiCiByZXR1cm4gVEtfTVVMVElDQVNUOwogCVlZX0JSRUFLCiBjYXNlIDY3OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjY2ICJzY2FubmVyLmwiCisjbGluZSAzMjYgInNjYW5uZXIubCIKIHJldHVybiBBTkQ7CiAJWVlfQlJFQUsKIGNhc2UgNjg6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNjcgInNjYW5uZXIubCIKKyNsaW5lIDMyNyAic2Nhbm5lci5sIgogcmV0dXJuIE9SOwogCVlZX0JSRUFLCiBjYXNlIDY5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjY4ICJzY2FubmVyLmwiCisjbGluZSAzMjggInNjYW5uZXIubCIKIHJldHVybiAnISc7CiAJWVlfQlJFQUsKIGNhc2UgNzA6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNzAgInNjYW5uZXIubCIKKyNsaW5lIDMzMCAic2Nhbm5lci5sIgogcmV0dXJuIExFTjsKIAlZWV9CUkVBSwogY2FzZSA3MToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI3MSAic2Nhbm5lci5sIgorI2xpbmUgMzMxICJzY2FubmVyLmwiCiByZXR1cm4gSU5CT1VORDsKIAlZWV9CUkVBSwogY2FzZSA3MjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI3MiAic2Nhbm5lci5sIgorI2xpbmUgMzMyICJzY2FubmVyLmwiCiByZXR1cm4gT1VUQk9VTkQ7CiAJWVlfQlJFQUsKIGNhc2UgNzM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNzQgInNjYW5uZXIubCIKKyNsaW5lIDMzNCAic2Nhbm5lci5sIgogcmV0dXJuIFZMQU47CiAJWVlfQlJFQUsKIGNhc2UgNzQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNzUgInNjYW5uZXIubCIKKyNsaW5lIDMzNSAic2Nhbm5lci5sIgogcmV0dXJuIE1QTFM7CiAJWVlfQlJFQUsKIGNhc2UgNzU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyNzYgInNjYW5uZXIubCIKKyNsaW5lIDMzNiAic2Nhbm5lci5sIgogcmV0dXJuIFBQUE9FRDsKIAlZWV9CUkVBSwogY2FzZSA3NjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI3NyAic2Nhbm5lci5sIgorI2xpbmUgMzM3ICJzY2FubmVyLmwiCiByZXR1cm4gUFBQT0VTOwogCVlZX0JSRUFLCiBjYXNlIDc3OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjc4ICJzY2FubmVyLmwiCisjbGluZSAzMzggInNjYW5uZXIubCIKIHJldHVybiBHRU5FVkU7CiAJWVlfQlJFQUsKIGNhc2UgNzg6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyODAgInNjYW5uZXIubCIKKyNsaW5lIDM0MCAic2Nhbm5lci5sIgogcmV0dXJuIExBTkU7CiAJWVlfQlJFQUsKIGNhc2UgNzk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyODEgInNjYW5uZXIubCIKKyNsaW5lIDM0MSAic2Nhbm5lci5sIgogcmV0dXJuIExMQzsKIAlZWV9CUkVBSwogY2FzZSA4MDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI4MiAic2Nhbm5lci5sIgorI2xpbmUgMzQyICJzY2FubmVyLmwiCiByZXR1cm4gTUVUQUM7CiAJWVlfQlJFQUsKIGNhc2UgODE6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyODMgInNjYW5uZXIubCIKKyNsaW5lIDM0MyAic2Nhbm5lci5sIgogcmV0dXJuIEJDQzsKIAlZWV9CUkVBSwogY2FzZSA4MjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI4NCAic2Nhbm5lci5sIgorI2xpbmUgMzQ0ICJzY2FubmVyLmwiCiByZXR1cm4gT0FNOwogCVlZX0JSRUFLCiBjYXNlIDgzOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjg1ICJzY2FubmVyLmwiCisjbGluZSAzNDUgInNjYW5uZXIubCIKIHJldHVybiBPQU1GNDsKIAlZWV9CUkVBSwogY2FzZSA4NDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI4NiAic2Nhbm5lci5sIgorI2xpbmUgMzQ2ICJzY2FubmVyLmwiCiByZXR1cm4gT0FNRjRFQzsKIAlZWV9CUkVBSwogY2FzZSA4NToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI4NyAic2Nhbm5lci5sIgorI2xpbmUgMzQ3ICJzY2FubmVyLmwiCiByZXR1cm4gT0FNRjRTQzsKIAlZWV9CUkVBSwogY2FzZSA4NjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI4OCAic2Nhbm5lci5sIgorI2xpbmUgMzQ4ICJzY2FubmVyLmwiCiByZXR1cm4gU0M7CiAJWVlfQlJFQUsKIGNhc2UgODc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyODkgInNjYW5uZXIubCIKKyNsaW5lIDM0OSAic2Nhbm5lci5sIgogcmV0dXJuIElMTUlDOwogCVlZX0JSRUFLCiBjYXNlIDg4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjkwICJzY2FubmVyLmwiCisjbGluZSAzNTAgInNjYW5uZXIubCIKIHJldHVybiBWUEk7CiAJWVlfQlJFQUsKIGNhc2UgODk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyOTEgInNjYW5uZXIubCIKKyNsaW5lIDM1MSAic2Nhbm5lci5sIgogcmV0dXJuIFZDSTsKIAlZWV9CUkVBSwogY2FzZSA5MDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI5MiAic2Nhbm5lci5sIgorI2xpbmUgMzUyICJzY2FubmVyLmwiCiByZXR1cm4gQ09OTkVDVE1TRzsKIAlZWV9CUkVBSwogY2FzZSA5MToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI5MyAic2Nhbm5lci5sIgorI2xpbmUgMzUzICJzY2FubmVyLmwiCiByZXR1cm4gTUVUQUNPTk5FQ1Q7CiAJWVlfQlJFQUsKIGNhc2UgOTI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyOTUgInNjYW5uZXIubCIKKyNsaW5lIDM1NSAic2Nhbm5lci5sIgogcmV0dXJuIFBGX0lGTkFNRTsKIAlZWV9CUkVBSwogY2FzZSA5MzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI5NiAic2Nhbm5lci5sIgorI2xpbmUgMzU2ICJzY2FubmVyLmwiCiByZXR1cm4gUEZfUlNFVDsKIAlZWV9CUkVBSwogY2FzZSA5NDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDI5NyAic2Nhbm5lci5sIgorI2xpbmUgMzU3ICJzY2FubmVyLmwiCiByZXR1cm4gUEZfUk5SOwogCVlZX0JSRUFLCiBjYXNlIDk1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjk4ICJzY2FubmVyLmwiCisjbGluZSAzNTggInNjYW5uZXIubCIKIHJldHVybiBQRl9TUk5SOwogCVlZX0JSRUFLCiBjYXNlIDk2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjk5ICJzY2FubmVyLmwiCisjbGluZSAzNTkgInNjYW5uZXIubCIKIHJldHVybiBQRl9SRUFTT047CiAJWVlfQlJFQUsKIGNhc2UgOTc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMDAgInNjYW5uZXIubCIKKyNsaW5lIDM2MCAic2Nhbm5lci5sIgogcmV0dXJuIFBGX0FDVElPTjsKIAlZWV9CUkVBSwogY2FzZSA5ODoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMwMiAic2Nhbm5lci5sIgorI2xpbmUgMzYyICJzY2FubmVyLmwiCiByZXR1cm4gRklTVTsKIAlZWV9CUkVBSwogY2FzZSA5OToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMwMyAic2Nhbm5lci5sIgorI2xpbmUgMzYzICJzY2FubmVyLmwiCiByZXR1cm4gTFNTVTsKIAlZWV9CUkVBSwogY2FzZSAxMDA6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMDQgInNjYW5uZXIubCIKKyNsaW5lIDM2NCAic2Nhbm5lci5sIgogcmV0dXJuIExTU1U7CiAJWVlfQlJFQUsKIGNhc2UgMTAxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzA1ICJzY2FubmVyLmwiCisjbGluZSAzNjUgInNjYW5uZXIubCIKIHJldHVybiBNU1U7CiAJWVlfQlJFQUsKIGNhc2UgMTAyOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzA2ICJzY2FubmVyLmwiCisjbGluZSAzNjYgInNjYW5uZXIubCIKIHJldHVybiBIRklTVTsKIAlZWV9CUkVBSwogY2FzZSAxMDM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMDcgInNjYW5uZXIubCIKKyNsaW5lIDM2NyAic2Nhbm5lci5sIgogcmV0dXJuIEhMU1NVOwogCVlZX0JSRUFLCiBjYXNlIDEwNDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMwOCAic2Nhbm5lci5sIgorI2xpbmUgMzY4ICJzY2FubmVyLmwiCiByZXR1cm4gSE1TVTsKIAlZWV9CUkVBSwogY2FzZSAxMDU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMDkgInNjYW5uZXIubCIKKyNsaW5lIDM2OSAic2Nhbm5lci5sIgogcmV0dXJuIFNJTzsKIAlZWV9CUkVBSwogY2FzZSAxMDY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMTAgInNjYW5uZXIubCIKKyNsaW5lIDM3MCAic2Nhbm5lci5sIgogcmV0dXJuIE9QQzsKIAlZWV9CUkVBSwogY2FzZSAxMDc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMTEgInNjYW5uZXIubCIKKyNsaW5lIDM3MSAic2Nhbm5lci5sIgogcmV0dXJuIERQQzsKIAlZWV9CUkVBSwogY2FzZSAxMDg6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMTIgInNjYW5uZXIubCIKKyNsaW5lIDM3MiAic2Nhbm5lci5sIgogcmV0dXJuIFNMUzsKIAlZWV9CUkVBSwogY2FzZSAxMDk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMTMgInNjYW5uZXIubCIKKyNsaW5lIDM3MyAic2Nhbm5lci5sIgogcmV0dXJuIEhTSU87CiAJWVlfQlJFQUsKIGNhc2UgMTEwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzE0ICJzY2FubmVyLmwiCisjbGluZSAzNzQgInNjYW5uZXIubCIKIHJldHVybiBIT1BDOwogCVlZX0JSRUFLCiBjYXNlIDExMToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMxNSAic2Nhbm5lci5sIgorI2xpbmUgMzc1ICJzY2FubmVyLmwiCiByZXR1cm4gSERQQzsKIAlZWV9CUkVBSwogY2FzZSAxMTI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMTYgInNjYW5uZXIubCIKKyNsaW5lIDM3NiAic2Nhbm5lci5sIgogcmV0dXJuIEhTTFM7CiAJWVlfQlJFQUsKIGNhc2UgMTEzOgogLyogcnVsZSAxMTMgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzE4ICJzY2FubmVyLmwiCisjbGluZSAzNzggInNjYW5uZXIubCIKIDsKIAlZWV9CUkVBSwogY2FzZSAxMTQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMTkgInNjYW5uZXIubCIKLXJldHVybiBwY2FwX3RleHRbMF07CisjbGluZSAzNzkgInNjYW5uZXIubCIKK3JldHVybiB5eXRleHRbMF07CiAJWVlfQlJFQUsKIGNhc2UgMTE1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzIwICJzY2FubmVyLmwiCisjbGluZSAzODAgInNjYW5uZXIubCIKIHJldHVybiBHRVE7CiAJWVlfQlJFQUsKIGNhc2UgMTE2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzIxICJzY2FubmVyLmwiCisjbGluZSAzODEgInNjYW5uZXIubCIKIHJldHVybiBMRVE7CiAJWVlfQlJFQUsKIGNhc2UgMTE3OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzIyICJzY2FubmVyLmwiCisjbGluZSAzODIgInNjYW5uZXIubCIKIHJldHVybiBORVE7CiAJWVlfQlJFQUsKIGNhc2UgMTE4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzIzICJzY2FubmVyLmwiCisjbGluZSAzODMgInNjYW5uZXIubCIKIHJldHVybiAnPSc7CiAJWVlfQlJFQUsKIGNhc2UgMTE5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzI0ICJzY2FubmVyLmwiCisjbGluZSAzODQgInNjYW5uZXIubCIKIHJldHVybiBMU0g7CiAJWVlfQlJFQUsKIGNhc2UgMTIwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzI1ICJzY2FubmVyLmwiCisjbGluZSAzODUgInNjYW5uZXIubCIKIHJldHVybiBSU0g7CiAJWVlfQlJFQUsKIGNhc2UgMTIxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzI2ICJzY2FubmVyLmwiCi17IHl5bHZhbC5lID0gcGNhcF9ldGhlcl9hdG9uKCgoY2hhciAqKXBjYXBfdGV4dCkrMSk7Ci0JCQkgIGlmICh5eWx2YWwuZSA9PSBOVUxMKQotCQkJCWJwZl9lcnJvcigibWFsbG9jIik7CisjbGluZSAzODYgInNjYW5uZXIubCIKK3sgeXlsdmFsLT5lID0gcGNhcF9ldGhlcl9hdG9uKCgoY2hhciAqKXl5dGV4dCkrMSk7CisJCQkgIGlmICh5eWx2YWwtPmUgPT0gTlVMTCkKKwkJCQlicGZfZXJyb3IoeXlleHRyYSwgIm1hbGxvYyIpOwogCQkJICByZXR1cm4gQUlEOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTIyOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzMwICJzY2FubmVyLmwiCi17IHl5bHZhbC5lID0gcGNhcF9ldGhlcl9hdG9uKChjaGFyICopcGNhcF90ZXh0KTsKLQkJCSAgaWYgKHl5bHZhbC5lID09IE5VTEwpCi0JCQkJYnBmX2Vycm9yKCJtYWxsb2MiKTsKKyNsaW5lIDM5MCAic2Nhbm5lci5sIgoreyB5eWx2YWwtPmUgPSBwY2FwX2V0aGVyX2F0b24oKGNoYXIgKil5eXRleHQpOworCQkJICBpZiAoeXlsdmFsLT5lID09IE5VTEwpCisJCQkJYnBmX2Vycm9yKHl5ZXh0cmEsICJtYWxsb2MiKTsKIAkJCSAgcmV0dXJuIEVJRDsgfQogCVlZX0JSRUFLCiBjYXNlIDEyMzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDMzNCAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IHN0b2koKGNoYXIgKilwY2FwX3RleHQpOyByZXR1cm4gTlVNOyB9CisjbGluZSAzOTQgInNjYW5uZXIubCIKK3sgeXlsdmFsLT5pID0gc3RvaSgoY2hhciAqKXl5dGV4dCk7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxMjQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMzUgInNjYW5uZXIubCIKKyNsaW5lIDM5NSAic2Nhbm5lci5sIgogewotCQkJeXlsdmFsLnMgPSBzZHVwKChjaGFyICopcGNhcF90ZXh0KTsgcmV0dXJuIEhJRDsgfQorCQkJeXlsdmFsLT5zID0gc2R1cCh5eWV4dHJhLCAoY2hhciAqKXl5dGV4dCk7IHJldHVybiBISUQ7IH0KIAlZWV9CUkVBSwogY2FzZSAxMjU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzMzcgInNjYW5uZXIubCIKKyNsaW5lIDM5NyAic2Nhbm5lci5sIgogewogI2lmZGVmIElORVQ2CiAJCQkgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlczsKIAkJCSAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CiAJCQkgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OwogCQkJICBoaW50cy5haV9mbGFncyA9IEFJX05VTUVSSUNIT1NUOwotCQkJICBpZiAoZ2V0YWRkcmluZm8ocGNhcF90ZXh0LCBOVUxMLCAmaGludHMsICZyZXMpKQotCQkJCWJwZl9lcnJvcigiYm9ndXMgSVB2NiBhZGRyZXNzICVzIiwgcGNhcF90ZXh0KTsKKwkJCSAgaWYgKGdldGFkZHJpbmZvKHl5dGV4dCwgTlVMTCwgJmhpbnRzLCAmcmVzKSkKKwkJCQlicGZfZXJyb3IoeXlleHRyYSwgImJvZ3VzIElQdjYgYWRkcmVzcyAlcyIsIHl5dGV4dCk7CiAJCQkgIGVsc2UgewogCQkJCWZyZWVhZGRyaW5mbyhyZXMpOwotCQkJCXl5bHZhbC5zID0gc2R1cCgoY2hhciAqKXBjYXBfdGV4dCk7IHJldHVybiBISUQ2OworCQkJCXl5bHZhbC0+cyA9IHNkdXAoeXlleHRyYSwgKGNoYXIgKil5eXRleHQpOyByZXR1cm4gSElENjsKIAkJCSAgfQogI2Vsc2UKLQkJCSAgYnBmX2Vycm9yKCJJUHY2IGFkZHJlc3MgJXMgbm90IHN1cHBvcnRlZCIsIHBjYXBfdGV4dCk7CisJCQkgIGJwZl9lcnJvcih5eWV4dHJhLCAiSVB2NiBhZGRyZXNzICVzIG5vdCBzdXBwb3J0ZWQiLCB5eXRleHQpOwogI2VuZGlmIC8qSU5FVDYqLwogCQkJfQogCVlZX0JSRUFLCiBjYXNlIDEyNjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM1MyAic2Nhbm5lci5sIgoteyBicGZfZXJyb3IoImJvZ3VzIGV0aGVybmV0IGFkZHJlc3MgJXMiLCBwY2FwX3RleHQpOyB9CisjbGluZSA0MTMgInNjYW5uZXIubCIKK3sgYnBmX2Vycm9yKHl5ZXh0cmEsICJib2d1cyBldGhlcm5ldCBhZGRyZXNzICVzIiwgeXl0ZXh0KTsgfQogCVlZX0JSRUFLCiBjYXNlIDEyNzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM1NCAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDA7IHJldHVybiBOVU07IH0KKyNsaW5lIDQxNCAic2Nhbm5lci5sIgoreyB5eWx2YWwtPmkgPSAwOyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTI4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzU1ICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMTsgcmV0dXJuIE5VTTsgfQorI2xpbmUgNDE1ICJzY2FubmVyLmwiCit7IHl5bHZhbC0+aSA9IDE7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxMjk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNTYgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAwOyByZXR1cm4gTlVNOyB9CisjbGluZSA0MTYgInNjYW5uZXIubCIKK3sgeXlsdmFsLT5pID0gMDsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDEzMDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM1NyAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDM7IHJldHVybiBOVU07IH0KKyNsaW5lIDQxNyAic2Nhbm5lci5sIgoreyB5eWx2YWwtPmkgPSAzOyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTMxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzU4ICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gNDsgcmV0dXJuIE5VTTsgfQorI2xpbmUgNDE4ICJzY2FubmVyLmwiCit7IHl5bHZhbC0+aSA9IDQ7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxMzI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNTkgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSA1OyByZXR1cm4gTlVNOyB9CisjbGluZSA0MTkgInNjYW5uZXIubCIKK3sgeXlsdmFsLT5pID0gNTsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDEzMzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM2MCAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDg7IHJldHVybiBOVU07IH0KKyNsaW5lIDQyMCAic2Nhbm5lci5sIgoreyB5eWx2YWwtPmkgPSA4OyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTM0OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzYxICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gOTsgcmV0dXJuIE5VTTsgfQorI2xpbmUgNDIxICJzY2FubmVyLmwiCit7IHl5bHZhbC0+aSA9IDk7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxMzU6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNjIgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAxMDsgcmV0dXJuIE5VTTsgfQorI2xpbmUgNDIyICJzY2FubmVyLmwiCit7IHl5bHZhbC0+aSA9IDEwOyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTM2OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzYzICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMTE7IHJldHVybiBOVU07IH0KKyNsaW5lIDQyMyAic2Nhbm5lci5sIgoreyB5eWx2YWwtPmkgPSAxMTsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDEzNzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM2NCAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDEyOyByZXR1cm4gTlVNOyB9CisjbGluZSA0MjQgInNjYW5uZXIubCIKK3sgeXlsdmFsLT5pID0gMTI7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxMzg6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNjUgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAxMzsgcmV0dXJuIE5VTTsgfQorI2xpbmUgNDI1ICJzY2FubmVyLmwiCit7IHl5bHZhbC0+aSA9IDEzOyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTM5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzY2ICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMTQ7IHJldHVybiBOVU07IH0KKyNsaW5lIDQyNiAic2Nhbm5lci5sIgoreyB5eWx2YWwtPmkgPSAxNDsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDE0MDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM2NyAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDE1OyByZXR1cm4gTlVNOyB9CisjbGluZSA0MjcgInNjYW5uZXIubCIKK3sgeXlsdmFsLT5pID0gMTU7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxNDE6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNjggInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAxNjsgcmV0dXJuIE5VTTsgfQorI2xpbmUgNDI4ICJzY2FubmVyLmwiCit7IHl5bHZhbC0+aSA9IDE2OyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTQyOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzY5ICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMTc7IHJldHVybiBOVU07IH0KKyNsaW5lIDQyOSAic2Nhbm5lci5sIgoreyB5eWx2YWwtPmkgPSAxNzsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDE0MzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM3MCAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDE4OyByZXR1cm4gTlVNOyB9CisjbGluZSA0MzAgInNjYW5uZXIubCIKK3sgeXlsdmFsLT5pID0gMTg7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxNDQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNzEgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAxMzsgcmV0dXJuIE5VTTsgfQorI2xpbmUgNDMxICJzY2FubmVyLmwiCit7IHl5bHZhbC0+aSA9IDEzOyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTQ1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzcyICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMHgwMTsgcmV0dXJuIE5VTTsgfQorI2xpbmUgNDMyICJzY2FubmVyLmwiCit7IHl5bHZhbC0+aSA9IDB4MDE7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxNDY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNzMgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAweDAyOyByZXR1cm4gTlVNOyB9CisjbGluZSA0MzMgInNjYW5uZXIubCIKK3sgeXlsdmFsLT5pID0gMHgwMjsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDE0NzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM3NCAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDB4MDQ7IHJldHVybiBOVU07IH0KKyNsaW5lIDQzNCAic2Nhbm5lci5sIgoreyB5eWx2YWwtPmkgPSAweDA0OyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTQ4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzc1ICJzY2FubmVyLmwiCi17IHl5bHZhbC5pID0gMHgwODsgcmV0dXJuIE5VTTsgfQorI2xpbmUgNDM1ICJzY2FubmVyLmwiCit7IHl5bHZhbC0+aSA9IDB4MDg7IHJldHVybiBOVU07IH0KIAlZWV9CUkVBSwogY2FzZSAxNDk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzNzYgInNjYW5uZXIubCIKLXsgeXlsdmFsLmkgPSAweDEwOyByZXR1cm4gTlVNOyB9CisjbGluZSA0MzYgInNjYW5uZXIubCIKK3sgeXlsdmFsLT5pID0gMHgxMDsgcmV0dXJuIE5VTTsgfQogCVlZX0JSRUFLCiBjYXNlIDE1MDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM3NyAic2Nhbm5lci5sIgoteyB5eWx2YWwuaSA9IDB4MjA7IHJldHVybiBOVU07IH0KKyNsaW5lIDQzNyAic2Nhbm5lci5sIgoreyB5eWx2YWwtPmkgPSAweDIwOyByZXR1cm4gTlVNOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTUxOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzc4ICJzY2FubmVyLmwiCisjbGluZSA0MzggInNjYW5uZXIubCIKIHsKLQkJCSB5eWx2YWwucyA9IHNkdXAoKGNoYXIgKilwY2FwX3RleHQpOyByZXR1cm4gSUQ7IH0KKwkJCSB5eWx2YWwtPnMgPSBzZHVwKHl5ZXh0cmEsIChjaGFyICopeXl0ZXh0KTsgcmV0dXJuIElEOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTUyOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzgwICJzY2FubmVyLmwiCi17IHl5bHZhbC5zID0gc2R1cCgoY2hhciAqKXBjYXBfdGV4dCArIDEpOyByZXR1cm4gSUQ7IH0KKyNsaW5lIDQ0MCAic2Nhbm5lci5sIgoreyB5eWx2YWwtPnMgPSBzZHVwKHl5ZXh0cmEsIChjaGFyICopeXl0ZXh0ICsgMSk7IHJldHVybiBJRDsgfQogCVlZX0JSRUFLCiBjYXNlIDE1MzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDM4MSAic2Nhbm5lci5sIgorI2xpbmUgNDQxICJzY2FubmVyLmwiCiB7Ci0JCQlicGZfZXJyb3IoImlsbGVnYWwgdG9rZW46ICVzIiwgcGNhcF90ZXh0KTsgfQorCQkJYnBmX2Vycm9yKHl5ZXh0cmEsICJpbGxlZ2FsIHRva2VuOiAlcyIsIHl5dGV4dCk7IH0KIAlZWV9CUkVBSwogY2FzZSAxNTQ6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAzODMgInNjYW5uZXIubCIKLXsgYnBmX2Vycm9yKCJpbGxlZ2FsIGNoYXIgJyVjJyIsICpwY2FwX3RleHQpOyB9CisjbGluZSA0NDMgInNjYW5uZXIubCIKK3sgYnBmX2Vycm9yKHl5ZXh0cmEsICJpbGxlZ2FsIGNoYXIgJyVjJyIsICp5eXRleHQpOyB9CiAJWVlfQlJFQUsKIGNhc2UgMTU1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMzg0ICJzY2FubmVyLmwiCisjbGluZSA0NDQgInNjYW5uZXIubCIKIEVDSE87CiAJWVlfQlJFQUsKLSNsaW5lIDM4NTIgInNjYW5uZXIuYyIKKyNsaW5lIDM5MzAgInNjYW5uZXIuYyIKIGNhc2UgWVlfU1RBVEVfRU9GKElOSVRJQUwpOgogCXl5dGVybWluYXRlKCk7CiAKIAljYXNlIFlZX0VORF9PRl9CVUZGRVI6CiAJCXsKIAkJLyogQW1vdW50IG9mIHRleHQgbWF0Y2hlZCBub3QgaW5jbHVkaW5nIHRoZSBFT0IgY2hhci4gKi8KLQkJaW50IHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQgPSAoaW50KSAoeXlfY3AgLSAoeXl0ZXh0X3B0cikpIC0gMTsKKwkJaW50IHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQgPSAoaW50KSAoeXlfY3AgLSB5eWctPnl5dGV4dF9wdHIpIC0gMTsKIAogCQkvKiBVbmRvIHRoZSBlZmZlY3RzIG9mIFlZX0RPX0JFRk9SRV9BQ1RJT04uICovCi0JCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCQkqeXlfY3AgPSB5eWctPnl5X2hvbGRfY2hhcjsKIAkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVAogCiAJCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9ORVcgKQogCQkJewogCQkJLyogV2UncmUgc2Nhbm5pbmcgYSBuZXcgZmlsZSBvciBpbnB1dCBzb3VyY2UuICBJdCdzCiAJCQkgKiBwb3NzaWJsZSB0aGF0IHRoaXMgaGFwcGVuZWQgYmVjYXVzZSB0aGUgdXNlcgotCQkJICoganVzdCBwb2ludGVkIHBjYXBfaW4gYXQgYSBuZXcgc291cmNlIGFuZCBjYWxsZWQKKwkJCSAqIGp1c3QgcG9pbnRlZCB5eWluIGF0IGEgbmV3IHNvdXJjZSBhbmQgY2FsbGVkCiAJCQkgKiBwY2FwX2xleCgpLiAgSWYgc28sIHRoZW4gd2UgaGF2ZSB0byBhc3N1cmUKIAkJCSAqIGNvbnNpc3RlbmN5IGJldHdlZW4gWVlfQ1VSUkVOVF9CVUZGRVIgYW5kIG91cgogCQkJICogZ2xvYmFscy4gIEhlcmUgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGRvIHNvLCBiZWNhdXNlCiAJCQkgKiB0aGlzIGlzIHRoZSBmaXJzdCBhY3Rpb24gKG90aGVyIHRoYW4gcG9zc2libHkgYQogCQkJICogYmFjay11cCkgdGhhdCB3aWxsIG1hdGNoIGZvciB0aGUgbmV3IGlucHV0IHNvdXJjZS4KIAkJCSAqLwotCQkJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzOwotCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pbnB1dF9maWxlID0gcGNhcF9pbjsKKwkJCXl5Zy0+eXlfbl9jaGFycyA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZSA9IHl5aW47CiAJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTk9STUFMOwogCQkJfQogCkBAIC0zODg3LDEzICszOTYyLDEzIEBACiAJCSAqIGVuZC1vZi1idWZmZXIgc3RhdGUpLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZSB0ZXN0CiAJCSAqIGluIGlucHV0KCkuCiAJCSAqLwotCQlpZiAoICh5eV9jX2J1Zl9wKSA8PSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSApCisJCWlmICggeXlnLT55eV9jX2J1Zl9wIDw9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1Zlt5eWctPnl5X25fY2hhcnNdICkKIAkJCXsgLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLwogCQkJeXlfc3RhdGVfdHlwZSB5eV9uZXh0X3N0YXRlOwogCi0JCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0OworCQkJeXlnLT55eV9jX2J1Zl9wID0geXlnLT55eXRleHRfcHRyICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKIAotCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCB5eXNjYW5uZXIgKTsKIAogCQkJLyogT2theSwgd2UncmUgbm93IHBvc2l0aW9uZWQgdG8gbWFrZSB0aGUgTlVMCiAJCQkgKiB0cmFuc2l0aW9uLiAgV2UgY291bGRuJ3QgaGF2ZQpAQCAtMzkwNCw0MyArMzk3OSw0NCBAQAogCQkJICogd2lsbCBydW4gbW9yZSBzbG93bHkpLgogCQkJICovCiAKLQkJCXl5X25leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCB5eV9jdXJyZW50X3N0YXRlICk7CisJCQl5eV9uZXh0X3N0YXRlID0geXlfdHJ5X05VTF90cmFucyggeXlfY3VycmVudF9zdGF0ZSAsIHl5c2Nhbm5lcik7CiAKLQkJCXl5X2JwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisJCQl5eV9icCA9IHl5Zy0+eXl0ZXh0X3B0ciArIFlZX01PUkVfQURKOwogCiAJCQlpZiAoIHl5X25leHRfc3RhdGUgKQogCQkJCXsKIAkJCQkvKiBDb25zdW1lIHRoZSBOVUwuICovCi0JCQkJeXlfY3AgPSArKyh5eV9jX2J1Zl9wKTsKKwkJCQl5eV9jcCA9ICsreXlnLT55eV9jX2J1Zl9wOwogCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9uZXh0X3N0YXRlOwogCQkJCWdvdG8geXlfbWF0Y2g7CiAJCQkJfQogCiAJCQllbHNlCiAJCQkJewotCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCQkJCXl5X2NwID0geXlnLT55eV9sYXN0X2FjY2VwdGluZ19jcG9zOworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eWctPnl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlOwogCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CiAJCQkJfQogCQkJfQogCi0JCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCisJCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCB5eXNjYW5uZXIgKSApCiAJCQl7CiAJCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6CiAJCQkJewotCQkJCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMDsKKwkJCQl5eWctPnl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZiA9IDA7CiAKLQkJCQlpZiAoIHBjYXBfd3JhcCggKSApCisJCQkJaWYgKCBwY2FwX3dyYXAoeXlzY2FubmVyICkgKQogCQkJCQl7CiAJCQkJCS8qIE5vdGU6IGJlY2F1c2Ugd2UndmUgdGFrZW4gY2FyZSBpbgogCQkJCQkgKiB5eV9nZXRfbmV4dF9idWZmZXIoKSB0byBoYXZlIHNldCB1cAotCQkJCQkgKiBwY2FwX3RleHQsIHdlIGNhbiBub3cgc2V0IHVwCisJCQkJCSAqIHl5dGV4dCwgd2UgY2FuIG5vdyBzZXQgdXAKIAkJCQkJICogeXlfY19idWZfcCBzbyB0aGF0IGlmIHNvbWUgdG90YWwKIAkJCQkJICogaG9zZXIgKGxpa2UgZmxleCBpdHNlbGYpIHdhbnRzIHRvCiAJCQkJCSAqIGNhbGwgdGhlIHNjYW5uZXIgYWZ0ZXIgd2UgcmV0dXJuIHRoZQogCQkJCQkgKiBZWV9OVUxMLCBpdCdsbCBzdGlsbCB3b3JrIC0gYW5vdGhlcgogCQkJCQkgKiBZWV9OVUxMIHdpbGwgZ2V0IHJldHVybmVkLgogCQkJCQkgKi8KLQkJCQkJKHl5X2NfYnVmX3ApID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisJCQkJCXl5Zy0+eXlfY19idWZfcCA9IHl5Zy0+eXl0ZXh0X3B0ciArIFlZX01PUkVfQURKOwogCiAJCQkJCXl5X2FjdCA9IFlZX1NUQVRFX0VPRihZWV9TVEFSVCk7CiAJCQkJCWdvdG8gZG9fYWN0aW9uOwpAQCAtMzk0OCwzMCArNDAyNCwzMCBAQAogCiAJCQkJZWxzZQogCQkJCQl7Ci0JCQkJCWlmICggISAoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSApCisJCQkJCWlmICggISB5eWctPnl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZiApCiAJCQkJCQlZWV9ORVdfRklMRTsKIAkJCQkJfQogCQkJCWJyZWFrOwogCQkJCX0KIAogCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46Ci0JCQkJKHl5X2NfYnVmX3ApID0KLQkJCQkJKHl5dGV4dF9wdHIpICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKKwkJCQl5eWctPnl5X2NfYnVmX3AgPQorCQkJCQl5eWctPnl5dGV4dF9wdHIgKyB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0OwogCi0JCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggeXlzY2FubmVyICk7CiAKLQkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKLQkJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCQkJCXl5X2NwID0geXlnLT55eV9jX2J1Zl9wOworCQkJCXl5X2JwID0geXlnLT55eXRleHRfcHRyICsgWVlfTU9SRV9BREo7CiAJCQkJZ290byB5eV9tYXRjaDsKIAogCQkJY2FzZSBFT0JfQUNUX0xBU1RfTUFUQ0g6Ci0JCQkJKHl5X2NfYnVmX3ApID0KLQkJCQkmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXTsKKwkJCQl5eWctPnl5X2NfYnVmX3AgPQorCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1Zlt5eWctPnl5X25fY2hhcnNdOwogCi0JCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggeXlzY2FubmVyICk7CiAKLQkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKLQkJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCQkJCXl5X2NwID0geXlnLT55eV9jX2J1Zl9wOworCQkJCXl5X2JwID0geXlnLT55eXRleHRfcHRyICsgWVlfTU9SRV9BREo7CiAJCQkJZ290byB5eV9maW5kX2FjdGlvbjsKIAkJCX0KIAkJYnJlYWs7CkBAIC0zOTkyLDIwICs0MDY4LDIxIEBACiAgKglFT0JfQUNUX0NPTlRJTlVFX1NDQU4gLSBjb250aW51ZSBzY2FubmluZyBmcm9tIGN1cnJlbnQgcG9zaXRpb24KICAqCUVPQl9BQ1RfRU5EX09GX0ZJTEUgLSBlbmQgb2YgZmlsZQogICovCi1zdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAodm9pZCkKK3N0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyICh5eXNjYW5fdCB5eXNjYW5uZXIpCiB7Ci0gICAgCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZjsKLQlyZWdpc3RlciBjaGFyICpzb3VyY2UgPSAoeXl0ZXh0X3B0cik7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZjsKKwlyZWdpc3RlciBjaGFyICpzb3VyY2UgPSB5eWctPnl5dGV4dF9wdHI7CiAJcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlLCBpOwogCWludCByZXRfdmFsOwogCi0JaWYgKCAoeXlfY19idWZfcCkgPiAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpICsgMV0gKQorCWlmICggeXlnLT55eV9jX2J1Zl9wID4gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW3l5Zy0+eXlfbl9jaGFycyArIDFdICkKIAkJWVlfRkFUQUxfRVJST1IoCiAJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkIiApOwogCiAJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2ZpbGxfYnVmZmVyID09IDAgKQogCQl7IC8qIERvbid0IHRyeSB0byBmaWxsIHRoZSBidWZmZXIsIHNvIHRoaXMgaXMgYW4gRU9GLiAqLwotCQlpZiAoICh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKSAtIFlZX01PUkVfQURKID09IDEgKQorCQlpZiAoIHl5Zy0+eXlfY19idWZfcCAtIHl5Zy0+eXl0ZXh0X3B0ciAtIFlZX01PUkVfQURKID09IDEgKQogCQkJewogCQkJLyogV2UgbWF0Y2hlZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIHRoZSBFT0IsIHNvCiAJCQkgKiB0cmVhdCB0aGlzIGFzIGEgZmluYWwgRU9GLgpAQCAtNDAyNSw3ICs0MTAyLDcgQEAKIAkvKiBUcnkgdG8gcmVhZCBtb3JlIGRhdGEuICovCiAKIAkvKiBGaXJzdCBtb3ZlIGxhc3QgY2hhcnMgdG8gc3RhcnQgb2YgYnVmZmVyLiAqLwotCW51bWJlcl90b19tb3ZlID0gKGludCkgKCh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKSkgLSAxOworCW51bWJlcl90b19tb3ZlID0gKGludCkgKHl5Zy0+eXlfY19idWZfcCAtIHl5Zy0+eXl0ZXh0X3B0cikgLSAxOwogCiAJZm9yICggaSA9IDA7IGkgPCBudW1iZXJfdG9fbW92ZTsgKytpICkKIAkJKihkZXN0KyspID0gKihzb3VyY2UrKyk7CkBAIC00MDM0LDcgKzQxMTEsNyBAQAogCQkvKiBkb24ndCBkbyB0aGUgcmVhZCwgaXQncyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYW4gRU9GLAogCQkgKiBqdXN0IGZvcmNlIGFuIEVPRgogCQkgKi8KLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpID0gMDsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0geXlnLT55eV9uX2NoYXJzID0gMDsKIAogCWVsc2UKIAkJewpAQCAtNDA0OCw3ICs0MTI1LDcgQEAKIAkJCVlZX0JVRkZFUl9TVEFURSBiID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFOwogCiAJCQlpbnQgeXlfY19idWZfcF9vZmZzZXQgPQotCQkJCShpbnQpICgoeXlfY19idWZfcCkgLSBiLT55eV9jaF9idWYpOworCQkJCShpbnQpICh5eWctPnl5X2NfYnVmX3AgLSBiLT55eV9jaF9idWYpOwogCiAJCQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQogCQkJCXsKQEAgLTQwNjEsNyArNDEzOCw3IEBACiAKIAkJCQliLT55eV9jaF9idWYgPSAoY2hhciAqKQogCQkJCQkvKiBJbmNsdWRlIHJvb20gaW4gZm9yIDIgRU9CIGNoYXJzLiAqLwotCQkJCQlwY2FwX3JlYWxsb2MoKHZvaWQgKikgYi0+eXlfY2hfYnVmLGItPnl5X2J1Zl9zaXplICsgMiAgKTsKKwkJCQkJcGNhcF9yZWFsbG9jKCh2b2lkICopIGItPnl5X2NoX2J1ZixiLT55eV9idWZfc2l6ZSArIDIgLHl5c2Nhbm5lciApOwogCQkJCX0KIAkJCWVsc2UKIAkJCQkvKiBDYW4ndCBncm93IGl0LCB3ZSBkb24ndCBvd24gaXQuICovCkBAIC00MDcxLDcgKzQxNDgsNyBAQAogCQkJCVlZX0ZBVEFMX0VSUk9SKAogCQkJCSJmYXRhbCBlcnJvciAtIHNjYW5uZXIgaW5wdXQgYnVmZmVyIG92ZXJmbG93IiApOwogCi0JCQkoeXlfY19idWZfcCkgPSAmYi0+eXlfY2hfYnVmW3l5X2NfYnVmX3Bfb2Zmc2V0XTsKKwkJCXl5Zy0+eXlfY19idWZfcCA9ICZiLT55eV9jaF9idWZbeXlfY19idWZfcF9vZmZzZXRdOwogCiAJCQludW1fdG9fcmVhZCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgLQogCQkJCQkJbnVtYmVyX3RvX21vdmUgLSAxOwpAQCAtNDA4MywxNyArNDE2MCwxNyBAQAogCiAJCS8qIFJlYWQgaW4gbW9yZSBkYXRhLiAqLwogCQlZWV9JTlBVVCggKCZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV0pLAotCQkJKHl5X25fY2hhcnMpLCBudW1fdG9fcmVhZCApOworCQkJeXlnLT55eV9uX2NoYXJzLCBudW1fdG9fcmVhZCApOwogCi0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0geXlnLT55eV9uX2NoYXJzOwogCQl9CiAKLQlpZiAoICh5eV9uX2NoYXJzKSA9PSAwICkKKwlpZiAoIHl5Zy0+eXlfbl9jaGFycyA9PSAwICkKIAkJewogCQlpZiAoIG51bWJlcl90b19tb3ZlID09IFlZX01PUkVfQURKICkKIAkJCXsKIAkJCXJldF92YWwgPSBFT0JfQUNUX0VORF9PRl9GSUxFOwotCQkJcGNhcF9yZXN0YXJ0KHBjYXBfaW4gICk7CisJCQlwY2FwX3Jlc3RhcnQoeXlpbiAgLHl5c2Nhbm5lcik7CiAJCQl9CiAKIAkJZWxzZQpAQCAtNDEwNywzOSArNDE4NCw0MCBAQAogCWVsc2UKIAkJcmV0X3ZhbCA9IEVPQl9BQ1RfQ09OVElOVUVfU0NBTjsKIAotCWlmICgoeXlfc2l6ZV90KSAoKHl5X25fY2hhcnMpICsgbnVtYmVyX3RvX21vdmUpID4gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSkgeworCWlmICgoeXlfc2l6ZV90KSAoeXlnLT55eV9uX2NoYXJzICsgbnVtYmVyX3RvX21vdmUpID4gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSkgewogCQkvKiBFeHRlbmQgdGhlIGFycmF5IGJ5IDUwJSwgcGx1cyB0aGUgbnVtYmVyIHdlIHJlYWxseSBuZWVkLiAqLwotCQl5eV9zaXplX3QgbmV3X3NpemUgPSAoeXlfbl9jaGFycykgKyBudW1iZXJfdG9fbW92ZSArICgoeXlfbl9jaGFycykgPj4gMSk7Ci0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmID0gKGNoYXIgKikgcGNhcF9yZWFsbG9jKCh2b2lkICopIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmLG5ld19zaXplICApOworCQl5eV9zaXplX3QgbmV3X3NpemUgPSB5eWctPnl5X25fY2hhcnMgKyBudW1iZXJfdG9fbW92ZSArICh5eWctPnl5X25fY2hhcnMgPj4gMSk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmID0gKGNoYXIgKikgcGNhcF9yZWFsbG9jKCh2b2lkICopIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmLG5ld19zaXplICx5eXNjYW5uZXIgKTsKIAkJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICkKIAkJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X2dldF9uZXh0X2J1ZmZlcigpIiApOwogCX0KIAotCSh5eV9uX2NoYXJzKSArPSBudW1iZXJfdG9fbW92ZTsKLQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwotCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKSArIDFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCXl5Zy0+eXlfbl9jaGFycyArPSBudW1iZXJfdG9fbW92ZTsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1Zlt5eWctPnl5X25fY2hhcnNdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW3l5Zy0+eXlfbl9jaGFycyArIDFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwogCi0JKHl5dGV4dF9wdHIpID0gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWzBdOworCXl5Zy0+eXl0ZXh0X3B0ciA9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlswXTsKIAogCXJldHVybiByZXRfdmFsOwogfQogCiAvKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUgLSBnZXQgdGhlIHN0YXRlIGp1c3QgYmVmb3JlIHRoZSBFT0IgY2hhciB3YXMgcmVhY2hlZCAqLwogCi0gICAgc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh2b2lkKQorICAgIHN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSAoeXlzY2FuX3QgeXlzY2FubmVyKQogewogCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKIAlyZWdpc3RlciBjaGFyICp5eV9jcDsKLSAgICAKLQl5eV9jdXJyZW50X3N0YXRlID0gKHl5X3N0YXJ0KTsKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CiAKLQlmb3IgKCB5eV9jcCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOyB5eV9jcCA8ICh5eV9jX2J1Zl9wKTsgKyt5eV9jcCApCisJeXlfY3VycmVudF9zdGF0ZSA9IHl5Zy0+eXlfc3RhcnQ7CisKKwlmb3IgKCB5eV9jcCA9IHl5Zy0+eXl0ZXh0X3B0ciArIFlZX01PUkVfQURKOyB5eV9jcCA8IHl5Zy0+eXlfY19idWZfcDsgKyt5eV9jcCApCiAJCXsKIAkJcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0gKCp5eV9jcCA/IHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldIDogMSk7CiAJCWlmICggeXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdICkKIAkJCXsKLQkJCSh5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSkgPSB5eV9jdXJyZW50X3N0YXRlOwotCQkJKHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MpID0geXlfY3A7CisJCQl5eWctPnl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKKwkJCXl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfY3BvcyA9IHl5X2NwOwogCQkJfQogCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCiAJCQl7CkBAIC00MTU4LDE2ICs0MjM2LDE3IEBACiAgKiBzeW5vcHNpcwogICoJbmV4dF9zdGF0ZSA9IHl5X3RyeV9OVUxfdHJhbnMoIGN1cnJlbnRfc3RhdGUgKTsKICAqLwotICAgIHN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X3RyeV9OVUxfdHJhbnMgICh5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGUgKQorICAgIHN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X3RyeV9OVUxfdHJhbnMgICh5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGUgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCiB7CiAJcmVnaXN0ZXIgaW50IHl5X2lzX2phbTsKLSAgICAJcmVnaXN0ZXIgY2hhciAqeXlfY3AgPSAoeXlfY19idWZfcCk7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOyAvKiBUaGlzIHZhciBtYXkgYmUgdW51c2VkIGRlcGVuZGluZyB1cG9uIG9wdGlvbnMuICovCisJcmVnaXN0ZXIgY2hhciAqeXlfY3AgPSB5eWctPnl5X2NfYnVmX3A7CiAKIAlyZWdpc3RlciBZWV9DSEFSIHl5X2MgPSAxOwogCWlmICggeXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdICkKIAkJewotCQkoeXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUpID0geXlfY3VycmVudF9zdGF0ZTsKLQkJKHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MpID0geXlfY3A7CisJCXl5Zy0+eXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUgPSB5eV9jdXJyZW50X3N0YXRlOworCQl5eWctPnl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MgPSB5eV9jcDsKIAkJfQogCXdoaWxlICggeXlfY2hrW3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyB5eV9jXSAhPSB5eV9jdXJyZW50X3N0YXRlICkKIAkJewpAQCAtNDE3OCwzNyArNDI1NywzOSBAQAogCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOwogCXl5X2lzX2phbSA9ICh5eV9jdXJyZW50X3N0YXRlID09IDE0NjMpOwogCi0JCXJldHVybiB5eV9pc19qYW0gPyAwIDogeXlfY3VycmVudF9zdGF0ZTsKKwkodm9pZCl5eWc7CisJcmV0dXJuIHl5X2lzX2phbSA/IDAgOiB5eV9jdXJyZW50X3N0YXRlOwogfQogCiAjaWZuZGVmIFlZX05PX0lOUFVUCiAjaWZkZWYgX19jcGx1c3BsdXMKLSAgICBzdGF0aWMgaW50IHl5aW5wdXQgKHZvaWQpCisgICAgc3RhdGljIGludCB5eWlucHV0ICh5eXNjYW5fdCB5eXNjYW5uZXIpCiAjZWxzZQotICAgIHN0YXRpYyBpbnQgaW5wdXQgICh2b2lkKQorICAgIHN0YXRpYyBpbnQgaW5wdXQgICh5eXNjYW5fdCB5eXNjYW5uZXIpCiAjZW5kaWYKIAogewogCWludCBjOwotICAgIAotCSooeXlfY19idWZfcCkgPSAoeXlfaG9sZF9jaGFyKTsKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CiAKLQlpZiAoICooeXlfY19idWZfcCkgPT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKKwkqeXlnLT55eV9jX2J1Zl9wID0geXlnLT55eV9ob2xkX2NoYXI7CisKKwlpZiAoICp5eWctPnl5X2NfYnVmX3AgPT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKIAkJewogCQkvKiB5eV9jX2J1Zl9wIG5vdyBwb2ludHMgdG8gdGhlIGNoYXJhY3RlciB3ZSB3YW50IHRvIHJldHVybi4KIAkJICogSWYgdGhpcyBvY2N1cnMgKmJlZm9yZSogdGhlIEVPQiBjaGFyYWN0ZXJzLCB0aGVuIGl0J3MgYQogCQkgKiB2YWxpZCBOVUw7IGlmIG5vdCwgdGhlbiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgogCQkgKi8KLQkJaWYgKCAoeXlfY19idWZfcCkgPCAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSApCisJCWlmICggeXlnLT55eV9jX2J1Zl9wIDwgJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW3l5Zy0+eXlfbl9jaGFyc10gKQogCQkJLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLwotCQkJKih5eV9jX2J1Zl9wKSA9ICdcMCc7CisJCQkqeXlnLT55eV9jX2J1Zl9wID0gJ1wwJzsKIAogCQllbHNlCiAJCQl7IC8qIG5lZWQgbW9yZSBpbnB1dCAqLwotCQkJeXlfc2l6ZV90IG9mZnNldCA9ICh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKTsKLQkJCSsrKHl5X2NfYnVmX3ApOworCQkJeXlfc2l6ZV90IG9mZnNldCA9IHl5Zy0+eXlfY19idWZfcCAtIHl5Zy0+eXl0ZXh0X3B0cjsKKwkJCSsreXlnLT55eV9jX2J1Zl9wOwogCi0JCQlzd2l0Y2ggKCB5eV9nZXRfbmV4dF9idWZmZXIoICApICkKKwkJCXN3aXRjaCAoIHl5X2dldF9uZXh0X2J1ZmZlciggeXlzY2FubmVyICkgKQogCQkJCXsKIAkJCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKIAkJCQkJLyogVGhpcyBoYXBwZW5zIGJlY2F1c2UgeXlfZ19uX2IoKQpAQCAtNDIyMiwzNCArNDMwMywzNCBAQAogCQkJCQkgKi8KIAogCQkJCQkvKiBSZXNldCBidWZmZXIgc3RhdHVzLiAqLwotCQkJCQlwY2FwX3Jlc3RhcnQocGNhcF9pbiApOworCQkJCQlwY2FwX3Jlc3RhcnQoeXlpbiAseXlzY2FubmVyKTsKIAogCQkJCQkvKkZBTExUSFJPVUdIKi8KIAogCQkJCWNhc2UgRU9CX0FDVF9FTkRfT0ZfRklMRToKIAkJCQkJewotCQkJCQlpZiAoIHBjYXBfd3JhcCggKSApCisJCQkJCWlmICggcGNhcF93cmFwKHl5c2Nhbm5lciApICkKIAkJCQkJCXJldHVybiBFT0Y7CiAKLQkJCQkJaWYgKCAhICh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpICkKKwkJCQkJaWYgKCAhIHl5Zy0+eXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mICkKIAkJCQkJCVlZX05FV19GSUxFOwogI2lmZGVmIF9fY3BsdXNwbHVzCi0JCQkJCXJldHVybiB5eWlucHV0KCk7CisJCQkJCXJldHVybiB5eWlucHV0KHl5c2Nhbm5lcik7CiAjZWxzZQotCQkJCQlyZXR1cm4gaW5wdXQoKTsKKwkJCQkJcmV0dXJuIGlucHV0KHl5c2Nhbm5lcik7CiAjZW5kaWYKIAkJCQkJfQogCiAJCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46Ci0JCQkJCSh5eV9jX2J1Zl9wKSA9ICh5eXRleHRfcHRyKSArIG9mZnNldDsKKwkJCQkJeXlnLT55eV9jX2J1Zl9wID0geXlnLT55eXRleHRfcHRyICsgb2Zmc2V0OwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CiAJCX0KIAotCWMgPSAqKHVuc2lnbmVkIGNoYXIgKikgKHl5X2NfYnVmX3ApOwkvKiBjYXN0IGZvciA4LWJpdCBjaGFyJ3MgKi8KLQkqKHl5X2NfYnVmX3ApID0gJ1wwJzsJLyogcHJlc2VydmUgcGNhcF90ZXh0ICovCi0JKHl5X2hvbGRfY2hhcikgPSAqKysoeXlfY19idWZfcCk7CisJYyA9ICoodW5zaWduZWQgY2hhciAqKSB5eWctPnl5X2NfYnVmX3A7CS8qIGNhc3QgZm9yIDgtYml0IGNoYXIncyAqLworCSp5eWctPnl5X2NfYnVmX3AgPSAnXDAnOwkvKiBwcmVzZXJ2ZSB5eXRleHQgKi8KKwl5eWctPnl5X2hvbGRfY2hhciA9ICorK3l5Zy0+eXlfY19idWZfcDsKIAogCXJldHVybiBjOwogfQpAQCAtNDI1Nyw3NiArNDMzOCw3OSBAQAogCiAvKiogSW1tZWRpYXRlbHkgc3dpdGNoIHRvIGEgZGlmZmVyZW50IGlucHV0IHN0cmVhbS4KICAqIEBwYXJhbSBpbnB1dF9maWxlIEEgcmVhZGFibGUgc3RyZWFtLgotICogCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVzZXQgdGhlIHN0YXJ0IGNvbmRpdGlvbiB0byBAYyBJTklUSUFMIC4KICAqLwotICAgIHZvaWQgcGNhcF9yZXN0YXJ0ICAoRklMRSAqIGlucHV0X2ZpbGUgKQorICAgIHZvaWQgcGNhcF9yZXN0YXJ0ICAoRklMRSAqIGlucHV0X2ZpbGUgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCiB7Ci0gICAgCisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCiAJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7Ci0gICAgICAgIHBjYXBfZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsKKyAgICAgICAgcGNhcF9lbnN1cmVfYnVmZmVyX3N0YWNrICh5eXNjYW5uZXIpOwogCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPQotICAgICAgICAgICAgcGNhcF9fY3JlYXRlX2J1ZmZlcihwY2FwX2luLFlZX0JVRl9TSVpFICk7CisgICAgICAgICAgICBwY2FwX19jcmVhdGVfYnVmZmVyKHl5aW4sWVlfQlVGX1NJWkUgLHl5c2Nhbm5lcik7CiAJfQogCi0JcGNhcF9faW5pdF9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIsaW5wdXRfZmlsZSApOwotCXBjYXBfX2xvYWRfYnVmZmVyX3N0YXRlKCApOworCXBjYXBfX2luaXRfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSLGlucHV0X2ZpbGUgLHl5c2Nhbm5lcik7CisJcGNhcF9fbG9hZF9idWZmZXJfc3RhdGUoeXlzY2FubmVyICk7CiB9CiAKIC8qKiBTd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgYnVmZmVyLgogICogQHBhcmFtIG5ld19idWZmZXIgVGhlIG5ldyBpbnB1dCBidWZmZXIuCi0gKiAKKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgogICovCi0gICAgdm9pZCBwY2FwX19zd2l0Y2hfdG9fYnVmZmVyICAoWVlfQlVGRkVSX1NUQVRFICBuZXdfYnVmZmVyICkKKyAgICB2b2lkIHBjYXBfX3N3aXRjaF90b19idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIG5ld19idWZmZXIgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCiB7Ci0gICAgCisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCiAJLyogVE9ETy4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVwbGFjZSB0aGlzIGVudGlyZSBmdW5jdGlvbiBib2R5CiAJICogd2l0aAogCSAqCQlwY2FwX3BvcF9idWZmZXJfc3RhdGUoKTsKIAkgKgkJcGNhcF9wdXNoX2J1ZmZlcl9zdGF0ZShuZXdfYnVmZmVyKTsKICAgICAgKi8KLQlwY2FwX2Vuc3VyZV9idWZmZXJfc3RhY2sgKCk7CisJcGNhcF9lbnN1cmVfYnVmZmVyX3N0YWNrICh5eXNjYW5uZXIpOwogCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgPT0gbmV3X2J1ZmZlciApCiAJCXJldHVybjsKIAogCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgKQogCQl7CiAJCS8qIEZsdXNoIG91dCBpbmZvcm1hdGlvbiBmb3Igb2xkIGJ1ZmZlci4gKi8KLQkJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOwotCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3MgPSAoeXlfY19idWZfcCk7Ci0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJKnl5Zy0+eXlfY19idWZfcCA9IHl5Zy0+eXlfaG9sZF9jaGFyOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3MgPSB5eWctPnl5X2NfYnVmX3A7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9IHl5Zy0+eXlfbl9jaGFyczsKIAkJfQogCiAJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gbmV3X2J1ZmZlcjsKLQlwY2FwX19sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKwlwY2FwX19sb2FkX2J1ZmZlcl9zdGF0ZSh5eXNjYW5uZXIgKTsKIAogCS8qIFdlIGRvbid0IGFjdHVhbGx5IGtub3cgd2hldGhlciB3ZSBkaWQgdGhpcyBzd2l0Y2ggZHVyaW5nCiAJICogRU9GIChwY2FwX3dyYXAoKSkgcHJvY2Vzc2luZywgYnV0IHRoZSBvbmx5IHRpbWUgdGhpcyBmbGFnCiAJICogaXMgbG9va2VkIGF0IGlzIGFmdGVyIHBjYXBfd3JhcCgpIGlzIGNhbGxlZCwgc28gaXQncyBzYWZlCiAJICogdG8gZ28gYWhlYWQgYW5kIGFsd2F5cyBzZXQgaXQuCiAJICovCi0JKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAxOworCXl5Zy0+eXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mID0gMTsKIH0KIAotc3RhdGljIHZvaWQgcGNhcF9fbG9hZF9idWZmZXJfc3RhdGUgICh2b2lkKQorc3RhdGljIHZvaWQgcGNhcF9fbG9hZF9idWZmZXJfc3RhdGUgICh5eXNjYW5fdCB5eXNjYW5uZXIpCiB7Ci0gICAgCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKLQkoeXl0ZXh0X3B0cikgPSAoeXlfY19idWZfcCkgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3M7Ci0JcGNhcF9pbiA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZTsKLQkoeXlfaG9sZF9jaGFyKSA9ICooeXlfY19idWZfcCk7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCXl5Zy0+eXlfbl9jaGFycyA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKKwl5eWctPnl5dGV4dF9wdHIgPSB5eWctPnl5X2NfYnVmX3AgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3M7CisJeXlpbiA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZTsKKwl5eWctPnl5X2hvbGRfY2hhciA9ICp5eWctPnl5X2NfYnVmX3A7CiB9CiAKIC8qKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBpbnB1dCBidWZmZXIgc3RhdGUuCiAgKiBAcGFyYW0gZmlsZSBBIHJlYWRhYmxlIHN0cmVhbS4KICAqIEBwYXJhbSBzaXplIFRoZSBjaGFyYWN0ZXIgYnVmZmVyIHNpemUgaW4gYnl0ZXMuIFdoZW4gaW4gZG91YnQsIHVzZSBAYyBZWV9CVUZfU0laRS4KLSAqIAorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCiAgKiBAcmV0dXJuIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlLgogICovCi0gICAgWVlfQlVGRkVSX1NUQVRFIHBjYXBfX2NyZWF0ZV9idWZmZXIgIChGSUxFICogZmlsZSwgaW50ICBzaXplICkKKyAgICBZWV9CVUZGRVJfU1RBVEUgcGNhcF9fY3JlYXRlX2J1ZmZlciAgKEZJTEUgKiBmaWxlLCBpbnQgIHNpemUgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCiB7CiAJWVlfQlVGRkVSX1NUQVRFIGI7CiAgICAgCi0JYiA9IChZWV9CVUZGRVJfU1RBVEUpIHBjYXBfYWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgICk7CisJYiA9IChZWV9CVUZGRVJfU1RBVEUpIHBjYXBfYWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgLHl5c2Nhbm5lciApOwogCWlmICggISBiICkKIAkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gcGNhcF9fY3JlYXRlX2J1ZmZlcigpIiApOwogCkBAIC00MzM1LDI0ICs0NDE5LDI1IEBACiAJLyogeXlfY2hfYnVmIGhhcyB0byBiZSAyIGNoYXJhY3RlcnMgbG9uZ2VyIHRoYW4gdGhlIHNpemUgZ2l2ZW4gYmVjYXVzZQogCSAqIHdlIG5lZWQgdG8gcHV0IGluIDIgZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLgogCSAqLwotCWItPnl5X2NoX2J1ZiA9IChjaGFyICopIHBjYXBfYWxsb2MoYi0+eXlfYnVmX3NpemUgKyAyICApOworCWItPnl5X2NoX2J1ZiA9IChjaGFyICopIHBjYXBfYWxsb2MoYi0+eXlfYnVmX3NpemUgKyAyICx5eXNjYW5uZXIgKTsKIAlpZiAoICEgYi0+eXlfY2hfYnVmICkKIAkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gcGNhcF9fY3JlYXRlX2J1ZmZlcigpIiApOwogCiAJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7CiAKLQlwY2FwX19pbml0X2J1ZmZlcihiLGZpbGUgKTsKKwlwY2FwX19pbml0X2J1ZmZlcihiLGZpbGUgLHl5c2Nhbm5lcik7CiAKIAlyZXR1cm4gYjsKIH0KIAogLyoqIERlc3Ryb3kgdGhlIGJ1ZmZlci4KICAqIEBwYXJhbSBiIGEgYnVmZmVyIGNyZWF0ZWQgd2l0aCBwY2FwX19jcmVhdGVfYnVmZmVyKCkKLSAqIAorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCiAgKi8KLSAgICB2b2lkIHBjYXBfX2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSAgYiApCisgICAgdm9pZCBwY2FwX19kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgIGIgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCiB7Ci0gICAgCisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCiAJaWYgKCAhIGIgKQogCQlyZXR1cm47CiAKQEAgLTQzNjAsMjEgKzQ0NDUsMjIgQEAKIAkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gKFlZX0JVRkZFUl9TVEFURSkgMDsKIAogCWlmICggYi0+eXlfaXNfb3VyX2J1ZmZlciApCi0JCXBjYXBfZnJlZSgodm9pZCAqKSBiLT55eV9jaF9idWYgICk7CisJCXBjYXBfZnJlZSgodm9pZCAqKSBiLT55eV9jaF9idWYgLHl5c2Nhbm5lciApOwogCi0JcGNhcF9mcmVlKCh2b2lkICopIGIgICk7CisJcGNhcF9mcmVlKCh2b2lkICopIGIgLHl5c2Nhbm5lciApOwogfQogCiAvKiBJbml0aWFsaXplcyBvciByZWluaXRpYWxpemVzIGEgYnVmZmVyLgogICogVGhpcyBmdW5jdGlvbiBpcyBzb21ldGltZXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGJ1ZmZlciwKICAqIHN1Y2ggYXMgZHVyaW5nIGEgcGNhcF9yZXN0YXJ0KCkgb3IgYXQgRU9GLgogICovCi0gICAgc3RhdGljIHZvaWQgcGNhcF9faW5pdF9idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIGIsIEZJTEUgKiBmaWxlICkKKyAgICBzdGF0aWMgdm9pZCBwY2FwX19pbml0X2J1ZmZlciAgKFlZX0JVRkZFUl9TVEFURSAgYiwgRklMRSAqIGZpbGUgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCiAKIHsKIAlpbnQgb2Vycm5vID0gZXJybm87Ci0gICAgCi0JcGNhcF9fZmx1c2hfYnVmZmVyKGIgKTsKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisKKwlwY2FwX19mbHVzaF9idWZmZXIoYiAseXlzY2FubmVyKTsKIAogCWItPnl5X2lucHV0X2ZpbGUgPSBmaWxlOwogCWItPnl5X2ZpbGxfYnVmZmVyID0gMTsKQEAgLTQzODgsMTggKzQ0NzQsMTkgQEAKICAgICAgICAgYi0+eXlfYnNfY29sdW1uID0gMDsKICAgICB9CiAKLSAgICAgICAgYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSBmaWxlID8gKGlzYXR0eSggZmlsZW5vKGZpbGUpICkgPiAwKSA6IDA7CisgICAgICAgIGItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKICAgICAKIAllcnJubyA9IG9lcnJubzsKIH0KIAogLyoqIERpc2NhcmQgYWxsIGJ1ZmZlcmVkIGNoYXJhY3RlcnMuIE9uIHRoZSBuZXh0IHNjYW4sIFlZX0lOUFVUIHdpbGwgYmUgY2FsbGVkLgogICogQHBhcmFtIGIgdGhlIGJ1ZmZlciBzdGF0ZSB0byBiZSBmbHVzaGVkLCB1c3VhbGx5IEBjIFlZX0NVUlJFTlRfQlVGRkVSLgotICogCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KICAqLwotICAgIHZvaWQgcGNhcF9fZmx1c2hfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgIGIgKQorICAgIHZvaWQgcGNhcF9fZmx1c2hfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgIGIgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCiB7Ci0gICAgCWlmICggISBiICkKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisJaWYgKCAhIGIgKQogCQlyZXR1cm47CiAKIAliLT55eV9uX2NoYXJzID0gMDsKQEAgLTQ0MTcsMTE0ICs0NTA0LDExNyBAQAogCWItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOwogCiAJaWYgKCBiID09IFlZX0NVUlJFTlRfQlVGRkVSICkKLQkJcGNhcF9fbG9hZF9idWZmZXJfc3RhdGUoICk7CisJCXBjYXBfX2xvYWRfYnVmZmVyX3N0YXRlKHl5c2Nhbm5lciApOwogfQogCiAvKiogUHVzaGVzIHRoZSBuZXcgc3RhdGUgb250byB0aGUgc3RhY2suIFRoZSBuZXcgc3RhdGUgYmVjb21lcwogICogIHRoZSBjdXJyZW50IHN0YXRlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgdGhlIHN0YWNrCiAgKiAgaWYgbmVjZXNzYXJ5LgogICogIEBwYXJhbSBuZXdfYnVmZmVyIFRoZSBuZXcgc3RhdGUuCi0gKiAgCisgKiAgQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCiAgKi8KLXZvaWQgcGNhcF9wdXNoX2J1ZmZlcl9zdGF0ZSAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgKQordm9pZCBwY2FwX3B1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKIHsKLSAgICAJaWYgKG5ld19idWZmZXIgPT0gTlVMTCkKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisJaWYgKG5ld19idWZmZXIgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JcGNhcF9lbnN1cmVfYnVmZmVyX3N0YWNrKCk7CisJcGNhcF9lbnN1cmVfYnVmZmVyX3N0YWNrKHl5c2Nhbm5lcik7CiAKIAkvKiBUaGlzIGJsb2NrIGlzIGNvcGllZCBmcm9tIHBjYXBfX3N3aXRjaF90b19idWZmZXIuICovCiAJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCiAJCXsKIAkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLwotCQkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7Ci0JCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9ICh5eV9jX2J1Zl9wKTsKLQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOworCQkqeXlnLT55eV9jX2J1Zl9wID0geXlnLT55eV9ob2xkX2NoYXI7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9IHl5Zy0+eXlfY19idWZfcDsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0geXlnLT55eV9uX2NoYXJzOwogCQl9CiAKIAkvKiBPbmx5IHB1c2ggaWYgdG9wIGV4aXN0cy4gT3RoZXJ3aXNlLCByZXBsYWNlIHRvcC4gKi8KIAlpZiAoWVlfQ1VSUkVOVF9CVUZGRVIpCi0JCSh5eV9idWZmZXJfc3RhY2tfdG9wKSsrOworCQl5eWctPnl5X2J1ZmZlcl9zdGFja190b3ArKzsKIAlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBuZXdfYnVmZmVyOwogCiAJLyogY29waWVkIGZyb20gcGNhcF9fc3dpdGNoX3RvX2J1ZmZlci4gKi8KLQlwY2FwX19sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKLQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7CisJcGNhcF9fbG9hZF9idWZmZXJfc3RhdGUoeXlzY2FubmVyICk7CisJeXlnLT55eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgPSAxOwogfQogCiAvKiogUmVtb3ZlcyBhbmQgZGVsZXRlcyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgaWYgcHJlc2VudC4KICAqICBUaGUgbmV4dCBlbGVtZW50IGJlY29tZXMgdGhlIG5ldyB0b3AuCi0gKiAgCisgKiAgQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCiAgKi8KLXZvaWQgcGNhcF9wb3BfYnVmZmVyX3N0YXRlICh2b2lkKQordm9pZCBwY2FwX3BvcF9idWZmZXJfc3RhdGUgKHl5c2Nhbl90IHl5c2Nhbm5lcikKIHsKLSAgICAJaWYgKCFZWV9DVVJSRU5UX0JVRkZFUikKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisJaWYgKCFZWV9DVVJSRU5UX0JVRkZFUikKIAkJcmV0dXJuOwogCi0JcGNhcF9fZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiApOworCXBjYXBfX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgLHl5c2Nhbm5lcik7CiAJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gTlVMTDsKLQlpZiAoKHl5X2J1ZmZlcl9zdGFja190b3ApID4gMCkKLQkJLS0oeXlfYnVmZmVyX3N0YWNrX3RvcCk7CisJaWYgKHl5Zy0+eXlfYnVmZmVyX3N0YWNrX3RvcCA+IDApCisJCS0teXlnLT55eV9idWZmZXJfc3RhY2tfdG9wOwogCiAJaWYgKFlZX0NVUlJFTlRfQlVGRkVSKSB7Ci0JCXBjYXBfX2xvYWRfYnVmZmVyX3N0YXRlKCApOwotCQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7CisJCXBjYXBfX2xvYWRfYnVmZmVyX3N0YXRlKHl5c2Nhbm5lciApOworCQl5eWctPnl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZiA9IDE7CiAJfQogfQogCiAvKiBBbGxvY2F0ZXMgdGhlIHN0YWNrIGlmIGl0IGRvZXMgbm90IGV4aXN0LgogICogIEd1YXJhbnRlZXMgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBwdXNoLgogICovCi1zdGF0aWMgdm9pZCBwY2FwX2Vuc3VyZV9idWZmZXJfc3RhY2sgKHZvaWQpCitzdGF0aWMgdm9pZCBwY2FwX2Vuc3VyZV9idWZmZXJfc3RhY2sgKHl5c2Nhbl90IHl5c2Nhbm5lcikKIHsKIAl5eV9zaXplX3QgbnVtX3RvX2FsbG9jOwotICAgIAotCWlmICghKHl5X2J1ZmZlcl9zdGFjaykpIHsKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisKKwlpZiAoIXl5Zy0+eXlfYnVmZmVyX3N0YWNrKSB7CiAKIAkJLyogRmlyc3QgYWxsb2NhdGlvbiBpcyBqdXN0IGZvciAyIGVsZW1lbnRzLCBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoaXMKIAkJICogc2Nhbm5lciB3aWxsIGV2ZW4gbmVlZCBhIHN0YWNrLiBXZSB1c2UgMiBpbnN0ZWFkIG9mIDEgdG8gYXZvaWQgYW4KIAkJICogaW1tZWRpYXRlIHJlYWxsb2Mgb24gdGhlIG5leHQgY2FsbC4KICAgICAgICAgICovCiAJCW51bV90b19hbGxvYyA9IDE7Ci0JCSh5eV9idWZmZXJfc3RhY2spID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKilwY2FwX2FsbG9jCisJCXl5Zy0+eXlfYnVmZmVyX3N0YWNrID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKilwY2FwX2FsbG9jCiAJCQkJCQkJCShudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCi0JCQkJCQkJCSk7Ci0JCWlmICggISAoeXlfYnVmZmVyX3N0YWNrKSApCisJCQkJCQkJCSwgeXlzY2FubmVyKTsKKwkJaWYgKCAhIHl5Zy0+eXlfYnVmZmVyX3N0YWNrICkKIAkJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHBjYXBfZW5zdXJlX2J1ZmZlcl9zdGFjaygpIiApOwogCQkJCQkJCQkgIAotCQltZW1zZXQoKHl5X2J1ZmZlcl9zdGFjayksIDAsIG51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikpOworCQltZW1zZXQoeXlnLT55eV9idWZmZXJfc3RhY2ssIDAsIG51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikpOwogCQkJCQotCQkoeXlfYnVmZmVyX3N0YWNrX21heCkgPSBudW1fdG9fYWxsb2M7Ci0JCSh5eV9idWZmZXJfc3RhY2tfdG9wKSA9IDA7CisJCXl5Zy0+eXlfYnVmZmVyX3N0YWNrX21heCA9IG51bV90b19hbGxvYzsKKwkJeXlnLT55eV9idWZmZXJfc3RhY2tfdG9wID0gMDsKIAkJcmV0dXJuOwogCX0KIAotCWlmICgoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPj0gKCh5eV9idWZmZXJfc3RhY2tfbWF4KSkgLSAxKXsKKwlpZiAoeXlnLT55eV9idWZmZXJfc3RhY2tfdG9wID49ICh5eWctPnl5X2J1ZmZlcl9zdGFja19tYXgpIC0gMSl7CiAKIAkJLyogSW5jcmVhc2UgdGhlIGJ1ZmZlciB0byBwcmVwYXJlIGZvciBhIHBvc3NpYmxlIHB1c2guICovCiAJCWludCBncm93X3NpemUgPSA4IC8qIGFyYml0cmFyeSBncm93IHNpemUgKi87CiAKLQkJbnVtX3RvX2FsbG9jID0gKHl5X2J1ZmZlcl9zdGFja19tYXgpICsgZ3Jvd19zaXplOwotCQkoeXlfYnVmZmVyX3N0YWNrKSA9IChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKiopcGNhcF9yZWFsbG9jCi0JCQkJCQkJCSgoeXlfYnVmZmVyX3N0YWNrKSwKKwkJbnVtX3RvX2FsbG9jID0geXlnLT55eV9idWZmZXJfc3RhY2tfbWF4ICsgZ3Jvd19zaXplOworCQl5eWctPnl5X2J1ZmZlcl9zdGFjayA9IChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKiopcGNhcF9yZWFsbG9jCisJCQkJCQkJCSh5eWctPnl5X2J1ZmZlcl9zdGFjaywKIAkJCQkJCQkJbnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKQotCQkJCQkJCQkpOwotCQlpZiAoICEgKHl5X2J1ZmZlcl9zdGFjaykgKQorCQkJCQkJCQksIHl5c2Nhbm5lcik7CisJCWlmICggISB5eWctPnl5X2J1ZmZlcl9zdGFjayApCiAJCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiBwY2FwX2Vuc3VyZV9idWZmZXJfc3RhY2soKSIgKTsKIAogCQkvKiB6ZXJvIG9ubHkgdGhlIG5ldyBzbG90cy4qLwotCQltZW1zZXQoKHl5X2J1ZmZlcl9zdGFjaykgKyAoeXlfYnVmZmVyX3N0YWNrX21heCksIDAsIGdyb3dfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikpOwotCQkoeXlfYnVmZmVyX3N0YWNrX21heCkgPSBudW1fdG9fYWxsb2M7CisJCW1lbXNldCh5eWctPnl5X2J1ZmZlcl9zdGFjayArIHl5Zy0+eXlfYnVmZmVyX3N0YWNrX21heCwgMCwgZ3Jvd19zaXplICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7CisJCXl5Zy0+eXlfYnVmZmVyX3N0YWNrX21heCA9IG51bV90b19hbGxvYzsKIAl9CiB9CiAKIC8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gZGlyZWN0bHkgZnJvbSBhIHVzZXItc3BlY2lmaWVkIGNoYXJhY3RlciBidWZmZXIuCiAgKiBAcGFyYW0gYmFzZSB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgogICogQHBhcmFtIHNpemUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNoYXJhY3RlciBidWZmZXIKLSAqIAorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCiAgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4gCiAgKi8KLVlZX0JVRkZFUl9TVEFURSBwY2FwX19zY2FuX2J1ZmZlciAgKGNoYXIgKiBiYXNlLCB5eV9zaXplX3QgIHNpemUgKQorWVlfQlVGRkVSX1NUQVRFIHBjYXBfX3NjYW5fYnVmZmVyICAoY2hhciAqIGJhc2UsIHl5X3NpemVfdCAgc2l6ZSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKIHsKIAlZWV9CVUZGRVJfU1RBVEUgYjsKICAgICAKQEAgLTQ1MzQsNyArNDYyNCw3IEBACiAJCS8qIFRoZXkgZm9yZ290IHRvIGxlYXZlIHJvb20gZm9yIHRoZSBFT0Incy4gKi8KIAkJcmV0dXJuIDA7CiAKLQliID0gKFlZX0JVRkZFUl9TVEFURSkgcGNhcF9hbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAgKTsKKwliID0gKFlZX0JVRkZFUl9TVEFURSkgcGNhcF9hbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAseXlzY2FubmVyICk7CiAJaWYgKCAhIGIgKQogCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiBwY2FwX19zY2FuX2J1ZmZlcigpIiApOwogCkBAIC00NTQ4LDcgKzQ2MzgsNyBAQAogCWItPnl5X2ZpbGxfYnVmZmVyID0gMDsKIAliLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKIAotCXBjYXBfX3N3aXRjaF90b19idWZmZXIoYiAgKTsKKwlwY2FwX19zd2l0Y2hfdG9fYnVmZmVyKGIgLHl5c2Nhbm5lciApOwogCiAJcmV0dXJuIGI7CiB9CkBAIC00NTU2LDI1ICs0NjQ2LDI1IEBACiAvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIGEgc3RyaW5nLiBUaGUgbmV4dCBjYWxsIHRvIHBjYXBfbGV4KCkgd2lsbAogICogc2NhbiBmcm9tIGEgQGUgY29weSBvZiBAYSBzdHIuCiAgKiBAcGFyYW0geXlzdHIgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gc2NhbgotICogCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KICAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgogICogQG5vdGUgSWYgeW91IHdhbnQgdG8gc2NhbiBieXRlcyB0aGF0IG1heSBjb250YWluIE5VTCB2YWx1ZXMsIHRoZW4gdXNlCiAgKiAgICAgICBwY2FwX19zY2FuX2J5dGVzKCkgaW5zdGVhZC4KICAqLwotWVlfQlVGRkVSX1NUQVRFIHBjYXBfX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKiB5eXN0ciApCitZWV9CVUZGRVJfU1RBVEUgcGNhcF9fc2Nhbl9zdHJpbmcgKHl5Y29uc3QgY2hhciAqIHl5c3RyICwgeXlzY2FuX3QgeXlzY2FubmVyKQogewogICAgIAotCXJldHVybiBwY2FwX19zY2FuX2J5dGVzKHl5c3RyLHN0cmxlbih5eXN0cikgKTsKKwlyZXR1cm4gcGNhcF9fc2Nhbl9ieXRlcyh5eXN0cixzdHJsZW4oeXlzdHIpICx5eXNjYW5uZXIpOwogfQogCiAvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIHRoZSBnaXZlbiBieXRlcy4gVGhlIG5leHQgY2FsbCB0byBwY2FwX2xleCgpIHdpbGwKICAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgYnl0ZXMuCiAgKiBAcGFyYW0geXlieXRlcyB0aGUgYnl0ZSBidWZmZXIgdG8gc2NhbgogICogQHBhcmFtIF95eWJ5dGVzX2xlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBAYSBieXRlcy4KLSAqIAorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCiAgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KICAqLwotWVlfQlVGRkVSX1NUQVRFIHBjYXBfX3NjYW5fYnl0ZXMgICh5eWNvbnN0IGNoYXIgKiB5eWJ5dGVzLCB5eV9zaXplX3QgIF95eWJ5dGVzX2xlbiApCitZWV9CVUZGRVJfU1RBVEUgcGNhcF9fc2Nhbl9ieXRlcyAgKHl5Y29uc3QgY2hhciAqIHl5Ynl0ZXMsIHl5X3NpemVfdCAgX3l5Ynl0ZXNfbGVuICwgeXlzY2FuX3QgeXlzY2FubmVyKQogewogCVlZX0JVRkZFUl9TVEFURSBiOwogCWNoYXIgKmJ1ZjsKQEAgLTQ1ODMsNyArNDY3Myw3IEBACiAgICAgCiAJLyogR2V0IG1lbW9yeSBmb3IgZnVsbCBidWZmZXIsIGluY2x1ZGluZyBzcGFjZSBmb3IgdHJhaWxpbmcgRU9CJ3MuICovCiAJbiA9IF95eWJ5dGVzX2xlbiArIDI7Ci0JYnVmID0gKGNoYXIgKikgcGNhcF9hbGxvYyhuICApOworCWJ1ZiA9IChjaGFyICopIHBjYXBfYWxsb2MobiAseXlzY2FubmVyICk7CiAJaWYgKCAhIGJ1ZiApCiAJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHBjYXBfX3NjYW5fYnl0ZXMoKSIgKTsKIApAQCAtNDU5Miw3ICs0NjgyLDcgQEAKIAogCWJ1ZltfeXlieXRlc19sZW5dID0gYnVmW195eWJ5dGVzX2xlbisxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKIAotCWIgPSBwY2FwX19zY2FuX2J1ZmZlcihidWYsbiApOworCWIgPSBwY2FwX19zY2FuX2J1ZmZlcihidWYsbiAseXlzY2FubmVyKTsKIAlpZiAoICEgYiApCiAJCVlZX0ZBVEFMX0VSUk9SKCAiYmFkIGJ1ZmZlciBpbiBwY2FwX19zY2FuX2J5dGVzKCkiICk7CiAKQEAgLTQ2MDgsNyArNDY5OCw3IEBACiAjZGVmaW5lIFlZX0VYSVRfRkFJTFVSRSAyCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciogbXNnICkKK3N0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIqIG1zZyAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKIHsKICAgICAJKHZvaWQpIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2cgKTsKIAlleGl0KCBZWV9FWElUX0ZBSUxVUkUgKTsKQEAgLTQ2MjAsNTMgKzQ3MTAsMjY0IEBACiAjZGVmaW5lIHl5bGVzcyhuKSBcCiAJZG8gXAogCQl7IFwKLQkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgcGNhcF90ZXh0LiAqLyBcCisJCS8qIFVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHl5dGV4dC4gKi8gXAogICAgICAgICBpbnQgeXlsZXNzX21hY3JvX2FyZyA9IChuKTsgXAogICAgICAgICBZWV9MRVNTX0xJTkVOTyh5eWxlc3NfbWFjcm9fYXJnKTtcCi0JCXBjYXBfdGV4dFtwY2FwX2xlbmddID0gKHl5X2hvbGRfY2hhcik7IFwKLQkJKHl5X2NfYnVmX3ApID0gcGNhcF90ZXh0ICsgeXlsZXNzX21hY3JvX2FyZzsgXAotCQkoeXlfaG9sZF9jaGFyKSA9ICooeXlfY19idWZfcCk7IFwKLQkJKih5eV9jX2J1Zl9wKSA9ICdcMCc7IFwKLQkJcGNhcF9sZW5nID0geXlsZXNzX21hY3JvX2FyZzsgXAorCQl5eXRleHRbeXlsZW5nXSA9IHl5Zy0+eXlfaG9sZF9jaGFyOyBcCisJCXl5Zy0+eXlfY19idWZfcCA9IHl5dGV4dCArIHl5bGVzc19tYWNyb19hcmc7IFwKKwkJeXlnLT55eV9ob2xkX2NoYXIgPSAqeXlnLT55eV9jX2J1Zl9wOyBcCisJCSp5eWctPnl5X2NfYnVmX3AgPSAnXDAnOyBcCisJCXl5bGVuZyA9IHl5bGVzc19tYWNyb19hcmc7IFwKIAkJfSBcCiAJd2hpbGUgKCAwICkKIAogLyogQWNjZXNzb3IgIG1ldGhvZHMgKGdldC9zZXQgZnVuY3Rpb25zKSB0byBzdHJ1Y3QgbWVtYmVycy4gKi8KIAorLyoqIEdldCB0aGUgdXNlci1kZWZpbmVkIGRhdGEgZm9yIHRoaXMgc2Nhbm5lci4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCitZWV9FWFRSQV9UWVBFIHBjYXBfZ2V0X2V4dHJhICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXlleHRyYTsKK30KKworLyoqIEdldCB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCitpbnQgcGNhcF9nZXRfbGluZW5vICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICAKKyAgICAgICAgaWYgKCEgWVlfQ1VSUkVOVF9CVUZGRVIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICByZXR1cm4geXlsaW5lbm87Cit9CisKKy8qKiBHZXQgdGhlIGN1cnJlbnQgY29sdW1uIG51bWJlci4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCitpbnQgcGNhcF9nZXRfY29sdW1uICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICAKKyAgICAgICAgaWYgKCEgWVlfQ1VSUkVOVF9CVUZGRVIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICByZXR1cm4geXljb2x1bW47Cit9CisKKy8qKiBHZXQgdGhlIGlucHV0IHN0cmVhbS4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCitGSUxFICpwY2FwX2dldF9pbiAgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgcmV0dXJuIHl5aW47Cit9CisKKy8qKiBHZXQgdGhlIG91dHB1dCBzdHJlYW0uCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KKyAqLworRklMRSAqcGNhcF9nZXRfb3V0ICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXlvdXQ7Cit9CisKKy8qKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCB0b2tlbi4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCit5eV9zaXplX3QgcGNhcF9nZXRfbGVuZyAgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgcmV0dXJuIHl5bGVuZzsKK30KKwogLyoqIEdldCB0aGUgY3VycmVudCB0b2tlbi4KLSAqIAorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCiAgKi8KIAotaW50IHBjYXBfZ2V0X2RlYnVnICAodm9pZCkKK2NoYXIgKnBjYXBfZ2V0X3RleHQgICh5eXNjYW5fdCB5eXNjYW5uZXIpCiB7Ci0gICAgICAgIHJldHVybiBwY2FwX19mbGV4X2RlYnVnOworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXl0ZXh0OwogfQogCi12b2lkIHBjYXBfc2V0X2RlYnVnIChpbnQgIGJkZWJ1ZyApCisvKiogU2V0IHRoZSB1c2VyLWRlZmluZWQgZGF0YS4gVGhpcyBkYXRhIGlzIG5ldmVyIHRvdWNoZWQgYnkgdGhlIHNjYW5uZXIuCisgKiBAcGFyYW0gdXNlcl9kZWZpbmVkIFRoZSBkYXRhIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNjYW5uZXIuCisgKiBAcGFyYW0geXlzY2FubmVyIFRoZSBzY2FubmVyIG9iamVjdC4KKyAqLwordm9pZCBwY2FwX3NldF9leHRyYSAoWVlfRVhUUkFfVFlQRSAgdXNlcl9kZWZpbmVkICwgeXlzY2FuX3QgeXlzY2FubmVyKQogewotICAgICAgICBwY2FwX19mbGV4X2RlYnVnID0gYmRlYnVnIDsKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgeXlleHRyYSA9IHVzZXJfZGVmaW5lZCA7CiB9CiAKLXN0YXRpYyBpbnQgeXlfaW5pdF9nbG9iYWxzICh2b2lkKQorLyoqIFNldCB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAqIEBwYXJhbSBsaW5lX251bWJlcgorICogQHBhcmFtIHl5c2Nhbm5lciBUaGUgc2Nhbm5lciBvYmplY3QuCisgKi8KK3ZvaWQgcGNhcF9zZXRfbGluZW5vIChpbnQgIGxpbmVfbnVtYmVyICwgeXlzY2FuX3QgeXlzY2FubmVyKQogewotICAgICAgICAvKiBJbml0aWFsaXphdGlvbiBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIG5vbi1yZWVudHJhbnQgc2Nhbm5lci4KKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisKKyAgICAgICAgLyogbGluZW5vIGlzIG9ubHkgdmFsaWQgaWYgYW4gaW5wdXQgYnVmZmVyIGV4aXN0cy4gKi8KKyAgICAgICAgaWYgKCEgWVlfQ1VSUkVOVF9CVUZGRVIgKQorICAgICAgICAgICBZWV9GQVRBTF9FUlJPUiggInBjYXBfc2V0X2xpbmVubyBjYWxsZWQgd2l0aCBubyBidWZmZXIiICk7CisgICAgCisgICAgeXlsaW5lbm8gPSBsaW5lX251bWJlcjsKK30KKworLyoqIFNldCB0aGUgY3VycmVudCBjb2x1bW4uCisgKiBAcGFyYW0gbGluZV9udW1iZXIKKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICovCit2b2lkIHBjYXBfc2V0X2NvbHVtbiAoaW50ICBjb2x1bW5fbm8gLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworCisgICAgICAgIC8qIGNvbHVtbiBpcyBvbmx5IHZhbGlkIGlmIGFuIGlucHV0IGJ1ZmZlciBleGlzdHMuICovCisgICAgICAgIGlmICghIFlZX0NVUlJFTlRfQlVGRkVSICkKKyAgICAgICAgICAgWVlfRkFUQUxfRVJST1IoICJwY2FwX3NldF9jb2x1bW4gY2FsbGVkIHdpdGggbm8gYnVmZmVyIiApOworICAgIAorICAgIHl5Y29sdW1uID0gY29sdW1uX25vOworfQorCisvKiogU2V0IHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgZG9lcyBub3QgZGlzY2FyZCB0aGUgY3VycmVudAorICogaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIGluX3N0ciBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIEBwYXJhbSB5eXNjYW5uZXIgVGhlIHNjYW5uZXIgb2JqZWN0LgorICogQHNlZSBwY2FwX19zd2l0Y2hfdG9fYnVmZmVyCisgKi8KK3ZvaWQgcGNhcF9zZXRfaW4gKEZJTEUgKiAgaW5fc3RyICwgeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICB5eWluID0gaW5fc3RyIDsKK30KKwordm9pZCBwY2FwX3NldF9vdXQgKEZJTEUgKiAgb3V0X3N0ciAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgeXlvdXQgPSBvdXRfc3RyIDsKK30KKworaW50IHBjYXBfZ2V0X2RlYnVnICAoeXlzY2FuX3QgeXlzY2FubmVyKQoreworICAgIHN0cnVjdCB5eWd1dHNfdCAqIHl5ZyA9IChzdHJ1Y3QgeXlndXRzX3QqKXl5c2Nhbm5lcjsKKyAgICByZXR1cm4geXlfZmxleF9kZWJ1ZzsKK30KKwordm9pZCBwY2FwX3NldF9kZWJ1ZyAoaW50ICBiZGVidWcgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCit7CisgICAgc3RydWN0IHl5Z3V0c190ICogeXlnID0gKHN0cnVjdCB5eWd1dHNfdCopeXlzY2FubmVyOworICAgIHl5X2ZsZXhfZGVidWcgPSBiZGVidWcgOworfQorCisvKiBBY2Nlc3NvciBtZXRob2RzIGZvciB5eWx2YWwgYW5kIHl5bGxvYyAqLworCitZWVNUWVBFICogcGNhcF9nZXRfbHZhbCAgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgcmV0dXJuIHl5bHZhbDsKK30KKwordm9pZCBwY2FwX3NldF9sdmFsIChZWVNUWVBFICogIHl5bHZhbF9wYXJhbSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgeXlsdmFsID0geXlsdmFsX3BhcmFtOworfQorCisvKiBVc2VyLXZpc2libGUgQVBJICovCisKKy8qIHBjYXBfbGV4X2luaXQgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IGNyZWF0ZXMgdGhlIHNjYW5uZXIgaXRzZWxmLCBzbyBpdCBpcworICogdGhlIE9OTFkgcmVlbnRyYW50IGZ1bmN0aW9uIHRoYXQgZG9lc24ndCB0YWtlIHRoZSBzY2FubmVyIGFzIHRoZSBsYXN0IGFyZ3VtZW50LgorICogVGhhdCdzIHdoeSB3ZSBleHBsaWNpdGx5IGhhbmRsZSB0aGUgZGVjbGFyYXRpb24sIGluc3RlYWQgb2YgdXNpbmcgb3VyIG1hY3Jvcy4KKyAqLworCitpbnQgcGNhcF9sZXhfaW5pdCh5eXNjYW5fdCogcHRyX3l5X2dsb2JhbHMpCisKK3sKKyAgICBpZiAocHRyX3l5X2dsb2JhbHMgPT0gTlVMTCl7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAqcHRyX3l5X2dsb2JhbHMgPSAoeXlzY2FuX3QpIHBjYXBfYWxsb2MgKCBzaXplb2YoIHN0cnVjdCB5eWd1dHNfdCApLCBOVUxMICk7CisKKyAgICBpZiAoKnB0cl95eV9nbG9iYWxzID09IE5VTEwpeworICAgICAgICBlcnJubyA9IEVOT01FTTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogQnkgc2V0dGluZyB0byAweEFBLCB3ZSBleHBvc2UgYnVncyBpbiB5eV9pbml0X2dsb2JhbHMuIExlYXZlIGF0IDB4MDAgZm9yIHJlbGVhc2VzLiAqLworICAgIG1lbXNldCgqcHRyX3l5X2dsb2JhbHMsMHgwMCxzaXplb2Yoc3RydWN0IHl5Z3V0c190KSk7CisKKyAgICByZXR1cm4geXlfaW5pdF9nbG9iYWxzICggKnB0cl95eV9nbG9iYWxzICk7Cit9CisKKy8qIHBjYXBfbGV4X2luaXRfZXh0cmEgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgcGNhcF9sZXhfaW5pdCwgYnV0IGZvbGxvd3MgdGhlCisgKiBjb252ZW50aW9uIG9mIHRha2luZyB0aGUgc2Nhbm5lciBhcyB0aGUgbGFzdCBhcmd1bWVudC4gTm90ZSBob3dldmVyLCB0aGF0CisgKiB0aGlzIGlzIGEgKnBvaW50ZXIqIHRvIGEgc2Nhbm5lciwgYXMgaXQgd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhpcyBjYWxsIChhbmQKKyAqIGlzIHRoZSByZWFzb24sIHRvbywgd2h5IHRoaXMgZnVuY3Rpb24gYWxzbyBtdXN0IGhhbmRsZSBpdHMgb3duIGRlY2xhcmF0aW9uKS4KKyAqIFRoZSB1c2VyIGRlZmluZWQgdmFsdWUgaW4gdGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgYXZhaWxhYmxlIHRvIHBjYXBfYWxsb2MgaW4KKyAqIHRoZSB5eWV4dHJhIGZpZWxkLgorICovCisKK2ludCBwY2FwX2xleF9pbml0X2V4dHJhKFlZX0VYVFJBX1RZUEUgeXlfdXNlcl9kZWZpbmVkLHl5c2Nhbl90KiBwdHJfeXlfZ2xvYmFscyApCisKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgZHVtbXlfeXlndXRzOworCisgICAgcGNhcF9zZXRfZXh0cmEgKHl5X3VzZXJfZGVmaW5lZCwgJmR1bW15X3l5Z3V0cyk7CisKKyAgICBpZiAocHRyX3l5X2dsb2JhbHMgPT0gTlVMTCl7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisJCisgICAgKnB0cl95eV9nbG9iYWxzID0gKHl5c2Nhbl90KSBwY2FwX2FsbG9jICggc2l6ZW9mKCBzdHJ1Y3QgeXlndXRzX3QgKSwgJmR1bW15X3l5Z3V0cyApOworCQorICAgIGlmICgqcHRyX3l5X2dsb2JhbHMgPT0gTlVMTCl7CisgICAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgCisgICAgLyogQnkgc2V0dGluZyB0byAweEFBLCB3ZSBleHBvc2UgYnVncyBpbgorICAgIHl5X2luaXRfZ2xvYmFscy4gTGVhdmUgYXQgMHgwMCBmb3IgcmVsZWFzZXMuICovCisgICAgbWVtc2V0KCpwdHJfeXlfZ2xvYmFscywweDAwLHNpemVvZihzdHJ1Y3QgeXlndXRzX3QpKTsKKyAgICAKKyAgICBwY2FwX3NldF9leHRyYSAoeXlfdXNlcl9kZWZpbmVkLCAqcHRyX3l5X2dsb2JhbHMpOworICAgIAorICAgIHJldHVybiB5eV9pbml0X2dsb2JhbHMgKCAqcHRyX3l5X2dsb2JhbHMgKTsKK30KKworc3RhdGljIGludCB5eV9pbml0X2dsb2JhbHMgKHl5c2Nhbl90IHl5c2Nhbm5lcikKK3sKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisgICAgLyogSW5pdGlhbGl6YXRpb24gaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBub24tcmVlbnRyYW50IHNjYW5uZXIuCiAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBwY2FwX2xleF9kZXN0cm95KCksIHNvIGRvbid0IGFsbG9jYXRlIGhlcmUuCiAgICAgICovCiAKLSAgICAoeXlfYnVmZmVyX3N0YWNrKSA9IDA7Ci0gICAgKHl5X2J1ZmZlcl9zdGFja190b3ApID0gMDsKLSAgICAoeXlfYnVmZmVyX3N0YWNrX21heCkgPSAwOwotICAgICh5eV9jX2J1Zl9wKSA9IChjaGFyICopIDA7Ci0gICAgKHl5X2luaXQpID0gMDsKLSAgICAoeXlfc3RhcnQpID0gMDsKKyAgICB5eWctPnl5X2J1ZmZlcl9zdGFjayA9IDA7CisgICAgeXlnLT55eV9idWZmZXJfc3RhY2tfdG9wID0gMDsKKyAgICB5eWctPnl5X2J1ZmZlcl9zdGFja19tYXggPSAwOworICAgIHl5Zy0+eXlfY19idWZfcCA9IChjaGFyICopIDA7CisgICAgeXlnLT55eV9pbml0ID0gMDsKKyAgICB5eWctPnl5X3N0YXJ0ID0gMDsKKworICAgIHl5Zy0+eXlfc3RhcnRfc3RhY2tfcHRyID0gMDsKKyAgICB5eWctPnl5X3N0YXJ0X3N0YWNrX2RlcHRoID0gMDsKKyAgICB5eWctPnl5X3N0YXJ0X3N0YWNrID0gIE5VTEw7CiAKIC8qIERlZmluZWQgaW4gbWFpbi5jICovCiAjaWZkZWYgWVlfU1RESU5JVAotICAgIHBjYXBfaW4gPSBzdGRpbjsKLSAgICBwY2FwX291dCA9IHN0ZG91dDsKKyAgICB5eWluID0gc3RkaW47CisgICAgeXlvdXQgPSBzdGRvdXQ7CiAjZWxzZQotICAgIHBjYXBfaW4gPSAoRklMRSAqKSAwOwotICAgIHBjYXBfb3V0ID0gKEZJTEUgKikgMDsKKyAgICB5eWluID0gKEZJTEUgKikgMDsKKyAgICB5eW91dCA9IChGSUxFICopIDA7CiAjZW5kaWYKIAogICAgIC8qIEZvciBmdXR1cmUgcmVmZXJlbmNlOiBTZXQgZXJybm8gb24gZXJyb3IsIHNpbmNlIHdlIGFyZSBjYWxsZWQgYnkKQEAgLTQ2NzYsMjQgKzQ5NzcsMzIgQEAKIH0KIAogLyogcGNhcF9sZXhfZGVzdHJveSBpcyBmb3IgYm90aCByZWVudHJhbnQgYW5kIG5vbi1yZWVudHJhbnQgc2Nhbm5lcnMuICovCi1pbnQgcGNhcF9sZXhfZGVzdHJveSAgKHZvaWQpCitpbnQgcGNhcF9sZXhfZGVzdHJveSAgKHl5c2Nhbl90IHl5c2Nhbm5lcikKIHsKLSAgICAKKyAgICBzdHJ1Y3QgeXlndXRzX3QgKiB5eWcgPSAoc3RydWN0IHl5Z3V0c190Kil5eXNjYW5uZXI7CisKICAgICAvKiBQb3AgdGhlIGJ1ZmZlciBzdGFjaywgZGVzdHJveWluZyBlYWNoIGVsZW1lbnQuICovCiAJd2hpbGUoWVlfQ1VSUkVOVF9CVUZGRVIpewotCQlwY2FwX19kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICApOworCQlwY2FwX19kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICx5eXNjYW5uZXIgKTsKIAkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gTlVMTDsKLQkJcGNhcF9wb3BfYnVmZmVyX3N0YXRlKCk7CisJCXBjYXBfcG9wX2J1ZmZlcl9zdGF0ZSh5eXNjYW5uZXIpOwogCX0KIAogCS8qIERlc3Ryb3kgdGhlIHN0YWNrIGl0c2VsZi4gKi8KLQlwY2FwX2ZyZWUoKHl5X2J1ZmZlcl9zdGFjaykgKTsKLQkoeXlfYnVmZmVyX3N0YWNrKSA9IE5VTEw7CisJcGNhcF9mcmVlKHl5Zy0+eXlfYnVmZmVyX3N0YWNrICx5eXNjYW5uZXIpOworCXl5Zy0+eXlfYnVmZmVyX3N0YWNrID0gTlVMTDsKKworICAgIC8qIERlc3Ryb3kgdGhlIHN0YXJ0IGNvbmRpdGlvbiBzdGFjay4gKi8KKyAgICAgICAgcGNhcF9mcmVlKHl5Zy0+eXlfc3RhcnRfc3RhY2sgLHl5c2Nhbm5lciApOworICAgICAgICB5eWctPnl5X3N0YXJ0X3N0YWNrID0gTlVMTDsKIAogICAgIC8qIFJlc2V0IHRoZSBnbG9iYWxzLiBUaGlzIGlzIGltcG9ydGFudCBpbiBhIG5vbi1yZWVudHJhbnQgc2Nhbm5lciBzbyB0aGUgbmV4dCB0aW1lCiAgICAgICogcGNhcF9sZXgoKSBpcyBjYWxsZWQsIGluaXRpYWxpemF0aW9uIHdpbGwgb2NjdXIuICovCi0gICAgeXlfaW5pdF9nbG9iYWxzKCApOworICAgIHl5X2luaXRfZ2xvYmFscyggeXlzY2FubmVyKTsKIAorICAgIC8qIERlc3Ryb3kgdGhlIG1haW4gc3RydWN0IChyZWVudHJhbnQgb25seSkuICovCisgICAgcGNhcF9mcmVlICggeXlzY2FubmVyICwgeXlzY2FubmVyICk7CisgICAgeXlzY2FubmVyID0gTlVMTDsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDcwMiw3ICs1MDExLDcgQEAKICAqLwogCiAjaWZuZGVmIHl5dGV4dF9wdHIKLXN0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciogczEsIHl5Y29uc3QgY2hhciAqIHMyLCBpbnQgbiApCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgKGNoYXIqIHMxLCB5eWNvbnN0IGNoYXIgKiBzMiwgaW50IG4gLCB5eXNjYW5fdCB5eXNjYW5uZXIpCiB7CiAJcmVnaXN0ZXIgaW50IGk7CiAJZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQpAQCAtNDcxMSw3ICs1MDIwLDcgQEAKICNlbmRpZgogCiAjaWZkZWYgWVlfTkVFRF9TVFJMRU4KLXN0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqIHMgKQorc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogcyAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKIHsKIAlyZWdpc3RlciBpbnQgbjsKIAlmb3IgKCBuID0gMDsgc1tuXTsgKytuICkKQEAgLTQ3MjEsMTIgKzUwMzAsMTIgQEAKIH0KICNlbmRpZgogCi12b2lkICpwY2FwX2FsbG9jICh5eV9zaXplX3QgIHNpemUgKQordm9pZCAqcGNhcF9hbGxvYyAoeXlfc2l6ZV90ICBzaXplICwgeXlzY2FuX3QgeXlzY2FubmVyKQogewogCXJldHVybiAodm9pZCAqKSBtYWxsb2MoIHNpemUgKTsKIH0KIAotdm9pZCAqcGNhcF9yZWFsbG9jICAodm9pZCAqIHB0ciwgeXlfc2l6ZV90ICBzaXplICkKK3ZvaWQgKnBjYXBfcmVhbGxvYyAgKHZvaWQgKiBwdHIsIHl5X3NpemVfdCAgc2l6ZSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKIHsKIAkvKiBUaGUgY2FzdCB0byAoY2hhciAqKSBpbiB0aGUgZm9sbG93aW5nIGFjY29tbW9kYXRlcyBib3RoCiAJICogaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlIGNoYXIqIGdlbmVyaWMgcG9pbnRlcnMsIGFuZCB0aG9zZQpAQCAtNDczOCw0OSArNTA0NywxNiBAQAogCXJldHVybiAodm9pZCAqKSByZWFsbG9jKCAoY2hhciAqKSBwdHIsIHNpemUgKTsKIH0KIAotdm9pZCBwY2FwX2ZyZWUgKHZvaWQgKiBwdHIgKQordm9pZCBwY2FwX2ZyZWUgKHZvaWQgKiBwdHIgLCB5eXNjYW5fdCB5eXNjYW5uZXIpCiB7CiAJZnJlZSggKGNoYXIgKikgcHRyICk7CS8qIHNlZSBwY2FwX3JlYWxsb2MoKSBmb3IgKGNoYXIgKikgY2FzdCAqLwogfQogCiAjZGVmaW5lIFlZVEFCTEVTX05BTUUgInl5dGFibGVzIgogCi0jbGluZSAzODMgInNjYW5uZXIubCIKKyNsaW5lIDQ0MyAic2Nhbm5lci5sIgogCiAKLXZvaWQKLWxleF9pbml0KGJ1ZikKLQljb25zdCBjaGFyICpidWY7Ci17Ci0jaWZkZWYgRkxFWF9TQ0FOTkVSCi0JaW5fYnVmZmVyID0gcGNhcF9fc2Nhbl9zdHJpbmcoYnVmKTsKLSNlbHNlCi0JaW5fYnVmZmVyID0gYnVmOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBEbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkgYWZ0ZXIgcGFyc2luZy4KLSAqLwotdm9pZAotbGV4X2NsZWFudXAoKQotewotI2lmZGVmIEZMRVhfU0NBTk5FUgotCWlmIChpbl9idWZmZXIgIT0gTlVMTCkKLQkJcGNhcF9fZGVsZXRlX2J1ZmZlcihpbl9idWZmZXIpOwotCWluX2J1ZmZlciA9IE5VTEw7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIEFsc28gZGVmaW5lIGEgcGNhcF93cmFwLiAgTm90ZSB0aGF0IGlmIHdlJ3JlIHVzaW5nIGZsZXgsIGl0IHdpbGwKLSAqIGRlZmluZSBhIG1hY3JvIHRvIG1hcCB0aGlzIGlkZW50aWZpZXIgdG8gcGNhcF93cmFwLgotICovCi1pbnQKLXBjYXBfd3JhcCgpCi17Ci0JcmV0dXJuIDE7Ci19CiAKIC8qIEhleCBkaWdpdCB0byBpbnRlZ2VyLiAqLwogc3RhdGljIGlubGluZSBpbnQKZGlmZiAtLWdpdCBhL3NjYW5uZXIuaCBiL3NjYW5uZXIuaAppbmRleCBkOTVmYjg0Li5hOGU1YjBhIDEwMDY0NAotLS0gYS9zY2FubmVyLmgKKysrIGIvc2Nhbm5lci5oCkBAIC0xLDYgKzEsMzY0IEBACi0vKiBUaGlzIGlzIGdlbmVyYXRlZCBieSBydW5sZXguc2guICBEbyBub3QgZWRpdCBpdC4gKi8KKyNpZm5kZWYgcGNhcF9IRUFERVJfSAorI2RlZmluZSBwY2FwX0hFQURFUl9IIDEKKyNkZWZpbmUgcGNhcF9JTl9IRUFERVIgMQogCi0jaWZuZGVmIFlZX0RFQ0wKLSNkZWZpbmUgWVlfREVDTCBpbnQgeXlsZXgodm9pZCkKKyNsaW5lIDYgInNjYW5uZXIuaCIKKyNsaW5lIDIgInNjYW5uZXIubCIKKy8qIE11c3QgY29tZSBmaXJzdCBmb3IgX0xBUkdFX0ZJTEVfQVBJIG9uIEFJWC4gKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCiAjZW5kaWYKLVlZX0RFQ0w7CisKKworCisjbGluZSAxNSAic2Nhbm5lci5oIgorCisjZGVmaW5lICBZWV9JTlRfQUxJR05FRCBzaG9ydCBpbnQKKworLyogQSBsZXhpY2FsIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IGZsZXggKi8KKworI2RlZmluZSBGTEVYX1NDQU5ORVIKKyNkZWZpbmUgWVlfRkxFWF9NQUpPUl9WRVJTSU9OIDIKKyNkZWZpbmUgWVlfRkxFWF9NSU5PUl9WRVJTSU9OIDUKKyNkZWZpbmUgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OIDM5CisjaWYgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OID4gMAorI2RlZmluZSBGTEVYX0JFVEEKKyNlbmRpZgorCisvKiBGaXJzdCwgd2UgZGVhbCB3aXRoICBwbGF0Zm9ybS1zcGVjaWZpYyBvciBjb21waWxlci1zcGVjaWZpYyBpc3N1ZXMuICovCisKKy8qIGJlZ2luIHN0YW5kYXJkIEMgaGVhZGVycy4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIGVuZCBzdGFuZGFyZCBDIGhlYWRlcnMuICovCisKKy8qIGZsZXggaW50ZWdlciB0eXBlIGRlZmluaXRpb25zICovCisKKyNpZm5kZWYgRkxFWElOVF9ICisjZGVmaW5lIEZMRVhJTlRfSAorCisvKiBDOTkgc3lzdGVtcyBoYXZlIDxpbnR0eXBlcy5oPi4gTm9uLUM5OSBzeXN0ZW1zIG1heSBvciBtYXkgbm90LiAqLworCisjaWYgZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisKKy8qIEM5OSBzYXlzIHRvIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TIGJlZm9yZSBpbmNsdWRpbmcgc3RkaW50LmgsCisgKiBpZiB5b3Ugd2FudCB0aGUgbGltaXQgKG1heC9taW4pIG1hY3JvcyBmb3IgaW50IHR5cGVzLiAKKyAqLworI2lmbmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgordHlwZWRlZiBpbnQ4X3QgZmxleF9pbnQ4X3Q7Cit0eXBlZGVmIHVpbnQ4X3QgZmxleF91aW50OF90OwordHlwZWRlZiBpbnQxNl90IGZsZXhfaW50MTZfdDsKK3R5cGVkZWYgdWludDE2X3QgZmxleF91aW50MTZfdDsKK3R5cGVkZWYgaW50MzJfdCBmbGV4X2ludDMyX3Q7Cit0eXBlZGVmIHVpbnQzMl90IGZsZXhfdWludDMyX3Q7CisjZWxzZQordHlwZWRlZiBzaWduZWQgY2hhciBmbGV4X2ludDhfdDsKK3R5cGVkZWYgc2hvcnQgaW50IGZsZXhfaW50MTZfdDsKK3R5cGVkZWYgaW50IGZsZXhfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBmbGV4X3VpbnQ4X3Q7IAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgZmxleF91aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IGZsZXhfdWludDMyX3Q7CisKKy8qIExpbWl0cyBvZiBpbnRlZ3JhbCB0eXBlcy4gKi8KKyNpZm5kZWYgSU5UOF9NSU4KKyNkZWZpbmUgSU5UOF9NSU4gICAgICAgICAgICAgICAoLTEyOCkKKyNlbmRpZgorI2lmbmRlZiBJTlQxNl9NSU4KKyNkZWZpbmUgSU5UMTZfTUlOICAgICAgICAgICAgICAoLTMyNzY3LTEpCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUlOCisjZGVmaW5lIElOVDMyX01JTiAgICAgICAgICAgICAgKC0yMTQ3NDgzNjQ3LTEpCisjZW5kaWYKKyNpZm5kZWYgSU5UOF9NQVgKKyNkZWZpbmUgSU5UOF9NQVggICAgICAgICAgICAgICAoMTI3KQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01BWAorI2RlZmluZSBJTlQxNl9NQVggICAgICAgICAgICAgICgzMjc2NykKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UMzJfTUFYICAgICAgICAgICAgICAoMjE0NzQ4MzY0NykKKyNlbmRpZgorI2lmbmRlZiBVSU5UOF9NQVgKKyNkZWZpbmUgVUlOVDhfTUFYICAgICAgICAgICAgICAoMjU1VSkKKyNlbmRpZgorI2lmbmRlZiBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlQxNl9NQVggICAgICAgICAgICAgKDY1NTM1VSkKKyNlbmRpZgorI2lmbmRlZiBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlQzMl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVKQorI2VuZGlmCisKKyNlbmRpZiAvKiAhIEM5OSAqLworCisjZW5kaWYgLyogISBGTEVYSU5UX0ggKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKy8qIFRoZSAiY29uc3QiIHN0b3JhZ2UtY2xhc3MtbW9kaWZpZXIgaXMgdmFsaWQuICovCisjZGVmaW5lIFlZX1VTRV9DT05TVAorCisjZWxzZQkvKiAhIF9fY3BsdXNwbHVzICovCisKKy8qIEM5OSByZXF1aXJlcyBfX1NURENfXyB0byBiZSBkZWZpbmVkIGFzIDEuICovCisjaWYgZGVmaW5lZCAoX19TVERDX18pCisKKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisKKyNlbmRpZgkvKiBkZWZpbmVkIChfX1NURENfXykgKi8KKyNlbmRpZgkvKiAhIF9fY3BsdXNwbHVzICovCisKKyNpZmRlZiBZWV9VU0VfQ09OU1QKKyNkZWZpbmUgeXljb25zdCBjb25zdAorI2Vsc2UKKyNkZWZpbmUgeXljb25zdAorI2VuZGlmCisKKy8qIEFuIG9wYXF1ZSBwb2ludGVyLiAqLworI2lmbmRlZiBZWV9UWVBFREVGX1lZX1NDQU5ORVJfVAorI2RlZmluZSBZWV9UWVBFREVGX1lZX1NDQU5ORVJfVAordHlwZWRlZiB2b2lkKiB5eXNjYW5fdDsKKyNlbmRpZgorCisvKiBGb3IgY29udmVuaWVuY2UsIHRoZXNlIHZhcnMgKHBsdXMgdGhlIGJpc29uIHZhcnMgZmFyIGJlbG93KQorICAgYXJlIG1hY3JvcyBpbiB0aGUgcmVlbnRyYW50IHNjYW5uZXIuICovCisjZGVmaW5lIHl5aW4geXlnLT55eWluX3IKKyNkZWZpbmUgeXlvdXQgeXlnLT55eW91dF9yCisjZGVmaW5lIHl5ZXh0cmEgeXlnLT55eWV4dHJhX3IKKyNkZWZpbmUgeXlsZW5nIHl5Zy0+eXlsZW5nX3IKKyNkZWZpbmUgeXl0ZXh0IHl5Zy0+eXl0ZXh0X3IKKyNkZWZpbmUgeXlsaW5lbm8gKFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnNfbGluZW5vKQorI2RlZmluZSB5eWNvbHVtbiAoWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9ic19jb2x1bW4pCisjZGVmaW5lIHl5X2ZsZXhfZGVidWcgeXlnLT55eV9mbGV4X2RlYnVnX3IKKworLyogU2l6ZSBvZiBkZWZhdWx0IGlucHV0IGJ1ZmZlci4gKi8KKyNpZm5kZWYgWVlfQlVGX1NJWkUKKyNpZmRlZiBfX2lhNjRfXworLyogT24gSUEtNjQsIHRoZSBidWZmZXIgc2l6ZSBpcyAxNmssIG5vdCA4ay4KKyAqIE1vcmVvdmVyLCBZWV9CVUZfU0laRSBpcyAyKllZX1JFQURfQlVGX1NJWkUgaW4gdGhlIGdlbmVyYWwgY2FzZS4KKyAqIERpdHRvIGZvciB0aGUgX19pYTY0X18gY2FzZSBhY2NvcmRpbmdseS4KKyAqLworI2RlZmluZSBZWV9CVUZfU0laRSAzMjc2OAorI2Vsc2UKKyNkZWZpbmUgWVlfQlVGX1NJWkUgMTYzODQKKyNlbmRpZiAvKiBfX2lhNjRfXyAqLworI2VuZGlmCisKKyNpZm5kZWYgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKKyNkZWZpbmUgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKK3R5cGVkZWYgc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSAqWVlfQlVGRkVSX1NUQVRFOworI2VuZGlmCisKKyNpZm5kZWYgWVlfVFlQRURFRl9ZWV9TSVpFX1QKKyNkZWZpbmUgWVlfVFlQRURFRl9ZWV9TSVpFX1QKK3R5cGVkZWYgc2l6ZV90IHl5X3NpemVfdDsKKyNlbmRpZgorCisjaWZuZGVmIFlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUKKyNkZWZpbmUgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQorc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZQorCXsKKwlGSUxFICp5eV9pbnB1dF9maWxlOworCisJY2hhciAqeXlfY2hfYnVmOwkJLyogaW5wdXQgYnVmZmVyICovCisJY2hhciAqeXlfYnVmX3BvczsJCS8qIGN1cnJlbnQgcG9zaXRpb24gaW4gaW5wdXQgYnVmZmVyICovCisKKwkvKiBTaXplIG9mIGlucHV0IGJ1ZmZlciBpbiBieXRlcywgbm90IGluY2x1ZGluZyByb29tIGZvciBFT0IKKwkgKiBjaGFyYWN0ZXJzLgorCSAqLworCXl5X3NpemVfdCB5eV9idWZfc2l6ZTsKKworCS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgaW50byB5eV9jaF9idWYsIG5vdCBpbmNsdWRpbmcgRU9CCisJICogY2hhcmFjdGVycy4KKwkgKi8KKwl5eV9zaXplX3QgeXlfbl9jaGFyczsKKworCS8qIFdoZXRoZXIgd2UgIm93biIgdGhlIGJ1ZmZlciAtIGkuZS4sIHdlIGtub3cgd2UgY3JlYXRlZCBpdCwKKwkgKiBhbmQgY2FuIHJlYWxsb2MoKSBpdCB0byBncm93IGl0LCBhbmQgc2hvdWxkIGZyZWUoKSBpdCB0bworCSAqIGRlbGV0ZSBpdC4KKwkgKi8KKwlpbnQgeXlfaXNfb3VyX2J1ZmZlcjsKKworCS8qIFdoZXRoZXIgdGhpcyBpcyBhbiAiaW50ZXJhY3RpdmUiIGlucHV0IHNvdXJjZTsgaWYgc28sIGFuZAorCSAqIGlmIHdlJ3JlIHVzaW5nIHN0ZGlvIGZvciBpbnB1dCwgdGhlbiB3ZSB3YW50IHRvIHVzZSBnZXRjKCkKKwkgKiBpbnN0ZWFkIG9mIGZyZWFkKCksIHRvIG1ha2Ugc3VyZSB3ZSBzdG9wIGZldGNoaW5nIGlucHV0IGFmdGVyCisJICogZWFjaCBuZXdsaW5lLgorCSAqLworCWludCB5eV9pc19pbnRlcmFjdGl2ZTsKKworCS8qIFdoZXRoZXIgd2UncmUgY29uc2lkZXJlZCB0byBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4KKwkgKiBJZiBzbywgJ14nIHJ1bGVzIHdpbGwgYmUgYWN0aXZlIG9uIHRoZSBuZXh0IG1hdGNoLCBvdGhlcndpc2UKKwkgKiBub3QuCisJICovCisJaW50IHl5X2F0X2JvbDsKKworICAgIGludCB5eV9ic19saW5lbm87IC8qKjwgVGhlIGxpbmUgY291bnQuICovCisgICAgaW50IHl5X2JzX2NvbHVtbjsgLyoqPCBUaGUgY29sdW1uIGNvdW50LiAqLworICAgIAorCS8qIFdoZXRoZXIgdG8gdHJ5IHRvIGZpbGwgdGhlIGlucHV0IGJ1ZmZlciB3aGVuIHdlIHJlYWNoIHRoZQorCSAqIGVuZCBvZiBpdC4KKwkgKi8KKwlpbnQgeXlfZmlsbF9idWZmZXI7CisKKwlpbnQgeXlfYnVmZmVyX3N0YXR1czsKKworCX07CisjZW5kaWYgLyogIVlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUgKi8KKwordm9pZCBwY2FwX3Jlc3RhcnQgKEZJTEUgKmlucHV0X2ZpbGUgLHl5c2Nhbl90IHl5c2Nhbm5lciApOwordm9pZCBwY2FwX19zd2l0Y2hfdG9fYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAseXlzY2FuX3QgeXlzY2FubmVyICk7CitZWV9CVUZGRVJfU1RBVEUgcGNhcF9fY3JlYXRlX2J1ZmZlciAoRklMRSAqZmlsZSxpbnQgc2l6ZSAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkIHBjYXBfX2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3ZvaWQgcGNhcF9fZmx1c2hfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkIHBjYXBfcHVzaF9idWZmZXJfc3RhdGUgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK3ZvaWQgcGNhcF9wb3BfYnVmZmVyX3N0YXRlICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworWVlfQlVGRkVSX1NUQVRFIHBjYXBfX3NjYW5fYnVmZmVyIChjaGFyICpiYXNlLHl5X3NpemVfdCBzaXplICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKK1lZX0JVRkZFUl9TVEFURSBwY2FwX19zY2FuX3N0cmluZyAoeXljb25zdCBjaGFyICp5eV9zdHIgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworWVlfQlVGRkVSX1NUQVRFIHBjYXBfX3NjYW5fYnl0ZXMgKHl5Y29uc3QgY2hhciAqYnl0ZXMseXlfc2l6ZV90IGxlbiAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKK3ZvaWQgKnBjYXBfYWxsb2MgKHl5X3NpemVfdCAseXlzY2FuX3QgeXlzY2FubmVyICk7Cit2b2lkICpwY2FwX3JlYWxsb2MgKHZvaWQgKix5eV9zaXplX3QgLHl5c2Nhbl90IHl5c2Nhbm5lciApOwordm9pZCBwY2FwX2ZyZWUgKHZvaWQgKiAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKKy8qIEJlZ2luIHVzZXIgc2VjdDMgKi8KKworI2RlZmluZSBwY2FwX3dyYXAoeXlzY2FubmVyKSAxCisjZGVmaW5lIFlZX1NLSVBfWVlXUkFQCisKKyNkZWZpbmUgeXl0ZXh0X3B0ciB5eXRleHRfcgorCisjaWZkZWYgWVlfSEVBREVSX0VYUE9SVF9TVEFSVF9DT05ESVRJT05TCisjZGVmaW5lIElOSVRJQUwgMAorCisjZW5kaWYKKworI2lmbmRlZiBZWV9OT19VTklTVERfSAorLyogU3BlY2lhbCBjYXNlIGZvciAidW5pc3RkLmgiLCBzaW5jZSBpdCBpcyBub24tQU5TSS4gV2UgaW5jbHVkZSBpdCB3YXkKKyAqIGRvd24gaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhlIHVzZXIncyBzZWN0aW9uIDEgdG8gaGF2ZSBiZWVuIHNjYW5uZWQgZmlyc3QuCisgKiBUaGUgdXNlciBoYXMgYSBjaGFuY2UgdG8gb3ZlcnJpZGUgaXQgd2l0aCBhbiBvcHRpb24uCisgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjZGVmaW5lIFlZX0VYVFJBX1RZUEUgY29tcGlsZXJfc3RhdGVfdCAqCisKK2ludCBwY2FwX2xleF9pbml0ICh5eXNjYW5fdCogc2Nhbm5lcik7CisKK2ludCBwY2FwX2xleF9pbml0X2V4dHJhIChZWV9FWFRSQV9UWVBFIHVzZXJfZGVmaW5lZCx5eXNjYW5fdCogc2Nhbm5lcik7CisKKy8qIEFjY2Vzc29yIG1ldGhvZHMgdG8gZ2xvYmFscy4KKyAgIFRoZXNlIGFyZSBtYWRlIHZpc2libGUgdG8gbm9uLXJlZW50cmFudCBzY2FubmVycyBmb3IgY29udmVuaWVuY2UuICovCisKK2ludCBwY2FwX2xleF9kZXN0cm95ICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworaW50IHBjYXBfZ2V0X2RlYnVnICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCBwY2FwX3NldF9kZWJ1ZyAoaW50IGRlYnVnX2ZsYWcgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitZWV9FWFRSQV9UWVBFIHBjYXBfZ2V0X2V4dHJhICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCBwY2FwX3NldF9leHRyYSAoWVlfRVhUUkFfVFlQRSB1c2VyX2RlZmluZWQgLHl5c2Nhbl90IHl5c2Nhbm5lciApOworCitGSUxFICpwY2FwX2dldF9pbiAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKK3ZvaWQgcGNhcF9zZXRfaW4gIChGSUxFICogaW5fc3RyICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworRklMRSAqcGNhcF9nZXRfb3V0ICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCBwY2FwX3NldF9vdXQgIChGSUxFICogb3V0X3N0ciAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKK3l5X3NpemVfdCBwY2FwX2dldF9sZW5nICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworY2hhciAqcGNhcF9nZXRfdGV4dCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisKK2ludCBwY2FwX2dldF9saW5lbm8gKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCit2b2lkIHBjYXBfc2V0X2xpbmVubyAoaW50IGxpbmVfbnVtYmVyICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworaW50IHBjYXBfZ2V0X2NvbHVtbiAgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworCit2b2lkIHBjYXBfc2V0X2NvbHVtbiAoaW50IGNvbHVtbl9ubyAseXlzY2FuX3QgeXlzY2FubmVyICk7CisKK1lZU1RZUEUgKiBwY2FwX2dldF9sdmFsICh5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKwordm9pZCBwY2FwX3NldF9sdmFsIChZWVNUWVBFICogeXlsdmFsX3BhcmFtICx5eXNjYW5fdCB5eXNjYW5uZXIgKTsKKworLyogTWFjcm9zIGFmdGVyIHRoaXMgcG9pbnQgY2FuIGFsbCBiZSBvdmVycmlkZGVuIGJ5IHVzZXIgZGVmaW5pdGlvbnMgaW4KKyAqIHNlY3Rpb24gMS4KKyAqLworCisjaWZuZGVmIFlZX1NLSVBfWVlXUkFQCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgaW50IHBjYXBfd3JhcCAoeXlzY2FuX3QgeXlzY2FubmVyICk7CisjZWxzZQorZXh0ZXJuIGludCBwY2FwX3dyYXAgKHl5c2Nhbl90IHl5c2Nhbm5lciApOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiB5eXRleHRfcHRyCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgKGNoYXIgKix5eWNvbnN0IGNoYXIgKixpbnQgLHl5c2Nhbl90IHl5c2Nhbm5lcik7CisjZW5kaWYKKworI2lmZGVmIFlZX05FRURfU1RSTEVOCitzdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuICh5eWNvbnN0IGNoYXIgKiAseXlzY2FuX3QgeXlzY2FubmVyKTsKKyNlbmRpZgorCisjaWZuZGVmIFlZX05PX0lOUFVUCisKKyNlbmRpZgorCisvKiBBbW91bnQgb2Ygc3R1ZmYgdG8gc2x1cnAgdXAgd2l0aCBlYWNoIHJlYWQuICovCisjaWZuZGVmIFlZX1JFQURfQlVGX1NJWkUKKyNpZmRlZiBfX2lhNjRfXworLyogT24gSUEtNjQsIHRoZSBidWZmZXIgc2l6ZSBpcyAxNmssIG5vdCA4ayAqLworI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDE2Mzg0CisjZWxzZQorI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDgxOTIKKyNlbmRpZiAvKiBfX2lhNjRfXyAqLworI2VuZGlmCisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGJ5IHdoaWNoIHN0YXJ0LWNvbmRpdGlvbiBzdGFjayBncm93cy4gKi8KKyNpZm5kZWYgWVlfU1RBUlRfU1RBQ0tfSU5DUgorI2RlZmluZSBZWV9TVEFSVF9TVEFDS19JTkNSIDI1CisjZW5kaWYKKworLyogRGVmYXVsdCBkZWNsYXJhdGlvbiBvZiBnZW5lcmF0ZWQgc2Nhbm5lciAtIGEgZGVmaW5lIHNvIHRoZSB1c2VyIGNhbgorICogZWFzaWx5IGFkZCBwYXJhbWV0ZXJzLgorICovCisjaWZuZGVmIFlZX0RFQ0wKKyNkZWZpbmUgWVlfREVDTF9JU19PVVJTIDEKKworZXh0ZXJuIGludCBwY2FwX2xleCBcCisgICAgICAgICAgICAgICAoWVlTVFlQRSAqIHl5bHZhbF9wYXJhbSAseXlzY2FuX3QgeXlzY2FubmVyKTsKKworI2RlZmluZSBZWV9ERUNMIGludCBwY2FwX2xleCBcCisgICAgICAgICAgICAgICAoWVlTVFlQRSAqIHl5bHZhbF9wYXJhbSAsIHl5c2Nhbl90IHl5c2Nhbm5lcikKKyNlbmRpZiAvKiAhWVlfREVDTCAqLworCisvKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUgLSBnZXQgdGhlIHN0YXRlIGp1c3QgYmVmb3JlIHRoZSBFT0IgY2hhciB3YXMgcmVhY2hlZCAqLworCisjdW5kZWYgWVlfTkVXX0ZJTEUKKyN1bmRlZiBZWV9GTFVTSF9CVUZGRVIKKyN1bmRlZiB5eV9zZXRfYm9sCisjdW5kZWYgeXlfbmV3X2J1ZmZlcgorI3VuZGVmIHl5X3NldF9pbnRlcmFjdGl2ZQorI3VuZGVmIFlZX0RPX0JFRk9SRV9BQ1RJT04KKworI2lmZGVmIFlZX0RFQ0xfSVNfT1VSUworI3VuZGVmIFlZX0RFQ0xfSVNfT1VSUworI3VuZGVmIFlZX0RFQ0wKKyNlbmRpZgorCisjbGluZSA0NDMgInNjYW5uZXIubCIKKworCisjbGluZSAzNjMgInNjYW5uZXIuaCIKKyN1bmRlZiBwY2FwX0lOX0hFQURFUgorI2VuZGlmIC8qIHBjYXBfSEVBREVSX0ggKi8KZGlmZiAtLWdpdCBhL3NjYW5uZXIubCBiL3NjYW5uZXIubAppbmRleCA3MmE4M2Y3Li4xMDAwYjdhIDEwMDY0NAotLS0gYS9zY2FubmVyLmwKKysrIGIvc2Nhbm5lci5sCkBAIC0xLDMgKzEsNDYgQEAKKyV0b3AgeworLyogTXVzdCBjb21lIGZpcnN0IGZvciBfTEFSR0VfRklMRV9BUEkgb24gQUlYLiAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorfQorCisvKgorICogV2Ugd2FudCBhIHJlZW50cmFudCBzY2FubmVyLgorICovCislb3B0aW9uIHJlZW50cmFudAorCisvKgorICogQW5kIHdlIG5lZWQgdG8gcGFzcyB0aGUgY29tcGlsZXIgc3RhdGUgdG8gdGhlIHNjYW5uZXIuCisgKi8KKyVvcHRpb24gZXh0cmEtdHlwZT0iY29tcGlsZXJfc3RhdGVfdCAqIgorCisvKgorICogV2UgZG9uJ3QgdXNlIGlucHV0LCBzbyBkb24ndCBnZW5lcmF0ZSBjb2RlIGZvciBpdC4KKyAqLworJW9wdGlvbiBub2lucHV0CisKKy8qCisgKiBXZSBkb24ndCB1c2UgdW5wdXQsIHNvIGRvbid0IGdlbmVyYXRlIGNvZGUgZm9yIGl0LgorICovCislb3B0aW9uIG5vdW5wdXQKKworLyoKKyAqIFdlIGRvbid0IHJlYWQgZnJvbSB0aGUgdGVybWluYWwuCisgKi8KKyVvcHRpb24gbmV2ZXItaW50ZXJhY3RpdmUKKworLyoKKyAqIFdlIHdhbnQgdG8gc3RvcCBwcm9jZXNzaW5nIHdoZW4gd2UgZ2V0IHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0LgorICovCislb3B0aW9uIG5veXl3cmFwCisKKy8qCisgKiBXZSB3YW50IHRvIGdlbmVyYXRlIGNvZGUgdGhhdCBjYW4gYmUgdXNlZCBieSBhIHJlZW50cmFudCBwYXJzZXIKKyAqIGdlbmVyYXRlZCBieSBCaXNvbiBvciBCZXJrZWxleSBZQUNDLgorICovCislb3B0aW9uIGJpc29uLWJyaWRnZQorCiAlewogLyoKICAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwpAQCAtMjAsMTkgKzYzLDE5IEBACiAgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICovCiAKLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+Ci0jZWxzZSAvKiBXSU4zMiAqLwotI2lmIEhBVkVfSU5UVFlQRVNfSAotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZWxpZiBIQVZFX1NURElOVF9ICi0jaW5jbHVkZSA8c3RkaW50Lmg+CisjaWZkZWYgX1dJTjMyCisgICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2Vsc2UKKyAgI2lmIEhBVkVfSU5UVFlQRVNfSAorICAgICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorICAjZWxpZiBIQVZFX1NURElOVF9ICisgICAgI2luY2x1ZGUgPHN0ZGludC5oPgorICAjZW5kaWYKKyAgI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorICAgICNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorICAjZW5kaWYKKyAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICi0jaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmIC8qIFdJTjMyICovCiAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtNDAsMjUgKzgzLDU2IEBACiAjaW5jbHVkZSAicGNhcC1pbnQuaCIKIAogI2luY2x1ZGUgImdlbmNvZGUuaCIKLSNpZmRlZiBJTkVUNgotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KIAotI2lmZGVmIF9fTUlOR1czMl9fCi0jaW5jbHVkZSAiaXA2X21pc2MuaCIKLSNlbmRpZgotI2Vsc2UgLyogV0lOMzIgKi8KKyNpbmNsdWRlICJncmFtbWFyLmgiCisKKy8qCisgKiBFYXJsaWVyIHZlcnNpb25zIG9mIEZsZXggZG9uJ3QgZGVjbGFyZSB0aGVzZSwgc28gd2UgZGVjbGFyZSB0aGVtCisgKiBvdXJzZWx2ZXMgdG8gc3F1ZWxjaCB3YXJuaW5ncy4KKyAqLworaW50IHBjYXBfZ2V0X2NvbHVtbih5eXNjYW5fdCk7Cit2b2lkIHBjYXBfc2V0X2NvbHVtbihpbnQsIHl5c2Nhbl90KTsKKworI2lmZGVmIElORVQ2CisKKyNpZmRlZiBfV0lOMzIKKy8qCisgKiBUbyBxdW90ZSB0aGUgTVNETiBwYWdlIGZvciBnZXRhZGRyaW5mbygpIGF0CisgKgorICogICAgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM3Mzg1MjAodj12cy44NSkuYXNweAorICoKKyAqICJTdXBwb3J0IGZvciBnZXRhZGRyaW5mbyBvbiBXaW5kb3dzIDIwMDAgYW5kIG9sZGVyIHZlcnNpb25zCisgKiBUaGUgZ2V0YWRkcmluZm8gZnVuY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBXczJfMzIuZGxsIG9uIFdpbmRvd3MgWFAgYW5kCisgKiBsYXRlci4gVG8gZXhlY3V0ZSBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhpcyBmdW5jdGlvbiBvbiBlYXJsaWVyCisgKiB2ZXJzaW9ucyBvZiBXaW5kb3dzLCB0aGVuIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIFdzMnRjcGlwLmggYW5kCisgKiBXc3BpYXBpLmggZmlsZXMuIFdoZW4gdGhlIFdzcGlhcGkuaCBpbmNsdWRlIGZpbGUgaXMgYWRkZWQsIHRoZQorICogZ2V0YWRkcmluZm8gZnVuY3Rpb24gaXMgZGVmaW5lZCB0byB0aGUgV3NwaWFwaUdldEFkZHJJbmZvIGlubGluZQorICogZnVuY3Rpb24gaW4gdGhlIFdzcGlhcGkuaCBmaWxlLiBBdCBydW50aW1lLCB0aGUgV3NwaWFwaUdldEFkZHJJbmZvCisgKiBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgaWYgdGhlIFdzMl8zMi5kbGwgb3IgdGhlCisgKiBXc2hpcDYuZGxsICh0aGUgZmlsZSBjb250YWluaW5nIGdldGFkZHJpbmZvIGluIHRoZSBJUHY2IFRlY2hub2xvZ3kKKyAqIFByZXZpZXcgZm9yIFdpbmRvd3MgMjAwMCkgZG9lcyBub3QgaW5jbHVkZSBnZXRhZGRyaW5mbywgdGhlbiBhCisgKiB2ZXJzaW9uIG9mIGdldGFkZHJpbmZvIGlzIGltcGxlbWVudGVkIGlubGluZSBiYXNlZCBvbiBjb2RlIGluIHRoZQorICogV3NwaWFwaS5oIGhlYWRlciBmaWxlLiBUaGlzIGlubGluZSBjb2RlIHdpbGwgYmUgdXNlZCBvbiBvbGRlciBXaW5kb3dzCisgKiBwbGF0Zm9ybXMgdGhhdCBkbyBub3QgbmF0aXZlbHkgc3VwcG9ydCB0aGUgZ2V0YWRkcmluZm8gZnVuY3Rpb24uIgorICoKKyAqIFdlIHVzZSBnZXRhZGRyaW5mbygpLCBzbyB3ZSBpbmNsdWRlIFdzcGlhcGkuaCBoZXJlLiAgcGNhcC1zdGRpbmMuaAorICogaW5jbHVkZXMgV3MydGNwaXAuaCwgc28gd2UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIGl0IG91cnNlbHZlcy4KKyAqLworI2luY2x1ZGUgPFdzcGlhcGkuaD4KKyNlbHNlIC8qIF9XSU4zMiAqLwogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4JLyogZm9yICJzdHJ1Y3Qgc29ja2FkZHIiIGluICJzdHJ1Y3QgYWRkcmluZm8iICovCiAjaW5jbHVkZSA8bmV0ZGIuaD4JLyogZm9yICJzdHJ1Y3QgYWRkcmluZm8iICovCi0jZW5kaWYgLyogV0lOMzIgKi8KKyNlbmRpZiAvKiBfV0lOMzIgKi8KIAogLyogV29ya2Fyb3VuZCBmb3IgQUlYIDQuMyAqLwogI2lmICFkZWZpbmVkKEFJX05VTUVSSUNIT1NUKQogI2RlZmluZSBBSV9OVU1FUklDSE9TVCAweDA0CiAjZW5kaWYKKwogI2VuZGlmIC8qSU5FVDYqLworCiAjaW5jbHVkZSA8cGNhcC9uYW1lZGIuaD4KLSNpbmNsdWRlICJ0b2tkZWZzLmgiCisjaW5jbHVkZSAiZ3JhbW1hci5oIgogCiAjaWZkZWYgSEFWRV9PU19QUk9UT19ICiAjaW5jbHVkZSAib3MtcHJvdG8uaCIKQEAgLTY3LDIwICsxNDEsNiBAQAogc3RhdGljIGludCBzdG9pKGNoYXIgKik7CiBzdGF0aWMgaW5saW5lIGludCB4ZHRvaShpbnQpOwogCi0jaWZkZWYgRkxFWF9TQ0FOTkVSCi0jZGVmaW5lIFlZX05PX0lOUFVUCi0jZGVmaW5lIFlZX05PX1VOUFVUCi1zdGF0aWMgWVlfQlVGRkVSX1NUQVRFIGluX2J1ZmZlcjsKLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciAqaW5fYnVmZmVyOwotCi0jdW5kZWYgZ2V0YwotI2RlZmluZSBnZXRjKGZwKSAgKCppbl9idWZmZXIgPT0gMCA/IEVPRiA6ICppbl9idWZmZXIrKykKLSNlbmRpZgotCi0jZGVmaW5lIHl5bHZhbCBwY2FwX2x2YWwKLWV4dGVybiBZWVNUWVBFIHl5bHZhbDsKLQogJX0KIAogTgkJKFswLTldK3woMFh8MHgpWzAtOUEtRmEtZl0rKQpAQCAtMjM5LDcgKzI5OSw3IEBACiBwcm90bwkJcmV0dXJuIFBST1RPOwogcHJvdG9jaGFpbgl7CiAjaWZkZWYgTk9fUFJPVE9DSEFJTgotCQkgIGJwZl9lcnJvcigiJXMgbm90IHN1cHBvcnRlZCIsIHl5dGV4dCk7CisJCSAgYnBmX2Vycm9yKHl5ZXh0cmEsICIlcyBub3Qgc3VwcG9ydGVkIiwgeXl0ZXh0KTsKICNlbHNlCiAJCSAgcmV0dXJuIFBST1RPQ0hBSU47CiAjZW5kaWYKQEAgLTMyMywxNyArMzgzLDE3IEBACiAiPT0iCQkJcmV0dXJuICc9JzsKICI8PCIJCQlyZXR1cm4gTFNIOwogIj4+IgkJCXJldHVybiBSU0g7Ci0ke0J9CQkJeyB5eWx2YWwuZSA9IHBjYXBfZXRoZXJfYXRvbigoKGNoYXIgKil5eXRleHQpKzEpOwotCQkJICBpZiAoeXlsdmFsLmUgPT0gTlVMTCkKLQkJCQlicGZfZXJyb3IoIm1hbGxvYyIpOworJHtCfQkJCXsgeXlsdmFsLT5lID0gcGNhcF9ldGhlcl9hdG9uKCgoY2hhciAqKXl5dGV4dCkrMSk7CisJCQkgIGlmICh5eWx2YWwtPmUgPT0gTlVMTCkKKwkJCQlicGZfZXJyb3IoeXlleHRyYSwgIm1hbGxvYyIpOwogCQkJICByZXR1cm4gQUlEOyB9Ci17TUFDfQkJCXsgeXlsdmFsLmUgPSBwY2FwX2V0aGVyX2F0b24oKGNoYXIgKil5eXRleHQpOwotCQkJICBpZiAoeXlsdmFsLmUgPT0gTlVMTCkKLQkJCQlicGZfZXJyb3IoIm1hbGxvYyIpOwore01BQ30JCQl7IHl5bHZhbC0+ZSA9IHBjYXBfZXRoZXJfYXRvbigoY2hhciAqKXl5dGV4dCk7CisJCQkgIGlmICh5eWx2YWwtPmUgPT0gTlVMTCkKKwkJCQlicGZfZXJyb3IoeXlleHRyYSwgIm1hbGxvYyIpOwogCQkJICByZXR1cm4gRUlEOyB9Ci17Tn0JCQl7IHl5bHZhbC5pID0gc3RvaSgoY2hhciAqKXl5dGV4dCk7IHJldHVybiBOVU07IH0KK3tOfQkJCXsgeXlsdmFsLT5pID0gc3RvaSgoY2hhciAqKXl5dGV4dCk7IHJldHVybiBOVU07IH0KICh7Tn1cLntOfSl8KHtOfVwue059XC57Tn0pfCh7Tn1cLntOfVwue059XC57Tn0pCXsKLQkJCXl5bHZhbC5zID0gc2R1cCgoY2hhciAqKXl5dGV4dCk7IHJldHVybiBISUQ7IH0KKwkJCXl5bHZhbC0+cyA9IHNkdXAoeXlleHRyYSwgKGNoYXIgKil5eXRleHQpOyByZXR1cm4gSElEOyB9CiB7VjZ9CQkJewogI2lmZGVmIElORVQ2CiAJCQkgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlczsKQEAgLTM0MSw4MCArNDAxLDQ3IEBACiAJCQkgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2OwogCQkJICBoaW50cy5haV9mbGFncyA9IEFJX05VTUVSSUNIT1NUOwogCQkJICBpZiAoZ2V0YWRkcmluZm8oeXl0ZXh0LCBOVUxMLCAmaGludHMsICZyZXMpKQotCQkJCWJwZl9lcnJvcigiYm9ndXMgSVB2NiBhZGRyZXNzICVzIiwgeXl0ZXh0KTsKKwkJCQlicGZfZXJyb3IoeXlleHRyYSwgImJvZ3VzIElQdjYgYWRkcmVzcyAlcyIsIHl5dGV4dCk7CiAJCQkgIGVsc2UgewogCQkJCWZyZWVhZGRyaW5mbyhyZXMpOwotCQkJCXl5bHZhbC5zID0gc2R1cCgoY2hhciAqKXl5dGV4dCk7IHJldHVybiBISUQ2OworCQkJCXl5bHZhbC0+cyA9IHNkdXAoeXlleHRyYSwgKGNoYXIgKil5eXRleHQpOyByZXR1cm4gSElENjsKIAkJCSAgfQogI2Vsc2UKLQkJCSAgYnBmX2Vycm9yKCJJUHY2IGFkZHJlc3MgJXMgbm90IHN1cHBvcnRlZCIsIHl5dGV4dCk7CisJCQkgIGJwZl9lcnJvcih5eWV4dHJhLCAiSVB2NiBhZGRyZXNzICVzIG5vdCBzdXBwb3J0ZWQiLCB5eXRleHQpOwogI2VuZGlmIC8qSU5FVDYqLwogCQkJfQote0J9Oisoe0J9OispKwkJeyBicGZfZXJyb3IoImJvZ3VzIGV0aGVybmV0IGFkZHJlc3MgJXMiLCB5eXRleHQpOyB9Ci1pY21wdHlwZQkJeyB5eWx2YWwuaSA9IDA7IHJldHVybiBOVU07IH0KLWljbXBjb2RlCQl7IHl5bHZhbC5pID0gMTsgcmV0dXJuIE5VTTsgfQotaWNtcC1lY2hvcmVwbHkJCXsgeXlsdmFsLmkgPSAwOyByZXR1cm4gTlVNOyB9Ci1pY21wLXVucmVhY2gJCXsgeXlsdmFsLmkgPSAzOyByZXR1cm4gTlVNOyB9Ci1pY21wLXNvdXJjZXF1ZW5jaAl7IHl5bHZhbC5pID0gNDsgcmV0dXJuIE5VTTsgfQotaWNtcC1yZWRpcmVjdAkJeyB5eWx2YWwuaSA9IDU7IHJldHVybiBOVU07IH0KLWljbXAtZWNobwkJeyB5eWx2YWwuaSA9IDg7IHJldHVybiBOVU07IH0KLWljbXAtcm91dGVyYWR2ZXJ0CXsgeXlsdmFsLmkgPSA5OyByZXR1cm4gTlVNOyB9Ci1pY21wLXJvdXRlcnNvbGljaXQJeyB5eWx2YWwuaSA9IDEwOyByZXR1cm4gTlVNOyB9Ci1pY21wLXRpbXhjZWVkCQl7IHl5bHZhbC5pID0gMTE7IHJldHVybiBOVU07IH0KLWljbXAtcGFyYW1wcm9iCQl7IHl5bHZhbC5pID0gMTI7IHJldHVybiBOVU07IH0KLWljbXAtdHN0YW1wCQl7IHl5bHZhbC5pID0gMTM7IHJldHVybiBOVU07IH0KLWljbXAtdHN0YW1wcmVwbHkJeyB5eWx2YWwuaSA9IDE0OyByZXR1cm4gTlVNOyB9Ci1pY21wLWlyZXEJCXsgeXlsdmFsLmkgPSAxNTsgcmV0dXJuIE5VTTsgfQotaWNtcC1pcmVxcmVwbHkJCXsgeXlsdmFsLmkgPSAxNjsgcmV0dXJuIE5VTTsgfQotaWNtcC1tYXNrcmVxCQl7IHl5bHZhbC5pID0gMTc7IHJldHVybiBOVU07IH0KLWljbXAtbWFza3JlcGx5CQl7IHl5bHZhbC5pID0gMTg7IHJldHVybiBOVU07IH0KLXRjcGZsYWdzCQl7IHl5bHZhbC5pID0gMTM7IHJldHVybiBOVU07IH0KLXRjcC1maW4JCQl7IHl5bHZhbC5pID0gMHgwMTsgcmV0dXJuIE5VTTsgfQotdGNwLXN5bgkJCXsgeXlsdmFsLmkgPSAweDAyOyByZXR1cm4gTlVNOyB9Ci10Y3AtcnN0CQkJeyB5eWx2YWwuaSA9IDB4MDQ7IHJldHVybiBOVU07IH0KLXRjcC1wdXNoCQl7IHl5bHZhbC5pID0gMHgwODsgcmV0dXJuIE5VTTsgfQotdGNwLWFjawkJCXsgeXlsdmFsLmkgPSAweDEwOyByZXR1cm4gTlVNOyB9Ci10Y3AtdXJnCQkJeyB5eWx2YWwuaSA9IDB4MjA7IHJldHVybiBOVU07IH0KK3tCfTorKHtCfTorKSsJCXsgYnBmX2Vycm9yKHl5ZXh0cmEsICJib2d1cyBldGhlcm5ldCBhZGRyZXNzICVzIiwgeXl0ZXh0KTsgfQoraWNtcHR5cGUJCXsgeXlsdmFsLT5pID0gMDsgcmV0dXJuIE5VTTsgfQoraWNtcGNvZGUJCXsgeXlsdmFsLT5pID0gMTsgcmV0dXJuIE5VTTsgfQoraWNtcC1lY2hvcmVwbHkJCXsgeXlsdmFsLT5pID0gMDsgcmV0dXJuIE5VTTsgfQoraWNtcC11bnJlYWNoCQl7IHl5bHZhbC0+aSA9IDM7IHJldHVybiBOVU07IH0KK2ljbXAtc291cmNlcXVlbmNoCXsgeXlsdmFsLT5pID0gNDsgcmV0dXJuIE5VTTsgfQoraWNtcC1yZWRpcmVjdAkJeyB5eWx2YWwtPmkgPSA1OyByZXR1cm4gTlVNOyB9CitpY21wLWVjaG8JCXsgeXlsdmFsLT5pID0gODsgcmV0dXJuIE5VTTsgfQoraWNtcC1yb3V0ZXJhZHZlcnQJeyB5eWx2YWwtPmkgPSA5OyByZXR1cm4gTlVNOyB9CitpY21wLXJvdXRlcnNvbGljaXQJeyB5eWx2YWwtPmkgPSAxMDsgcmV0dXJuIE5VTTsgfQoraWNtcC10aW14Y2VlZAkJeyB5eWx2YWwtPmkgPSAxMTsgcmV0dXJuIE5VTTsgfQoraWNtcC1wYXJhbXByb2IJCXsgeXlsdmFsLT5pID0gMTI7IHJldHVybiBOVU07IH0KK2ljbXAtdHN0YW1wCQl7IHl5bHZhbC0+aSA9IDEzOyByZXR1cm4gTlVNOyB9CitpY21wLXRzdGFtcHJlcGx5CXsgeXlsdmFsLT5pID0gMTQ7IHJldHVybiBOVU07IH0KK2ljbXAtaXJlcQkJeyB5eWx2YWwtPmkgPSAxNTsgcmV0dXJuIE5VTTsgfQoraWNtcC1pcmVxcmVwbHkJCXsgeXlsdmFsLT5pID0gMTY7IHJldHVybiBOVU07IH0KK2ljbXAtbWFza3JlcQkJeyB5eWx2YWwtPmkgPSAxNzsgcmV0dXJuIE5VTTsgfQoraWNtcC1tYXNrcmVwbHkJCXsgeXlsdmFsLT5pID0gMTg7IHJldHVybiBOVU07IH0KK3RjcGZsYWdzCQl7IHl5bHZhbC0+aSA9IDEzOyByZXR1cm4gTlVNOyB9Cit0Y3AtZmluCQkJeyB5eWx2YWwtPmkgPSAweDAxOyByZXR1cm4gTlVNOyB9Cit0Y3Atc3luCQkJeyB5eWx2YWwtPmkgPSAweDAyOyByZXR1cm4gTlVNOyB9Cit0Y3AtcnN0CQkJeyB5eWx2YWwtPmkgPSAweDA0OyByZXR1cm4gTlVNOyB9Cit0Y3AtcHVzaAkJeyB5eWx2YWwtPmkgPSAweDA4OyByZXR1cm4gTlVNOyB9Cit0Y3AtYWNrCQkJeyB5eWx2YWwtPmkgPSAweDEwOyByZXR1cm4gTlVNOyB9Cit0Y3AtdXJnCQkJeyB5eWx2YWwtPmkgPSAweDIwOyByZXR1cm4gTlVNOyB9CiBbQS1aYS16MC05XShbLV8uQS1aYS16MC05XSpbLkEtWmEtejAtOV0pPyB7Ci0JCQkgeXlsdmFsLnMgPSBzZHVwKChjaGFyICopeXl0ZXh0KTsgcmV0dXJuIElEOyB9Ci0iXFwiW14gISgpXG5cdF0rCXsgeXlsdmFsLnMgPSBzZHVwKChjaGFyICopeXl0ZXh0ICsgMSk7IHJldHVybiBJRDsgfQorCQkJIHl5bHZhbC0+cyA9IHNkdXAoeXlleHRyYSwgKGNoYXIgKil5eXRleHQpOyByZXR1cm4gSUQ7IH0KKyJcXCJbXiAhKClcblx0XSsJeyB5eWx2YWwtPnMgPSBzZHVwKHl5ZXh0cmEsIChjaGFyICopeXl0ZXh0ICsgMSk7IHJldHVybiBJRDsgfQogW14gXFtcXVx0XG5cLV8uQS1aYS16MC05ITw+KCkmfD1dKyB7Ci0JCQlicGZfZXJyb3IoImlsbGVnYWwgdG9rZW46ICVzIiwgeXl0ZXh0KTsgfQotLgkJCXsgYnBmX2Vycm9yKCJpbGxlZ2FsIGNoYXIgJyVjJyIsICp5eXRleHQpOyB9CisJCQlicGZfZXJyb3IoeXlleHRyYSwgImlsbGVnYWwgdG9rZW46ICVzIiwgeXl0ZXh0KTsgfQorLgkJCXsgYnBmX2Vycm9yKHl5ZXh0cmEsICJpbGxlZ2FsIGNoYXIgJyVjJyIsICp5eXRleHQpOyB9CiAlJQotdm9pZAotbGV4X2luaXQoYnVmKQotCWNvbnN0IGNoYXIgKmJ1ZjsKLXsKLSNpZmRlZiBGTEVYX1NDQU5ORVIKLQlpbl9idWZmZXIgPSB5eV9zY2FuX3N0cmluZyhidWYpOwotI2Vsc2UKLQlpbl9idWZmZXIgPSBidWY7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIERvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeSBhZnRlciBwYXJzaW5nLgotICovCi12b2lkCi1sZXhfY2xlYW51cCgpCi17Ci0jaWZkZWYgRkxFWF9TQ0FOTkVSCi0JaWYgKGluX2J1ZmZlciAhPSBOVUxMKQotCQl5eV9kZWxldGVfYnVmZmVyKGluX2J1ZmZlcik7Ci0JaW5fYnVmZmVyID0gTlVMTDsKLSNlbmRpZgotfQotCi0vKgotICogQWxzbyBkZWZpbmUgYSB5eXdyYXAuICBOb3RlIHRoYXQgaWYgd2UncmUgdXNpbmcgZmxleCwgaXQgd2lsbAotICogZGVmaW5lIGEgbWFjcm8gdG8gbWFwIHRoaXMgaWRlbnRpZmllciB0byBwY2FwX3dyYXAuCi0gKi8KLWludAoteXl3cmFwKCkKLXsKLQlyZXR1cm4gMTsKLX0KIAogLyogSGV4IGRpZ2l0IHRvIGludGVnZXIuICovCiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvc2YtcGNhcC1uZy5jIGIvc2YtcGNhcC1uZy5jCmluZGV4IGUyY2FjMDQuLjBjMDI4MjkgMTAwNjQ0Ci0tLSBhL3NmLXBjYXAtbmcuYworKysgYi9zZi1wY2FwLW5nLmMKQEAgLTMwLDkgKzMwLDkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCi0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgotI2Vsc2UgLyogV0lOMzIgKi8KKyNlbHNlIC8qIF9XSU4zMiAqLwogI2lmIEhBVkVfSU5UVFlQRVNfSAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjZWxpZiBIQVZFX1NURElOVF9ICkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KICNlbmRpZgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmIC8qIFdJTjMyICovCisjZW5kaWYgLyogX1dJTjMyICovCiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPG1lbW9yeS5oPgpAQCAtMTIxLDYgKzEyMSw3IEBACiAgKiB0aGF0IG1lYW5zIHRoYXQgdGhpcyBjb2RlIGNhbid0IHJlYWQgdGhlIGZpbGUuCiAgKi8KICNkZWZpbmUgUENBUF9OR19WRVJTSU9OX01BSk9SCTEKKyNkZWZpbmUgUENBUF9OR19WRVJTSU9OX01JTk9SCTAKIAogLyoKICAqIEludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jay4KQEAgLTIwMyw4ICsyMDQsMTAgQEAKIAogdHlwZWRlZiBlbnVtIHsKIAlQQVNTX1RIUk9VR0gsCi0JU0NBTEVfVVAsCi0JU0NBTEVfRE9XTgorCVNDQUxFX1VQX0RFQywKKwlTQ0FMRV9ET1dOX0RFQywKKwlTQ0FMRV9VUF9CSU4sCisJU0NBTEVfRE9XTl9CSU4KIH0gdHN0YW1wX3NjYWxlX3R5cGVfdDsKIAogLyoKQEAgLTIxMiwxNCArMjE1LDE1IEBACiAgKi8KIHN0cnVjdCBwY2FwX25nX2lmIHsKIAl1X2ludCB0c3Jlc29sOwkJCS8qIHRpbWUgc3RhbXAgcmVzb2x1dGlvbiAqLwotCXVfaW50NjRfdCB0c29mZnNldDsJCS8qIHRpbWUgc3RhbXAgb2Zmc2V0ICovCiAJdHN0YW1wX3NjYWxlX3R5cGVfdCBzY2FsZV90eXBlOwkvKiBob3cgdG8gc2NhbGUgKi8KKwl1X2ludCBzY2FsZV9mYWN0b3I7CQkvKiB0aW1lIHN0YW1wIHNjYWxlIGZhY3RvciBmb3IgcG93ZXItb2YtMTAgdHNyZXNvbCAqLworCXVfaW50NjRfdCB0c29mZnNldDsJCS8qIHRpbWUgc3RhbXAgb2Zmc2V0ICovCiB9OwogCiBzdHJ1Y3QgcGNhcF9uZ19zZiB7CiAJdV9pbnQgdXNlcl90c3Jlc29sOwkJLyogdGltZSBzdGFtcCByZXNvbHV0aW9uIHJlcXVlc3RlZCBieSB0aGUgdXNlciAqLwogCWJwZl91X2ludDMyIGlmY291bnQ7CQkvKiBudW1iZXIgb2YgaW50ZXJmYWNlcyBzZWVuIGluIHRoaXMgY2FwdHVyZSAqLwotCWJwZl91X2ludDMyIGlmYWNlc19zaXplOwkvKiBzaXplIG9mIGFycmFyeSBiZWxvdyAqLworCWJwZl91X2ludDMyIGlmYWNlc19zaXplOwkvKiBzaXplIG9mIGFycmF5IGJlbG93ICovCiAJc3RydWN0IHBjYXBfbmdfaWYgKmlmYWNlczsJLyogYXJyYXkgb2YgaW50ZXJmYWNlIGluZm9ybWF0aW9uICovCiB9OwogCkBAIC0yMzYsMTMgKzI0MCwxMyBAQAogCWFtdF9yZWFkID0gZnJlYWQoYnVmLCAxLCBieXRlc190b19yZWFkLCBmcCk7CiAJaWYgKGFtdF9yZWFkICE9IGJ5dGVzX3RvX3JlYWQpIHsKIAkJaWYgKGZlcnJvcihmcCkpIHsKLQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJlcnJvciByZWFkaW5nIGR1bXAgZmlsZTogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChhbXRfcmVhZCA9PSAwICYmICFmYWlsX29uX2VvZikKIAkJCQlyZXR1cm4gKDApOwkvKiBFT0YgKi8KLQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJ0cnVuY2F0ZWQgZHVtcCBmaWxlOyB0cmllZCB0byByZWFkICVsdSBieXRlcywgb25seSBnb3QgJWx1IiwKIAkJCSAgICAodW5zaWduZWQgbG9uZylieXRlc190b19yZWFkLAogCQkJICAgICh1bnNpZ25lZCBsb25nKWFtdF9yZWFkKTsKQEAgLTI1Nyw2ICsyNjEsOCBAQAogewogCWludCBzdGF0dXM7CiAJc3RydWN0IGJsb2NrX2hlYWRlciBiaGRyOworCXVfY2hhciAqYmRhdGE7CisJc2l6ZV90IGRhdGFfcmVtYWluaW5nOwogCiAJc3RhdHVzID0gcmVhZF9ieXRlcyhmcCwgJmJoZHIsIHNpemVvZihiaGRyKSwgMCwgZXJyYnVmKTsKIAlpZiAoc3RhdHVzIDw9IDApCkBAIC0yNzUsNyArMjgxLDcgQEAKIAkgKiBtZW1vcnkgaWYgd2UgcmVhZCBhIG1hbGZvcm1lZCBmaWxlLgogCSAqLwogCWlmIChiaGRyLnRvdGFsX2xlbmd0aCA+IDE2KjEwMjQqMTAyNCkgewotCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgInBjYXAtbmcgYmxvY2sgc2l6ZSAldSA+IG1heGltdW0gJXUiLAogCQkgICAgYmhkci50b3RhbF9sZW5ndGgsIDE2KjEwMjQqMTAyNCk7CiAJCSAgICByZXR1cm4gKC0xKTsKQEAgLTI4Nyw3ICsyOTMsNyBAQAogCSAqLwogCWlmIChiaGRyLnRvdGFsX2xlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYmxvY2tfaGVhZGVyKSArCiAJICAgIHNpemVvZihzdHJ1Y3QgYmxvY2tfdHJhaWxlcikpIHsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJibG9jayBpbiBwY2FwLW5nIGR1bXAgZmlsZSBoYXMgYSBsZW5ndGggb2YgJXUgPCAlbHUiLAogCQkgICAgYmhkci50b3RhbF9sZW5ndGgsCiAJCSAgICAodW5zaWduZWQgbG9uZykoc2l6ZW9mKHN0cnVjdCBibG9ja19oZWFkZXIpICsgc2l6ZW9mKHN0cnVjdCBibG9ja190cmFpbGVyKSkpOwpAQCAtMzAxLDExICszMDcsMTQgQEAKIAkJLyoKIAkJICogTm8gLSBtYWtlIGl0IGJpZyBlbm91Z2guCiAJCSAqLwotCQlwLT5idWZmZXIgPSByZWFsbG9jKHAtPmJ1ZmZlciwgYmhkci50b3RhbF9sZW5ndGgpOwotCQlpZiAocC0+YnVmZmVyID09IE5VTEwpIHsKLQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm91dCBvZiBtZW1vcnkiKTsKKwkJdm9pZCAqYmlnZ2VyX2J1ZmZlcjsKKworCQliaWdnZXJfYnVmZmVyID0gcmVhbGxvYyhwLT5idWZmZXIsIGJoZHIudG90YWxfbGVuZ3RoKTsKKwkJaWYgKGJpZ2dlcl9idWZmZXIgPT0gTlVMTCkgeworCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJvdXQgb2YgbWVtb3J5Iik7CiAJCQlyZXR1cm4gKC0xKTsKIAkJfQorCQlwLT5idWZmZXIgPSBiaWdnZXJfYnVmZmVyOwogCX0KIAogCS8qCkBAIC0zMTMsMTYgKzMyMiwxNiBAQAogCSAqIG9mIHRoZSBibG9jay4KIAkgKi8KIAltZW1jcHkocC0+YnVmZmVyLCAmYmhkciwgc2l6ZW9mKGJoZHIpKTsKLQlpZiAocmVhZF9ieXRlcyhmcCwgcC0+YnVmZmVyICsgc2l6ZW9mKGJoZHIpLAotCSAgICBiaGRyLnRvdGFsX2xlbmd0aCAtIHNpemVvZihiaGRyKSwgMSwgZXJyYnVmKSA9PSAtMSkKKwliZGF0YSA9ICh1X2NoYXIgKilwLT5idWZmZXIgKyBzaXplb2YoYmhkcik7CisJZGF0YV9yZW1haW5pbmcgPSBiaGRyLnRvdGFsX2xlbmd0aCAtIHNpemVvZihiaGRyKTsKKwlpZiAocmVhZF9ieXRlcyhmcCwgYmRhdGEsIGRhdGFfcmVtYWluaW5nLCAxLCBlcnJidWYpID09IC0xKQogCQlyZXR1cm4gKC0xKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgY3Vyc29yLgogCSAqLwotCWN1cnNvci0+ZGF0YSA9IHAtPmJ1ZmZlciArIHNpemVvZihiaGRyKTsKLQljdXJzb3ItPmRhdGFfcmVtYWluaW5nID0gYmhkci50b3RhbF9sZW5ndGggLSBzaXplb2YoYmhkcikgLQotCSAgICBzaXplb2Yoc3RydWN0IGJsb2NrX3RyYWlsZXIpOworCWN1cnNvci0+ZGF0YSA9IGJkYXRhOworCWN1cnNvci0+ZGF0YV9yZW1haW5pbmcgPSBkYXRhX3JlbWFpbmluZyAtIHNpemVvZihzdHJ1Y3QgYmxvY2tfdHJhaWxlcik7CiAJY3Vyc29yLT5ibG9ja190eXBlID0gYmhkci5ibG9ja190eXBlOwogCXJldHVybiAoMSk7CiB9CkBAIC0zMzgsNyArMzQ3LDcgQEAKIAkgKiB0aGUgYmxvY2sgZGF0YS4KIAkgKi8KIAlpZiAoY3Vyc29yLT5kYXRhX3JlbWFpbmluZyA8IGNodW5rX3NpemUpIHsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJibG9jayBvZiB0eXBlICV1IGluIHBjYXAtbmcgZHVtcCBmaWxlIGlzIHRvbyBzaG9ydCIsCiAJCSAgICBjdXJzb3ItPmJsb2NrX3R5cGUpOwogCQlyZXR1cm4gKE5VTEwpOwpAQCAtNDAxLDcgKzQxMCw3IEBACiAKIHN0YXRpYyBpbnQKIHByb2Nlc3NfaWRiX29wdGlvbnMocGNhcF90ICpwLCBzdHJ1Y3QgYmxvY2tfY3Vyc29yICpjdXJzb3IsIHVfaW50ICp0c3Jlc29sLAotICAgIHVfaW50NjRfdCAqdHNvZmZzZXQsIGNoYXIgKmVycmJ1ZikKKyAgICB1X2ludDY0X3QgKnRzb2Zmc2V0LCBpbnQgKmlzX2JpbmFyeSwgY2hhciAqZXJyYnVmKQogewogCXN0cnVjdCBvcHRpb25faGVhZGVyICpvcHRoZHI7CiAJdm9pZCAqb3B0dmFsdWU7CkBAIC00MzksNyArNDQ4LDcgQEAKIAogCQljYXNlIE9QVF9FTkRPRk9QVDoKIAkJCWlmIChvcHRoZHItPm9wdGlvbl9sZW5ndGggIT0gMCkgewotCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgIkludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jayBoYXMgb3B0X2VuZG9mb3B0IG9wdGlvbiB3aXRoIGxlbmd0aCAldSAhPSAwIiwKIAkJCQkgICAgb3B0aGRyLT5vcHRpb25fbGVuZ3RoKTsKIAkJCQlyZXR1cm4gKC0xKTsKQEAgLTQ0OCwxMyArNDU3LDEzIEBACiAKIAkJY2FzZSBJRl9UU1JFU09MOgogCQkJaWYgKG9wdGhkci0+b3B0aW9uX2xlbmd0aCAhPSAxKSB7Ci0JCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAgICAiSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrIGhhcyBpZl90c3Jlc29sIG9wdGlvbiB3aXRoIGxlbmd0aCAldSAhPSAxIiwKIAkJCQkgICAgb3B0aGRyLT5vcHRpb25fbGVuZ3RoKTsKIAkJCQlyZXR1cm4gKC0xKTsKIAkJCX0KIAkJCWlmIChzYXdfdHNyZXNvbCkgewotCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgIkludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jayBoYXMgbW9yZSB0aGFuIG9uZSBpZl90c3Jlc29sIG9wdGlvbiIpOwogCQkJCXJldHVybiAoLTEpOwogCQkJfQpAQCAtNDY0LDExICs0NzMsMTMgQEAKIAkJCQkvKgogCQkJCSAqIFJlc29sdXRpb24gaXMgbmVnYXRpdmUgcG93ZXIgb2YgMi4KIAkJCQkgKi8KKwkJCQkqaXNfYmluYXJ5ID0gMTsKIAkJCQkqdHNyZXNvbCA9IDEgPDwgKHRzcmVzb2xfb3B0ICYgMHg3Rik7CiAJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogUmVzb2x1dGlvbiBpcyBuZWdhdGl2ZSBwb3dlciBvZiAxMC4KIAkJCQkgKi8KKwkJCQkqaXNfYmluYXJ5ID0gMDsKIAkJCQkqdHNyZXNvbCA9IDE7CiAJCQkJZm9yIChpID0gMDsgaSA8IHRzcmVzb2xfb3B0OyBpKyspCiAJCQkJCSp0c3Jlc29sICo9IDEwOwpAQCAtNDc4LDExICs0ODksMTEgQEAKIAkJCQkgKiBSZXNvbHV0aW9uIGlzIHRvbyBoaWdoLgogCQkJCSAqLwogCQkJCWlmICh0c3Jlc29sX29wdCAmIDB4ODApIHsKLQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkJICAgICJJbnRlcmZhY2UgRGVzY3JpcHRpb24gQmxvY2sgaWZfdHNyZXNvbCBvcHRpb24gcmVzb2x1dGlvbiAyXi0ldSBpcyB0b28gaGlnaCIsCiAJCQkJCSAgICB0c3Jlc29sX29wdCAmIDB4N0YpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJCSAgICAiSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrIGlmX3RzcmVzb2wgb3B0aW9uIHJlc29sdXRpb24gMTBeLSV1IGlzIHRvbyBoaWdoIiwKIAkJCQkJICAgIHRzcmVzb2xfb3B0KTsKIAkJCQl9CkBAIC00OTIsMTMgKzUwMywxMyBAQAogCiAJCWNhc2UgSUZfVFNPRkZTRVQ6CiAJCQlpZiAob3B0aGRyLT5vcHRpb25fbGVuZ3RoICE9IDgpIHsKLQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICAgICJJbnRlcmZhY2UgRGVzY3JpcHRpb24gQmxvY2sgaGFzIGlmX3Rzb2Zmc2V0IG9wdGlvbiB3aXRoIGxlbmd0aCAldSAhPSA4IiwKIAkJCQkgICAgb3B0aGRyLT5vcHRpb25fbGVuZ3RoKTsKIAkJCQlyZXR1cm4gKC0xKTsKIAkJCX0KIAkJCWlmIChzYXdfdHNvZmZzZXQpIHsKLQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICAgICJJbnRlcmZhY2UgRGVzY3JpcHRpb24gQmxvY2sgaGFzIG1vcmUgdGhhbiBvbmUgaWZfdHNvZmZzZXQgb3B0aW9uIik7CiAJCQkJcmV0dXJuICgtMSk7CiAJCQl9CkBAIC01MjMsNiArNTM0LDcgQEAKIAlzdHJ1Y3QgcGNhcF9uZ19zZiAqcHM7CiAJdV9pbnQgdHNyZXNvbDsKIAl1X2ludDY0X3QgdHNvZmZzZXQ7CisJaW50IGlzX2JpbmFyeTsKIAogCXBzID0gcC0+cHJpdjsKIApAQCAtNTM4LDQzICs1NTAsMTA3IEBACiAJCS8qCiAJCSAqIFdlIG5lZWQgdG8gZ3JvdyB0aGUgYXJyYXkuCiAJCSAqLwotCQlpZiAocHMtPmlmYWNlcyA9PSBOVUxMKSB7CisJCWJwZl91X2ludDMyIG5ld19pZmFjZXNfc2l6ZTsKKwkJc3RydWN0IHBjYXBfbmdfaWYgKm5ld19pZmFjZXM7CisKKwkJaWYgKHBzLT5pZmFjZXNfc2l6ZSA9PSAwKSB7CiAJCQkvKgogCQkJICogSXQncyBjdXJyZW50bHkgZW1wdHkuCisJCQkgKgorCQkJICogKFRoZSBDbGFuZyBzdGF0aWMgYW5hbHl6ZXIgZG9lc24ndCBkbyBlbm91Z2gsCisJCQkgKiBlcnIsIHVtbSwgZGF0YWZsb3cgKmFuYWx5c2lzKiB0byByZWFsaXplIHRoYXQKKwkJCSAqIHBzLT5pZmFjZXNfc2l6ZSA9PSAwIGlmIHBzLT5pZmFjZXMgPT0gTlVMTCwKKwkJCSAqIGFuZCBzbyBjb21wbGFpbnMgYWJvdXQgYSBwb3NzaWJsZSB6ZXJvIGFyZ3VtZW50CisJCQkgKiB0byByZWFsbG9jKCksIHNvIHdlIGNoZWNrIGZvciB0aGUgZm9ybWVyCisJCQkgKiBjb25kaXRpb24gdG8gc2h1dCBpdCB1cC4KKwkJCSAqCisJCQkgKiBIb3dldmVyLCBpdCBkb2Vzbid0IGNvbXBsYWluIHRoYXQgb25lIG9mIHRoZQorCQkJICogbXVsdGlwbGljYXRpb25zIGJlbG93IGNvdWxkIG92ZXJmbG93LCB3aGljaCBpcworCQkJICogYSByZWFsLCBhbGJlaXQgZXh0cmVtZWx5IHVubGlrZWx5LCBwcm9ibGVtICh5b3UnZAorCQkJICogbmVlZCBhIHBjYXAtbmcgZmlsZSB3aXRoIHRlbnMgb2YgbWlsbGlvbnMgb2YKKwkJCSAqIGludGVyZmFjZXMpLikKIAkJCSAqLwotCQkJcHMtPmlmYWNlc19zaXplID0gMTsKLQkJCXBzLT5pZmFjZXMgPSBtYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgcGNhcF9uZ19pZikpOworCQkJbmV3X2lmYWNlc19zaXplID0gMTsKKwkJCW5ld19pZmFjZXMgPSBtYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgcGNhcF9uZ19pZikpOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIEl0J3Mgbm90IGN1cnJlbnRseSBlbXB0eTsgZG91YmxlIGl0cyBzaXplLgogCQkJICogKFBlcmhhcHMgb3ZlcmtpbGwgb25jZSB3ZSBoYXZlIGEgbG90IG9mIGludGVyZmFjZXMuKQorCQkJICoKKwkJCSAqIENoZWNrIGZvciBvdmVyZmxvdyBpZiB3ZSBkb3VibGUgaXQuCiAJCQkgKi8KLQkJCXBzLT5pZmFjZXNfc2l6ZSAqPSAyOwotCQkJcHMtPmlmYWNlcyA9IHJlYWxsb2MocHMtPmlmYWNlcywgcHMtPmlmYWNlc19zaXplICogc2l6ZW9mIChzdHJ1Y3QgcGNhcF9uZ19pZikpOworCQkJaWYgKHBzLT5pZmFjZXNfc2l6ZSAqIDIgPCBwcy0+aWZhY2VzX3NpemUpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnRlcmZhY2VzIGJlZm9yZQorCQkJCSAqIHBzLT5pZmFjZXNfc2l6ZSBvdmVyZmxvd3MgaXMgdGhlIGxhcmdlc3QKKwkJCQkgKiBwb3NzaWJsZSAzMi1iaXQgcG93ZXIgb2YgMiwgYXMgd2UgZG8KKwkJCQkgKiBzaXplIGRvdWJsaW5nLgorCQkJCSAqLworCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAibW9yZSB0aGFuICV1IGludGVyZmFjZXMgaW4gdGhlIGZpbGUiLAorCQkJCSAgICAweDgwMDAwMDAwVSk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIHBzLT5pZmFjZXNfc2l6ZSAqIDIgZG9lc24ndCBvdmVyZmxvdywgc28gaXQncworCQkJICogc2FmZSB0byBtdWx0aXBseS4KKwkJCSAqLworCQkJbmV3X2lmYWNlc19zaXplID0gcHMtPmlmYWNlc19zaXplICogMjsKKworCQkJLyoKKwkJCSAqIE5vdyBtYWtlIHN1cmUgdGhhdCdzIG5vdCBzbyBiaWcgdGhhdCBpdCBvdmVyZmxvd3MKKwkJCSAqIGlmIHdlIG11bHRpcGx5IGJ5IHNpemVvZiAoc3RydWN0IHBjYXBfbmdfaWYpLgorCQkJICoKKwkJCSAqIFRoYXQgY2FuIGhhcHBlbiBvbiAzMi1iaXQgcGxhdGZvcm1zLCB3aXRoIGEgMzItYml0CisJCQkgKiBzaXplX3Q7IGl0IHNob3VsZG4ndCBoYXBwZW4gb24gNjQtYml0IHBsYXRmb3JtcywKKwkJCSAqIHdpdGggYSA2NC1iaXQgc2l6ZV90LCBhcyBuZXdfaWZhY2VzX3NpemUgaXMKKwkJCSAqIDMyIGJpdHMuCisJCQkgKi8KKwkJCWlmIChuZXdfaWZhY2VzX3NpemUgKiBzaXplb2YgKHN0cnVjdCBwY2FwX25nX2lmKSA8IG5ld19pZmFjZXNfc2l6ZSkgeworCQkJCS8qCisJCQkJICogQXMgdGhpcyBmYWlscyBvbmx5IHdpdGggMzItYml0IHNpemVfdCwKKwkJCQkgKiB0aGUgbXVsdGlwbGljYXRpb24gd2FzIDMyeDMyLT4zMiwgYW5kCisJCQkJICogdGhlIGxhcmdlc3QgMzItYml0IHZhbHVlIHRoYXQgY2FuIHNhZmVseQorCQkJCSAqIGJlIG11bHRpcGxpZWQgYnkgc2l6ZW9mIChzdHJ1Y3QgcGNhcF9uZ19pZikKKwkJCQkgKiB3aXRob3V0IG92ZXJmbG93IGlzIHRoZSBsYXJnZXN0IDMyLWJpdAorCQkJCSAqICh1bnNpZ25lZCkgdmFsdWUgZGl2aWRlZCBieQorCQkJCSAqIHNpemVvZiAoc3RydWN0IHBjYXBfbmdfaWYpLgorCQkJCSAqLworCQkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAibW9yZSB0aGFuICV1IGludGVyZmFjZXMgaW4gdGhlIGZpbGUiLAorCQkJCSAgICAweEZGRkZGRkZGVSAvICgodV9pbnQpc2l6ZW9mIChzdHJ1Y3QgcGNhcF9uZ19pZikpKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJbmV3X2lmYWNlcyA9IHJlYWxsb2MocHMtPmlmYWNlcywgbmV3X2lmYWNlc19zaXplICogc2l6ZW9mIChzdHJ1Y3QgcGNhcF9uZ19pZikpOwogCQl9Ci0JCWlmIChwcy0+aWZhY2VzID09IE5VTEwpIHsKKwkJaWYgKG5ld19pZmFjZXMgPT0gTlVMTCkgewogCQkJLyoKIAkJCSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LgogCQkJICogR2l2ZSB1cC4KIAkJCSAqLwotCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIm91dCBvZiBtZW1vcnkgZm9yIHBlci1pbnRlcmZhY2UgaW5mb3JtYXRpb24gKCV1IGludGVyZmFjZXMpIiwKIAkJCSAgICBwcy0+aWZjb3VudCk7CiAJCQlyZXR1cm4gKDApOwogCQl9CisJCXBzLT5pZmFjZXNfc2l6ZSA9IG5ld19pZmFjZXNfc2l6ZTsKKwkJcHMtPmlmYWNlcyA9IG5ld19pZmFjZXM7CiAJfQogCiAJLyoKIAkgKiBTZXQgdGhlIGRlZmF1bHQgdGltZSBzdGFtcCByZXNvbHV0aW9uIGFuZCBvZmZzZXQuCiAJICovCiAJdHNyZXNvbCA9IDEwMDAwMDA7CS8qIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24gKi8KKwlpc19iaW5hcnkgPSAwOwkJLyogd2hpY2ggaXMgYSBwb3dlciBvZiAxMCAqLwogCXRzb2Zmc2V0ID0gMDsJCS8qIGFic29sdXRlIHRpbWVzdGFtcHMgKi8KIAogCS8qCiAJICogTm93IGxvb2sgZm9yIHZhcmlvdXMgdGltZSBzdGFtcCBvcHRpb25zLCBzbyB3ZSBrbm93CiAJICogaG93IHRvIGludGVycHJldCB0aGUgdGltZSBzdGFtcHMgZm9yIHRoaXMgaW50ZXJmYWNlLgogCSAqLwotCWlmIChwcm9jZXNzX2lkYl9vcHRpb25zKHAsIGN1cnNvciwgJnRzcmVzb2wsICZ0c29mZnNldCwgZXJyYnVmKSA9PSAtMSkKKwlpZiAocHJvY2Vzc19pZGJfb3B0aW9ucyhwLCBjdXJzb3IsICZ0c3Jlc29sLCAmdHNvZmZzZXQsICZpc19iaW5hcnksCisJICAgIGVycmJ1ZikgPT0gLTEpCiAJCXJldHVybiAoMCk7CiAKIAlwcy0+aWZhY2VzW3BzLT5pZmNvdW50IC0gMV0udHNyZXNvbCA9IHRzcmVzb2w7CkBAIC01ODQsNTUgKzY2MCw0MCBAQAogCSAqIERldGVybWluZSB3aGV0aGVyIHdlJ3JlIHNjYWxpbmcgdXAgb3IgZG93biBvciBub3QKIAkgKiBhdCBhbGwgZm9yIHRoaXMgaW50ZXJmYWNlLgogCSAqLwotCXN3aXRjaCAocC0+b3B0LnRzdGFtcF9wcmVjaXNpb24pIHsKLQotCWNhc2UgUENBUF9UU1RBTVBfUFJFQ0lTSU9OX01JQ1JPOgotCQlpZiAodHNyZXNvbCA9PSAxMDAwMDAwKSB7CisJaWYgKHRzcmVzb2wgPT0gcHMtPnVzZXJfdHNyZXNvbCkgeworCQkvKgorCQkgKiBUaGUgcmVzb2x1dGlvbiBpcyB0aGUgcmVzb2x1dGlvbiB0aGUgdXNlciB3YW50cywKKwkJICogc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBzY2FsaW5nLgorCQkgKi8KKwkJcHMtPmlmYWNlc1twcy0+aWZjb3VudCAtIDFdLnNjYWxlX3R5cGUgPSBQQVNTX1RIUk9VR0g7CisJfSBlbHNlIGlmICh0c3Jlc29sID4gcHMtPnVzZXJfdHNyZXNvbCkgeworCQkvKgorCQkgKiBUaGUgcmVzb2x1dGlvbiBpcyBncmVhdGVyIHRoYW4gd2hhdCB0aGUgdXNlciB3YW50cywKKwkJICogc28gd2UgaGF2ZSB0byBzY2FsZSB0aGUgdGltZXN0YW1wcyBkb3duLgorCQkgKi8KKwkJaWYgKGlzX2JpbmFyeSkKKwkJCXBzLT5pZmFjZXNbcHMtPmlmY291bnQgLSAxXS5zY2FsZV90eXBlID0gU0NBTEVfRE9XTl9CSU47CisJCWVsc2UgewogCQkJLyoKLQkJCSAqIFRoZSByZXNvbHV0aW9uIGlzIDEgbWljcm9zZWNvbmQsCi0JCQkgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHNjYWxpbmcuCisJCQkgKiBDYWxjdWxhdGUgdGhlIHNjYWxlIGZhY3Rvci4KIAkJCSAqLwotCQkJcHMtPmlmYWNlc1twcy0+aWZjb3VudCAtIDFdLnNjYWxlX3R5cGUgPSBQQVNTX1RIUk9VR0g7Ci0JCX0gZWxzZSBpZiAodHNyZXNvbCA+IDEwMDAwMDApIHsKLQkJCS8qCi0JCQkgKiBUaGUgcmVzb2x1dGlvbiBpcyBncmVhdGVyIHRoYW4KLQkJCSAqIDEgbWljcm9zZWNvbmQsIHNvIHdlIGhhdmUgdG8KLQkJCSAqIHNjYWxlIHRoZSB0aW1lc3RhbXBzIGRvd24uCi0JCQkgKi8KLQkJCXBzLT5pZmFjZXNbcHMtPmlmY291bnQgLSAxXS5zY2FsZV90eXBlID0gU0NBTEVfRE9XTjsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBUaGUgcmVzb2x1dGlvbiBpcyBsZXNzIHRoYW4gMQotCQkJICogbWljcm9zZWNvbmQsIHNvIHdlIGhhdmUgdG8gc2NhbGUKLQkJCSAqIHRoZSB0aW1lc3RhbXBzIHVwLgotCQkJICovCi0JCQlwcy0+aWZhY2VzW3BzLT5pZmNvdW50IC0gMV0uc2NhbGVfdHlwZSA9IFNDQUxFX1VQOworCQkJcHMtPmlmYWNlc1twcy0+aWZjb3VudCAtIDFdLnNjYWxlX2ZhY3RvciA9IHRzcmVzb2wvcHMtPnVzZXJfdHNyZXNvbDsKKwkJCXBzLT5pZmFjZXNbcHMtPmlmY291bnQgLSAxXS5zY2FsZV90eXBlID0gU0NBTEVfRE9XTl9ERUM7CiAJCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFBDQVBfVFNUQU1QX1BSRUNJU0lPTl9OQU5POgotCQlpZiAodHNyZXNvbCA9PSAxMDAwMDAwMDAwKSB7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIHJlc29sdXRpb24gaXMgbGVzcyB0aGFuIHdoYXQgdGhlIHVzZXIgd2FudHMsCisJCSAqIHNvIHdlIGhhdmUgdG8gc2NhbGUgdGhlIHRpbWVzdGFtcHMgdXAuCisJCSAqLworCQlpZiAoaXNfYmluYXJ5KQorCQkJcHMtPmlmYWNlc1twcy0+aWZjb3VudCAtIDFdLnNjYWxlX3R5cGUgPSBTQ0FMRV9VUF9CSU47CisJCWVsc2UgewogCQkJLyoKLQkJCSAqIFRoZSByZXNvbHV0aW9uIGlzIDEgbmFub3NlY29uZCwKLQkJCSAqIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gc2NhbGluZy4KKwkJCSAqIENhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9yLgogCQkJICovCi0JCQlwcy0+aWZhY2VzW3BzLT5pZmNvdW50IC0gMV0uc2NhbGVfdHlwZSA9IFBBU1NfVEhST1VHSDsKLQkJfSBlbHNlIGlmICh0c3Jlc29sID4gMTAwMDAwMDAwMCkgewotCQkJLyoKLQkJCSAqIFRoZSByZXNvbHV0aW9uIGlzIGdyZWF0ZXIgdGhhbgotCQkJICogMSBuYW5vc2Vjb25kLCBzbyB3ZSBoYXZlIHRvCi0JCQkgKiBzY2FsZSB0aGUgdGltZXN0YW1wcyBkb3duLgotCQkJICovCi0JCQlwcy0+aWZhY2VzW3BzLT5pZmNvdW50IC0gMV0uc2NhbGVfdHlwZSA9IFNDQUxFX0RPV047Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogVGhlIHJlc29sdXRpb24gaXMgbGVzcyB0aGFuIDEKLQkJCSAqIG5hbm9zZWNvbmQsIHNvIHdlIGhhdmUgdG8gc2NhbGUKLQkJCSAqIHRoZSB0aW1lc3RhbXBzIHVwLgotCQkJICovCi0JCQlwcy0+aWZhY2VzW3BzLT5pZmNvdW50IC0gMV0uc2NhbGVfdHlwZSA9IFNDQUxFX1VQOworCQkJcHMtPmlmYWNlc1twcy0+aWZjb3VudCAtIDFdLnNjYWxlX2ZhY3RvciA9IHBzLT51c2VyX3RzcmVzb2wvdHNyZXNvbDsKKwkJCXBzLT5pZmFjZXNbcHMtPmlmY291bnQgLSAxXS5zY2FsZV90eXBlID0gU0NBTEVfVVBfREVDOwogCQl9Ci0JCWJyZWFrOwogCX0KIAlyZXR1cm4gKDEpOwogfQpAQCAtNjkzLDcgKzc1NCw3IEBACiAJYW10X3JlYWQgPSBmcmVhZCgmdG90YWxfbGVuZ3RoLCAxLCBzaXplb2YodG90YWxfbGVuZ3RoKSwgZnApOwogCWlmIChhbXRfcmVhZCA8IHNpemVvZih0b3RhbF9sZW5ndGgpKSB7CiAJCWlmIChmZXJyb3IoZnApKSB7Ci0JCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKIAkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQkqZXJyID0gMTsKQEAgLTcwOSw3ICs3NzAsNyBAQAogCWFtdF9yZWFkID0gZnJlYWQoJmJ5dGVfb3JkZXJfbWFnaWMsIDEsIHNpemVvZihieXRlX29yZGVyX21hZ2ljKSwgZnApOwogCWlmIChhbXRfcmVhZCA8IHNpemVvZihieXRlX29yZGVyX21hZ2ljKSkgewogCQlpZiAoZmVycm9yKGZwKSkgewotCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJKmVyciA9IDE7CkBAIC03MzgsNyArNzk5LDcgQEAKIAkgKiBDaGVjayB0aGUgc2FuaXR5IG9mIHRoZSB0b3RhbCBsZW5ndGguCiAJICovCiAJaWYgKHRvdGFsX2xlbmd0aCA8IHNpemVvZigqYmhkcnApICsgc2l6ZW9mKCpzaGJwKSArIHNpemVvZihzdHJ1Y3QgYmxvY2tfdHJhaWxlcikpIHsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJTZWN0aW9uIEhlYWRlciBCbG9jayBpbiBwY2FwLW5nIGR1bXAgZmlsZSBoYXMgYSBsZW5ndGggb2YgJXUgPCAlbHUiLAogCQkgICAgdG90YWxfbGVuZ3RoLAogCQkgICAgKHVuc2lnbmVkIGxvbmcpKHNpemVvZigqYmhkcnApICsgc2l6ZW9mKCpzaGJwKSArIHNpemVvZihzdHJ1Y3QgYmxvY2tfdHJhaWxlcikpKTsKQEAgLTc3Myw3ICs4MzQsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAidW5rbm93biB0aW1lIHN0YW1wIHJlc29sdXRpb24gJXUiLCBwcmVjaXNpb24pOwogCQlmcmVlKHApOwogCQkqZXJyID0gMTsKQEAgLTc5OSw3ICs4NjAsNyBAQAogCQlwLT5idWZzaXplID0gdG90YWxfbGVuZ3RoOwogCXAtPmJ1ZmZlciA9IG1hbGxvYyhwLT5idWZzaXplKTsKIAlpZiAocC0+YnVmZmVyID09IE5VTEwpIHsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAib3V0IG9mIG1lbW9yeSIpOworCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm91dCBvZiBtZW1vcnkiKTsKIAkJZnJlZShwKTsKIAkJKmVyciA9IDE7CiAJCXJldHVybiAoTlVMTCk7CkBAIC04MTAsMTIgKzg3MSwxMiBAQAogCSAqIG9mIHRoZSBTSEIuCiAJICovCiAJYmhkcnAgPSAoc3RydWN0IGJsb2NrX2hlYWRlciAqKXAtPmJ1ZmZlcjsKLQlzaGJwID0gKHN0cnVjdCBzZWN0aW9uX2hlYWRlcl9ibG9jayAqKShwLT5idWZmZXIgKyBzaXplb2Yoc3RydWN0IGJsb2NrX2hlYWRlcikpOworCXNoYnAgPSAoc3RydWN0IHNlY3Rpb25faGVhZGVyX2Jsb2NrICopKCh1X2NoYXIgKilwLT5idWZmZXIgKyBzaXplb2Yoc3RydWN0IGJsb2NrX2hlYWRlcikpOwogCWJoZHJwLT5ibG9ja190eXBlID0gbWFnaWM7CiAJYmhkcnAtPnRvdGFsX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKIAlzaGJwLT5ieXRlX29yZGVyX21hZ2ljID0gYnl0ZV9vcmRlcl9tYWdpYzsKIAlpZiAocmVhZF9ieXRlcyhmcCwKLQkgICAgcC0+YnVmZmVyICsgKHNpemVvZihtYWdpYykgKyBzaXplb2YodG90YWxfbGVuZ3RoKSArIHNpemVvZihieXRlX29yZGVyX21hZ2ljKSksCisJICAgICh1X2NoYXIgKilwLT5idWZmZXIgKyAoc2l6ZW9mKG1hZ2ljKSArIHNpemVvZih0b3RhbF9sZW5ndGgpICsgc2l6ZW9mKGJ5dGVfb3JkZXJfbWFnaWMpKSwKIAkgICAgdG90YWxfbGVuZ3RoIC0gKHNpemVvZihtYWdpYykgKyBzaXplb2YodG90YWxfbGVuZ3RoKSArIHNpemVvZihieXRlX29yZGVyX21hZ2ljKSksCiAJICAgIDEsIGVycmJ1ZikgPT0gLTEpCiAJCWdvdG8gZmFpbDsKQEAgLTgzMSwxMCArODkyLDEyIEBACiAJCSAqIFhYWCAtIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHNlY3Rpb24gbGVuZ3RoLgogCQkgKi8KIAl9Ci0JaWYgKHNoYnAtPm1ham9yX3ZlcnNpb24gIT0gUENBUF9OR19WRVJTSU9OX01BSk9SKSB7Ci0JCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJICAgICJ1bmtub3duIHBjYXAtbmcgc2F2ZWZpbGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgJXUiLAotCQkgICAgc2hicC0+bWFqb3JfdmVyc2lvbik7CisJLyogY3VycmVudGx5IG9ubHkgU0hCIHZlcnNpb24gMS4wIGlzIHN1cHBvcnRlZCAqLworCWlmICghIChzaGJwLT5tYWpvcl92ZXJzaW9uID09IFBDQVBfTkdfVkVSU0lPTl9NQUpPUiAmJgorCSAgICAgICBzaGJwLT5taW5vcl92ZXJzaW9uID09IFBDQVBfTkdfVkVSU0lPTl9NSU5PUikpIHsKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAidW5zdXBwb3J0ZWQgcGNhcC1uZyBzYXZlZmlsZSB2ZXJzaW9uICV1LiV1IiwKKwkJICAgIHNoYnAtPm1ham9yX3ZlcnNpb24sIHNoYnAtPm1pbm9yX3ZlcnNpb24pOwogCQlnb3RvIGZhaWw7CiAJfQogCXAtPnZlcnNpb25fbWFqb3IgPSBzaGJwLT5tYWpvcl92ZXJzaW9uOwpAQCAtODU1LDcgKzkxOCw3IEBACiAJCXN0YXR1cyA9IHJlYWRfYmxvY2soZnAsIHAsICZjdXJzb3IsIGVycmJ1Zik7CiAJCWlmIChzdGF0dXMgPT0gMCkgewogCQkJLyogRU9GIC0gbm8gSURCIGluIHRoaXMgZmlsZSAqLwotCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgInRoZSBjYXB0dXJlIGZpbGUgaGFzIG5vIEludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9ja3MiKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtODgyLDEwICs5NDUsMjIgQEAKIAkJCX0KIAogCQkJLyoKKwkJCSAqIEludGVyZmFjZSBjYXB0dXJlIGxlbmd0aCBzYW5pdHkgY2hlY2sKKwkJCSAqLworCQkJaWYgKGlkYnAtPnNuYXBsZW4gPiBNQVhJTVVNX1NOQVBMRU4pIHsKKwkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgImludmFsaWQgaW50ZXJmYWNlIGNhcHR1cmUgbGVuZ3RoICV1LCAiCisJCQkJICAgICJiaWdnZXIgdGhhbiBtYXhpbXVtIG9mICV1IiwKKwkJCQkgICAgaWRicC0+c25hcGxlbiwgTUFYSU1VTV9TTkFQTEVOKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisKKwkJCS8qCiAJCQkgKiBUcnkgdG8gYWRkIHRoaXMgaW50ZXJmYWNlLgogCQkJICovCiAJCQlpZiAoIWFkZF9pbnRlcmZhY2UocCwgJmN1cnNvciwgZXJyYnVmKSkKIAkJCQlnb3RvIGZhaWw7CisKIAkJCWdvdG8gZG9uZTsKIAogCQljYXNlIEJUX0VQQjoKQEAgLTg5Niw3ICs5NzEsNyBAQAogCQkJICogbm90IHZhbGlkLCBhcyB3ZSBkb24ndCBrbm93IHdoYXQgbGluay1sYXllcgogCQkJICogZW5jYXBzdWxhdGlvbiB0aGUgcGFja2V0IGhhcy4KIAkJCSAqLwotCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgInRoZSBjYXB0dXJlIGZpbGUgaGFzIGEgcGFja2V0IGJsb2NrIGJlZm9yZSBhbnkgSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrcyIpOwogCQkJZ290byBmYWlsOwogCkBAIC0xMDMyLDcgKzExMDcsNyBAQAogCQkJICogYW5kIHRoZSBwYWNrZXQgbGVuZ3RoLgogCQkJICovCiAJCQloZHItPmNhcGxlbiA9IGhkci0+bGVuOwotCQkJaWYgKGhkci0+Y2FwbGVuID4gcC0+c25hcHNob3QpCisJCQlpZiAoaGRyLT5jYXBsZW4gPiAoYnBmX3VfaW50MzIpcC0+c25hcHNob3QpCiAJCQkJaGRyLT5jYXBsZW4gPSBwLT5zbmFwc2hvdDsKIAkJCXQgPSAwOwkvKiBubyB0aW1lIHN0YW1wcyAqLwogCQkJZ290byBmb3VuZDsKQEAgLTEwOTMsMTMgKzExNjgsMTMgQEAKIAkJCSAqIGludGVyZmFjZXM/CiAJCQkgKi8KIAkJCWlmIChwLT5saW5rdHlwZSAhPSBpZGJwLT5saW5rdHlwZSkgewotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgImFuIGludGVyZmFjZSBoYXMgYSB0eXBlICV1IGRpZmZlcmVudCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBpbnRlcmZhY2UiLAogCQkJCSAgICBpZGJwLT5saW5rdHlwZSk7CiAJCQkJcmV0dXJuICgtMSk7CiAJCQl9Ci0JCQlpZiAocC0+c25hcHNob3QgIT0gaWRicC0+c25hcGxlbikgewotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCWlmICgoYnBmX3VfaW50MzIpcC0+c25hcHNob3QgIT0gaWRicC0+c25hcGxlbikgeworCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAgICAiYW4gaW50ZXJmYWNlIGhhcyBhIHNuYXBzaG90IGxlbmd0aCAldSBkaWZmZXJlbnQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgaW50ZXJmYWNlIiwKIAkJCQkgICAgaWRicC0+c25hcGxlbik7CiAJCQkJcmV0dXJuICgtMSk7CkBAIC0xMTUxLDcgKzEyMjYsNyBAQAogCQkJCS8qCiAJCQkJICogQnl0ZSBvcmRlciBjaGFuZ2VzLgogCQkJCSAqLwotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgInRoZSBmaWxlIGhhcyBzZWN0aW9ucyB3aXRoIGRpZmZlcmVudCBieXRlIG9yZGVycyIpOwogCQkJCXJldHVybiAoLTEpOwogCkBAIC0xMTU5LDcgKzEyMzQsNyBAQAogCQkJCS8qCiAJCQkJICogTm90IGEgdmFsaWQgU0hCLgogCQkJCSAqLwotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgInRoZSBmaWxlIGhhcyBhIHNlY3Rpb24gd2l0aCBhIGJhZCBieXRlIG9yZGVyIG1hZ2ljIGZpZWxkIik7CiAJCQkJcmV0dXJuICgtMSk7CiAJCQl9CkBAIC0xMTY5LDcgKzEyNDQsNyBAQAogCQkJICogd2UgaGFuZGxlLgogCQkJICovCiAJCQlpZiAoc2hicC0+bWFqb3JfdmVyc2lvbiAhPSBQQ0FQX05HX1ZFUlNJT05fTUFKT1IpIHsKLQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICAgICJ1bmtub3duIHBjYXAtbmcgc2F2ZWZpbGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgJXUiLAogCQkJCSAgICBzaGJwLT5tYWpvcl92ZXJzaW9uKTsKIAkJCQlyZXR1cm4gKC0xKTsKQEAgLTEyMDMsNyArMTI3OCw3IEBACiAJCS8qCiAJCSAqIFllcy4gIEZhaWwuCiAJCSAqLwotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgImEgcGFja2V0IGFycml2ZWQgb24gaW50ZXJmYWNlICV1LCBidXQgdGhlcmUncyBubyBJbnRlcmZhY2UgRGVzY3JpcHRpb24gQmxvY2sgZm9yIHRoYXQgaW50ZXJmYWNlIiwKIAkJICAgIGludGVyZmFjZV9pZCk7CiAJCXJldHVybiAoLTEpOwpAQCAtMTIyOSwxMSArMTMwNCw3MSBAQAogCQkgKi8KIAkJYnJlYWs7CiAKLQljYXNlIFNDQUxFX1VQOgotCWNhc2UgU0NBTEVfRE9XTjoKKwljYXNlIFNDQUxFX1VQX0RFQzoKIAkJLyoKLQkJICogVGhlIGludGVyZmFjZSByZXNvbHV0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQgdGhlCi0JCSAqIHVzZXIgd2FudHM7IGNvbnZlcnQgdGhlIGZyYWN0aW9ucyB0byB1bml0cyBvZiB0aGUKKwkJICogVGhlIGludGVyZmFjZSByZXNvbHV0aW9uIGlzIGxlc3MgdGhhbiB3aGF0IHRoZSB1c2VyCisJCSAqIHdhbnRzOyBzY2FsZSB0aGUgZnJhY3Rpb25hbCBwYXJ0IHVwIHRvIHRoZSB1bml0cyBvZgorCQkgKiB0aGUgcmVzb2x1dGlvbiB0aGUgdXNlciByZXF1ZXN0ZWQgYnkgbXVsdGlwbHlpbmcgYnkKKwkJICogdGhlIHF1b3RpZW50IG9mIHRoZSB1c2VyLXJlcXVlc3RlZCByZXNvbHV0aW9uIGFuZCB0aGUKKwkJICogZmlsZS1zdXBwbGllZCByZXNvbHV0aW9uLgorCQkgKgorCQkgKiBUaG9zZSByZXNvbHV0aW9ucyBhcmUgYm90aCBwb3dlcnMgb2YgMTAsIGFuZCB0aGUgdXNlci0KKwkJICogcmVxdWVzdGVkIHJlc29sdXRpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBmaWxlLXN1cHBsaWVkCisJCSAqIHJlc29sdXRpb24sIHNvIHRoZSBxdW90aWVudCBpbiBxdWVzdGlvbiBpcyBhbiBpbnRlZ2VyLgorCQkgKiBXZSd2ZSBjYWxjdWxhdGVkIHRoYXQgcXVvdGllbnQgYWxyZWFkeSwgc28gd2UganVzdAorCQkgKiBtdWx0aXBseSBieSBpdC4KKwkJICovCisJCWZyYWMgKj0gcHMtPmlmYWNlc1tpbnRlcmZhY2VfaWRdLnNjYWxlX2ZhY3RvcjsKKwkJYnJlYWs7CisKKwljYXNlIFNDQUxFX1VQX0JJTjoKKwkJLyoKKwkJICogVGhlIGludGVyZmFjZSByZXNvbHV0aW9uIGlzIGxlc3MgdGhhbiB3aGF0IHRoZSB1c2VyCisJCSAqIHdhbnRzOyBzY2FsZSB0aGUgZnJhY3Rpb25hbCBwYXJ0IHVwIHRvIHRoZSB1bml0cyBvZgorCQkgKiB0aGUgcmVzb2x1dGlvbiB0aGUgdXNlciByZXF1ZXN0ZWQgYnkgbXVsdGlwbHlpbmcgYnkKKwkJICogdGhlIHF1b3RpZW50IG9mIHRoZSB1c2VyLXJlcXVlc3RlZCByZXNvbHV0aW9uIGFuZCB0aGUKKwkJICogZmlsZS1zdXBwbGllZCByZXNvbHV0aW9uLgorCQkgKgorCQkgKiBUaGUgZmlsZS1zdXBwbGllZCByZXNvbHV0aW9uIGlzIGEgcG93ZXIgb2YgMiwgc28gdGhlCisJCSAqIHF1b3RpZW50IGlzIG5vdCBhbiBpbnRlZ2VyLCBzbywgaW4gb3JkZXIgdG8gZG8gdGhpcworCQkgKiBlbnRpcmVseSB3aXRoIGludGVnZXIgYXJpdGhtZXRpYywgd2UgbXVsdGlwbHkgYnkgdGhlCisJCSAqIHVzZXItcmVxdWVzdGVkIHJlc29sdXRpb24gYW5kIGRpdmlkZSBieSB0aGUgZmlsZS0KKwkJICogc3VwcGxpZWQgcmVzb2x1dGlvbi4KKwkJICoKKwkJICogWFhYIC0gSXMgdGhlcmUgc29tZXRoaW5nIGNsZXZlciB3ZSBjb3VsZCBkbyBoZXJlLAorCQkgKiBnaXZlbiB0aGF0IHdlIGtub3cgdGhhdCB0aGUgZmlsZS1zdXBwbGllZCByZXNvbHV0aW9uCisJCSAqIGlzIGEgcG93ZXIgb2YgMj8gIERvaW5nIGEgbXVsdGlwbGljYXRpb24gZm9sbG93ZWQgYnkKKwkJICogYSBkaXZpc2lvbiBydW5zIHRoZSByaXNrIG9mIG92ZXJmbG93aW5nLCBhbmQgaW52b2x2ZXMKKwkJICogdHdvIG5vbi1zaW1wbGUgYXJpdGhtZXRpYyBvcGVyYXRpb25zLgorCQkgKi8KKwkJZnJhYyAqPSBwcy0+dXNlcl90c3Jlc29sOworCQlmcmFjIC89IHBzLT5pZmFjZXNbaW50ZXJmYWNlX2lkXS50c3Jlc29sOworCQlicmVhazsKKworCWNhc2UgU0NBTEVfRE9XTl9ERUM6CisJCS8qCisJCSAqIFRoZSBpbnRlcmZhY2UgcmVzb2x1dGlvbiBpcyBncmVhdGVyIHRoYW4gd2hhdCB0aGUgdXNlcgorCQkgKiB3YW50czsgc2NhbGUgdGhlIGZyYWN0aW9uYWwgcGFydCB1cCB0byB0aGUgdW5pdHMgb2YKKwkJICogdGhlIHJlc29sdXRpb24gdGhlIHVzZXIgcmVxdWVzdGVkIGJ5IG11bHRpcGx5aW5nIGJ5CisJCSAqIHRoZSBxdW90aWVudCBvZiB0aGUgdXNlci1yZXF1ZXN0ZWQgcmVzb2x1dGlvbiBhbmQgdGhlCisJCSAqIGZpbGUtc3VwcGxpZWQgcmVzb2x1dGlvbi4KKwkJICoKKwkJICogVGhvc2UgcmVzb2x1dGlvbnMgYXJlIGJvdGggcG93ZXJzIG9mIDEwLCBhbmQgdGhlIHVzZXItCisJCSAqIHJlcXVlc3RlZCByZXNvbHV0aW9uIGlzIGxlc3MgdGhhbiB0aGUgZmlsZS1zdXBwbGllZAorCQkgKiByZXNvbHV0aW9uLCBzbyB0aGUgcXVvdGllbnQgaW4gcXVlc3Rpb24gaXNuJ3QgYW4KKwkJICogaW50ZWdlciwgYnV0IGl0cyByZWNpcHJvY2FsIGlzLCBhbmQgd2UgY2FuIGp1c3QgZGl2aWRlCisJCSAqIGJ5IHRoZSByZWNpcHJvY2FsIG9mIHRoZSBxdW90aWVudC4gIFdlJ3ZlIGNhbGN1bGF0ZWQKKwkJICogdGhlIHJlY2lwcm9jYWwgb2YgdGhhdCBxdW90aWVudCBhbHJlYWR5LCBzbyB3ZSBtdXN0CisJCSAqIGRpdmlkZSBieSBpdC4KKwkJICovCisJCWZyYWMgLz0gcHMtPmlmYWNlc1tpbnRlcmZhY2VfaWRdLnNjYWxlX2ZhY3RvcjsKKwkJYnJlYWs7CisKKworCWNhc2UgU0NBTEVfRE9XTl9CSU46CisJCS8qCisJCSAqIFRoZSBpbnRlcmZhY2UgcmVzb2x1dGlvbiBpcyBncmVhdGVyIHRoYW4gd2hhdCB0aGUgdXNlcgorCQkgKiB3YW50czsgY29udmVydCB0aGUgZnJhY3Rpb25hbCBwYXJ0IHRvIHVuaXRzIG9mIHRoZQogCQkgKiByZXNvbHV0aW9uIHRoZSB1c2VyIHJlcXVlc3RlZCBieSBtdWx0aXBseWluZyBieSB0aGUKIAkJICogcXVvdGllbnQgb2YgdGhlIHVzZXItcmVxdWVzdGVkIHJlc29sdXRpb24gYW5kIHRoZQogCQkgKiBmaWxlLXN1cHBsaWVkIHJlc29sdXRpb24uICBXZSBkbyB0aGF0IGJ5IG11bHRpcGx5aW5nCkBAIC0xMjQxLDI0ICsxMzc2LDM5IEBACiAJCSAqIGZpbGUtc3VwcGxpZWQgcmVzb2x1dGlvbiwgYXMgdGhlIHF1b3RpZW50IG1pZ2h0IG5vdAogCQkgKiBmaXQgaW4gYW4gaW50ZWdlci4KIAkJICoKLQkJICogWFhYIC0gaWYgcHMtPmlmYWNlc1tpbnRlcmZhY2VfaWRdLnRzcmVzb2wgaXMgYSBwb3dlcgotCQkgKiBvZiAxMCwgd2UgY291bGQganVzdCBtdWx0aXBseSBieSB0aGUgcXVvdGllbnQgb2YKLQkJICogcHMtPnVzZXJfdHNyZXNvbCBhbmQgcHMtPmlmYWNlc1tpbnRlcmZhY2VfaWRdLnRzcmVzb2wKLQkJICogaW4gdGhlIHNjYWxlLXVwIGNhc2UsIGFuZCBkaXZpZGUgYnkgdGhlIHF1b3RpZW50IG9mCi0JCSAqIHBzLT5pZmFjZXNbaW50ZXJmYWNlX2lkXS50c3Jlc29sIGFuZCBwcy0+dXNlcl90c3Jlc29sCi0JCSAqIGluIHRoZSBzY2FsZS1kb3duIGNhc2UsIGFzIHdlIGtub3cgdGhvc2Ugd2lsbCBiZSBpbnRlZ2Vycy4KLQkJICogVGhhdCB3b3VsZCBpbnZvbHZlIGZld2VyIGFyaXRobWV0aWMgb3BlcmF0aW9ucywgYW5kCi0JCSAqIHdvdWxkIHJ1biBsZXNzIHJpc2sgb2Ygb3ZlcmZsb3cuCisJCSAqIFRoZSBmaWxlLXN1cHBsaWVkIHJlc29sdXRpb24gaXMgYSBwb3dlciBvZiAyLCBzbyB0aGUKKwkJICogcXVvdGllbnQgaXMgbm90IGFuIGludGVnZXIsIGFuZCBuZWl0aGVyIGlzIGl0cworCQkgKiByZWNpcHJvY2FsLCBzbywgaW4gb3JkZXIgdG8gZG8gdGhpcyBlbnRpcmVseSB3aXRoCisJCSAqIGludGVnZXIgYXJpdGhtZXRpYywgd2UgbXVsdGlwbHkgYnkgdGhlIHVzZXItcmVxdWVzdGVkCisJCSAqIHJlc29sdXRpb24gYW5kIGRpdmlkZSBieSB0aGUgZmlsZS1zdXBwbGllZCByZXNvbHV0aW9uLgogCQkgKgotCQkgKiBJcyB0aGVyZSBzb21ldGhpbmcgY2xldmVyIHdlIGNvdWxkIGRvIGlmCi0JCSAqIHBzLT5pZmFjZXNbaW50ZXJmYWNlX2lkXS50c3Jlc29sIGlzIGEgcG93ZXIgb2YgMj8KKwkJICogWFhYIC0gSXMgdGhlcmUgc29tZXRoaW5nIGNsZXZlciB3ZSBjb3VsZCBkbyBoZXJlLAorCQkgKiBnaXZlbiB0aGF0IHdlIGtub3cgdGhhdCB0aGUgZmlsZS1zdXBwbGllZCByZXNvbHV0aW9uCisJCSAqIGlzIGEgcG93ZXIgb2YgMj8gIERvaW5nIGEgbXVsdGlwbGljYXRpb24gZm9sbG93ZWQgYnkKKwkJICogYSBkaXZpc2lvbiBydW5zIHRoZSByaXNrIG9mIG92ZXJmbG93aW5nLCBhbmQgaW52b2x2ZXMKKwkJICogdHdvIG5vbi1zaW1wbGUgYXJpdGhtZXRpYyBvcGVyYXRpb25zLgogCQkgKi8KIAkJZnJhYyAqPSBwcy0+dXNlcl90c3Jlc29sOwogCQlmcmFjIC89IHBzLT5pZmFjZXNbaW50ZXJmYWNlX2lkXS50c3Jlc29sOwogCQlicmVhazsKIAl9Ci0JaGRyLT50cy50dl9zZWMgPSBzZWM7Ci0JaGRyLT50cy50dl91c2VjID0gZnJhYzsKKyNpZmRlZiBfV0lOMzIKKwkvKgorCSAqIHR2X3NlYyBhbmQgdHZfdXNlZCBpbiB0aGUgV2luZG93cyBzdHJ1Y3QgdGltZXZhbCBhcmUgYm90aAorCSAqIGxvbmdzLgorCSAqLworCWhkci0+dHMudHZfc2VjID0gKGxvbmcpc2VjOworCWhkci0+dHMudHZfdXNlYyA9IChsb25nKWZyYWM7CisjZWxzZQorCS8qCisJICogdHZfc2VjIGluIHRoZSBVTipYIHN0cnVjdCB0aW1ldmFsIGlzIGEgdGltZV90OyB0dl91c2VjIGlzCisJICogc3VzZWNvbmRzX3QgaW4gVU4qWGVzIHRoYXQgd29yayB0aGUgd2F5IHRoZSBjdXJyZW50IFNpbmdsZQorCSAqIFVOSVggU3RhbmRhcmQgc3BlY2lmeSAtIGJ1dCBub3QgYWxsIG9sZGVyIFVOKlhlcyBuZWNlc3NhcmlseQorCSAqIHN1cHBvcnQgdGhhdCB0eXBlLCBzbyBqdXN0IGNhc3QgdG8gaW50LgorCSAqLworCWhkci0+dHMudHZfc2VjID0gKHRpbWVfdClzZWM7CisJaGRyLT50cy50dl91c2VjID0gKGludClmcmFjOworI2VuZGlmCiAKIAkvKgogCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIHBhY2tldCBkYXRhLgpkaWZmIC0tZ2l0IGEvc2YtcGNhcC5jIGIvc2YtcGNhcC5jCmluZGV4IGVhZWRkZmEuLmFjMzA1ZDQgMTAwNjQ0Ci0tLSBhL3NmLXBjYXAuYworKysgYi9zZi1wY2FwLmMKQEAgLTM3LDkgKzM3LDkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCi0jaWZkZWYgV0lOMzIKKyNpZmRlZiBfV0lOMzIKICNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgotI2Vsc2UgLyogV0lOMzIgKi8KKyNlbHNlIC8qIF9XSU4zMiAqLwogI2lmIEhBVkVfSU5UVFlQRVNfSAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjZWxpZiBIQVZFX1NURElOVF9ICkBAIC00OSw3ICs0OSw3IEBACiAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KICNlbmRpZgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmIC8qIFdJTjMyICovCisjZW5kaWYgLyogX1dJTjMyICovCiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPG1lbW9yeS5oPgpAQCAtNzAsNyArNzAsNyBAQAogLyoKICAqIFNldHRpbmcgT19CSU5BUlkgb24gRE9TL1dpbmRvd3MgaXMgYSBiaXQgdHJpY2t5CiAgKi8KLSNpZiBkZWZpbmVkKFdJTjMyKQorI2lmIGRlZmluZWQoX1dJTjMyKQogICAjZGVmaW5lIFNFVF9CSU5NT0RFKGYpICBfc2V0bW9kZShfZmlsZW5vKGYpLCBfT19CSU5BUlkpCiAjZWxpZiBkZWZpbmVkKE1TRE9TKQogICAjaWYgZGVmaW5lZChfX0hJR0hDX18pCkBAIC0xNDksNyArMTQ5LDcgQEAKICAqLwogcGNhcF90ICoKIHBjYXBfY2hlY2tfaGVhZGVyKGJwZl91X2ludDMyIG1hZ2ljLCBGSUxFICpmcCwgdV9pbnQgcHJlY2lzaW9uLCBjaGFyICplcnJidWYsCi0gICAgaW50ICplcnIpCisJCSAgaW50ICplcnIpCiB7CiAJc3RydWN0IHBjYXBfZmlsZV9oZWFkZXIgaGRyOwogCXNpemVfdCBhbXRfcmVhZDsKQEAgLTE4NSwxMSArMTg1LDExIEBACiAJICAgIHNpemVvZihoZHIpIC0gc2l6ZW9mKGhkci5tYWdpYyksIGZwKTsKIAlpZiAoYW10X3JlYWQgIT0gc2l6ZW9mKGhkcikgLSBzaXplb2YoaGRyLm1hZ2ljKSkgewogCQlpZiAoZmVycm9yKGZwKSkgewotCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCiAJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQl9IGVsc2UgewotCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgInRydW5jYXRlZCBkdW1wIGZpbGU7IHRyaWVkIHRvIHJlYWQgJWx1IGZpbGUgaGVhZGVyIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAogCQkJICAgICh1bnNpZ25lZCBsb25nKXNpemVvZihoZHIpLAogCQkJICAgICh1bnNpZ25lZCBsb25nKWFtdF9yZWFkKTsKQEAgLTIxMSwxMyArMjExLDM2IEBACiAJfQogCiAJaWYgKGhkci52ZXJzaW9uX21ham9yIDwgUENBUF9WRVJTSU9OX01BSk9SKSB7Ci0JCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCSAgICAiYXJjaGFpYyBwY2FwIHNhdmVmaWxlIGZvcm1hdCIpOwogCQkqZXJyID0gMTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAKIAkvKgorCSAqIGN1cnJlbnRseSBvbmx5IHZlcnNpb25zIDIuWzAtNF0gYXJlIHN1cHBvcnRlZCB3aXRoCisJICogdGhlIGV4Y2VwdGlvbiBvZiA1NDMuMCBmb3IgREcvVVggdGNwZHVtcC4KKwkgKi8KKwlpZiAoISAoKGhkci52ZXJzaW9uX21ham9yID09IFBDQVBfVkVSU0lPTl9NQUpPUiAmJgorCQloZHIudmVyc2lvbl9taW5vciA8PSBQQ0FQX1ZFUlNJT05fTUlOT1IpIHx8CisJICAgICAgIChoZHIudmVyc2lvbl9tYWpvciA9PSA1NDMgJiYKKwkJaGRyLnZlcnNpb25fbWlub3IgPT0gMCkpKSB7CisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICJ1bnN1cHBvcnRlZCBwY2FwIHNhdmVmaWxlIHZlcnNpb24gJXUuJXUiLAorCQkJIGhkci52ZXJzaW9uX21ham9yLCBoZHIudmVyc2lvbl9taW5vcik7CisJCSplcnIgPSAxOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoaGRyLnNuYXBsZW4gPiBNQVhJTVVNX1NOQVBMRU4pIHsKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgImludmFsaWQgZmlsZSBjYXB0dXJlIGxlbmd0aCAldSwgYmlnZ2VyIHRoYW4gIgorCQkJICJtYXhpbXVtIG9mICV1IiwgaGRyLnNuYXBsZW4sIE1BWElNVU1fU05BUExFTik7CisJCSplcnIgPSAxOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgogCSAqIE9LLCB0aGlzIGlzIGEgZ29vZCBwY2FwIGZpbGUuCiAJICogQWxsb2NhdGUgYSBwY2FwX3QgZm9yIGl0LgogCSAqLwpAQCAtMjgyLDcgKzMwNSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJ1bmtub3duIHRpbWUgc3RhbXAgcmVzb2x1dGlvbiAldSIsIHByZWNpc2lvbik7CiAJCWZyZWUocCk7CiAJCSplcnIgPSAxOwpAQCAtMzc3LDcgKzQwMCw3IEBACiAJfQogCXAtPmJ1ZmZlciA9IG1hbGxvYyhwLT5idWZzaXplKTsKIAlpZiAocC0+YnVmZmVyID09IE5VTEwpIHsKLQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAib3V0IG9mIG1lbW9yeSIpOworCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm91dCBvZiBtZW1vcnkiKTsKIAkJZnJlZShwKTsKIAkJKmVyciA9IDE7CiAJCXJldHVybiAoTlVMTCk7CkBAIC00MTIsMTMgKzQzNSwxMyBAQAogCWFtdF9yZWFkID0gZnJlYWQoJnNmX2hkciwgMSwgcHMtPmhkcnNpemUsIGZwKTsKIAlpZiAoYW10X3JlYWQgIT0gcHMtPmhkcnNpemUpIHsKIAkJaWYgKGZlcnJvcihmcCkpIHsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICJlcnJvciByZWFkaW5nIGR1bXAgZmlsZTogJXMiLAogCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCXJldHVybiAoLTEpOwogCQl9IGVsc2UgewogCQkJaWYgKGFtdF9yZWFkICE9IDApIHsKLQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICAgICJ0cnVuY2F0ZWQgZHVtcCBmaWxlOyB0cmllZCB0byByZWFkICVsdSBoZWFkZXIgYnl0ZXMsIG9ubHkgZ290ICVsdSIsCiAJCQkJICAgICh1bnNpZ25lZCBsb25nKXBzLT5oZHJzaXplLAogCQkJCSAgICAodW5zaWduZWQgbG9uZylhbXRfcmVhZCk7CkBAIC00OTQsNjMgKzUxNyw5MyBAQAogCQkvKgogCQkgKiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIFNvbGFyaXMgMi4zIHN5c3RlbXMgdHJpcHBpbmcKIAkJICogb3ZlciB0aGUgQlVGTU9EIHByb2JsZW0gYW5kIG5vdCBzZXR0aW5nIHRoZSBzbmFwc2hvdAotCQkgKiBjb3JyZWN0bHkgaW4gdGhlIHNhdmVmaWxlIGhlYWRlci4gIElmIHRoZSBjYXBsZW4gaXNuJ3QKLQkJICogZ3Jvc3NseSB3cm9uZywgdHJ5IHRvIHNhbHZhZ2UuCisJCSAqIGNvcnJlY3RseSBpbiB0aGUgc2F2ZWZpbGUgaGVhZGVyLgorCQkgKiBUaGlzIGNhbiBhbHNvIGhhcHBlbiB3aXRoIGEgY29ycnVwdGVkIHNhdmVmaWxlIG9yIGEKKwkJICogc2F2ZWZpbGUgYnVpbHQvbW9kaWZpZWQgYnkgYSBmdXp6IHRlc3Rlci4KKwkJICogSWYgdGhlIGNhcGxlbiBpc24ndCBncm9zc2x5IHdyb25nLCB0cnkgdG8gc2FsdmFnZS4KIAkJICovCi0JCXN0YXRpYyB1X2NoYXIgKnRwID0gTlVMTDsKLQkJc3RhdGljIHNpemVfdCB0c2l6ZSA9IDA7CisJCXNpemVfdCBieXRlc190b19kaXNjYXJkOworCQlzaXplX3QgYnl0ZXNfdG9fcmVhZCwgYnl0ZXNfcmVhZDsKKwkJY2hhciBkaXNjYXJkX2J1Zls0MDk2XTsKIAogCQlpZiAoaGRyLT5jYXBsZW4gPiBNQVhJTVVNX1NOQVBMRU4pIHsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKLQkJCSAgICAiYm9ndXMgc2F2ZWZpbGUgaGVhZGVyIik7CisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiaW52YWxpZCBwYWNrZXQgY2FwdHVyZSBsZW5ndGggJXUsIGJpZ2dlciB0aGFuICIKKwkJCSAgICAibWF4aW11bSBvZiAldSIsIGhkci0+Y2FwbGVuLCBNQVhJTVVNX1NOQVBMRU4pOwogCQkJcmV0dXJuICgtMSk7CiAJCX0KIAotCQlpZiAodHNpemUgPCBoZHItPmNhcGxlbikgewotCQkJdHNpemUgPSAoKGhkci0+Y2FwbGVuICsgMTAyMykgLyAxMDI0KSAqIDEwMjQ7Ci0JCQlpZiAodHAgIT0gTlVMTCkKLQkJCQlmcmVlKCh1X2NoYXIgKil0cCk7Ci0JCQl0cCA9ICh1X2NoYXIgKiltYWxsb2ModHNpemUpOwotCQkJaWYgKHRwID09IE5VTEwpIHsKLQkJCQl0c2l6ZSA9IDA7Ci0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAotCQkJCSAgICAiQlVGTU9EIGhhY2sgbWFsbG9jIik7Ci0JCQkJcmV0dXJuICgtMSk7Ci0JCQl9Ci0JCX0KLQkJYW10X3JlYWQgPSBmcmVhZCgoY2hhciAqKXRwLCAxLCBoZHItPmNhcGxlbiwgZnApOwotCQlpZiAoYW10X3JlYWQgIT0gaGRyLT5jYXBsZW4pIHsKKwkJLyoKKwkJICogWFhYIC0gd2UgZG9uJ3QgZ3JvdyB0aGUgYnVmZmVyIGhlcmUgYmVjYXVzZSBzb21lCisJCSAqIHByb2dyYW0gbWlnaHQgYXNzdW1lIHRoYXQgaXQgd2lsbCBuZXZlciBnZXQgcGFja2V0cworCQkgKiBiaWdnZXIgdGhhbiB0aGUgc25hcHNob3QgbGVuZ3RoOyBmb3IgZXhhbXBsZSwgaXQgbWlnaHQKKwkJICogY29weSBkYXRhIGZyb20gb3VyIGJ1ZmZlciB0byBhIGJ1ZmZlciBvZiBpdHMgb3duLAorCQkgKiBhbGxvY2F0ZWQgYmFzZWQgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBwY2FwX3NuYXBzaG90KCkuCisJCSAqCisJCSAqIFJlYWQgdGhlIGZpcnN0IHAtPmJ1ZnNpemUgYnl0ZXMgaW50byB0aGUgYnVmZmVyLgorCQkgKi8KKwkJYW10X3JlYWQgPSBmcmVhZChwLT5idWZmZXIsIDEsIHAtPmJ1ZnNpemUsIGZwKTsKKwkJaWYgKGFtdF9yZWFkICE9IHAtPmJ1ZnNpemUpIHsKIAkJCWlmIChmZXJyb3IoZnApKSB7Ci0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKIAkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJfSBlbHNlIHsKLQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJLyoKKwkJCQkgKiBZZXMsIHRoaXMgdXNlcyBoZHItPmNhcGxlbjsgdGVjaG5pY2FsbHksCisJCQkJICogaXQncyB0cnVlLCBiZWNhdXNlIHdlIHdvdWxkIHRyeSB0byByZWFkCisJCQkJICogYW5kIGRpc2NhcmQgdGhlIHJlc3Qgb2YgdGhvc2UgYnl0ZXMsIGFuZAorCQkJCSAqIHRoYXQgd291bGQgZmFpbCBiZWNhdXNlIHdlIGdvdCBFT0YgYmVmb3JlCisJCQkJICogdGhlIHJlYWQgZmluaXNoZWQuCisJCQkJICovCisJCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICAgICJ0cnVuY2F0ZWQgZHVtcCBmaWxlOyB0cmllZCB0byByZWFkICV1IGNhcHR1cmVkIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAogCQkJCSAgICBoZHItPmNhcGxlbiwgKHVuc2lnbmVkIGxvbmcpYW10X3JlYWQpOwogCQkJfQogCQkJcmV0dXJuICgtMSk7CiAJCX0KKwogCQkvKgotCQkgKiBXZSBjYW4gb25seSBrZWVwIHVwIHRvIHAtPmJ1ZnNpemUgYnl0ZXMuICBTaW5jZQotCQkgKiBjYXBsZW4gPiBwLT5idWZzaXplIGlzIGV4YWN0bHkgaG93IHdlIGdvdCBoZXJlLAotCQkgKiB3ZSBrbm93IHdlIGNhbiBvbmx5IGtlZXAgdGhlIGZpcnN0IHAtPmJ1ZnNpemUgYnl0ZXMKLQkJICogYW5kIG11c3QgZHJvcCB0aGUgcmVtYWluZGVyLiAgQWRqdXN0IGNhcGxlbiBhY2NvcmRpbmdseSwKLQkJICogc28gd2UgZG9uJ3QgZ2V0IGNvbmZ1c2VkIGxhdGVyIGFzIHRvIGhvdyBtYW55IGJ5dGVzIHdlCi0JCSAqIGhhdmUgdG8gcGxheSB3aXRoLgorCQkgKiBOb3cgcmVhZCBhbmQgZGlzY2FyZCB3aGF0J3MgbGVmdC4KKwkJICovCisJCWJ5dGVzX3RvX2Rpc2NhcmQgPSBoZHItPmNhcGxlbiAtIHAtPmJ1ZnNpemU7CisJCWJ5dGVzX3JlYWQgPSBhbXRfcmVhZDsKKwkJd2hpbGUgKGJ5dGVzX3RvX2Rpc2NhcmQgIT0gMCkgeworCQkJYnl0ZXNfdG9fcmVhZCA9IGJ5dGVzX3RvX2Rpc2NhcmQ7CisJCQlpZiAoYnl0ZXNfdG9fcmVhZCA+IHNpemVvZiAoZGlzY2FyZF9idWYpKQorCQkJCWJ5dGVzX3RvX3JlYWQgPSBzaXplb2YgKGRpc2NhcmRfYnVmKTsKKwkJCWFtdF9yZWFkID0gZnJlYWQoZGlzY2FyZF9idWYsIDEsIGJ5dGVzX3RvX3JlYWQsIGZwKTsKKwkJCWJ5dGVzX3JlYWQgKz0gYW10X3JlYWQ7CisJCQlpZiAoYW10X3JlYWQgIT0gYnl0ZXNfdG9fcmVhZCkgeworCQkJCWlmIChmZXJyb3IoZnApKSB7CisJCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCisJCQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSAgICAidHJ1bmNhdGVkIGR1bXAgZmlsZTsgdHJpZWQgdG8gcmVhZCAldSBjYXB0dXJlZCBieXRlcywgb25seSBnb3QgJWx1IiwKKwkJCQkJICAgIGhkci0+Y2FwbGVuLCAodW5zaWduZWQgbG9uZylieXRlc19yZWFkKTsKKwkJCQl9CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlieXRlc190b19kaXNjYXJkIC09IGFtdF9yZWFkOworCQl9CisKKwkJLyoKKwkJICogQWRqdXN0IGNhcGxlbiBhY2NvcmRpbmdseSwgc28gd2UgZG9uJ3QgZ2V0IGNvbmZ1c2VkIGxhdGVyCisJCSAqIGFzIHRvIGhvdyBtYW55IGJ5dGVzIHdlIGhhdmUgdG8gcGxheSB3aXRoLgogCQkgKi8KIAkJaGRyLT5jYXBsZW4gPSBwLT5idWZzaXplOwotCQltZW1jcHkocC0+YnVmZmVyLCAoY2hhciAqKXRwLCBwLT5idWZzaXplKTsKIAl9IGVsc2UgewogCQkvKiByZWFkIHRoZSBwYWNrZXQgaXRzZWxmICovCiAJCWFtdF9yZWFkID0gZnJlYWQocC0+YnVmZmVyLCAxLCBoZHItPmNhcGxlbiwgZnApOwogCQlpZiAoYW10X3JlYWQgIT0gaGRyLT5jYXBsZW4pIHsKIAkJCWlmIChmZXJyb3IoZnApKSB7Ci0JCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKIAkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkJfSBlbHNlIHsKLQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICAgICJ0cnVuY2F0ZWQgZHVtcCBmaWxlOyB0cmllZCB0byByZWFkICV1IGNhcHR1cmVkIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAogCQkJCSAgICBoZHItPmNhcGxlbiwgKHVuc2lnbmVkIGxvbmcpYW10X3JlYWQpOwogCQkJfQpAQCAtNjA4LDcgKzY2MSw3IEBACiBwY2FwX3NldHVwX2R1bXAocGNhcF90ICpwLCBpbnQgbGlua3R5cGUsIEZJTEUgKmYsIGNvbnN0IGNoYXIgKmZuYW1lKQogewogCi0jaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChNU0RPUykKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChNU0RPUykKIAkvKgogCSAqIElmIHdlJ3JlIHdyaXRpbmcgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCwgcHV0IGl0IGluIGJpbmFyeQogCSAqIG1vZGUsIGFzIHNhdmVmaWxlcyBhcmUgYmluYXJ5IGZpbGVzLgpAQCAtNjIyLDcgKzY3NSw3IEBACiAJCXNldGJ1ZihmLCBOVUxMKTsKICNlbmRpZgogCWlmIChzZl93cml0ZV9oZWFkZXIocCwgZiwgbGlua3R5cGUsIHAtPnR6b2ZmLCBwLT5zbmFwc2hvdCkgPT0gLTEpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3Qgd3JpdGUgdG8gJXM6ICVzIiwKKwkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCB3cml0ZSB0byAlczogJXMiLAogCQkgICAgZm5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJaWYgKGYgIT0gc3Rkb3V0KQogCQkJKHZvaWQpZmNsb3NlKGYpOwpAQCAtNjQ1LDMxICs2OTgsMzYgQEAKIAkgKiBsaW5rLWxheWVyIHR5cGUsIHNvIHdlIGNhbid0IHVzZSBpdC4KIAkgKi8KIAlpZiAoIXAtPmFjdGl2YXRlZCkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIiVzOiBub3QteWV0LWFjdGl2YXRlZCBwY2FwX3QgcGFzc2VkIHRvIHBjYXBfZHVtcF9vcGVuIiwKIAkJICAgIGZuYW1lKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAJbGlua3R5cGUgPSBkbHRfdG9fbGlua3R5cGUocC0+bGlua3R5cGUpOwogCWlmIChsaW5rdHlwZSA9PSAtMSkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkgICAgIiVzOiBsaW5rLWxheWVyIHR5cGUgJWQgaXNuJ3Qgc3VwcG9ydGVkIGluIHNhdmVmaWxlcyIsCiAJCSAgICBmbmFtZSwgcC0+bGlua3R5cGUpOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KIAlsaW5rdHlwZSB8PSBwLT5saW5rdHlwZV9leHQ7CiAKKwlpZiAoZm5hbWUgPT0gTlVMTCkgeworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJBIG51bGwgcG9pbnRlciB3YXMgc3VwcGxpZWQgYXMgdGhlIGZpbGUgbmFtZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJaWYgKGZuYW1lWzBdID09ICctJyAmJiBmbmFtZVsxXSA9PSAnXDAnKSB7CiAJCWYgPSBzdGRvdXQ7CiAJCWZuYW1lID0gInN0YW5kYXJkIG91dHB1dCI7CiAJfSBlbHNlIHsKLSNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChNU0RPUykKIAkJZiA9IGZvcGVuKGZuYW1lLCAidyIpOwogI2Vsc2UKIAkJZiA9IGZvcGVuKGZuYW1lLCAid2IiKTsKICNlbmRpZgogCQlpZiAoZiA9PSBOVUxMKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLAorCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLAogCQkJICAgIGZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlyZXR1cm4gKE5VTEwpOwogCQl9CkBAIC02ODcsNyArNzQ1LDcgQEAKIAogCWxpbmt0eXBlID0gZGx0X3RvX2xpbmt0eXBlKHAtPmxpbmt0eXBlKTsKIAlpZiAobGlua3R5cGUgPT0gLTEpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICJzdHJlYW06IGxpbmstbGF5ZXIgdHlwZSAlZCBpc24ndCBzdXBwb3J0ZWQgaW4gc2F2ZWZpbGVzIiwKIAkJICAgIHAtPmxpbmt0eXBlKTsKIAkJcmV0dXJuIChOVUxMKTsKQEAgLTcwMiwyNiArNzYwLDMyIEBACiB7CiAJRklMRSAqZjsKIAlpbnQgbGlua3R5cGU7Ci0JaW50IGFtdF9yZWFkOworCXNpemVfdCBhbXRfcmVhZDsKIAlzdHJ1Y3QgcGNhcF9maWxlX2hlYWRlciBwaDsKIAogCWxpbmt0eXBlID0gZGx0X3RvX2xpbmt0eXBlKHAtPmxpbmt0eXBlKTsKIAlpZiAobGlua3R5cGUgPT0gLTEpIHsKLQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJICAgICIlczogbGluay1sYXllciB0eXBlICVkIGlzbid0IHN1cHBvcnRlZCBpbiBzYXZlZmlsZXMiLAogCQkgICAgZm5hbWUsIGxpbmt0eXBlKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CisKKwlpZiAoZm5hbWUgPT0gTlVMTCkgeworCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJBIG51bGwgcG9pbnRlciB3YXMgc3VwcGxpZWQgYXMgdGhlIGZpbGUgbmFtZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJaWYgKGZuYW1lWzBdID09ICctJyAmJiBmbmFtZVsxXSA9PSAnXDAnKQogCQlyZXR1cm4gKHBjYXBfc2V0dXBfZHVtcChwLCBsaW5rdHlwZSwgc3Rkb3V0LCAic3RhbmRhcmQgb3V0cHV0IikpOwogCi0jaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQorI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCiAJZiA9IGZvcGVuKGZuYW1lLCAicisiKTsKICNlbHNlCiAJZiA9IGZvcGVuKGZuYW1lLCAicmIrIik7CiAjZW5kaWYKIAlpZiAoZiA9PSBOVUxMKSB7Ci0JCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyIsCisJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwKIAkJICAgIGZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCXJldHVybiAoTlVMTCk7CiAJfQpAQCAtNzMyLDE5ICs3OTYsMTkgQEAKIAlhbXRfcmVhZCA9IGZyZWFkKCZwaCwgMSwgc2l6ZW9mIChwaCksIGYpOwogCWlmIChhbXRfcmVhZCAhPSBzaXplb2YgKHBoKSkgewogCQlpZiAoZmVycm9yKGYpKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLAorCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLAogCQkJICAgIGZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CiAJCQlmY2xvc2UoZik7CiAJCQlyZXR1cm4gKE5VTEwpOwogCQl9IGVsc2UgaWYgKGZlb2YoZikgJiYgYW10X3JlYWQgPiAwKSB7Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiJXM6IHRydW5jYXRlZCBwY2FwIGZpbGUgaGVhZGVyIiwgZm5hbWUpOwogCQkJZmNsb3NlKGYpOwogCQkJcmV0dXJuIChOVUxMKTsKIAkJfQogCX0KIAotI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoTVNET1MpCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoTVNET1MpCiAJLyoKIAkgKiBXZSB0dXJuIG9mZiBidWZmZXJpbmcuCiAJICogWFhYIC0gd2h5PyAgQW5kIHdoeSBub3Qgb24gdGhlIHN0YW5kYXJkIG91dHB1dD8KQEAgLTc3Myw3ICs4MzcsNyBAQAogCiAJCWNhc2UgVENQRFVNUF9NQUdJQzoKIAkJCWlmIChwLT5vcHQudHN0YW1wX3ByZWNpc2lvbiAhPSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTUlDUk8pIHsKLQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkJICAgICIlczogZGlmZmVyZW50IHRpbWUgc3RhbXAgcHJlY2lzaW9uLCBjYW5ub3QgYXBwZW5kIHRvIGZpbGUiLCBmbmFtZSk7CiAJCQkJZmNsb3NlKGYpOwogCQkJCXJldHVybiAoTlVMTCk7CkBAIC03ODIsNyArODQ2LDcgQEAKIAogCQljYXNlIE5TRUNfVENQRFVNUF9NQUdJQzoKIAkJCWlmIChwLT5vcHQudHN0YW1wX3ByZWNpc2lvbiAhPSBQQ0FQX1RTVEFNUF9QUkVDSVNJT05fTkFOTykgewotCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCQkgICAgIiVzOiBkaWZmZXJlbnQgdGltZSBzdGFtcCBwcmVjaXNpb24sIGNhbm5vdCBhcHBlbmQgdG8gZmlsZSIsIGZuYW1lKTsKIAkJCQlmY2xvc2UoZik7CiAJCQkJcmV0dXJuIChOVUxMKTsKQEAgLTc5MSw3ICs4NTUsNyBAQAogCiAJCWNhc2UgU1dBUExPTkcoVENQRFVNUF9NQUdJQyk6CiAJCWNhc2UgU1dBUExPTkcoTlNFQ19UQ1BEVU1QX01BR0lDKToKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICIlczogZGlmZmVyZW50IGJ5dGUgb3JkZXIsIGNhbm5vdCBhcHBlbmQgdG8gZmlsZSIsIGZuYW1lKTsKIAkJCWZjbG9zZShmKTsKIAkJCXJldHVybiAoTlVMTCk7CkBAIC04MDAsMTMgKzg2NCwxMyBAQAogCQljYXNlIFNXQVBMT05HKEtVWk5FVFpPVl9UQ1BEVU1QX01BR0lDKToKIAkJY2FzZSBOQVZURUxfVENQRFVNUF9NQUdJQzoKIAkJY2FzZSBTV0FQTE9ORyhOQVZURUxfVENQRFVNUF9NQUdJQyk6Ci0JCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiJXM6IG5vdCBhIHBjYXAgZmlsZSB0byB3aGljaCB3ZSBjYW4gYXBwZW5kIiwgZm5hbWUpOwogCQkJZmNsb3NlKGYpOwogCQkJcmV0dXJuIChOVUxMKTsKIAogCQlkZWZhdWx0OgotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJcGNhcF9zbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCiAJCQkgICAgIiVzOiBub3QgYSBwY2FwIGZpbGUiLCBmbmFtZSk7CiAJCQlmY2xvc2UoZik7CiAJCQlyZXR1cm4gKE5VTEwpOwpAQCAtODE3LDIwICs4ODEsMjAgQEAKIAkJICovCiAJCWlmIChwaC52ZXJzaW9uX21ham9yICE9IFBDQVBfVkVSU0lPTl9NQUpPUiB8fAogCQkgICAgcGgudmVyc2lvbl9taW5vciAhPSBQQ0FQX1ZFUlNJT05fTUlOT1IpIHsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICIlczogdmVyc2lvbiBpcyAldS4ldSwgY2Fubm90IGFwcGVuZCB0byBmaWxlIiwgZm5hbWUsCiAJCQkgICAgcGgudmVyc2lvbl9tYWpvciwgcGgudmVyc2lvbl9taW5vcik7CiAJCQlmY2xvc2UoZik7CiAJCQlyZXR1cm4gKE5VTEwpOwogCQl9Ci0JCWlmIChsaW5rdHlwZSAhPSBwaC5saW5rdHlwZSkgewotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlpZiAoKGJwZl91X2ludDMyKWxpbmt0eXBlICE9IHBoLmxpbmt0eXBlKSB7CisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKIAkJCSAgICAiJXM6IGRpZmZlcmVudCBsaW5rdHlwZSwgY2Fubm90IGFwcGVuZCB0byBmaWxlIiwgZm5hbWUpOwogCQkJZmNsb3NlKGYpOwogCQkJcmV0dXJuIChOVUxMKTsKIAkJfQotCQlpZiAocC0+c25hcHNob3QgIT0gcGguc25hcGxlbikgewotCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQlpZiAoKGJwZl91X2ludDMyKXAtPnNuYXBzaG90ICE9IHBoLnNuYXBsZW4pIHsKKwkJCXBjYXBfc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAogCQkJICAgICIlczogZGlmZmVyZW50IHNuYXBsZW4sIGNhbm5vdCBhcHBlbmQgdG8gZmlsZSIsIGZuYW1lKTsKIAkJCWZjbG9zZShmKTsKIAkJCXJldHVybiAoTlVMTCk7CkBAIC04NDAsNyArOTA0LDcgQEAKIAkJICogQSBoZWFkZXIgaXNuJ3QgcHJlc2VudDsgYXR0ZW1wdCB0byB3cml0ZSBpdC4KIAkJICovCiAJCWlmIChzZl93cml0ZV9oZWFkZXIocCwgZiwgbGlua3R5cGUsIHAtPnR6b2ZmLCBwLT5zbmFwc2hvdCkgPT0gLTEpIHsKLQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IHdyaXRlIHRvICVzOiAlcyIsCisJCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IHdyaXRlIHRvICVzOiAlcyIsCiAJCQkgICAgZm5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKIAkJCSh2b2lkKWZjbG9zZShmKTsKIAkJCXJldHVybiAoTlVMTCk7CkBAIC04NTEsNyArOTE1LDcgQEAKIAkgKiBTdGFydCB3cml0aW5nIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCiAJICovCiAJaWYgKGZzZWVrKGYsIDAsIFNFRUtfRU5EKSA9PSAtMSkgewotCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBzZWVrIHRvIGVuZCBvZiAlczogJXMiLAorCQlwY2FwX3NucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IHNlZWsgdG8gZW5kIG9mICVzOiAlcyIsCiAJCSAgICBmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwogCQkodm9pZClmY2xvc2UoZik7CiAJCXJldHVybiAoTlVMTCk7CmRpZmYgLS1naXQgYS9zb2NrdXRpbHMuYyBiL3NvY2t1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNWZmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb2NrdXRpbHMuYwpAQCAtMCwwICsxLDEyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgLSAyMDAzCisgKiBOZXRHcm91cCwgUG9saXRlY25pY28gZGkgVG9yaW5vIChJdGFseSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUG9saXRlY25pY28gZGkgVG9yaW5vIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKy8qCisgKiBcZmlsZSBzb2NrdXRpbHMuYworICoKKyAqIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBwcm92aWRlIGEgY29tbW9uIHNldCBvZiBwcmltaXRpdmVzIGZvciBzb2NrZXQKKyAqIG1hbmlwdWxhdGlvbi4KKyAqCisgKiBBbHRob3VnaCB0aGUgc29ja2V0IGludGVyZmFjZSBkZWZpbmVkIGluIHRoZSBSRkMgMjU1MyAoYW5kIGl0cyB1cGRhdGVzKQorICogaXMgZXhjZWxsZW50LCB0aGVyZSBhcmUgc3RpbGwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgYmVoYXZpb3Igb2YgdGhvc2UKKyAqIHJvdXRpbmVzIG9uIFVOKlggYW5kIFdpbmRvd3MsIGFuZCBiZXR3ZWVuIFVOKlhlcy4KKyAqCisgKiBUaGVzZSBjYWxscyBwcm92aWRlIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoZSBzb2NrZXQgaW50ZXJmYWNlLCBidXQKKyAqIHRoYXQgaGlkZXMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gb3BlcmF0aW5nIHN5c3RlbXMuICBJdCBkb2VzIG5vdAorICogYXR0ZW1wdCB0byBzaWduaWZpY2FudGx5IGltcHJvdmUgb24gdGhlIHNvY2tldCBpbnRlcmZhY2UgaW4gb3RoZXIKKyAqIHdheXMuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgkvKiBmb3Igc3RyZXJyb3IoKSAqLworI2luY2x1ZGUgPGVycm5vLmg+CS8qIGZvciB0aGUgZXJybm8gdmFyaWFibGUgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgkvKiBmb3IgdGhlIHN0ZGVyciBmaWxlICovCisjaW5jbHVkZSA8c3RkbGliLmg+CS8qIGZvciBtYWxsb2MoKSBhbmQgZnJlZSgpICovCisjaWZkZWYgSEFWRV9MSU1JVFNfSAorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyNkZWZpbmUgSU5UX01BWAkJMjE0NzQ4MzY0NworI2VuZGlmCisKKyNpbmNsdWRlICJwb3J0YWJpbGl0eS5oIgorI2luY2x1ZGUgInNvY2t1dGlscy5oIgorCisjaWZkZWYgX1dJTjMyCisgIC8qCisgICAqIFdpbnNvY2sgaW5pdGlhbGl6YXRpb24uCisgICAqCisgICAqIEFzayBmb3IgV2luU29jayAyLjIuCisgICAqLworICAjZGVmaW5lIFdJTlNPQ0tfTUFKT1JfVkVSU0lPTiAyCisgICNkZWZpbmUgV0lOU09DS19NSU5PUl9WRVJTSU9OIDIKKworICBzdGF0aWMgaW50IHNvY2tjb3VudCA9IDA7CS8qITwgVmFyaWFibGUgdGhhdCBhbGxvd3MgY2FsbGluZyB0aGUgV1NBU3RhcnR1cCgpIG9ubHkgb25lIHRpbWUgKi8KKyNlbmRpZgorCisvKiBTb21lIG1pbm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gVU5JWCBhbmQgV2luMzIgKi8KKyNpZmRlZiBfV0lOMzIKKyAgI2RlZmluZSBTSFVUX1dSIFNEX1NFTkQJLyogVGhlIGNvbnRyb2wgY29kZSBmb3Igc2h1dGRvd24oKSBpcyBkaWZmZXJlbnQgaW4gV2luMzIgKi8KKyNlbmRpZgorCisvKiBTaXplIG9mIHRoZSBidWZmZXIgdGhhdCBoYXMgdG8ga2VlcCBlcnJvciBtZXNzYWdlcyAqLworI2RlZmluZSBTT0NLX0VSUkJVRl9TSVpFIDEwMjQKKworLyogQ29uc3RhbnRzOyB1c2VkIGluIG9yZGVyIHRvIGtlZXAgc3RyaW5ncyBoZXJlICovCisjZGVmaW5lIFNPQ0tFVF9OT19OQU1FX0FWQUlMQUJMRSAiTm8gbmFtZSBhdmFpbGFibGUiCisjZGVmaW5lIFNPQ0tFVF9OT19QT1JUX0FWQUlMQUJMRSAiTm8gcG9ydCBhdmFpbGFibGUiCisjZGVmaW5lIFNPQ0tFVF9OQU1FX05VTExfREFEICJOdWxsIGFkZHJlc3MgKHBvc3NpYmx5IERBRCBQaGFzZSkiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogTG9jYWxseSBkZWZpbmVkIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzb2NrX2lzbWNhc3RhZGRyKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FkZHIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZ1bmN0aW9uIGJvZGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBcYnJpZWYgSXQgcmV0cmlldmVzIHRoZSBlcnJvciBtZXNzYWdlIGFmdGVyIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBzb2NrZXQgaW50ZXJmYWNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbnQgd2F5IGVycm9ycyBhcmUgcmV0dXJuZWQgaW4gVU5JWAorICogYW5kIFdpbjMyLiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgY29uc2lzdGVudCB3YXkgdG8gcmV0cmlldmUgdGhlIGVycm9yIG1lc3NhZ2UKKyAqIChhZnRlciBhIHNvY2tldCBlcnJvciBvY2N1cnJlZCkgb24gYWxsIHRoZSBwbGF0Zm9ybXMuCisgKgorICogXHBhcmFtIGNhbGxlcjogYSBwb2ludGVyIHRvIGEgdXNlci1hbGxvY2F0ZWQgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIGEgbWVzc2FnZSB0aGF0IGhhcworICogdG8gYmUgcHJpbnRlZCAqYmVmb3JlKiB0aGUgdHJ1ZSBlcnJvciBtZXNzYWdlLiBJdCBjb3VsZCBiZSwgZm9yIGV4YW1wbGUsICd0aGlzIGVycm9yCisgKiBjb21lcyBmcm9tIHRoZSByZWN2KCkgY2FsbCBhdCBsaW5lIDMxJy4gSXQgbWF5IGJlIE5VTEwuCisgKgorICogXHBhcmFtIGVycmJ1ZjogYSBwb2ludGVyIHRvIGFuIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgY29tcGxldGUKKyAqIGVycm9yIG1lc3NhZ2UuIFRoaXMgYnVmZmVyIGhhcyB0byBiZSBhdCBsZWFzdCAnZXJyYnVmbGVuJyBpbiBsZW5ndGguCisgKiBJdCBjYW4gYmUgTlVMTDsgaW4gdGhpcyBjYXNlIHRoZSBlcnJvciBjYW5ub3QgYmUgcHJpbnRlZC4KKyAqCisgKiBccGFyYW0gZXJyYnVmbGVuOiBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbnMgdGhlIGVycm9yLiBUaGUgZXJyb3IgbWVzc2FnZSBjYW5ub3QgYmUKKyAqIGxhcmdlciB0aGFuICdlcnJidWZsZW4gLSAxJyBiZWNhdXNlIHRoZSBsYXN0IGNoYXIgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBzdHJpbmcgdGVybWluYXRvci4KKyAqCisgKiBccmV0dXJuIE5vIHJldHVybiB2YWx1ZXMuIFRoZSBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkIGluIHRoZSAnc3RyaW5nJyBwYXJhbWV0ZXIuCisgKi8KK3ZvaWQgc29ja19nZXRlcnJvcihjb25zdCBjaGFyICpjYWxsZXIsIGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1ZmxlbikKK3sKKyNpZmRlZiBfV0lOMzIKKwlpbnQgcmV0dmFsOworCWludCBjb2RlOworCVRDSEFSIG1lc3NhZ2VbU09DS19FUlJCVUZfU0laRV07CS8qIEl0IHdpbGwgYmUgY2hhciAoaWYgd2UncmUgdXNpbmcgYXNjaWkpIG9yIHdjaGFyX3QgKGlmIHdlJ3JlIHVzaW5nIHVuaWNvZGUpICovCisKKwlpZiAoZXJyYnVmID09IE5VTEwpCisJCXJldHVybjsKKworCWNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKKworCXJldHZhbCA9IEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfCBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUyB8CisJCUZPUk1BVF9NRVNTQUdFX01BWF9XSURUSF9NQVNLLAorCQlOVUxMLCBjb2RlLCBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKKwkJbWVzc2FnZSwgc2l6ZW9mKG1lc3NhZ2UpIC8gc2l6ZW9mKFRDSEFSKSwgTlVMTCk7CisKKwlpZiAocmV0dmFsID09IDApCisJeworCQlpZiAoKGNhbGxlcikgJiYgKCpjYWxsZXIpKQorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIGVycmJ1ZmxlbiwgIiVzVW5hYmxlIHRvIGdldCB0aGUgZXhhY3QgZXJyb3IgbWVzc2FnZSIsIGNhbGxlcik7CisJCWVsc2UKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBlcnJidWZsZW4sICJVbmFibGUgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBtZXNzYWdlIik7CisJCXJldHVybjsKKwl9CisJZWxzZQorCXsKKwkJaWYgKChjYWxsZXIpICYmICgqY2FsbGVyKSkKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBlcnJidWZsZW4sICIlcyVzIChjb2RlICVkKSIsIGNhbGxlciwgbWVzc2FnZSwgY29kZSk7CisJCWVsc2UKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBlcnJidWZsZW4sICIlcyAoY29kZSAlZCkiLCBtZXNzYWdlLCBjb2RlKTsKKwl9CisjZWxzZQorCWNoYXIgKm1lc3NhZ2U7CisKKwlpZiAoZXJyYnVmID09IE5VTEwpCisJCXJldHVybjsKKworCW1lc3NhZ2UgPSBzdHJlcnJvcihlcnJubyk7CisKKwlpZiAoKGNhbGxlcikgJiYgKCpjYWxsZXIpKQorCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgZXJyYnVmbGVuLCAiJXMlcyAoY29kZSAlZCkiLCBjYWxsZXIsIG1lc3NhZ2UsIGVycm5vKTsKKwllbHNlCisJCXBjYXBfc25wcmludGYoZXJyYnVmLCBlcnJidWZsZW4sICIlcyAoY29kZSAlZCkiLCBtZXNzYWdlLCBlcnJubyk7CisjZW5kaWYKK30KKworLyoKKyAqIFxicmllZiBJdCBpbml0aWFsaXplcyBzb2NrZXRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcHJldHR5IHVzZWxlc3Mgb24gVU5JWCwgc2luY2Ugc29ja2V0IGluaXRpYWxpemF0aW9uIGlzIG5vdCByZXF1aXJlZC4KKyAqIEhvd2V2ZXIgaXQgaXMgcmVxdWlyZWQgb24gV2luMzIuIEluIFVOSVgsIHRoaXMgZnVuY3Rpb24gYXBwZWFycyB0byBiZSBjb21wbGV0ZWx5IGVtcHR5LgorICoKKyAqIFxwYXJhbSBlcnJidWY6IGEgcG9pbnRlciB0byBhbiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvbXBsZXRlCisgKiBlcnJvciBtZXNzYWdlLiBUaGlzIGJ1ZmZlciBoYXMgdG8gYmUgYXQgbGVhc3QgJ2VycmJ1ZmxlbicgaW4gbGVuZ3RoLgorICogSXQgY2FuIGJlIE5VTEw7IGluIHRoaXMgY2FzZSB0aGUgZXJyb3IgY2Fubm90IGJlIHByaW50ZWQuCisgKgorICogXHBhcmFtIGVycmJ1ZmxlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW5zIHRoZSBlcnJvci4gVGhlIGVycm9yIG1lc3NhZ2UgY2Fubm90IGJlCisgKiBsYXJnZXIgdGhhbiAnZXJyYnVmbGVuIC0gMScgYmVjYXVzZSB0aGUgbGFzdCBjaGFyIGlzIHJlc2VydmVkIGZvciB0aGUgc3RyaW5nIHRlcm1pbmF0b3IuCisgKgorICogXHJldHVybiAnMCcgaWYgZXZlcnl0aGluZyBpcyBmaW5lLCAnLTEnIGlmIHNvbWUgZXJyb3JzIG9jY3VycmVkLiBUaGUgZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZAorICogaW4gdGhlICdlcnJidWYnIHZhcmlhYmxlLgorICovCitpbnQgc29ja19pbml0KGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1ZmxlbikKK3sKKyNpZmRlZiBfV0lOMzIKKwlpZiAoc29ja2NvdW50ID09IDApCisJeworCQlXU0FEQVRBIHdzYURhdGE7CQkJLyogaGVscGVyIHZhcmlhYmxlIG5lZWRlZCB0byBpbml0aWFsaXplIFdpbnNvY2sgKi8KKworCQlpZiAoV1NBU3RhcnR1cChNQUtFV09SRChXSU5TT0NLX01BSk9SX1ZFUlNJT04sCisJCSAgICBXSU5TT0NLX01JTk9SX1ZFUlNJT04pLCAmd3NhRGF0YSkgIT0gMCkKKwkJeworCQkJaWYgKGVycmJ1ZikKKwkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgZXJyYnVmbGVuLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgV2luc29ja1xuIik7CisKKwkJCVdTQUNsZWFudXAoKTsKKworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJc29ja2NvdW50Kys7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKgorICogXGJyaWVmIEl0IGRlYWxsb2NhdGVzIHNvY2tldHMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBwcmV0dHkgdXNlbGVzcyBvbiBVTklYLCBzaW5jZSBzb2NrZXQgZGVhbGxvY2F0aW9uIGlzIG5vdCByZXF1aXJlZC4KKyAqIEhvd2V2ZXIgaXQgaXMgcmVxdWlyZWQgb24gV2luMzIuIEluIFVOSVgsIHRoaXMgZnVuY3Rpb24gYXBwZWFycyB0byBiZSBjb21wbGV0ZWx5IGVtcHR5LgorICoKKyAqIFxyZXR1cm4gTm8gZXJyb3IgdmFsdWVzLgorICovCit2b2lkIHNvY2tfY2xlYW51cCh2b2lkKQoreworI2lmZGVmIF9XSU4zMgorCXNvY2tjb3VudC0tOworCisJaWYgKHNvY2tjb3VudCA9PSAwKQorCQlXU0FDbGVhbnVwKCk7CisjZW5kaWYKK30KKworLyoKKyAqIFxicmllZiBJdCBjaGVja3MgaWYgdGhlIHNvY2thZGRyIHZhcmlhYmxlIGNvbnRhaW5zIGEgbXVsdGljYXN0IGFkZHJlc3MuCisgKgorICogXHJldHVybiAnMCcgaWYgdGhlIGFkZHJlc3MgaXMgbXVsdGljYXN0LCAnLTEnIGlmIGl0IGlzIG5vdC4KKyAqLworc3RhdGljIGludCBzb2NrX2lzbWNhc3RhZGRyKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FkZHIpCit7CisJaWYgKHNhZGRyLT5zYV9mYW1pbHkgPT0gUEZfSU5FVCkKKwl7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHI0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYWRkcjsKKwkJaWYgKElOX01VTFRJQ0FTVChudG9obChzYWRkcjQtPnNpbl9hZGRyLnNfYWRkcikpKSByZXR1cm4gMDsKKwkJZWxzZSByZXR1cm4gLTE7CisJfQorCWVsc2UKKwl7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNhZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHNhZGRyOworCQlpZiAoSU42X0lTX0FERFJfTVVMVElDQVNUKCZzYWRkcjYtPnNpbjZfYWRkcikpIHJldHVybiAwOworCQllbHNlIHJldHVybiAtMTsKKwl9Cit9CisKKy8qCisgKiBcYnJpZWYgSXQgaW5pdGlhbGl6ZXMgYSBuZXR3b3JrIGNvbm5lY3Rpb24gYm90aCBmcm9tIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIgc2lkZS4KKyAqCisgKiBJbiBjYXNlIG9mIGEgY2xpZW50IHNvY2tldCwgdGhpcyBmdW5jdGlvbiBjYWxscyBzb2NrZXQoKSBhbmQgY29ubmVjdCgpLgorICogSW4gdGhlIG1lYW53aGlsZSwgaXQgY2hlY2tzIGZvciBhbnkgc29ja2V0IGVycm9yLgorICogSWYgYW4gZXJyb3Igb2NjdXJzLCBpdCB3cml0ZXMgdGhlIGVycm9yIG1lc3NhZ2UgaW50byAnZXJyYnVmJy4KKyAqCisgKiBJbiBjYXNlIG9mIGEgc2VydmVyIHNvY2tldCwgdGhlIGZ1bmN0aW9uIGNhbGxzIHNvY2tldCgpLCBiaW5kKCkgYW5kIGxpc3RlbigpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBwcmVjZWVkZWQgYnkgdGhlIHNvY2tfaW5pdGFkZHJlc3MoKS4KKyAqCisgKiBccGFyYW0gYWRkcmluZm86IHBvaW50ZXIgdG8gYW4gYWRkcmluZm8gdmFyaWFibGUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvCisgKiBvcGVuIHRoZSBzb2NrZXQgYW5kIHN1Y2guIFRoaXMgdmFyaWFibGUgaXMgdGhlIG9uZSByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgY2FsbCB0bworICogc29ja19pbml0YWRkcmVzcygpLgorICoKKyAqIFxwYXJhbSBzZXJ2ZXI6ICcxJyBpZiB0aGlzIGlzIGEgc2VydmVyIHNvY2tldCwgJzAnIG90aGVyd2lzZS4KKyAqCisgKiBccGFyYW0gbmNvbm46IG51bWJlciBvZiB0aGUgY29ubmVjdGlvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byB3YWl0IGludG8gdGhlIGxpc3RlbigpIGNhbGwuCisgKiBUaGlzIHZhbHVlIGhhcyBubyBtZWFuaW5ncyBpbiBjYXNlIG9mIGEgY2xpZW50IHNvY2tldC4KKyAqCisgKiBccGFyYW0gZXJyYnVmOiBhIHBvaW50ZXIgdG8gYW4gdXNlci1hbGxvY2F0ZWQgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBjb21wbGV0ZQorICogZXJyb3IgbWVzc2FnZS4gVGhpcyBidWZmZXIgaGFzIHRvIGJlIGF0IGxlYXN0ICdlcnJidWZsZW4nIGluIGxlbmd0aC4KKyAqIEl0IGNhbiBiZSBOVUxMOyBpbiB0aGlzIGNhc2UgdGhlIGVycm9yIGNhbm5vdCBiZSBwcmludGVkLgorICoKKyAqIFxwYXJhbSBlcnJidWZsZW46IGxlbmd0aCBvZiB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWlucyB0aGUgZXJyb3IuIFRoZSBlcnJvciBtZXNzYWdlIGNhbm5vdCBiZQorICogbGFyZ2VyIHRoYW4gJ2VycmJ1ZmxlbiAtIDEnIGJlY2F1c2UgdGhlIGxhc3QgY2hhciBpcyByZXNlcnZlZCBmb3IgdGhlIHN0cmluZyB0ZXJtaW5hdG9yLgorICoKKyAqIFxyZXR1cm4gdGhlIHNvY2tldCB0aGF0IGhhcyBiZWVuIG9wZW5lZCAodGhhdCBoYXMgdG8gYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHNvY2tldHMgY2FsbHMpCisgKiBpZiBldmVyeXRoaW5nIGlzIGZpbmUsICcwJyBpZiBzb21lIGVycm9ycyBvY2N1cnJlZC4gVGhlIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQKKyAqIGluIHRoZSAnZXJyYnVmJyB2YXJpYWJsZS4KKyAqLworU09DS0VUIHNvY2tfb3BlbihzdHJ1Y3QgYWRkcmluZm8gKmFkZHJpbmZvLCBpbnQgc2VydmVyLCBpbnQgbmNvbm4sIGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1ZmxlbikKK3sKKwlTT0NLRVQgc29jazsKKworCXNvY2sgPSBzb2NrZXQoYWRkcmluZm8tPmFpX2ZhbWlseSwgYWRkcmluZm8tPmFpX3NvY2t0eXBlLCBhZGRyaW5mby0+YWlfcHJvdG9jb2wpOworCWlmIChzb2NrID09IC0xKQorCXsKKwkJc29ja19nZXRlcnJvcigic29ja2V0KCk6ICIsIGVycmJ1ZiwgZXJyYnVmbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJLyogVGhpcyBpcyBhIHNlcnZlciBzb2NrZXQgKi8KKwlpZiAoc2VydmVyKQorCXsKKyNpZmRlZiBCU0QKKwkJLyoKKwkJICogRm9yY2UgdGhlIHVzZSBvZiBJUHY2LW9ubHkgYWRkcmVzc2VzOyBpbiBCU0QgeW91IGNhbiBhY2NlcHQgYm90aCB2NCBhbmQgdjYKKwkJICogY29ubmVjdGlvbnMgaWYgeW91IGhhdmUgYSAiTlVMTCIgcG9pbnRlciBhcyB0aGUgbm9kZW5hbWUgaW4gdGhlIGdldGFkZHJpbmZvKCkKKwkJICogVGhpcyBiZWhhdmlvciBpcyBub3QgY2xlYXIgaW4gdGhlIFJGQyAyNTUzLCBzbyBlYWNoIHN5c3RlbSBpbXBsZW1lbnRzIHRoZQorCQkgKiBiaW5kKCkgZGlmZmVyZW50bHkgZnJvbSB0aGlzIHBvaW50IG9mIHZpZXcKKwkJICovCisJCWlmIChhZGRyaW5mby0+YWlfZmFtaWx5ID09IFBGX0lORVQ2KQorCQl7CisJCQlpbnQgb247CisKKwkJCWlmIChzZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9CSU5EVjZPTkxZLCAoY2hhciAqKSZvbiwgc2l6ZW9mIChpbnQpKSA9PSAtMSkKKwkJCXsKKwkJCQlpZiAoZXJyYnVmKQorCQkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgZXJyYnVmbGVuLCAic2V0c29ja29wdChJUFY2X0JJTkRWNk9OTFkpIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisjZW5kaWYKKworCQkvKiBXQVJOSU5HOiBpZiB0aGUgYWRkcmVzcyBpcyBhIG1jYXN0IG9uZSwgSSBzaG91bGQgcGxhY2UgdGhlIHByb3BlciBXaW4zMiBjb2RlIGhlcmUgKi8KKwkJaWYgKGJpbmQoc29jaywgYWRkcmluZm8tPmFpX2FkZHIsIChpbnQpIGFkZHJpbmZvLT5haV9hZGRybGVuKSAhPSAwKQorCQl7CisJCQlzb2NrX2dldGVycm9yKCJiaW5kKCk6ICIsIGVycmJ1ZiwgZXJyYnVmbGVuKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChhZGRyaW5mby0+YWlfc29ja3R5cGUgPT0gU09DS19TVFJFQU0pCisJCQlpZiAobGlzdGVuKHNvY2ssIG5jb25uKSA9PSAtMSkKKwkJCXsKKwkJCQlzb2NrX2dldGVycm9yKCJsaXN0ZW4oKTogIiwgZXJyYnVmLCBlcnJidWZsZW4pOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkvKiBzZXJ2ZXIgc2lkZSBlbmRlZCAqLworCQlyZXR1cm4gc29jazsKKwl9CisJZWxzZQkvKiB3ZSdyZSB0aGUgY2xpZW50ICovCisJeworCQlzdHJ1Y3QgYWRkcmluZm8gKnRlbXBhZGRyaW5mbzsKKwkJY2hhciAqZXJyYnVmcHRyOworCQlzaXplX3QgYnVmc3BhY2VsZWZ0OworCisJCXRlbXBhZGRyaW5mbyA9IGFkZHJpbmZvOworCQllcnJidWZwdHIgPSBlcnJidWY7CisJCWJ1ZnNwYWNlbGVmdCA9IGVycmJ1ZmxlbjsKKwkJKmVycmJ1ZnB0ciA9IDA7CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBsb29wIHRob3VnaCBhbGwgdGhlIGFkZGluZm8gcmV0dXJuZWQuCisJCSAqIEZvciBpbnN0YW5jZSwgd2UgY2FuIGhhdmUgYm90aCBJUHY2IGFuZCBJUHY0IGFkZHJlc3NlcywgYnV0IHRoZSBzZXJ2aWNlIHdlJ3JlIHRyeWluZworCQkgKiB0byBjb25uZWN0IHRvIGlzIHVuYXZhaWxhYmxlIGluIElQdjYsIHNvIHdlIGhhdmUgdG8gdHJ5IGluIElQdjQgYXMgd2VsbAorCQkgKi8KKwkJd2hpbGUgKHRlbXBhZGRyaW5mbykKKwkJeworCisJCQlpZiAoY29ubmVjdChzb2NrLCB0ZW1wYWRkcmluZm8tPmFpX2FkZHIsIChpbnQpIHRlbXBhZGRyaW5mby0+YWlfYWRkcmxlbikgPT0gLTEpCisJCQl7CisJCQkJc2l6ZV90IG1zZ2xlbjsKKwkJCQljaGFyIFRtcEJ1ZmZlclsxMDBdOworCQkJCWNoYXIgU29ja2V0RXJyb3JNZXNzYWdlW1NPQ0tfRVJSQlVGX1NJWkVdOworCisJCQkJLyoKKwkJCQkgKiBXZSBoYXZlIHRvIHJldHJpZXZlIHRoZSBlcnJvciBtZXNzYWdlIGJlZm9yZSBhbnkgb3RoZXIgc29ja2V0IGNhbGwgY29tcGxldGVzLCBvdGhlcndpc2UKKwkJCQkgKiB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb3N0CisJCQkJICovCisJCQkJc29ja19nZXRlcnJvcihOVUxMLCBTb2NrZXRFcnJvck1lc3NhZ2UsIHNpemVvZihTb2NrZXRFcnJvck1lc3NhZ2UpKTsKKworCQkJCS8qIFJldHVybnMgdGhlIG51bWVyaWMgYWRkcmVzcyBvZiB0aGUgaG9zdCB0aGF0IHRyaWdnZXJlZCB0aGUgZXJyb3IgKi8KKwkJCQlzb2NrX2dldGFzY2lpX2FkZHJwb3J0KChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqKSB0ZW1wYWRkcmluZm8tPmFpX2FkZHIsIFRtcEJ1ZmZlciwgc2l6ZW9mKFRtcEJ1ZmZlciksIE5VTEwsIDAsIE5JX05VTUVSSUNIT1NULCBUbXBCdWZmZXIsIHNpemVvZihUbXBCdWZmZXIpKTsKKworCQkJCXBjYXBfc25wcmludGYoZXJyYnVmcHRyLCBidWZzcGFjZWxlZnQsCisJCQkJICAgICJJcyB0aGUgc2VydmVyIHByb3Blcmx5IGluc3RhbGxlZCBvbiAlcz8gIGNvbm5lY3QoKSBmYWlsZWQ6ICVzIiwgVG1wQnVmZmVyLCBTb2NrZXRFcnJvck1lc3NhZ2UpOworCisJCQkJLyogSW4gY2FzZSBtb3JlIHRoZW4gb25lICdjb25uZWN0JyBmYWlscywgd2UgbWFuYWdlIHRvIGtlZXAgYWxsIHRoZSBlcnJvciBtZXNzYWdlcyAqLworCQkJCW1zZ2xlbiA9IHN0cmxlbihlcnJidWZwdHIpOworCisJCQkJZXJyYnVmcHRyW21zZ2xlbl0gPSAnICc7CisJCQkJZXJyYnVmcHRyW21zZ2xlbiArIDFdID0gMDsKKworCQkJCWJ1ZnNwYWNlbGVmdCA9IGJ1ZnNwYWNlbGVmdCAtIChtc2dsZW4gKyAxKTsKKwkJCQllcnJidWZwdHIgKz0gKG1zZ2xlbiArIDEpOworCisJCQkJdGVtcGFkZHJpbmZvID0gdGVtcGFkZHJpbmZvLT5haV9uZXh0OworCQkJfQorCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgaG93IHdlIGV4aXQgZnJvbSB0aGUgcHJldmlvdXMgbG9vcAorCQkgKiBJZiB0ZW1wYWRkcmluZm8gaXMgZXF1YWwgdG8gTlVMTCwgaXQgbWVhbnMgdGhhdCBhbGwgdGhlIGNvbm5lY3QoKSBmYWlsZWQuCisJCSAqLworCQlpZiAodGVtcGFkZHJpbmZvID09IE5VTEwpCisJCXsKKwkJCWNsb3Nlc29ja2V0KHNvY2spOworCQkJcmV0dXJuIC0xOworCQl9CisJCWVsc2UKKwkJCXJldHVybiBzb2NrOworCX0KK30KKworLyoKKyAqIFxicmllZiBDbG9zZXMgdGhlIHByZXNlbnQgKFRDUCBhbmQgVURQKSBzb2NrZXQgY29ubmVjdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgc2h1dGRvd24oKSBvbiB0aGUgc29ja2V0IGluIG9yZGVyIHRvIGRpc2FibGUgc2VuZCgpIGNhbGxzCisgKiAod2hpbGUgcmVjdigpIG9uZXMgYXJlIHN0aWxsIGFsbG93ZWQpLiBUaGVuLCBpdCBjbG9zZXMgdGhlIHNvY2tldC4KKyAqCisgKiBccGFyYW0gc29jazogdGhlIHNvY2tldCBpZGVudGlmaWVyIG9mIHRoZSBjb25uZWN0aW9uIHRoYXQgaGFzIHRvIGJlIGNsb3NlZC4KKyAqCisgKiBccGFyYW0gZXJyYnVmOiBhIHBvaW50ZXIgdG8gYW4gdXNlci1hbGxvY2F0ZWQgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBjb21wbGV0ZQorICogZXJyb3IgbWVzc2FnZS4gVGhpcyBidWZmZXIgaGFzIHRvIGJlIGF0IGxlYXN0ICdlcnJidWZsZW4nIGluIGxlbmd0aC4KKyAqIEl0IGNhbiBiZSBOVUxMOyBpbiB0aGlzIGNhc2UgdGhlIGVycm9yIGNhbm5vdCBiZSBwcmludGVkLgorICoKKyAqIFxwYXJhbSBlcnJidWZsZW46IGxlbmd0aCBvZiB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWlucyB0aGUgZXJyb3IuIFRoZSBlcnJvciBtZXNzYWdlIGNhbm5vdCBiZQorICogbGFyZ2VyIHRoYW4gJ2VycmJ1ZmxlbiAtIDEnIGJlY2F1c2UgdGhlIGxhc3QgY2hhciBpcyByZXNlcnZlZCBmb3IgdGhlIHN0cmluZyB0ZXJtaW5hdG9yLgorICoKKyAqIFxyZXR1cm4gJzAnIGlmIGV2ZXJ5dGhpbmcgaXMgZmluZSwgJy0xJyBpZiBzb21lIGVycm9ycyBvY2N1cnJlZC4gVGhlIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQKKyAqIGluIHRoZSAnZXJyYnVmJyB2YXJpYWJsZS4KKyAqLworaW50IHNvY2tfY2xvc2UoU09DS0VUIHNvY2ssIGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1ZmxlbikKK3sKKwkvKgorCSAqIFNIVVRfV1I6IHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHNlbmQgZnVuY3Rpb24gYXJlIGRpc2FsbG93ZWQuCisJICogRm9yIFRDUCBzb2NrZXRzLCBhIEZJTiB3aWxsIGJlIHNlbnQgYWZ0ZXIgYWxsIGRhdGEgaXMgc2VudCBhbmQKKwkgKiBhY2tub3dsZWRnZWQgYnkgdGhlIFNlcnZlci4KKwkgKi8KKwlpZiAoc2h1dGRvd24oc29jaywgU0hVVF9XUikpCisJeworCQlzb2NrX2dldGVycm9yKCJzaHV0ZG93bigpOiAiLCBlcnJidWYsIGVycmJ1Zmxlbik7CisJCS8qIGNsb3NlIHRoZSBzb2NrZXQgYW55d2F5ICovCisJCWNsb3Nlc29ja2V0KHNvY2spOworCQlyZXR1cm4gLTE7CisJfQorCisJY2xvc2Vzb2NrZXQoc29jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBcYnJpZWYgQ2hlY2tzIHRoYXQgdGhlIGFkZHJlc3MsIHBvcnQgYW5kIGZsYWdzIGdpdmVuIGFyZSB2YWxpZHMgYW5kIGl0IHJldHVybnMgYW4gJ2FkZHJpbmZvJyBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBiYXNpY2FsbHkgY2FsbHMgdGhlIGdldGFkZHJpbmZvKCkgY2FsbHMsIGFuZCBpdCBwZXJmb3JtcyBhIHNldCBvZiBzYW5pdHkgY2hlY2tzCisgKiB0byBjb250cm9sIHRoYXQgZXZlcnl0aGluZyBpcyBmaW5lIChlLmcuIGEgVENQIHNvY2tldCBjYW5ub3QgaGF2ZSBhIG1jYXN0IGFkZHJlc3MsIGFuZCBzdWNoKS4KKyAqIElmIGFuIGVycm9yIG9jY3VycywgaXQgd3JpdGVzIHRoZSBlcnJvciBtZXNzYWdlIGludG8gJ2VycmJ1ZicuCisgKgorICogXHBhcmFtIGhvc3Q6IGEgcG9pbnRlciB0byBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgaG9zdC4gSXQgY2FuIGJlCisgKiBhIGhvc3QgbmFtZSwgYSBudW1lcmljIGxpdGVyYWwgYWRkcmVzcywgb3IgTlVMTCBvciAiIiAodXNlZnVsCisgKiBpbiBjYXNlIG9mIGEgc2VydmVyIHNvY2tldCB3aGljaCBoYXMgdG8gYmluZCB0byBhbGwgYWRkcmVzc2VzKS4KKyAqCisgKiBccGFyYW0gcG9ydDogYSBwb2ludGVyIHRvIGEgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG5ldHdvcmsgcG9ydCB0byB1c2UuCisgKgorICogXHBhcmFtIGhpbnRzOiBhbiBhZGRyaW5mbyB2YXJpYWJsZSAocGFzc2VkIGJ5IHJlZmVyZW5jZSkgY29udGFpbmluZyB0aGUgZmxhZ3MgbmVlZGVkIHRvIGNyZWF0ZSB0aGUKKyAqIGFkZHJpbmZvIHN0cnVjdHVyZSBhcHByb3ByaWF0ZWx5LgorICoKKyAqIFxwYXJhbSBhZGRyaW5mbzogaXQgcmVwcmVzZW50cyB0aGUgdHJ1ZSByZXR1cm5pbmcgdmFsdWUuIFRoaXMgaXMgYSBwb2ludGVyIHRvIGFuIGFkZHJpbmZvIHZhcmlhYmxlCisgKiAocGFzc2VkIGJ5IHJlZmVyZW5jZSksIHdoaWNoIHdpbGwgYmUgYWxsb2NhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIHJldHVybmVkIGJhY2sgdG8gdGhlIGNhbGxlci4KKyAqIFRoaXMgdmFyaWFibGUgd2lsbCBiZSB1c2VkIGluIHRoZSBuZXh0IHNvY2tldHMgY2FsbHMuCisgKgorICogXHBhcmFtIGVycmJ1ZjogYSBwb2ludGVyIHRvIGFuIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgY29tcGxldGUKKyAqIGVycm9yIG1lc3NhZ2UuIFRoaXMgYnVmZmVyIGhhcyB0byBiZSBhdCBsZWFzdCAnZXJyYnVmbGVuJyBpbiBsZW5ndGguCisgKiBJdCBjYW4gYmUgTlVMTDsgaW4gdGhpcyBjYXNlIHRoZSBlcnJvciBjYW5ub3QgYmUgcHJpbnRlZC4KKyAqCisgKiBccGFyYW0gZXJyYnVmbGVuOiBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbnMgdGhlIGVycm9yLiBUaGUgZXJyb3IgbWVzc2FnZSBjYW5ub3QgYmUKKyAqIGxhcmdlciB0aGFuICdlcnJidWZsZW4gLSAxJyBiZWNhdXNlIHRoZSBsYXN0IGNoYXIgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBzdHJpbmcgdGVybWluYXRvci4KKyAqCisgKiBccmV0dXJuICcwJyBpZiBldmVyeXRoaW5nIGlzIGZpbmUsICctMScgaWYgc29tZSBlcnJvcnMgb2NjdXJyZWQuIFRoZSBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkCisgKiBpbiB0aGUgJ2VycmJ1ZicgdmFyaWFibGUuIFRoZSBhZGRyaW5mbyB2YXJpYWJsZSB0aGF0IGhhcyB0byBiZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgc29ja2V0cyBjYWxscyBpcworICogcmV0dXJuZWQgaW50byB0aGUgYWRkcmluZm8gcGFyYW1ldGVyLgorICoKKyAqIFx3YXJuaW5nIFRoZSAnYWRkcmluZm8nIHZhcmlhYmxlIGhhcyB0byBiZSBkZWxldGVkIGJ5IHRoZSBwcm9ncmFtbWVyIGJ5IGNhbGxpbmcgZnJlZWFkZHJpbmZvKCkgd2hlbgorICogaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBcd2FybmluZyBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoZSAnaGludHMnIHZhcmlhYmxlIGFzIHBhcmFtZXRlci4gVGhlIHNlbWFudGljIG9mIHRoaXMgdmFyaWFibGUgaXMgdGhlIHNhbWUKKyAqIG9mIHRoZSBvbmUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgdXNlZCBpbnRvIHRoZSBzdGFuZGFyZCBnZXRhZGRyaW5mbygpIHNvY2tldCBmdW5jdGlvbi4gV2Ugc3VnZ2VzdAorICogdGhlIHByb2dyYW1tZXIgdG8gbG9vayBhdCB0aGF0IGZ1bmN0aW9uIGluIG9yZGVyIHRvIHNldCB0aGUgJ2hpbnRzJyB2YXJpYWJsZSBhcHByb3ByaWF0ZWx5LgorICovCitpbnQgc29ja19pbml0YWRkcmVzcyhjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpwb3J0LAorICAgIHN0cnVjdCBhZGRyaW5mbyAqaGludHMsIHN0cnVjdCBhZGRyaW5mbyAqKmFkZHJpbmZvLCBjaGFyICplcnJidWYsIGludCBlcnJidWZsZW4pCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsIGhpbnRzLCBhZGRyaW5mbyk7CisJaWYgKHJldHZhbCAhPSAwKQorCXsKKwkJLyoKKwkJICogaWYgdGhlIGdldGFkZHJpbmZvKCkgZmFpbHMsIHlvdSBoYXZlIHRvIHVzZSBnYWlfc3RyZXJyb3IoKSwgaW5zdGVhZCBvZiB1c2luZyB0aGUgc3RhbmRhcmQKKwkJICogZXJyb3Igcm91dGluZXMgKGVycm5vKSBpbiBVTklYOyBXaW5zb2NrIHN1Z2dlc3RzIHVzaW5nIHRoZSBHZXRMYXN0RXJyb3IoKSBpbnN0ZWFkLgorCQkgKi8KKwkJaWYgKGVycmJ1ZikKKwkJeworI2lmZGVmIF9XSU4zMgorCQkJc29ja19nZXRlcnJvcigiZ2V0YWRkcmluZm8oKTogIiwgZXJyYnVmLCBlcnJidWZsZW4pOworI2Vsc2UKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBlcnJidWZsZW4sICJnZXRhZGRyaW5mbygpICVzIiwgZ2FpX3N0cmVycm9yKHJldHZhbCkpOworI2VuZGlmCisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwkvKgorCSAqIFx3YXJuaW5nIFNPQ0tFVDogSSBzaG91bGQgY2hlY2sgYWxsIHRoZSBhY2NlcHQoKSBpbiBvcmRlciB0byBiaW5kIHRvIGFsbCBhZGRyZXNzZXMgaW4gY2FzZQorCSAqIGFkZHJpbmZvIGhhcyBtb3JlIGhhbiBvbmUgcG9pbnRlcnMKKwkgKi8KKworCS8qCisJICogVGhpcyBzb2Z0d2FyZSBvbmx5IHN1cHBvcnRzIFBGX0lORVQgYW5kIFBGX0lORVQ2LgorCSAqCisJICogWFhYIC0gc2hvdWxkIHdlIGp1c3QgY2hlY2sgdGhhdCBhdCBsZWFzdCAqb25lKiBhZGRyZXNzIGlzCisJICogZWl0aGVyIFBGX0lORVQgb3IgUEZfSU5FVDYsIGFuZCwgd2hlbiB1c2luZyB0aGUgbGlzdCwKKwkgKiBpZ25vcmUgYWxsIGFkZHJlc3NlcyB0aGF0IGFyZSBuZWl0aGVyPyAgKFdoYXQsIG5vIElQWAorCSAqIHN1cHBvcnQ/IDotKSkKKwkgKi8KKwlpZiAoKCgqYWRkcmluZm8pLT5haV9mYW1pbHkgIT0gUEZfSU5FVCkgJiYKKwkgICAgKCgqYWRkcmluZm8pLT5haV9mYW1pbHkgIT0gUEZfSU5FVDYpKQorCXsKKwkJaWYgKGVycmJ1ZikKKwkJCXBjYXBfc25wcmludGYoZXJyYnVmLCBlcnJidWZsZW4sICJnZXRhZGRyaW5mbygpOiBzb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIFlvdSBjYW4ndCBkbyBtdWx0aWNhc3QgKG9yIGJyb2FkY2FzdCkgVENQLgorCSAqLworCWlmICgoKCphZGRyaW5mbyktPmFpX3NvY2t0eXBlID09IFNPQ0tfU1RSRUFNKSAmJgorCSAgICAoc29ja19pc21jYXN0YWRkcigoKmFkZHJpbmZvKS0+YWlfYWRkcikgPT0gMCkpCisJeworCQlpZiAoZXJyYnVmKQorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIGVycmJ1ZmxlbiwgImdldGFkZHJpbmZvKCk6IG11bHRpY2FzdCBhZGRyZXNzZXMgYXJlIG5vdCB2YWxpZCB3aGVuIHVzaW5nIFRDUCBzdHJlYW1zIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFxicmllZiBJdCBzZW5kcyB0aGUgYW1vdW50IG9mIGRhdGEgY29udGFpbmVkIGludG8gJ2J1ZmZlcicgb24gdGhlIGdpdmVuIHNvY2tldC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGJhc2ljYWxseSBjYWxscyB0aGUgc2VuZCgpIHNvY2tldCBmdW5jdGlvbiBhbmQgaXQgY2hlY2tzIHRoYXQgYWxsCisgKiB0aGUgZGF0YSBzcGVjaWZpZWQgaW4gJ2J1ZmZlcicgKG9mIHNpemUgJ3NpemUnKSB3aWxsIGJlIHNlbnQuIElmIGFuIGVycm9yIG9jY3VycywKKyAqIGl0IHdyaXRlcyB0aGUgZXJyb3IgbWVzc2FnZSBpbnRvICdlcnJidWYnLgorICogSW4gY2FzZSB0aGUgc29ja2V0IGJ1ZmZlciBkb2VzIG5vdCBoYXZlIGVub3VnaCBzcGFjZSwgaXQgbG9vcHMgdW50aWwgYWxsIGRhdGEKKyAqIGhhcyBiZWVuIHNlbnQuCisgKgorICogXHBhcmFtIHNvY2tldDogdGhlIGNvbm5lY3RlZCBzb2NrZXQgY3VycmVudGx5IG9wZW5lZC4KKyAqCisgKiBccGFyYW0gYnVmZmVyOiBhIGNoYXIgcG9pbnRlciB0byBhIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciBpbiB3aGljaCBkYXRhIGlzIGNvbnRhaW5lZC4KKyAqCisgKiBccGFyYW0gc2l6ZTogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSB0byBiZSBzZW50LgorICoKKyAqIFxwYXJhbSBlcnJidWY6IGEgcG9pbnRlciB0byBhbiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvbXBsZXRlCisgKiBlcnJvciBtZXNzYWdlLiBUaGlzIGJ1ZmZlciBoYXMgdG8gYmUgYXQgbGVhc3QgJ2VycmJ1ZmxlbicgaW4gbGVuZ3RoLgorICogSXQgY2FuIGJlIE5VTEw7IGluIHRoaXMgY2FzZSB0aGUgZXJyb3IgY2Fubm90IGJlIHByaW50ZWQuCisgKgorICogXHBhcmFtIGVycmJ1ZmxlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW5zIHRoZSBlcnJvci4gVGhlIGVycm9yIG1lc3NhZ2UgY2Fubm90IGJlCisgKiBsYXJnZXIgdGhhbiAnZXJyYnVmbGVuIC0gMScgYmVjYXVzZSB0aGUgbGFzdCBjaGFyIGlzIHJlc2VydmVkIGZvciB0aGUgc3RyaW5nIHRlcm1pbmF0b3IuCisgKgorICogXHJldHVybiAnMCcgaWYgZXZlcnl0aGluZyBpcyBmaW5lLCAnLTEnIGlmIHNvbWUgZXJyb3JzIG9jY3VycmVkLiBUaGUgZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZAorICogaW4gdGhlICdlcnJidWYnIHZhcmlhYmxlLgorICovCitpbnQgc29ja19zZW5kKFNPQ0tFVCBzb2NrZXQsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IHNpemUsIGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1ZmxlbikKK3sKKwlpbnQgbnNlbnQ7CisKK3NlbmQ6CisjaWZkZWYgbGludXgKKwkvKgorCSAqIEFub3RoZXIgcGFpbi4uLiBpbiBMaW51eCB0aGVyZSdzIHRoaXMgZmxhZworCSAqIE1TR19OT1NJR05BTAorCSAqIFJlcXVlc3RzIG5vdCB0byBzZW5kIFNJR1BJUEUgb24gZXJyb3JzIG9uIHN0cmVhbS1vcmllbnRlZAorCSAqIHNvY2tldHMgd2hlbiB0aGUgb3RoZXIgZW5kIGJyZWFrcyB0aGUgY29ubmVjdGlvbi4KKwkgKiBUaGUgRVBJUEUgZXJyb3IgaXMgc3RpbGwgcmV0dXJuZWQuCisJICovCisJbnNlbnQgPSBzZW5kKHNvY2tldCwgYnVmZmVyLCBzaXplLCBNU0dfTk9TSUdOQUwpOworI2Vsc2UKKwluc2VudCA9IHNlbmQoc29ja2V0LCBidWZmZXIsIHNpemUsIDApOworI2VuZGlmCisKKwlpZiAobnNlbnQgPT0gLTEpCisJeworCQlzb2NrX2dldGVycm9yKCJzZW5kKCk6ICIsIGVycmJ1ZiwgZXJyYnVmbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChuc2VudCAhPSBzaXplKQorCXsKKwkJc2l6ZSAtPSBuc2VudDsKKwkJYnVmZmVyICs9IG5zZW50OworCQlnb3RvIHNlbmQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBcYnJpZWYgSXQgY29waWVzIHRoZSBhbW91bnQgb2YgZGF0YSBjb250YWluZWQgaW50byAnYnVmZmVyJyBpbnRvICd0ZW1wYnVmJy4KKyAqIGFuZCBpdCBjaGVja3MgZm9yIGJ1ZmZlciBvdmVyZmxvd3MuCisgKgorICogVGhpcyBmdW5jdGlvbiBiYXNpY2FsbHkgY29waWVzICdzaXplJyBieXRlcyBvZiBkYXRhIGNvbnRhaW5lZCBpbnRvICdidWZmZXInCisgKiBpbnRvICd0ZW1wYnVmJywgc3RhcnRpbmcgYXQgb2Zmc2V0ICdvZmZzZXQnLiBCZWZvcmUgdGhhdCwgaXQgY2hlY2tzIHRoYXQgdGhlCisgKiByZXN1bHRpbmcgYnVmZmVyIHdpbGwgbm90IGJlIGxhcmdlcgl0aGFuICd0b3RzaXplJy4gRmluYWxseSwgaXQgdXBkYXRlcworICogdGhlICdvZmZzZXQnIHZhcmlhYmxlIGluIG9yZGVyIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBlbXB0eSBsb2NhdGlvbiBvZiB0aGUgYnVmZmVyLgorICoKKyAqIEluIGNhc2UgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoICdjaGVja29ubHknIGVxdWFsIHRvIDEsIGl0IGRvZXMgbm90IGNvcHkKKyAqIHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlci4gSXQgb25seSBjaGVja3MgZm9yIGJ1ZmZlciBvdmVyZmxvd3MgYW5kIGl0IHVwZGF0ZXMgdGhlCisgKiAnb2Zmc2V0JyB2YXJpYWJsZS4gVGhpcyBtb2RlIGNhbiBiZSB1c2VmdWwgd2hlbiB0aGUgYnVmZmVyIGFscmVhZHkgY29udGFpbnMgdGhlCisgKiBkYXRhIChtYXliZSBiZWNhdXNlIHRoZSBwcm9kdWNlciB3cml0ZXMgZGlyZWN0bHkgaW50byB0aGUgdGFyZ2V0IGJ1ZmZlciksIHNvCisgKiBvbmx5IHRoZSBidWZmZXIgb3ZlcmZsb3cgY2hlY2sgaGFzIHRvIGJlIG1hZGUuCisgKiBJbiB0aGlzIGNhc2UsIGJvdGggJ2J1ZmZlcicgYW5kICd0ZW1wYnVmJyBjYW4gYmUgTlVMTCB2YWx1ZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgaW4gY2FzZSB0aGUgdXNlcmxhbmQgYXBwbGljYXRpb24gZG9lcyBub3Qga25vdyBpbW1lZGlhdGVseQorICogYWxsIHRoZSBkYXRhIGl0IGhhcyB0byB3cml0ZSBpbnRvIHRoZSBzb2NrZXQuIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3YXkgdG8gY3JlYXRlCisgKiB0aGUgInN0cmVhbSIgc3RlcCBieSBzdGVwLCBhcHBlbmRpbmcgdGhlIG5ldyBkYXRhIHRvIHRoZSBvbGQgb25lLiBUaGVuLCB3aGVuIGFsbCB0aGUKKyAqIGRhdGEgaGFzIGJlZW4gYnVmZmVyaXplZCwgdGhlIGFwcGxpY2F0aW9uIGNhbiBjYWxsIHRoZSBzb2NrX3NlbmQoKSBmdW5jdGlvbi4KKyAqCisgKiBccGFyYW0gYnVmZmVyOiBhIGNoYXIgcG9pbnRlciB0byBhIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciB0aGF0IGtlZXBzIHRoZSBkYXRhCisgKiB0aGF0IGhhcyB0byBiZSBjb3BpZWQuCisgKgorICogXHBhcmFtIHNpemU6IG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgdG8gYmUgY29waWVkLgorICoKKyAqIFxwYXJhbSB0ZW1wYnVmOiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgKG9mIHNpemUgJ3RvdHNpemUnKSBpbiB3aGljaCBkYXRhCisgKiBoYXMgdG8gYmUgY29waWVkLgorICoKKyAqIFxwYXJhbSBvZmZzZXQ6IGFuIGluZGV4IGludG8gJ3RlbXBidWYnIHdoaWNoIGtlZXBzIHRoZSBsb2NhdGlvbiBvZiBpdHMgZmlyc3QKKyAqIGVtcHR5IGxvY2F0aW9uLgorICoKKyAqIFxwYXJhbSB0b3RzaXplOiB0b3RhbCBzaXplIG9mIHRoZSBidWZmZXIgaW4gd2hpY2ggZGF0YSBpcyBiZWluZyBjb3BpZWQuCisgKgorICogXHBhcmFtIGNoZWNrb25seTogJzEnIGlmIHdlIGRvIG5vdCB3YW50IHRvIGNvcHkgZGF0YSBpbnRvIHRoZSBidWZmZXIgYW5kIHdlCisgKiB3YW50IGp1c3QgZG8gYSBidWZmZXIgb3ZyZWZsb3cgY29udHJvbCwgJzAnIGlmIGRhdGEgaGFzIHRvIGJlIGNvcGllZCBhcyB3ZWxsLgorICoKKyAqIFxwYXJhbSBlcnJidWY6IGEgcG9pbnRlciB0byBhbiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvbXBsZXRlCisgKiBlcnJvciBtZXNzYWdlLiBUaGlzIGJ1ZmZlciBoYXMgdG8gYmUgYXQgbGVhc3QgJ2VycmJ1ZmxlbicgaW4gbGVuZ3RoLgorICogSXQgY2FuIGJlIE5VTEw7IGluIHRoaXMgY2FzZSB0aGUgZXJyb3IgY2Fubm90IGJlIHByaW50ZWQuCisgKgorICogXHBhcmFtIGVycmJ1ZmxlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW5zIHRoZSBlcnJvci4gVGhlIGVycm9yIG1lc3NhZ2UgY2Fubm90IGJlCisgKiBsYXJnZXIgdGhhbiAnZXJyYnVmbGVuIC0gMScgYmVjYXVzZSB0aGUgbGFzdCBjaGFyIGlzIHJlc2VydmVkIGZvciB0aGUgc3RyaW5nIHRlcm1pbmF0b3IuCisgKgorICogXHJldHVybiAnMCcgaWYgZXZlcnl0aGluZyBpcyBmaW5lLCAnLTEnIGlmIHNvbWUgZXJyb3JzIG9jY3VycmVkLiBUaGUgZXJyb3IgbWVzc2FnZQorICogaXMgcmV0dXJuZWQgaW4gdGhlICdlcnJidWYnIHZhcmlhYmxlLiBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLCAndGVtcGJ1Zicgd2lsbAorICogaGF2ZSB0aGUgbmV3IHN0cmluZyBhcHBlbmRlZCwgYW5kICdvZmZzZXQnIHdpbGwga2VlcCB0aGUgbGVuZ3RoIG9mIHRoYXQgYnVmZmVyLgorICogSW4gY2FzZSBvZiAnY2hlY2tvbmx5ID09IDEnLCBkYXRhIGlzIG5vdCBjb3BpZWQsIGJ1dCAnb2Zmc2V0JyBpcyB1cGRhdGVkIGluIGFueSBjYXNlLgorICoKKyAqIFx3YXJuaW5nIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBidWZmZXIgaW4gd2hpY2ggZGF0YSBoYXMgdG8gYmUgc3RvcmVkIGlzCisgKiBsYXJnZSAndG90YnVmJyBieXRlcy4KKyAqCisgKiBcd2FybmluZyBJbiBjYXNlIG9mICdjaGVja29ubHknLCBiZSBjYXJlZnVsbHkgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uICpiZWZvcmUqIGNvcHlpbmcKKyAqIHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlci4gT3RoZXJ3aXNlLCB0aGUgY29udHJvbCBhYm91dCB0aGUgYnVmZmVyIG92ZXJmbG93IGlzIHVzZWxlc3MuCisgKi8KK2ludCBzb2NrX2J1ZmZlcml6ZShjb25zdCBjaGFyICpidWZmZXIsIGludCBzaXplLCBjaGFyICp0ZW1wYnVmLCBpbnQgKm9mZnNldCwgaW50IHRvdHNpemUsIGludCBjaGVja29ubHksIGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1ZmxlbikKK3sKKwlpZiAoKCpvZmZzZXQgKyBzaXplKSA+IHRvdHNpemUpCisJeworCQlpZiAoZXJyYnVmKQorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIGVycmJ1ZmxlbiwgIk5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIHRlbXBvcmFyeSBzZW5kIGJ1ZmZlci4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghY2hlY2tvbmx5KQorCQltZW1jcHkodGVtcGJ1ZiArICgqb2Zmc2V0KSwgYnVmZmVyLCBzaXplKTsKKworCSgqb2Zmc2V0KSArPSBzaXplOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBcYnJpZWYgSXQgd2FpdHMgb24gYSBjb25uZWN0ZWQgc29ja2V0IGFuZCBpdCBtYW5hZ2VzIHRvIHJlY2VpdmUgZGF0YS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGJhc2ljYWxseSBjYWxscyB0aGUgcmVjdigpIHNvY2tldCBmdW5jdGlvbiBhbmQgaXQgY2hlY2tzIHRoYXQgbm8KKyAqIGVycm9yIG9jY3VycmVkLiBJZiB0aGF0IGhhcHBlbnMsIGl0IHdyaXRlcyB0aGUgZXJyb3IgbWVzc2FnZSBpbnRvICdlcnJidWYnLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyBpdHMgYmVoYXZpb3IgYWNjb3JkaW5nIHRvIHRoZSAncmVjZWl2ZWFsbCcgZmxhZzogaWYgd2UKKyAqIHdhbnQgdG8gcmVjZWl2ZSBleGFjdGx5ICdzaXplJyBieXRlLCBpdCBsb29wcyBvbiB0aGUgcmVjdigpCXVudGlsIGFsbCB0aGUgcmVxdWVzdGVkCisgKiBkYXRhIGlzIGFycml2ZWQuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgZGF0YSBjdXJyZW50bHkgYXZhaWxhYmxlLgorICoKKyAqIEluIGNhc2UgdGhlIHNvY2tldCBkb2VzIG5vdCBoYXZlIGVub3VnaCBkYXRhIGF2YWlsYWJsZSwgaXQgY3ljbGVzIG9uIHRoZSByZWN2KCkKKyAqIHVudGlsIHRoZSByZXF1ZXN0ZWQgZGF0YSAob2Ygc2l6ZSAnc2l6ZScpIGlzIGFycml2ZWQuCisgKiBJbiB0aGlzIGNhc2UsIGl0IGJsb2NrcyB1bnRpbCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaXMgZXF1YWwgdG8gJ3NpemUnLgorICoKKyAqIFxwYXJhbSBzb2NrOiB0aGUgY29ubmVjdGVkIHNvY2tldCBjdXJyZW50bHkgb3BlbmVkLgorICoKKyAqIFxwYXJhbSBidWZmZXI6IGEgY2hhciBwb2ludGVyIHRvIGEgdXNlci1hbGxvY2F0ZWQgYnVmZmVyIGluIHdoaWNoIGRhdGEgaGFzIHRvIGJlIHN0b3JlZAorICoKKyAqIFxwYXJhbSBzaXplOiBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBXQVJOSU5HOiB0aGlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiB0aGF0IHdlIGFyZSBleHBlY3RpbmcgdG8gYmUgcmVhZC4KKyAqCisgKiBccGFyYW0gcmVjZWl2ZWFsbDogaWYgJzAnIChvciBTT0NLX1JFQ0VJVkVBTExfTk8pLCBpdCByZXR1cm5zIGFzIHNvb24gYXMgc29tZSBkYXRhCisgKiBpcyByZWFkeTsgb3RoZXJ3aXNlLCAob3IgU09DS19SRUNFSVZFQUxMX1lFUykgaXQgd2FpdHMgdW50aWwgJ3NpemUnIGRhdGEgaGFzIGJlZW4KKyAqIHJlY2VpdmVkIChpbiBjYXNlIHRoZSBzb2NrZXQgZG9lcyBub3QgaGF2ZSBlbm91Z2ggZGF0YSBhdmFpbGFibGUpLgorICoKKyAqIFxwYXJhbSBlcnJidWY6IGEgcG9pbnRlciB0byBhbiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvbXBsZXRlCisgKiBlcnJvciBtZXNzYWdlLiBUaGlzIGJ1ZmZlciBoYXMgdG8gYmUgYXQgbGVhc3QgJ2VycmJ1ZmxlbicgaW4gbGVuZ3RoLgorICogSXQgY2FuIGJlIE5VTEw7IGluIHRoaXMgY2FzZSB0aGUgZXJyb3IgY2Fubm90IGJlIHByaW50ZWQuCisgKgorICogXHBhcmFtIGVycmJ1ZmxlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW5zIHRoZSBlcnJvci4gVGhlIGVycm9yIG1lc3NhZ2UgY2Fubm90IGJlCisgKiBsYXJnZXIgdGhhbiAnZXJyYnVmbGVuIC0gMScgYmVjYXVzZSB0aGUgbGFzdCBjaGFyIGlzIHJlc2VydmVkIGZvciB0aGUgc3RyaW5nIHRlcm1pbmF0b3IuCisgKgorICogXHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaWYgZXZlcnl0aGluZyBpcyBmaW5lLCAnLTEnIGlmIHNvbWUgZXJyb3JzIG9jY3VycmVkLgorICogVGhlIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQgaW4gdGhlICdlcnJidWYnIHZhcmlhYmxlLgorICovCisKKy8qCisgKiBPbiBVTipYLCByZWN2KCkgcmV0dXJucyBzc2l6ZV90LgorICogT24gV2luZG93cywgdGhlcmUgKmlzKiBubyBzc2l6ZV90LCBhbmQgaXQgcmV0dXJucyBhbiBpbnQuCisgKiBEZWZpbmUgc3NpemVfdCBhcyBpbnQgb24gV2luZG93cyBzbyB3ZSBjYW4gdXNlIGl0IGFzIHRoZSByZXR1cm4gdmFsdWUKKyAqIGZyb20gcmVjdigpLgorICovCisjaWZkZWYgX1dJTjMyCit0eXBlZGVmIGludCBzc2l6ZV90OworI2VuZGlmCisKK2ludCBzb2NrX3JlY3YoU09DS0VUIHNvY2ssIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGludCByZWNlaXZlYWxsLAorICAgIGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1ZmxlbikKK3sKKwljaGFyICpidWZwID0gYnVmZmVyOworCWludCByZW1haW5pbmc7CisJc3NpemVfdCBucmVhZDsKKworCWlmIChzaXplID09IDApCisJeworCQlTT0NLX0FTU0VSVCgiSSBoYXZlIGJlZW4gcmVxdWVzdGVkIHRvIHJlYWQgemVybyBieXRlcyIsIDEpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHNpemUgPiBJTlRfTUFYKQorCXsKKwkJcGNhcF9zbnByaW50ZihlcnJidWYsIGVycmJ1ZmxlbiwgIkNhbid0IHJlYWQgbW9yZSB0aGFuICV1IGJ5dGVzIHdpdGggc29ja19yZWN2IiwKKwkJICAgIElOVF9NQVgpOworCQlyZXR1cm4gLTE7CisJfQorCisJYnVmcCA9IChjaGFyICopIGJ1ZmZlcjsKKwlyZW1haW5pbmcgPSAoaW50KSBzaXplOworCisJLyoKKwkgKiBXZSBkb24ndCB1c2UgTVNHX1dBSVRBTEwgYmVjYXVzZSBpdCdzIG5vdCBzdXBwb3J0ZWQgaW4KKwkgKiBXaW4zMi4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCW5yZWFkID0gcmVjdihzb2NrLCBidWZwLCByZW1haW5pbmcsIDApOworCisJCWlmIChucmVhZCA9PSAtMSkKKwkJeworI2lmbmRlZiBfV0lOMzIKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQlyZXR1cm4gLTM7CisjZW5kaWYKKwkJCXNvY2tfZ2V0ZXJyb3IoInJlY3YoKTogIiwgZXJyYnVmLCBlcnJidWZsZW4pOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKG5yZWFkID09IDApCisJCXsKKwkJCWlmIChlcnJidWYpCisJCQl7CisJCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIGVycmJ1ZmxlbiwKKwkJCQkgICAgIlRoZSBvdGhlciBob3N0IHRlcm1pbmF0ZWQgdGhlIGNvbm5lY3Rpb24uIik7CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKgorCQkgKiBEbyB3ZSB3YW50IHRvIHJlYWQgdGhlIGFtb3VudCByZXF1ZXN0ZWQsIG9yIGp1c3QgcmV0dXJuCisJCSAqIHdoYXQgd2UgZ290PworCQkgKi8KKwkJaWYgKCFyZWNlaXZlYWxsKQorCQl7CisJCQkvKgorCQkJICogSnVzdCByZXR1cm4gd2hhdCB3ZSBnb3QuCisJCQkgKi8KKwkJCXJldHVybiAoaW50KSBucmVhZDsKKwkJfQorCisJCWJ1ZnAgKz0gbnJlYWQ7CisJCXJlbWFpbmluZyAtPSBucmVhZDsKKworCQlpZiAocmVtYWluaW5nID09IDApCisJCQlyZXR1cm4gKGludCkgc2l6ZTsKKwl9Cit9CisKKy8qCisgKiBcYnJpZWYgSXQgZGlzY2FyZHMgTiBieXRlcyB0aGF0IGFyZSBjdXJyZW50bHkgd2FpdGluZyB0byBiZSByZWFkIG9uIHRoZSBjdXJyZW50IHNvY2tldC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBpbiBjYXNlIHdlIHJlY2VpdmUgYSBtZXNzYWdlIHdlIGNhbm5vdCB1bmRlcnN0YW5kIChlLmcuCisgKiB3cm9uZyB2ZXJzaW9uIG51bWJlciB3aGVuIHJlY2VpdmluZyBhIG5ldHdvcmsgcGFja2V0KSwgc28gdGhhdCB3ZSBoYXZlIHRvIGRpc2NhcmQgYWxsCisgKiBkYXRhIGJlZm9yZSByZWFkaW5nIGEgbmV3IG1lc3NhZ2UuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJlYWQgJ3NpemUnIGJ5dGVzIGZyb20gdGhlIHNvY2tldCBhbmQgZGlzY2FyZCB0aGVtLgorICogSXQgZGVmaW5lcyBhbiBpbnRlcm5hbCBidWZmZXIgaW4gd2hpY2ggZGF0YSB3aWxsIGJlIGNvcGllZDsgaG93ZXZlciwgaW4gY2FzZQorICogdGhpcyBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaCwgaXQgd2lsbCBjeWNsZSBpbiBvcmRlciB0byByZWFkIGV2ZXJ5dGhpbmcgYXMgd2VsbC4KKyAqCisgKiBccGFyYW0gc29jazogdGhlIGNvbm5lY3RlZCBzb2NrZXQgY3VycmVudGx5IG9wZW5lZC4KKyAqCisgKiBccGFyYW0gc2l6ZTogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSB0byBiZSBkaXNjYXJkZWQuCisgKgorICogXHBhcmFtIGVycmJ1ZjogYSBwb2ludGVyIHRvIGFuIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgY29tcGxldGUKKyAqIGVycm9yIG1lc3NhZ2UuIFRoaXMgYnVmZmVyIGhhcyB0byBiZSBhdCBsZWFzdCAnZXJyYnVmbGVuJyBpbiBsZW5ndGguCisgKiBJdCBjYW4gYmUgTlVMTDsgaW4gdGhpcyBjYXNlIHRoZSBlcnJvciBjYW5ub3QgYmUgcHJpbnRlZC4KKyAqCisgKiBccGFyYW0gZXJyYnVmbGVuOiBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbnMgdGhlIGVycm9yLiBUaGUgZXJyb3IgbWVzc2FnZSBjYW5ub3QgYmUKKyAqIGxhcmdlciB0aGFuICdlcnJidWZsZW4gLSAxJyBiZWNhdXNlIHRoZSBsYXN0IGNoYXIgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBzdHJpbmcgdGVybWluYXRvci4KKyAqCisgKiBccmV0dXJuICcwJyBpZiBldmVyeXRoaW5nIGlzIGZpbmUsICctMScgaWYgc29tZSBlcnJvcnMgb2NjdXJyZWQuCisgKiBUaGUgZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCBpbiB0aGUgJ2VycmJ1ZicgdmFyaWFibGUuCisgKi8KK2ludCBzb2NrX2Rpc2NhcmQoU09DS0VUIHNvY2ssIGludCBzaXplLCBjaGFyICplcnJidWYsIGludCBlcnJidWZsZW4pCit7CisjZGVmaW5lIFRFTVBfQlVGX1NJWkUgMzI3NjgKKworCWNoYXIgYnVmZmVyW1RFTVBfQlVGX1NJWkVdOwkJLyogbmV0d29yayBidWZmZXIsIHRvIGJlIHVzZWQgd2hlbiB0aGUgbWVzc2FnZSBpcyBkaXNjYXJkZWQgKi8KKworCS8qCisJICogQSBzdGF0aWMgYWxsb2NhdGlvbiBhdm9pZHMgdGhlIG5lZWQgb2YgYSAnbWFsbG9jKCknIGVhY2ggdGltZSB3ZSB3YW50IHRvIGRpc2NhcmQgYSBtZXNzYWdlCisJICogT3VyIGZlZWxpbmcgaXMgdGhhdCBhIGJ1ZmZlciBpZiAzMktCIGlzIGVub3VnaCBmb3IgbW9zdCBvZiB0aGUgYXBwbGljYXRpb247CisJICogaW4gY2FzZSB0aGlzIGlzIG5vdCBlbm91Z2gsIHRoZSAid2hpbGUiIGxvb3AgZGlzY2FyZHMgdGhlIG1lc3NhZ2UgYnkgY2FsbGluZyB0aGUKKwkgKiBzb2NrcmVjdigpIHNldmVyYWwgdGltZXMuCisJICogV2UgZG8gbm90IHdhbnQgdG8gY3JlYXRlIGEgYmlnZ2VyIHZhcmlhYmxlIGJlY2F1c2UgdGhpcyBjYXVzZXMgdGhlIHByb2dyYW0gdG8gZXhpdCBvbgorCSAqIHNvbWUgcGxhdGZvcm1zIChlLmcuIEJTRCkKKwkgKi8KKwl3aGlsZSAoc2l6ZSA+IFRFTVBfQlVGX1NJWkUpCisJeworCQlpZiAoc29ja19yZWN2KHNvY2ssIGJ1ZmZlciwgVEVNUF9CVUZfU0laRSwgU09DS19SRUNFSVZFQUxMX1lFUywgZXJyYnVmLCBlcnJidWZsZW4pID09IC0xKQorCQkJcmV0dXJuIC0xOworCisJCXNpemUgLT0gVEVNUF9CVUZfU0laRTsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIHN0aWxsIGRhdGEgdG8gYmUgZGlzY2FyZGVkCisJICogSW4gdGhpcyBjYXNlLCB0aGUgZGF0YSBjYW4gZml0IGludG8gdGhlIHRlbXBvcmFyeSBidWZmZXIKKwkgKi8KKwlpZiAoc2l6ZSkKKwl7CisJCWlmIChzb2NrX3JlY3Yoc29jaywgYnVmZmVyLCBzaXplLCBTT0NLX1JFQ0VJVkVBTExfWUVTLCBlcnJidWYsIGVycmJ1ZmxlbikgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJfQorCisJU09DS19BU1NFUlQoIkknbSBjdXJyZW50bHkgZGlzY2FyZGluZyBkYXRhXG4iLCAxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogXGJyaWVmIENoZWNrcyB0aGF0IG9uZSBob3N0IChpZGVudGlmaWVkIGJ5IHRoZSBzb2NrYWRkcl9zdG9yYWdlIHN0cnVjdHVyZSkgYmVsb25ncyB0byBhbiAnYWxsb3dlZCBsaXN0Jy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBhZnRlciBhbiBhY2NlcHQoKSBjYWxsIGluIG9yZGVyIHRvIGNoZWNrIGlmIHRoZSBjb25uZWN0aW5nCisgKiBob3N0IGlzIGFsbG93ZWQgdG8gY29ubmVjdCB0byBtZS4gVG8gZG8gdGhhdCwgd2UgaGF2ZSBhIGJ1ZmZlciB0aGF0IGtlZXBzIHRoZSBsaXN0IG9mIHRoZQorICogYWxsb3dlZCBob3N0OyB0aGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbm5lY3RpbmcgaG9zdAorICogYWdhaW5zdCB0aGlzIGhvc3QgbGlzdCwgYW5kIGl0IHJldHVybnMgJzAnIGlzIHRoZSBob3N0IGlzIGluY2x1ZGVkIGluIHRoaXMgbGlzdC4KKyAqCisgKiBccGFyYW0gaG9zdGxpc3Q6IHBvaW50ZXIgdG8gYSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgbGlzdCBvZiB0aGUgYWxsb3dlZCBob3N0LgorICoKKyAqIFxwYXJhbSBzZXA6IGEgc3RyaW5nIHRoYXQga2VlcHMgdGhlIHNlcGFyYXRvcnMgdXNlZCBiZXR3ZWVuIHRoZSBob3N0cyAoZm9yIGV4YW1wbGUgdGhlCisgKiBzcGFjZSBjaGFyYWN0ZXIpIGluIHRoZSBob3N0IGxpc3QuCisgKgorICogXHBhcmFtIGZyb206IGEgc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3R1cmUsIGFzIGl0IGlzIHJldHVybmVkIGJ5IHRoZSBhY2NlcHQoKSBjYWxsLgorICoKKyAqIFxwYXJhbSBlcnJidWY6IGEgcG9pbnRlciB0byBhbiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvbXBsZXRlCisgKiBlcnJvciBtZXNzYWdlLiBUaGlzIGJ1ZmZlciBoYXMgdG8gYmUgYXQgbGVhc3QgJ2VycmJ1ZmxlbicgaW4gbGVuZ3RoLgorICogSXQgY2FuIGJlIE5VTEw7IGluIHRoaXMgY2FzZSB0aGUgZXJyb3IgY2Fubm90IGJlIHByaW50ZWQuCisgKgorICogXHBhcmFtIGVycmJ1ZmxlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW5zIHRoZSBlcnJvci4gVGhlIGVycm9yIG1lc3NhZ2UgY2Fubm90IGJlCisgKiBsYXJnZXIgdGhhbiAnZXJyYnVmbGVuIC0gMScgYmVjYXVzZSB0aGUgbGFzdCBjaGFyIGlzIHJlc2VydmVkIGZvciB0aGUgc3RyaW5nIHRlcm1pbmF0b3IuCisgKgorICogXHJldHVybiBJdCByZXR1cm5zOgorICogLSAnMScgaWYgdGhlIGhvc3QgbGlzdCBpcyBlbXB0eQorICogLSAnMCcgaWYgdGhlIGhvc3QgYmVsb25ncyB0byB0aGUgaG9zdCBsaXN0IChhbmQgdGhlcmVmb3JlIGl0IGlzIGFsbG93ZWQgdG8gY29ubmVjdCkKKyAqIC0gJy0xJyBpbiBjYXNlIHRoZSBob3N0IGRvZXMgbm90IGJlbG9uZyB0byB0aGUgaG9zdCBsaXN0IChhbmQgdGhlcmVmb3JlIGl0IGlzIG5vdCBhbGxvd2VkIHRvIGNvbm5lY3QKKyAqIC0gJy0yJyBpbiBjYXNlIG9yIGVycm9yLiBUaGUgZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCBpbiB0aGUgJ2VycmJ1ZicgdmFyaWFibGUuCisgKi8KK2ludCBzb2NrX2NoZWNrX2hvc3RsaXN0KGNoYXIgKmhvc3RsaXN0LCBjb25zdCBjaGFyICpzZXAsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpmcm9tLCBjaGFyICplcnJidWYsIGludCBlcnJidWZsZW4pCit7CisJLyogY2hlY2tzIGlmIHRoZSBjb25uZWN0aW5nIGhvc3QgaXMgYW1vbmcgdGhlIG9uZXMgYWxsb3dlZCAqLworCWlmICgoaG9zdGxpc3QpICYmIChob3N0bGlzdFswXSkpCisJeworCQljaGFyICp0b2tlbjsJCQkJCS8qIHRlbXAsIG5lZWRlZCB0byBzZXBhcmF0ZSBpdGVtcyBpbnRvIHRoZSBob3N0bGlzdCAqLworCQlzdHJ1Y3QgYWRkcmluZm8gKmFkZHJpbmZvLCAqYWlfbmV4dDsKKwkJY2hhciAqdGVtcGhvc3RsaXN0OworCQljaGFyICpsYXN0czsKKworCQkvKgorCQkgKiBUaGUgcHJvYmxlbSBpcyB0aGF0IHN0cnRvayBtb2RpZmllcyB0aGUgb3JpZ2luYWwgdmFyaWFibGUgYnkgcHV0dGluZyAnMCcgYXQgdGhlIGVuZCBvZiBlYWNoIHRva2VuCisJCSAqIFNvLCB3ZSBoYXZlIHRvIGNyZWF0ZSBhIG5ldyB0ZW1wb3Jhcnkgc3RyaW5nIGluIHdoaWNoIHRoZSBvcmlnaW5hbCBjb250ZW50IGlzIGtlcHQKKwkJICovCisJCXRlbXBob3N0bGlzdCA9IHN0cmR1cChob3N0bGlzdCk7CisJCWlmICh0ZW1waG9zdGxpc3QgPT0gTlVMTCkKKwkJeworCQkJc29ja19nZXRlcnJvcigic29ja19jaGVja19ob3N0bGlzdCgpLCBtYWxsb2MoKSBmYWlsZWQiLCBlcnJidWYsIGVycmJ1Zmxlbik7CisJCQlyZXR1cm4gLTI7CisJCX0KKworCQl0b2tlbiA9IHBjYXBfc3RydG9rX3IodGVtcGhvc3RsaXN0LCBzZXAsICZsYXN0cyk7CisKKwkJLyogaXQgYXZvaWRzIGEgd2FybmluZyBpbiB0aGUgY29tcGlsYXRpb24gKCdhZGRyaW5mbyB1c2VkIGJ1dCBub3QgaW5pdGlhbGl6ZWQnKSAqLworCQlhZGRyaW5mbyA9IE5VTEw7CisKKwkJd2hpbGUgKHRva2VuICE9IE5VTEwpCisJCXsKKwkJCXN0cnVjdCBhZGRyaW5mbyBoaW50czsKKwkJCWludCByZXR2YWw7CisKKwkJCWFkZHJpbmZvID0gTlVMTDsKKwkJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKKwkJCWhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKwkJCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisKKwkJCXJldHZhbCA9IGdldGFkZHJpbmZvKHRva2VuLCAiMCIsICZoaW50cywgJmFkZHJpbmZvKTsKKwkJCWlmIChyZXR2YWwgIT0gMCkKKwkJCXsKKwkJCQlpZiAoZXJyYnVmKQorCQkJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgZXJyYnVmbGVuLCAiZ2V0YWRkcmluZm8oKSAlcyIsIGdhaV9zdHJlcnJvcihyZXR2YWwpKTsKKworCQkJCVNPQ0tfQVNTRVJUKGVycmJ1ZiwgMSk7CisKKwkJCQkvKiBHZXQgbmV4dCB0b2tlbiAqLworCQkJCXRva2VuID0gcGNhcF9zdHJ0b2tfcihOVUxMLCBzZXAsICZsYXN0cyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIGFpX25leHQgaXMgcmVxdWlyZWQgdG8gcHJlc2VydmUgdGhlIGNvbnRlbnQgb2YgYWRkcmluZm8sIGluIG9yZGVyIHRvIGRlYWxsb2NhdGUgaXQgcHJvcGVybHkgKi8KKwkJCWFpX25leHQgPSBhZGRyaW5mbzsKKwkJCXdoaWxlIChhaV9uZXh0KQorCQkJeworCQkJCWlmIChzb2NrX2NtcGFkZHIoZnJvbSwgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICopIGFpX25leHQtPmFpX2FkZHIpID09IDApCisJCQkJeworCQkJCQlmcmVlKHRlbXBob3N0bGlzdCk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCS8qCisJCQkJICogSWYgd2UgYXJlIGhlcmUsIGl0IG1lYW5zIHRoYXQgdGhlIGN1cnJlbnQgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaGVzCisJCQkJICogTGV0J3MgdHJ5IHdpdGggdGhlIG5leHQgb25lIGluIHRoZSBoZWFkZXIgY2hhaW4KKwkJCQkgKi8KKwkJCQlhaV9uZXh0ID0gYWlfbmV4dC0+YWlfbmV4dDsKKwkJCX0KKworCQkJZnJlZWFkZHJpbmZvKGFkZHJpbmZvKTsKKwkJCWFkZHJpbmZvID0gTlVMTDsKKworCQkJLyogR2V0IG5leHQgdG9rZW4gKi8KKwkJCXRva2VuID0gcGNhcF9zdHJ0b2tfcihOVUxMLCBzZXAsICZsYXN0cyk7CisJCX0KKworCQlpZiAoYWRkcmluZm8pCisJCXsKKwkJCWZyZWVhZGRyaW5mbyhhZGRyaW5mbyk7CisJCQlhZGRyaW5mbyA9IE5VTEw7CisJCX0KKworCQlpZiAoZXJyYnVmKQorCQkJcGNhcF9zbnByaW50ZihlcnJidWYsIGVycmJ1ZmxlbiwgIlRoZSBob3N0IGlzIG5vdCBpbiB0aGUgYWxsb3dlZCBob3N0IGxpc3QuIENvbm5lY3Rpb24gcmVmdXNlZC4iKTsKKworCQlmcmVlKHRlbXBob3N0bGlzdCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBObyBob3N0bGlzdCwgc28gd2UgaGF2ZSB0byByZXR1cm4gJ2VtcHR5IGxpc3QnICovCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBcYnJpZWYgQ29tcGFyZXMgdHdvIGFkZHJlc3NlcyBjb250YWluZWQgaW50byB0d28gc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3R1cmVzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvIGNvbXBhcmUgdHdvIGFkZHJlc3NlcywgZ2l2ZW4gdGhlaXIgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24sCisgKiBpLmUuIGFuIHNvY2thZGRyX3N0b3JhZ2Ugc3RydWN0dXJlLgorICoKKyAqIFRoZSB0d28gc3RydWN0dXJlcyBkbyBub3QgbmVlZCB0byBiZSBzb2NrYWRkcl9zdG9yYWdlOyB5b3UgY2FuIGhhdmUgYm90aCAnc29ja2FkZHJfaW4nIGFuZAorICogc29ja2FkZHJfaW42LCBwcm9wZXJseSBhY3N0ZWQgaW4gb3JkZXIgdG8gYmUgY29tcGxpYW50IHRvIHRoZSBmdW5jdGlvbiBpbnRlcmZhY2UuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAnMCcgaWYgdGhlIHR3byBhZGRyZXNzZXMgbWF0Y2hlcywgJy0xJyBpZiBub3QuCisgKgorICogXHBhcmFtIGZpcnN0OiBhIHNvY2thZGRyX3N0b3JhZ2Ugc3RydWN0dXJlLCAoZm9yIGV4YW1wbGUgdGhlIG9uZSB0aGF0IGlzIHJldHVybmVkIGJ5IGFuCisgKiBhY2NlcHQoKSBjYWxsKSwgY29udGFpbmluZyB0aGUgZmlyc3QgYWRkcmVzcyB0byBjb21wYXJlLgorICoKKyAqIFxwYXJhbSBzZWNvbmQ6IGEgc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2Vjb25kIGFkZHJlc3MgdG8gY29tcGFyZS4KKyAqCisgKiBccmV0dXJuICcwJyBpZiB0aGUgYWRkcmVzc2VzIGFyZSBlcXVhbCwgJy0xJyBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCisgKi8KK2ludCBzb2NrX2NtcGFkZHIoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmZpcnN0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc2Vjb25kKQoreworCWlmIChmaXJzdC0+c3NfZmFtaWx5ID09IHNlY29uZC0+c3NfZmFtaWx5KQorCXsKKwkJaWYgKGZpcnN0LT5zc19mYW1pbHkgPT0gQUZfSU5FVCkKKwkJeworCQkJaWYgKG1lbWNtcCgmKCgoc3RydWN0IHNvY2thZGRyX2luICopIGZpcnN0KS0+c2luX2FkZHIpLAorCQkJCSYoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc2Vjb25kKS0+c2luX2FkZHIpLAorCQkJCXNpemVvZihzdHJ1Y3QgaW5fYWRkcikpID09IDApCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZSAvKiBhZGRyZXNzIGZhbWlseSBpcyBBRl9JTkVUNiAqLworCQl7CisJCQlpZiAobWVtY21wKCYoKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIGZpcnN0KS0+c2luNl9hZGRyKSwKKwkJCQkmKCgoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzZWNvbmQpLT5zaW42X2FkZHIpLAorCQkJCXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSA9PSAwKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC0xOworfQorCisvKgorICogXGJyaWVmIEl0IGdldHMgdGhlIGFkZHJlc3MvcG9ydCB0aGUgc3lzdGVtIHBpY2tlZCBmb3IgdGhpcyBzb2NrZXQgKG9uIGNvbm5lY3RlZCBzb2NrZXRzKS4KKyAqCisgKiBJdCBpcyB1c2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBhbmQgcG9ydCB0aGUgc2VydmVyIHBpY2tlZCBmb3Igb3VyIHNvY2tldCBvbiB0aGUgbG9jYWwgbWFjaGluZS4KKyAqIEl0IHdvcmtzIG9ubHkgb246CisgKiAtIGNvbm5lY3RlZCBzb2NrZXRzCisgKiAtIHNlcnZlciBzb2NrZXRzCisgKgorICogT24gdW5jb25uZWN0ZWQgY2xpZW50IHNvY2tldHMgaXQgZG9lcyBub3Qgd29yayBiZWNhdXNlIHRoZSBzeXN0ZW0gZHluYW1pY2FsbHkgY2hvb3NlcyBhIHBvcnQKKyAqIG9ubHkgd2hlbiB0aGUgc29ja2V0IGNhbGxzIGEgc2VuZCgpIGNhbGwuCisgKgorICogXHBhcmFtIHNvY2s6IHRoZSBjb25uZWN0ZWQgc29ja2V0IGN1cnJlbnRseSBvcGVuZWQuCisgKgorICogXHBhcmFtIGFkZHJlc3M6IGl0IGNvbnRhaW5zIHRoZSBhZGRyZXNzIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24uIFRoaXMgYnVmZmVyCisgKiBtdXN0IGJlIHByb3Blcmx5IGFsbG9jYXRlZCBieSB0aGUgdXNlci4gVGhlIGFkZHJlc3MgY2FuIGJlIGVpdGhlciBsaXRlcmFsIG9yIG51bWVyaWMgZGVwZW5kaW5nCisgKiBvbiB0aGUgdmFsdWUgb2YgJ0ZsYWdzJy4KKyAqCisgKiBccGFyYW0gYWRkcmxlbjogdGhlIGxlbmd0aCBvZiB0aGUgJ2FkZHJlc3MnIGJ1ZmZlci4KKyAqCisgKiBccGFyYW0gcG9ydDogaXQgY29udGFpbnMgdGhlIHBvcnQgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi4gVGhpcyBidWZmZXIKKyAqIG11c3QgYmUgcHJvcGVybHkgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgorICoKKyAqIFxwYXJhbSBwb3J0bGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSAncG9ydCcgYnVmZmVyLgorICoKKyAqIFxwYXJhbSBmbGFnczogYSBzZXQgb2YgZmxhZ3MgKHRoZSBvbmVzIGRlZmluZWQgaW50byB0aGUgZ2V0bmFtZWluZm8oKSBzdGFuZGFyZCBzb2NrZXQgZnVuY3Rpb24pCisgKiB0aGF0IGRldGVybWluZSBpZiB0aGUgcmVzdWx0aW5nIGFkZHJlc3MgbXVzdCBiZSBpbiBudW1lcmljIC8gbGl0ZXJhbCBmb3JtLCBhbmQgc28gb24uCisgKgorICogXHBhcmFtIGVycmJ1ZjogYSBwb2ludGVyIHRvIGFuIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgY29tcGxldGUKKyAqIGVycm9yIG1lc3NhZ2UuIFRoaXMgYnVmZmVyIGhhcyB0byBiZSBhdCBsZWFzdCAnZXJyYnVmbGVuJyBpbiBsZW5ndGguCisgKiBJdCBjYW4gYmUgTlVMTDsgaW4gdGhpcyBjYXNlIHRoZSBlcnJvciBjYW5ub3QgYmUgcHJpbnRlZC4KKyAqCisgKiBccGFyYW0gZXJyYnVmbGVuOiBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbnMgdGhlIGVycm9yLiBUaGUgZXJyb3IgbWVzc2FnZSBjYW5ub3QgYmUKKyAqIGxhcmdlciB0aGFuICdlcnJidWZsZW4gLSAxJyBiZWNhdXNlIHRoZSBsYXN0IGNoYXIgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBzdHJpbmcgdGVybWluYXRvci4KKyAqCisgKiBccmV0dXJuIEl0IHJldHVybnMgJy0xJyBpZiB0aGlzIGZ1bmN0aW9uIHN1Y2NlZWRzLCAnMCcgb3RoZXJ3aXNlLgorICogVGhlIGFkZHJlc3MgYW5kIHBvcnQgY29ycmVzcG9uZGluZyBhcmUgcmV0dXJuZWQgYmFjayBpbiB0aGUgYnVmZmVycyAnYWRkcmVzcycgYW5kICdwb3J0Jy4KKyAqIEluIGFueSBjYXNlLCB0aGUgcmV0dXJuZWQgc3RyaW5ncyBhcmUgJzAnIHRlcm1pbmF0ZWQuCisgKgorICogXHdhcm5pbmcgSWYgdGhlIHNvY2tldCBpcyB1c2luZyBhIGNvbm5lY3Rpb25sZXNzIHByb3RvY29sLCB0aGUgYWRkcmVzcyBtYXkgbm90IGJlIGF2YWlsYWJsZQorICogdW50aWwgSS9PIG9jY3VycyBvbiB0aGUgc29ja2V0LgorICovCitpbnQgc29ja19nZXRteWluZm8oU09DS0VUIHNvY2ssIGNoYXIgKmFkZHJlc3MsIGludCBhZGRybGVuLCBjaGFyICpwb3J0LCBpbnQgcG9ydGxlbiwgaW50IGZsYWdzLCBjaGFyICplcnJidWYsIGludCBlcnJidWZsZW4pCit7CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgbXlzb2NrYWRkcjsKKwlzb2NrbGVuX3Qgc29ja2FkZHJsZW47CisKKworCXNvY2thZGRybGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKKworCWlmIChnZXRzb2NrbmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZteXNvY2thZGRyLCAmc29ja2FkZHJsZW4pID09IC0xKQorCXsKKwkJc29ja19nZXRlcnJvcigiZ2V0c29ja25hbWUoKTogIiwgZXJyYnVmLCBlcnJidWZsZW4pOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorCXsKKwkJLyogUmV0dXJucyB0aGUgbnVtZXJpYyBhZGRyZXNzIG9mIHRoZSBob3N0IHRoYXQgdHJpZ2dlcmVkIHRoZSBlcnJvciAqLworCQlyZXR1cm4gc29ja19nZXRhc2NpaV9hZGRycG9ydCgmbXlzb2NrYWRkciwgYWRkcmVzcywgYWRkcmxlbiwgcG9ydCwgcG9ydGxlbiwgZmxhZ3MsIGVycmJ1ZiwgZXJyYnVmbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFxicmllZiBJdCByZXRyaWV2ZXMgdHdvIHN0cmluZ3MgY29udGFpbmluZyB0aGUgYWRkcmVzcyBhbmQgdGhlIHBvcnQgb2YgYSBnaXZlbiAnc29ja2FkZHInIHZhcmlhYmxlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGFuIGV4dGVuZGVkIHZlcnNpb24gb2YgdGhlIGluZXRfbnRvcCgpLCB3aGljaCBkb2VzIG5vdCBleGlzdCBpbgorICogV2luc29jayBiZWNhdXNlIHRoZSBzYW1lIHJlc3VsdCBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcgdGhlIGdldG5hbWVpbmZvKCkuCisgKiBIb3dldmVyLCBkaWZmZXJlbnRseSBmcm9tIGluZXRfbnRvcCgpLCB0aGlzIGZ1bmN0aW9uIGlzIGFibGUgdG8gcmV0dXJuIGFsc28gbGl0ZXJhbCBuYW1lcworICogKGUuZy4gJ2xvY2FsaG9zdCcpIGRlcGVuZGVudGx5IGZyb20gdGhlICdGbGFncycgcGFyYW1ldGVyLgorICoKKyAqIFRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgc29ja2FkZHJfc3RvcmFnZSB2YXJpYWJsZSAod2hpY2ggY2FuIGJlIHJldHVybmVkIGJ5IHNldmVyYWwgZnVuY3Rpb25zCisgKiBsaWtlIGJpbmQoKSwgY29ubmVjdCgpLCBhY2NlcHQoKSwgYW5kIG1vcmUpIGFuZCBpdCB0cmFuc2Zvcm1zIGl0cyBjb250ZW50IGludG8gYSAnaHVtYW4nCisgKiBmb3JtLiBTbywgZm9yIGluc3RhbmNlLCBpdCBpcyBhYmxlIHRvIHRyYW5zbGF0ZSBhbiBoZXggYWRkcmVzcyAoc3RvcmVkIGluIGJpbmFyeSBmb3JtKSBpbnRvCisgKiBhIHN0YW5kYXJkIElQdjYgYWRkcmVzcyBsaWtlICI6OjEiLgorICoKKyAqIFRoZSBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIHBhcmFtZXRlcnMgd2UgaGF2ZSBpbiB0aGUgJ0ZsYWdzJyB2YXJpYWJsZSwgd2hpY2gKKyAqIGFyZSB0aGUgb25lcyBhbGxvd2VkIGluIHRoZSBzdGFuZGFyZCBnZXRuYW1laW5mbygpIHNvY2tldCBmdW5jdGlvbi4KKyAqCisgKiBccGFyYW0gc29ja2FkZHI6IGEgJ3NvY2thZGRyX2luJyBvciAnc29ja2FkZHJfaW42JyBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgYWRkcmVzcyB0aGF0CisgKiBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQgZnJvbSBuZXR3b3JrIGZvcm0gaW50byB0aGUgcHJlc2VudGF0aW9uIGZvcm0uIFRoaXMgc3RydWN0dXJlIG11c3QgYmUKKyAqIHplcm8tZWQgcHJpb3IgdXNpbmcgaXQsIGFuZCB0aGUgYWRkcmVzcyBmYW1pbHkgZmllbGQgbXVzdCBiZSBmaWxsZWQgd2l0aCB0aGUgcHJvcGVyIHZhbHVlLgorICogVGhlIHVzZXIgbXVzdCBjYXN0IGFueSAnc29ja2FkZHJfaW4nIG9yICdzb2NrYWRkcl9pbjYnIHN0cnVjdHVyZXMgdG8gJ3NvY2thZGRyX3N0b3JhZ2UnIGJlZm9yZQorICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFxwYXJhbSBhZGRyZXNzOiBpdCBjb250YWlucyB0aGUgYWRkcmVzcyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLiBUaGlzIGJ1ZmZlcgorICogbXVzdCBiZSBwcm9wZXJseSBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIuIFRoZSBhZGRyZXNzIGNhbiBiZSBlaXRoZXIgbGl0ZXJhbCBvciBudW1lcmljIGRlcGVuZGluZworICogb24gdGhlIHZhbHVlIG9mICdGbGFncycuCisgKgorICogXHBhcmFtIGFkZHJsZW46IHRoZSBsZW5ndGggb2YgdGhlICdhZGRyZXNzJyBidWZmZXIuCisgKgorICogXHBhcmFtIHBvcnQ6IGl0IGNvbnRhaW5zIHRoZSBwb3J0IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24uIFRoaXMgYnVmZmVyCisgKiBtdXN0IGJlIHByb3Blcmx5IGFsbG9jYXRlZCBieSB0aGUgdXNlci4KKyAqCisgKiBccGFyYW0gcG9ydGxlbjogdGhlIGxlbmd0aCBvZiB0aGUgJ3BvcnQnIGJ1ZmZlci4KKyAqCisgKiBccGFyYW0gZmxhZ3M6IGEgc2V0IG9mIGZsYWdzICh0aGUgb25lcyBkZWZpbmVkIGludG8gdGhlIGdldG5hbWVpbmZvKCkgc3RhbmRhcmQgc29ja2V0IGZ1bmN0aW9uKQorICogdGhhdCBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdGluZyBhZGRyZXNzIG11c3QgYmUgaW4gbnVtZXJpYyAvIGxpdGVyYWwgZm9ybSwgYW5kIHNvIG9uLgorICoKKyAqIFxwYXJhbSBlcnJidWY6IGEgcG9pbnRlciB0byBhbiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvbXBsZXRlCisgKiBlcnJvciBtZXNzYWdlLiBUaGlzIGJ1ZmZlciBoYXMgdG8gYmUgYXQgbGVhc3QgJ2VycmJ1ZmxlbicgaW4gbGVuZ3RoLgorICogSXQgY2FuIGJlIE5VTEw7IGluIHRoaXMgY2FzZSB0aGUgZXJyb3IgY2Fubm90IGJlIHByaW50ZWQuCisgKgorICogXHBhcmFtIGVycmJ1ZmxlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW5zIHRoZSBlcnJvci4gVGhlIGVycm9yIG1lc3NhZ2UgY2Fubm90IGJlCisgKiBsYXJnZXIgdGhhbiAnZXJyYnVmbGVuIC0gMScgYmVjYXVzZSB0aGUgbGFzdCBjaGFyIGlzIHJlc2VydmVkIGZvciB0aGUgc3RyaW5nIHRlcm1pbmF0b3IuCisgKgorICogXHJldHVybiBJdCByZXR1cm5zICctMScgaWYgdGhpcyBmdW5jdGlvbiBzdWNjZWVkcywgJzAnIG90aGVyd2lzZS4KKyAqIFRoZSBhZGRyZXNzIGFuZCBwb3J0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFNvY2tBZGRyIGFyZSByZXR1cm5lZCBiYWNrIGluIHRoZSBidWZmZXJzICdhZGRyZXNzJworICogYW5kICdwb3J0Jy4KKyAqIEluIGFueSBjYXNlLCB0aGUgcmV0dXJuZWQgc3RyaW5ncyBhcmUgJzAnIHRlcm1pbmF0ZWQuCisgKi8KK2ludCBzb2NrX2dldGFzY2lpX2FkZHJwb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpzb2NrYWRkciwgY2hhciAqYWRkcmVzcywgaW50IGFkZHJsZW4sIGNoYXIgKnBvcnQsIGludCBwb3J0bGVuLCBpbnQgZmxhZ3MsIGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1ZmxlbikKK3sKKwlzb2NrbGVuX3Qgc29ja2FkZHJsZW47CisJaW50IHJldHZhbDsJCQkJCS8qIFZhcmlhYmxlIHRoYXQga2VlcHMgdGhlIHJldHVybiB2YWx1ZTsgKi8KKworCXJldHZhbCA9IC0xOworCisjaWZkZWYgX1dJTjMyCisJaWYgKHNvY2thZGRyLT5zc19mYW1pbHkgPT0gQUZfSU5FVCkKKwkJc29ja2FkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwllbHNlCisJCXNvY2thZGRybGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworI2Vsc2UKKwlzb2NrYWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSk7CisjZW5kaWYKKworCWlmICgoZmxhZ3MgJiBOSV9OVU1FUklDSE9TVCkgPT0gMCkJLyogQ2hlY2sgdGhhdCB3ZSB3YW50IGxpdGVyYWwgbmFtZXMgKi8KKwl7CisJCWlmICgoc29ja2FkZHItPnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgJiYKKwkJCShtZW1jbXAoJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzb2NrYWRkciktPnNpbjZfYWRkciwgIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpID09IDApKQorCQl7CisJCQlpZiAoYWRkcmVzcykKKwkJCQlzdHJsY3B5KGFkZHJlc3MsIFNPQ0tFVF9OQU1FX05VTExfREFELCBhZGRybGVuKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisKKwlpZiAoZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKSBzb2NrYWRkciwgc29ja2FkZHJsZW4sIGFkZHJlc3MsIGFkZHJsZW4sIHBvcnQsIHBvcnRsZW4sIGZsYWdzKSAhPSAwKQorCXsKKwkJLyogSWYgdGhlIHVzZXIgd2FudHMgdG8gcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlICovCisJCWlmIChlcnJidWYpCisJCXsKKwkJCXNvY2tfZ2V0ZXJyb3IoImdldG5hbWVpbmZvKCk6ICIsIGVycmJ1ZiwgZXJyYnVmbGVuKTsKKwkJCWVycmJ1ZltlcnJidWZsZW4gLSAxXSA9IDA7CisJCX0KKworCQlpZiAoYWRkcmVzcykKKwkJeworCQkJc3RybGNweShhZGRyZXNzLCBTT0NLRVRfTk9fTkFNRV9BVkFJTEFCTEUsIGFkZHJsZW4pOworCQkJYWRkcmVzc1thZGRybGVuIC0gMV0gPSAwOworCQl9CisKKwkJaWYgKHBvcnQpCisJCXsKKwkJCXN0cmxjcHkocG9ydCwgU09DS0VUX05PX1BPUlRfQVZBSUxBQkxFLCBwb3J0bGVuKTsKKwkJCXBvcnRbcG9ydGxlbiAtIDFdID0gMDsKKwkJfQorCisJCXJldHZhbCA9IDA7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFxicmllZiBJdCB0cmFuc2xhdGVzIGFuIGFkZHJlc3MgZnJvbSB0aGUgJ3ByZXNlbnRhdGlvbicgZm9ybSBpbnRvIHRoZSAnbmV0d29yaycgZm9ybS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGJhc2ljYWxseSByZXBsYWNlcyBpbmV0X3B0b24oKSwgd2hpY2ggZG9lcyBub3QgZXhpc3QgaW4gV2luc29jayBiZWNhdXNlCisgKiB0aGUgc2FtZSByZXN1bHQgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZSBnZXRhZGRyaW5mbygpLgorICogQW4gYWRkaXRpb25hbCBhZHZhbnRhZ2UgaXMgdGhhdCAnQWRkcmVzcycgY2FuIGJlIGJvdGggYSBudW1lcmljIGFkZHJlc3MgKGUuZy4gJzEyNy4wLjAuMScsCisgKiBsaWtlIGluIGluZXRfcHRvbigpICkgYW5kIGEgbGl0ZXJhbCBuYW1lIChlLmcuICdsb2NhbGhvc3QnKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHJldmVyc2Ugam9iIG9mIHNvY2tfZ2V0YXNjaWlfYWRkcnBvcnQoKS4KKyAqCisgKiBccGFyYW0gYWRkcmVzczogYSB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRoZSBuYW1lIHlvdSBoYXZlIHRvCisgKiB0cmFuc2xhdGUuIFRoZSBuYW1lIGNhbiBiZSBlaXRoZXIgbGl0ZXJhbCAoZS5nLiAnbG9jYWxob3N0Jykgb3IgbnVtZXJpYyAoZS5nLiAnOjoxJykuCisgKgorICogXHBhcmFtIHNvY2thZGRyOiBhIHVzZXItYWxsb2NhdGVkIHNvY2thZGRyX3N0b3JhZ2Ugc3RydWN0dXJlIHdoaWNoIHdpbGwgY29udGFpbnMgdGhlCisgKiAnbmV0d29yaycgZm9ybSBvZiB0aGUgcmVxdWVzdGVkIGFkZHJlc3MuCisgKgorICogXHBhcmFtIGFkZHJfZmFtaWx5OiBhIGNvbnN0YW50IHdoaWNoIGNhbiBhc3N1bWUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAtICdBRl9JTkVUJyBpZiB3ZSB3YW50IHRvIHBpbmcgYW4gSVB2NCBob3N0CisgKiAtICdBRl9JTkVUNicgaWYgd2Ugd2FudCB0byBwaW5nIGFuIElQdjYgaG9zdAorICogLSAnQUZfVU5TUEVDJyBpZiB3ZSBkbyBub3QgaGF2ZSBwcmVmZXJlbmNlcyBhYm91dCB0aGUgcHJvdG9jb2wgdXNlZCB0byBwaW5nIHRoZSBob3N0CisgKgorICogXHBhcmFtIGVycmJ1ZjogYSBwb2ludGVyIHRvIGFuIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgY29tcGxldGUKKyAqIGVycm9yIG1lc3NhZ2UuIFRoaXMgYnVmZmVyIGhhcyB0byBiZSBhdCBsZWFzdCAnZXJyYnVmbGVuJyBpbiBsZW5ndGguCisgKiBJdCBjYW4gYmUgTlVMTDsgaW4gdGhpcyBjYXNlIHRoZSBlcnJvciBjYW5ub3QgYmUgcHJpbnRlZC4KKyAqCisgKiBccGFyYW0gZXJyYnVmbGVuOiBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbnMgdGhlIGVycm9yLiBUaGUgZXJyb3IgbWVzc2FnZSBjYW5ub3QgYmUKKyAqIGxhcmdlciB0aGFuICdlcnJidWZsZW4gLSAxJyBiZWNhdXNlIHRoZSBsYXN0IGNoYXIgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBzdHJpbmcgdGVybWluYXRvci4KKyAqCisgKiBccmV0dXJuICctMScgaWYgdGhlIHRyYW5zbGF0aW9uIHN1Y2NlZWRlZCwgJy0yJyBpZiB0aGVyZSB3YXMgc29tZSBub24gY3JpdGljYWwgZXJyb3IsICcwJworICogb3RoZXJ3aXNlLiBJbiBjYXNlIGl0IGZhaWxzLCB0aGUgY29udGVudCBvZiB0aGUgU29ja0FkZHIgdmFyaWFibGUgcmVtYWlucyB1bmNoYW5nZWQuCisgKiBBICdub24gY3JpdGljYWwgZXJyb3InIGNhbiBvY2N1ciBpbiBjYXNlIHRoZSAnQWRkcmVzcycgaXMgYSBsaXRlcmFsIG5hbWUsIHdoaWNoIGNhbiBiZSBtYXBwZWQKKyAqIHRvIHNldmVyYWwgbmV0d29yayBhZGRyZXNzZXMgKGUuZy4gJ2Zvby5iYXIuY29tJyA9PiAnMTAuMi4yLjInIGFuZCAnMTAuMi4yLjMnKS4gSW4gdGhpcyBjYXNlCisgKiB0aGUgY29udGVudCBvZiB0aGUgU29ja0FkZHIgcGFyYW1ldGVyIHdpbGwgYmUgdGhlIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgbWFwcGluZy4KKyAqCisgKiBcd2FybmluZyBUaGUgc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3R1cmUgTVVTVCBiZSBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIuCisgKi8KK2ludCBzb2NrX3ByZXNlbnQybmV0d29yayhjb25zdCBjaGFyICphZGRyZXNzLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc29ja2FkZHIsIGludCBhZGRyX2ZhbWlseSwgY2hhciAqZXJyYnVmLCBpbnQgZXJyYnVmbGVuKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGFkZHJpbmZvICphZGRyaW5mbzsKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKworCWhpbnRzLmFpX2ZhbWlseSA9IGFkZHJfZmFtaWx5OworCisJaWYgKChyZXR2YWwgPSBzb2NrX2luaXRhZGRyZXNzKGFkZHJlc3MsICIyMjIyMiIgLyogZmFrZSBwb3J0ICovLCAmaGludHMsICZhZGRyaW5mbywgZXJyYnVmLCBlcnJidWZsZW4pKSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWRkcmluZm8tPmFpX2ZhbWlseSA9PSBQRl9JTkVUKQorCQltZW1jcHkoc29ja2FkZHIsIGFkZHJpbmZvLT5haV9hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJZWxzZQorCQltZW1jcHkoc29ja2FkZHIsIGFkZHJpbmZvLT5haV9hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCisJaWYgKGFkZHJpbmZvLT5haV9uZXh0ICE9IE5VTEwpCisJeworCQlmcmVlYWRkcmluZm8oYWRkcmluZm8pOworCisJCWlmIChlcnJidWYpCisJCQlwY2FwX3NucHJpbnRmKGVycmJ1ZiwgZXJyYnVmbGVuLCAiTW9yZSB0aGFuIG9uZSBzb2NrZXQgcmVxdWVzdGVkOyB1c2luZyB0aGUgZmlyc3Qgb25lIHJldHVybmVkIik7CisJCXJldHVybiAtMjsKKwl9CisKKwlmcmVlYWRkcmluZm8oYWRkcmluZm8pOworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL3NvY2t1dGlscy5oIGIvc29ja3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwYmJjZQotLS0gL2Rldi9udWxsCisrKyBiL3NvY2t1dGlscy5oCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIC0gMjAwMworICogTmV0R3JvdXAsIFBvbGl0ZWNuaWNvIGRpIFRvcmlubyAoSXRhbHkpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFBvbGl0ZWNuaWNvIGRpIFRvcmlubyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1NPQ0tVVElMU19IX18KKyNkZWZpbmUgX19TT0NLVVRJTFNfSF9fCisKKyNpZiBfTVNDX1ZFUiA+IDEwMDAKKyNwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyAgLyogV2luZG93cyAqLworICAvKgorICAgKiBQcmV2ZW50cyBhIGNvbXBpbGVyIHdhcm5pbmcgaW4gY2FzZSB0aGlzIHdhcyBhbHJlYWR5IGRlZmluZWQgKHRvCisgICAqIGF2b2lkIHRoYXQgd2luZG93cy5oIGluY2x1ZGVzIHdpbnNvY2suaCkKKyAgICovCisgICNpZmRlZiBfV0lOU09DS0FQSV8KKyAgICAjdW5kZWYgX1dJTlNPQ0tBUElfCisgICNlbmRpZgorICAvKiBOZWVkIHdpbmRlZi5oIGZvciBkZWZpbmVzIHVzZWQgaW4gd2luc29jazIuaCB1bmRlciBNaW5nVzMyICovCisgICNpZmRlZiBfX01JTkdXMzJfXworICAgICNpbmNsdWRlIDx3aW5kZWYuaD4KKyAgI2VuZGlmCisgICNpbmNsdWRlIDx3aW5zb2NrMi5oPgorICAjaW5jbHVkZSA8d3MydGNwaXAuaD4KKyNlbHNlCisgIC8qIFVOKlggKi8KKyAgI2luY2x1ZGUgPHN0ZGlvLmg+CisgICNpbmNsdWRlIDxzdHJpbmcuaD4JLyogZm9yIG1lbXNldCgpICovCisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyAgI2luY2x1ZGUgPG5ldGRiLmg+CS8qIEROUyBsb29rdXAgKi8KKyAgI2luY2x1ZGUgPHVuaXN0ZC5oPgkvKiBjbG9zZSgpICovCisgICNpbmNsdWRlIDxlcnJuby5oPgkvKiBlcnJubygpICovCisgICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+IC8qIGZvciBzb2NrYWRkcl9pbiwgaW4gQlNEIGF0IGxlYXN0ICovCisgICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyAgI2luY2x1ZGUgPG5ldC9pZi5oPgorCisgIC8qIQorICAgKiBcYnJpZWYgSW4gV2luc29jaywgYSBzb2NrZXQgaGFuZGxlIGlzIG9mIHR5cGUgU09DS0VUOyBpbiBVTipYLCBpdCdzCisgICAqIGEgZmlsZSBkZXNjcmlwdG9yLCBhbmQgdGhlcmVmb3JlIGEgc2lnbmVkIGludGVnZXIuCisgICAqIFdlIGRlZmluZSBTT0NLRVQgdG8gYmUgYSBzaWduZWQgaW50ZWdlciBvbiBVTipYLCBzbyB0aGF0IGl0IGNhbgorICAgKiBiZSB1c2VkIG9uIGJvdGggcGxhdGZvcm1zLgorICAgKi8KKyAgI2lmbmRlZiBTT0NLRVQKKyAgICAjZGVmaW5lIFNPQ0tFVCBpbnQKKyAgI2VuZGlmCisKKyAgLyohCisgICAqIFxicmllZiBJbiBXaW5zb2NrLCB0aGUgZXJyb3IgcmV0dXJuIGlmIHNvY2tldCgpIGZhaWxzIGlzIElOVkFMSURfU09DS0VUOworICAgKiBpbiBVTipYLCBpdCdzIC0xLgorICAgKiBXZSBkZWZpbmUgSU5WQUxJRF9TT0NLRVQgdG8gYmUgLTEgb24gVU4qWCwgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBvbgorICAgKiBib3RoIHBsYXRmb3Jtcy4KKyAgICovCisgICNpZm5kZWYgSU5WQUxJRF9TT0NLRVQKKyAgICAjZGVmaW5lIElOVkFMSURfU09DS0VUIC0xCisgICNlbmRpZgorI2VuZGlmCisKKy8qCisgKiBNaW5nVyBoZWFkZXJzIGluY2x1ZGUgdGhpcyBkZWZpbml0aW9uLCBidXQgb25seSBmb3IgV2luZG93cyBYUCBhbmQgYWJvdmUuCisgKiBNU0ROIHN0YXRlcyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGZvciBtb3N0IHZlcnNpb25zIG9uIFdpbmRvd3MuCisgKi8KKyNpZiAoKGRlZmluZWQoX19NSU5HVzMyX18pKSAmJiAoX1dJTjMyX1dJTk5UIDwgMHgwNTAxKSkKK2ludCBXU0FBUEkgZ2V0bmFtZWluZm8oY29uc3Qgc3RydWN0IHNvY2thZGRyKixzb2NrbGVuX3QsY2hhciosRFdPUkQsCisJY2hhciosRFdPUkQsaW50KTsKKyNlbmRpZgorCisvKgorICogXGRlZmdyb3VwIFNvY2tVdGlscyBDcm9zcy1wbGF0Zm9ybSBzb2NrZXQgdXRpbGl0aWVzIChJUHY0LUlQdjYpCisgKi8KKworLyoKKyAqIFxhZGR0b2dyb3VwIFNvY2tVdGlscworICogXHsKKyAqLworCisvKgorICogXGRlZmdyb3VwIEV4cG9ydGVkU3RydWN0IEV4cG9ydGVkIFN0cnVjdHVyZXMgYW5kIERlZmluaXRpb25zCisgKi8KKworLyoKKyAqIFxhZGR0b2dyb3VwIEV4cG9ydGVkU3RydWN0CisgKiBceworICovCisKKy8qCisgKiBTb21lIG1pbm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gVU4qWCBzb2NrZXRzIGFuZCBhbmQgV2luc29jayBzb2NrZXRzLgorICovCisjaWZkZWYgX1dJTjMyCisgIC8qCisgICAqIFdpbnNvY2sgZG9lc24ndCBoYXZlIHRoZXNlIFVOKlggdHlwZXM7IHRoZXkncmUgdXNlZCBpbiB0aGUgVU4qWAorICAgKiBzb2NrZXRzIEFQSS4KKyAgICoKKyAgICogWFhYIC0gZG8gd2UgbmVlZCB0byB3b3JyeSBhYm91dCBVTipYZXMgc28gb2xkIHRoYXQgKnRoZXkqIGRvbid0CisgICAqIGhhdmUgdGhlbSwgZWl0aGVyPworICAgKi8KKyAgdHlwZWRlZiBpbnQgc29ja2xlbl90OworI2Vsc2UKKyAgLyohCisgICAqIFxicmllZiBJbiBXaW5zb2NrLCB0aGUgY2xvc2UoKSBjYWxsIGNhbm5vdCBiZSB1c2VkIG9uIGEgc29ja2V0OworICAgKiBjbG9zZXNvY2tldCgpIG11c3QgYmUgdXNlZC4KKyAgICogV2UgZGVmaW5lIGNsb3Nlc29ja2V0KCkgdG8gYmUgYSB3cmFwcGVyIGFyb3VuZCBjbG9zZSgpIG9uIFVOKlgsCisgICAqIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgb24gYm90aCBwbGF0Zm9ybXMuCisgICAqLworICAjZGVmaW5lIGNsb3Nlc29ja2V0KGEpIGNsb3NlKGEpCisjZW5kaWYKKworLyoKKyAqIFxicmllZiBERUJVRyBmYWNpbGl0eTogaXQgcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2Ugb24gdGhlIHNjcmVlbiAoc3RkZXJyKQorICoKKyAqIFRoaXMgbWFjcm8gcHJpbnRzIHRoZSBlcnJvciBvbiB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtIChzdGRlcnIpOworICogaWYgd2UgYXJlIHdvcmtpbmcgaW4gZGVidWcgbW9kZSAoaS5lLiB0aGVyZSBpcyBubyBOREVCVUcgZGVmaW5lZCkgYW5kIHdlIGFyZSBpbgorICogTWljcm9zb2Z0IFZpc3VhbCBDKyssIHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYXBwZWFyIG9uIHRoZSBNU1ZDIGNvbnNvbGUgYXMgd2VsbC4KKyAqCisgKiBXaGVuIE5ERUJVRyBpcyBkZWZpbmVkLCB0aGlzIG1hY3JvIGlzIGVtcHR5LgorICoKKyAqIFxwYXJhbSBtc2c6IHRoZSBtZXNzYWdlIHlvdSB3YW50IHRvIHByaW50LgorICoKKyAqIFxwYXJhbSBleHByOiAnZmFsc2UnIGlmIHlvdSB3YW50IHRvIGFib3J0IHRoZSBwcm9ncmFtLCAndHJ1ZScgaXQgeW91IHdhbnQKKyAqIHRvIHByaW50IHRoZSBtZXNzYWdlIGFuZCBjb250aW51ZS4KKyAqCisgKiBccmV0dXJuIE5vIHJldHVybiB2YWx1ZXMuCisgKi8KKyNpZmRlZiBOREVCVUcKKyAgI2RlZmluZSBTT0NLX0FTU0VSVChtc2csIGV4cHIpICgodm9pZCkwKQorI2Vsc2UKKyAgI2luY2x1ZGUgPGFzc2VydC5oPgorICAjaWYgKGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSkKKyAgICAjaW5jbHVkZSA8Y3J0ZGJnLmg+CQkJCS8qIGZvciBfQ3J0RGJnUmVwb3J0ICovCisgICAgLyogVXNlIE1lc3NhZ2VCb3goTlVMTCwgbXNnLCAid2FybmluZyIsIE1CX09LKScgaW5zdGVhZCBvZiB0aGUgb3RoZXIgY2FsbHMgaWYgeW91IHdhbnQgdG8gZGVidWcgYSBXaW4zMiBzZXJ2aWNlICovCisgICAgLyogUmVtZW1iZXIgdG8gYWN0aXZhdGUgdGhlICdhbGxvdyBzZXJ2aWNlIHRvIGludGVyYWN0IHdpdGggZGVza3RvcCcgZmxhZyBvZiB0aGUgc2VydmljZSAqLworICAgICNkZWZpbmUgU09DS19BU1NFUlQobXNnLCBleHByKSB7IF9DcnREYmdSZXBvcnQoX0NSVF9XQVJOLCBOVUxMLCAwLCBOVUxMLCAiJXNcbiIsIG1zZyk7IGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyk7IGFzc2VydChleHByKTsgfQorICAjZWxzZQorICAgICNkZWZpbmUgU09DS19BU1NFUlQobXNnLCBleHByKSB7IGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyk7IGFzc2VydChleHByKTsgfQorICAjZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4cG9ydGVkIGZ1bmN0aW9ucyAvIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICdjaGVja29ubHknIGZsYWcsIGludG8gdGhlIHJwc29ja19idWZmZXJpemUoKSAqLworI2RlZmluZSBTT0NLQlVGX0NIRUNLT05MWSAxCisvKiBubyAnY2hlY2tvbmx5JyBmbGFnLCBpbnRvIHRoZSBycHNvY2tfYnVmZmVyaXplKCkgKi8KKyNkZWZpbmUgU09DS0JVRl9CVUZGRVJJWkUgMAorCisvKiBubyAnc2VydmVyJyBmbGFnOyBpdCBvcGVucyBhIGNsaWVudCBzb2NrZXQgKi8KKyNkZWZpbmUgU09DS09QRU5fQ0xJRU5UIDAKKy8qICdzZXJ2ZXInIGZsYWc7IGl0IG9wZW5zIGEgc2VydmVyIHNvY2tldCAqLworI2RlZmluZSBTT0NLT1BFTl9TRVJWRVIgMQorCisvKiBDaGFuZ2VzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIHNvY2tfcmVjdigpOyBpdCBkb2VzIG5vdCB3YWl0IHRvIHJlY2VpdmUgYWxsIGRhdGEgKi8KKyNkZWZpbmUgU09DS19SRUNFSVZFQUxMX05PIDAKKy8qIENoYW5nZXMgdGhlIGJlaGF2aW91ciBvZiB0aGUgc29ja19yZWN2KCk7IGl0IHdhaXRzIHRvIHJlY2VpdmUgYWxsIGRhdGEgKi8KKyNkZWZpbmUgU09DS19SRUNFSVZFQUxMX1lFUyAxCisKKy8qCisgKiBcfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAqIFxkZWZncm91cCBFeHBvcnRlZEZ1bmMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgKi8KKworLyoKKyAqIFxhZGR0b2dyb3VwIEV4cG9ydGVkRnVuYworICogXHsKKyAqLworCitpbnQgc29ja19pbml0KGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1Zmxlbik7Cit2b2lkIHNvY2tfY2xlYW51cCh2b2lkKTsKKy8qIEl0IGlzICdwdWJsaWMnIGJlY2F1c2UgdGhlcmUgYXJlIGNhbGxzIChsaWtlIGFjY2VwdCgpICkgd2hpY2ggYXJlIG5vdCBtYW5hZ2VkIGZyb20gaW5zaWRlIHRoZSBzb2NrdXRpbHMgZmlsZXMgKi8KK3ZvaWQgc29ja19nZXRlcnJvcihjb25zdCBjaGFyICpjYWxsZXIsIGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1ZnNpemUpOworaW50IHNvY2tfaW5pdGFkZHJlc3MoY29uc3QgY2hhciAqYWRkcmVzcywgY29uc3QgY2hhciAqcG9ydCwKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKmhpbnRzLCBzdHJ1Y3QgYWRkcmluZm8gKiphZGRyaW5mbywKKyAgICBjaGFyICplcnJidWYsIGludCBlcnJidWZsZW4pOworaW50IHNvY2tfcmVjdihTT0NLRVQgc29ja2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBpbnQgcmVjZWl2ZWFsbCwKKyAgICBjaGFyICplcnJidWYsIGludCBlcnJidWZsZW4pOworU09DS0VUIHNvY2tfb3BlbihzdHJ1Y3QgYWRkcmluZm8gKmFkZHJpbmZvLCBpbnQgc2VydmVyLCBpbnQgbmNvbm4sIGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1Zmxlbik7CitpbnQgc29ja19jbG9zZShTT0NLRVQgc29jaywgY2hhciAqZXJyYnVmLCBpbnQgZXJyYnVmbGVuKTsKKworaW50IHNvY2tfc2VuZChTT0NLRVQgc29ja2V0LCBjb25zdCBjaGFyICpidWZmZXIsIGludCBzaXplLCBjaGFyICplcnJidWYsIGludCBlcnJidWZsZW4pOworaW50IHNvY2tfYnVmZmVyaXplKGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IHNpemUsIGNoYXIgKnRlbXBidWYsIGludCAqb2Zmc2V0LCBpbnQgdG90c2l6ZSwgaW50IGNoZWNrb25seSwgY2hhciAqZXJyYnVmLCBpbnQgZXJyYnVmbGVuKTsKK2ludCBzb2NrX2Rpc2NhcmQoU09DS0VUIHNvY2tldCwgaW50IHNpemUsIGNoYXIgKmVycmJ1ZiwgaW50IGVycmJ1Zmxlbik7CitpbnQJc29ja19jaGVja19ob3N0bGlzdChjaGFyICpob3N0bGlzdCwgY29uc3QgY2hhciAqc2VwLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqZnJvbSwgY2hhciAqZXJyYnVmLCBpbnQgZXJyYnVmbGVuKTsKK2ludCBzb2NrX2NtcGFkZHIoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmZpcnN0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc2Vjb25kKTsKKworaW50IHNvY2tfZ2V0bXlpbmZvKFNPQ0tFVCBzb2NrLCBjaGFyICphZGRyZXNzLCBpbnQgYWRkcmxlbiwgY2hhciAqcG9ydCwgaW50IHBvcnRsZW4sIGludCBmbGFncywgY2hhciAqZXJyYnVmLCBpbnQgZXJyYnVmbGVuKTsKKworaW50IHNvY2tfZ2V0YXNjaWlfYWRkcnBvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNvY2thZGRyLCBjaGFyICphZGRyZXNzLCBpbnQgYWRkcmxlbiwgY2hhciAqcG9ydCwgaW50IHBvcnRsZW4sIGludCBmbGFncywgY2hhciAqZXJyYnVmLCBpbnQgZXJyYnVmbGVuKTsKK2ludCBzb2NrX3ByZXNlbnQybmV0d29yayhjb25zdCBjaGFyICphZGRyZXNzLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc29ja2FkZHIsIGludCBhZGRyX2ZhbWlseSwgY2hhciAqZXJyYnVmLCBpbnQgZXJyYnVmbGVuKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyoKKyAqIFx9CisgKi8KKworLyoKKyAqIFx9CisgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9DTWFrZUxpc3RzLnR4dCBiL3Rlc3RzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzkxOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDQyIEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKCBWRVJTSU9OIDIuOC44ICkKKworcHJvamVjdCggcGNhcF90ZXN0cyApCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJlZ2lzdGVyIHRhcmdldHMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmKCBNU1ZDICkKKyAgICBmaWxlKEdMT0IgUFJPSkVDVF9TT1VSQ0VfTElTVF9XSU4zMl9DCisgICAgICAgICR7cGNhcF9TT1VSQ0VfRElSfS9taXNzaW5nL2dldG9wdC5jCisgICAgKQorZW5kaWYoIE1TVkMgKQorCitBRERfRVhFQ1VUQUJMRSAoY2FuX3NldF9yZm1vbl90ZXN0IGNhbl9zZXRfcmZtb25fdGVzdC5jICR7UFJPSkVDVF9TT1VSQ0VfTElTVF9XSU4zMl9DfSApCit0YXJnZXRfbGlua19saWJyYXJpZXMgKCBjYW5fc2V0X3JmbW9uX3Rlc3QgcGNhcCApCisKK0FERF9FWEVDVVRBQkxFIChjYXB0dXJldGVzdCBjYXB0dXJldGVzdC5jICR7UFJPSkVDVF9TT1VSQ0VfTElTVF9XSU4zMl9DfSApCit0YXJnZXRfbGlua19saWJyYXJpZXMgKCBjYXB0dXJldGVzdCBwY2FwICkKKworQUREX0VYRUNVVEFCTEUgKGZpbHRlcnRlc3QgZmlsdGVydGVzdC5jICR7UFJPSkVDVF9TT1VSQ0VfTElTVF9XSU4zMl9DfSApCit0YXJnZXRfbGlua19saWJyYXJpZXMgKCBmaWx0ZXJ0ZXN0IHBjYXAgKQorCitBRERfRVhFQ1VUQUJMRSAoaW5kYWxsZGV2c3Rlc3QgZmluZGFsbGRldnN0ZXN0LmMgJHtQUk9KRUNUX1NPVVJDRV9MSVNUX1dJTjMyX0N9ICkKK3RhcmdldF9saW5rX2xpYnJhcmllcyAoIGluZGFsbGRldnN0ZXN0IHBjYXAgKQorCitBRERfRVhFQ1VUQUJMRSAob3BlbnRlc3Qgb3BlbnRlc3QuYyAke1BST0pFQ1RfU09VUkNFX0xJU1RfV0lOMzJfQ30gKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzICggb3BlbnRlc3QgcGNhcCApCisKKyNBRERfRVhFQ1VUQUJMRSAocGNhcF9jb21waWxlX3Rlc3QgcGNhcF9jb21waWxlX3Rlc3QuYyAke1BST0pFQ1RfU09VUkNFX0xJU1RfV0lOMzJfQ30gKQorI3RhcmdldF9saW5rX2xpYnJhcmllcyAoIHBjYXBfY29tcGlsZV90ZXN0IHBjYXAgKQorCitBRERfRVhFQ1VUQUJMRSAocmVhY3RpdmF0ZXRlc3QgcmVhY3RpdmF0ZXRlc3QuYyAke1BST0pFQ1RfU09VUkNFX0xJU1RfV0lOMzJfQ30gKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzICggcmVhY3RpdmF0ZXRlc3QgcGNhcCApCisKK2lmKCBOT1QgV0lOMzIgKQorICAgIEFERF9FWEVDVVRBQkxFIChzZWxwb2xsdGVzdCBzZWxwb2xsdGVzdC5jICR7UFJPSkVDVF9TT1VSQ0VfTElTVF9XSU4zMl9DfSApCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzICggc2VscG9sbHRlc3QgcGNhcCApCitlbmRpZigpCisKK0FERF9FWEVDVVRBQkxFICh2YWxncmluZHRlc3QgdmFsZ3JpbmR0ZXN0LmMgJHtQUk9KRUNUX1NPVVJDRV9MSVNUX1dJTjMyX0N9ICkKK3RhcmdldF9saW5rX2xpYnJhcmllcyAoIHZhbGdyaW5kdGVzdCBwY2FwICkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Nhbl9zZXRfcmZtb25fdGVzdC5jIGIvdGVzdHMvY2FuX3NldF9yZm1vbl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2NDRlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Nhbl9zZXRfcmZtb25fdGVzdC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdIF9VXyA9CisgICAgIkAoIykgQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwXG5cCitUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiI7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlIDxwY2FwLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICpwcm9ncmFtX25hbWU7CisKKy8qIEZvcndhcmRzICovCitzdGF0aWMgdm9pZCBlcnJvcihjb25zdCBjaGFyICosIC4uLik7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqY3A7CisJcGNhcF90ICpwZDsKKwljaGFyIGVidWZbUENBUF9FUlJCVUZfU0laRV07CisJaW50IHN0YXR1czsKKworCWlmICgoY3AgPSBzdHJyY2hyKGFyZ3ZbMF0sICcvJykpICE9IE5VTEwpCisJCXByb2dyYW1fbmFtZSA9IGNwICsgMTsKKwllbHNlCisJCXByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxkZXZpY2U+XG4iLCBwcm9ncmFtX25hbWUpOworCQlyZXR1cm4gMjsKKwl9CisKKwlwZCA9IHBjYXBfY3JlYXRlKGFyZ3ZbMV0sIGVidWYpOworCWlmIChwZCA9PSBOVUxMKQorCQllcnJvcigiJXMiLCBlYnVmKTsKKwlzdGF0dXMgPSBwY2FwX2Nhbl9zZXRfcmZtb24ocGQpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWlmIChzdGF0dXMgPT0gUENBUF9FUlJPUikKKwkJCWVycm9yKCIlczogcGNhcF9jYW5fc2V0X3JmbW9uIGZhaWxlZDogJXMiLCBhcmd2WzFdLAorCQkJICAgIHBjYXBfZ2V0ZXJyKHBkKSk7CisJCWVsc2UKKwkJCWVycm9yKCIlczogcGNhcF9jYW5fc2V0X3JmbW9uIGZhaWxlZDogJXMiLCBhcmd2WzFdLAorCQkJICAgIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSk7CisJCXJldHVybiAxOworCX0KKwlwcmludGYoIiVzOiBNb25pdG9yIG1vZGUgJXMgYmUgc2V0XG4iLCBhcmd2WzFdLCBzdGF0dXMgPyAiY2FuIiA6ICJjYW5ub3QiKTsKKwlyZXR1cm4gMDsKK30KKworLyogVkFSQVJHUyAqLworc3RhdGljIHZvaWQKK2Vycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAoKmZtdCkgeworCQlmbXQgKz0gc3RybGVuKGZtdCk7CisJCWlmIChmbXRbLTFdICE9ICdcbicpCisJCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KKwlleGl0KDEpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NhcHR1cmV0ZXN0LmMgYi90ZXN0cy9jYXB0dXJldGVzdC5jCmluZGV4IGU3MGU2OWEuLjE0YjE1NTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhcHR1cmV0ZXN0LmMKKysrIGIvdGVzdHMvY2FwdHVyZXRlc3QuYwpAQCAtMjAsNyArMjAsNyBAQAogICovCiAKICNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gPQorc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gX1VfID0KICAgICAiQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDBcblwKIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIjsKICNlbmRpZgpAQCAtMzAsMjkgKzMwLDc2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisjZWxzZQogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jaW5jbHVkZSA8cG9sbC5oPgogCiAjaW5jbHVkZSA8cGNhcC5oPgogCiBzdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOwogCisvKgorICogVGhpcyB3YXMgaW50cm9kdWNlZCBieSBDbGFuZzoKKyAqCisgKiAgICAgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RvY3MvTGFuZ3VhZ2VFeHRlbnNpb25zLmh0bWwjaGFzLWF0dHJpYnV0ZQorICoKKyAqIGluIHNvbWUgdmVyc2lvbiAod2hpY2ggdmVyc2lvbj8pOyBpdCBoYXMgYmVlbiBwaWNrZWQgdXAgYnkgR0NDIDUuMC4KKyAqLworI2lmbmRlZiBfX2hhc19hdHRyaWJ1dGUKKyAgLyoKKyAgICogSXQncyBhIG1hY3JvLCBzbyB5b3UgY2FuIGNoZWNrIHdoZXRoZXIgaXQncyBkZWZpbmVkIHRvIGNoZWNrCisgICAqIHdoZXRoZXIgaXQncyBzdXBwb3J0ZWQuCisgICAqCisgICAqIElmIGl0J3Mgbm90LCBkZWZpbmUgaXQgdG8gYWx3YXlzIHJldHVybiAwLCBzbyB0aGF0IHdlIG1vdmUgb24gdG8KKyAgICogdGhlIGZhbGxiYWNrIGNoZWNrcy4KKyAgICovCisgICNkZWZpbmUgX19oYXNfYXR0cmlidXRlKHgpIDAKKyNlbmRpZgorCisjaWYgX19oYXNfYXR0cmlidXRlKG5vcmV0dXJuKSBcCisgICAgfHwgKGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMjA1KSkgXAorICAgIHx8IChkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKSkgXAorICAgIHx8IChkZWZpbmVkKF9feGxDX18pICYmIF9feGxDX18gPj0gMHgwQTAxKSBcCisgICAgfHwgKGRlZmluZWQoX19IUF9hQ0MpICYmIF9fSFBfYUNDID49IDYxMDAwKQorICAvKgorICAgKiBDb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIGl0LCBvciBHQ0MgMi41IGFuZCBsYXRlciwgb3IgU29sYXJpcyBTdHVkaW8gMTIKKyAgICogKFN1biBDIDUuOSkgYW5kIGxhdGVyLCBvciBJQk0gWEwgQyAxMC4xIGFuZCBsYXRlciAoZG8gYW55IGVhcmxpZXIKKyAgICogdmVyc2lvbnMgb2YgWEwgQyBzdXBwb3J0IHRoaXM/KSwgb3IgSFAgYUNDIEEuMDYuMTAgYW5kIGxhdGVyLgorICAgKi8KKyAgI2RlZmluZSBQQ0FQX05PUkVUVVJOIF9fYXR0cmlidXRlKChub3JldHVybikpCisjZWxpZiBkZWZpbmVkKCBfTVNDX1ZFUiApCisgICNkZWZpbmUgUENBUF9OT1JFVFVSTiBfX2RlY2xzcGVjKG5vcmV0dXJuKQorI2Vsc2UKKyAgI2RlZmluZSBQQ0FQX05PUkVUVVJOCisjZW5kaWYKKworI2lmIF9faGFzX2F0dHJpYnV0ZShfX2Zvcm1hdF9fKSBcCisgICAgfHwgKGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMjAzKSkgXAorICAgIHx8IChkZWZpbmVkKF9feGxDX18pICYmIF9feGxDX18gPj0gMHgwQTAxKSBcCisgICAgfHwgKGRlZmluZWQoX19IUF9hQ0MpICYmIF9fSFBfYUNDID49IDYxMDAwKQorICAvKgorICAgKiBDb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIGl0LCBvciBHQ0MgMi4zIGFuZCBsYXRlciwgb3IgSUJNIFhMIEMgMTAuMQorICAgKiBhbmQgbGF0ZXIgKGRvIGFueSBlYXJsaWVyIHZlcnNpb25zIG9mIFhMIEMgc3VwcG9ydCB0aGlzPyksCisgICAqIG9yIEhQIGFDQyBBLjA2LjEwIGFuZCBsYXRlci4KKyAgICovCisgICNkZWZpbmUgUENBUF9QUklOVEZMSUtFKHgseSkgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLHgseSkpKQorI2Vsc2UKKyAgI2RlZmluZSBQQ0FQX1BSSU5URkxJS0UoeCx5KQorI2VuZGlmCisKIC8qIEZvcndhcmRzICovCiBzdGF0aWMgdm9pZCBjb3VudG1lKHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKLXN0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKTsKLXN0YXRpYyB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqLCAuLi4pOworc3RhdGljIHZvaWQgUENBUF9OT1JFVFVSTiB1c2FnZSh2b2lkKTsKK3N0YXRpYyB2b2lkIFBDQVBfTk9SRVRVUk4gZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pIFBDQVBfUFJJTlRGTElLRSgxLCAyKTsKK3N0YXRpYyB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqLCAuLi4pIFBDQVBfUFJJTlRGTElLRSgxLCAyKTsKIHN0YXRpYyBjaGFyICpjb3B5X2FyZ3YoY2hhciAqKik7CiAKIHN0YXRpYyBwY2FwX3QgKnBkOwogCi1leHRlcm4gaW50IG9wdGluZDsKLWV4dGVybiBpbnQgb3B0ZXJyOwotZXh0ZXJuIGNoYXIgKm9wdGFyZzsKLQogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbHRlcnRlc3QuYyBiL3Rlc3RzL2ZpbHRlcnRlc3QuYwppbmRleCBlNDVkYjIxLi5kNDQ0MGViIDEwMDY0NAotLS0gYS90ZXN0cy9maWx0ZXJ0ZXN0LmMKKysrIGIvdGVzdHMvZmlsdGVydGVzdC5jCkBAIC0zNCwyOSArMzQsNzggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlICJnZXRvcHQuaCIKKyNlbHNlCiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaWZkZWYgX1dJTjMyCisgICNpbmNsdWRlIDx3aW5zb2NrMi5oPgorICB0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgaW5fYWRkcl90OworI2Vsc2UKKyAgI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAotI2lmbmRlZiBIQVZFX19fQVRUUklCVVRFX18KLSNkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQorLyoKKyAqIFRoaXMgd2FzIGludHJvZHVjZWQgYnkgQ2xhbmc6CisgKgorICogICAgIGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0xhbmd1YWdlRXh0ZW5zaW9ucy5odG1sI2hhcy1hdHRyaWJ1dGUKKyAqCisgKiBpbiBzb21lIHZlcnNpb24gKHdoaWNoIHZlcnNpb24/KTsgaXQgaGFzIGJlZW4gcGlja2VkIHVwIGJ5IEdDQyA1LjAuCisgKi8KKyNpZm5kZWYgX19oYXNfYXR0cmlidXRlCisgIC8qCisgICAqIEl0J3MgYSBtYWNybywgc28geW91IGNhbiBjaGVjayB3aGV0aGVyIGl0J3MgZGVmaW5lZCB0byBjaGVjaworICAgKiB3aGV0aGVyIGl0J3Mgc3VwcG9ydGVkLgorICAgKgorICAgKiBJZiBpdCdzIG5vdCwgZGVmaW5lIGl0IHRvIGFsd2F5cyByZXR1cm4gMCwgc28gdGhhdCB3ZSBtb3ZlIG9uIHRvCisgICAqIHRoZSBmYWxsYmFjayBjaGVja3MuCisgICAqLworICAjZGVmaW5lIF9faGFzX2F0dHJpYnV0ZSh4KSAwCisjZW5kaWYKKworI2lmIF9faGFzX2F0dHJpYnV0ZShub3JldHVybikgXAorICAgIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18pID49IDIwNSkpIFwKKyAgICB8fCAoZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkpIFwKKyAgICB8fCAoZGVmaW5lZChfX3hsQ19fKSAmJiBfX3hsQ19fID49IDB4MEEwMSkgXAorICAgIHx8IChkZWZpbmVkKF9fSFBfYUNDKSAmJiBfX0hQX2FDQyA+PSA2MTAwMCkKKyAgLyoKKyAgICogQ29tcGlsZXIgd2l0aCBzdXBwb3J0IGZvciBpdCwgb3IgR0NDIDIuNSBhbmQgbGF0ZXIsIG9yIFNvbGFyaXMgU3R1ZGlvIDEyCisgICAqIChTdW4gQyA1LjkpIGFuZCBsYXRlciwgb3IgSUJNIFhMIEMgMTAuMSBhbmQgbGF0ZXIgKGRvIGFueSBlYXJsaWVyCisgICAqIHZlcnNpb25zIG9mIFhMIEMgc3VwcG9ydCB0aGlzPyksIG9yIEhQIGFDQyBBLjA2LjEwIGFuZCBsYXRlci4KKyAgICovCisgICNkZWZpbmUgUENBUF9OT1JFVFVSTiBfX2F0dHJpYnV0ZSgobm9yZXR1cm4pKQorI2VsaWYgZGVmaW5lZCggX01TQ19WRVIgKQorICAjZGVmaW5lIFBDQVBfTk9SRVRVUk4gX19kZWNsc3BlYyhub3JldHVybikKKyNlbHNlCisgICNkZWZpbmUgUENBUF9OT1JFVFVSTgorI2VuZGlmCisKKyNpZiBfX2hhc19hdHRyaWJ1dGUoX19mb3JtYXRfXykgXAorICAgIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18pID49IDIwMykpIFwKKyAgICB8fCAoZGVmaW5lZChfX3hsQ19fKSAmJiBfX3hsQ19fID49IDB4MEEwMSkgXAorICAgIHx8IChkZWZpbmVkKF9fSFBfYUNDKSAmJiBfX0hQX2FDQyA+PSA2MTAwMCkKKyAgLyoKKyAgICogQ29tcGlsZXIgd2l0aCBzdXBwb3J0IGZvciBpdCwgb3IgR0NDIDIuMyBhbmQgbGF0ZXIsIG9yIElCTSBYTCBDIDEwLjEKKyAgICogYW5kIGxhdGVyIChkbyBhbnkgZWFybGllciB2ZXJzaW9ucyBvZiBYTCBDIHN1cHBvcnQgdGhpcz8pLAorICAgKiBvciBIUCBhQ0MgQS4wNi4xMCBhbmQgbGF0ZXIuCisgICAqLworICAjZGVmaW5lIFBDQVBfUFJJTlRGTElLRSh4LHkpIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXyx4LHkpKSkKKyNlbHNlCisgICNkZWZpbmUgUENBUF9QUklOVEZMSUtFKHgseSkKICNlbmRpZgogCiBzdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOwogCiAvKiBGb3J3YXJkcyAqLwotc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKLXN0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuLCBmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKLXN0YXRpYyB2b2lkIHdhcm4oY29uc3QgY2hhciAqLCAuLi4pCi0gICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CitzdGF0aWMgdm9pZCBQQ0FQX05PUkVUVVJOIHVzYWdlKHZvaWQpOworc3RhdGljIHZvaWQgUENBUF9OT1JFVFVSTiBlcnJvcihjb25zdCBjaGFyICosIC4uLikgUENBUF9QUklOVEZMSUtFKDEsIDIpOworc3RhdGljIHZvaWQgd2Fybihjb25zdCBjaGFyICosIC4uLikgUENBUF9QUklOVEZMSUtFKDEsIDIpOwogCi1leHRlcm4gaW50IG9wdGluZDsKLWV4dGVybiBpbnQgb3B0ZXJyOwotZXh0ZXJuIGNoYXIgKm9wdGFyZzsKICNpZmRlZiBCREVCVUcKIGludCBkZmxhZzsKICNlbmRpZgpAQCAtMTk0LDE2ICsyNDMsMTYgQEAKIAlwY2FwX3QgKnBkOwogCXN0cnVjdCBicGZfcHJvZ3JhbSBmY29kZTsKIAotI2lmZGVmIFdJTjMyCisjaWZkZWYgX1dJTjMyCiAJaWYod3NvY2tpbml0KCkgIT0gMCkgcmV0dXJuIDE7Ci0jZW5kaWYgLyogV0lOMzIgKi8KKyNlbmRpZiAvKiBfV0lOMzIgKi8KIAogI2lmbmRlZiBCREVCVUcKIAlkZmxhZyA9IDE7CiAjZWxzZQogCS8qIGlmIG9wdGltaXplciBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCwgb3V0cHV0IERPVCBncmFwaAogCSAqIGBkZmxhZz00JyBpcyBlcXVpdmFsZW50IHRvIC1kZGRkIHRvIGZvbGxvdyAtZC8tZGQvLWRkZAotICAgICAqIGNvbnZlbnRpb24gaW4gdGNwZHVtcCBjb21tYW5kIGxpbmUKKwkgKiBjb252ZW50aW9uIGluIHRjcGR1bXAgY29tbWFuZCBsaW5lCiAJICovCiAJZGZsYWcgPSA0OwogI2VuZGlmCkBAIC0yMzYsNyArMjg1LDcgQEAKIAkJCWluX2FkZHJfdCBhZGRyOwogCiAJCQlhZGRyID0gaW5ldF9hZGRyKG9wdGFyZyk7Ci0JCQlpZiAoYWRkciA9PSBJTkFERFJfTk9ORSkKKwkJCWlmIChhZGRyID09IChpbl9hZGRyX3QpKC0xKSkKIAkJCQllcnJvcigiaW52YWxpZCBuZXRtYXNrICVzIiwgb3B0YXJnKTsKIAkJCW5ldG1hc2sgPSBhZGRyOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS90ZXN0cy9maW5kYWxsZGV2c3Rlc3QuYyBiL3Rlc3RzL2ZpbmRhbGxkZXZzdGVzdC5jCmluZGV4IDZkNDUyZjguLjU5MjViZjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZpbmRhbGxkZXZzdGVzdC5jCisrKyBiL3Rlc3RzL2ZpbmRhbGxkZXZzdGVzdC5jCkBAIC00LDEwICs0LDE0IEBACiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+CisjaWZkZWYgX1dJTjMyCisgICNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2Vsc2UKKyAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyAgI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyAgI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorICAjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8cGNhcC5oPgogCkBAIC02MywxMiArNjcsMjcgQEAKICNpZmRlZiBJTkVUNgogICBjaGFyIG50b3BfYnVmW0lORVQ2X0FERFJTVFJMRU5dOwogI2VuZGlmCisgIGNvbnN0IGNoYXIgKnNlcDsKICAgaW50IHN0YXR1cyA9IDE7IC8qIHN1Y2Nlc3MgKi8KIAogICBwcmludGYoIiVzXG4iLGQtPm5hbWUpOwogICBpZiAoZC0+ZGVzY3JpcHRpb24pCiAgICAgcHJpbnRmKCJcdERlc2NyaXB0aW9uOiAlc1xuIixkLT5kZXNjcmlwdGlvbik7Ci0gIHByaW50ZigiXHRMb29wYmFjazogJXNcbiIsKGQtPmZsYWdzICYgUENBUF9JRl9MT09QQkFDSyk/InllcyI6Im5vIik7CisgIHByaW50ZigiXHRGbGFnczogIik7CisgIHNlcCA9ICIiOworICBpZiAoZC0+ZmxhZ3MgJiBQQ0FQX0lGX1VQKSB7CisgICAgcHJpbnRmKCIlc1VQIiwgc2VwKTsKKyAgICBzZXAgPSAiLCAiOworICB9CisgIGlmIChkLT5mbGFncyAmIFBDQVBfSUZfUlVOTklORykgeworICAgIHByaW50ZigiJXNSVU5OSU5HIiwgc2VwKTsKKyAgICBzZXAgPSAiLCAiOworICB9CisgIGlmIChkLT5mbGFncyAmIFBDQVBfSUZfTE9PUEJBQ0spIHsKKyAgICBwcmludGYoIiVzTE9PUEJBQ0siLCBzZXApOworICAgIHNlcCA9ICIsICI7CisgIH0KKyAgcHJpbnRmKCJcbiIpOwogCiAgIGZvcihhPWQtPmFkZHJlc3NlczthO2E9YS0+bmV4dCkgewogICAgIGlmIChhLT5hZGRyICE9IE5VTEwpCmRpZmYgLS1naXQgYS90ZXN0cy9vcGVudGVzdC5jIGIvdGVzdHMvb3BlbnRlc3QuYwppbmRleCAwYzkxNTMxLi5iNmQ2MzRmIDEwMDY0NAotLS0gYS90ZXN0cy9vcGVudGVzdC5jCisrKyBiL3Rlc3RzL29wZW50ZXN0LmMKQEAgLTIwLDcgKzIwLDcgQEAKICAqLwogCiAjaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdID0KK3N0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdIF9VXyA9CiAgICAgIkAoIykgQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwXG5cCiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiI7CiAjZW5kaWYKQEAgLTMwLDIxICszMCw3MCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgImdldG9wdC5oIgorI2Vsc2UKICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGVycm5vLmg+CiAKICNkZWZpbmUgTUFYSU1VTV9TTkFQTEVOCQk2NTUzNQogCiBzdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOwogCi0vKiBGb3J3YXJkcyAqLwotc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKLXN0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKTsKLXN0YXRpYyB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqLCAuLi4pOworLyoKKyAqIFRoaXMgd2FzIGludHJvZHVjZWQgYnkgQ2xhbmc6CisgKgorICogICAgIGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0xhbmd1YWdlRXh0ZW5zaW9ucy5odG1sI2hhcy1hdHRyaWJ1dGUKKyAqCisgKiBpbiBzb21lIHZlcnNpb24gKHdoaWNoIHZlcnNpb24/KTsgaXQgaGFzIGJlZW4gcGlja2VkIHVwIGJ5IEdDQyA1LjAuCisgKi8KKyNpZm5kZWYgX19oYXNfYXR0cmlidXRlCisgIC8qCisgICAqIEl0J3MgYSBtYWNybywgc28geW91IGNhbiBjaGVjayB3aGV0aGVyIGl0J3MgZGVmaW5lZCB0byBjaGVjaworICAgKiB3aGV0aGVyIGl0J3Mgc3VwcG9ydGVkLgorICAgKgorICAgKiBJZiBpdCdzIG5vdCwgZGVmaW5lIGl0IHRvIGFsd2F5cyByZXR1cm4gMCwgc28gdGhhdCB3ZSBtb3ZlIG9uIHRvCisgICAqIHRoZSBmYWxsYmFjayBjaGVja3MuCisgICAqLworICAjZGVmaW5lIF9faGFzX2F0dHJpYnV0ZSh4KSAwCisjZW5kaWYKIAotZXh0ZXJuIGludCBvcHRpbmQ7Ci1leHRlcm4gaW50IG9wdGVycjsKLWV4dGVybiBjaGFyICpvcHRhcmc7CisjaWYgX19oYXNfYXR0cmlidXRlKG5vcmV0dXJuKSBcCisgICAgfHwgKGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMjA1KSkgXAorICAgIHx8IChkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKSkgXAorICAgIHx8IChkZWZpbmVkKF9feGxDX18pICYmIF9feGxDX18gPj0gMHgwQTAxKSBcCisgICAgfHwgKGRlZmluZWQoX19IUF9hQ0MpICYmIF9fSFBfYUNDID49IDYxMDAwKQorICAvKgorICAgKiBDb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIGl0LCBvciBHQ0MgMi41IGFuZCBsYXRlciwgb3IgU29sYXJpcyBTdHVkaW8gMTIKKyAgICogKFN1biBDIDUuOSkgYW5kIGxhdGVyLCBvciBJQk0gWEwgQyAxMC4xIGFuZCBsYXRlciAoZG8gYW55IGVhcmxpZXIKKyAgICogdmVyc2lvbnMgb2YgWEwgQyBzdXBwb3J0IHRoaXM/KSwgb3IgSFAgYUNDIEEuMDYuMTAgYW5kIGxhdGVyLgorICAgKi8KKyAgI2RlZmluZSBQQ0FQX05PUkVUVVJOIF9fYXR0cmlidXRlKChub3JldHVybikpCisjZWxpZiBkZWZpbmVkKCBfTVNDX1ZFUiApCisgICNkZWZpbmUgUENBUF9OT1JFVFVSTiBfX2RlY2xzcGVjKG5vcmV0dXJuKQorI2Vsc2UKKyAgI2RlZmluZSBQQ0FQX05PUkVUVVJOCisjZW5kaWYKKworI2lmIF9faGFzX2F0dHJpYnV0ZShfX2Zvcm1hdF9fKSBcCisgICAgfHwgKGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMjAzKSkgXAorICAgIHx8IChkZWZpbmVkKF9feGxDX18pICYmIF9feGxDX18gPj0gMHgwQTAxKSBcCisgICAgfHwgKGRlZmluZWQoX19IUF9hQ0MpICYmIF9fSFBfYUNDID49IDYxMDAwKQorICAvKgorICAgKiBDb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIGl0LCBvciBHQ0MgMi4zIGFuZCBsYXRlciwgb3IgSUJNIFhMIEMgMTAuMQorICAgKiBhbmQgbGF0ZXIgKGRvIGFueSBlYXJsaWVyIHZlcnNpb25zIG9mIFhMIEMgc3VwcG9ydCB0aGlzPyksCisgICAqIG9yIEhQIGFDQyBBLjA2LjEwIGFuZCBsYXRlci4KKyAgICovCisgICNkZWZpbmUgUENBUF9QUklOVEZMSUtFKHgseSkgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLHgseSkpKQorI2Vsc2UKKyAgI2RlZmluZSBQQ0FQX1BSSU5URkxJS0UoeCx5KQorI2VuZGlmCisKKy8qIEZvcndhcmRzICovCitzdGF0aWMgdm9pZCBQQ0FQX05PUkVUVVJOIHVzYWdlKHZvaWQpOworc3RhdGljIHZvaWQgUENBUF9OT1JFVFVSTiBlcnJvcihjb25zdCBjaGFyICosIC4uLikgUENBUF9QUklOVEZMSUtFKDEsIDIpOworc3RhdGljIHZvaWQgd2FybmluZyhjb25zdCBjaGFyICosIC4uLikgUENBUF9QUklOVEZMSUtFKDEsIDIpOwogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQpAQCAtMTEzLDEwICsxNjIsMTUgQEAKIAkJfQogCX0KIAorCWlmIChkZXZpY2UgPT0gTlVMTCkgeworCQlkZXZpY2UgPSBwY2FwX2xvb2t1cGRldihlYnVmKTsKKwkJaWYgKGRldmljZSA9PSBOVUxMKQorCQkJZXJyb3IoInBjYXBfbG9va3VwZGV2IGZhaWxlZDogJXMiLCBlYnVmKTsKKwl9CiAJaWYgKHVzZWFjdGl2YXRlKSB7CiAJCXBkID0gcGNhcF9jcmVhdGUoZGV2aWNlLCBlYnVmKTsKIAkJaWYgKHBkID09IE5VTEwpCi0JCQllcnJvcigiJXMiLCBlYnVmKTsKKwkJCWVycm9yKCIlczogcGNhcF9jcmVhdGUgZmFpbGVkOiAlcyIsIGRldmljZSwgZWJ1Zik7CiAJCXN0YXR1cyA9IHBjYXBfc2V0X3NuYXBsZW4ocGQsIHNuYXBsZW4pOwogCQlpZiAoc3RhdHVzICE9IDApCiAJCQllcnJvcigiJXM6IHBjYXBfc2V0X3NuYXBsZW4gZmFpbGVkOiAlcyIsCkBAIC0xNTcsNyArMjExLDggQEAKIAkJCSAqLwogCQkJd2FybmluZygiJXM6ICVzXG4oJXMpIiwgZGV2aWNlLAogCQkJICAgIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSwgcGNhcF9nZXRlcnIocGQpKTsKLQkJfQorCQl9IGVsc2UKKwkJCXByaW50ZigiJXMgb3BlbmVkIHN1Y2Nlc3NmdWxseVxuIiwgZGV2aWNlKTsKIAl9IGVsc2UgewogCQkqZWJ1ZiA9ICdcMCc7CiAJCXBkID0gcGNhcF9vcGVuX2xpdmUoZGV2aWNlLCA2NTUzNSwgMCwgMTAwMCwgZWJ1Zik7CkBAIC0xNjUsNiArMjIwLDggQEAKIAkJCWVycm9yKCIlcyIsIGVidWYpOwogCQllbHNlIGlmICgqZWJ1ZikKIAkJCXdhcm5pbmcoIiVzIiwgZWJ1Zik7CisJCWVsc2UKKwkJCXByaW50ZigiJXMgb3BlbmVkIHN1Y2Nlc3NmdWxseVxuIiwgZGV2aWNlKTsKIAl9CiAJcGNhcF9jbG9zZShwZCk7CiAJZXhpdChzdGF0dXMgPCAwID8gMSA6IDApOwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVhY3RpdmF0ZXRlc3QuYyBiL3Rlc3RzL3JlYWN0aXZhdGV0ZXN0LmMKaW5kZXggOTAzMWE2NC4uMmUxYjdiNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVhY3RpdmF0ZXRlc3QuYworKysgYi90ZXN0cy9yZWFjdGl2YXRldGVzdC5jCkBAIC0yMCw3ICsyMCw3IEBACiAgKi8KIAogI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciBjb3B5cmlnaHRbXSA9CitzdGF0aWMgY29uc3QgY2hhciBjb3B5cmlnaHRbXSBfVV8gPQogICAgICJAKCMpIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMFxuXAogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iOwogI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9zZWxwb2xsdGVzdC5jIGIvdGVzdHMvc2VscG9sbHRlc3QuYwppbmRleCBkOTRmYjU2Li40YzE0MTViIDEwMDY0NAotLS0gYS90ZXN0cy9zZWxwb2xsdGVzdC5jCisrKyBiL3Rlc3RzL3NlbHBvbGx0ZXN0LmMKQEAgLTIwLDExICsyMCwxOSBAQAogICovCiAKICNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gPQorc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gX1VfID0KICAgICAiQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDBcblwKIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIjsKICNlbmRpZgogCisvKgorICogVGVzdHMgaG93IHNlbGVjdCgpIGFuZCBwb2xsKCkgYmVoYXZlIG9uIHRoZSBzZWxlY3RhYmxlIGZpbGUgZGVzY3JpcHRvcgorICogZm9yIGEgcGNhcF90LgorICoKKyAqIFRoaXMgd291bGQgYmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgb24gV2luZG93cywgYXMgaXQnZCB0ZXN0CisgKiBob3cgV2FpdEZvck11bHRpcGxlT2JqZWN0cygpIHdvdWxkIHdvcmsgb24gdGhlIGV2ZW50IGhhbmRsZSBmb3IgYQorICogcGNhcF90LgorICovCiAjaW5jbHVkZSA8cGNhcC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0zMywyNCArNDEsNzMgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICiAjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgkvKiBvbGRlciBVTipYZXMgKi8KKyNlbmRpZgogI2luY2x1ZGUgPHBvbGwuaD4KIAogY2hhciAqcHJvZ3JhbV9uYW1lOwogCisvKgorICogVGhpcyB3YXMgaW50cm9kdWNlZCBieSBDbGFuZzoKKyAqCisgKiAgICAgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RvY3MvTGFuZ3VhZ2VFeHRlbnNpb25zLmh0bWwjaGFzLWF0dHJpYnV0ZQorICoKKyAqIGluIHNvbWUgdmVyc2lvbiAod2hpY2ggdmVyc2lvbj8pOyBpdCBoYXMgYmVlbiBwaWNrZWQgdXAgYnkgR0NDIDUuMC4KKyAqLworI2lmbmRlZiBfX2hhc19hdHRyaWJ1dGUKKyAgLyoKKyAgICogSXQncyBhIG1hY3JvLCBzbyB5b3UgY2FuIGNoZWNrIHdoZXRoZXIgaXQncyBkZWZpbmVkIHRvIGNoZWNrCisgICAqIHdoZXRoZXIgaXQncyBzdXBwb3J0ZWQuCisgICAqCisgICAqIElmIGl0J3Mgbm90LCBkZWZpbmUgaXQgdG8gYWx3YXlzIHJldHVybiAwLCBzbyB0aGF0IHdlIG1vdmUgb24gdG8KKyAgICogdGhlIGZhbGxiYWNrIGNoZWNrcy4KKyAgICovCisgICNkZWZpbmUgX19oYXNfYXR0cmlidXRlKHgpIDAKKyNlbmRpZgorCisjaWYgX19oYXNfYXR0cmlidXRlKG5vcmV0dXJuKSBcCisgICAgfHwgKGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMjA1KSkgXAorICAgIHx8IChkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKSkgXAorICAgIHx8IChkZWZpbmVkKF9feGxDX18pICYmIF9feGxDX18gPj0gMHgwQTAxKSBcCisgICAgfHwgKGRlZmluZWQoX19IUF9hQ0MpICYmIF9fSFBfYUNDID49IDYxMDAwKQorICAvKgorICAgKiBDb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIGl0LCBvciBHQ0MgMi41IGFuZCBsYXRlciwgb3IgU29sYXJpcyBTdHVkaW8gMTIKKyAgICogKFN1biBDIDUuOSkgYW5kIGxhdGVyLCBvciBJQk0gWEwgQyAxMC4xIGFuZCBsYXRlciAoZG8gYW55IGVhcmxpZXIKKyAgICogdmVyc2lvbnMgb2YgWEwgQyBzdXBwb3J0IHRoaXM/KSwgb3IgSFAgYUNDIEEuMDYuMTAgYW5kIGxhdGVyLgorICAgKi8KKyAgI2RlZmluZSBQQ0FQX05PUkVUVVJOIF9fYXR0cmlidXRlKChub3JldHVybikpCisjZWxpZiBkZWZpbmVkKCBfTVNDX1ZFUiApCisgICNkZWZpbmUgUENBUF9OT1JFVFVSTiBfX2RlY2xzcGVjKG5vcmV0dXJuKQorI2Vsc2UKKyAgI2RlZmluZSBQQ0FQX05PUkVUVVJOCisjZW5kaWYKKworI2lmIF9faGFzX2F0dHJpYnV0ZShfX2Zvcm1hdF9fKSBcCisgICAgfHwgKGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMjAzKSkgXAorICAgIHx8IChkZWZpbmVkKF9feGxDX18pICYmIF9feGxDX18gPj0gMHgwQTAxKSBcCisgICAgfHwgKGRlZmluZWQoX19IUF9hQ0MpICYmIF9fSFBfYUNDID49IDYxMDAwKQorICAvKgorICAgKiBDb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIGl0LCBvciBHQ0MgMi4zIGFuZCBsYXRlciwgb3IgSUJNIFhMIEMgMTAuMQorICAgKiBhbmQgbGF0ZXIgKGRvIGFueSBlYXJsaWVyIHZlcnNpb25zIG9mIFhMIEMgc3VwcG9ydCB0aGlzPyksCisgICAqIG9yIEhQIGFDQyBBLjA2LjEwIGFuZCBsYXRlci4KKyAgICovCisgICNkZWZpbmUgUENBUF9QUklOVEZMSUtFKHgseSkgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLHgseSkpKQorI2Vsc2UKKyAgI2RlZmluZSBQQ0FQX1BSSU5URkxJS0UoeCx5KQorI2VuZGlmCisKIC8qIEZvcndhcmRzICovCiBzdGF0aWMgdm9pZCBjb3VudG1lKHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKLXN0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKTsKLXN0YXRpYyB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqLCAuLi4pOworc3RhdGljIHZvaWQgUENBUF9OT1JFVFVSTiB1c2FnZSh2b2lkKTsKK3N0YXRpYyB2b2lkIFBDQVBfTk9SRVRVUk4gZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pIFBDQVBfUFJJTlRGTElLRSgxLCAyKTsKK3N0YXRpYyB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqLCAuLi4pIFBDQVBfUFJJTlRGTElLRSgxLCAyKTsKIHN0YXRpYyBjaGFyICpjb3B5X2FyZ3YoY2hhciAqKik7CiAKIHN0YXRpYyBwY2FwX3QgKnBkOwogCi1leHRlcm4gaW50IG9wdGluZDsKLWV4dGVybiBpbnQgb3B0ZXJyOwotZXh0ZXJuIGNoYXIgKm9wdGFyZzsKLQogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL3ZhbGdyaW5kdGVzdC5jIGIvdGVzdHMvdmFsZ3JpbmR0ZXN0LmMKaW5kZXggNzI3ODZlNC4uMDExZmUxMSAxMDA2NDQKLS0tIGEvdGVzdHMvdmFsZ3JpbmR0ZXN0LmMKKysrIGIvdGVzdHMvdmFsZ3JpbmR0ZXN0LmMKQEAgLTE5LDYgKzE5LDMwIEBACiAgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICovCiAKKy8qCisgKiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgdGVzdCBsaWJwY2FwIGl0c2VsZjsgaXQgdGVzdHMgd2hldGhlcgorICogdmFsZ3JpbmQgcHJvcGVybHkgaGFuZGxlcyB0aGUgQVBJcyBsaWJwY2FwIHVzZXMuICBJZiBpdCBkb2Vzbid0LAorICogd2UgZW5kIHVwIGdldHRpbmcgcGF0Y2hlcyBzdWJtaXR0ZWQgdG8gImZpeCIgcmVmZXJlbmNlcyB0aGF0CisgKiB2YWxncmluZCBjbGFpbXMgYXJlIGJlaW5nIG1hZGUgdG8gdW5pbml0aWFsaXplZCBkYXRhLCB3aGVuLCBpbgorICogZmFjdCwgdGhlIE9TIGlzbid0IG1ha2luZyBhbnkgc3VjaCByZWZlcmVuY2VzIC0gb3Igd2UgZ2V0CisgKiB2YWxncmluZCAqbm90KiBkZXRlY3RpbmcgKmFjdHVhbCogaW5jb3JyZWN0IHJlZmVyZW5jZXMuCisgKgorICogQm90aCBCUEYgYW5kIExpbnV4IHNvY2tldCBmaWx0ZXJzIGFyZW4ndCBoYW5kbGVkIGNvcnJlY3RseQorICogYnkgc29tZSB2ZXJzaW9ucyBvZiB2YWxncmluZC4gIFNlZSB2YWxncmluZCBidWcgMzE4MjAzIGZvcgorICogTGludXg6CisgKgorICoJaHR0cHM6Ly9idWdzLmtkZS5vcmcvc2hvd19idWcuY2dpP2lkPTMxODIwMworICoKKyAqIGFuZCB2YWxncmluZCBidWcgMzEyOTg5IGZvciBPUyBYOgorICoKKyAqCWh0dHBzOi8vYnVncy5rZGUub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTI5ODkKKyAqCisgKiBUaGUgZml4ZXMgZm9yIGJvdGggb2YgdGhvc2UgYXJlIGNoZWNrZWQgaW50byB0aGUgb2ZmaWNpYWwgdmFsZ3JpbmQKKyAqIHJlcG9zaXRvcnkuCisgKgorICogVGhlIHVub2ZmaWNpYWwgRnJlZUJTRCBwb3J0IGhhcyBzaW1pbGFyIGlzc3VlcyB0byB0aGUgb2ZmaWNpYWwgT1MgWAorICogcG9ydCwgZm9yIHNpbWlsYXIgcmVhc29ucy4KKyAqLwogI2lmbmRlZiBsaW50CiBzdGF0aWMgY29uc3QgY2hhciBjb3B5cmlnaHRbXSBfVV8gPQogICAgICJAKCMpIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMFxuXApAQCAtNzIsMjIgKzk2LDYyIEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPHBjYXAuaD4KLSNpZm5kZWYgSEFWRV9fX0FUVFJJQlVURV9fCi0jZGVmaW5lIF9fYXR0cmlidXRlX18oeCkKLSNlbmRpZgogCiBzdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOwogCi0vKiBGb3J3YXJkcyAqLwotc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKLXN0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKQotICAgIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuLCBmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKLXN0YXRpYyB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqLCAuLi4pCi0gICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisvKgorICogVGhpcyB3YXMgaW50cm9kdWNlZCBieSBDbGFuZzoKKyAqCisgKiAgICAgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RvY3MvTGFuZ3VhZ2VFeHRlbnNpb25zLmh0bWwjaGFzLWF0dHJpYnV0ZQorICoKKyAqIGluIHNvbWUgdmVyc2lvbiAod2hpY2ggdmVyc2lvbj8pOyBpdCBoYXMgYmVlbiBwaWNrZWQgdXAgYnkgR0NDIDUuMC4KKyAqLworI2lmbmRlZiBfX2hhc19hdHRyaWJ1dGUKKyAgLyoKKyAgICogSXQncyBhIG1hY3JvLCBzbyB5b3UgY2FuIGNoZWNrIHdoZXRoZXIgaXQncyBkZWZpbmVkIHRvIGNoZWNrCisgICAqIHdoZXRoZXIgaXQncyBzdXBwb3J0ZWQuCisgICAqCisgICAqIElmIGl0J3Mgbm90LCBkZWZpbmUgaXQgdG8gYWx3YXlzIHJldHVybiAwLCBzbyB0aGF0IHdlIG1vdmUgb24gdG8KKyAgICogdGhlIGZhbGxiYWNrIGNoZWNrcy4KKyAgICovCisgICNkZWZpbmUgX19oYXNfYXR0cmlidXRlKHgpIDAKKyNlbmRpZgogCi1leHRlcm4gaW50IG9wdGluZDsKLWV4dGVybiBpbnQgb3B0ZXJyOwotZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKyNpZiBfX2hhc19hdHRyaWJ1dGUobm9yZXR1cm4pIFwKKyAgICB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAyMDUpKSBcCisgICAgfHwgKGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1OTApKSBcCisgICAgfHwgKGRlZmluZWQoX194bENfXykgJiYgX194bENfXyA+PSAweDBBMDEpIFwKKyAgICB8fCAoZGVmaW5lZChfX0hQX2FDQykgJiYgX19IUF9hQ0MgPj0gNjEwMDApCisgIC8qCisgICAqIENvbXBpbGVyIHdpdGggc3VwcG9ydCBmb3IgaXQsIG9yIEdDQyAyLjUgYW5kIGxhdGVyLCBvciBTb2xhcmlzIFN0dWRpbyAxMgorICAgKiAoU3VuIEMgNS45KSBhbmQgbGF0ZXIsIG9yIElCTSBYTCBDIDEwLjEgYW5kIGxhdGVyIChkbyBhbnkgZWFybGllcgorICAgKiB2ZXJzaW9ucyBvZiBYTCBDIHN1cHBvcnQgdGhpcz8pLCBvciBIUCBhQ0MgQS4wNi4xMCBhbmQgbGF0ZXIuCisgICAqLworICAjZGVmaW5lIFBDQVBfTk9SRVRVUk4gX19hdHRyaWJ1dGUoKG5vcmV0dXJuKSkKKyNlbGlmIGRlZmluZWQoIF9NU0NfVkVSICkKKyAgI2RlZmluZSBQQ0FQX05PUkVUVVJOIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxzZQorICAjZGVmaW5lIFBDQVBfTk9SRVRVUk4KKyNlbmRpZgorCisjaWYgX19oYXNfYXR0cmlidXRlKF9fZm9ybWF0X18pIFwKKyAgICB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAyMDMpKSBcCisgICAgfHwgKGRlZmluZWQoX194bENfXykgJiYgX194bENfXyA+PSAweDBBMDEpIFwKKyAgICB8fCAoZGVmaW5lZChfX0hQX2FDQykgJiYgX19IUF9hQ0MgPj0gNjEwMDApCisgIC8qCisgICAqIENvbXBpbGVyIHdpdGggc3VwcG9ydCBmb3IgaXQsIG9yIEdDQyAyLjMgYW5kIGxhdGVyLCBvciBJQk0gWEwgQyAxMC4xCisgICAqIGFuZCBsYXRlciAoZG8gYW55IGVhcmxpZXIgdmVyc2lvbnMgb2YgWEwgQyBzdXBwb3J0IHRoaXM/KSwKKyAgICogb3IgSFAgYUNDIEEuMDYuMTAgYW5kIGxhdGVyLgorICAgKi8KKyAgI2RlZmluZSBQQ0FQX1BSSU5URkxJS0UoeCx5KSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18seCx5KSkpCisjZWxzZQorICAjZGVmaW5lIFBDQVBfUFJJTlRGTElLRSh4LHkpCisjZW5kaWYKKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyB2b2lkIFBDQVBfTk9SRVRVUk4gdXNhZ2Uodm9pZCk7CitzdGF0aWMgdm9pZCBQQ0FQX05PUkVUVVJOIGVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKSBQQ0FQX1BSSU5URkxJS0UoMSwgMik7CitzdGF0aWMgdm9pZCB3YXJuaW5nKGNvbnN0IGNoYXIgKiwgLi4uKSBQQ0FQX1BSSU5URkxJS0UoMSwgMik7CiAKIC8qCiAgKiBPbiBXaW5kb3dzLCB3ZSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGUsIHNvIHRoYXQKZGlmZiAtLWdpdCBhL3ZlcnNpb24uYyBiL3ZlcnNpb24uYwppbmRleCA0ODI2NzFkLi4xNWY2YmFmIDEwMDY0NAotLS0gYS92ZXJzaW9uLmMKKysrIGIvdmVyc2lvbi5jCkBAIC0xICsxLDMgQEAKLWNoYXIgcGNhcF92ZXJzaW9uW10gPSAiMS43LjQiOworI2luY2x1ZGUgPHBjYXAvZXhwb3J0LWRlZnMuaD4KK1BDQVBfQVBJX0RFRgorY2hhciBwY2FwX3ZlcnNpb25bXSA9ICIxLjguMSI7CmRpZmYgLS1naXQgYS92ZXJzaW9uLmggYi92ZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YjJkZjguLjAwMDAwMDAKLS0tIGEvdmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3RhdGljIGNvbnN0IGNoYXIgcGNhcF92ZXJzaW9uX3N0cmluZ1tdID0gImxpYnBjYXAgdmVyc2lvbiAxLjcuNCI7Cg==