ZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZ2ZsdDExMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2dmbHQxMTBfZGVmY29uZmlnCmluZGV4IDViNjQxODQuLjUyNzBjZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvZ2ZsdDExMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9nZmx0MTEwX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKICMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMi4xMQotIyBUaHUgQXVnICAxIDE0OjA3OjU2IDIwMTMKKyMgV2VkIEF1ZyAyMSAxMDo1MDo0NSAyMDEzCiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CkBAIC0yMjIsNyArMjIyLDcgQEAKICMgQ09ORklHX01WX0lOQ0xVREVfVFMgaXMgbm90IHNldAogQ09ORklHX01WX0lOQ0xVREVfUE9OPXkKIENPTkZJR19NVl9JTkNMVURFX1RQTT15Ci1DT05GSUdfTVZfSU5DTFVERV9DVVNUPXkKK0NPTkZJR19NVl9JTkNMVURFX0NQSD15CiBDT05GSUdfTVZfSU5DTFVERV9TV0lUQ0g9eQogQ09ORklHX01WX0dQUF9NQVhfUElOUz03MAogQ09ORklHX01WX0RDQUNIRV9TSVpFPTB4NDAwMApAQCAtMzQ1LDcgKzM0NSw3IEBACiAjCiAjIENvbnRyb2wgYW5kIFN0YXRpc3RpY3MKICMKLUNPTkZJR19NVl9FVEhfREVCVUdfQ09ERT15CisjIENPTkZJR19NVl9FVEhfREVCVUdfQ09ERSBpcyBub3Qgc2V0CiBDT05GSUdfTVZfRVRIX1NUQVRfRVJSPXkKIENPTkZJR19NVl9FVEhfU1RBVF9JTkY9eQogQ09ORklHX01WX0VUSF9TVEFUX0RCRz15CkBAIC00MTAsMTQgKzQxMCwxOCBAQAogIwogCiAjCi0jIFNvQyBDVVNUIHN1cHBvcnQKKyMgU29DIENQSCBzdXBwb3J0CiAjCi1DT05GSUdfTVZfQ1VTVD15Ci1DT05GSUdfTVZfQ1VTVF9JR01QX0hBTkRMRT15Ci1DT05GSUdfTVZfQ1VTVF9NTERfSEFORExFPXkKLUNPTkZJR19NVl9DVVNUX0xQQktfREVURUNUX0hBTkRMRT15Ci0jIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFIGlzIG5vdCBzZXQKLUNPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRT15CitDT05GSUdfTVZfQ1BIPXkKKworIworIyBDUEggRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19NVl9DUEhfSUdNUF9IQU5ETEU9eQorQ09ORklHX01WX0NQSF9NTERfSEFORExFPXkKK0NPTkZJR19NVl9DUEhfQkNfSEFORExFPXkKKyMgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRSBpcyBub3Qgc2V0CitDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRT15CiAKICMKICMgU29DIFBPTiBzdXBwb3J0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL01ha2VmaWxlCmluZGV4IDllZDA1MTIuLjZlMzA4ZDMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL01ha2VmaWxlCkBAIC0yMjIsOCArMjIyLDggQEAKICNUUE0KIG9iai0kKENPTkZJR19NVl9UUE0pICs9IC4uL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtLwogCi0jQ1VTVAotb2JqLSQoQ09ORklHX01WX0NVU1QpICs9IC4uL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC8KKyNDUEgKK29iai0kKENPTkZJR19NVl9DUEgpICs9IC4uL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoLwogCiAjTUFDX0xFQVJOCiBvYmotJChDT05GSUdfTVZfTUFDX0xFQVJOKSArPSAuLi9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X21hY19sZWFybi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL2NvbmZpZy9tdlJ1bGVzLm1rIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvY29uZmlnL212UnVsZXMubWsKaW5kZXggN2M0NGE1ZC4uMWVmYjliOSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvY29uZmlnL212UnVsZXMubWsKKysrIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvY29uZmlnL212UnVsZXMubWsKQEAgLTYzLDggKzYzLDggQEAKIExTUF9UUE1fUExBVF9ESVIgID0gJChQTEFUX0RSSVZFUlMpL212X3RwbS9wbGF0CiBlbmRpZgogCi1pZmVxICgkKENPTkZJR19NVl9JTkNMVURFX0NVU1QpLHkpCi1MU1BfQ1VTVF9DT1JFX0RJUiAgPSAkKFBMQVRfRFJJVkVSUykvbXZfY3VzdAoraWZlcSAoJChDT05GSUdfTVZfSU5DTFVERV9DUEgpLHkpCitMU1BfQ1BIX0NPUkVfRElSICA9ICQoUExBVF9EUklWRVJTKS9tdl9jcGgKIGVuZGlmCiAKIExTUF9FWlhNTF9ESVIgICAgID0gJChQTEFUX0RSSVZFUlMpL212X2V6eG1sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9pbmNsdWRlL21hY2gvc3lzdGVtLmgKaW5kZXggNmNhYjQ2My4uYjQyNmZlZSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisrKyBiL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMzEsNyArMzEsNyBAQAogCWNwdV9kb19pZGxlKCk7CiB9CiAKLSNkZWZpbmUgVVBPTl9TREtfVkVSU0lPTiAidVBPTl8yLjYuMjVfUkM3NyIKKyNkZWZpbmUgVVBPTl9TREtfVkVSU0lPTiAidVBPTl8yLjcuMjVfUkM1IgogCiAjaWZkZWYgX19CSUdfRU5ESUFOCiAjZGVmaW5lIE1WX0FSTV8zMkJJVF9MRShYKSAoKCgoWCkmMHhmZik8PDI0KSB8ICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL0tjb25maWcKaW5kZXggYTk5NDQ4ZS4uMTNjZDU0MCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vS2NvbmZpZwpAQCAtMTIxLDggKzEyMSw4IEBACiAgICAgICAgIC0tLWhlbHAtLS0KICAgICAgICAgUGxlYXNlIGRvbid0IGNoYW5nZSB0aGlzIGNvbmZpZ3MgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KIAotY29uZmlnIE1WX0lOQ0xVREVfQ1VTVAotCWJvb2wgIkN1c3RvbWVyIGRyaXZlciBTdXBwb3J0IgorY29uZmlnIE1WX0lOQ0xVREVfQ1BICisJYm9vbCAiQ1BIIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNVjg4RjY1MDAKIAlkZWZhdWx0IHkKICAgICAgICAgLS0taGVscC0tLQpAQCAtNDAzLDcgKzQwMyw3IEBACiAKIHNvdXJjZSBhcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RzdS9LY29uZmlnCiAKLXNvdXJjZSBhcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvS2NvbmZpZworc291cmNlIGFyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL0tjb25maWcKIAogc291cmNlIGFyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL0tjb25maWcKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTg1ZTgzOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL0tjb25maWcKQEAgLTAsMCArMSwzNyBAQAorbWVudSAiU29DIENQSCBzdXBwb3J0IgorZGVwZW5kcyBvbiBNVl9JTkNMVURFX0NQSAorCitjb25maWcgIE1WX0NQSAorICAgICAgICBib29sICJTdXBwb3J0IGZvciBNYXJ2ZWxsIENQVSBQYWNrZXQgSGFuZGxlciBEcml2ZXIiCisgICAgICAgIGRlZmF1bHQgeQorICAgICAgICAtLS1oZWxwLS0tCisKK2NvbW1lbnQgIkNQSCBEcml2ZXIgT3B0aW9ucyIKK2RlcGVuZHMgb24gTVZfQ1BICisKK2NvbmZpZyAgTVZfQ1BIX0lHTVBfSEFORExFCisgICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DUEggSUdNUCBoYW5kbGluZyIKKyAgICAgICAgZGVmYXVsdCB5CisgICAgICAgIC0tLWhlbHAtLS0KKworY29uZmlnICBNVl9DUEhfTUxEX0hBTkRMRQorICAgICAgICBib29sICJFbmFibGUgTVZfQ1BIIE1MRCBoYW5kbGluZyIKKyAgICAgICAgZGVmYXVsdCB5CisgICAgICAgIC0tLWhlbHAtLS0KKworY29uZmlnICBNVl9DUEhfQkNfSEFORExFCisgICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DUEggYnJvYWRjYXN0IGhhbmRsaW5nIgorICAgICAgICBkZWZhdWx0IHkKKyAgICAgICAgLS0taGVscC0tLQorICAgICAgICAKK2NvbmZpZyAgTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFCisgICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DUEggc2FtcGxlIFVEUCBoYW5kbGluZyIKKyAgICAgICAgZGVmYXVsdCBuCisgICAgICAgIC0tLWhlbHAtLS0KKworY29uZmlnICBNVl9DUEhfRkxPV19NQVBfSEFORExFCisgICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DUEggZmxvdyBtYXBwaW5nIGhhbmRsaW5nIgorICAgICAgICBkZWZhdWx0IHkKKyAgICAgICAgLS0taGVscC0tLSAgICAgICAgCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL01ha2VmaWxlIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmQwZGNkYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL01ha2VmaWxlCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBNYXJ2ZWxsIENQVSBQYWNrZXQgSGFuZGxlcgorIworCitpZmVxICgkKENPTkZJR19BUkNIX0ZFUk9DRU9OKSx5KQorCWluY2x1ZGUgJChzcmN0cmVlKS8kKE1BQ0hJTkUpL2NvbmZpZy9tdlJ1bGVzLm1rCitlbmRpZgorCitpZmRlZiBDT05GSUdfTVZfSEFMX1JVTEVTX1BBVEgKK2luY2x1ZGUgJChzcmN0cmVlKS9pbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYKK2luY2x1ZGUgJChzcmN0cmVlKS8kKHN1YnN0ICIsLCQoQ09ORklHX01WX0hBTF9SVUxFU19QQVRIKSkKK2VuZGlmCisKK0NQSF9PQkpTICs9IG12X2NwaF9hcGkubyBcCisJCW12X2NwaF9hcHAubyBcCisJCW12X2NwaF9kYi5vIFwKKwkJbXZfY3BoX2Rldi5vIFwKKwkJbXZfY3BoX2Zsb3cubyBcCisJCW12X2NwaF9pbmZyYS5vIFwKKwkJbXZfY3BoX21vZC5vIFwKKwkJbXZfY3BoX25ldGRldi5vIFwKKwkJbXZfY3BoX3N5c2ZzLm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCittdl9jcGgtb2JqcyA6PSAkKENQSF9PQkpTKQorb2JqLSQoQ09ORklHX01WX0NQSCkgKz0gbXZfY3BoLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcGkuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yM2ZmN2UxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwaS5jCkBAIC0wLDAgKzEsNTQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2FwaS5jCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIEFQSSBkZWZpbml0aW9uCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorCisjaW5jbHVkZSAibXZfY3BoX2hlYWRlci5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3NldF9jb21wbGV4X3Byb2ZpbGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0IFRQTSBjb21wbGV4IHByb2ZpbGUgSUQgCisqCisqIElOUFVUUzoKKyogICAgICAgcHJvZmlsZV9pZCAgIC0gVFBNIGNvbXBsZXggcHJvZmlsZSBJRAorKiAgICAgICBhY3RpdmVfcG9ydCAgLSBBY3RpdmUgV0FOIHBvcnQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9zZXRfY29tcGxleF9wcm9maWxlICh0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90IHByb2ZpbGVfaWQsIE1WX0FQUF9HTUFDX1BPUlRfRSBhY3RpdmVfcG9ydCkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF9zZXRfY29tcGxleF9wcm9maWxlKHByb2ZpbGVfaWQsIGFjdGl2ZV9wb3J0KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9zZXRfY29tcGxleF9wcm9maWxlIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfc2V0X2ZlYXR1cmVfZmxhZygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBFbmFibGUgb3IgZGlzYWJsZSBmZWF0dXJlIHN1cHBvcnQgaW4gQ1BIIAorKgorKiBJTlBVVFM6CisqICAgICAgIGZlYXR1cmUgLSBDUEggc3VwcG9ydGVkIGZlYXR1cmVzCisqICAgICAgIHN0YXRlICAgLSBFbmFibGUgb3IgZGlzYWJsZSB0aGlzIGZlYXR1cmUgaW4gQ1BICisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfc2V0X2ZlYXR1cmVfZmxhZyAoQ1BIX0FQUF9GRUFUVVJFX0UgZmVhdHVyZSwgQk9PTCBzdGF0ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF9zZXRfZmVhdHVyZV9mbGFnKGZlYXR1cmUsIHN0YXRlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX2FwcF9zZXRfZmVhdHVyZV9mbGFnIik7CisgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hZGRfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQWRkIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hZGRfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF9hZGRfcnVsZShwYXJzZV9ibSwgcGFyc2Vfa2V5LCBtb2RfYm0sIG1vZF92YWx1ZSwgZnJ3ZF9ibSwgZnJ3ZF92YWx1ZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9hcHBfYWRkX3J1bGUiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZWxfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kZWxfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF9kZWxfcnVsZShwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9kZWxfcnVsZSIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3VwZGF0ZV9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBVcGRhdGUgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX3VwZGF0ZV9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX3VwZGF0ZV9ydWxlKHBhcnNlX2JtLCBwYXJzZV9rZXksIG1vZF9ibSwgbW9kX3ZhbHVlLCBmcndkX2JtLCBmcndkX3ZhbHVlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2FwcF91cGRhdGVfcnVsZSIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2dldF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2dldF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgKm1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgKmZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX2dldF9ydWxlKHBhcnNlX2JtLCBwYXJzZV9rZXksIG1vZF9ibSwgbW9kX3ZhbHVlLCBmcndkX2JtLCBmcndkX3ZhbHVlKTsKKyAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJmYWlsIHRvIGNhbGwgY3BoX2FwcF9nZXRfcnVsZVxuIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYWRkX2Zsb3dfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXRzIGZsb3cgbWFwcGluZyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9hZGRfZmxvd19ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZmxvd19hZGRfcnVsZShjcGhfZmxvdyk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9mbG93X2FkZF9ydWxlIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGVsX2Zsb3dfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGVzIGZsb3cgbWFwcGluZyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9kZWxfZmxvd19ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZmxvd19kZWxfcnVsZShjcGhfZmxvdyk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9mbG93X2RlbF9ydWxlIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZ2V0X2Zsb3dfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXRzIGZsb3cgbWFwcGluZyBydWxlIGZvciB0YWdnZWQgZnJhbWVzLgorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gSW5wdXQgdmlkLCBwYml0cywgZGlyCisqCisqIE9VVFBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gb3V0cHV0IHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgR0VNIHBvcnQsIAorKiAgICAgICAgICAgICAgICAgICBULUNPTlQsIHF1ZXVlIGFuZCBwYWNrZXQgbW9kaWZpY2F0aW9uIGZvciBWSUQsIFAtYml0cy4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2dldF9mbG93X3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9mbG93X2dldF9ydWxlKGNwaF9mbG93KTsKKyAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfZ2V0X3J1bGVcbiIpOworICAgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfY2xlYXJfZmxvd19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENsZWFycyBhbGwgZmxvdyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2NsZWFyX2Zsb3dfcnVsZShWT0lEKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZmxvd19jbGVhcl9ydWxlKCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9mbG93X2NsZWFyX3J1bGUiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9jbGVhcl9mbG93X3J1bGVfYnlfbWgoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ2xlYXJzIGZsb3cgbWFwcGluZyBydWxlcyBieSBNSAorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgLSAgTWFydmVsbCBoZWFkZXIuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9jbGVhcl9mbG93X3J1bGVfYnlfbWgoVUlOVDE2IG1oKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZmxvd19jbGVhcl9ydWxlX2J5X21oKG1oKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2Zsb3dfY2xlYXJfcnVsZV9ieV9taCIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3NldF9mbG93X2RzY3BfbWFwKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldHMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIGRzY3BfbWFwICAtIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9zZXRfZmxvd19kc2NwX21hcChDUEhfRFNDUF9QQklUU19UICpkc2NwX21hcCkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2Zsb3dfc2V0X2RzY3BfbWFwKGRzY3BfbWFwKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2Zsb3dfc2V0X2RzY3BfbWFwIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGVsX2Zsb3dfZHNjcF9tYXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlcyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2RlbF9mbG93X2RzY3BfbWFwKFZPSUQpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9mbG93X2RlbF9kc2NwX21hcCgpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgIkZhaWwgdG8gY2FsbCBjcGhfZmxvd19kZWxfZHNjcF9tYXAiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIGNwaF9nZXRfdGNvbnRfc3RhdGUKKyoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0IFQtQ09OVCBzdGF0ZQorKioKKyoqIElOUFVUUzoKKyoqICAgdGNvbnQgLSBULUNPTlQKKyoqCisqKiBPVVRQVVRTOgorKiogICBOb25lLiAKKyoqCisqKiBSRVRVUk5TOiAgICAgCisqKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLiAgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgY3BoX2dldF90Y29udF9zdGF0ZSh1bnNpZ25lZCBpbnQgdGNvbnQpCit7CisgICAgcmV0dXJuIGNwaF9kYl9nZXRfdGNvbnRfc3RhdGUodGNvbnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIGNwaF9zZXRfdGNvbnRfc3RhdGUKKyoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBULUNPTlQgc3RhdGUgaW4gbXZfY3VzdAorKioKKyoqIElOUFVUUzoKKyoqICAgdGNvbnQgLSBULUNPTlQKKyoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisqKgorKiogT1VUUFVUUzoKKyoqICAgTm9uZS4gCisqKgorKiogUkVUVVJOUzogICAgIAorKiogIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCisqKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBjcGhfc2V0X3Rjb250X3N0YXRlKHVuc2lnbmVkIGludCB0Y29udCwgYm9vbCBzdGF0ZSkKK3sKKyAgICByZXR1cm4gY3BoX2RiX3NldF90Y29udF9zdGF0ZSh0Y29udCwgc3RhdGUpOworfQorCitFWFBPUlRfU1lNQk9MKGNwaF9zZXRfY29tcGxleF9wcm9maWxlKTsKK0VYUE9SVF9TWU1CT0woY3BoX3NldF9mZWF0dXJlX2ZsYWcpOworRVhQT1JUX1NZTUJPTChjcGhfYWRkX2FwcF9ydWxlKTsKK0VYUE9SVF9TWU1CT0woY3BoX2RlbF9hcHBfcnVsZSk7CitFWFBPUlRfU1lNQk9MKGNwaF91cGRhdGVfYXBwX3J1bGUpOworRVhQT1JUX1NZTUJPTChjcGhfZ2V0X2FwcF9ydWxlKTsKK0VYUE9SVF9TWU1CT0woY3BoX2FkZF9mbG93X3J1bGUpOworRVhQT1JUX1NZTUJPTChjcGhfZGVsX2Zsb3dfcnVsZSk7CitFWFBPUlRfU1lNQk9MKGNwaF9nZXRfZmxvd19ydWxlKTsKK0VYUE9SVF9TWU1CT0woY3BoX2NsZWFyX2Zsb3dfcnVsZSk7CitFWFBPUlRfU1lNQk9MKGNwaF9zZXRfZmxvd19kc2NwX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwaF9kZWxfZmxvd19kc2NwX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwaF9nZXRfdGNvbnRfc3RhdGUpOworRVhQT1JUX1NZTUJPTChjcGhfc2V0X3Rjb250X3N0YXRlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcGkuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZmRiOGEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwaS5oCkBAIC0wLDAgKzEsNDExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2FwaS5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIEFQSSBkZWZpbml0aW9uCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX01WX0NQSF9BUElfSF8KKyNkZWZpbmUgX01WX0NQSF9BUElfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUeXBlIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3NldF9jb21wbGV4X3Byb2ZpbGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0IFRQTSBjb21wbGV4IHByb2ZpbGUgSUQgCisqCisqIElOUFVUUzoKKyogICAgICAgcHJvZmlsZV9pZCAgIC0gVFBNIGNvbXBsZXggcHJvZmlsZSBJRAorKiAgICAgICBhY3RpdmVfcG9ydCAgLSBBY3RpdmUgV0FOIHBvcnQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9zZXRfY29tcGxleF9wcm9maWxlICh0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90IHByb2ZpbGVfaWQsIE1WX0FQUF9HTUFDX1BPUlRfRSBhY3RpdmVfcG9ydCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3NldF9mZWF0dXJlX2ZsYWcoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRW5hYmxlIG9yIGRpc2FibGUgZmVhdHVyZSBzdXBwb3J0IGluIENQSCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBmZWF0dXJlIC0gQ1BIIHN1cHBvcnRlZCBmZWF0dXJlcworKiAgICAgICBzdGF0ZSAgIC0gRW5hYmxlIG9yIGRpc2FibGUgdGhpcyBmZWF0dXJlIGluIENQSAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX3NldF9mZWF0dXJlX2ZsYWcgKENQSF9BUFBfRkVBVFVSRV9FIGZlYXR1cmUsIEJPT0wgc3RhdGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hZGRfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQWRkIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hZGRfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RlbF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGUgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RlbF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfdXBkYXRlX2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFVwZGF0ZSBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfdXBkYXRlX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9nZXRfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9nZXRfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICptb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICpmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FkZF9mbG93X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0cyBmbG93IG1hcHBpbmcgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfYWRkX2Zsb3dfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RlbF9mbG93X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlcyBmbG93IG1hcHBpbmcgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZGVsX2Zsb3dfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2dldF9mbG93X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0cyBmbG93IG1hcHBpbmcgcnVsZSBmb3IgdGFnZ2VkIGZyYW1lcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIElucHV0IHZpZCwgcGJpdHMsIGRpcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIG91dHB1dCBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIEdFTSBwb3J0LCAKKyogICAgICAgICAgICAgICAgICAgVC1DT05ULCBxdWV1ZSBhbmQgcGFja2V0IG1vZGlmaWNhdGlvbiBmb3IgVklELCBQLWJpdHMuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9nZXRfZmxvd19ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfY2xlYXJfZmxvd19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENsZWFycyBhbGwgZmxvdyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2NsZWFyX2Zsb3dfcnVsZShWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfY2xlYXJfZmxvd19ydWxlX2J5X21oKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENsZWFycyBmbG93IG1hcHBpbmcgcnVsZXMgYnkgTUgKKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgIC0gIE1hcnZlbGwgaGVhZGVyLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfY2xlYXJfZmxvd19ydWxlX2J5X21oKFVJTlQxNiBtaCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3NldF9mbG93X2RzY3BfbWFwKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldHMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIGRzY3BfbWFwICAtIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9zZXRfZmxvd19kc2NwX21hcChDUEhfRFNDUF9QQklUU19UICpkc2NwX21hcCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RlbF9mbG93X2RzY3BfbWFwKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9kZWxfZmxvd19kc2NwX21hcChWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBjcGhfZ2V0X3Rjb250X3N0YXRlCisqKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGdldCBULUNPTlQgc3RhdGUKKyoqCisqKiBJTlBVVFM6CisqKiAgIHRjb250IC0gVC1DT05UCisqKgorKiogT1VUUFVUUzoKKyoqICAgTm9uZS4gCisqKgorKiogUkVUVVJOUzogICAgIAorKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4gIAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIGNwaF9nZXRfdGNvbnRfc3RhdGUodW5zaWduZWQgaW50IHRjb250KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBjcGhfc2V0X3Rjb250X3N0YXRlCisqKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgVC1DT05UIHN0YXRlIGluIG12X2N1c3QKKyoqCisqKiBJTlBVVFM6CisqKiAgIHRjb250IC0gVC1DT05UCisqKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLgorKioKKyoqIE9VVFBVVFM6CisqKiAgIE5vbmUuIAorKioKKyoqIFJFVFVSTlM6ICAgICAKKyoqICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAorKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgY3BoX3NldF90Y29udF9zdGF0ZSh1bnNpZ25lZCBpbnQgdGNvbnQsIGJvb2wgc3RhdGUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX01WX0NQSF9BUElfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcHAuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Yzc3ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwcC5jCkBAIC0wLDAgKzEsMTQ4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9hcHAuYworKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBhcHBsaWNhdGlvbiBtb2R1bGUgdG8gaW1wbGVtZW50CisqICAgICAgICAgICAgICBDUEggbWFpbiBsb2dpYyBhbmQgaGFuZGxlIGFwcGxpY2F0aW9uIHBhY2tldHMgc3VjaCBhcyBPTUNJLCBlT0FNLCAKKyogICAgICAgICAgICAgIElHTVAgcGFja2V0cy4KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKworI2luY2x1ZGUgIm12X2NwaF9oZWFkZXIuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ1BIIGdsb2JhbCB0cmFjZSBmbGFnICovCitVSU5UMzIgZ19jcGhfZ2xvYmFsX3RyYWNlID0gQ1BIX0VSUl9MRVZFTHxDUEhfV0FSTl9MRVZFTHxDUEhfSU5GT19MRVZFTDsKKworTVZfRU5VTV9FTlRSWV9UIGdfZW51bV9tYXBfcHJvZmlsZV9pZFtdID0KK3sKKyAgICB7IFRQTV9QT05fV0FOX0RVQUxfTUFDX0lOVF9TV0lUQ0gsICAiVFBNX1BPTl9XQU5fRFVBTF9NQUNfSU5UX1NXSVRDSCJ9LAorICAgIHsgVFBNX1BPTl9XQU5fRzBfSU5UX1NXSVRDSCwgICAgICAgICJUUE1fUE9OX1dBTl9HMF9JTlRfU1dJVENIIn0sCisgICAgeyBUUE1fUE9OX1dBTl9HMV9MQU5fRzBfSU5UX1NXSVRDSCwgIlRQTV9QT05fV0FOX0cxX0xBTl9HMF9JTlRfU1dJVENIIn0sCisgICAgeyBUUE1fRzBfV0FOX0cxX0lOVF9TV0lUQ0gsICAgICAgICAgIlRQTV9HMF9XQU5fRzFfSU5UX1NXSVRDSCJ9LAorICAgIHsgVFBNX0cxX1dBTl9HMF9JTlRfU1dJVENILCAgICAgICAgICJUUE1fRzFfV0FOX0cwX0lOVF9TV0lUQ0gifSwKKyAgICB7IFRQTV9QT05fRzFfV0FOX0cwX0lOVF9TV0lUQ0gsICAgICAiVFBNX1BPTl9HMV9XQU5fRzBfSU5UX1NXSVRDSCJ9LAorICAgIHsgVFBNX1BPTl9HMF9XQU5fRzFfSU5UX1NXSVRDSCwgICAgICJUUE1fUE9OX0cwX1dBTl9HMV9JTlRfU1dJVENIIn0sCisgICAgeyBUUE1fUE9OX1dBTl9EVUFMX01BQ19FWFRfU1dJVENILCAgIlRQTV9QT05fV0FOX0RVQUxfTUFDX0VYVF9TV0lUQ0gifSwKKyAgICB7IFRQTV9QT05fV0FOX0cxX01OR19FWFRfU1dJVENILCAgICAiVFBNX1BPTl9XQU5fRzFfTU5HX0VYVF9TV0lUQ0gifSwKKyAgICB7IFRQTV9QT05fV0FOX0cwX1NJTkdMRV9QT1JULCAgICAgICAiVFBNX1BPTl9XQU5fRzBfU0lOR0xFX1BPUlQifSwKKyAgICB7IFRQTV9QT05fV0FOX0cxX1NJTkdMRV9QT1JULCAgICAgICAiVFBNX1BPTl9XQU5fRzFfU0lOR0xFX1BPUlQifSwKKyAgICB7IFRQTV9QT05fRzFfV0FOX0cwX1NJTkdMRV9QT1JULCAgICAiVFBNX1BPTl9HMV9XQU5fRzBfU0lOR0xFX1BPUlQifSwKKyAgICB7IFRQTV9QT05fRzBfV0FOX0cxX1NJTkdMRV9QT1JULCAgICAiVFBNX1BPTl9HMF9XQU5fRzFfU0lOR0xFX1BPUlRnIn0sCisgICAgeyBUUE1fUE9OX1dBTl9HMF9HMV9MUEJLLCAgICAgICAgICAgIlRQTV9QT05fV0FOX0cwX0cxX0xQQksifSwKKyAgICB7IFRQTV9QT05fV0FOX0cwX0cxX0RVQUxfTEFOLCAgICAgICAiVFBNX1BPTl9XQU5fRzBfRzFfRFVBTF9MQU4ifSwgICAgIAorfTsKKworc3RhdGljIE1WX0VOVU1fQVJSQVlfVCBnX2VudW1fYXJyYXlfcHJvZmlsZV9pZCA9Cit7CisgICAgc2l6ZW9mKGdfZW51bV9tYXBfcHJvZmlsZV9pZCkvc2l6ZW9mKGdfZW51bV9tYXBfcHJvZmlsZV9pZFswXSksCisgICAgZ19lbnVtX21hcF9wcm9maWxlX2lkCit9OworCitzdGF0aWMgTVZfRU5VTV9FTlRSWV9UIGdfZW51bV9tYXBfcG9uX3R5cGVbXSA9Cit7CisgICAgeyBDUEhfUE9OX1RZUEVfRVBPTiwgIkVQT04ifSwKKyAgICB7IENQSF9QT05fVFlQRV9HUE9OLCAiR1BPTiJ9LAorICAgIHsgQ1BIX1BPTl9UWVBFX0dCRSwgICJHQkUifSwKKyAgICB7IENQSF9QT05fVFlQRV9QMlAsICAiUDJQIn0sCit9OworCitzdGF0aWMgTVZfRU5VTV9BUlJBWV9UIGdfZW51bV9hcnJheV9wb25fdHlwZSA9Cit7CisgICAgc2l6ZW9mKGdfZW51bV9tYXBfcG9uX3R5cGUpL3NpemVvZihnX2VudW1fbWFwX3Bvbl90eXBlWzBdKSwKKyAgICBnX2VudW1fbWFwX3Bvbl90eXBlCit9OworCitzdGF0aWMgTVZfRU5VTV9FTlRSWV9UIGdfZW51bV9tYXBfZGlyW10gPQoreworICAgIHsgQ1BIX0RJUl9VUywgICAgICAgIlVTIn0sCisgICAgeyBDUEhfRElSX0RTLCAgICAgICAiRFMifSwKKyAgICB7IENQSF9ESVJfTk9UX0NBUkUsICJOb3QgQ2FyZSJ9LAorfTsKKworc3RhdGljIE1WX0VOVU1fQVJSQVlfVCBnX2VudW1fYXJyYXlfZGlyID0KK3sKKyAgICBzaXplb2YoZ19lbnVtX21hcF9kaXIpL3NpemVvZihnX2VudW1fbWFwX2RpclswXSksCisgICAgZ19lbnVtX21hcF9kaXIKK307CisKK3N0YXRpYyBNVl9FTlVNX0VOVFJZX1QgZ19lbnVtX21hcF9yeF90eFtdID0KK3sKKyAgICB7IENQSF9ESVJfUlgsICAgICAgICAgIlJYIn0sCisgICAgeyBDUEhfRElSX1RYLCAgICAgICAgICJUWCJ9LAorICAgIHsgQ1BIX1JYX1RYX05PVF9DQVJFLCAiTm90IENhcmUifSwKK307CisKK3N0YXRpYyBNVl9FTlVNX0FSUkFZX1QgZ19lbnVtX2FycmF5X3J4X3R4ID0KK3sKKyAgICBzaXplb2YoZ19lbnVtX21hcF9yeF90eCkvc2l6ZW9mKGdfZW51bV9tYXBfcnhfdHhbMF0pLAorICAgIGdfZW51bV9tYXBfcnhfdHgKK307CisKK3N0YXRpYyBNVl9FTlVNX0VOVFJZX1QgZ19lbnVtX21hcF9nbWFjW10gPQoreworICAgIHsgTVZfQVBQX0dNQUNfUE9SVF8wLCAgIkdNQUMwIn0sCisgICAgeyBNVl9BUFBfR01BQ19QT1JUXzEsICAiR01BQzEifSwKKyAgICB7IE1WX0FQUF9QT05fTUFDX1BPUlQsICJQT04gTUFDIn0sCit9OworCitzdGF0aWMgTVZfRU5VTV9BUlJBWV9UIGdfZW51bV9hcnJheV9nbWFjID0KK3sKKyAgICBzaXplb2YoZ19lbnVtX21hcF9nbWFjKS9zaXplb2YoZ19lbnVtX21hcF9nbWFjWzBdKSwKKyAgICBnX2VudW1fbWFwX2dtYWMKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXh0ZXJuYWwgRGVjbGFyYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gQ0hBUiAqY3BoX2xvb2t1cF9lbnVtX3N0cihNVl9FTlVNX0FSUkFZX1QgKnBfZW51bV9hcnJheSwgSU5UMzIgZW51bV92YWx1ZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9zZXRfY29tcGxleF9wcm9maWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldCBUUE0gY29tcGxleCBwcm9maWxlIElEIAorKgorKiBJTlBVVFM6CisqICAgICAgIHByb2ZpbGVfaWQgICAtIFRQTSBjb21wbGV4IHByb2ZpbGUgSUQKKyogICAgICAgYWN0aXZlX3BvcnQgIC0gQWN0aXZlIFdBTiBwb3J0CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3NldF9jb21wbGV4X3Byb2ZpbGUgKHRwbV9ldGhfY29tcGxleF9wcm9maWxlX3QgcHJvZmlsZV9pZCwgTVZfQVBQX0dNQUNfUE9SVF9FIGFjdGl2ZV9wb3J0KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgLyogQ2hlY2sgdGhlIHJhbmdlIG9mIHByb2ZpbGVfaWQgKi8KKyAgICBpZiAocHJvZmlsZV9pZCA+IFRQTV9QT05fV0FOX0cwX0cxX0RVQUxfTEFOKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwcm9maWxlX2lkWyVkXSBpcyBvdXQgb2YgcmFuZ2VbMX4lZF0gXG4iLCBwcm9maWxlX2lkLCBUUE1fUE9OX1dBTl9HMF9HMV9EVUFMX0xBTik7CisgICAgICAgIHJldHVybiBNVl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhlIHJhbmdlIG9mIGFjdGl2ZV9wb3J0ICovCisgICAgaWYgKGFjdGl2ZV9wb3J0ID4gTVZfQVBQX1BPTl9NQUNfUE9SVCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiYWN0aXZlX3BvcnRbJWRdIGlzIG91dCBvZiByYW5nZVswfiVkXSBcbiIsIGFjdGl2ZV9wb3J0LCBNVl9BUFBfUE9OX01BQ19QT1JUKTsKKyAgICAgICAgcmV0dXJuIE1WX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICByYyA9IGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX1BST0ZJTEVfSUQsICZwcm9maWxlX2lkKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX2RiX3NldF9wYXJhbSIpOworCisgICAgcmMgPSBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9BQ1RJVkVfUE9SVCwgJmFjdGl2ZV9wb3J0KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX2RiX3NldF9wYXJhbSIpOworICAgCisgICAgcmV0dXJuIHJjOyAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3NldF9mZWF0dXJlX2ZsYWcoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRW5hYmxlIG9yIGRpc2FibGUgZmVhdHVyZSBzdXBwb3J0IGluIENQSCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBmZWF0dXJlIC0gQ1BIIHN1cHBvcnRlZCBmZWF0dXJlcworKiAgICAgICBzdGF0ZSAgIC0gRW5hYmxlIG9yIGRpc2FibGUgdGhpcyBmZWF0dXJlIGluIENQSAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9zZXRfZmVhdHVyZV9mbGFnIChDUEhfQVBQX0ZFQVRVUkVfRSBmZWF0dXJlLCBCT09MIHN0YXRlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgc3dpdGNoIChmZWF0dXJlKQorICAgIHsKKyAgICAgICAgY2FzZSBDUEhfQVBQX0ZFQVRVUkVfQVBQOgorICAgICAgICAgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fQVBQX1NVUFBPUlQsICZzdGF0ZSk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9BUFBfRkVBVFVSRV9JR01QOgorICAgICAgICAgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fSUdNUF9TVVBQT1JULCZzdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfQVBQX0ZFQVRVUkVfQkM6CisgICAgICAgICAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9CQ19TVVBQT1JULCAgJnN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9BUFBfRkVBVFVSRV9GTE9XOgorICAgICAgICAgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fRkxPV19TVVBQT1JULCZzdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfQVBQX0ZFQVRVUkVfVURQOgorICAgICAgICAgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fVURQX1NVUFBPUlQsICZzdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmM7ICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfdmFsaWRhdGVfcGFyc2VfZmllbGQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVmFsaWRhdGUgdGhlIHBhcnNpbmcgZmlsZWQgb2YgQ1BIIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3ZhbGlkYXRlX3BhcnNlX2ZpZWxkICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIC8qIENoZWNrIHRoZSByYW5nZSBvZiBwYXJzZV9ibSAqLworICAgIGlmIChwYXJzZV9ibSA+PSBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VORCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicGFyc2VfYm1bMHgleF0gaXMgb3V0IG9mIHJhbmdlWzB4MDF+MHgleF0gXG4iLCBwYXJzZV9ibSwgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FTkQpOworICAgICAgICByZXR1cm4gTVZfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIC8qIFZhbGlkYXRlIGRpcmVjdGlvbiAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRElSKQorICAgIHsKKyAgICAgICAgaWYgKHBhcnNlX2tleS0+ZGlyID4gQ1BIX0RJUl9OT1RfQ0FSRSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJkaXJbJWRdIGlzIG91dCBvZiByYW5nZVswfiVkXSBcbiIsIHBhcnNlX2tleS0+ZGlyLCBDUEhfRElSX05PVF9DQVJFKTsKKyAgICAgICAgICAgIHJldHVybiBNVl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBWYWxpZGF0ZSBSWC9UWCBkaXJlY3Rpb24gKi8KKyAgICBpZiAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX1JYX1RYKQorICAgIHsKKyAgICAgICAgaWYgKHBhcnNlX2tleS0+cnhfdHggPiBDUEhfUlhfVFhfTk9UX0NBUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicnhfdHhbJWRdIGlzIG91dCBvZiByYW5nZVswfiVkXSBcbiIsIHBhcnNlX2tleS0+cnhfdHgsIENQSF9SWF9UWF9OT1RfQ0FSRSk7CisgICAgICAgICAgICByZXR1cm4gTVZfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgfSAgICAKKworICAgIC8qIENvdWxkIG5vdCBwYXJzZSBOb25lIElQdjQgRXRoIHR5cGUgYW5kIElQdjQgcHJvdG9jb2wgdHlwZSBhdCB0aGUgc2FtZSBpbWUgKi8KKyAgICBpZiAoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfVFlQRSkgJiYKKyAgICAgICAgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY0X1RZUEUpICYmCisgICAgICAgIChwYXJzZV9rZXktPmV0aF90eXBlICE9IE1WX0NQSF9FVEhfVFlQRV9JUFY0KSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicGFyc2VfYm1bMHgleF0sIGV0aF90eXBlWzB4JXhdLCBkb2VzIG5vdCBzdXBwb3J0IHBhcnNpbmcgTm9uZSBJUHY0IEV0aCB0eXBlIGFuZCBJUHY0IHByb3RvY29sIHR5cGUgYXQgdGhlIHNhbWUgdGltZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2JtLCBwYXJzZV9rZXktPmV0aF90eXBlKTsKKyAgICAgICAgcmV0dXJuIE1WX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvKiBDb3VsZCBub3QgcGFyc2UgTm9uZSBJUHY2IEV0aCB0eXBlIGFuZCBJUHY0IHByb3RvY29sIHR5cGUgYXQgdGhlIHNhbWUgaW1lICovCisgICAgaWYgKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1RZUEUpICYmCisgICAgICAgICgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgxKSB8fAorICAgICAgICAgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMikgfHwgCisgICAgICAgICAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFKSkgJiYKKyAgICAgICAgKHBhcnNlX2tleS0+ZXRoX3R5cGUgIT0gTVZfQ1BIX0VUSF9UWVBFX0lQVjYpKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwYXJzZV9ibVsweCV4XSwgZXRoX3R5cGVbMHgleF0sIGRvZXMgbm90IHN1cHBvcnQgcGFyc2luZyBOb25lIElQdjYgRXRoIHR5cGUgYW5kIElQdjYgTkggb3IgSUNNUCB0eXBlIGF0IHRoZSBzYW1lIHRpbWVcbiIsCisgICAgICAgICAgICAgICAgICAgICBwYXJzZV9ibSwgcGFyc2Vfa2V5LT5ldGhfdHlwZSk7CisgICAgICAgIHJldHVybiBNVl9CQURfVkFMVUU7CisgICAgfSAgICAKKworICAgIC8qIENvdWxkIG5vdCBwYXJzZSBFdGggc3VidHlwZSBhbmQgSVB2NCB0aGUgc2FtZSB0aW1lICovCisgICAgaWYgKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1NVQlRZUEUpICYmCisgICAgICAgIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFKSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicGFyc2VfYm1bMHgleF0sIGRvZXMgbm90IHN1cHBvcnQgcGFyc2luZyBFdGggc3VidHlwZSBhbmQgSVB2NCB0eXBlIGF0IHRoZSBzYW1lIHRpbWUgXG4iLCBwYXJzZV9ibSk7CisgICAgICAgIHJldHVybiBNVl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLyogQ291bGQgbm90IHBhcnNlIEV0aCBzdWJ0eXBlIGFuZCBJUHY2IHRoZSBzYW1lIHRpbWUgKi8KKyAgICBpZiAoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfU1VCVFlQRSkgJiYKKyAgICAgICAgKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDEpIHx8CisgICAgICAgICAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgyKSB8fCAKKyAgICAgICAgIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUpKSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicGFyc2VfYm1bMHgleF0sIGRvZXMgbm90IHN1cHBvcnQgcGFyc2luZyBFdGggc3VidHlwZSBhbmQgSVB2NiB0eXBlIGF0IHRoZSBzYW1lIHRpbWUgXG4iLCBwYXJzZV9ibSk7CisgICAgICAgIHJldHVybiBNVl9CQURfVkFMVUU7CisgICAgfSAgICAKKworICAgIC8qIENvdWxkIG5vdCBwYXJzZSBJUHY0IGFuZCBJUHY2IGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICBpZiAoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY0X1RZUEUpICYmCisgICAgICAgICgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgxKSB8fAorICAgICAgICAgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMikgfHwgCisgICAgICAgICAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFKSkpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInBhcnNlX2JtWzB4JXhdLCBkb2VzIG5vdCBzdXBwb3J0IHBhcnNpbmcgSVB2NCBhbmQgSVB2NiB0eXBlIGF0IHRoZSBzYW1lIHRpbWVcbiIsIHBhcnNlX2JtKTsKKyAgICAgICAgcmV0dXJuIE1WX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvKiBWYWxpZGF0ZSBJR01QdjYgdHlwZSAqLworICAgIGlmICgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFKSAmJgorICAgICAgICAocGFyc2Vfa2V5LT5pY21wdjZfdHlwZSAhPSBNVl9JQ01QVjZfVFlQRV9NTEQpKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwYXJzZV9ibVsweCV4XSwgaWNtcHY2X3R5cGVbJWRdLCBjdXJyZW50bHkgb25seSBzdXBwb3J0IElDTVB2NiBNTEQgdHlwZVslZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICBwYXJzZV9ibSwgcGFyc2Vfa2V5LT5pY21wdjZfdHlwZSwgTVZfSUNNUFY2X1RZUEVfTUxEKTsKKyAgICAgICAgcmV0dXJuIE1WX0JBRF9WQUxVRTsKKyAgICB9ICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3ZhbGlkYXRlX21vZF9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSB0aGUgbW9kaWZpY2F0aW9uIGZpbGVkIG9mIENQSCBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF92YWxpZGF0ZV9tb2RfZmllbGQgKAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIC8qIENoZWNrIHRoZSByYW5nZSBvZiBtb2RfYm0gKi8KKyAgICBpZiAobW9kX2JtID49IENQSF9BUFBfTU9EX0ZJRUxEX0VORCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAibW9kX2JtWzB4JXhdIGlzIG91dCBvZiByYW5nZVsweDAxfjB4JXhdIFxuIiwgbW9kX2JtLCBDUEhfQVBQX01PRF9GSUVMRF9FTkQpOworICAgICAgICByZXR1cm4gTVZfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIC8qIERvZXMgbm90IHN1cHBvcnQgYWRkaW5nIEdNQUMgaW5mb3JtYXRpb24gYW5kIHN0cmlwIE1IIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICBpZiAoKG1vZF9ibSAmIENQSF9BUFBfUlhfTU9EX0FERF9HTUFDKSAmJgorICAgICAgICAobW9kX2JtICYgQ1BIX0FQUF9SWF9NT0RfU1RSSVBfTUgpKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJtb2RfYm1bMHgleF0sIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nIEdNQUMgaW5mb3JtYXRpb24gYW5kIHN0cmlwcGluZyBNSCBhdCB0aGUgc2FtZSB0aW1lIFxuIiwgbW9kX2JtKTsKKyAgICAgICAgcmV0dXJuIE1WX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF92YWxpZGF0ZV9mcndkX2ZpZWxkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFZhbGlkYXRlIHRoZSBmb3J3YXJkaW5nIGZpbGVkIG9mIENQSCBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3ZhbGlkYXRlX2Zyd2RfZmllbGQgKAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIC8qIENoZWNrIHRoZSByYW5nZSBvZiBmcndkX2JtICovCisgICAgaWYgKGZyd2RfYm0gPj0gQ1BIX0FQUF9GUldEX0ZJRUxEX0VORCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZnJ3ZF9ibVsweCV4XSBpcyBvdXQgb2YgcmFuZ2VbMHgwMX4weCV4XSBcbiIsIGZyd2RfYm0sIENQSF9BUFBfRlJXRF9GSUVMRF9FTkQpOworICAgICAgICByZXR1cm4gTVZfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2FkZF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEFkZCBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2FkZF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfdmFsaWRhdGVfcGFyc2VfZmllbGQocGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byB2YWxpZCBwYXJzaW5nIGZpZWxkIik7CisgICAgCisgICAgcmMgPSBjcGhfYXBwX3ZhbGlkYXRlX21vZF9maWVsZChtb2RfYm0sIG1vZF92YWx1ZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byB2YWxpZCBtb2RpZmljYXRpb24gZmllbGQiKTsKKworICAgIHJjID0gY3BoX2FwcF92YWxpZGF0ZV9mcndkX2ZpZWxkKGZyd2RfYm0sIGZyd2RfdmFsdWUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gdmFsaWQgZm9yd2FyZGluZyBmaWVsZCIpOworCisgICAgcmMgPSBjcGhfZGJfYWRkX2FwcF9ydWxlKHBhcnNlX2JtLCBwYXJzZV9rZXksIG1vZF9ibSwgbW9kX3ZhbHVlLCBmcndkX2JtLCBmcndkX3ZhbHVlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX2RiX2FkZF9hcHBfcnVsZSIpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfZGVsX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfZGVsX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF92YWxpZGF0ZV9wYXJzZV9maWVsZChwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIHZhbGlkIHBhcnNpbmcgZmllbGQiKTsKKyAgICAKKyAgICByYyA9IGNwaF9kYl9kZWxfYXBwX3J1bGUocGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9kYl9kZWxfYXBwX3J1bGUiKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3VwZGF0ZV9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFVwZGF0ZSBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3VwZGF0ZV9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfdmFsaWRhdGVfcGFyc2VfZmllbGQocGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byB2YWxpZCBwYXJzaW5nIGZpZWxkIik7CisgICAgCisgICAgcmMgPSBjcGhfYXBwX3ZhbGlkYXRlX21vZF9maWVsZChtb2RfYm0sIG1vZF92YWx1ZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byB2YWxpZCBtb2RpZmljYXRpb24gZmllbGQiKTsKKworICAgIHJjID0gY3BoX2FwcF92YWxpZGF0ZV9mcndkX2ZpZWxkKGZyd2RfYm0sIGZyd2RfdmFsdWUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gdmFsaWQgZm9yd2FyZGluZyBmaWVsZCIpOworCisgICAgcmMgPSBjcGhfZGJfdXBkYXRlX2FwcF9ydWxlKHBhcnNlX2JtLCBwYXJzZV9rZXksIG1vZF9ibSwgbW9kX3ZhbHVlLCBmcndkX2JtLCBmcndkX3ZhbHVlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX2RiX3VwZGF0ZV9hcHBfcnVsZSIpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfZ2V0X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfZ2V0X3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICptb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICpmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF92YWxpZGF0ZV9wYXJzZV9maWVsZChwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIHZhbGlkIHBhcnNpbmcgZmllbGQiKTsKKyAgICAKKyAgICByYyA9IGNwaF9kYl9nZXRfYXBwX3J1bGUocGFyc2VfYm0sIHBhcnNlX2tleSwgbW9kX2JtLCBtb2RfdmFsdWUsIGZyd2RfYm0sIGZyd2RfdmFsdWUpOworICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgImZhaWwgdG8gY2FsbCBjcGhfYXBwX2dldF9ydWxlXG4iKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2dldF9ydWxlX2J5X2Rpcl9wcm90bygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgQ1BIIHJ1bGUgYWNjb3JkaW5nIHRvIHByb3RvY29sIHR5cGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBkaXIgICAgICAgIC0gRGlyZWN0aW9uCisqICAgICAgIHByb3RvX3R5cGUgLSBTS0IgcHJvdG9jb2wgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2dldF9ydWxlX2J5X2Rpcl9wcm90byAoCisgICAgQ1BIX0RJUl9FICAgICAgICAgICAgICBkaXIsCisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICBwcm90b190eXBlLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSAqcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgICpwYXJzZV9rZXksCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgICptb2RfYm0sCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgICptb2RfdmFsdWUsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgICpmcndkX2JtLAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2RiX2dldF9hcHBfcnVsZV9ieV9kaXJfcHJvdG8oZGlyLCBwcm90b190eXBlLCBwYXJzZV9ibSwgcGFyc2Vfa2V5LCBtb2RfYm0sIG1vZF92YWx1ZSwgZnJ3ZF9ibSwgZnJ3ZF92YWx1ZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9kYl9nZXRfYXBwX3J1bGVfYnlfZGlyX3Byb3RvIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluY3JlYXNlIFJYIGNvdW50ZXIKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXIgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF92YWxpZGF0ZV9wYXJzZV9maWVsZChwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIHZhbGlkIHBhcnNpbmcgZmllbGQiKTsKKyAgICAKKyAgICByYyA9IGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyKHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfZGJfaW5jcmVhc2VfY291bnRlciIpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogIEluY3JlYXNlIFJYIGNvdW50ZXIgYWNjb3JkaW5nIHRvIHByb3RvY29sIHR5cGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBkaXIgICAgICAgIC0gRGlyZWN0aW9uCisqICAgICAgIHByb3RvX3R5cGUgLSBTS0IgcHJvdG9jb2wgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90byAoCisgICAgQ1BIX0RJUl9FIGRpciwKKyAgICBVSU5UMTYgICAgcHJvdG9fdHlwZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2RiX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvKGRpciwgcHJvdG9fdHlwZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90byIpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcGFyc2VfZ2VfcG9ydF90eXBlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBHRU1BQyBwb3J0IHR5cGUgYnkgcHJvZmlsZSBJRAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIHBvcnRfdHlwZSAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9wYXJzZV9nZV9wb3J0X3R5cGUgKAorICAgIENQSF9QT1JUX1NUQVRFX1QgICAgICAgICAgKnBvcnRfdHlwZSkKK3sKKyAgICB0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90ICBwcm9maWxlX2lkICA9IDA7CisgICAgTVZfQVBQX0dNQUNfUE9SVF9FICAgICAgICAgYWN0aXZlX3BvcnQgPSAwOworICAgIE1WX1NUQVRVUyAgICAgICAgICAgICAgICAgIHJjICAgICAgICAgID0gTVZfT0s7CisKKyAgICAvKiBHZXQgUHJvZmlsZSBJRCBhbmQgYWN0aXZlIFdBTiBwb3J0ICovCisgICAgY3BoX2RiX2dldF9wYXJhbShDUEhfREJfUEFSQU1fUFJPRklMRV9JRCwgICZwcm9maWxlX2lkKTsKKyAgICBjcGhfZGJfZ2V0X3BhcmFtKENQSF9EQl9QQVJBTV9BQ1RJVkVfUE9SVCwgJmFjdGl2ZV9wb3J0KTsKKworICAgIHN3aXRjaCAocHJvZmlsZV9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgVFBNX1BPTl9XQU5fRFVBTF9NQUNfSU5UX1NXSVRDSDoKKyAgICAgICAgY2FzZSBUUE1fUE9OX1dBTl9HMV9MQU5fRzBfSU5UX1NXSVRDSDogICAgICAgICAgICAKKyAgICAgICAgY2FzZSBUUE1fUE9OX1dBTl9EVUFMX01BQ19FWFRfU1dJVENIOiAgICAgICAgICAgIAorICAgICAgICBjYXNlIFRQTV9QT05fV0FOX0cwX0cxX0RVQUxfTEFOOiAgICAgICAgICAgIAorICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9MQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9MQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfdHlwZSAgPSBNVl9BUFBfUE9SVF9XQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF9zdGF0ZSA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFBNX1BPTl9XQU5fRzBfSU5UX1NXSVRDSDoKKyAgICAgICAgY2FzZSBUUE1fUE9OX1dBTl9HMF9TSU5HTEVfUE9SVDogICAgICAgICAgICAKKyAgICAgICAgY2FzZSBUUE1fUE9OX1dBTl9HMF9HMV9MUEJLOiAgICAgICAgICAgIAorICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9MQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0lOVkFMSUQ7ICAgICAgICAgICAgCisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF90eXBlICA9IE1WX0FQUF9QT1JUX1dBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3N0YXRlID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUUE1fRzBfV0FOX0cxX0lOVF9TV0lUQ0g6CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX1dBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX0xBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF9zdGF0ZSA9IE1WX0dFX1BPUlRfSU5WQUxJRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRQTV9HMV9XQU5fRzBfSU5UX1NXSVRDSDoKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfTEFOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfV0FOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3N0YXRlID0gTVZfR0VfUE9SVF9JTlZBTElEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFBNX1BPTl9HMV9XQU5fRzBfSU5UX1NXSVRDSDoKKyAgICAgICAgY2FzZSBUUE1fUE9OX0cxX1dBTl9HMF9TSU5HTEVfUE9SVDogICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfTEFOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfV0FOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfdHlwZSAgPSBNVl9BUFBfUE9SVF9XQU47CisKKyAgICAgICAgICAgIGlmIChhY3RpdmVfcG9ydCA9PSBNVl9BUFBfR01BQ19QT1JUXzEpIHsKKyAgICAgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3N0YXRlID0gTVZfR0VfUE9SVF9JTkFDVElWRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9JTkFDVElWRTsKKyAgICAgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF9zdGF0ZSA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFBNX1BPTl9HMF9XQU5fRzFfSU5UX1NXSVRDSDoKKyAgICAgICAgY2FzZSBUUE1fUE9OX0cwX1dBTl9HMV9TSU5HTEVfUE9SVDogICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfV0FOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9MQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfdHlwZSAgPSBNVl9BUFBfUE9SVF9XQU47CisKKyAgICAgICAgICAgIGlmIChhY3RpdmVfcG9ydCA9PSBNVl9BUFBfR01BQ19QT1JUXzApIHsKKyAgICAgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3N0YXRlID0gTVZfR0VfUE9SVF9JTkFDVElWRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9JTkFDVElWRTsKKyAgICAgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF9zdGF0ZSA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFBNX1BPTl9XQU5fRzFfTU5HX0VYVF9TV0lUQ0g6CisgICAgICAgIGNhc2UgVFBNX1BPTl9XQU5fRzFfU0lOR0xFX1BPUlQ6ICAgICAgICAgICAgCisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfSU5WQUxJRDsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfTEFOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3R5cGUgID0gTVZfQVBQX1BPUlRfV0FOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfc3RhdGUgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0lOVkFMSUQ7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfSU5WQUxJRDsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3N0YXRlID0gTVZfR0VfUE9SVF9JTlZBTElEOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcGFyc2VfcGVlcl9wb3J0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBwZWVyIEdFTUFDIHBvcnQKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgICAgICAtIE9yaWdpbmFsIHBvcnQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgcGVlcl9wb3J0ICAgLSBQZWVyIHBvcnQKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfcGFyc2VfcGVlcl9wb3J0ICgKKyAgICBJTlQzMiAgICBwb3J0LAorICAgIElOVDMyICAgKnBlZXJfcG9ydCkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgICBpZHggPSAwOworICAgIENQSF9QT1JUX1NUQVRFX1QgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUX05VTV07CisgICAgTVZfU1RBVFVTICAgICAgICAgcmMgID0gTVZfRkFJTDsKKworICAgIC8qIFZlcmlmeSBwb3J0ICovCisgICAgaWYgKHBvcnQgPiBNVl9BUFBfUE9OX01BQ19QT1JUICkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInBvcnRbJWRdIGlzIG91dCBvZiByYW5nZVswfiVkXSBcbiIsIHBvcnQsIE1WX0FQUF9QT05fTUFDX1BPUlQpOworICAgICAgICByZXR1cm4gTVZfT1VUX09GX1JBTkdFOworICAgIH0KKyAgICAKKyAgICAvKiBHZXQgcG9ydCB0eXBlICovCisgICAgcmMgPSBjcGhfYXBwX3BhcnNlX2dlX3BvcnRfdHlwZSgmcG9ydF90eXBlWzBdKTsKKworICAgIC8qIFNlYXJjaCBmb3IgcGVlciBwb3J0ICovCisgICAgaWYgKHBvcnRfdHlwZVtwb3J0XS5wb3J0X3R5cGUgPT0gTVZfQVBQX1BPUlRfTEFOKQorICAgIHsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBNVl9BUFBfR01BQ19QT1JUX05VTTsgaWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpZHggPT0gcG9ydCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICgocG9ydF90eXBlW2lkeF0ucG9ydF90eXBlICA9PSBNVl9BUFBfUE9SVF9XQU4pICYmCisgICAgICAgICAgICAgICAgKHBvcnRfdHlwZVtpZHhdLnBvcnRfc3RhdGUgPT0gTVZfR0VfUE9SVF9BQ1RJVkUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwZWVyX3BvcnQgPSBpZHg7CisgICAgICAgICAgICAgICAgcmMgID0gTVZfT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocG9ydF90eXBlW3BvcnRdLnBvcnRfdHlwZSA9PSBNVl9BUFBfUE9SVF9XQU4pCisgICAgeworICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBNVl9BUFBfR01BQ19QT1JUX05VTTsgaWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpZHggPT0gcG9ydCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChwb3J0X3R5cGVbaWR4XS5wb3J0X3R5cGUgID09IE1WX0FQUF9QT1JUX0xBTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcGVlcl9wb3J0ID0gaWR4OworICAgICAgICAgICAgICAgIHJjICA9IE1WX09LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgCisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcGFyc2VfZGlyKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFBhcnNlIGFwcGxpY2F0aW9uIHBhY2tldCB0byBvdXRwdXQgcGFyc2UgYml0bWFwIGFuZCB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgIC0gR0UgTUFDIHBvcnQKKyogICAgICAgcnggICAgLSBXaGV0aGVyIFJYIHBhdGgKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgUmV0dXJuIGRpcmVjdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDUEhfRElSX0UgY3BoX2FwcF9wYXJzZV9kaXIgKAorICAgIElOVDMyICAgIHBvcnQsCisgICAgQk9PTCAgICAgcngpCit7CisgICAgQ1BIX1BPUlRfU1RBVEVfVCBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF9OVU1dOworICAgIE1WX1NUQVRVUyAgICAgICAgcmMgID0gTVZfT0s7CisgICAgQ1BIX0RJUl9FICAgICAgICBkaXIgPSBDUEhfRElSX0lOVkFMSUQ7CisKKyAgICAvKiBQYXJzZSBwb3J0ICovCisgICAgaWYgKHBvcnQgPiBNVl9BUFBfUE9OX01BQ19QT1JUICkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInBvcnRbJWRdIGlzIG91dCBvZiByYW5nZVswfiVkXSBcbiIsIHBvcnQsIE1WX0FQUF9QT05fTUFDX1BPUlQpOworICAgICAgICByZXR1cm4gZGlyOworICAgIH0KKworICAgIC8qIEdldCBHTUFDIFdBTi9MQU4gdHlwZSAqLworICAgIHJjID0gY3BoX2FwcF9wYXJzZV9nZV9wb3J0X3R5cGUoJnBvcnRfdHlwZVswXSk7CisgICAgaWYgKHJjICE9IE1WX09LKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJmYWlsIHRvIGNhbGwgY3BoX2FwcF9wYXJzZV9nZV9wb3J0X3R5cGUoKSBcbiIpOworICAgICAgICByZXR1cm4gZGlyOworICAgIH0KKworICAgIC8qIFJ4IGRpciAqLworICAgIGlmIChyeCA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgaWYgKChwb3J0X3R5cGVbcG9ydF0ucG9ydF90eXBlICA9PSBNVl9BUFBfUE9SVF9XQU4pICYmCisgICAgICAgICAgICAocG9ydF90eXBlW3BvcnRdLnBvcnRfc3RhdGUgPT0gTVZfR0VfUE9SVF9BQ1RJVkUpKQorICAgICAgICAgICAgZGlyID0gQ1BIX0RJUl9EUzsKKyAgICAgICAgZWxzZSBpZiAoKHBvcnRfdHlwZVtwb3J0XS5wb3J0X3R5cGUgID09IE1WX0FQUF9QT1JUX0xBTikgJiYKKyAgICAgICAgICAgICAgICAgKHBvcnRfdHlwZVtwb3J0XS5wb3J0X3N0YXRlID09IE1WX0dFX1BPUlRfQUNUSVZFKSkKKyAgICAgICAgICAgIGRpciA9IENQSF9ESVJfVVM7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGlyID0gQ1BIX0RJUl9JTlZBTElEOworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJkaXJbJWRdIGlzIGludmFsaWQgXG4iLCBkaXIpOworICAgICAgICB9CisgICAgfQorICAgIC8qIFR4IGRpciAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICgocG9ydF90eXBlW3BvcnRdLnBvcnRfdHlwZSAgPT0gTVZfQVBQX1BPUlRfV0FOKSAmJgorICAgICAgICAgICAgKHBvcnRfdHlwZVtwb3J0XS5wb3J0X3N0YXRlID09IE1WX0dFX1BPUlRfQUNUSVZFKSkKKyAgICAgICAgICAgIGRpciA9IENQSF9ESVJfVVM7CisgICAgICAgIGVsc2UgaWYgKChwb3J0X3R5cGVbcG9ydF0ucG9ydF90eXBlICA9PSBNVl9BUFBfUE9SVF9MQU4pICYmCisgICAgICAgICAgICAgICAgIChwb3J0X3R5cGVbcG9ydF0ucG9ydF9zdGF0ZSA9PSBNVl9HRV9QT1JUX0FDVElWRSkpCisgICAgICAgICAgICBkaXIgPSBDUEhfRElSX0RTOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpciA9IENQSF9ESVJfSU5WQUxJRDsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZGlyWyVkXSBpcyBpbnZhbGlkIFxuIiwgZGlyKTsKKyAgICAgICAgfSAgICAKKyAgICB9CisKKyAgICByZXR1cm4gZGlyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcGFyc2VfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFBhcnNlIGFwcGxpY2F0aW9uIHBhY2tldCB0byBvdXRwdXQgcGFyc2UgYml0bWFwIGFuZCB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgICAgLSBHRSBNQUMgcG9ydAorKiAgICAgICBza2JfZGF0YSAgIC0gUG9pbnRlciB0byBTS0IgZGF0YSBob2xkaW5nIGFwcGxpY2F0aW9uIHBhY2tldAorKgorKiBPVVRQVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3BhcnNlX3BhY2tldCAoCisgICAgSU5UMzIgICAgICAgICAgICAgICAgICBwb3J0LAorICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAqc2tiX2RhdGEsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FICpwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgICpwYXJzZV9rZXkpCit7CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgZXRoX3R5cGUgICAgID0gMDsKKyAgICBzdHJ1Y3QgaXB2NmhkciAgICAgICAgICpwX2lwdjZfaGRyICAgPSBOVUxMOworICAgIHN0cnVjdCBpcHY2X2hvcG9wdF9oZHIgKnBfaG9wb3B0X2hkciA9IE5VTEw7CisgICAgc3RydWN0IGljbXA2aGRyICAgICAgICAqcF9pY21wX2hkciAgID0gTlVMTDsgICAgCisgICAgVUlOVDggICAgICAgICAgICAgICAgICAqcF9maWVsZCAgICAgID0gTlVMTDsKKyAgICBNVl9TVEFUVVMgICAgICAgICAgICAgICByYyAgICAgICAgICAgPSBNVl9PSzsKKworICAgICpwYXJzZV9ibSA9IDA7CisgICAgbWVtc2V0KHBhcnNlX2tleSwgMCwgc2l6ZW9mKENQSF9BUFBfUEFSU0VfVCkpOworCisgICAgLyogUGFyc2UgZGlyICovCisgICAgcGFyc2Vfa2V5LT5kaXIgPSBjcGhfYXBwX3BhcnNlX2Rpcihwb3J0LCBUUlVFKTsKKyAgICBpZihwYXJzZV9rZXktPmRpciA9PSBDUEhfRElSX0lOVkFMSUQpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImRpclslZF0gaXMgaW52YWxpZCBcbiIsIHBhcnNlX2tleS0+ZGlyKTsKKyAgICAgICAgcmV0dXJuIE1WX0JBRF9WQUxVRTsKKyAgICB9CisgICAgKnBhcnNlX2JtIHw9IENQSF9BUFBfUEFSU0VfRklFTERfRElSOworCisgICAgLyogUGFyc2UgUlgvVFggKi8KKyAgICBwYXJzZV9rZXktPnJ4X3R4ID0gQ1BIX0RJUl9SWDsKKyAgICAqcGFyc2VfYm0gfD0gQ1BIX0FQUF9QQVJTRV9GSUVMRF9SWF9UWDsKKyAgICAKKyAgICAvKiBQYXJzZSBNYXJ2ZWxsIGhlYWRlciAqLworICAgIGlmIChwYXJzZV9rZXktPmRpciA9PSBDUEhfRElSX1VTKQorICAgICAgICBwYXJzZV9rZXktPm1oID0gKG50b2hzKCooVUlOVDE2ICopc2tiX2RhdGEpICYgTVZfVkFMSURfTUhfTUFTSyk7CisgICAgZWxzZQorICAgICAgICBwYXJzZV9rZXktPm1oID0gKG50b2hzKCooVUlOVDE2ICopc2tiX2RhdGEpICYgTVZfVkFMSURfR0hfTUFTSyk7CisgICAgKnBhcnNlX2JtICAgIHw9IENQSF9BUFBfUEFSU0VfRklFTERfTUg7CisgICAgCisgICAgLyogUGFyc2UgRXRoIHR5cGUgKi8KKyAgICBwX2ZpZWxkICA9IHNrYl9kYXRhICsgTVZfRVRIX01IX1NJWkUgKyBFVEhfQUxFTiArIEVUSF9BTEVOOworICAgIGV0aF90eXBlID0gbnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKTsKKyAgICB3aGlsZSAoZXRoX3R5cGUgPT0gTVZfVFBJRF84MTAwIHx8IGV0aF90eXBlID09IE1WX1RQSURfODhBOCB8fCBldGhfdHlwZSA9PSBNVl9UUElEXzkxMDApIHsKKyAgICAgICAgcF9maWVsZCArPSBWTEFOX0hMRU47CisgICAgICAgIGV0aF90eXBlID0gbnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKTsKKyAgICB9CisgICAgcGFyc2Vfa2V5LT5ldGhfdHlwZSA9IGV0aF90eXBlOworICAgICpwYXJzZV9ibSB8PSBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9UWVBFOworCisgICAgLyogUGFyc2UgSVB2NCB0eXBlICovCisgICAgaWYgKGV0aF90eXBlID09IEVUSF9QX0lQKSB7CisgICAgICAgIHBfZmllbGQgKz0gTVZfQ1BIX0VUSF9UWVBFX0xFTjsKKyAgICAgICAgcF9maWVsZCArPSBNVl9JUFY0X1BST1RPX09GRlNFVDsKKyAgICAgICAgcGFyc2Vfa2V5LT5pcHY0X3R5cGUgPSAqKFVJTlQ4ICopcF9maWVsZDsKKyAgICAgICAgKnBhcnNlX2JtIHw9IENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFOworICAgIH0KKyAgICAvKiBQYXJzZSBJUHY2IHR5cGUgKi8KKyAgICBlbHNlIGlmIChldGhfdHlwZSA9PSBFVEhfUF9JUFY2KSB7CisgICAgICAgIAorICAgICAgICBwX2lwdjZfaGRyID0gKHN0cnVjdCBpcHY2aGRyICopKHBfZmllbGQgKyBNVl9DUEhfRVRIX1RZUEVfTEVOKTsKKyAgICAgICAgcGFyc2Vfa2V5LT5pcHY2X25oMSA9IHBfaXB2Nl9oZHItPm5leHRoZHI7CisgICAgICAgICpwYXJzZV9ibSB8PSBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgxOworCisgICAgICAgIGlmIChwX2lwdjZfaGRyLT5uZXh0aGRyICE9IE5FWFRIRFJfSE9QKQorICAgICAgICAgIHJldHVybiByYzsKKworICAgICAgICBwX2hvcG9wdF9oZHIgPSAoc3RydWN0IGlwdjZfaG9wb3B0X2hkciAqKSgoVUlOVDggKilwX2lwdjZfaGRyICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisKKyAgICAgICAgcGFyc2Vfa2V5LT5pcHY2X25oMiA9IHBfaG9wb3B0X2hkci0+bmV4dGhkcjsKKyAgICAgICAgKnBhcnNlX2JtIHw9IENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDI7CisKKyAgICAgICAgaWYgKHBfaG9wb3B0X2hkci0+bmV4dGhkciAhPSBJUFBST1RPX0lDTVBWNikKKyAgICAgICAgICAgIHJldHVybiByYzsKKworICAgICAgICBwX2ljbXBfaGRyID0gIChzdHJ1Y3QgaWNtcDZoZHIgKikoKFVJTlQ4ICopcF9ob3BvcHRfaGRyICsgaXB2Nl9vcHRsZW4ocF9ob3BvcHRfaGRyKSk7CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKHBfaWNtcF9oZHItPmljbXA2X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSUNNUFY2X01HTV9RVUVSWToKKyAgICAgICAgICAgIGNhc2UgSUNNUFY2X01HTV9SRVBPUlQ6CisgICAgICAgICAgICBjYXNlIElDTVBWNl9NR01fUkVEVUNUSU9OOgorICAgICAgICAgICAgY2FzZSBJQ01QVjZfTUxEMl9SRVBPUlQ6CisgICAgICAgICAgICAgICAgcGFyc2Vfa2V5LT5pY21wdjZfdHlwZSA9IE1WX0lDTVBWNl9UWVBFX01MRDsKKyAgICAgICAgICAgICAgICAqcGFyc2VfYm0gfD0gQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0KKyAgICAvKiBQYXJzZSBFdGhlbmV0IHN1YnR5cGUgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgcGFyc2Vfa2V5LT5ldGhfc3VidHlwZSA9ICgqKFVJTlQ4ICopKHBfZmllbGQgKyBNVl9DUEhfRVRIX1RZUEVfTEVOKSk7CisgICAgICAgICpwYXJzZV9ibSB8PSBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9TVUJUWVBFOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9tb2RfcnhfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IE1vZGlmeSBSWCBhcHBsaWNhdGlvbiBwYWNrZXQKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIGRldiAgICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgc2tiICAgICAgIC0gU0tCIGJ1ZmZlciB0byByZWNlaXZlIHBhY2tldAorKiAgICAgICByeF9kZXNjICAgLSBSWCBkZXNjcmlwdG9yCisqICAgICAgIG1vZF9ibSAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX21vZF9yeF9wYWNrZXQgKCAgCisgICAgSU5UMzIgICAgICAgICAgICAgICAgcG9ydCwKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYsCisgICAgc3RydWN0IHNrX2J1ZmYgICAgICAqc2tiLAorICAgIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MsCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICptb2RfdmFsdWUpCit7CisgICAgVUlOVDggICAgICpwX2RhdGEgPSBOVUxMOworICAgIE1WX1NUQVRVUyAgcmMgICAgID0gTVZfT0s7CisKKyAgICAvKiBTYXZlIEdNQUMgSW5mb3JtYXRpb24gKi8gICAgCisgICAgaWYgKG1vZF9ibSAmIENQSF9BUFBfUlhfTU9EX0FERF9HTUFDKQorICAgIHsKKyAgICAgICAgcF9kYXRhICAgICA9IChVSU5UOCAqKXNrYi0+ZGF0YTsKKyAgICAgICAgcF9kYXRhWzBdICY9IDB4MEY7CisgICAgICAgIHBfZGF0YVswXSB8PSAoKHBvcnQgJiAweDBGKSA8PCA0KTsKKyAgICB9CisKKyAgICAvKiBSZXBsYWNlIHByb3RvY29sIHR5cGUgKi8KKyAgICBza2ItPnRhaWwgICAgKz0gcnhfZGVzYy0+ZGF0YVNpemU7CisgICAgc2tiLT5sZW4gICAgICA9IHJ4X2Rlc2MtPmRhdGFTaXplOworCisgICAgaWYgKG1vZF9ibSAmIENQSF9BUFBfUlhfTU9EX1NUUklQX01IKQorICAgIHsKKworICAgICAgICBza2ItPmRhdGEgKz0gTVZfRVRIX01IX1NJWkU7CisgICAgICAgIHNrYi0+dGFpbCAtPSBNVl9FVEhfTUhfU0laRTsKKyAgICAgICAgc2tiLT5sZW4gIC09IE1WX0VUSF9NSF9TSVpFOworICAgIH0gCisgICAgCisgICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyAgICBpZiAobW9kX2JtICYgQ1BIX0FQUF9SWF9NT0RfUkVQTEFDRV9QUk9UT19UWVBFKQorICAgIHsKKyAgICAgICAgc2tiLT5wcm90b2NvbCA9IG1vZF92YWx1ZS0+cHJvdG9fdHlwZTsKKyAgICB9ICAgIAorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbW9kX3R4X3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBNb2RpZnkgVFggYXBwbGljYXRpb24gcGFja2V0CisqCisqIElOUFVUUzoKKyogICAgICAgc2tiICAgICAgICAgLSBQb2ludGVyIHRvIFNLQiBkYXRhIGhvZGluZyBhcHBsaWNhdGlvbiBwYWNrZXQKKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqICAgICAgIG1vZF9ibSAgICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9tb2RfdHhfcGFja2V0ICgKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgKnNrYiwKKyAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0LAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAgKm1vZF92YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIGlmIChtb2RfYm0gJiBDUEhfQVBQX1RYX01PRF9BRERfTUhfQllfRFJJVkVSKQorICAgIHsKKyAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzIHw9IE1WX0VUSF9GX01IOworICAgIH0gCisKKyAgICBpZiAobW9kX2JtICYgQ1BIX0FQUF9UWF9NT0RfTk9fUEFEKQorICAgIHsKKyAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzIHw9IE1WX0VUSF9GX05PX1BBRDsKKyAgICB9IAorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfc2V0X2Zyd2QoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0IHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uCisqCisqIElOUFVUUzoKKyogICAgICAgc2tiICAgICAgICAgLSBQb2ludGVyIHRvIFNLQiBkYXRhIGhvZGluZyBhcHBsaWNhdGlvbiBwYWNrZXQKKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqICAgICAgIGZyd2RfYm0gICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3NldF9mcndkICgKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgKnNrYiwKKyAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0LAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgICpmcndkX3ZhbHVlKSAKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIGlmIChmcndkX2JtICYgQ1BIX0FQUF9GUldEX1NFVF9UUkdfUE9SVCkKKyAgICB7CisgICAgICAgdHhfc3BlY19vdXQtPnR4cCA9IGZyd2RfdmFsdWUtPnRyZ19wb3J0OworICAgIH0gCisKKyAgICBpZiAoZnJ3ZF9ibSAmIENQSF9BUFBfRlJXRF9TRVRfVFJHX1FVRVVFKQorICAgIHsKKyAgICAgICB0eF9zcGVjX291dC0+dHhxID0gZnJ3ZF92YWx1ZS0+dHJnX3F1ZXVlOworICAgIH0gCisKKyAgICBpZiAoZnJ3ZF9ibSAmIENQSF9BUFBfRlJXRF9TRVRfR0VNX1BPUlQpCisgICAgeworICAgICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gKChmcndkX3ZhbHVlLT5nZW1fcG9ydCA8PCA4KXwweDAwMTApOworICAgIH0KKworICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3J4X2JjKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENQSCBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlY2VpdmVkIGJyb2FkY2FzdCBwYWNrZXRzIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIGRldiAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHBrdCAgICAgLSBNYXJ2ZWxsIHBhY2tldCBpbmZvcm1hdGlvbgorKiAgICAgICByeF9kZXNjIC0gUlggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyAwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9hcHBfcnhfYmMoSU5UMzIgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aF9wYnVmICpwa3QsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCit7CisgICAgQ1BIX0ZMT1dfRU5UUllfVCAgICAgIGZsb3dfcnVsZTsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgcGVlcl9wb3J0ID0gMDsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgcnhfc2l6ZSAgID0gMDsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgb2Zmc2V0ICAgID0gMDsKKyAgICBCT09MICAgICAgICAgICAgICAgICAgc3RhdGUgICAgID0gRkFMU0U7CisgICAgc3RydWN0IHNrX2J1ZmYgICAgICAgKnNrYl9vbGQgICA9IE5VTEw7CisgICAgc3RydWN0IHNrX2J1ZmYgICAgICAgKnNrYl9uZXcgICA9IE5VTEw7CisgICAgTVZfU1RBVFVTICAgICAgICAgICAgIHJjICAgICAgICA9IE1WX09LOworICAgIAorICAgIC8qIENoZWNrIHdoZXRoZXIgbmVlZCB0byBoYW5kbGUgYnJvYWRjYXN0IHBhY2tldCAqLworICAgIGNwaF9kYl9nZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0JDX1NVUFBPUlQsICZzdGF0ZSk7CisgICAgaWYgKHN0YXRlID09IEZBTFNFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIFBhcnNlIHBhY2tldHMgKi8KKyAgICBza2Jfb2xkID0gKHN0cnVjdCBza19idWZmICopKHBrdC0+b3NJbmZvKTsKKyAgICBza2JfbmV3ID0gKHN0cnVjdCBza19idWZmICopKHBrdC0+b3NJbmZvKTsKKyAgICByYyA9IGNwaF9mbG93X3BhcnNlX3BhY2tldChwb3J0LCBza2Jfb2xkLT5kYXRhLCBUUlVFLCBUUlVFLCAmZmxvd19ydWxlKTsKKyAgICBpZiAocmMgIT0gTVZfT0spCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImZhaWwgdG8gY2FsbCBjcGhfZmxvd19wYXJzZV9wYWNrZXQsIHJjPCVkPiBcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogVS9TICovCisgICAgaWYoZmxvd19ydWxlLmRpciA9PSBDUEhfRElSX1VTKQorICAgIHsgIAorICAgICAgICAvKiBDb3B5IGEgbmV3IFNLQiAqLworICAgICAgICBza2Jfb2xkLT50YWlsICs9IHJ4X2Rlc2MtPmRhdGFTaXplOworICAgICAgICBza2Jfb2xkLT5sZW4gICA9IHJ4X2Rlc2MtPmRhdGFTaXplOworICAgICAgICBza2JfbmV3ID0gc2tiX2NvcHkoc2tiX29sZCwgR0ZQX0FUT01JQyk7CisgICAgICAgIGlmKHNrYl9uZXcgPT0gTlVMTCkKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgc2tiX25ldyA9IHNrYl9vbGQ7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogRm9yd2FyZCBwYWNrZXQgdG8gcGVlciBwb3J0ICovCisgICAgICAgIHJjID0gY3BoX2FwcF9wYXJzZV9wZWVyX3BvcnQocG9ydCwgJnBlZXJfcG9ydCk7CisgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJmYWlsIHRvIGNhbGwgY3BoX2FwcF9wYXJzZV9wZWVyX3BvcnQsIHJjPCVkPiBcbiIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyogRm9yd2FyZCBwYWNrZXQgKi8KKyAgICAgICAgbXZfbmV0X2RldnNbcGVlcl9wb3J0XS0+bmV0ZGV2X29wcy0+bmRvX3N0YXJ0X3htaXQoc2tiX29sZCwgbXZfbmV0X2RldnNbcGVlcl9wb3J0XSk7ICAgICAgCisgICAgfQorb3V0OgorICAgIC8qIFN0cmlwZSBWTEFOIHRhZywgdGhlbiBzZW5kIHRvIExpbnV4IG5ldHdvcmsgc3RhY2sgKi8KKyAgICBvZmZzZXQgICAgICAgICA9IGNwaF9mbG93X3N0cmlwX3ZsYW4oVFJVRSwgc2tiX25ldy0+ZGF0YSk7CisgICAgc2tiX25ldy0+ZGF0YSArPSBvZmZzZXQ7CisgICAgcnhfc2l6ZSAgICAgICAtPSBvZmZzZXQ7CisKKyAgICAvKiBTdHJpcCBNSCAqLworICAgIHNrYl9uZXctPmRhdGEgKz0gTVZfRVRIX01IX1NJWkU7CisgICAgb2Zmc2V0ICAgICAgICArPSBNVl9FVEhfTUhfU0laRTsKKworICAgIHNrYl9uZXctPnRhaWwgICAgLT0gb2Zmc2V0OworICAgIHNrYl9uZXctPmxlbiAgICAgLT0gb2Zmc2V0OworICAgIHNrYl9uZXctPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiX25ldywgZGV2KTsKKworICAgIGNwaF9yZWNfc2tiKHBvcnQsIHNrYl9uZXcpOworCisgICAgcmV0dXJuIDE7ICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbG9va3VwX3Byb2ZpbGVfaWQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpsb29rdXAgcHJvZmlsZSBJRCBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9hcHBfbG9va3VwX3Byb2ZpbGVfaWQoSU5UMzIgZW51bV92YWx1ZSkKK3sKKyAgICByZXR1cm4gbXR5cGVfbG9va3VwX2VudW1fc3RyKCZnX2VudW1fYXJyYXlfcHJvZmlsZV9pZCwgZW51bV92YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9sb29rdXBfcG9uX3R5cGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpsb29rdXAgUE9OIHR5cGUgc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfYXBwX2xvb2t1cF9wb25fdHlwZShJTlQzMiBlbnVtX3ZhbHVlKQoreworICAgIHJldHVybiBtdHlwZV9sb29rdXBfZW51bV9zdHIoJmdfZW51bV9hcnJheV9wb25fdHlwZSwgZW51bV92YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9sb29rdXBfZGlyKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIGRpcmVjdGlvbiBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9hcHBfbG9va3VwX2RpcihJTlQzMiBlbnVtX3ZhbHVlKQoreworICAgIHJldHVybiBtdHlwZV9sb29rdXBfZW51bV9zdHIoJmdfZW51bV9hcnJheV9kaXIsIGVudW1fdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbG9va3VwX3J4X3R4KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIFJYL1RYIGRpcmVjdGlvbiBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9hcHBfbG9va3VwX3J4X3R4KElOVDMyIGVudW1fdmFsdWUpCit7CisgICAgcmV0dXJuIG10eXBlX2xvb2t1cF9lbnVtX3N0cigmZ19lbnVtX2FycmF5X3J4X3R4LCBlbnVtX3ZhbHVlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2xvb2t1cF9nbWFjKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIEdNQUMgc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfYXBwX2xvb2t1cF9nbWFjKElOVDMyIGVudW1fdmFsdWUpCit7CisgICAgcmV0dXJuIG10eXBlX2xvb2t1cF9lbnVtX3N0cigmZ19lbnVtX2FycmF5X2dtYWMsIGVudW1fdmFsdWUpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemVzIENQSCBhcHBsaWNhdGlvbiBtb2R1bGUuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9hcHBfaW5pdChWT0lEKQoreworICAgIAorICAgIGNwaF9kYl9pbml0KCk7CisgICAgCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9zZXRfdHJhY2VfZmxhZygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOnNldHMgY3BoIHRyYWNlIGZsYWcuCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX3NldF90cmFjZV9mbGFnKFVJTlQzMiBmbGFnKQoreworICAgIGdfY3BoX2dsb2JhbF90cmFjZSA9IGZsYWc7CisgICAgCisgICAgcmV0dXJuIE1WX09LOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwcC5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4YTAzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBwLmgKQEAgLTAsMCArMSw3NzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfYXBwLmgKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgYXBwbGljYXRpb24gbW9kdWxlIHRvIGltcGxlbWVudAorKiAgICAgICAgICAgICAgQ1BIIG1haW4gbG9naWMgYW5kIGhhbmRsZSBhcHBsaWNhdGlvbiBwYWNrZXRzIHN1Y2ggYXMgT01DSSwgZU9BTSwgCisqICAgICAgICAgICAgICBJR01QIHBhY2tldHMuCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX01WX0NQSF9BUFBfSF8KKyNkZWZpbmUgX01WX0NQSF9BUFBfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFR5cGUgRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVZfVkFMSURfTUhfTUFTSyAgMHgwMDdGICAvKiBWYWxpZCBNSCBmaWxlZCBpbiBDUEggKi8KKyNkZWZpbmUgTVZfVkFMSURfR0hfTUFTSyAgMHgwRkZGICAvKiBWYWxpZCBNSCBmaWxlZCBpbiBDUEggKi8KKworCisvKiBDUEggYXBwbGljYXRpb24gcGFja2V0cyBwYXJzaW5nIGZpZWxkIGRlZmluaXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0RJUiAgICAgICAgICA9IDB4MSwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX1JYX1RYICAgICAgICA9IDB4MiwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX01IICAgICAgICAgICA9IDB4NCwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9UWVBFICAgICA9IDB4OCwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9TVUJUWVBFICA9IDB4MTAsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY0X1RZUEUgICAgPSAweDIwLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDEgICAgID0gMHg0MCwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgyICAgICA9IDB4ODAsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRSAgPSAweDEwMCwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VORCAgICAgICAgICA9IDB4MjAwCit9IENQSF9BUFBfUEFSU0VfRklFTERfRTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX0RJUl9VUyAgICAgICA9IDAsCisgICAgQ1BIX0RJUl9EUyAgICAgICA9IDEsCisgICAgQ1BIX0RJUl9OT1RfQ0FSRSA9IDIsCisgICAgQ1BIX0RJUl9OVU0gICAgICA9IDIsCisgICAgQ1BIX0RJUl9JTlZBTElEICA9IDMKK30gQ1BIX0RJUl9FOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfRElSX1JYICAgICAgICAgPSAwLAorICAgIENQSF9ESVJfVFggICAgICAgICA9IDEsCisgICAgQ1BIX1JYX1RYX05PVF9DQVJFID0gMiwKK30gQ1BIX1JYX1RYX0U7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ1BIX0RJUl9FICAgZGlyOworICAgIENQSF9SWF9UWF9FIHJ4X3R4OworICAgIFVJTlQxNiAgICAgIG1oOworICAgIFVJTlQxNiAgICAgIGV0aF90eXBlOworICAgIFVJTlQ4ICAgICAgIGV0aF9zdWJ0eXBlOworICAgIFVJTlQ4ICAgICAgIGlwdjRfdHlwZTsKKyAgICBVSU5UOCAgICAgICBpcHY2X25oMTsKKyAgICBVSU5UOCAgICAgICBpcHY2X25oMjsKKyAgICBVSU5UMzIgICAgICBpY21wdjZfdHlwZTsKK30gQ1BIX0FQUF9QQVJTRV9UOworCisvKiBDUEggYXBwbGljYXRpb24gcGFja2V0cyBtb2RpZmljYXRpb24gZmllbGQgZGVmaW5pdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAgIENQSF9BUFBfUlhfTU9EX0FERF9HTUFDICAgICAgICAgICA9IDB4MSwKKyAgICBDUEhfQVBQX1JYX01PRF9SRVBMQUNFX1BST1RPX1RZUEUgPSAweDIsCisgICAgQ1BIX0FQUF9SWF9NT0RfU1RSSVBfTUggICAgICAgICAgID0gMHg0LAorICAgIENQSF9BUFBfVFhfTU9EX0FERF9NSF9CWV9EUklWRVIgICA9IDB4OCwKKyAgICBDUEhfQVBQX1RYX01PRF9OT19QQUQgICAgICAgICAgICAgPSAweDEwLAorICAgIENQSF9BUFBfTU9EX0NIQU5HRV9TVEFURSAgICAgICAgICA9IDB4MjAsCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRU5EICAgICAgICAgICAgID0gMHg0MAorfSBDUEhfQVBQX01PRF9GSUVMRF9FOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQxNiAgIHByb3RvX3R5cGU7CisgICAgQk9PTCAgICAgc3RhdGU7Cit9IENQSF9BUFBfTU9EX1Q7CisKKy8qIENQSCBhcHBsaWNhdGlvbiBwYWNrZXRzIGZvcndhcmRpbmcgZmllbGQgZGVmaW5pdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAgIENQSF9BUFBfRlJXRF9TRVRfVFJHX1BPUlQgICAgID0gMHgxLAorICAgIENQSF9BUFBfRlJXRF9TRVRfVFJHX1FVRVVFICAgID0gMHgyLAorICAgIENQSF9BUFBfRlJXRF9TRVRfR0VNX1BPUlQgICAgID0gMHg0LAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FTkQgICAgICAgID0gMHg4Cit9IENQSF9BUFBfRlJXRF9GSUVMRF9FOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQ4ICAgdHJnX3BvcnQ7CisgICAgVUlOVDggICB0cmdfcXVldWU7CisgICAgVUlOVDE2ICBnZW1fcG9ydDsKK30gQ1BIX0FQUF9GUldEX1Q7CisKKy8qIFRQTSBjb25uZWN0aW9uIHByb2ZpbGUgZGVmaW5pdGlvbiBmcm9tICJ0cG1fdHlwZXMuaCIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0geworICAgIFRQTV9QT05fV0FOX0RVQUxfTUFDX0lOVF9TV0lUQ0ggPSAxLAorICAgIFRQTV9QT05fV0FOX0cwX0lOVF9TV0lUQ0gsCisgICAgVFBNX1BPTl9XQU5fRzFfTEFOX0cwX0lOVF9TV0lUQ0gsCisgICAgVFBNX0cwX1dBTl9HMV9JTlRfU1dJVENILAorICAgIFRQTV9HMV9XQU5fRzBfSU5UX1NXSVRDSCwKKyAgICBUUE1fUE9OX0cxX1dBTl9HMF9JTlRfU1dJVENILAorICAgIFRQTV9QT05fRzBfV0FOX0cxX0lOVF9TV0lUQ0gsCisgICAgVFBNX1BPTl9XQU5fRFVBTF9NQUNfRVhUX1NXSVRDSCwKKyAgICBUUE1fUE9OX1dBTl9HMV9NTkdfRVhUX1NXSVRDSCwKKyAgICBUUE1fUE9OX1dBTl9HMF9TSU5HTEVfUE9SVCwKKyAgICBUUE1fUE9OX1dBTl9HMV9TSU5HTEVfUE9SVCwKKyAgICBUUE1fUE9OX0cxX1dBTl9HMF9TSU5HTEVfUE9SVCwKKyAgICBUUE1fUE9OX0cwX1dBTl9HMV9TSU5HTEVfUE9SVCwKKyAgICBUUE1fUE9OX1dBTl9HMF9HMV9MUEJLLAorICAgIFRQTV9QT05fV0FOX0cwX0cxX0RVQUxfTEFOCit9IHRwbV9ldGhfY29tcGxleF9wcm9maWxlX3Q7CisKKy8qIFBPTiB0eXBlIGRlZmluaXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfUE9OX1RZUEVfRVBPTiA9IDAsCisgICAgQ1BIX1BPTl9UWVBFX0dQT04sCisgICAgQ1BIX1BPTl9UWVBFX0dCRSwKKyAgICBDUEhfUE9OX1RZUEVfUDJQLAorICAgIENQSF9QT05fVFlQRV9NQVgKK30gQ1BIX1BPTl9UWVBFX0U7CisKKworLyogQ1BIIGZlYXR1cmUgZmxhZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAgIENQSF9BUFBfRkVBVFVSRV9BUFAgPSAwLAorICAgIENQSF9BUFBfRkVBVFVSRV9JR01QLAorICAgIENQSF9BUFBfRkVBVFVSRV9CQywKKyAgICBDUEhfQVBQX0ZFQVRVUkVfRkxPVywKKyAgICBDUEhfQVBQX0ZFQVRVUkVfVURQLAorfSBDUEhfQVBQX0ZFQVRVUkVfRTsKKworCisvKiBDUEggcGFyc2UvbW9kaWZpY2F0aW9uIGZpZWxkIGRlZmluaXRpb24gZm9yIGJjL2lnbXAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDUEhfRElSX0UgICAgICBkaXI7ICAgCisgICAgVUlOVDMyICAgICAgICAgc3JjX3BvcnQ7CisgICAgVUlOVDE2ICAgICAgICAgdmlkOworICAgIFVJTlQ4ICAgICAgICAgIHBiaXRzOworICAgIFVJTlQ4ICAgICAgICAgIGRzY3A7Cit9IENQSF9QQUNLRVRfUEFSU0VfVDsKKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIENQSF9ESVJfRSAgICAgIGRpcjsgICAKKyAgICBVSU5UMzIgICAgICAgICBzcmNfcG9ydDsKKyAgICBVSU5UMTYgICAgICAgICB2aWQ7CisgICAgVUlOVDggICAgICAgICAgcGJpdHM7CisgICAgVUlOVDggICAgICAgICAgZHNjcDsKK30gQ1BIX1BBQ0tFVF9NT0RfVDsKKworLyogR01BQyBwb3J0IHN0YXRlIGRlZmluaXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgIE1WX0FQUF9QT1JUX1RZUEVfRSAgIHBvcnRfdHlwZTsKKyAgICBNVl9HRV9QT1JUX1NUQVRFX0UgICBwb3J0X3N0YXRlOworfSBDUEhfUE9SVF9TVEFURV9UOworCisvKiBEZWJ1ZyByZWxhdGVkIGRlZmluaXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gVUlOVDMyIGdfY3BoX2dsb2JhbF90cmFjZTsKKworI2RlZmluZSBDUEhfR0xPQkFMX1RSQUNFIGdfY3BoX2dsb2JhbF90cmFjZQorI2RlZmluZSBDUEhfREVCVUdfTEVWRUwgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ1BIX0lORk9fTEVWRUwgICAweDAwMDAwMDAyCisjZGVmaW5lIENQSF9XQVJOX0xFVkVMICAgMHgwMDAwMDAwNAorI2RlZmluZSBDUEhfRVJSX0xFVkVMICAgIDB4MDAwMDAwMDgKKworI2RlZmluZSBNVl9DUEhfUFJJTlQobGV2ZWwsIGZvcm1hdCwgLi4uKSBcCisgICAgeyBcCisgICAgICAgIGlmIChsZXZlbCAmIENQSF9HTE9CQUxfVFJBQ0UpIFwKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzKGxpbmU6JWQpICJmb3JtYXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pOyBcCisgICAgfQorCisjZGVmaW5lIE1WX0NQSF9DTEVBTl9QUklOVChsZXZlbCwgZm9ybWF0LCAuLi4pIFwKKyAgICB7IFwKKyAgICAgICAgaWYgKGxldmVsICYgQ1BIX0dMT0JBTF9UUkFDRSkgXAorICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyBmb3JtYXQsICMjX19WQV9BUkdTX18pOyBcCisgICAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9zZXRfY29tcGxleF9wcm9maWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldCBUUE0gY29tcGxleCBwcm9maWxlIElEIAorKgorKiBJTlBVVFM6CisqICAgICAgIHByb2ZpbGVfaWQgICAtIFRQTSBjb21wbGV4IHByb2ZpbGUgSUQKKyogICAgICAgYWN0aXZlX3BvcnQgIC0gQWN0aXZlIFdBTiBwb3J0CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3NldF9jb21wbGV4X3Byb2ZpbGUgKHRwbV9ldGhfY29tcGxleF9wcm9maWxlX3QgcHJvZmlsZV9pZCwgTVZfQVBQX0dNQUNfUE9SVF9FIGFjdGl2ZV9wb3J0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3NldF9mZWF0dXJlX2ZsYWcoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRW5hYmxlIG9yIGRpc2FibGUgZmVhdHVyZSBzdXBwb3J0IGluIENQSCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBmZWF0dXJlIC0gQ1BIIHN1cHBvcnRlZCBmZWF0dXJlcworKiAgICAgICBzdGF0ZSAgIC0gRW5hYmxlIG9yIGRpc2FibGUgdGhpcyBmZWF0dXJlIGluIENQSAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9zZXRfZmVhdHVyZV9mbGFnIChDUEhfQVBQX0ZFQVRVUkVfRSBmZWF0dXJlLCBCT09MIHN0YXRlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2FkZF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEFkZCBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2FkZF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfZGVsX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfZGVsX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF91cGRhdGVfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBVcGRhdGUgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF91cGRhdGVfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2dldF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2dldF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAqbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAqZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfZ2V0X3J1bGVfYnlfZGlyX3Byb3RvKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBDUEggcnVsZSBhY2NvcmRpbmcgdG8gcHJvdG9jb2wgdHlwZQorKgorKiBJTlBVVFM6CisqICAgICAgIGRpciAgICAgICAgLSBEaXJlY3Rpb24KKyogICAgICAgcHJvdG9fdHlwZSAtIFNLQiBwcm90b2NvbCB0eXBlCisqCisqIE9VVFBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfZ2V0X3J1bGVfYnlfZGlyX3Byb3RvICgKKyAgICBDUEhfRElSX0UgICAgICAgICAgICAgIGRpciwKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgIHByb3RvX3R5cGUsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FICpwYXJzZV9ibSwKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAgKnBhcnNlX2tleSwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgKm1vZF9ibSwKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAgKm1vZF92YWx1ZSwKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgKmZyd2RfYm0sCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXIoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5jcmVhc2UgUlggY291bnRlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfaW5jcmVhc2VfY291bnRlciAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046ICBJbmNyZWFzZSBSWCBjb3VudGVyIGFjY29yZGluZyB0byBwcm90b2NvbCB0eXBlCisqCisqIElOUFVUUzoKKyogICAgICAgZGlyICAgICAgICAtIERpcmVjdGlvbgorKiAgICAgICBwcm90b190eXBlIC0gU0tCIHByb3RvY29sIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8gKAorICAgIENQSF9ESVJfRSBkaXIsCisgICAgVUlOVDE2ICAgIHByb3RvX3R5cGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcGFyc2VfZ2VfcG9ydF90eXBlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBHRU1BQyBwb3J0IHR5cGUgYnkgcHJvZmlsZSBJRAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIHBvcnRfdHlwZSAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9wYXJzZV9nZV9wb3J0X3R5cGUgKAorICAgIENQSF9QT1JUX1NUQVRFX1QgICAgICAgICAgKnBvcnRfdHlwZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9wYXJzZV9kaXIoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogUGFyc2UgYXBwbGljYXRpb24gcGFja2V0IHRvIG91dHB1dCBwYXJzZSBiaXRtYXAgYW5kIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgLSBHRSBNQUMgcG9ydAorKiAgICAgICByeCAgICAtIFdoZXRoZXIgUlggcGF0aAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBSZXR1cm4gZGlyZWN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NQSF9ESVJfRSBjcGhfYXBwX3BhcnNlX2RpciAoCisgICAgSU5UMzIgICAgcG9ydCwKKyAgICBCT09MICAgICByeCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9wYXJzZV9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogUGFyc2UgYXBwbGljYXRpb24gcGFja2V0IHRvIG91dHB1dCBwYXJzZSBiaXRtYXAgYW5kIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAgICAtIEdFIE1BQyBwb3J0CisqICAgICAgIHNrYl9kYXRhICAgLSBQb2ludGVyIHRvIFNLQiBkYXRhIGhvbGRpbmcgYXBwbGljYXRpb24gcGFja2V0CisqCisqIE9VVFBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfcGFyc2VfcGFja2V0ICgKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgIHBvcnQsCisgICAgVUlOVDggICAgICAgICAgICAgICAgICpza2JfZGF0YSwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgKnBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAgKnBhcnNlX2tleSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9tb2RfcnhfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IE1vZGlmeSBSWCBhcHBsaWNhdGlvbiBwYWNrZXQKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIGRldiAgICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgc2tiICAgICAgIC0gU0tCIGJ1ZmZlciB0byByZWNlaXZlIHBhY2tldAorKiAgICAgICByeF9kZXNjICAgLSBSWCBkZXNjcmlwdG9yCisqICAgICAgIG1vZF9ibSAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX21vZF9yeF9wYWNrZXQgKCAgCisgICAgSU5UMzIgICAgICAgICAgICAgICAgcG9ydCwKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYsCisgICAgc3RydWN0IHNrX2J1ZmYgICAgICAqc2tiLAorICAgIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MsCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICptb2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbW9kX3R4X3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBNb2RpZnkgVFggYXBwbGljYXRpb24gcGFja2V0CisqCisqIElOUFVUUzoKKyogICAgICAgc2tiICAgICAgICAgLSBQb2ludGVyIHRvIFNLQiBkYXRhIGhvZGluZyBhcHBsaWNhdGlvbiBwYWNrZXQKKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqICAgICAgIG1vZF9ibSAgICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9tb2RfdHhfcGFja2V0ICgKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgKnNrYiwKKyAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0LAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAgKm1vZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9zZXRfZnJ3ZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXQgcGFja2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24KKyoKKyogSU5QVVRTOgorKiAgICAgICBza2IgICAgICAgICAtIFBvaW50ZXIgdG8gU0tCIGRhdGEgaG9kaW5nIGFwcGxpY2F0aW9uIHBhY2tldAorKiAgICAgICB0eF9zcGVjX291dCAtIFRYIGRlc2NyaXB0b3IKKyogICAgICAgZnJ3ZF9ibSAgICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlICAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfc2V0X2Zyd2QgKAorICAgIHN0cnVjdCBza19idWZmICAgICAgICAqc2tiLAorICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcnhfYmMoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ1BIIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgcmVjZWl2ZWQgYnJvYWRjYXN0IHBhY2tldHMgCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgZGV2ICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgcGt0ICAgICAtIE1hcnZlbGwgcGFja2V0IGluZm9ybWF0aW9uCisqICAgICAgIHJ4X2Rlc2MgLSBSWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2FwcF9yeF9iYyhJTlQzMiBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRoX3BidWYgKnBrdCwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9sb29rdXBfcHJvZmlsZV9pZCgpCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBwcm9maWxlIElEIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2FwcF9sb29rdXBfcHJvZmlsZV9pZChJTlQzMiBlbnVtX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2xvb2t1cF9wb25fdHlwZSgpCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBQT04gdHlwZSBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9hcHBfbG9va3VwX3Bvbl90eXBlKElOVDMyIGVudW1fdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbG9va3VwX2RpcigpCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBkaXJlY3Rpb24gc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfYXBwX2xvb2t1cF9kaXIoSU5UMzIgZW51bV92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9sb29rdXBfcnhfdHgoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpsb29rdXAgUlgvVFggZGlyZWN0aW9uIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2FwcF9sb29rdXBfcnhfdHgoSU5UMzIgZW51bV92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9sb29rdXBfZ21hYygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBHTUFDIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2FwcF9sb29rdXBfZ21hYyhJTlQzMiBlbnVtX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2luaXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZXMgQ1BIIGFwcGxpY2F0aW9uIG1vZHVsZS4KKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2FwcF9pbml0KFZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9zZXRfdHJhY2VfZmxhZygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOnNldHMgY3BoIHRyYWNlIGZsYWcuCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX3NldF90cmFjZV9mbGFnKFVJTlQzMiBmbGFnKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NVl9DUEhfQVBQX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZGIuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kYi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlNGQwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZGIuYwpAQCAtMCwwICsxLDE1NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfZGIuYworKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBkYXRhIGJhc2UgaW1wbGVtZW50YXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisKKyNpbmNsdWRlICJtdl9jcGhfaGVhZGVyLmgiCisjaW5jbHVkZSAiZXp4bWwuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIENQSF9BUFBfREJfVCBnX2NwaF9hcHBfZGI7CitDSEFSICpnX2NwaF94bWxfY2ZnX2ZpbGUgICAgICAgICA9IFVTX0NQSF9YTUxfQ0ZHX0ZJTEU7CitDSEFSICpnX29udV9wcm9maWxlX3htbF9jZmdfZmlsZSA9IFVTX09OVV9QUk9GSUxFX1hNTF9DRkdfRklMRTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfc2V0X3BhcmFtKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldCBDUEggREIgcGFyYW1ldGVyCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyYW0gICAtIFRoZSBwYXJhbWV0ZXIgdHlwZQorKiAgICAgICB2YWx1ZSAgIC0gUGFyYW1ldGVyIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfc2V0X3BhcmFtIChDUEhfREJfUEFSQU1fRSBwYXJhbSwgVk9JRCAqdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICBzd2l0Y2ggKHBhcmFtKQorICAgIHsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fUFJPRklMRV9JRDoKKyAgICAgICAgICAgIGdfY3BoX2FwcF9kYi5wcm9maWxlX2lkICAgPSAqKHRwbV9ldGhfY29tcGxleF9wcm9maWxlX3QgKil2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9BQ1RJVkVfUE9SVDoKKyAgICAgICAgICAgIGdfY3BoX2FwcF9kYi5hY3RpdmVfcG9ydCAgPSAqKE1WX0FQUF9HTUFDX1BPUlRfRSAqKXZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0FQUF9TVVBQT1JUOgorICAgICAgICAgICAgZ19jcGhfYXBwX2RiLmFwcF9zdXBwb3J0ICA9ICooQk9PTCAqKXZhbHVlOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0lHTVBfU1VQUE9SVDoKKyAgICAgICAgICAgIGdfY3BoX2FwcF9kYi5pZ21wX3N1cHBvcnQgPSAqKEJPT0wgKil2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9CQ19TVVBQT1JUOgorICAgICAgICAgICAgZ19jcGhfYXBwX2RiLmJjX3N1cHBvcnQgICA9ICooQk9PTCAqKXZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0ZMT1dfU1VQUE9SVDoKKyAgICAgICAgICAgIGdfY3BoX2FwcF9kYi5mbG93X3N1cHBvcnQgPSAqKEJPT0wgKil2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9VRFBfU1VQUE9SVDoKKyAgICAgICAgICAgIGdfY3BoX2FwcF9kYi51ZHBfc3VwcG9ydCAgPSAqKEJPT0wgKil2YWx1ZTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9CQ19DT1VOVEVSOgorICAgICAgICAgICAgZ19jcGhfYXBwX2RiLmJjX2NvdW50ICAgICA9ICooVUlOVDMyICopdmFsdWU7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZ2V0X3BhcmFtKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBDUEggREIgcGFyYW1ldGVyCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyYW0gICAtIFRoZSBwYXJhbWV0ZXIgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICB2YWx1ZSAgIC0gUGFyYW1ldGVyIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZ2V0X3BhcmFtIChDUEhfREJfUEFSQU1fRSBwYXJhbSwgVk9JRCAqdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICBzd2l0Y2ggKHBhcmFtKQorICAgIHsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fUFJPRklMRV9JRDoKKyAgICAgICAgICAgICoodHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCAqKXZhbHVlID0gZ19jcGhfYXBwX2RiLnByb2ZpbGVfaWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fQUNUSVZFX1BPUlQ6CisgICAgICAgICAgICAqKE1WX0FQUF9HTUFDX1BPUlRfRSAqKXZhbHVlID0gZ19jcGhfYXBwX2RiLmFjdGl2ZV9wb3J0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0FQUF9TVVBQT1JUOgorICAgICAgICAgICAgKihCT09MICopdmFsdWUgPSBnX2NwaF9hcHBfZGIuYXBwX3N1cHBvcnQ7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fSUdNUF9TVVBQT1JUOgorICAgICAgICAgICAgKihCT09MICopdmFsdWUgPSBnX2NwaF9hcHBfZGIuaWdtcF9zdXBwb3J0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0JDX1NVUFBPUlQ6CisgICAgICAgICAgICAqKEJPT0wgKil2YWx1ZSA9IGdfY3BoX2FwcF9kYi5iY19zdXBwb3J0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0ZMT1dfU1VQUE9SVDoKKyAgICAgICAgICAgICooQk9PTCAqKXZhbHVlID0gZ19jcGhfYXBwX2RiLmZsb3dfc3VwcG9ydDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9VRFBfU1VQUE9SVDoKKyAgICAgICAgICAgICooQk9PTCAqKXZhbHVlID0gZ19jcGhfYXBwX2RiLnVkcF9zdXBwb3J0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0JDX0NPVU5URVI6CisgICAgICAgICAgICAqKFVJTlQzMiAqKXZhbHVlID0gZ19jcGhfYXBwX2RiLmJjX2NvdW50OworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9jb21wYXJlX3J1bGVzKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENvbXBhcmUgdGhlIHBhcnNlX2JtIGFuZCBwYXJzZV9rZXkgb2YgdHdvIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm1fMSAgIC0gUGFyc2luZyBiaXRtYXAgb2YgZmlyc3QgQ1BIIHJ1bGUKKyogICAgICAgcGFyc2Vfa2V5XzEgIC0gUGFyc2luZyBrZXkgb2YgZmlyc3QgQ1BIIHJ1bGUKKyogICAgICAgcGFyc2VfYm1fMiAgIC0gUGFyc2luZyBiaXRtYXAgb2Ygc2Vjb25kIENQSCBydWxlCisqICAgICAgIHBhcnNlX2tleV8yICAtIFBhcnNpbmcga2V5IG9mIHNlY29uZCBDUEggcnVsZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBJbiBjYXNlIHNhbWUsIHJldHVybiBUUlVFLCAKKyogICAgICAgSW4gY2FzZSBkaWZmZXJlbnQsIHJldHVybiBGQUxTRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MIGNwaF9kYl9jb21wYXJlX3J1bGVzICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm1fMSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleV8xLCAKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm1fMiwKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5XzIpCit7CisgICAgaWYgKHBhcnNlX2JtXzEgPT0gcGFyc2VfYm1fMikKKyAgICB7CisgICAgICAgIC8qIENvbXBhcmUgZGlyZWN0aW9uICovCisgICAgICAgIGlmIChwYXJzZV9ibV8xICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9ESVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfMS0+ZGlyICE9IHBhcnNlX2tleV8yLT5kaXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk9sZCBkaXJbJWRdLCBuZXcgZGlyWyVkXSBcbiIsIHBhcnNlX2tleV8xLT5kaXIsIHBhcnNlX2tleV8yLT5kaXIpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXBhcmUgUlggZGlyZWN0aW9uICovCisgICAgICAgIGlmIChwYXJzZV9ibV8xICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9SWF9UWCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnNlX2tleV8xLT5yeF90eCAhPSBwYXJzZV9rZXlfMi0+cnhfdHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk9sZCByeF90eFslZF0sIG5ldyByeF90eFslZF0gXG4iLCBwYXJzZV9rZXlfMS0+cnhfdHgsIHBhcnNlX2tleV8yLT5yeF90eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIE1hcnZlbGwgaGVhZGVyICovCisgICAgICAgIGlmIChwYXJzZV9ibV8xICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9NSCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnNlX2tleV8xLT5taCAhPSBwYXJzZV9rZXlfMi0+bWgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk9sZCBtaFslZF0sIG5ldyBtaFslZF0gXG4iLCBwYXJzZV9rZXlfMS0+bWgsIHBhcnNlX2tleV8yLT5taCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcGFyZSBFdGggdHlwZSAqLworICAgICAgICBpZiAocGFyc2VfYm1fMSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1RZUEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfMS0+ZXRoX3R5cGUhPSBwYXJzZV9rZXlfMi0+ZXRoX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk9sZCBldGhfdHlwZVslZF0sIG5ldyBldGhfdHlwZVslZF0gXG4iLCBwYXJzZV9rZXlfMS0+ZXRoX3R5cGUsIHBhcnNlX2tleV8yLT5ldGhfdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIEV0aCBzdWJ0eXBlICovCisgICAgICAgIGlmIChwYXJzZV9ibV8xICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfU1VCVFlQRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnNlX2tleV8xLT5ldGhfc3VidHlwZSAhPSBwYXJzZV9rZXlfMi0+ZXRoX3N1YnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk9sZCBldGhfc3VidHlwZVslZF0sIG5ldyBldGhfc3VidHlwZVslZF0gXG4iLCBwYXJzZV9rZXlfMS0+ZXRoX3N1YnR5cGUsIHBhcnNlX2tleV8yLT5ldGhfc3VidHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcGFyZSBJUFY0IHR5cGUgKi8KKyAgICAgICAgaWYgKHBhcnNlX2JtXzEgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjRfVFlQRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnNlX2tleV8xLT5pcHY0X3R5cGUgIT0gcGFyc2Vfa2V5XzItPmlwdjRfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiT2xkIGlwdjRfdHlwZVslZF0sIG5ldyBpcHY0X3R5cGVbJWRdIFxuIiwgcGFyc2Vfa2V5XzEtPmlwdjRfdHlwZSwgcGFyc2Vfa2V5XzItPmlwdjRfdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcGFyZSBJUFY2IHR5cGUgKi8KKyAgICAgICAgaWYgKHBhcnNlX2JtXzEgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5XzEtPmlwdjZfbmgxICE9IHBhcnNlX2tleV8yLT5pcHY2X25oMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiT2xkIGlwdjZfbmgxWyVkXSwgbmV3IGlwdjZfbmgxWyVkXSBcbiIsIHBhcnNlX2tleV8xLT5pcHY2X25oMSwgcGFyc2Vfa2V5XzItPmlwdjZfbmgxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDb21wYXJlIElQdjYgTkggKi8KKyAgICAgICAgaWYgKHBhcnNlX2JtXzEgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5XzEtPmlwdjZfbmgyIT0gcGFyc2Vfa2V5XzItPmlwdjZfbmgyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJPbGQgaXB2Nl9uaDJbJWRdLCBuZXcgaXB2Nl9uaDJbJWRdIFxuIiwgcGFyc2Vfa2V5XzEtPmlwdjZfbmgyLCBwYXJzZV9rZXlfMi0+aXB2Nl9uaDIpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXBhcmUgSUNNUHY2IHR5cGUgKi8KKyAgICAgICAgaWYgKHBhcnNlX2JtXzEgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5XzEtPmljbXB2Nl90eXBlICE9IHBhcnNlX2tleV8yLT5pY21wdjZfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiT2xkIGljbXB2Nl90eXBlWyVkXSwgbmV3IGljbXB2Nl90eXBlWyVkXSBcbiIsIHBhcnNlX2tleV8xLT5pY21wdjZfdHlwZSwgcGFyc2Vfa2V5XzItPmljbXB2Nl90eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfY29tcGFyZV9ydWxlX2FuZF9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ29tcGFyZSB0aGUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSBvZiBDUEggYW5kIHRoZSBwYWNrZXQKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibV9ydWxlICAgICAtIFBhcnNpbmcgYml0bWFwIG9mIENQSCBydWxlCisqICAgICAgIHBhcnNlX2tleV9ydWxlICAgIC0gUGFyc2luZyBrZXkgb2YgQ1BIIHJ1bGUKKyogICAgICAgcGFyc2VfYm1fcGFja2V0ICAgLSBQYXJzaW5nIGJpdG1hcCBvZiBwYWNrZXQKKyogICAgICAgcGFyc2Vfa2V5X3BhY2tldCAgLSBQYXJzaW5nIGtleSBvZiBwYWNrZXQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgSW4gY2FzZSBzYW1lLCByZXR1cm4gVFJVRSwgCisqICAgICAgIEluIGNhc2UgZGlmZmVyZW50LCByZXR1cm4gRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZGJfY29tcGFyZV9ydWxlX2FuZF9wYWNrZXQgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibV9ydWxlLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXlfcnVsZSwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm1fcGFja2V0LAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXlfcGFja2V0KQoreyAgCisgICAgLyogQ2hlY2sgZGlyZWN0aW9uICovCisgICAgaWYgKHBhcnNlX2JtX3J1bGUgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0RJUikKKyAgICB7CisgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+ZGlyICE9IENQSF9ESVJfTk9UX0NBUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghIChwYXJzZV9ibV9wYWNrZXQgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0RJUikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBoYXMgbm8gZGlyIGZpZWxkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+ZGlyICE9IHBhcnNlX2tleV9wYWNrZXQtPmRpcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGRpclslZF0gaXMgZGlmZmVyZW50IHdpdGggcnVsZSBkaXJbJWRdLCBtaXMtbWF0aGNlZCFcbiIsIHBhcnNlX2tleV9wYWNrZXQtPmRpciwgcGFyc2Vfa2V5X3J1bGUtPmRpcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgUlgvVFggZGlyZWN0aW9uICovCisgICAgaWYgKHBhcnNlX2JtX3J1bGUgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX1JYX1RYKQorICAgIHsKKyAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5yeF90eCAhPSBDUEhfUlhfVFhfTk9UX0NBUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghIChwYXJzZV9ibV9wYWNrZXQgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX1JYX1RYKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGhhcyBubyBkaXIgUlgvVFggZmllbGRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5yeF90eCAhPSBwYXJzZV9rZXlfcGFja2V0LT5yeF90eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IHJ4X3R4WyVkXSBpcyBkaWZmZXJlbnQgd2l0aCBydWxlIHJ4X3R4WyVkXSwgbWlzLW1hdGhjZWQhXG4iLCBwYXJzZV9rZXlfcGFja2V0LT5yeF90eCwgcGFyc2Vfa2V5X3J1bGUtPnJ4X3R4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBNYXJ2ZWxsIGhlYWRlciAqLworICAgIGlmIChwYXJzZV9ibV9ydWxlICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9NSCkKKyAgICB7CisgICAgICAgIGlmICghIChwYXJzZV9ibV9wYWNrZXQgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX01IKSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBoYXMgbm8gTUggZmllbGRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPm1oICE9IHBhcnNlX2tleV9wYWNrZXQtPm1oKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IG1oWzB4JXhdIGlzIGRpZmZlcmVudCB3aXRoIHJ1bGUgbWhbMHgleF0sIG1pcy1tYXRoY2VkIVxuIiwgcGFyc2Vfa2V5X3BhY2tldC0+bWgsIHBhcnNlX2tleV9ydWxlLT5taCk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBFdGggdHlwZSAqLworICAgIGlmIChwYXJzZV9ibV9ydWxlICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfVFlQRSkKKyAgICB7CisgICAgICAgIGlmICghIChwYXJzZV9ibV9wYWNrZXQgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9UWVBFKSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBoYXMgbm8gZXRoX3R5cGUgZmllbGRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPmV0aF90eXBlICE9IHBhcnNlX2tleV9wYWNrZXQtPmV0aF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGV0aF90eXBlWzB4JXhdIGlzIGRpZmZlcmVudCB3aXRoIHJ1bGUgZXRoX3R5cGVbMHgleF0sIG1pcy1tYXRoY2VkIVxuIiwgcGFyc2Vfa2V5X3BhY2tldC0+ZXRoX3R5cGUsIHBhcnNlX2tleV9ydWxlLT5ldGhfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBFdGggc3VidHlwZSAqLworICAgIGlmIChwYXJzZV9ibV9ydWxlICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfU1VCVFlQRSkKKyAgICB7CisgICAgICAgIGlmICghIChwYXJzZV9ibV9wYWNrZXQgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9TVUJUWVBFKSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBoYXMgbm8gZXRoX3N1YnR5cGUgZmllbGRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPmV0aF9zdWJ0eXBlICE9IHBhcnNlX2tleV9wYWNrZXQtPmV0aF9zdWJ0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGV0aF9zdWJ0eXBlWyVkXSBpcyBkaWZmZXJlbnQgd2l0aCBydWxlIGV0aF9zdWJ0eXBlWyVkXSwgbWlzLW1hdGhjZWQhXG4iLCBwYXJzZV9rZXlfcGFja2V0LT5ldGhfc3VidHlwZSwgcGFyc2Vfa2V5X3J1bGUtPmV0aF9zdWJ0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIElQVjQgdHlwZSAqLworICAgIGlmIChwYXJzZV9ibV9ydWxlICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY0X1RZUEUpCisgICAgeworICAgICAgICBpZiAoISAocGFyc2VfYm1fcGFja2V0ICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY0X1RZUEUpKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGhhcyBubyBpcHY0X3R5cGUgZmllbGRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPmlwdjRfdHlwZSAhPSBwYXJzZV9rZXlfcGFja2V0LT5pcHY0X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaXB2NF90eXBlWyVkXSBpcyBkaWZmZXJlbnQgd2l0aCBydWxlIGlwdjRfdHlwZVslZF0sIG1pcy1tYXRoY2VkIVxuIiwgcGFyc2Vfa2V5X3BhY2tldC0+aXB2NF90eXBlLCBwYXJzZV9rZXlfcnVsZS0+aXB2NF90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIElQVjYgTkgxICovCisgICAgaWYgKHBhcnNlX2JtX3J1bGUgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgxKQorICAgIHsKKyAgICAgICAgaWYgKCEgKHBhcnNlX2JtX3BhY2tldCAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDEpKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGhhcyBubyBpcHY2X25oMSBmaWVsZFxuIik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+aXB2Nl9uaDEgIT0gcGFyc2Vfa2V5X3BhY2tldC0+aXB2Nl9uaDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaXB2Nl9uaDFbJWRdIGlzIGRpZmZlcmVudCB3aXRoIHJ1bGUgaXB2Nl9uaDFbJWRdLCBtaXMtbWF0aGNlZCFcbiIsIHBhcnNlX2tleV9wYWNrZXQtPmlwdjZfbmgxLCBwYXJzZV9rZXlfcnVsZS0+aXB2Nl9uaDEpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgSVB2NiBOSDIgKi8KKyAgICBpZiAocGFyc2VfYm1fcnVsZSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDIpCisgICAgeworICAgICAgICBpZiAoISAocGFyc2VfYm1fcGFja2V0ICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaGFzIG5vIGlwdjZfbmgyIGZpZWxkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5pcHY2X25oMiAhPSBwYXJzZV9rZXlfcGFja2V0LT5pcHY2X25oMikKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBpcHY2X25oMlslZF0gaXMgZGlmZmVyZW50IHdpdGggcnVsZSBpcHY2X25oMlslZF0sIG1pcy1tYXRoY2VkIVxuIiwgcGFyc2Vfa2V5X3BhY2tldC0+aXB2Nl9uaDIsIHBhcnNlX2tleV9ydWxlLT5pcHY2X25oMik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBJQ01QdjYgdHlwZSAqLworICAgIGlmIChwYXJzZV9ibV9ydWxlICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRSkKKyAgICB7CisgICAgICAgIGlmICghIChwYXJzZV9ibV9wYWNrZXQgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFKSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBoYXMgbm8gaWNtcHY2X3R5cGUgZmllbGRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPmljbXB2Nl90eXBlICE9IHBhcnNlX2tleV9wYWNrZXQtPmljbXB2Nl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGljbXB2Nl90eXBlWyVkXSBpcyBkaWZmZXJlbnQgd2l0aCBydWxlIGljbXB2Nl90eXBlWyVkXSwgbWlzLW1hdGhjZWQhXG4iLCBwYXJzZV9rZXlfcGFja2V0LT5pY21wdjZfdHlwZSwgcGFyc2Vfa2V5X3J1bGUtPmljbXB2Nl90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9jaGVja19kdXBsaWNhdGVfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGR1cGxpY2F0ZSBDUEggcnVsZSB3LyBzYW1lIHBhcnNlIGJpdG1hcAorKiAgICAgICAgICAgICAgdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIEluIGNhc2UgaGFzIGR1cGxpY2F0ZWQgcnVsZSwgcmV0dXJuIFRSVUUsIAorKiAgICAgICBJbiBjYXNlIGhhcyBub3QgZHVwbGljYXRlZCBydWxlLCByZXR1cm4gRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZGJfY2hlY2tfZHVwbGljYXRlX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgIHJ1bGVfaWR4ICAgID0gMDsKKyAgICBDUEhfQVBQX1JVTEVfVCAgKnBfY3BoX3J1bGUgID0gTlVMTDsKKyAgICBCT09MICAgICAgICAgICAgIHJjICAgICAgICAgID0gRkFMU0U7CisgICAKKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9BUFBfTUFYX1JVTEVfTlVNKSAmJiAocnVsZV9pZHggPCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfY3BoX3J1bGUgPSAmZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF07CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIHBhcnNlX2JtIGFuZCBwYXJzZV9rZXkgKi8KKyAgICAgICAgaWYgKHBfY3BoX3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIHJjID0gY3BoX2RiX2NvbXBhcmVfcnVsZXMocF9jcGhfcnVsZS0+cGFyc2VfYm0sICZwX2NwaF9ydWxlLT5wYXJzZV9rZXksIHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgICAgICAgICAgaWYgKHJjID09IFRSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9hZGRfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQWRkIGFwcGxpY2F0aW9uIHR5cGUgQ1BIIHJ1bGUgdG8gZGF0YSBiYXNlCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2FkZF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgVUlOVDMyICAgICAgICAgICBpZHggICAgICAgID0gMDsKKyAgICBDUEhfQVBQX1JVTEVfVCAgKnBfY3BoX3J1bGUgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgcmMgICAgICAgICA9IFRSVUU7CisgICAgdW5zaWduZWQgbG9uZyAgICBmbGFnczsKKyAgICAKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgLyogU2VhY2ggZm9yIGFuIGZyZWUgZW50cnkgKi8KKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IENQSF9BUFBfTUFYX1JVTEVfTlVNOyBpZHgrKykKKyAgICB7CisgICAgICAgIGlmIChnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XS52YWxpZCA9PSBGQUxTRSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIE5vIGZyZWUgZW50cnkgKi8KKyAgICBpZiAoaWR4ID09IENQSF9BUFBfTUFYX1JVTEVfTlVNKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJObyBmcmVlIENQSCBlbnRyeSBcbiIpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIE1WX0ZVTEw7CisgICAgfQorCisgICAgLyogRG8gbm90IGFkZCBuZXcgcnVsZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGR1cGxpY2F0ZWQgcnVsZSAqLworICAgIHJjID0gY3BoX2RiX2NoZWNrX2R1cGxpY2F0ZV9ydWxlKHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgIGlmIChyYyA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJBbHJlYWR5IGhhcyBkdXBsaWNhdGVkIHJ1bGUsIGNvdWxkIG5vdCBhZGQgbmV3IENQSCBydWxlIFxuIik7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gTVZfRVJST1I7CisgICAgfSAgICAgICAgCisgICAgCisgICAgLyogU2F2ZSBDUEggcnVsZSBmb3IgYXBwbGljYXRpb24gcGFja2V0ICovCisgICAgcF9jcGhfcnVsZSA9ICZnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XTsKKyAgICBwX2NwaF9ydWxlLT5wYXJzZV9ibSA9IHBhcnNlX2JtOworICAgIG1lbWNweSgmcF9jcGhfcnVsZS0+cGFyc2Vfa2V5LCAgcGFyc2Vfa2V5LCAgc2l6ZW9mKENQSF9BUFBfUEFSU0VfVCkpOworICAgIHBfY3BoX3J1bGUtPm1vZF9ibSAgID0gbW9kX2JtOworICAgIG1lbWNweSgmcF9jcGhfcnVsZS0+bW9kX3ZhbHVlLCAgbW9kX3ZhbHVlLCAgc2l6ZW9mKENQSF9BUFBfTU9EX1QpKTsKKyAgICBwX2NwaF9ydWxlLT5mcndkX2JtICA9IGZyd2RfYm07CisgICAgbWVtY3B5KCZwX2NwaF9ydWxlLT5mcndkX3ZhbHVlLCBmcndkX3ZhbHVlLCBzaXplb2YoQ1BIX0FQUF9GUldEX1QpKTsKKyAgICBwX2NwaF9ydWxlLT52YWxpZCAgICA9IFRSVUU7CisgICAgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtICsrOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kZWxfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlIGFwcGxpY2F0aW9uIHR5cGUgQ1BIIHJ1bGUgZnJvbSBkYXRhIGJhc2UKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZGVsX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpCit7CisgICAgVUlOVDMyICAgICAgICAgICBpZHggICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0FQUF9SVUxFX1QgICpwX2NwaF9ydWxlICA9IE5VTEw7CisgICAgQk9PTCAgICAgICAgICAgICByYyAgICAgICAgICA9IEZBTFNFOworICAgIHVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfQVBQX01BWF9SVUxFX05VTSkgJiYgKHJ1bGVfaWR4IDwgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2NwaF9ydWxlID0gJmdfY3BoX2FwcF9kYi5jcGhfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5ICovCisgICAgICAgIGlmIChwX2NwaF9ydWxlLT52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlX2lkeCsrOworCisgICAgICAgICAgICByYyA9IGNwaF9kYl9jb21wYXJlX3J1bGVzKHBfY3BoX3J1bGUtPnBhcnNlX2JtLCAmcF9jcGhfcnVsZS0+cGFyc2Vfa2V5LCBwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbXNldChwX2NwaF9ydWxlLCAwLCBzaXplb2YoQ1BIX0FQUF9SVUxFX1QpKTsKKyAgICAgICAgICAgICAgICBwX2NwaF9ydWxlLT52YWxpZCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGdfY3BoX2FwcF9kYi5ydWxlX251bSAtLTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX3VwZGF0ZV9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBVcGRhdGUgYXBwbGljYXRpb24gdHlwZSBDUEggcnVsZSBmcm9tIGRhdGEgYmFzZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfdXBkYXRlX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgVUlOVDMyICAgICAgICAgICBpZHggICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0FQUF9SVUxFX1QgICpwX2NwaF9ydWxlICA9IE5VTEw7CisgICAgQk9PTCAgICAgICAgICAgICByYyAgICAgICAgICA9IEZBTFNFOworICAgIHVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7ICAgCisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfQVBQX01BWF9SVUxFX05VTSkgJiYgKHJ1bGVfaWR4IDwgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2NwaF9ydWxlID0gJmdfY3BoX2FwcF9kYi5jcGhfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5ICovCisgICAgICAgIGlmIChwX2NwaF9ydWxlLT52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlX2lkeCsrOworCisgICAgICAgICAgICByYyA9IGNwaF9kYl9jb21wYXJlX3J1bGVzKHBfY3BoX3J1bGUtPnBhcnNlX2JtLCAmcF9jcGhfcnVsZS0+cGFyc2Vfa2V5LCBwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfY3BoX3J1bGUtPm1vZF9ibSAgID0gbW9kX2JtOworICAgICAgICAgICAgICAgIG1lbWNweSgmcF9jcGhfcnVsZS0+bW9kX3ZhbHVlLCAgbW9kX3ZhbHVlLCAgc2l6ZW9mKENQSF9BUFBfTU9EX1QpKTsKKyAgICAgICAgICAgICAgICBwX2NwaF9ydWxlLT5mcndkX2JtICA9IGZyd2RfYm07CisgICAgICAgICAgICAgICAgbWVtY3B5KCZwX2NwaF9ydWxlLT5mcndkX3ZhbHVlLCBmcndkX3ZhbHVlLCBzaXplb2YoQ1BIX0FQUF9GUldEX1QpKTsKKworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZ2V0X2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBhcHBsaWNhdGlvbiB0eXBlIENQSCBydWxlIGZyb20gZGF0YSBiYXNlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9nZXRfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICptb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICpmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgIHJ1bGVfaWR4ICAgID0gMDsKKyAgICBDUEhfQVBQX1JVTEVfVCAgKnBfY3BoX3J1bGUgID0gTlVMTDsKKyAgICBCT09MICAgICAgICAgICAgIHJjICAgICAgICAgID0gRkFMU0U7CisgICAgdW5zaWduZWQgbG9uZyAgICBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsgICAKKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9BUFBfTUFYX1JVTEVfTlVNKSAmJiAocnVsZV9pZHggPCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfY3BoX3J1bGUgPSAmZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF07CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIHBhcnNlX2JtIGFuZCBwYXJzZV9rZXkgKi8KKyAgICAgICAgaWYgKHBfY3BoX3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIHJjID0gY3BoX2RiX2NvbXBhcmVfcnVsZV9hbmRfcGFja2V0KHBfY3BoX3J1bGUtPnBhcnNlX2JtLCAmcF9jcGhfcnVsZS0+cGFyc2Vfa2V5LCBwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBUUlVFKQorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIGlmIChwX2NwaF9ydWxlLT5tb2RfdmFsdWUuc3RhdGUgPT0gVFJVRSkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqbW9kX2JtICA9IHBfY3BoX3J1bGUtPm1vZF9ibTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG1vZF92YWx1ZSwgJnBfY3BoX3J1bGUtPm1vZF92YWx1ZSwgc2l6ZW9mKENQSF9BUFBfTU9EX1QpKTsKKyAgICAgICAgICAgICAgICAgICAgKmZyd2RfYm0gPSBwX2NwaF9ydWxlLT5mcndkX2JtOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZnJ3ZF92YWx1ZSwgJnBfY3BoX3J1bGUtPmZyd2RfdmFsdWUsIHNpemVvZihDUEhfQVBQX0ZSV0RfVCkpOworCisgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gTVZfRkFJTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZ2V0X2FwcF9ydWxlX2J5X2Rpcl9wcm90bygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgYXBwbGljYXRpb24gdHlwZSBDUEggcnVsZSBmcm9tIGRhdGEgYmFzZSBieSBwcm90b2NvbCB0eXBlCisqCisqIElOUFVUUzoKKyogICAgICAgZGlyICAgICAgICAtIERpcmVjdGlvbgorKiAgICAgICBwcm90b190eXBlIC0gU0tCIHByb3RvY29sIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2dldF9hcHBfcnVsZV9ieV9kaXJfcHJvdG8gKAorICAgIENQSF9ESVJfRSAgICAgICAgICAgICAgZGlyLAorICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgcHJvdG9fdHlwZSwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgKnBhcnNlX2JtLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICAqcGFyc2Vfa2V5LCAgICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgKm1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICAqZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIFVJTlQzMiAgICAgICAgICAgaWR4ICAgICAgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgICAgcnVsZV9pZHggICAgPSAwOworICAgIENQSF9BUFBfUlVMRV9UICAqcF9jcGhfcnVsZSAgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7ICAgCisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfQVBQX01BWF9SVUxFX05VTSkgJiYgKHJ1bGVfaWR4IDwgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2NwaF9ydWxlID0gJmdfY3BoX2FwcF9kYi5jcGhfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5ICovCisgICAgICAgIGlmIChwX2NwaF9ydWxlLT52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlX2lkeCsrOworCisgICAgICAgICAgICBpZiAoKHBfY3BoX3J1bGUtPm1vZF9ibSAmIENQSF9BUFBfUlhfTU9EX1JFUExBQ0VfUFJPVE9fVFlQRSkgJiYKKyAgICAgICAgICAgICAgICAocF9jcGhfcnVsZS0+bW9kX3ZhbHVlLnByb3RvX3R5cGUgPT0gcHJvdG9fdHlwZSkgJiYKKyAgICAgICAgICAgICAgICAocF9jcGhfcnVsZS0+bW9kX3ZhbHVlLnN0YXRlICAgICAgPT0gVFJVRSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChwX2NwaF9ydWxlLT5wYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRElSKSAmJgorICAgICAgICAgICAgICAgICAgICAoKHBfY3BoX3J1bGUtPnBhcnNlX2tleS5kaXIgPT0gQ1BIX0RJUl9OT1RfQ0FSRSl8fChwX2NwaF9ydWxlLT5wYXJzZV9rZXkuZGlyID09IGRpcikpICYmCisgICAgICAgICAgICAgICAgICAgICAocF9jcGhfcnVsZS0+cGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX1JYX1RYKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHBfY3BoX3J1bGUtPnBhcnNlX2tleS5yeF90eCA9PSBDUEhfRElSX1RYKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwYXJzZV9ibSA9IHBfY3BoX3J1bGUtPnBhcnNlX2JtOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkocGFyc2Vfa2V5LCAmcF9jcGhfcnVsZS0+cGFyc2Vfa2V5LCBzaXplb2YoQ1BIX0FQUF9QQVJTRV9UKSk7CisgICAgICAgICAgICAgICAgICAgICptb2RfYm0gICA9IHBfY3BoX3J1bGUtPm1vZF9ibTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG1vZF92YWx1ZSwgJnBfY3BoX3J1bGUtPm1vZF92YWx1ZSwgc2l6ZW9mKENQSF9BUFBfTU9EX1QpKTsKKyAgICAgICAgICAgICAgICAgICAgKmZyd2RfYm0gID0gcF9jcGhfcnVsZS0+ZnJ3ZF9ibTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGZyd2RfdmFsdWUsICZwX2NwaF9ydWxlLT5mcndkX3ZhbHVlLCBzaXplb2YoQ1BIX0FQUF9GUldEX1QpKTsKKworICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBNVl9GQUlMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluY3JlYXNlIFJYIGNvdW50ZXIKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfaW5jcmVhc2VfY291bnRlciAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KQoreworICAgIFVJTlQzMiAgICAgICAgICAgaWR4ICAgICAgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgICAgcnVsZV9pZHggICAgPSAwOworICAgIENQSF9BUFBfUlVMRV9UICAqcF9jcGhfcnVsZSAgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgcmMgICAgICAgICAgPSBNVl9GQUlMOworICAgIHVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7ICAgCisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfQVBQX01BWF9SVUxFX05VTSkgJiYgKHJ1bGVfaWR4IDwgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2NwaF9ydWxlID0gJmdfY3BoX2FwcF9kYi5jcGhfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5ICovCisgICAgICAgIGlmIChwX2NwaF9ydWxlLT52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlX2lkeCsrOworCisgICAgICAgICAgICByYyA9IGNwaF9kYl9jb21wYXJlX3J1bGVfYW5kX3BhY2tldChwX2NwaF9ydWxlLT5wYXJzZV9ibSwgJnBfY3BoX3J1bGUtPnBhcnNlX2tleSwgcGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgICAgICAgICBpZiAocmMgPT0gVFJVRSkKKyAgICAgICAgICAgIHsgICAKKyAgICAgICAgICAgICAgICBpZiAocF9jcGhfcnVsZS0+bW9kX3ZhbHVlLnN0YXRlID09IFRSVUUpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9jcGhfcnVsZS0+Y291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90bygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiAgSW5jcmVhc2UgUlggY291bnRlciBhY2NvcmRpbmcgdG8gcHJvdG9jb2wgdHlwZQorKgorKiBJTlBVVFM6CisqICAgICAgIGRpciAgICAgICAgLSBEaXJlY3Rpb24KKyogICAgICAgcHJvdG9fdHlwZSAtIFNLQiBwcm90b2NvbCB0eXBlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8gKENQSF9ESVJfRSBkaXIsCisgICAgVUlOVDE2ICAgIHByb3RvX3R5cGUpCit7CisgICAgVUlOVDMyICAgICAgICAgICBpZHggICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0FQUF9SVUxFX1QgICpwX2NwaF9ydWxlICA9IE5VTEw7CisgICAgdW5zaWduZWQgbG9uZyAgICBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsgICAKKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9BUFBfTUFYX1JVTEVfTlVNKSAmJiAocnVsZV9pZHggPCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfY3BoX3J1bGUgPSAmZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF07CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIGRpciBhbmQgcHJvdG9jb2wgdHlwZSAqLworICAgICAgICBpZiAocF9jcGhfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgaWYgKChwX2NwaF9ydWxlLT5tb2RfYm0gJiBDUEhfQVBQX1JYX01PRF9SRVBMQUNFX1BST1RPX1RZUEUpICYmCisgICAgICAgICAgICAgICAgKHBfY3BoX3J1bGUtPm1vZF92YWx1ZS5wcm90b190eXBlID09IHByb3RvX3R5cGUpICYmCisgICAgICAgICAgICAgICAgKHBfY3BoX3J1bGUtPm1vZF92YWx1ZS5zdGF0ZSAgICAgID09IFRSVUUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKChwX2NwaF9ydWxlLT5wYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRElSKSAmJgorICAgICAgICAgICAgICAgICAgICAoKHBfY3BoX3J1bGUtPnBhcnNlX2tleS5kaXIgPT0gQ1BIX0RJUl9OT1RfQ0FSRSkgfHwgCisgICAgICAgICAgICAgICAgICAgICAocF9jcGhfcnVsZS0+cGFyc2Vfa2V5LmRpciA9PSBkaXIpKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHBfY3BoX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9SWF9UWCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIChwX2NwaF9ydWxlLT5wYXJzZV9rZXkucnhfdHggPT0gQ1BIX0RJUl9UWCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwX2NwaF9ydWxlLT5jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIE1WX09LOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2dldF94bWxfcGFyYW0oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IHRoZSBYTUwgcGFyYW1ldGVyCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9nZXRfeG1sX3BhcmFtKFZPSUQpCit7CisgICAgZXp4bWxfdCAgICAgeG1sX2hlYWQ7CisgICAgZXp4bWxfdCAgICAgeG1sX2VsZW1lbnQ7CisgICAgZXp4bWxfdCAgICAgeG1sX2F0dHI7CisgICAgVUlOVDMyICAgICAgYXR0cl92YWx1ZSA9IDA7CisgICAgQk9PTCAgICAgICAgYm9vbF92YWx1ZSA9IFRSVUU7CisgICAgY29uc3QgQ0hBUiAqbmFtZSAgICAgICA9IE5VTEw7CisgICAgY29uc3QgQ0hBUiAqdmFsdWUgICAgICA9IE5VTEw7ICAKKyAgICBJTlQzMiAgICAgICByYyAgICAgICAgID0gTVZfT0s7CisKKyAgICAvKiBSZWFkIE9OVSBwcm9maWxlIFhNTCBmaWxlICovCisgICAgaWYgKCh4bWxfaGVhZCA9IGV6eG1sX3BhcnNlX2ZpbGUoZ19vbnVfcHJvZmlsZV94bWxfY2ZnX2ZpbGUpKSA9PSAwKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfcGFyc2VfZmlsZSgpIG9mICVzIGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgZ19vbnVfcHJvZmlsZV94bWxfY2ZnX2ZpbGUpOworICAgICAgICByYyA9IE1WX05PVF9GT1VORDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisKKyAgICBpZiAoKHhtbF9lbGVtZW50ID0gZXp4bWxfZ2V0KHhtbF9oZWFkLCBYTUxfUFJPRklMRV9FTE1fQ0FQQUJJTElUWSwgLTEpKSA9PSAwKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfZ2V0KCkgb2YgJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIFhNTF9QUk9GSUxFX0VMTV9DQVBBQklMSVRZKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworCisgICAgfQorICAgIAorICAgIGZvciAoeG1sX2F0dHIgPSBlenhtbF9jaGlsZCh4bWxfZWxlbWVudCwgWE1MX1BST0ZJTEVfRUxNX0FUVFJJQik7IHhtbF9hdHRyOyB4bWxfYXR0ciA9IHhtbF9hdHRyLT5uZXh0KQorICAgIHsgCisgICAgICAgIC8qIFBhcnNlIGF0dHJpYnV0ZSB0eXBlIGFuZCB2YWx1ZSAqLworICAgICAgICBuYW1lID0gZXp4bWxfYXR0cih4bWxfYXR0ciwgWE1MX1BST0ZJTEVfQVRUUl9OQU1FKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfYXR0cigpIG9mICVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBYTUxfUFJPRklMRV9BVFRSX05BTUUpOworICAgICAgICAgICAgcmMgPSBNVl9OT1RfRk9VTkQ7ICAgICAgICAKKyAgICAgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBYTUxfUFJPRklMRV9OQU1FX1BST0ZJTEUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gZXp4bWxfYXR0cih4bWxfYXR0ciwgWE1MX1BST0ZJTEVfQVRUUl9WQUxVRSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9hdHRyKCkgb2YgJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIFhNTF9QUk9GSUxFX0FUVFJfVkFMVUUpOworICAgICAgICAgICAgICAgIHJjID0gTVZfTk9UX0ZPVU5EOyAgICAgICAgCisgICAgICAgICAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyX3ZhbHVlID0gbXR5cGVfZ2V0X2RpZ2l0X251bSh2YWx1ZSk7CisKKyAgICAgICAgICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX1BST0ZJTEVfSUQsICZhdHRyX3ZhbHVlKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhNTF9QUk9GSUxFX05BTUVfQUNUSVZFX1BPUlQpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gZXp4bWxfYXR0cih4bWxfYXR0ciwgWE1MX1BST0ZJTEVfQVRUUl9WQUxVRSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9hdHRyKCkgb2YgJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIFhNTF9QUk9GSUxFX0FUVFJfVkFMVUUpOworICAgICAgICAgICAgICAgIHJjID0gTVZfTk9UX0ZPVU5EOyAgICAgICAgCisgICAgICAgICAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyX3ZhbHVlID0gbXR5cGVfZ2V0X2RpZ2l0X251bSh2YWx1ZSk7CisKKyAgICAgICAgICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0FDVElWRV9QT1JULCAmYXR0cl92YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlenhtbF9mcmVlKHhtbF9oZWFkKTsKKworICAgIC8qIFJlYWQgQ1BIIFhNTCBmaWxlICovCisgICAgaWYgKCh4bWxfaGVhZCA9IGV6eG1sX3BhcnNlX2ZpbGUoZ19jcGhfeG1sX2NmZ19maWxlKSkgPT0gMCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX3BhcnNlX2ZpbGUoKSBvZiAlcyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIGdfY3BoX3htbF9jZmdfZmlsZSk7CisgICAgICAgIHJjID0gTVZfTk9UX0ZPVU5EOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKworICAgIC8qIFJlYWQgYXBwbGljYXRpb24gc3VwcG9ydCBmbGFnKi8KKyAgICBpZiAoKHhtbF9lbGVtZW50ID0gZXp4bWxfZ2V0KHhtbF9oZWFkLCBYTUxfQ1BIX0VMTV9BUFBfU1VQUE9SVCwgLTEpKSA9PSAwKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfZ2V0KCkgb2YgJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIFhNTF9DUEhfRUxNX0FQUF9TVVBQT1JUKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKyAgICBpZiAoeG1sX2VsZW1lbnQtPnR4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogeG1sX2VsZW1lbnQtPnR4dCA9PSBOVUxMIFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKyAgICBhdHRyX3ZhbHVlID0gbXR5cGVfZ2V0X2RpZ2l0X251bSh4bWxfZWxlbWVudC0+dHh0KTsKKyAgICBib29sX3ZhbHVlID0gKGF0dHJfdmFsdWUgIT0gMCk/IFRSVUU6RkFMU0U7CisgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fQVBQX1NVUFBPUlQsICZib29sX3ZhbHVlKTsKKworICAgIC8qIFJlYWQgSUdNUCBzdXBwb3J0IGZsYWcqLworICAgIGlmICgoeG1sX2VsZW1lbnQgPSBlenhtbF9nZXQoeG1sX2hlYWQsIFhNTF9DUEhfRUxNX0lHTVBfU1VQUE9SVCwgLTEpKSA9PSAwKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfZ2V0KCkgb2YgJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIFhNTF9DUEhfRUxNX0lHTVBfU1VQUE9SVCk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisgICAgaWYgKHhtbF9lbGVtZW50LT50eHQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IHhtbF9lbGVtZW50LT50eHQgPT0gTlVMTCBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisgICAgYXR0cl92YWx1ZSA9IG10eXBlX2dldF9kaWdpdF9udW0oeG1sX2VsZW1lbnQtPnR4dCk7CisgICAgYm9vbF92YWx1ZSA9IChhdHRyX3ZhbHVlICE9IDApPyBUUlVFOkZBTFNFOworICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0lHTVBfU1VQUE9SVCwgJmJvb2xfdmFsdWUpOworCisgICAgLyogUmVhZCBCQyBzdXBwb3J0IGZsYWcqLworICAgIGlmICgoeG1sX2VsZW1lbnQgPSBlenhtbF9nZXQoeG1sX2hlYWQsIFhNTF9DUEhfRUxNX0JDX1NVUFBPUlQsIC0xKSkgPT0gMCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX2dldCgpIG9mICVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBYTUxfQ1BIX0VMTV9CQ19TVVBQT1JUKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKyAgICBpZiAoeG1sX2VsZW1lbnQtPnR4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogeG1sX2VsZW1lbnQtPnR4dCA9PSBOVUxMIFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKyAgICBhdHRyX3ZhbHVlID0gbXR5cGVfZ2V0X2RpZ2l0X251bSh4bWxfZWxlbWVudC0+dHh0KTsKKyAgICBib29sX3ZhbHVlID0gKGF0dHJfdmFsdWUgIT0gMCk/IFRSVUU6RkFMU0U7CisgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fQkNfU1VQUE9SVCwgJmJvb2xfdmFsdWUpOworCisgICAgLyogUmVhZCBEYXRhIGZsb3cgbWFwcGluZyBzdXBwb3J0IGZsYWcqLworICAgIGlmICgoeG1sX2VsZW1lbnQgPSBlenhtbF9nZXQoeG1sX2hlYWQsIFhNTF9DUEhfRUxNX0ZMT1dfU1VQUE9SVCwgLTEpKSA9PSAwKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfZ2V0KCkgb2YgJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIFhNTF9DUEhfRUxNX0ZMT1dfU1VQUE9SVCk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisgICAgaWYgKHhtbF9lbGVtZW50LT50eHQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IHhtbF9lbGVtZW50LT50eHQgPT0gTlVMTCBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisgICAgYXR0cl92YWx1ZSA9IG10eXBlX2dldF9kaWdpdF9udW0oeG1sX2VsZW1lbnQtPnR4dCk7CisgICAgYm9vbF92YWx1ZSA9IChhdHRyX3ZhbHVlICE9IDApPyBUUlVFOkZBTFNFOworICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0ZMT1dfU1VQUE9SVCwgJmJvb2xfdmFsdWUpOworCisgICAgLyogUmVhZCBVRFAgcG9ydCBtYXBwaW5nIHN1cHBvcnQgZmxhZyovCisgICAgaWYgKCh4bWxfZWxlbWVudCA9IGV6eG1sX2dldCh4bWxfaGVhZCwgWE1MX0NQSF9FTE1fVURQX1NVUFBPUlQsIC0xKSkgPT0gMCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX2dldCgpIG9mICVzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBYTUxfQ1BIX0VMTV9VRFBfU1VQUE9SVCk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisgICAgaWYgKHhtbF9lbGVtZW50LT50eHQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IHhtbF9lbGVtZW50LT50eHQgPT0gTlVMTCBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJjID0gTVZfRkFJTDsgICAgICAgIAorICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICB9CisgICAgYXR0cl92YWx1ZSA9IG10eXBlX2dldF9kaWdpdF9udW0oeG1sX2VsZW1lbnQtPnR4dCk7CisgICAgYm9vbF92YWx1ZSA9IChhdHRyX3ZhbHVlICE9IDApPyBUUlVFOkZBTFNFOworICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX1VEUF9TVVBQT1JULCAmYm9vbF92YWx1ZSk7CisKK2ZyZWVfZXhpdDoKKyAgICBlenhtbF9mcmVlKHhtbF9oZWFkKTsKKyAgICByZXR1cm4gcmM7ICAgICAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBjcGhfZGJfZ2V0X3Rjb250X3N0YXRlCisqKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGdldCBULUNPTlQgc3RhdGUKKyoqCisqKiBJTlBVVFM6CisqKiAgIHRjb250IC0gVC1DT05UCisqKgorKiogT1VUUFVUUzoKKyoqICAgTm9uZS4gCisqKgorKiogUkVUVVJOUzogICAgIAorKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4gIAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MIGNwaF9kYl9nZXRfdGNvbnRfc3RhdGUoVUlOVDMyIHRjb250KQoreworICAgIC8qIENoZWNrIHRjb250ICovCisgICAgaWYgKHRjb250ID49IE1WX1RDT05UX0xMSURfTlVNKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJ0Y29udFslZF0gaXMgaWxsZWdhbCwgc2hvdWxkIGJlIGxlc3MgdGhhbiBbJWRdXG4iLCB0Y29udCwgTVZfVENPTlRfTExJRF9OVU0pOyAKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBnX2NwaF9hcHBfZGIudGNvbnRfc3RhdGVbdGNvbnRdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIGNwaF9kYl9zZXRfdGNvbnRfc3RhdGUKKyoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBULUNPTlQgc3RhdGUgaW4gbXZfY3BoCisqKgorKiogSU5QVVRTOgorKiogICB0Y29udCAtIFQtQ09OVAorKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyoqCisqKiBPVVRQVVRTOgorKiogICBOb25lLiAKKyoqCisqKiBSRVRVUk5TOiAgICAgCisqKiAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKKyoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9zZXRfdGNvbnRfc3RhdGUoVUlOVDMyIHRjb250LCBCT09MIHN0YXRlKQoreworICAgIC8qIENoZWNrIHRjb250ICovCisgICAgaWYgKHRjb250ID49IE1WX1RDT05UX0xMSURfTlVNKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJ0Y29udFslZF0gaXMgaWxsZWdhbCwgc2hvdWxkIGJlIGxlc3MgdGhhbiBbJWRdXG4iLCB0Y29udCwgTVZfVENPTlRfTExJRF9OVU0pOyAKKyAgICAgICAgcmV0dXJuIE1WX0ZBSUw7CisgICAgfQorCisgICAgLyogQXBwbHkgdC1jb250IHN0YXRlIHRvIG12X2NwaCAqLworICAgIGdfY3BoX2FwcF9kYi50Y29udF9zdGF0ZVt0Y29udF0gPSBzdGF0ZTsKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZGlzcGxheV9wYXJzZV9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IENQSCBydWxlIHBhcnNpbmcgZmllbGQKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2Rpc3BsYXlfcGFyc2VfZmllbGQoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KQoreworICAgIHByaW50ayhLRVJOX0lORk8gIlBhcnNlIGZpZWxkKDB4JXgpOiAiLCBwYXJzZV9ibSk7ICAgIAorCisgICAgLyogUHJpbnQgZGlyZWN0aW9uICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9ESVIpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJEaXIoJXMpLCAiLCBjcGhfYXBwX2xvb2t1cF9kaXIocGFyc2Vfa2V5LT5kaXIpKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBUWC9SWCBkaXJlY3Rpb24gKi8KKyAgICBpZiAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX1JYX1RYKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUlgvVFgoJXMpLCAiLCBjcGhfYXBwX2xvb2t1cF9yeF90eChwYXJzZV9rZXktPmRpcikpOworICAgIH0KKworICAgIC8qIFByaW50IE1hcnZlbGwgaGVhZGVyICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9NSCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIk1IKDB4JXgpLCAiLCBwYXJzZV9rZXktPm1oKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBFdGggdHlwZSAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1RZUEUpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJFdGggdHlwZSgweCUwNHgpLCAiLCBwYXJzZV9rZXktPmV0aF90eXBlKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBFdGggc3VidHlwZSAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1NVQlRZUEUpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJFdGggc3VidHlwZSglZCksICIsIHBhcnNlX2tleS0+ZXRoX3N1YnR5cGUpOworICAgIH0KKworICAgIC8qIFByaW50IElQVjQgdHlwZSAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiSVB2NCB0eXBlKCVkKSwgIiwgcGFyc2Vfa2V5LT5pcHY0X3R5cGUpOworICAgIH0KKworICAgIC8qIFByaW50IElQdjYgTkgxICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIklQdjYgTkgxKCVkKSwgIiwgcGFyc2Vfa2V5LT5pcHY2X25oMSk7CisgICAgfQorCisgICAgLyogUHJpbnQgSVB2NiBOSDIgKi8KKyAgICBpZiAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgyKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiSVB2NiBOSDIoJWQpLCAiLCBwYXJzZV9rZXktPmlwdjZfbmgyKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBJQ01QdjYgdHlwZSAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJJQ01QdjYgdHlwZSglZCkiLCBwYXJzZV9rZXktPmljbXB2Nl90eXBlKTsKKyAgICB9CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kaXNwbGF5X21vZF9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IENQSCBydWxlIG1vZGlmaWNhdGlvbiBmaWVsZAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZGlzcGxheV9tb2RfZmllbGQoCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlKQoreworICAgIHByaW50ayhLRVJOX0lORk8gIk1vZCBmaWVsZCgweCV4KTogIiwgbW9kX2JtKTsgICAgCisKKyAgICAvKiBQcmludCBwcm90b2NvbCB0eXBlICovCisgICAgaWYgKG1vZF9ibSAmIENQSF9BUFBfUlhfTU9EX1JFUExBQ0VfUFJPVE9fVFlQRSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlByb3RvIHR5cGUoMHgleCksICIsIG1vZF92YWx1ZS0+cHJvdG9fdHlwZSk7CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fSU5GTyAic3RhdGUoJXMpIiwgKG1vZF92YWx1ZS0+c3RhdGU9PVRSVUUpPyJFbmFibGVkIjoiRGlzYWJsZWQiKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIlxuIik7ICAKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERpc3BsYXkgQ1BIIHJ1bGUgZm9yd2FyZGluZyBmaWVsZAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBwcmludGsoS0VSTl9JTkZPICJGb3J3YXJkIGZpZWxkKDB4JXgpOiAiLCBmcndkX2JtKTsgICAgCisKKyAgICAvKiBQcmludCB0YXJnZXQgcG9ydCAqLworICAgIGlmIChmcndkX2JtICYgQ1BIX0FQUF9GUldEX1NFVF9UUkdfUE9SVCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlRhcmdldCBwb3J0KCVkKSwgIiwgZnJ3ZF92YWx1ZS0+dHJnX3BvcnQpOworICAgIH0KKworICAgIC8qIFByaW50IHRhcmdldCBxdWV1ZSAqLworICAgIGlmIChmcndkX2JtICYgQ1BIX0FQUF9GUldEX1NFVF9UUkdfUVVFVUUpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJUYXJnZXQgcXVldWUoJWQpLCAiLCBmcndkX3ZhbHVlLT50cmdfcXVldWUpOworICAgIH0KKworICAgIC8qIFByaW50IEdFTSBwb3J0ICovCisgICAgaWYgKGZyd2RfYm0gJiBDUEhfQVBQX0ZSV0RfU0VUX0dFTV9QT1JUKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiR2VtIHBvcnQoJWQpIiwgZnJ3ZF92YWx1ZS0+Z2VtX3BvcnQpOworICAgIH0gICAgCisKKworICAgIHByaW50ayhLRVJOX0lORk8gIlxuIik7ICAKKworICAgIHJldHVybiBNVl9PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kaXNwbGF5X2FsbCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IGFsbCBDUEggcnVsZXMgaW4gZGF0YSBiYXNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9kaXNwbGF5X2FsbChWT0lEKQoreworICAgIENQSF9BUFBfUlVMRV9UICpwX2NwaF9ydWxlID0gTlVMTDsKKyAgICBVSU5UMzIgICAgICAgICAgaWR4ICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgIHJ1bGVfaWR4ICAgPSAwOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiQ1BIIEFwcGxpY2F0aW9uIERhdGEgQmFzZSwgdG90YWwgcnVsZSBudW1iZXJbJXVdXG4iLCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOworICAgIHByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiVFBNIGNvbXBsZXggcHJvZmlsZTogJXMsIGFjdGl2ZSBXQU46ICVzXG4iLCAKKyAgICAgICAgICAgY3BoX2FwcF9sb29rdXBfcHJvZmlsZV9pZChnX2NwaF9hcHBfZGIucHJvZmlsZV9pZCksIAorICAgICAgICAgICBjcGhfYXBwX2xvb2t1cF9nbWFjKGdfY3BoX2FwcF9kYi5hY3RpdmVfcG9ydCkpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiR2VuZXJpYyBhcHBsaWNhdGlvbiBoYW5kbGluZyBzdXBwcG9ydDogJXNcbiIsIAorICAgICAgIChnX2NwaF9hcHBfZGIuYXBwX3N1cHBvcnQgPT0gVFJVRSk/IkVuYWJsZWQiOiJEaXNhYmxlZCIpOworICAgIAorI2lmZGVmIENPTkZJR19NVl9DUEhfSUdNUF9IQU5ETEUKKyAgICBwcmludGsoS0VSTl9JTkZPICJJR01QL01MRCBoYW5kbGluZyBzdXBwcG9ydDogJXNcbiIsIAorICAgICAgICAgICAoZ19jcGhfYXBwX2RiLmlnbXBfc3VwcG9ydCA9PSBUUlVFKT8iRW5hYmxlZCI6IkRpc2FibGVkIik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NVl9DUEhfQkNfSEFORExFICAKKyAgICBwcmludGsoS0VSTl9JTkZPICJCcm9hZGNhc3QgaGFuZGxpbmcgc3VwcHBvcnQ6ICVzXG4iLCAKKyAgICAgICAgICAgKGdfY3BoX2FwcF9kYi5iY19zdXBwb3J0ID09IFRSVUUpPyJFbmFibGVkIjoiRGlzYWJsZWQiKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUgICAKKyAgICBwcmludGsoS0VSTl9JTkZPICJEYXRhIGZsb3cgbWFwcGluZy9tb2RpZmljYXRpb24gc3VwcHBvcnQ6ICVzXG4iLCAgICAgCisgICAgICAgICAgIChnX2NwaF9hcHBfZGIuZmxvd19zdXBwb3J0ID09IFRSVUUpPyJFbmFibGVkIjoiRGlzYWJsZWQiKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorICAgIHByaW50ayhLRVJOX0lORk8gIlVEUCBwb3J0IG1hcHBpbmcgc3VwcHBvcnQ6ICVzXG4iLAorICAgICAgICAgICAoZ19jcGhfYXBwX2RiLnVkcF9zdXBwb3J0ID09IFRSVUUpPyJFbmFibGVkIjoiRGlzYWJsZWQiKTsKKyNlbmRpZgorCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiQ1BIIHRvdGFsIHJ1bGUgbnVtYmVyOiAlZFxuIiwgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtKTsgICAgCisKKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9BUFBfTUFYX1JVTEVfTlVNKSAmJiAocnVsZV9pZHggPCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfY3BoX3J1bGUgPSAmZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF07CisgICAgICAgIGlmIChwX2NwaF9ydWxlLT52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlX2lkeCsrOworICAgICAgICAgICAgCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJDUEggcnVsZTogIyVkXG4iLCBydWxlX2lkeCk7CisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9wYXJzZV9maWVsZChwX2NwaF9ydWxlLT5wYXJzZV9ibSwgJnBfY3BoX3J1bGUtPnBhcnNlX2tleSk7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9tb2RfZmllbGQocF9jcGhfcnVsZS0+bW9kX2JtLCAgICAgJnBfY3BoX3J1bGUtPm1vZF92YWx1ZSk7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKHBfY3BoX3J1bGUtPmZyd2RfYm0sICAgJnBfY3BoX3J1bGUtPmZyd2RfdmFsdWUpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiQ291bnRlcjogJWRcblxuIiwgcF9jcGhfcnVsZS0+Y291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiTWlzLW1hdGNoZWQgb3IgYnJvYWRjYXN0IGNvdW50ZXI6ICVkXG4iLCBnX2NwaF9hcHBfZGIuYmNfY291bnQpOyAgICAKKworICAgIHByaW50ayhLRVJOX0lORk8gIlQtQ09OVCBTdGF0ZVxuIik7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBNVl9UQ09OVF9MTElEX05VTTsgaWR4KyspCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJULUNPTlRbJWRdOiAlc1xuIiwgaWR4LCAoZ19jcGhfYXBwX2RiLnRjb250X3N0YXRlW2lkeF0gPT0gVFJVRSk/IlRSVUUiOiJGQUxTRSIpOworICAgIH0KKworICAgIHJldHVybiBNVl9PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemUgQ1BIIGRhdGEgYmFzZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2luaXQoVk9JRCkKK3sKKyAgICBVSU5UMzIgICAgaWR4ID0gMDsKKyAgICBNVl9TVEFUVVMgcmMgID0gTVZfT0s7CisKKyAgICBtZW1zZXQoJmdfY3BoX2FwcF9kYiwgMCwgc2l6ZW9mKGdfY3BoX2FwcF9kYikpOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU07IGlkeCsrKQorICAgICAgICBnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XS52YWxpZCA9IEZBTFNFOworCisgICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlICovCisgICAgZ19jcGhfYXBwX2RiLnByb2ZpbGVfaWQgICA9IFRQTV9QT05fV0FOX0RVQUxfTUFDX0lOVF9TV0lUQ0g7CisgICAgZ19jcGhfYXBwX2RiLmFjdGl2ZV9wb3J0ICA9IE1WX0FQUF9QT05fTUFDX1BPUlQ7CisgICAgZ19jcGhfYXBwX2RiLmFwcF9zdXBwb3J0ICA9IFRSVUU7CisgICAgZ19jcGhfYXBwX2RiLmlnbXBfc3VwcG9ydCA9IEZBTFNFOworICAgIGdfY3BoX2FwcF9kYi5iY19zdXBwb3J0ICAgPSBGQUxTRTsKKyAgICBnX2NwaF9hcHBfZGIuZmxvd19zdXBwb3J0ID0gRkFMU0U7CisgICAgZ19jcGhfYXBwX2RiLnVkcF9zdXBwb3J0ICA9IEZBTFNFOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBNVl9UQ09OVF9MTElEX05VTTsgaWR4KyspCisgICAgICAgIGdfY3BoX2FwcF9kYi50Y29udF9zdGF0ZVtpZHhdID0gRkFMU0U7CisKKyAgICAvKiBJbml0IHNwaW4gbG9jayAqLworICAgIHNwaW5fbG9ja19pbml0KCZnX2NwaF9hcHBfZGIuYXBwX2xvY2spOworCisgICAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2RiLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZGIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MTkwM2RlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2RiLmgKQEAgLTAsMCArMSw1MzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfZGIuaAorKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBkYXRhIGJhc2UgaW1wbGVtZW50YXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX0RCX0hfCisjZGVmaW5lIF9NVl9DUEhfREJfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEYXRhIHR5cGUgRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVVNfQ1BIX1hNTF9DRkdfRklMRSAgICAgICAgICAiL2V0Yy94bWxfcGFyYW1zL2NwaF94bWxfY2ZnX2ZpbGUueG1sIgorI2RlZmluZSBVU19PTlVfUFJPRklMRV9YTUxfQ0ZHX0ZJTEUgICIvZXRjL3htbF9wYXJhbXMvb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlLnhtbCIKKworI2RlZmluZSBYTUxfUFJPRklMRV9FTE1fQ0FQQUJJTElUWSAgICJDYXBhYmlsaXR5IgorI2RlZmluZSBYTUxfUFJPRklMRV9FTE1fQVRUUklCICAgICAgICJhdHRyaWIiCisjZGVmaW5lIFhNTF9QUk9GSUxFX0FUVFJfTkFNRSAgICAgICAgIm5hbWUiCisjZGVmaW5lIFhNTF9QUk9GSUxFX0FUVFJfVkFMVUUgICAgICAgInZhbHVlIgorI2RlZmluZSBYTUxfUFJPRklMRV9OQU1FX1BST0ZJTEUgICAgICJDb21wbGV4IHByb2ZpbGUiCisjZGVmaW5lIFhNTF9QUk9GSUxFX05BTUVfQUNUSVZFX1BPUlQgIkFjdGl2ZSB3YW4iCisKKyNkZWZpbmUgWE1MX0NQSF9FTE1fQVBQX1NVUFBPUlQgICAgICAiYXBwX3N1cHBvcnQiCisjZGVmaW5lIFhNTF9DUEhfRUxNX0lHTVBfU1VQUE9SVCAgICAgImlnbXBfc3VwcG9ydCIKKyNkZWZpbmUgWE1MX0NQSF9FTE1fQkNfU1VQUE9SVCAgICAgICAiYmNfc3VwcG9ydCIKKyNkZWZpbmUgWE1MX0NQSF9FTE1fRkxPV19TVVBQT1JUICAgICAiZmxvd19zdXBwb3J0IgorI2RlZmluZSBYTUxfQ1BIX0VMTV9VRFBfU1VQUE9SVCAgICAgICJ1ZHBfc3VwcG9ydCIKKworCisvKiBDUEggcnVsZSBkZWZpbml0aW9uIGZvciBhcHBsaWNhdGlvbiBwYWNrZXQgaGFuZGxpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJPT0wgICAgICAgICAgICAgICAgICB2YWxpZDsKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm07CisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgIHBhcnNlX2tleTsKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtOworICAgIENQSF9BUFBfTU9EX1QgICAgICAgICBtb2RfdmFsdWU7CisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm07CisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgIGZyd2RfdmFsdWU7CisgICAgVUlOVDMyICAgICAgICAgICAgICAgIGNvdW50OyAKK30gQ1BIX0FQUF9SVUxFX1Q7CisKKy8qIENQSCBkYXRhIGJhc2UgZm9yIGFwcGxpY2F0aW9uIHBhY2tldCBoYW5kbGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ1BIX0FQUF9NQVhfUlVMRV9OVU0gICg2NCkKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCAgcHJvZmlsZV9pZDsgICAgICAgLyogQ29tcGxleCBwcm9maWxlIElELCBzZWUgdHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCAgKi8KKyAgICBNVl9BUFBfR01BQ19QT1JUX0UgICAgICAgICBhY3RpdmVfcG9ydDsgICAgICAvKiBDdXJyZW50IGFjdGl2ZSBXQU4gR0UgcG9ydCwgc2VlIE1WX0FQUF9HTUFDX1BPUlRfRSAqLworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgIGFwcF9zdXBwb3J0OyAgICAgIC8qIFdoZXRoZXIgc3VwcG9ydCBnZW5lcmljIGFwcGxpY2F0aW9uIGhhbmRsaW5nICAgICAgICovCisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgaWdtcF9zdXBwb3J0OyAgICAgLyogV2hldGhlciBzdXBwb3J0IElHTVAvTUxEIHBhY2tldCBoYW5kbGluZyAgICAgICAgICAgKi8KKyAgICBCT09MICAgICAgICAgICAgICAgICAgICAgICBiY19zdXBwb3J0OyAgICAgICAvKiBXaGV0aGVyIHN1cHBvcnQgVS9TIGJyb2FkY2FzdCBwYWNrZXQgaGFuZGxpbmcgICAgICAqLworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfc3VwcG9ydDsgICAgIC8qIFdoZXRoZXIgc3VwcG9ydCBmbG93IG1hcHBpbmcgaGFuZGxpbmcgaW4gQ1BIICAgICAgICovCisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgdWRwX3N1cHBvcnQ7ICAgICAgLyogV2hldGhlciBzdXBwb3J0IFVEUCBwb3J0IG1hcHBpbmcgaW4gQ1BIICAgICAgICAgICAgKi8KKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICBydWxlX251bTsgICAgICAgICAvKiBDdXJyZW50IGFwcGxpY2F0aW9uIHJ1bGUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAqLworICAgIENQSF9BUFBfUlVMRV9UICAgICAgICAgICAgIGNwaF9ydWxlW0NQSF9BUFBfTUFYX1JVTEVfTlVNXTsgLyogQ1BIIGFwcGxpY2F0aW9uIHJ1bGVzICAgICAgICAgICAgICAgICovCisgICAgc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgYXBwX2xvY2s7ICAgICAgICAgLyogU3BpbiBsb2NrIGZvciBhcHBsaWNhdGlvbiBydWxlIG9wZXJhdGlvbiAgICAgICAgICAgKi8KKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICBiY19jb3VudDsgICAgICAgICAvKiBDb3VudGVyIGZvciBtaXMtbWF0Y2hlZCBwYWNrZXRzLCB1c3VhbGx5IGlzIGJjICAgICAqLworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgIHRjb250X3N0YXRlW01WX1RDT05UX0xMSURfTlVNXTsvKiBULUNPTlQgc3RhdGUgdXNlZCB0byBjb250cm9sIFNXRiAgICAgICovCit9IENQSF9BUFBfREJfVDsKKworLyogQ1BIIGRhdGFiYXNlIHBhcmFtZXRlciBlbnVtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX0RCX1BBUkFNX1BST0ZJTEVfSUQgPSAwLAorICAgIENQSF9EQl9QQVJBTV9BQ1RJVkVfUE9SVCwKKyAgICBDUEhfREJfUEFSQU1fQVBQX1NVUFBPUlQsICAgIAorICAgIENQSF9EQl9QQVJBTV9JR01QX1NVUFBPUlQsCisgICAgQ1BIX0RCX1BBUkFNX0JDX1NVUFBPUlQsCisgICAgQ1BIX0RCX1BBUkFNX0ZMT1dfU1VQUE9SVCwKKyAgICBDUEhfREJfUEFSQU1fVURQX1NVUFBPUlQsICAgIAorICAgIENQSF9EQl9QQVJBTV9CQ19DT1VOVEVSCit9IENQSF9EQl9QQVJBTV9FOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX3NldF9wYXJhbSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXQgQ1BIIERCIHBhcmFtZXRlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcmFtICAgLSBUaGUgcGFyYW1ldGVyIHR5cGUKKyogICAgICAgdmFsdWUgICAtIFBhcmFtZXRlciB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX3NldF9wYXJhbSAoQ1BIX0RCX1BBUkFNX0UgcGFyYW0sIFZPSUQgKnZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZ2V0X3BhcmFtKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBDUEggREIgcGFyYW1ldGVyCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyYW0gICAtIFRoZSBwYXJhbWV0ZXIgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICB2YWx1ZSAgIC0gUGFyYW1ldGVyIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZ2V0X3BhcmFtIChDUEhfREJfUEFSQU1fRSBwYXJhbSwgVk9JRCAqdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9hZGRfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQWRkIENQSCBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfYWRkX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kZWxfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlcyBDUEggcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2RlbF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl91cGRhdGVfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVXBkYXRlIENQSCBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfdXBkYXRlX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9nZXRfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2dldF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgKm1vZF9ibSwKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICpmcndkX2JtLAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZ2V0X2FwcF9ydWxlX2J5X2Rpcl9wcm90bygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgYXBwbGljYXRpb24gdHlwZSBDUEggcnVsZSBmcm9tIGRhdGEgYmFzZSBieSBwcm90b2NvbCB0eXBlCisqCisqIElOUFVUUzoKKyogICAgICAgZGlyICAgICAgICAtIERpcmVjdGlvbgorKiAgICAgICBwcm90b190eXBlIC0gU0tCIHByb3RvY29sIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2dldF9hcHBfcnVsZV9ieV9kaXJfcHJvdG8gKAorICAgIENQSF9ESVJfRSAgICAgICAgICAgICAgZGlyLAorICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgcHJvdG9fdHlwZSwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgKnBhcnNlX2JtLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICAqcGFyc2Vfa2V5LCAgICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgKm1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICAqZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfaW5jcmVhc2VfY291bnRlcigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbmNyZWFzZSBSWCBjb3VudGVyCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2luY3JlYXNlX2NvdW50ZXIgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046ICBJbmNyZWFzZSBSWCBjb3VudGVyIGFjY29yZGluZyB0byBwcm90b2NvbCB0eXBlCisqCisqIElOUFVUUzoKKyogICAgICAgZGlyICAgICAgICAtIERpcmVjdGlvbgorKiAgICAgICBwcm90b190eXBlIC0gU0tCIHByb3RvY29sIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90byAoQ1BIX0RJUl9FIGRpciwKKyAgICBVSU5UMTYgICAgcHJvdG9fdHlwZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2dldF94bWxfcGFyYW0oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IHRoZSBYTUwgcGFyYW1ldGVyCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9nZXRfeG1sX3BhcmFtKFZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIGNwaF9kYl9nZXRfdGNvbnRfc3RhdGUKKyoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0IFQtQ09OVCBzdGF0ZQorKioKKyoqIElOUFVUUzoKKyoqICAgdGNvbnQgLSBULUNPTlQKKyoqCisqKiBPVVRQVVRTOgorKiogICBOb25lLiAKKyoqCisqKiBSRVRVUk5TOiAgICAgCisqKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLiAgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2RiX2dldF90Y29udF9zdGF0ZShVSU5UMzIgdGNvbnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIGNwaF9kYl9zZXRfdGNvbnRfc3RhdGUKKyoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBULUNPTlQgc3RhdGUgaW4gbXZfY3BoCisqKgorKiogSU5QVVRTOgorKiogICB0Y29udCAtIFQtQ09OVAorKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyoqCisqKiBPVVRQVVRTOgorKiogICBOb25lLiAKKyoqCisqKiBSRVRVUk5TOiAgICAgCisqKiAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKKyoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9zZXRfdGNvbnRfc3RhdGUoVUlOVDMyIHRjb250LCBCT09MIHN0YXRlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZGlzcGxheV9wYXJzZV9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IENQSCBydWxlIHBhcnNpbmcgZmllbGQKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2Rpc3BsYXlfcGFyc2VfZmllbGQoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZGlzcGxheV9tb2RfZmllbGQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGlzcGxheSBDUEggcnVsZSBtb2RpZmljYXRpb24gZmllbGQKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2Rpc3BsYXlfbW9kX2ZpZWxkKAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2Rpc3BsYXlfZnJ3ZF9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IENQSCBydWxlIGZvcndhcmRpbmcgZmllbGQKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2Rpc3BsYXlfZnJ3ZF9maWVsZCgKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2Rpc3BsYXlfYWxsKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERpc3BsYXkgQ1BIIGRhdGEgYmFzZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9kaXNwbGF5X2FsbChWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIENQSCBkYXRhIGJhc2UKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfaW5pdChWT0lEKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NVl9DUEhfREJfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kZXYuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYzY4NTFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Rldi5jCkBAIC0wLDAgKzEsNDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2Rldi5jCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGNoYXIgZGV2aWNlIGRlZmluaXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisKKyNpbmNsdWRlICJtdl9jcGhfaGVhZGVyLmgiCisKKworLyogVXNlZCB0byBwcmV2ZW50IG11bHRpcGxlIGFjY2VzcyB0byBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgICAgICAgICAgICAgICBnX2NwaF9kZXZpY2Vfb3BlbiA9IDA7CitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZ19jcGhfbWlzY19kZXY7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Rldl9vcGVuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBleGVjdXRlcyBkZXZpY2Ugb3BlbiBhY3Rpb25zCisqCisqIElOUFVUUzoKKyogICAgICAgaW5vZGUgLSBEZXZpY2UgaW5vZGUgcG9pbnRlci4KKyogICAgICAgZmlsZSAgLSBGaWxlIGhhbmRsZXIuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQzMiBjcGhfZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIkVudGVyXG4iKTsKKworI2lmIDAKKyAgICBpZiAoZ19jcGhfZGV2aWNlX29wZW4gPiAwKQorICAgICAgICByZXR1cm4gLUVCVVNZOworI2VuZGlmCisKKyAgICBnX2NwaF9kZXZpY2Vfb3BlbisrOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfcmVsZWFzZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgZGV2aWNlIHJlbGVhc2UgYWN0aW9ucworKgorKiBJTlBVVFM6CisqICAgICAgIGlub2RlIC0gRGV2aWNlIGlub2RlIHBvaW50ZXIuCisqICAgICAgIGZpbGUgIC0gRmlsZSBoYW5kbGVyLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UMzIgY3BoX2Rldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJFbnRlclxuIik7CisKKyNpZiAwCisgICAgaWYgKGNwaF9kZXZpY2Vfb3BlbiA+IDApCisgICAgICAgIGNwaF9kZXZpY2Vfb3Blbi0tOworI2VuZGlmCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfaW9jdGwoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGlvY3RsIGNvbW1hbmRzCisqCisqIElOUFVUUzoKKyogICAgICAgaW5vZGUgLSBEZXZpY2UgaW5vZGUgcG9pbnRlci4KKyogICAgICAgZmlsZSAgLSBGaWxlIGhhbmRsZXIuCisqICAgICAgIGNtZCAgIC0gQ29tbWFuZC4KKyogICAgICAgYXJnICAgLSBQb250ZXIgdG8gYXJnLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UMzIgY3BoX2Rldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgVUlOVDMyIGNtZCwgVUxPTkcgYXJnKQoreworICAgIENQSF9JT0NUTF9BUFBfUlVMRV9UICAgIGNwaF9hcHBfcnVsZTsKKyAgICBDUEhfSU9DVExfRkxPV19NQVBfVCAgICBjcGhfZmxvd19tYXA7CisgICAgQ1BIX0lPQ1RMX0RTQ1BfTUFQX1QgICAgY3BoX2RzY3BfbWFwOworICAgIENQSF9JT0NUTF9NSVNDX1QgICAgICAgIGNwaF9taXNjOworICAgIENQSF9JT0NUTF9UQ09OVF9TVEFURV9UIGNwaF90Y29udDsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgICByYyAgPSAtRUlOVkFMOworCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIkVudGVyXG4iKTsKKworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICAgICAgLyogQ1BIIGFwcGxpY2F0aW9uIHBhY2tldCBoYW5kbGluZyBJT0NUTAorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfU0VUX0NPTVBMRVhfUFJPRklMRTogICAgICAgIAorICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmNwaF9taXNjLCAoQ1BIX0lPQ1RMX01JU0NfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9NSVNDX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX3NldF9jb21wbGV4X3Byb2ZpbGUoY3BoX21pc2MucHJvZmlsZV9pZCwgY3BoX21pc2MuYWN0aXZlX3BvcnQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfU0VUX0ZFQVRVUkVfRkxBRzogICAgICAgIAorICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmNwaF9taXNjLCAoQ1BIX0lPQ1RMX01JU0NfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9NSVNDX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX3NldF9mZWF0dXJlX2ZsYWcoY3BoX21pc2MuZmVhdHVyZV90eXBlLCBjcGhfbWlzYy5mZWF0dXJlX2ZsYWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0FQUF9BRERfUlVMRTogICAgICAgIAorICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmNwaF9hcHBfcnVsZSwgKENQSF9JT0NUTF9BUFBfUlVMRV9UICopYXJnLCBzaXplb2YoQ1BIX0lPQ1RMX0FQUF9SVUxFX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX2FkZF9hcHBfcnVsZShjcGhfYXBwX3J1bGUucGFyc2VfYm0sICZjcGhfYXBwX3J1bGUucGFyc2Vfa2V5LCBjcGhfYXBwX3J1bGUubW9kX2JtLCAmY3BoX2FwcF9ydWxlLm1vZF92YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BoX2FwcF9ydWxlLmZyd2RfYm0sICZjcGhfYXBwX3J1bGUuZnJ3ZF92YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9BUFBfREVMX1JVTEU6ICAgICAgICAKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfYXBwX3J1bGUsIChDUEhfSU9DVExfQVBQX1JVTEVfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9BUFBfUlVMRV9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNwaF9kZWxfYXBwX3J1bGUoY3BoX2FwcF9ydWxlLnBhcnNlX2JtLCAmY3BoX2FwcF9ydWxlLnBhcnNlX2tleSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9BUFBfVVBEQVRFX1JVTEU6ICAgICAgICAKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfYXBwX3J1bGUsIChDUEhfSU9DVExfQVBQX1JVTEVfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9BUFBfUlVMRV9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNwaF91cGRhdGVfYXBwX3J1bGUoY3BoX2FwcF9ydWxlLnBhcnNlX2JtLCAmY3BoX2FwcF9ydWxlLnBhcnNlX2tleSwgY3BoX2FwcF9ydWxlLm1vZF9ibSwgJmNwaF9hcHBfcnVsZS5tb2RfdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaF9hcHBfcnVsZS5mcndkX2JtLCAmY3BoX2FwcF9ydWxlLmZyd2RfdmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfQVBQX0dFVF9SVUxFOiAgICAgICAgCisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2FwcF9ydWxlLCAoQ1BIX0lPQ1RMX0FQUF9SVUxFX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfQVBQX1JVTEVfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfZ2V0X2FwcF9ydWxlKGNwaF9hcHBfcnVsZS5wYXJzZV9ibSwgJmNwaF9hcHBfcnVsZS5wYXJzZV9rZXksICZjcGhfYXBwX3J1bGUubW9kX2JtLCAmY3BoX2FwcF9ydWxlLm1vZF92YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwaF9hcHBfcnVsZS5mcndkX2JtLCAmY3BoX2FwcF9ydWxlLmZyd2RfdmFsdWUpOworCisgICAgICAgICAgICBpZihyYyAhPSBNVl9PSykKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKworICAgICAgICAgICAgaWYoY29weV90b191c2VyKChDUEhfSU9DVExfQVBQX1JVTEVfVCopYXJnLCAmY3BoX2FwcF9ydWxlLCBzaXplb2YoQ1BIX0lPQ1RMX0FQUF9SVUxFX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfdG9fdXNlciBmYWlsZWRcbiIpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIC8qIENQSCBmbG93IG1hcHBpbmcgSU9DVEwKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0ZMT1dfQUREX1JVTEU6CisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2Zsb3dfbWFwLCAoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfRkxPV19NQVBfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfYWRkX2Zsb3dfcnVsZSgmY3BoX2Zsb3dfbWFwLmZsb3dfbWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0ZMT1dfREVMX1JVTEU6CisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2Zsb3dfbWFwLCAoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfRkxPV19NQVBfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfZGVsX2Zsb3dfcnVsZSgmY3BoX2Zsb3dfbWFwLmZsb3dfbWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0ZMT1dfR0VUX1JVTEU6CisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2Zsb3dfbWFwLCAoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfRkxPV19NQVBfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICByYyA9IGNwaF9nZXRfZmxvd19ydWxlKCZjcGhfZmxvd19tYXAuZmxvd19tYXApOworICAgICAgICAKKyAgICAgICAgICAgIGlmKHJjICE9IE1WX09LKQorICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAKKyAgICAgICAgICAgIGlmKGNvcHlfdG9fdXNlcigoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QqKWFyZywgJmNwaF9mbG93X21hcCwgc2l6ZW9mKENQSF9JT0NUTF9GTE9XX01BUF9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X3RvX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0gICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9GTE9XX0NMRUFSX1JVTEU6CisgICAgICAgICAgICByYyA9IGNwaF9jbGVhcl9mbG93X3J1bGUoKTsKKyAgICAgICAgICAgIGJyZWFrOyAKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9GTE9XX0NMRUFSX1JVTEVfQllfTUg6CisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2Zsb3dfbWFwLCAoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfRkxPV19NQVBfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfY2xlYXJfZmxvd19ydWxlX2J5X21oKGNwaF9mbG93X21hcC5mbG93X21hcC5taCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9GTE9XX1NFVF9EU0NQX01BUDoKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfZHNjcF9tYXAsIChDUEhfSU9DVExfRFNDUF9NQVBfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9EU0NQX01BUF9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNwaF9zZXRfZmxvd19kc2NwX21hcCgmY3BoX2RzY3BfbWFwLmRzY3BfbWFwKTsKKyAgICAgICAgICAgIGJyZWFrOyAgCisKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfRkxPV19ERUxfRFNDUF9NQVA6CisgICAgICAgICAgICByYyA9IGNwaF9kZWxfZmxvd19kc2NwX21hcCgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfU0VUX1RDT05UX0xMSURfU1RBVEU6CisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX3Rjb250LCAoVUlOVDMyICopYXJnLCBzaXplb2YoQ1BIX0lPQ1RMX1RDT05UX1NUQVRFX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX3NldF90Y29udF9zdGF0ZShjcGhfdGNvbnQudGNvbnQsIGNwaF90Y29udC5zdGF0ZSk7CisgICAgICAgICAgICBicmVhazsgIAorICAgICAgICAgICAgCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX1NFVFVQOgorICAgICAgICAgICAgcmMgPSBjcGhfZGV2X3NldHVwKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJjID0gLUVJTlZBTDsKKyAgICB9CisKK2lvY3RsX2VycjoKKyAgICByZXR1cm4ocmMpOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdfY3BoX2Rldl9mb3BzID0gCit7CisgICAgLm9wZW4gICAgPSBjcGhfZGV2X29wZW4sCisgICAgLnJlbGVhc2UgPSBjcGhfZGV2X3JlbGVhc2UsCisgICAgLmlvY3RsICAgPSBjcGhfZGV2X2lvY3RsLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGV2X3NldHVwKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldHVwIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9kZXZfc2V0dXAoVk9JRCkKK3sKKyAgICBNVl9TVEFUVVMgcmMgID0gTVZfT0s7CisKKyAgICAvKiBHZXQgcGFyYW1ldGVyIGZyb20gWE1MIGZpbGUgKi8KKyAgICByYyA9IGNwaF9kYl9nZXRfeG1sX3BhcmFtKCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9kYl9nZXRfeG1sX3BhcmFtIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Rldl9pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemUgQ1BIIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9kZXZfaW5pdChWT0lEKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJFbnRlclxuIik7CisKKyAgICBnX2NwaF9taXNjX2Rldi5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUjsKKyAgICBnX2NwaF9taXNjX2Rldi5uYW1lICA9IE1WX0NQSF9ERVZJQ0VfTkFNRTsKKyAgICBnX2NwaF9taXNjX2Rldi5mb3BzICA9ICZnX2NwaF9kZXZfZm9wczsKKworICAgIHJjID0gbWlzY19yZWdpc3RlcigmZ19jcGhfbWlzY19kZXYpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBtaXNjX3JlZ2lzdGVyIik7CisKKyAgICByYyA9IGNwaF9uZXRkZXZfaW5pdCgpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfbmV0ZGV2X2luaXQiKTsKKworICAgIHJjID0gY3BoX3N5c2ZzX2luaXQoKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX3N5c2ZzX2luaXQiKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIkNQSDogbWlzYyBkZXZpY2UgJXMgcmVnaXN0ZXJlZCB3aXRoIG1pbm9yOiAlZFxuIiwgTVZfQ1BIX0RFVklDRV9OQU1FLCBnX2NwaF9taXNjX2Rldi5taW5vcik7CisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfc2h1dGRvd24oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2h1dGRvd24gQ1BIIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCBjcGhfZGV2X3NodXRkb3duKFZPSUQpCit7CisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIkVudGVyXG4iKTsKKworICAgIGNwaF9zeXNmc19leGl0KCk7CisKKyAgICBtaXNjX2RlcmVnaXN0ZXIoJmdfY3BoX21pc2NfZGV2KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kZXYuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ODQ0Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Rldi5oCkBAIC0wLDAgKzEsMTUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2Rldi5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGNoYXIgZGV2aWNlIGRlZmluaXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX0RFVl9IXworI2RlZmluZSBfTVZfQ1BIX0RFVl9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBNVl9DUEhfREVWSUNFX05BTUUgICJjcGgiCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9NQUdJQyAgKCdDJykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gRGVjbGFyYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfc2V0dXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0dXAgZGV2aWNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Rldl9zZXR1cChWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGV2X3NodXRkb3duKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemUgQ1BIIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfZGV2X2luaXQgKFZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfc2h1dGRvd24oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2h1dGRvd24gQ1BIIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCAgIGNwaF9kZXZfc2h1dGRvd24gKFZPSUQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTVZfQ1BIX0RFVl9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Zsb3cuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9mbG93LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWFlMjEyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9mbG93LmMKQEAgLTAsMCArMSwxODYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2Zsb3cuYworKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBmbG93IG1vZHVsZSB0byBoYW5kbGUgdGhlIAorKiAgICAgICAgICAgICAgZmxvdyBtYXBwaW5nLCBWTEFOIG1vZGlmaWNhdGlvbiBvZiBkYXRhIHRyYWZmaWMKKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDEyRGVjMjAxMQorKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4xCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorCisjaW5jbHVkZSAibXZfY3BoX2hlYWRlci5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBEYXRhIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIENQSF9GTE9XX1RBQkxFX1QgZ3NfZmxvd190YWJsZTsKK3N0YXRpYyBDUEhfRFNDUF9QQklUU19UIGdzX2RzY3BfbWFwX3RhYmxlOworCitzdGF0aWMgTVZfRU5VTV9FTlRSWV9UIGdfZW51bV9tYXBfb3BfdHlwZVtdID0KK3sKKyAgICB7IENQSF9WTEFOX09QX0FTSVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTSVMifSwKKyAgICB7IENQSF9WTEFOX09QX0RJU0NBUkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRJU0NBUkQifSwKKyAgICB7IENQSF9WTEFOX09QX0FERCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFERCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfRFNDUCwgICAgICAgICAgICAgICAgICAgICAiQUREX0NPUFlfRFNDUCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfT1VURVJfUEJJVCwgICAgICAgICAgICAgICAiQUREX0NPUFlfT1VURVJfUEJJVCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfSU5ORVJfUEJJVCwgICAgICAgICAgICAgICAiQUREX0NPUFlfSU5ORVJfUEJJVCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHUywgICAgICAgICAgICAgICAgICAgICAgICAiQUREXzJfVEFHUyJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHU19DT1BZX0RTQ1AsICAgICAgICAgICAgICAiQUREXzJfVEFHU19DT1BZX0RTQ1AifSwKKyAgICB7IENQSF9WTEFOX09QX0FERF8yX1RBR1NfQ09QWV9QQklULCAgICAgICAgICAgICAgIkFERF8yX1RBR1NfQ09QWV9QQklUIn0sCisgICAgeyBDUEhfVkxBTl9PUF9SRU0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRU0ifSwKKyAgICB7IENQSF9WTEFOX09QX1JFTV8yX1RBR1MsICAgICAgICAgICAgICAgICAgICAgICAgIlJFTV8yX1RBR1MifSwKKyAgICB7IENQSF9WTEFOX09QX1JFUExBQ0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFUExBQ0UifSwgICAgCisgICAgeyBDUEhfVkxBTl9PUF9SRVBMQUNFX1ZJRCwgICAgICAgICAgICAgICAgICAgICAgICJSRVBMQUNFX1ZJRCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9QQklULCAgICAgICAgICAgICAgICAgICAgICAiUkVQTEFDRV9QQklUIn0sCisgICAgeyBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX0FERF9PVVRFUiwgICAgICAgICAgICJSRVBMQUNFX0lOTkVSX0FERF9PVVRFUiJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9JTk5FUl9BRERfT1VURVJfQ09QWV9QQklULCAiUkVQTEFDRV9JTk5FUl9BRERfT1VURVJfQ09QWV9QQklUIn0sCisgICAgeyBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX1JFTV9PVVRFUiwgICAgICAgICAgICJSRVBMQUNFX0lOTkVSX1JFTV9PVVRFUiJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfUkVQTEFDRV8yVEFHUywgICAgICAgICAgICAgICAgICAgICAiUkVQTEFDRV8yVEFHUyJ9LCAgICAKKyAgICB7IENQSF9WTEFOX09QX1JFUExBQ0VfMlRBR1NfVklELCAgICAgICAgICAgICAgICAgIlJFUExBQ0VfMlRBR1NfVklEIn0sCisgICAgeyBDUEhfVkxBTl9PUF9TV0FQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTV0FQIn0gICAgCit9OworCitzdGF0aWMgTVZfRU5VTV9BUlJBWV9UIGdfZW51bV9hcnJheV9vcF90eXBlID0KK3sKKyAgICBzaXplb2YoZ19lbnVtX21hcF9vcF90eXBlKS9zaXplb2YoZ19lbnVtX21hcF9vcF90eXBlWzBdKSwKKyAgICBnX2VudW1fbWFwX29wX3R5cGUKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgRGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kYl9nZXRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgQ1BIIGZsb3cgbWFwcGluZyBydWxlLgorKgorKiBJTlBVVFM6CisqICAgICAgIGZsb3cgICAgICAgLSBGbG93IHBhcnNpbmcgZmllbGQgdmFsdWVzCisqICAgICAgIGZvcl9wYWNrZXQgLSBXaGV0aGVyIGdldCBydWxlIGZvciBwYWNrZXQgb3IgZm9yIG5ldyBDUEggcnVsZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfZGJfZ2V0X3J1bGUgKENQSF9GTE9XX0VOVFJZX1QgKmZsb3csIEJPT0wgZm9yX3BhY2tldCkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgICBpZHggICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgICAgcnVsZV9pZHggICAgPSAwOworICAgIENQSF9GTE9XX0VOVFJZX1QgKnBfZmxvd19ydWxlID0gTlVMTDsKKyAgICBCT09MICAgICAgICAgICAgICByYyAgICAgICAgICA9IEZBTFNFOworICAgIHVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7CisgICAgLyogVHJhdmVyc2UgQ1BIIGZsb3cgcnVsZSB0YWJsZSAqLworICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0ZMT1dfRU5UUllfTlVNKSAmJiAocnVsZV9pZHggPCBnc19mbG93X3RhYmxlLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2Zsb3dfcnVsZSA9ICZnc19mbG93X3RhYmxlLmZsb3dfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYWNrZXQgb3IgbmV3IHJ1bGUgcnVsZSBkYXRhIGJhc2UgcnVsZSAqLworICAgICAgICBpZiAocF9mbG93X3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIGlmIChmb3JfcGFja2V0ID09IFRSVUUpICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfY29tcGFyZV9wYWNrZXRfYW5kX3J1bGUoZmxvdywgcF9mbG93X3J1bGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfY29tcGFyZV9ydWxlcyhmbG93LCBwX2Zsb3dfcnVsZSk7CisKKyAgICAgICAgICAgIGlmIChyYyA9PSBUUlVFKQorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIGZsb3ctPm9wX3R5cGUgPSBwX2Zsb3dfcnVsZS0+b3BfdHlwZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmZsb3ctPm1vZF9vdXRlcl90Y2ksICZwX2Zsb3dfcnVsZS0+bW9kX291dGVyX3RjaSwgc2l6ZW9mKENQSF9GTE9XX1RDSV9UKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZmbG93LT5tb2RfaW5uZXJfdGNpLCAmcF9mbG93X3J1bGUtPm1vZF9pbm5lcl90Y2ksIHNpemVvZihDUEhfRkxPV19UQ0lfVCkpOworICAgICAgICAgICAgICAgIG1lbWNweSgmZmxvdy0+cGt0X2Zyd2QsICAgICAgJnBfZmxvd19ydWxlLT5wa3RfZnJ3ZCwgICAgICBzaXplb2YoQ1BIX0ZMT1dfRlJXRF9UKSk7CisKKyAgICAgICAgICAgICAgICAvKiBJbmNyZWFzZSBjb3VudCAqLworICAgICAgICAgICAgICAgIGlmIChmb3JfcGFja2V0ID09IFRSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocF9mbG93X3J1bGUtPmNvdW50ID09IDB4RkZGRkZGRkYpCisgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+Y291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+Y291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIE1WX0ZBSUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGJfYWRkX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQWRkIGZsb3cgcnVsZSB0byBkYXRhYmFzZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2RiX2FkZF9ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KQoreworICAgIFVJTlQzMiAgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBDUEhfRkxPV19FTlRSWV9UICpwX2Zsb3dfcnVsZSA9IE5VTEw7CisgICAgQk9PTCAgICAgICAgICAgICAgcmMgICAgICAgICAgPSBNVl9PSzsKKyAgICB1bnNpZ25lZCBsb25nICAgICBmbGFnczsKKworICAgIC8qIElmIHRoZSBmbG93IHRhYmxlIGlzIGZ1bGwgKi8KKyAgICBpZiAoZ3NfZmxvd190YWJsZS5ydWxlX251bSA+PSBDUEhfRkxPV19FTlRSWV9OVU0pCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCksIGZsb3cgcnVsZSB0YWJsZSBpcyBmdWxsPCVkPiBcbiIsIF9fRlVOQ1RJT05fXywgZ3NfZmxvd190YWJsZS5ydWxlX251bSk7CisgICAgICAgIHJldHVybiBNVl9GVUxMOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgY29uZmxpY3RlZCBydWxlcyAqLworICAgIGlmIChjcGhfZmxvd19kYl9nZXRfcnVsZShjcGhfZmxvdywgRkFMU0UpID09IE1WX09LKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIiVzKCksIGFscmVhZHkgaGFzIGNvbmZsaWN0IGZsb3cgcnVsZSBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICB9CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsgICAgCisgICAgLyogVHJhdmVyc2UgQ1BIIGZsb3cgcnVsZSB0YWxlICovCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBDUEhfRkxPV19FTlRSWV9OVU07IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9mbG93X3J1bGUgPSAmZ3NfZmxvd190YWJsZS5mbG93X3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSAqLworICAgICAgICBpZiAocF9mbG93X3J1bGUtPnZhbGlkID09IEZBTFNFKQorICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaWR4ID09IENQSF9GTE9XX0VOVFJZX05VTSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKSwgZmxvdyBydWxlIHRhYmxlIGlzIGZ1bGw8JWQ+IFxuIiwgX19GVU5DVElPTl9fLCBnc19mbG93X3RhYmxlLnJ1bGVfbnVtKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsgICAgICAgIAorICAgICAgICByZXR1cm4gTVZfRlVMTDsgICAgCisgICAgfQorCisgICAgLyogU2F2ZSB0byBkYiAqLworICAgIG1lbWNweShwX2Zsb3dfcnVsZSwgY3BoX2Zsb3csIHNpemVvZihDUEhfRkxPV19FTlRSWV9UKSk7CisgICAgcF9mbG93X3J1bGUtPnZhbGlkID0gVFJVRTsKKyAgICBwX2Zsb3dfcnVsZS0+Y291bnQgPSAwOworICAgIGdzX2Zsb3dfdGFibGUucnVsZV9udW0gKys7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiByYzsgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kYl9kZWxfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGUgQ1BIIGZsb3cgbWFwcGluZyBydWxlLgorKgorKiBJTlBVVFM6CisqICAgICAgIGZsb3cgLSBGbG93IHBhcnNpbmcgZmllbGQgdmFsdWVzCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19kYl9kZWxfcnVsZSAoQ1BIX0ZMT1dfRU5UUllfVCAqZmxvdykKK3sKKyAgICBVSU5UMzIgICAgICAgICAgICBpZHggICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgICAgcnVsZV9pZHggICAgPSAwOworICAgIENQSF9GTE9XX0VOVFJZX1QgKnBfZmxvd19ydWxlID0gTlVMTDsKKyAgICBCT09MICAgICAgICAgICAgICByYyAgICAgICAgICA9IE1WX09LOworICAgIHVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworIAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOyAgICAKKyAgICAvKiBUcmF2ZXJzZSBDUEggZmxvdyBydWxlIHRhbGUgKi8KKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9GTE9XX0VOVFJZX05VTSkgJiYgKHJ1bGVfaWR4IDwgZ3NfZmxvd190YWJsZS5ydWxlX251bSk7IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9mbG93X3J1bGUgPSAmZ3NfZmxvd190YWJsZS5mbG93X3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSAqLworICAgICAgICBpZiAocF9mbG93X3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfY29tcGFyZV9ydWxlcyhmbG93LCBwX2Zsb3dfcnVsZSk7CisgICAgICAgICAgICBpZiAocmMgPT0gVFJVRSkKKyAgICAgICAgICAgIHsgICAKKyAgICAgICAgICAgICAgICBtZW1zZXQocF9mbG93X3J1bGUsIDAsIHNpemVvZihDUEhfRkxPV19FTlRSWV9UKSk7CisgICAgICAgICAgICAgICAgcF9mbG93X3J1bGUtPnZhbGlkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgZ3NfZmxvd190YWJsZS5ydWxlX251bS0tOworCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGJfY2xlYXJfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhciBDUEggZmxvdyBtYXBwaW5nIHJ1bGVzLgorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19kYl9jbGVhcl9ydWxlIChWT0lEKQoreworICAgIFVJTlQzMiBpZHggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsgICAgCisgICAgLyogSW5pdGlhbGl6ZXMgZmxvdyBydWxlICovCisgICAgbWVtc2V0KChVSU5UOCAqKSZnc19mbG93X3RhYmxlLCAwLCBzaXplb2YoQ1BIX0ZMT1dfVEFCTEVfVCkpOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgQ1BIX0ZMT1dfRU5UUllfTlVNOyBpZHgrKykKKyAgICAgICAgZ3NfZmxvd190YWJsZS5mbG93X3J1bGVbaWR4XS52YWxpZCA9IEZBTFNFOworICAgIAorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGJfY2xlYXJfcnVsZV9ieV9taCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhciBDUEggZmxvdyBtYXBwaW5nIHJ1bGVzIGJ5IE1ILgorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAtICBNYXJ2ZWxsIGhlYWRlci4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X2RiX2NsZWFyX3J1bGVfYnlfbWggKFVJTlQxNiBtaCkKK3sKKyAgICBDUEhfRkxPV19FTlRSWV9UICAgKnBfZmxvd19ydWxlID0gTlVMTDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIGlkeCA9IDA7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKKyAgICAKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsgICAgCisgICAgLyogSW5pdGlhbGl6ZXMgZmxvdyBydWxlICovCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBDUEhfRkxPV19FTlRSWV9OVU07IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9mbG93X3J1bGUgPSAmZ3NfZmxvd190YWJsZS5mbG93X3J1bGVbaWR4XTsKKworICAgICAgICBpZiAoKHBfZmxvd19ydWxlLT52YWxpZCA9PSBUUlVFKSAmJgorICAgICAgICAgICAgKHBfZmxvd19ydWxlLT5taCA9PSBtaCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldChwX2Zsb3dfcnVsZSwgMCwgc2l6ZW9mKENQSF9GTE9XX0VOVFJZX1QpKTsKKyAgICAgICAgICAgIHBfZmxvd19ydWxlLT52YWxpZCA9IEZBTFNFOworICAgICAgICAgICAgZ3NfZmxvd190YWJsZS5ydWxlX251bS0tOworICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGJfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIENQSCBmbG93IG1hcHBpbmcgZGF0YWJhc2UuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X2RiX2luaXQgKFZPSUQpCit7CisgICAgVUlOVDMyIGlkeCA9IDA7CisgICAgCisgICAgLyogSW5pdGlhbGl6ZXMgZmxvdyBydWxlICovCisgICAgbWVtc2V0KChVSU5UOCAqKSZnc19mbG93X3RhYmxlLCAwLCBzaXplb2YoQ1BIX0ZMT1dfVEFCTEVfVCkpOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgQ1BIX0ZMT1dfRU5UUllfTlVNOyBpZHgrKykKKyAgICAgICAgZ3NfZmxvd190YWJsZS5mbG93X3J1bGVbaWR4XS52YWxpZCA9IEZBTFNFOworCisgICAgc3Bpbl9sb2NrX2luaXQoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrKTsKKworICAgIC8qIEluaXRpYWxpemVzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgdGFibGUgKi8KKyAgICBtZW1zZXQoKFVJTlQ4ICopJmdzX2RzY3BfbWFwX3RhYmxlLCAwLCBzaXplb2YoQ1BIX0RTQ1BfUEJJVFNfVCkpOworICAgIGdzX2RzY3BfbWFwX3RhYmxlLmluX3VzZSA9IDA7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfdmVyaWZ5X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVmVyaWZ5IGZsb3cgbWFwcGluZyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgdGNpICAgICAgICAgLSBUUElELCBWTEFOIElELCBQLWJpdHMgaW5mb3JtYXRpb24uCisqICAgICAgIHBhcnNlX2ZpZWxkIC0gV2hldGhlciB0aGUgVENJIGlzIGZyb20gcGFyc2luZyBmaWVsZC4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgVFJVRS4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCAgY3BoX2Zsb3dfdmVyaWZ5X3RjaShDUEhfRkxPV19UQ0lfVCAqdGNpLCBCT09MIHBhcnNlX2ZpZWxkKQoreworICAgIFVJTlQxNiBtYXhfdmlkICAgPSAwOworICAgIFVJTlQxNiBtYXhfcGJpdHMgPSAwOworICAgIAorICAgIGlmIChwYXJzZV9maWVsZCA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgbWF4X3ZpZCAgID0gTVZfQ1BIX1ZJRF9OT1RfQ0FSRV9WQUxVRTsKKyAgICAgICAgbWF4X3BiaXRzID0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtYXhfdmlkICAgPSBNVl9WTEFOX0lEX01BWDsKKyAgICAgICAgbWF4X3BiaXRzID0gTVZfUEJJVFNfTUFYOyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qIENoZWNrIFRQSUQgKi8KKyAgICBpZiAoKHRjaS0+dHBpZCAhPSBNVl9UUElEXzgxMDApICYmCisgICAgICAgICh0Y2ktPnRwaWQgIT0gTVZfVFBJRF85MTAwKSAmJgorICAgICAgICAodGNpLT50cGlkICE9IE1WX1RQSURfODhBOCkgJiYKKyAgICAgICAgKCh0Y2ktPnRwaWQgIT0gTVZfQ1BIX1RQSURfTk9UX0NBUkVfVkFMVUUpICYmIChwYXJzZV9maWVsZCA9PSBUUlVFKSkpIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJ0cGlkWzB4JXhdIGlzIGludmFsaWQgXG4iLCB0Y2ktPnRwaWQpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogQ2hlY2sgVklEICovCisgICAgaWYgKHRjaS0+dmlkID4gbWF4X3ZpZCkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInZpZFslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcbiIsIHRjaS0+dmlkLCBtYXhfdmlkKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAKKyAgICAvKiBDaGVjayBQLWJpdHMgKi8KKyAgICBpZiAodGNpLT5wYml0cyA+IG1heF9wYml0cykgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInBiaXRzWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuIiwgdGNpLT5wYml0cywgbWF4X3BiaXRzKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd192ZXJpZnlfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBWZXJpZnkgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgVFJVRS4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCAgY3BoX2Zsb3dfdmVyaWZ5X3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3csIEJPT0wgZnVsbCkKK3sKKyAgICBDUEhfRElSX0UgICAgICAgICAgZGlyICAgICAgICAgPSBDUEhfRElSX1VTOworICAgIENQSF9GTE9XX1BBUlNFX0UgICBwYXJzZV9ibSAgICA9IDA7CisgICAgQ1BIX1ZMQU5fT1BfVFlQRV9FIG9wX3R5cGUgICAgID0gMDsgICAgCisgICAgQ1BIX0ZMT1dfRlJXRF9UICAgKnBfcGt0X2Z3ZCAgID0gTlVMTDsKKyAgICBCT09MICAgICAgICAgICAgICAgcmMgICAgICAgICAgPSBUUlVFOworCisgICAgLyogR2V0IGlucHV0IGluZm9ybWF0aW9uOiBWSUQsIFAtYml0cy4uLiAqLworICAgIGlmIChjcGhfZmxvdyA9PSBOVUxMKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY3BoX2Zsb3cgaXMgTlVMTCBcbiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAKKworICAgIGRpciAgICAgICA9ICBjcGhfZmxvdy0+ZGlyOyAgICAKKyAgICBwYXJzZV9ibSAgPSAgY3BoX2Zsb3ctPnBhcnNlX2JtOworICAgIG9wX3R5cGUgICA9ICBjcGhfZmxvdy0+b3BfdHlwZTsgICAgCisgICAgcF9wa3RfZndkID0gJmNwaF9mbG93LT5wa3RfZnJ3ZDsKKworICAgIC8qIENoZWNrIGRpciAqLworICAgIGlmIChkaXIgPj0gQ1BIX0RJUl9OT1RfQ0FSRSkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImRpclslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcbiIsIGRpciwgQ1BIX0RJUl9OT1RfQ0FSRSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBwYXJzZV9ibSAqLworICAgIGlmICgocGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9FWFRfVkxBTikgJiYgCisgICAgICAgIChwYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX1RXT19WTEFOKSkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIkNhbm4ndCBzZXQgcGFyc2VfYm0gQ1BIX0ZMT1dfUEFSU0VfRVhUX1ZMQU4gYW5kIENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOIGF0IHRoZSBzYW1lIHRpbWUgXG4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gICAgICAKKworICAgIC8qIENoZWNrIG9wX3R5cGUgKi8KKyAgICBpZiAob3BfdHlwZSA+IENQSF9WTEFOX09QX1NXQVApIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJvcF90eXBlWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuIiwgb3BfdHlwZSwgQ1BIX1ZMQU5fT1BfU1dBUCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgCisgICAgLyogQ2hlY2sgVENJICovCisgICAgcmMgPSBjcGhfZmxvd192ZXJpZnlfdGNpKCZjcGhfZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLCBUUlVFKTsKKyAgICBpZiAocmMgPT0gRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByYyA9IGNwaF9mbG93X3ZlcmlmeV90Y2koJmNwaF9mbG93LT5wYXJzZV9pbm5lcl90Y2ksIFRSVUUpOworICAgIGlmIChyYyA9PSBGQUxTRSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJjID0gY3BoX2Zsb3dfdmVyaWZ5X3RjaSgmY3BoX2Zsb3ctPm1vZF9vdXRlcl90Y2ksIEZBTFNFKTsKKyAgICBpZiAocmMgPT0gRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByYyA9IGNwaF9mbG93X3ZlcmlmeV90Y2koJmNwaF9mbG93LT5tb2RfaW5uZXJfdGNpLCBGQUxTRSk7CisgICAgaWYgKHJjID09IEZBTFNFKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgCisgICAgLyogQ2hlY2sgdGFyZ2V0IHBvcnQvcXVldWUvR0VNIHBvcnQgKi8gCisgICAgaWYgKHBfcGt0X2Z3ZC0+dHJnX3BvcnQgPiBNVl9UQ09OVF9MTElEX01BWCkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInRyZ19wb3J0WyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuIiwgcF9wa3RfZndkLT50cmdfcG9ydCwgTVZfVENPTlRfTExJRF9NQVgpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKHBfcGt0X2Z3ZC0+dHJnX3F1ZXVlID4gTVZfUVVFVUVfTUFYKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiU1dGIHRyZ19xdWV1ZVslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcbiIsIHBfcGt0X2Z3ZC0+dHJnX3F1ZXVlLCBNVl9RVUVVRV9NQVgpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAgIAorCisgICAgaWYgKHBfcGt0X2Z3ZC0+dHJnX2h3Zl9xdWV1ZSA+IE1WX1FVRVVFX01BWCkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIkhXRiB0cmdfcXVldWVbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG4iLCBwX3BrdF9md2QtPnRyZ19od2ZfcXVldWUsIE1WX1FVRVVFX01BWCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9ICAgICAgIAorCisgICAgaWYgKHBfcGt0X2Z3ZC0+Z2VtX3BvcnQgPiBNVl9HRU1fUE9SVF9NQVgpIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJnZW1fcG9ydFslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcbiIsIHBfcGt0X2Z3ZC0+Z2VtX3BvcnQsIE1WX0dFTV9QT1JUX01BWCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kaXNwbGF5X3RjaSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IFRDSSB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIHRjaSAgICAgICAgIC0gVENJIGZpZWxkCisqICAgICAgIHRyYWNlX2xldmVsIC0gVHJhY2UgYW5kIGRlYnVnIGxldmVsCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1ZPSUQgIGNwaF9mbG93X2Rpc3BsYXlfdGNpKENQSF9GTE9XX1RDSV9UICp0Y2ksIFVJTlQzMiB0cmFjZV9sZXZlbCkKK3sKKyAgICBNVl9DUEhfUFJJTlQodHJhY2VfbGV2ZWwsIAorICAgICAgICAgICAgICAgICAiVFBJRFsweCV4XSwgdmlkWyVkXSwgcC1iaXRzWyVkXVxuIiwKKyAgICAgICAgICAgICAgICAgKCh0Y2kgIT0gTlVMTCk/IHRjaS0+dHBpZDowKSwKKyAgICAgICAgICAgICAgICAgKCh0Y2kgIT0gTlVMTCk/IHRjaS0+dmlkOjApLCAKKyAgICAgICAgICAgICAgICAgKCh0Y2kgIT0gTlVMTCk/IHRjaS0+cGJpdHM6MCkpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19hZGRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXRzIGZsb3cgbWFwcGluZyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfZmxvd19hZGRfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdykKK3sKKyAgICBCT09MIHJjID0gVFJVRTsKKworICAgIC8qIERpc3BsYXkgaW5wdXQgQ1BIIGZsb3cgKi8KKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAKKyAgICAgICAgICAgICAgICAgIi0tLS0+XG4gZGVmYXVsdCBydWxlWyVzXSwgZGlyWyVkXSwgcGFyc2UgYm1bJXhdLCBtaFslZF0sIGV0aCB0eXBlWzB4JXhdLCBvcCB0eXBlWyVkXSwgdHJnIHBvcnRbJWRdLCBTV0YgcXVldWVbJWRdLCBIV0YgcXVldWVbJWRdLCBHRU0gcG9ydFslZF1cbiIsCisgICAgICAgICAgICAgICAgIChjcGhfZmxvdy0+aXNfZGVmYXVsdCA9PSBUUlVFKT8gIlllcyI6Ik5vIiwKKyAgICAgICAgICAgICAgICAgY3BoX2Zsb3ctPmRpciwgY3BoX2Zsb3ctPnBhcnNlX2JtLCBjcGhfZmxvdy0+bWgsIGNwaF9mbG93LT5ldGhfdHlwZSwgY3BoX2Zsb3ctPm9wX3R5cGUsCisgICAgICAgICAgICAgICAgIGNwaF9mbG93LT5wa3RfZnJ3ZC50cmdfcG9ydCwgY3BoX2Zsb3ctPnBrdF9mcndkLnRyZ19xdWV1ZSwgY3BoX2Zsb3ctPnBrdF9mcndkLnRyZ19od2ZfcXVldWUsIGNwaF9mbG93LT5wa3RfZnJ3ZC5nZW1fcG9ydCk7CisgICAgY3BoX2Zsb3dfZGlzcGxheV90Y2koJmNwaF9mbG93LT5wYXJzZV9vdXRlcl90Y2ksIENQSF9ERUJVR19MRVZFTCk7CisgICAgY3BoX2Zsb3dfZGlzcGxheV90Y2koJmNwaF9mbG93LT5wYXJzZV9pbm5lcl90Y2ksIENQSF9ERUJVR19MRVZFTCk7CisgICAgY3BoX2Zsb3dfZGlzcGxheV90Y2koJmNwaF9mbG93LT5tb2Rfb3V0ZXJfdGNpLCBDUEhfREVCVUdfTEVWRUwpOworICAgIGNwaF9mbG93X2Rpc3BsYXlfdGNpKCZjcGhfZmxvdy0+bW9kX2lubmVyX3RjaSwgQ1BIX0RFQlVHX0xFVkVMKTsKKyAgICAgICAgICAgIAorICAgIC8qIFZlcmlmeSBDUEggZmxvdyBydWxlICovCisgICAgcmMgPSBjcGhfZmxvd192ZXJpZnlfcnVsZShjcGhfZmxvdywgVFJVRSk7CisgICAgaWYgKHJjID09IEZBTFNFKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKSwgdmVyaWZ5IHJ1bGUgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE1WX0ZBSUw7CisgICAgfQorCisgICAgLyogQWRkIGZsb3cgcnVsZSB0byBkYXRhIGJhc2UgKi8KKyAgICBpZiAoY3BoX2Zsb3dfZGJfYWRkX3J1bGUoY3BoX2Zsb3cpICE9IE1WX09LKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKSwgZmFpbCB0byBjYWxsIGNwaF9mbG93X2RiX2FkZF9ydWxlXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTVZfRkFJTDsKKyAgICB9CisKKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiPC0tLS1cbiIpOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RlbF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZXMgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2RlbF9ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KQoreworICAgIC8qIERpc3BsYXkgaW5wdXQgQ1BIIGZsb3cgKi8KKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAKKyAgICAgICAgICAgICAgICAgIi0tLS0+XG4gZGVmYXVsdCBydWxlWyVzXSwgZGlyWyVkXSwgcGFyc2UgYm1bJXhdLCBtaFslZF0sIGV0aCB0eXBlWzB4JXhdLCBvcCB0eXBlWyVkXVxuIiwKKyAgICAgICAgICAgICAgICAgKGNwaF9mbG93LT5pc19kZWZhdWx0ID09IFRSVUUpPyAiWWVzIjoiTm8iLAorICAgICAgICAgICAgICAgICBjcGhfZmxvdy0+ZGlyLCBjcGhfZmxvdy0+cGFyc2VfYm0sIGNwaF9mbG93LT5taCwgY3BoX2Zsb3ctPmV0aF90eXBlLCBjcGhfZmxvdy0+b3BfdHlwZSk7CisgICAgY3BoX2Zsb3dfZGlzcGxheV90Y2koJmNwaF9mbG93LT5wYXJzZV9vdXRlcl90Y2ksIENQSF9ERUJVR19MRVZFTCk7CisgICAgY3BoX2Zsb3dfZGlzcGxheV90Y2koJmNwaF9mbG93LT5wYXJzZV9pbm5lcl90Y2ksIENQSF9ERUJVR19MRVZFTCk7CisKKyAgICAvKiBEZWxldGUgZmxvdyBydWxlIGZyb20gZGF0YSBiYXNlICovCisgICAgaWYgKGNwaF9mbG93X2RiX2RlbF9ydWxlKGNwaF9mbG93KSAhPSBNVl9PSykgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCksIGZhaWwgdG8gY2FsbCBjcGhfZmxvd19kYl9kZWxfcnVsZVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE1WX0ZBSUw7CisgICAgfQorCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIjwtLS0tXG4iKTsKKworICAgIHJldHVybiBNVl9PSzsgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZ2V0X3RhZ19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldHMgZmxvdyBtYXBwaW5nIHJ1bGUgZm9yIHRhZ2dlZCBmcmFtZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBJbnB1dCB2aWQsIHBiaXRzLCBkaXIKKyoKKyogT1VUUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBvdXRwdXQgcGFja2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBHRU0gcG9ydCwgCisqICAgICAgICAgICAgICAgICAgVC1DT05ULCBxdWV1ZSBhbmQgcGFja2V0IG1vZGlmaWNhdGlvbiBmb3IgVklELCBQLWJpdHMuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfZmxvd19nZXRfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdykKK3sKKyAgICAvKiBEaXNwbGF5IGlucHV0IENQSCBmbG93ICovCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwKKyAgICAgICAgICAgICAgICAgIi0tLS0+XG5QYWNrZXQgZmxvdyBydWxlOiBkZWZhdWx0IHJ1bGVbJXNdLCBkaXJbJWRdLCBwYXJzZSBibVsleF0sIG1oWyVkXSwgZXRoIHR5cGVbMHgleF1cbiIsCisgICAgICAgICAgICAgICAgIChjcGhfZmxvdy0+aXNfZGVmYXVsdCA9PSBUUlVFKT8gIlllcyI6Ik5vIiwKKyAgICAgICAgICAgICAgICAgY3BoX2Zsb3ctPmRpciwgY3BoX2Zsb3ctPnBhcnNlX2JtLCBjcGhfZmxvdy0+bWgsIGNwaF9mbG93LT5ldGhfdHlwZSk7CisgICAgY3BoX2Zsb3dfZGlzcGxheV90Y2koJmNwaF9mbG93LT5wYXJzZV9vdXRlcl90Y2ksIENQSF9ERUJVR19MRVZFTCk7CisgICAgY3BoX2Zsb3dfZGlzcGxheV90Y2koJmNwaF9mbG93LT5wYXJzZV9pbm5lcl90Y2ksIENQSF9ERUJVR19MRVZFTCk7CisKKyAgICAvKiBHZXQgZmxvdyBydWxlIGZyb20gZGF0YSBiYXNlICovCisgICAgaWYgKGNwaF9mbG93X2RiX2dldF9ydWxlKGNwaF9mbG93LCBUUlVFKSAhPSBNVl9PSykgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiJXMoKSwgZmFpbCB0byBjYWxsIGNwaF9mbG93X2RiX2dldF9ydWxlXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTVZfRkFJTDsKKyAgICB9CisKKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiPC0tLS1cbiIpOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2NsZWFyX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ2xlYXJzIGFsbCBmbG93IG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZmxvd19jbGVhcl9ydWxlKFZPSUQpCit7CisgICAgLyogRGlzcGxheSBpbnB1dCBDUEggZmxvdyAqLworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsIAorICAgICAgICAgICAgICAgICAiLS0tLT5cbiIpOworCisgICAgLyogQ2xlYXIgZmxvdyBydWxlIGZyb20gZGF0YSBiYXNlICovCisgICAgaWYgKGNwaF9mbG93X2RiX2NsZWFyX3J1bGUoKSAhPSBNVl9PSykgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCksIGZhaWwgdG8gY2FsbCBjcGhfZmxvd19kYl9jbGVhcl9ydWxlXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTVZfRkFJTDsKKyAgICB9CisKKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiPC0tLS1cbiIpOyAKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfY2xlYXJfcnVsZV9ieV9taCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhcnMgZmxvdyBtYXBwaW5nIHJ1bGVzIGJ5IE1ICisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAtICBNYXJ2ZWxsIGhlYWRlci4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Zsb3dfY2xlYXJfcnVsZV9ieV9taChVSU5UMTYgbWgpCit7CisgICAgLyogRGlzcGxheSBpbnB1dCBDUEggZmxvdyAqLworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsIAorICAgICAgICAgICAgICAgICAiLS0tLT4gIG1oKCVkKVxuIiwgbWgpOworCisgICAgLyogQ2xlYXIgZmxvdyBydWxlIGZyb20gZGF0YSBiYXNlICovCisgICAgaWYgKGNwaF9mbG93X2RiX2NsZWFyX3J1bGVfYnlfbWgobWgpICE9IE1WX09LKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKSwgZmFpbCB0byBjYWxsIGNwaF9mbG93X2RiX2NsZWFyX3J1bGVfYnlfbWhcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBNVl9GQUlMOworICAgIH0KKworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICI8LS0tLVxuIik7IAorICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19zZXRfZHNjcF9tYXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0cyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgZHNjcF9tYXAgIC0gRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcy4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X3NldF9kc2NwX21hcChDUEhfRFNDUF9QQklUU19UICpkc2NwX21hcCkKK3sKKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAKKyAgICAgICAgICAgICAgICAgIi0tLS0+IGluX3VzZVslZF1cbiIsCisgICAgICAgICAgICAgICAgICgoZHNjcF9tYXAhPSBOVUxMKT8gZHNjcF9tYXAtPmluX3VzZTowKSk7CisKKyAgICBpZiAoZHNjcF9tYXAgPT0gTlVMTCkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIklucHV0IGRzY3BfbWFwIGlzIE5VTExcbiIpOworICAgICAgICByZXR1cm4gTVZfRkFJTDsKKyAgICB9CisKKyAgICAvKiBDYXNlIDE6IHRvIGVuYWJsZSBEU0NQIHRvIFAtYml0cyBtYXBwaW5nICovCisgICAgaWYgKGRzY3BfbWFwLT5pbl91c2UgIT0gMCkgeworICAgICAgICBtZW1jcHkoJmdzX2RzY3BfbWFwX3RhYmxlLnBiaXRzWzBdLCAmZHNjcF9tYXAtPnBiaXRzWzBdLCBzaXplb2YoZ3NfZHNjcF9tYXBfdGFibGUucGJpdHMpKTsKKyAgICAgICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMTsKKyAgICAKKyAgICB9CisgICAgLyogQ2FzZSAyOiB0byBkaXNhYmxlIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgbWVtc2V0KChVSU5UOCAqKSZnc19kc2NwX21hcF90YWJsZSwgMCwgc2l6ZW9mKGdzX2RzY3BfbWFwX3RhYmxlKSk7CisgICAgICAgIGdzX2RzY3BfbWFwX3RhYmxlLmluX3VzZSA9IDA7CisgICAgfQorICAgIAorICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICI8LS0tLVxuIik7CisKKyAgICByZXR1cm4gTVZfT0s7ICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGVsX2RzY3BfbWFwKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfZmxvd19kZWxfZHNjcF9tYXAoVk9JRCkKK3sKKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiLS0tLT5cbiIpOworCisgICAgLyogQ2xlYXIgRFNDUCB0byBQLWJpdHMgbWFwcGluZyAqLworICAgIG1lbXNldCgoVUlOVDggKikmZ3NfZHNjcF9tYXBfdGFibGUsIDAsIHNpemVvZihnc19kc2NwX21hcF90YWJsZSkpOworICAgIGdzX2RzY3BfbWFwX3RhYmxlLmluX3VzZSA9IDA7CisgICAgCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIjwtLS0tXG4iKTsKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19hZGRfdmxhbigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBBZGQgb25lIFZMQU4gdGFnIGJlaGluZCBvZiBzb3VyY2UgTUFDIGFkZHJlc3MuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0CisqICAgICAgIHRwaWQgICAtIFR5cGUgb2YgVkxBTiBJRAorKiAgICAgICB2aWQgICAgLSBWTEFOIHRvIGJlIGFkZGVkCisqICAgICAgIHBiaXRzICAtIFAtYml0cyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBUaGUgc2hpZnQgb2YgU0tCIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5MSU5FIElOVDMyIGNwaF9mbG93X2FkZF92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiB0cGlkLCBVSU5UMTYgdmlkLCBVSU5UOCBwYml0cykKK3sKKyAgICBVSU5UOCAgKnBfbmV3ICA9IE5VTEw7CisgICAgVUlOVDE2ICpwX3ZsYW4gPSBOVUxMOworICAgIFVJTlQzMiAgbGVuICAgID0gMDsKKworICAgIHBfbmV3ID0gcF9kYXRhIC0gTVZfVkxBTl9ITEVOOworCisgICAgaWYgKFRSVUUgPT0gbWgpCisgICAgICAgIGxlbiA9IE1WX0VUSF9NSF9TSVpFICsgTVZfTUFDX0FERFJfU0laRSArIE1WX01BQ19BRERSX1NJWkU7CisgICAgZWxzZQorICAgICAgICBsZW4gPSBNVl9NQUNfQUREUl9TSVpFICsgTVZfTUFDX0FERFJfU0laRTsKKworICAgIG1lbW1vdmUocF9uZXcsIHBfZGF0YSwgbGVuKTsKKworICAgIHBfdmxhbiA9IChVSU5UMTYgKikocF9uZXcgICsgbGVuKTsKKyAgICAKKyAgICAvKiBTZXQgVkxBTiBUeXBlICovCisgICAgKnBfdmxhbiA9IGh0b25zKHRwaWQpOworICAgIHBfdmxhbisrOworCisgICAgLyogU2V0IFZJRCArIHByaW9yaXR5ICovICAgIAorICAgICpwX3ZsYW4gPSBodG9ucygodmlkICYgTVZfVkxBTl9JRF9NQVNLKSB8ICgocGJpdHMgJiBNVl9QQklUU19NQVNLKSA8PCBNVl9QQklUU19TSElGVCkpOworCisgICAgcmV0dXJuIC1NVl9WTEFOX0hMRU47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGVsX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlIG9uZSBWTEFOIHRhZyBiZWhpbmQgb2Ygc291cmNlIE1BQyBhZGRyZXNzLgorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgICAtIFdoZXRoZXIgaGFzIE1IIG9yIG5vdAorKiAgICAgICBwX2RhdGEgLSBQb2ludGVyIHRvIHBhY2tldC4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgVGhlIHNoaWZ0IG9mIFNLQiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOTElORSBJTlQzMiBjcGhfZmxvd19kZWxfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhKQoreworICAgIFVJTlQ4ICAqcF9uZXcgID0gTlVMTDsKKyAgICBVSU5UMzIgIGxlbiAgICA9IDA7CisKKyAgICBwX25ldyA9IHBfZGF0YSArIE1WX1ZMQU5fSExFTjsKKworICAgIGlmIChUUlVFID09IG1oKQorICAgICAgICBsZW4gPSBNVl9FVEhfTUhfU0laRSArIE1WX01BQ19BRERSX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFOworICAgIGVsc2UKKyAgICAgICAgbGVuID0gTVZfTUFDX0FERFJfU0laRSArIE1WX01BQ19BRERSX1NJWkU7CisKKyAgICBtZW1tb3ZlKHBfbmV3LCBwX2RhdGEsIGxlbik7CisKKyAgICByZXR1cm4gTVZfVkxBTl9ITEVOOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3N0cmlwX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlIGFsbCBWTEFOIHRhZ3MgYmVoaW5kIG9mIHNvdXJjZSBNQUMgYWRkcmVzcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgcF9kYXRhIC0gUG9pbnRlciB0byBwYWNrZXQuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfc3RyaXBfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhKQoreworICAgIElOVDMyICBvZmZzZXQgICAgICAgPSAwOworICAgIElOVDMyICB0b3RhbF9vZmZzZXQgPSAwOyAgICAKKyAgICBVSU5UMTYgZXRoX3R5cGUgICAgID0gMDsKKyAgICBVSU5UOCAqcF9maWVsZCAgICAgID0gTlVMTDsKKyAgICBVSU5UMzIgbGVuICAgICAgICAgID0gMDsKKworICAgIGlmIChUUlVFID09IG1oKQorICAgICAgICBsZW4gPSBNVl9FVEhfTUhfU0laRSArIE1WX01BQ19BRERSX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFOworICAgIGVsc2UKKyAgICAgICAgbGVuID0gTVZfTUFDX0FERFJfU0laRSArIE1WX01BQ19BRERSX1NJWkU7CisKKyAgICBwX2ZpZWxkICA9IHBfZGF0YSArIGxlbjsKKyAgICBldGhfdHlwZSA9IG50b2hzKCooVUlOVDE2ICopcF9maWVsZCk7CisKKyAgICB3aGlsZSAoZXRoX3R5cGUgPT0gTVZfVFBJRF84MTAwIHx8IGV0aF90eXBlID09IE1WX1RQSURfODhBOCB8fCBldGhfdHlwZSA9PSBNVl9UUElEXzkxMDApIAorICAgIHsKKyAgICAgICAgb2Zmc2V0ICAgPSBjcGhfZmxvd19kZWxfdmxhbihtaCwgcF9kYXRhK29mZnNldCk7CisgICAgICAgIAorICAgICAgICBwX2ZpZWxkICs9IG9mZnNldDsKKyAgICAgICAgZXRoX3R5cGUgPSBudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpOworICAgICAgICB0b3RhbF9vZmZzZXQgKz0gb2Zmc2V0OworICAgIH0gICAgCisKKyAgICByZXR1cm4gdG90YWxfb2Zmc2V0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3JlcGxhY2VfdmxhbigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBSZXBsYWNlIG9uZSBWTEFOIHRhZyBiZWhpbmQgb2Ygc291cmNlIE1BQyBhZGRyZXNzLgorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgICAtIFdoZXRoZXIgaGFzIE1IIG9yIG5vdAorKiAgICAgICBwX2RhdGEgLSBQb2ludGVyIHRvIHBhY2tldAorKiAgICAgICB0cGlkICAgLSBUeXBlIG9mIFZMQU4gSUQKKyogICAgICAgdmlkICAgIC0gVkxBTiB0byBiZSBhZGRlZAorKiAgICAgICBwYml0cyAgLSBQLWJpdHMgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgVGhlIHNoaWZ0IG9mIFNLQiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOTElORSBJTlQzMiBjcGhfZmxvd19yZXBsYWNlX3ZsYW4oQk9PTCBtaCwgVUlOVDggKnBfZGF0YSwgVUlOVDE2IHRwaWQsIFVJTlQxNiB2aWQsIFVJTlQ4IHBiaXRzKQoreworICAgIFVJTlQxNiAqcF92bGFuID0gTlVMTDsKKyAgICBVSU5UMzIgIGxlbiAgICA9IDA7CisKKyAgICBpZiAoVFJVRSA9PSBtaCkKKyAgICAgICAgbGVuID0gTVZfRVRIX01IX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFICsgTVZfTUFDX0FERFJfU0laRTsKKyAgICBlbHNlCisgICAgICAgIGxlbiA9IE1WX01BQ19BRERSX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFOworCisgICAgcF92bGFuID0gKFVJTlQxNiAqKShwX2RhdGEgKyBsZW4pOworICAgIAorICAgIC8qIFNldCBWTEFOIFR5cGUgKi8KKyAgICAqcF92bGFuID0gaHRvbnModHBpZCk7CisgICAgcF92bGFuKys7CisgICAgCisgICAgLyogU2V0IFZJRCArIHByaW9yaXR5ICovCisgICAgKnBfdmxhbiA9IGh0b25zKCh2aWQgJiBNVl9WTEFOX0lEX01BU0spIHwgKChwYml0cyAmIE1WX1BCSVRTX01BU0spIDw8IE1WX1BCSVRTX1NISUZUKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19zd2FwX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU3dhcCBiZXR3ZWVuIHR3byBWTEFOIHRhZy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgcF9kYXRhIC0gUG9pbnRlciB0byBwYWNrZXQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgVGhlIHNoaWZ0IG9mIFNLQiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOTElORSBJTlQzMiBjcGhfZmxvd19zd2FwX3ZsYW4oQk9PTCBtaCwgVUlOVDggKnBfZGF0YSkKK3sKKyAgICBVSU5UMzIgKnBfdGNpID0gTlVMTDsKKyAgICBVSU5UMzIgIHRjaTEgID0gMDsKKyAgICBVSU5UMzIgIHRjaTIgID0gMDsKKyAgICBVSU5UMzIgIGxlbiAgICA9IDA7CisKKyAgICBpZiAoVFJVRSA9PSBtaCkKKyAgICAgICAgbGVuID0gTVZfRVRIX01IX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFICsgTVZfTUFDX0FERFJfU0laRTsKKyAgICBlbHNlCisgICAgICAgIGxlbiA9IE1WX01BQ19BRERSX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFOworCisgICAgcF90Y2kgPSAoVUlOVDMyICopKHBfZGF0YSArIGxlbik7CisgICAgCisgICAgLyogU2F2ZSBmaXJzdCBUQ0kgKi8KKyAgICB0Y2kxID0gbnRvaGwoKnBfdGNpKTsKKyAgICBwX3RjaSsrOworCisgICAgLyogU2F2ZSBzZWNvbmQgVENJIGFuZCByZXBsYWNlIGl0IHcvIGZpcnN0IFRDSSAqLworICAgIHRjaTIgICA9IG50b2hsKCpwX3RjaSk7CisgICAgKnBfdGNpID0gaHRvbmwodGNpMSk7CisKKyAgICAvKiBHbyBiYWNrIHRvIHJlcGxjZSBmaXJzdCBUQ0kgKi8KKyAgICBwX3RjaS0tOyAgICAKKyAgICAqcF90Y2kgPSBodG9ubCh0Y2kyKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19wYXJzZV9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogUGFyc2UgcGFja2V0IGFuZCBvdXRwdXQgZmxvdyBpbmZvcm1hdGlvbi4KKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0IC0gU291cmNlIEdNQUMgcG9ydAorKiAgICAgICBkYXRhIC0gUG9pbnRlciB0byBwYWNrZXQKKyogICAgICAgcnggICAtIFdoZXRoZXIgaW4gUlggZGlyCisqICAgICAgIG1oICAgLSBXaGV0aGVyIGhhcyBNYXJ2ZWxsIGhlYWRlcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBmbG93IC0gRmxvdyBwYXJzaW5nIGZpZWxkIHZhbHVlcworKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfcGFyc2VfcGFja2V0IChJTlQzMiBwb3J0LCBVSU5UOCAqZGF0YSwgQk9PTCByeCwgQk9PTCBtaCwgQ1BIX0ZMT1dfRU5UUllfVCAqZmxvdykKK3sKKyAgICBVSU5UMTYgICAgICBldGhfdHlwZSA9IDA7IAorICAgIFVJTlQ4ICAgICAgKnBfZmllbGQgID0gTlVMTDsKKyAgICBVSU5UOCAgICAgICBwcm90byAgICA9IDA7CisgICAgTVZfU1RBVFVTICAgcmMgICAgICAgPSBNVl9PSzsKKyAgICBzdHJ1Y3QgaXB2NmhkciAgICAgICAgICpwX2lwdjZfaGRyICAgPSBOVUxMOworICAgIHN0cnVjdCBpcHY2X2hvcG9wdF9oZHIgKnBfaG9wb3B0X2hkciA9IE5VTEw7CisgICAgc3RydWN0IGljbXA2aGRyICAgICAgICAqcF9pY21wX2hkciAgID0gTlVMTDsgICAgIAorCisgICAgbWVtc2V0KGZsb3csIDAsIHNpemVvZihDUEhfRkxPV19FTlRSWV9UKSk7CisgICAgCisgICAgLyogUGFyc2UgRGlyZWN0aW9uICovCisgICAgZmxvdy0+ZGlyID0gY3BoX2FwcF9wYXJzZV9kaXIocG9ydCwgcngpOworICAgIGlmKGZsb3ctPmRpciA9PSBDUEhfRElSX0lOVkFMSUQpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImRpclslZF0gaXMgaW52YWxpZCBcbiIsIGZsb3ctPmRpcik7CisgICAgICAgIHJldHVybiBNVl9CQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKFRSVUUgPT0gbWgpCisgICAgeworICAgICAgICAvKiBQYXJzZSBNYXJ2ZWxsIGhlYWRlciAqLworICAgICAgICBpZiAoZmxvdy0+ZGlyID09IENQSF9ESVJfVVMpCisgICAgICAgICAgICBmbG93LT5taCA9IChudG9ocygqKFVJTlQxNiAqKWRhdGEpICYgTVZfVkFMSURfTUhfTUFTSyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZsb3ctPm1oID0gKG50b2hzKCooVUlOVDE2ICopZGF0YSkgJiBNVl9WQUxJRF9HSF9NQVNLKTsKKyAgICAgICAgCisgICAgICAgIGZsb3ctPnBhcnNlX2JtIHw9IENQSF9GTE9XX1BBUlNFX01IOworICAgICAgICBwX2ZpZWxkICA9IGRhdGEgKyBNVl9FVEhfTUhfU0laRSArIEVUSF9BTEVOICsgRVRIX0FMRU47ICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBfZmllbGQgID0gZGF0YSArIEVUSF9BTEVOICsgRVRIX0FMRU47IAorICAgIH0KKworICAgIC8qIFBhcnNlIFZMQU4gdGFnICovCisgICAgZXRoX3R5cGUgPSBudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpOworICAgIGlmIChldGhfdHlwZSA9PSBNVl9UUElEXzgxMDAgfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF84OEE4IHx8IGV0aF90eXBlID09IE1WX1RQSURfOTEwMCkgCisgICAgeworICAgICAgICBmbG93LT5wYXJzZV9ibSB8PSBDUEhfRkxPV19QQVJTRV9FWFRfVkxBTjsKKyAgICAgICAgCisgICAgICAgIGZsb3ctPnBhcnNlX291dGVyX3RjaS50cGlkID0gbnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKTsKKyAgICAgICAgcF9maWVsZCArPSBNVl9DUEhfVFBJRF9MRU47CisKKyAgICAgICAgZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCAgID0gKG50b2hzKCooVUlOVDE2ICopcF9maWVsZCkgJiBNVl9WTEFOX0lEX01BU0spOworICAgICAgICBmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHMgPSAoKG50b2hzKCooVUlOVDE2ICopcF9maWVsZCkgPj4gTVZfUEJJVFNfU0hJRlQpJiBNVl9QQklUU19NQVNLKTsKKyAgICAgICAgCisgICAgICAgIHBfZmllbGQgKz0gTVZfQ1BIX1ZMQU5fVEFHX0xFTjsKKworICAgICAgICBldGhfdHlwZSA9IG50b2hzKCooVUlOVDE2ICopcF9maWVsZCk7CisgICAgICAgIGlmIChldGhfdHlwZSA9PSBNVl9UUElEXzgxMDAgfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF84OEE4IHx8IGV0aF90eXBlID09IE1WX1RQSURfOTEwMCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb3ctPnBhcnNlX2JtICY9IH5DUEhfRkxPV19QQVJTRV9FWFRfVkxBTjsKKyAgICAgICAgICAgIGZsb3ctPnBhcnNlX2JtIHw9IENQSF9GTE9XX1BBUlNFX1RXT19WTEFOOworICAgICAgICAgICAgCisgICAgICAgICAgICBmbG93LT5wYXJzZV9pbm5lcl90Y2kudHBpZCA9IG50b2hzKCooVUlOVDE2ICopcF9maWVsZCk7CisgICAgICAgICAgICBwX2ZpZWxkICs9IE1WX0NQSF9UUElEX0xFTjsKKworICAgICAgICAgICAgZmxvdy0+cGFyc2VfaW5uZXJfdGNpLnZpZCAgID0gKG50b2hzKCooVUlOVDE2ICopcF9maWVsZCkgJiBNVl9WTEFOX0lEX01BU0spOworICAgICAgICAgICAgZmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzID0gKChudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpID4+IE1WX1BCSVRTX1NISUZUKSYgTVZfUEJJVFNfTUFTSyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBfZmllbGQgKz0gTVZfQ1BIX1ZMQU5fVEFHX0xFTjsKKworICAgICAgICAgICAgZXRoX3R5cGUgPSBudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpOworICAgICAgICB9ICAgICAgCisgICAgfSAgICAKKyAgICB3aGlsZSAoZXRoX3R5cGUgPT0gTVZfVFBJRF84MTAwIHx8IGV0aF90eXBlID09IE1WX1RQSURfODhBOCB8fCBldGhfdHlwZSA9PSBNVl9UUElEXzkxMDApIHsKKyAgICAgICAgcF9maWVsZCArPSBWTEFOX0hMRU47CisgICAgICAgIGV0aF90eXBlID0gbnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKTsKKyAgICB9CisgICAgLyogUGFyc2UgRXRoIHR5cGUgKi8gICAgCisgICAgZmxvdy0+ZXRoX3R5cGUgPSBldGhfdHlwZTsKKyAgICBmbG93LT5wYXJzZV9ibSB8PSBDUEhfRkxPV19QQVJTRV9FVEhfVFlQRTsKKworICAgIC8qIFBhcnNlIE11bHRpY2FzdCBwcm90b2NvbCAqLworICAgIGlmIChNVl9DUEhfRVRIX1RZUEVfSVBWNCA9PSBmbG93LT5ldGhfdHlwZSkgeworICAgICAgICBwX2ZpZWxkICs9IE1WX0NQSF9FVEhfVFlQRV9MRU47CisgICAgICAgIHBfZmllbGQgKz0gTVZfSVBWNF9QUk9UT19PRkZTRVQ7CisgICAgICAgIHByb3RvID0gKihVSU5UOCAqKXBfZmllbGQ7CisKKyAgICAgICAgaWYgKElQUFJPVE9fSUdNUCA9PSBwcm90bykKKyAgICAgICAgICAgIGZsb3ctPnBhcnNlX2JtIHw9IENQSF9GTE9XX1BBUlNFX01DX1BST1RPOworICAgIH0KKyAgICBlbHNlIGlmIChNVl9DUEhfRVRIX1RZUEVfSVBWNiA9PSBmbG93LT5ldGhfdHlwZSkgeworICAgICAgICBwX2lwdjZfaGRyID0gKHN0cnVjdCBpcHY2aGRyICopKHBfZmllbGQgKyBNVl9DUEhfRVRIX1RZUEVfTEVOKTsKKworICAgICAgICBpZiAoTkVYVEhEUl9IT1AgPT0gcF9pcHY2X2hkci0+bmV4dGhkcikgeworICAgICAgICAgICAgcF9ob3BvcHRfaGRyID0gKHN0cnVjdCBpcHY2X2hvcG9wdF9oZHIgKikoKFVJTlQ4ICopcF9pcHY2X2hkciArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCisgICAgICAgICAgICBpZiAoSVBQUk9UT19JQ01QVjYgPT0gcF9ob3BvcHRfaGRyLT5uZXh0aGRyKSB7CisgICAgICAgICAgICAgICAgcF9pY21wX2hkciA9ICAoc3RydWN0IGljbXA2aGRyICopKChVSU5UOCAqKXBfaG9wb3B0X2hkciArIGlwdjZfb3B0bGVuKHBfaG9wb3B0X2hkcikpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAocF9pY21wX2hkci0+aWNtcDZfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBWNl9NR01fUVVFUlk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUFY2X01HTV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUFY2X01HTV9SRURVQ1RJT046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUFY2X01MRDJfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+cGFyc2VfYm0gfD0gQ1BIX0ZMT1dfUEFSU0VfTUNfUFJPVE87CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19jb21wYXJlX3J1bGVzKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENvbXBhcmUgdHdvIGZsb3cgcnVsZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfcnVsZSAgLSBUaGUgcGFyc2luZyBmaWVsZCB2YWx1ZXMgY29tZSBmcm9tIHRoZSBwYWNrZXRzCisqICAgICAgIGRiX3J1bGUgICAgIC0gVGhlIGZsb3cgcnVsZSBzdG9yZWQgaW4gZmxvdyBkYXRhYmFzZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBJbiBjYXNlIHNhbWUsIHJldHVybiBUUlVFLCAKKyogICAgICAgSW4gY2FzZSBkaWZmZXJlbnQsIHJldHVybiBGQUxTRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MIGNwaF9mbG93X2NvbXBhcmVfcnVsZXMgKENQSF9GTE9XX0VOVFJZX1QgKnBhcnNlX3J1bGUsIENQSF9GTE9XX0VOVFJZX1QgKmRiX3J1bGUpCit7CisgICAgLyogQ2hlY2sgZGlyZWN0aW9uICovCisgICAgaWYgKHBhcnNlX3J1bGUtPmRpciAhPSBkYl9ydWxlLT5kaXIpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIENoZWNrIHBhcnNlX2JtICovCisgICAgaWYgKHBhcnNlX3J1bGUtPnBhcnNlX2JtICE9IGRiX3J1bGUtPnBhcnNlX2JtKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gIAorCisgICAgLyogQ2hlY2sgTUggaWYgbmVlZGVkICovCisgICAgaWYgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfTUgpCisgICAgeworICAgICAgICBpZiAocGFyc2VfcnVsZS0+bWggIT0gZGJfcnVsZS0+bWgpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgaXQgaXMgZGVmYXVsdCBydWxlICovCisgICAgaWYgKHBhcnNlX3J1bGUtPmlzX2RlZmF1bHQgIT0gZGJfcnVsZS0+aXNfZGVmYXVsdCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIAorICAgIC8qIENoZWNrIFZMQU4gSUQgKi8KKyAgICBpZiAocGFyc2VfcnVsZS0+aXNfZGVmYXVsdCA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIGlmICgoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9FWFRfVkxBTikgfHwgIAorICAgICAgICAgICAgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnRwaWQgIT0gZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnRwaWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCAhPSBkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudmlkKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKHBhcnNlX3J1bGUtPnBhcnNlX291dGVyX3RjaS5wYml0cyAhPSBkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kucGJpdHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChkYl9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX1RXT19WTEFOKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnRwaWQgIT0gZGJfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnRwaWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnZpZCAhPSBkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKHBhcnNlX3J1bGUtPnBhcnNlX2lubmVyX3RjaS5wYml0cyAhPSBkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kucGJpdHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIC8qIENoZWNrIEV0aGVybmV0IHR5cGUgaWYgbmVlZGVkICovCisgICAgaWYgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfRVRIX1RZUEUpCisgICAgeworICAgICAgICBpZiAocGFyc2VfcnVsZS0+ZXRoX3R5cGUgIT0gZGJfcnVsZS0+ZXRoX3R5cGUpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfY29tcGFyZV9wYWNrZXRfYW5kX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ29tcGFyZSBmbG93IHBhY2tldCBhbmQgcnVsZS4KKyoKKyogSU5QVVRTOgorKiAgICAgICBwYWNrZXRfcnVsZSAtIFRoZSBwYXJzaW5nIGZpZWxkIHZhbHVlcyBjb21lIGZyb20gdGhlIHBhY2tldHMKKyogICAgICAgZGJfcnVsZSAgICAgLSBUaGUgZmxvdyBydWxlIHN0b3JlZCBpbiBmbG93IGRhdGFiYXNlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIEluIGNhc2Ugc2FtZSwgcmV0dXJuIFRSVUUsIAorKiAgICAgICBJbiBjYXNlIGRpZmZlcmVudCwgcmV0dXJuIEZBTFNFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2Zsb3dfY29tcGFyZV9wYWNrZXRfYW5kX3J1bGUgKENQSF9GTE9XX0VOVFJZX1QgKnBhY2tldF9ydWxlLCBDUEhfRkxPV19FTlRSWV9UICpkYl9ydWxlKQoreworICAgIC8qIENoZWNrIGRpcmVjdGlvbiAqLworICAgIGlmICgocGFja2V0X3J1bGUtPmRpciAhPSBkYl9ydWxlLT5kaXIpICYmCisgICAgICAgIChkYl9ydWxlLT5kaXIgIT0gQ1BIX0RJUl9OT1RfQ0FSRSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIENoZWNrIE11bHRpY2FzdCBwcm90b2NvbCAqLworICAgICBpZiAoKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfTUNfUFJPVE8pICE9IChwYWNrZXRfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9NQ19QUk9UTykpCisgICAgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENoZWNrIE1IIGlmIG5lZWRlZCAqLworICAgIGlmICgoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9NSCkgJiYKKyAgICAgICAgKHBhY2tldF9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX01IKSApCisgICAgeworICAgICAgICBpZiAocGFja2V0X3J1bGUtPm1oICE9IGRiX3J1bGUtPm1oKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIGl0IGlzIGRlZmF1bHQgcnVsZSAqLworICAgIGlmIChwYWNrZXRfcnVsZS0+aXNfZGVmYXVsdCAhPSBkYl9ydWxlLT5pc19kZWZhdWx0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgCisgICAgLyogQ2hlY2sgVkxBTiBJRCAqLworICAgIGlmICgocGFja2V0X3J1bGUtPnBhcnNlX2JtICYgKENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOIHwgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKQorICAgICAgICAgIT0gKGRiX3J1bGUtPnBhcnNlX2JtICYgKENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOIHwgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChwYWNrZXRfcnVsZS0+aXNfZGVmYXVsdCA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIGlmICgoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9FWFRfVkxBTikgfHwgIAorICAgICAgICAgICAgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHBhY2tldF9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudHBpZCAhPSBkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudHBpZCkgJiYKKyAgICAgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnRwaWQgIT0gTVZfQ1BIX1RQSURfTk9UX0NBUkVfVkFMVUUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCAhPSBkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudmlkKSAmJgorICAgICAgICAgICAgICAgIChkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudmlkICE9IE1WX0NQSF9WSURfTk9UX0NBUkVfVkFMVUUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzICE9IGRiX3J1bGUtPnBhcnNlX291dGVyX3RjaS5wYml0cykgJiYKKyAgICAgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzICE9IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChkYl9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX1RXT19WTEFOKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHBhY2tldF9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudHBpZCAhPSBkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudHBpZCkgJiYKKyAgICAgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnRwaWQgIT0gTVZfQ1BIX1RQSURfTk9UX0NBUkVfVkFMVUUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnZpZCAhPSBkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkKSAmJgorICAgICAgICAgICAgICAgIChkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkICE9IE1WX0NQSF9WSURfTk9UX0NBUkVfVkFMVUUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzICE9IGRiX3J1bGUtPnBhcnNlX2lubmVyX3RjaS5wYml0cykgJiYKKyAgICAgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzICE9IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIC8qIENoZWNrIEV0aGVybmV0IHR5cGUgaWYgbmVlZGVkICovCisgICAgaWYgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfRVRIX1RZUEUpCisgICAgeworICAgICAgICBpZiAocGFja2V0X3J1bGUtPmV0aF90eXBlICE9IGRiX3J1bGUtPmV0aF90eXBlKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X21vZF9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogTW9kaWZ5IHBhY2tldCBhY2NvcmRpbmcgdG8gZmxvdyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgc2tiICAgICAgICAtIFBvaW50ZXIgdG8gcGFja2V0CisqICAgICAgIG1oICAgICAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgZmxvdyAgICAgICAtIEZsb3cgcGFyc2luZyBmaWVsZCB2YWx1ZXMKKyogICAgICAgb3V0X29mZnNldCAtIE9mZnNldCBvZiBwYWNrZXQKKyogICAgICAgcnggICAgICAgICAtIFdoZXRoZXIgUlggb3IgVFgKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X21vZF9wYWNrZXQgKHN0cnVjdCBza19idWZmICpza2IsICBCT09MIG1oLCBDUEhfRkxPV19FTlRSWV9UICpmbG93LCBJTlQzMiAqb3V0X29mZnNldCkKK3sKKyAgICBJTlQzMiAgb2Zmc2V0ID0gMDsKKyAgICBVSU5UMTYgdHBpZCAgID0gMDsgICAgCisgICAgVUlOVDE2IHZpZCAgICA9IDA7CisgICAgVUlOVDggIHBiaXRzICA9IDA7CisgICAgQk9PTCAgIHJjICAgICA9IE1WX09LOworCisgICAgc3dpdGNoIChmbG93LT5vcF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BU0lTOgorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfRElTQ0FSRDoKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FERDoKKyAgICAgICAgICAgIHRwaWQgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIGZsb3ctPm1vZF9vdXRlcl90Y2kucGJpdHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfRFNDUDoKKyAgICAgICAgICAgIHRwaWQgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2Rfb3V0ZXJfdGNpLnZpZCwgZmxvdy0+bW9kX291dGVyX3RjaS5wYml0cyk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FERF9DT1BZX09VVEVSX1BCSVQ6CisgICAgICAgICAgICB0cGlkICAgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBwYml0cyAgPSAoZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBwYml0cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BRERfQ09QWV9JTk5FUl9QQklUOgorICAgICAgICAgICAgdHBpZCAgID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgcGJpdHMgID0gKGZsb3ctPnBhcnNlX2lubmVyX3RjaS5wYml0cyA9PSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUUpPyAwOmZsb3ctPnBhcnNlX2lubmVyX3RjaS5wYml0czsKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2Rfb3V0ZXJfdGNpLnZpZCwgcGJpdHMpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHUzoKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBvZmZzZXQgID0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7ICAgCisgICAgICAgICAgICBvZmZzZXQgKz0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9pbm5lcl90Y2kudmlkLCBmbG93LT5tb2RfaW5uZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FERF8yX1RBR1NfQ09QWV9EU0NQOgorICAgICAgICAgICAgdHBpZCAgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCAgPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7ICAgCisgICAgICAgICAgICBvZmZzZXQgKz0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2RfaW5uZXJfdGNpLnZpZCwgZmxvdy0+bW9kX2lubmVyX3RjaS5wYml0cyk7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BRERfMl9UQUdTX0NPUFlfUEJJVDoKKyAgICAgICAgICAgIHRwaWQgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIHBiaXRzICA9IChmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHMgPT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKT8gMDpmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHM7CisgICAgICAgICAgICBvZmZzZXQgPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX2lubmVyX3RjaS52aWQsIHBiaXRzKTsKKyAgICAgICAgICAgIHRwaWQgICA9IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsgCisgICAgICAgICAgICBwYml0cyAgPSAoZmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX2lubmVyX3RjaS52aWQsIHBiaXRzKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFTToKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X2RlbF92bGFuKG1oLCBza2ItPmRhdGEpOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVNXzJfVEFHUzoKKyAgICAgICAgICAgIG9mZnNldCAgPSBjcGhfZmxvd19kZWxfdmxhbihtaCwgc2tiLT5kYXRhKTsKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19kZWxfdmxhbihtaCwgc2tiLT5kYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0U6CisgICAgICAgICAgICB0cGlkICAgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBvZmZzZXQgPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIGZsb3ctPm1vZF9vdXRlcl90Y2kucGJpdHMpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9WSUQ6CisgICAgICAgICAgICB0cGlkID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworCisgICAgICAgICAgICBwYml0cyAgPSAoZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfcmVwbGFjZV92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBwYml0cyk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRVBMQUNFX1BCSVQ6CisgICAgICAgICAgICB0cGlkID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworCisgICAgICAgICAgICB2aWQgICAgPSAoZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnZpZCA9PSBNVl9DUEhfVklEX05PVF9DQVJFX1ZBTFVFKT8gMDpmbG93LT5wYXJzZV9vdXRlcl90Y2kudmlkOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfcmVwbGFjZV92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZCwgZmxvdy0+bW9kX291dGVyX3RjaS5wYml0cyk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX0FERF9PVVRFUjoKKyAgICAgICAgICAgIHRwaWQgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBvZmZzZXQgPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX2lubmVyX3RjaS52aWQsIGZsb3ctPm1vZF9pbm5lcl90Y2kucGJpdHMpOworICAgICAgICAgICAgdHBpZCA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfSU5ORVJfQUREX09VVEVSX0NPUFlfUEJJVDoKKyAgICAgICAgICAgIHRwaWQgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBwYml0cyAgPSAoZmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfcmVwbGFjZV92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9pbm5lcl90Y2kudmlkLCBwYml0cyk7CisgICAgICAgICAgICB0cGlkID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgcGJpdHMgICA9IChmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHMgPT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKT8gMDpmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHM7ICAgICAgICAgICAgCisgICAgICAgICAgICBvZmZzZXQgKz0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIHBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfSU5ORVJfUkVNX09VVEVSOgorICAgICAgICAgICAgb2Zmc2V0ICA9IGNwaF9mbG93X2RlbF92bGFuKG1oLCBza2ItPmRhdGEpOworICAgICAgICAgICAgdHBpZCAgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfMlRBR1M6CisgICAgICAgICAgICB0cGlkICAgID0gZmxvdy0+bW9kX2lubmVyX3RjaS50cGlkID8gZmxvdy0+bW9kX2lubmVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgb2Zmc2V0ICA9IGNwaF9mbG93X3JlcGxhY2VfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9pbm5lcl90Y2kudmlkLCBmbG93LT5tb2RfaW5uZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19zd2FwX3ZsYW4obWgsIHNrYi0+ZGF0YSk7CisgICAgICAgICAgICB0cGlkICAgID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X3JlcGxhY2VfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2Rfb3V0ZXJfdGNpLnZpZCwgZmxvdy0+bW9kX291dGVyX3RjaS5wYml0cyk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRVBMQUNFXzJUQUdTX1ZJRDoKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBwYml0cyAgID0gKGZsb3ctPnBhcnNlX2lubmVyX3RjaS5wYml0cyA9PSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUUpPyAwOmZsb3ctPnBhcnNlX2lubmVyX3RjaS5wYml0czsKKyAgICAgICAgICAgIG9mZnNldCAgPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2RfaW5uZXJfdGNpLnZpZCwgcGJpdHMpOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X3N3YXBfdmxhbihtaCwgc2tiLT5kYXRhKTsKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBwYml0cyAgID0gKGZsb3ctPnBhcnNlX291dGVyX3RjaS5wYml0cyA9PSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUUpPyAwOmZsb3ctPnBhcnNlX291dGVyX3RjaS5wYml0czsKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIHBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1NXQVA6CisgICAgICAgICAgICBvZmZzZXQgID0gY3BoX2Zsb3dfc3dhcF92bGFuKG1oLCBza2ItPmRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBTYXZlIFNLQiBkYXRhIG9mZnNldCAqLworICAgIHNrYi0+ZGF0YSAgKz0gb2Zmc2V0OworICAgIHNrYi0+bGVuICAgLT0gb2Zmc2V0OworICAgICpvdXRfb2Zmc2V0ID0gb2Zmc2V0OworICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19tb2RfZnJ3ZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBNb2RpZnkgZm9yd2FyZGluZyBwYXJhbWV0ZXIgb2YgdHJhbnNtaXRpbmcgcGFja2V0IGFjY29yZGluZyB0byBmbG93IHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBmbG93ICAgICAgICAtIEZsb3cgcGFyc2luZyBmaWVsZCB2YWx1ZXMKKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19tb2RfZnJ3ZCAoQ1BIX0ZMT1dfRU5UUllfVCAqZmxvdywgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKyAgICAKKyAgICB0eF9zcGVjX291dC0+dHhwICAgICA9IGZsb3ctPnBrdF9mcndkLnRyZ19wb3J0OworICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gZmxvdy0+cGt0X2Zyd2QudHJnX3F1ZXVlOworICAgIGlmICgoRkFMU0UgPT0gY3BoX2RiX2dldF90Y29udF9zdGF0ZSh0eF9zcGVjX291dC0+dHhwKSkgfHwKKyAgICAgICAgKGZsb3ctPm9wX3R5cGUgPT0gQ1BIX1ZMQU5fT1BfRElTQ0FSRCkpCisgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgPSBNVl9JTlZBTElEX1FVRVVFX05VTTsKKyAgICB0eF9zcGVjX291dC0+aHdfY21kICA9ICgoZmxvdy0+cGt0X2Zyd2QuZ2VtX3BvcnQgPDwgOCl8MHgwMDEwKTsKKyAgICB0eF9zcGVjX291dC0+dHhfZnVuYyA9IE5VTEw7CisgICAgdHhfc3BlY19vdXQtPmZsYWdzICAgPSBNVl9FVEhfRl9NSDsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19zZW5kX3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZWNlaXZlZCBhcHBsaWNhdGlvbiBwYWNrZXRzIAorKgorKiBJTlBVVFM6CisqICAgICAgIGRldl9vdXQgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBwa3QgICAgICAgICAtIE1hcnZlbGwgcGFja2V0IGluZm9ybWF0aW9uCisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyAwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X291dCwgc3RydWN0IGV0aF9wYnVmICpwa3QsIAorICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCit7CisKKworI2lmIDAKKyAgICBzdHJ1Y3QgZXRoX3BvcnQgKnBwID0gTVZfRVRIX1BSSVYoZGV2X291dCk7CisgICAgaW50IGZyYWdzID0gMDsKKyAgICBib29sIHR4X3NwZWNfcmVhZHkgPSBmYWxzZTsKKyAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgdHhfc3BlYzsKKyAgICB1MzIgdHhfY21kOworICAgIHN0cnVjdCB0eF9xdWV1ZSAqdHhxX2N0cmwgPSBOVUxMOworICAgIHN0cnVjdCBuZXRhX3R4X2Rlc2MgKnR4X2Rlc2M7CisgICAgc3RydWN0IHNrX2J1ZmYgICpza2I7CisKKworICAgIHNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKShwa3QtPm9zSW5mbyk7CisKKyAgICByZWFkX2xvY2soJnBwLT5yd2xvY2spOworCisgICAgaWYgKCEobmV0aWZfcnVubmluZyhkZXZfb3V0KSkpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIhbmV0aWZfcnVubmluZygpIGluICVzXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIEdldCBUWFEgKHdpdGhvdXQgQk0pIHRvIHNlbmQgcGFja2V0IGdlbmVyYXRlZCBieSBMaW51eCAqLworICAgIGlmICh0eF9zcGVjX3JlYWR5ID09IGZhbHNlKSB7CisgICAgICAgIHR4X3NwZWMudHhwICAgID0gdHhfc3BlY19vdXQtPnR4cDsKKyAgICAgICAgdHhfc3BlYy50eHEgICAgPSB0eF9zcGVjX291dC0+dHhxOworICAgICAgICB0eF9zcGVjLmh3X2NtZCA9IHR4X3NwZWNfb3V0LT5od19jbWQ7CisgICAgICAgIHR4X3NwZWMuZmxhZ3MgID0gdHhfc3BlY19vdXQtPmZsYWdzOworICAgIH0KKworICAgIHR4cV9jdHJsID0gJnBwLT50eHFfY3RybFt0eF9zcGVjLnR4cCAqIENPTkZJR19NVl9FVEhfVFhRICsgdHhfc3BlYy50eHFdOworICAgIGlmICh0eHFfY3RybCA9PSBOVUxMKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWRhdGUgdHhwL3R4cSAoJWQvJWQpXG4iLCBfX2Z1bmNfXywgdHhfc3BlYy50eHAsIHR4X3NwZWMudHhxKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZ0eHFfY3RybC0+cXVldWVfbG9jayk7CisKKyNpZiAwCisjaWZkZWYgQ09ORklHX01WX0VUSF9UU08KKyAgICAvKiBHU08vVFNPICovCisgICAgaWYgKHNrYl9pc19nc28oc2tiKSkgeworICAgICAgICBmcmFncyA9IG12X2V0aF90eF90c28oc2tiLCBkZXZfb3V0LCAmdHhfc3BlYywgdHhxX2N0cmwpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX01WX0VUSF9UU08gKi8KKyNlbmRpZgorCisgICAgZnJhZ3MgPSAxOworCisjaWYgMAorICAgIGlmICh0eF9zcGVjLmZsYWdzICYgTVZfRVRIX0ZfTUgpIHsKKyAgICAgICAgaWYgKHR4X3NwZWMuZmxhZ3MgJiBNVl9FVEhfRl9TV0lUQ0gpCisgICAgICAgICAgICBtaCA9IGRldl9wcml2LT50eF92bGFuX21oOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtaCA9IHBwLT50eF9taDsKKworICAgICAgICBpZiAobXZfZXRoX3NrYl9taF9hZGQoc2tiLCBtaCkpIHsKKyAgICAgICAgICAgIGZyYWdzID0gMDsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgdHhfZGVzYyA9IG12X2V0aF90eF9kZXNjX2dldCh0eHFfY3RybCwgZnJhZ3MpOworICAgIGlmICh0eF9kZXNjID09IE5VTEwpIHsKKyAgICAgICAgZnJhZ3MgPSAwOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICB0eF9jbWQgPSBORVRBX1RYX0w0X0NTVU1fTk9UOworCisjaWZkZWYgQ09ORklHX01WX1BPTgorICAgIHR4X2Rlc2MtPmh3X2NtZCA9IHR4X3NwZWMuaHdfY21kOworI2VuZGlmCisKKyAgICAvKiBGSVhNRTogYmV3YXJlIG9mIG5vbmxpbmVhciAtLUJLICovCisgICAgdHhfZGVzYy0+ZGF0YVNpemUgPSBza2JfaGVhZGxlbihza2IpOworCisgICAgdHhfZGVzYy0+YnVmUGh5c0FkZHIgPSBtdk9zQ2FjaGVGbHVzaChOVUxMLCBza2ItPmRhdGEsIHR4X2Rlc2MtPmRhdGFTaXplKTsKKworICAgIGlmIChmcmFncyA9PSAxKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZpcnN0IGFuZCBMYXN0IGRlc2NyaXB0b3IKKyAgICAgICAgICovCisgICAgICAgIGlmICh0eF9zcGVjLmZsYWdzICYgTVZfRVRIX0ZfTk9fUEFEKQorICAgICAgICAgICAgdHhfY21kIHw9IE5FVEFfVFhfRl9ERVNDX01BU0sgfCBORVRBX1RYX0xfREVTQ19NQVNLOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0eF9jbWQgfD0gTkVUQV9UWF9GTFpfREVTQ19NQVNLOworCisgICAgICAgIHR4X2Rlc2MtPmNvbW1hbmQgPSB0eF9jbWQ7CisgICAgICAgIG12X2V0aF90eF9kZXNjX2ZsdXNoKHR4X2Rlc2MpOworCisgICAgICAgIHR4cV9jdHJsLT5zaGFkb3dfdHhxW3R4cV9jdHJsLT5zaGFkb3dfdHhxX3B1dF9pXSA9ICgoTVZfVUxPTkcpIHNrYiB8IE1WX0VUSF9TSEFET1dfU0tCKTsKKyAgICAgICAgbXZfZXRoX3NoYWRvd19pbmNfcHV0KHR4cV9jdHJsKTsKKyAgICB9IAorCisgICAgdHhxX2N0cmwtPnR4cV9jb3VudCArPSBmcmFnczsKKworI2lmZGVmIENPTkZJR19NVl9FVEhfREVCVUdfQ09ERQorICAgIGlmIChwcC0+ZmxhZ3MgJiBNVl9FVEhfRl9EQkdfVFgpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzIC0gZXRoX3R4XyVsdTogcG9ydD0lZCwgdHhwPSVkLCB0eHE9JWQsIHNrYj0lcCwgaGVhZD0lcCwgZGF0YT0lcCwgc2l6ZT0lZFxuIiwKKyAgICAgICAgICAgICAgIGRldl9vdXQtPm5hbWUsIGRldl9vdXQtPnN0YXRzLnR4X3BhY2tldHMsIHBwLT5wb3J0LCB0eF9zcGVjLnR4cCwgdHhfc3BlYy50eHEsIHNrYiwKKyAgICAgICAgICAgICAgIHNrYi0+aGVhZCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisgICAgICAgIG12X2V0aF90eF9kZXNjX3ByaW50KHR4X2Rlc2MpOworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfTVZfRVRIX0RFQlVHX0NPREUgKi8KKworI2lmZGVmIENPTkZJR19NVl9QT04KKyAgICBpZiAoTVZfUE9OX1BPUlQocHAtPnBvcnQpKQorICAgICAgICBtdk5ldGFQb25UeHFCeXRlc0FkZChwcC0+cG9ydCwgdHhfc3BlYy50eHAsIHR4X3NwZWMudHhxLCBza2ItPmxlbik7CisjZW5kaWYgLyogQ09ORklHX01WX1BPTiAqLworCisgICAgLyogRW5hYmxlIHRyYW5zbWl0ICovCisgICAgbXZOZXRhVHhxUGVuZERlc2NBZGQocHAtPnBvcnQsIHR4X3NwZWMudHhwLCB0eF9zcGVjLnR4cSwgZnJhZ3MpOworCisgICAgU1RBVF9EQkcodHhxX2N0cmwtPnN0YXRzLnR4cV90eCArPSBmcmFncyk7CisKK291dDoKKyAgICBpZiAoZnJhZ3MgPiAwKSB7CisgICAgICAgIGRldl9vdXQtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgICAgZGV2X291dC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGV2X291dC0+c3RhdHMudHhfZHJvcHBlZCsrOworICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworICAgIH0KKworI2lmbmRlZiBDT05GSUdfTVZfRVRIX1RYRE9ORV9JU1IKKyAgICBpZiAodHhxX2N0cmwpIHsKKyAgICAgICAgaWYgKHR4cV9jdHJsLT50eHFfY291bnQgPj0gbXZfY3RybF90eGRvbmUpIHsKKyAgICAgICAgICAgIHUzMiB0eF9kb25lID0gbXZfZXRoX3R4cV9kb25lKHBwLCB0eHFfY3RybCk7CisKKyAgICAgICAgICAgIFNUQVRfRElTVCgodHhfZG9uZSA8IHBwLT5kaXN0X3N0YXRzLnR4X2RvbmVfZGlzdF9zaXplKSA/IHBwLT5kaXN0X3N0YXRzLnR4X2RvbmVfZGlzdFt0eF9kb25lXSsrIDogMCk7CisKKyAgICAgICAgfQorICAgICAgICAvKiBJZiBhZnRlciBjYWxsaW5nIG12X2V0aF90eHFfZG9uZSwgdHhxX2N0cmwtPnR4cV9jb3VudCBlcXVhbHMgZnJhZ3MsIHdlIG5lZWQgdG8gc2V0IHRoZSB0aW1lciAqLworICAgICAgICBpZiAoKHR4cV9jdHJsLT50eHFfY291bnQgPT0gZnJhZ3MpICYmIChmcmFncyA+IDApKQorICAgICAgICAgICAgbXZfZXRoX2FkZF90eF9kb25lX3RpbWVyKHBwKTsKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX01WX0VUSF9UWERPTkVfSVNSICovCisKKyAgICBpZiAodHhxX2N0cmwpCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4cV9jdHJsLT5xdWV1ZV9sb2NrKTsKKworICAgIHJlYWRfdW5sb2NrKCZwcC0+cndsb2NrKTsKKworI2VuZGlmICAgIAorICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19sb29rdXBfb3BfdHlwZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBvcGVyYXRpb24gdHlwZSBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9mbG93X2xvb2t1cF9vcF90eXBlKElOVDMyIGVudW1fdmFsdWUpCit7CisgICAgcmV0dXJuIG10eXBlX2xvb2t1cF9lbnVtX3N0cigmZ19lbnVtX2FycmF5X29wX3R5cGUsIGVudW1fdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2Rpc3BsYXlfYWxsKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBkaXNwbGF5cyB2YWxpZCBmbG93IG1hcHBpbmcgdGFibGVzIGFuZCBEU0NQIAorKiAgICAgICAgICAgICAgdG8gUC1iaXRzIG1hcHBpbmcgdGFibGVmb3IgdW50YWdnZWQgZnJhbWVzLgorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfZmxvd19kaXNwbGF5X2FsbCAoVk9JRCkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgICBpZHggICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgICAgcnVsZV9pZHggICAgPSAwOworICAgIENQSF9GTE9XX0VOVFJZX1QgKnBfZmxvd19ydWxlID0gTlVMTDsKKyAgICBJTlQzMiAgICAgICAgICAgICBvZmZzZXQgICAgICA9IDA7CisgICAgVUlOVDggICAgICAgICAgICAgYnVmZls1MTJdOworCisgICAgLyogUHJpbnQgZmxvdyBydWxlIGVudHJpZXMgKi8KKyAgICBwcmludGsoS0VSTl9JTkZPICJNVl9DUEggRmxvdyBSdWxlIFRhYmxlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBwcmludGsoS0VSTl9JTkZPICJUb3RhbCBydWxlIG51bWJlcjolZCwgTWF4IHJ1bGUgbnVtYmVyOiVkIFxuIiwgZ3NfZmxvd190YWJsZS5ydWxlX251bSwgQ1BIX0ZMT1dfRU5UUllfTlVNKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIHByaW50ayhLRVJOX0lORk8gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFBhcnNlIG91dGVyICAgICAgIHxQYXJzZSBpbm5lciAgICAgICB8TW9kIG91dGVyICAgICAgICAgfE1vZCBJbm5lciAgICAgICAgIHxGb3J3YXJkXG4iKTsKKyAgICBwcmludGsoS0VSTl9JTkZPICJkaXIgZGVmYXVsdCBwYXJzZV9ibSBtaCAgIGV0eSAgICB0cGlkICAgdmlkICBwYml0cyAgdHBpZCAgIHZpZCAgcGJpdHMgIHRwaWQgICB2aWQgIHBiaXRzICB0cGlkICAgdmlkICBwYml0cyAgcG9ydCBxdWV1ZSBod2ZfcXVldWUgZ2VtICBjb3VudCAgICBvcF90eXBlXG4iKTsKKyAgICAvKiBUcmF2ZXJzZSBDUEggZmxvdyBydWxlIHRhbGUgKi8KKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9GTE9XX0VOVFJZX05VTSkgJiYgKHJ1bGVfaWR4IDwgZ3NfZmxvd190YWJsZS5ydWxlX251bSk7IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9mbG93X3J1bGUgPSAmZ3NfZmxvd190YWJsZS5mbG93X3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSAqLworICAgICAgICBpZiAocF9mbG93X3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIAorICAgICAgICAgICAgICAgICAgICIlMi4ycyAgJTMuM3MgICAgIDB4JTA0eCAgICUtNGQgMHglMDR4IDB4JTA0eCAlLTRkICUxZCAgICAgIDB4JTA0eCAlLTRkICUxZCAgICAgIDB4JTA0eCAlLTRkICUxZCAgICAgIDB4JTA0eCAlLTRkICUxZCAgICAgICUxZCAgICAlMWQgICAgICUxZCAgICAgICAgICUtNGQgJS04ZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBjcGhfYXBwX2xvb2t1cF9kaXIocF9mbG93X3J1bGUtPmRpciksIChwX2Zsb3dfcnVsZS0+aXNfZGVmYXVsdCA9PSBUUlVFKT8gIlllcyI6Ik5vICIsIAorICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5wYXJzZV9ibSwgICAgICAgICAgICAgcF9mbG93X3J1bGUtPm1oLCAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5ldGhfdHlwZSwKKyAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnRwaWQsIHBfZmxvd19ydWxlLT5wYXJzZV9vdXRlcl90Y2kudmlkLCBwX2Zsb3dfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzLCAKKyAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnRwaWQsIHBfZmxvd19ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkLCBwX2Zsb3dfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzLAorICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5tb2Rfb3V0ZXJfdGNpLnRwaWQsICAgcF9mbG93X3J1bGUtPm1vZF9vdXRlcl90Y2kudmlkLCAgIHBfZmxvd19ydWxlLT5tb2Rfb3V0ZXJfdGNpLnBiaXRzLAorICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5tb2RfaW5uZXJfdGNpLnRwaWQsICAgcF9mbG93X3J1bGUtPm1vZF9pbm5lcl90Y2kudmlkLCAgIHBfZmxvd19ydWxlLT5tb2RfaW5uZXJfdGNpLnBiaXRzLAorICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5wa3RfZnJ3ZC50cmdfcG9ydCwgICAgcF9mbG93X3J1bGUtPnBrdF9mcndkLnRyZ19xdWV1ZSwgIHBfZmxvd19ydWxlLT5wa3RfZnJ3ZC50cmdfaHdmX3F1ZXVlLCBwX2Zsb3dfcnVsZS0+cGt0X2Zyd2QuZ2VtX3BvcnQsIAorICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5jb3VudCwgICAgICAgICAgICAgICAgY3BoX2Zsb3dfbG9va3VwX29wX3R5cGUocF9mbG93X3J1bGUtPm9wX3R5cGUpKTsKKyAgICAgICAgfQorICAgIH0gICAKKworICAgIC8qIFByaW50ICBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHRhYmxlICovCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5NVl9DUEggRFNDUCB0byBQLWJpdHMgTWFwcGluZyBUYWJsZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7ICAKKyAgICBpZiAoZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID09IDApIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiTm8gRFNDUCB0byBQLWJpdHMgbWFwcGluZ1xuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJEU0NQW1BiaXRzXVxuIik7CisKKyAgICAgICAgbWVtc2V0KGJ1ZmYsIDAsIHNpemVvZihidWZmKSk7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgTVZfQ1BIX0RTQ1BfUEJJVFNfVEFCTEVfTUFYX1NJWkU7IGlkeCsrKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ByaW50ZihidWZmK29mZnNldCwgIiUyLjJkWyUyLjJkXSAiLCBpZHgsIGdzX2RzY3BfbWFwX3RhYmxlLnBiaXRzW2lkeF0pOworICAgICAgICAgICAgaWYgKCgoaWR4KzEpICUgMTYpID09IDApCisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNwcmludGYoYnVmZitvZmZzZXQsICJcbiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBidWZmKTsKKyAgICB9CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKyAKKyAgICByZXR1cm4gTVZfT0s7IAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2luaXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZXMgQ1BIIGZsb3cgbWFwcGluZyBkYXRhIHN0cnVjdHVyZS4KKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfaW5pdChWT0lEKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZmxvd19kYl9pbml0KCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9mbG93X2RiX2luaXQiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Zsb3cuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9mbG93LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjY2NTZmMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9mbG93LmgKQEAgLTAsMCArMSw1OTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfZmxvdy5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGZsb3cgbW9kdWxlIHRvIGhhbmRsZSB0aGUgCisqICAgICAgICAgICAgICBmbG93IG1hcHBpbmcsIFZMQU4gbW9kaWZpY2F0aW9uIG9mIGRhdGEgdHJhZmZpYworKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMTJEZWMyMDExCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjEKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfRkxPV19IXworI2RlZmluZSBfTVZfQ1BIX0ZMT1dfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogICAgICAgICAgICAgICAgICAgICAgICBEYXRhIEVudW0gYW5kIFN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1WX0NQSF9UUElEX05PVF9DQVJFX1ZBTFVFICAgICAgICgwKSAgICAgLyogRG9lcyBub3QgY2FyZSBmb3IgVFBJRCAgICAgKi8KKyNkZWZpbmUgTVZfQ1BIX1ZJRF9OT1RfQ0FSRV9WQUxVRSAgICAgICAgKDQwOTYpICAvKiBEb2VzIG5vdCBjYXJlIGZvciBWSUQgICAgICAqLworI2RlZmluZSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUUgICAgICAoOCkgICAgIC8qIERvZXMgbm90IGNhcmUgZm9yIFAtYml0cyAgICovCisjZGVmaW5lIE1WX0NQSF9EU0NQX05PVF9DQVJFX1ZBTFVFICAgICAgICg2NCkgICAgLyogRG9lcyBub3QgY2FyZSBmb3IgRFNDUCAgICAgKi8KKworI2RlZmluZSBNVl9DUEhfVFBJRF9JTlZBTElEX1ZBTFVFICAgICAgICAoMHhGRkZGKS8qIE5vIHZhbGlkIFRQSUQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1WX0NQSF9WSURfSU5WQUxJRF9WQUxVRSAgICAgICAgICgweEZGRkYpLyogTm8gdmFsaWQgVklEICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVZfQ1BIX1BCSVRTX0lOVkFMSURfVkFMVUUgICAgICAgKDB4RkYpICAvKiBObyB2YWxpZCBQLWJpdHMgICAgICAgICAgICAqLworI2RlZmluZSBNVl9DUEhfRFNDUF9JTlZBTElEX1ZBTFVFICAgICAgICAoMHhGRikgIC8qIE5vIHZhbGlkIERTQ1AgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVZfQ1BIX0RFRkFVTFRfVU5UQUdfUlVMRSAgICAgICAgKDQwOTYrMSkvKiBEZWZhdWx0IHVudGFnZ2VkICBydWxlICAgICAqLworI2RlZmluZSBNVl9DUEhfREVGQVVMVF9TSU5HTEVfVEFHX1JVTEUgICAoNDA5NisyKS8qIERlZmF1bHQgc2lubGdlIHRhZ2dlZCAgcnVsZSovCisjZGVmaW5lIE1WX0NQSF9ERUZBVUxUX0RPVUJMRV9VTlRBR19SVUxFICg0MDk2KzMpLyogRGVmYXVsdCBkb3VibGUgdGFnZ2VkICBydWxlKi8KKworLyogQ1BIIGZsb3cgbWFwcGluZyBydWxlIGRlZmluaXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfVkxBTl9PUF9BU0lTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBDUEhfVkxBTl9PUF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAKKyAgICBDUEhfVkxBTl9PUF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgIAorICAgIENQSF9WTEFOX09QX0FERF9DT1BZX0RTQ1AgICAgICAgICAgICAgICAgICAgICAgPSAzLAorICAgIENQSF9WTEFOX09QX0FERF9DT1BZX09VVEVSX1BCSVQgICAgICAgICAgICAgICAgPSA0LAorICAgIENQSF9WTEFOX09QX0FERF9DT1BZX0lOTkVSX1BCSVQgICAgICAgICAgICAgICAgPSA1LAorICAgIENQSF9WTEFOX09QX0FERF8yX1RBR1MgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LAorICAgIENQSF9WTEFOX09QX0FERF8yX1RBR1NfQ09QWV9EU0NQICAgICAgICAgICAgICAgPSA3LAorICAgIENQSF9WTEFOX09QX0FERF8yX1RBR1NfQ09QWV9QQklUICAgICAgICAgICAgICAgPSA4LAorICAgIENQSF9WTEFOX09QX1JFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LAorICAgIENQSF9WTEFOX09QX1JFTV8yX1RBR1MgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwKKyAgICBDUEhfVkxBTl9PUF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsCisgICAgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9WSUQgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLAorICAgIENQSF9WTEFOX09QX1JFUExBQ0VfUEJJVCAgICAgICAgICAgICAgICAgICAgICAgPSAxMywKKyAgICBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX0FERF9PVVRFUiAgICAgICAgICAgID0gMTQsCisgICAgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9JTk5FUl9BRERfT1VURVJfQ09QWV9QQklUICA9IDE1LAorICAgIENQSF9WTEFOX09QX1JFUExBQ0VfSU5ORVJfUkVNX09VVEVSICAgICAgICAgICAgPSAxNiwKKyAgICBDUEhfVkxBTl9PUF9SRVBMQUNFXzJUQUdTICAgICAgICAgICAgICAgICAgICAgID0gMTcsCisgICAgQ1BIX1ZMQU5fT1BfUkVQTEFDRV8yVEFHU19WSUQgICAgICAgICAgICAgICAgICA9IDE4LAorICAgIENQSF9WTEFOX09QX1NXQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOQorfSBDUEhfVkxBTl9PUF9UWVBFX0U7CisKK3R5cGVkZWYgc3RydWN0IGNwaF9mbG93X2Zyd2QgeworICAgIFVJTlQ4ICB0cmdfcG9ydDsKKyAgICBVSU5UOCAgdHJnX3F1ZXVlOworICAgIFVJTlQ4ICB0cmdfaHdmX3F1ZXVlOworICAgIFVJTlQxNiBnZW1fcG9ydDsKK30gQ1BIX0ZMT1dfRlJXRF9UOworCit0eXBlZGVmIHN0cnVjdCBjcGhfZmxvd190Y2kgeworICAgIFVJTlQxNiAgdHBpZDsKKyAgICBVSU5UMTYgIHZpZDsKKyAgICBVSU5UOCAgIHBiaXRzOworfSBDUEhfRkxPV19UQ0lfVDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX0ZMT1dfUEFSU0VfTUggICAgICAgID0gMHgwMSwgIC8qIHBhcnNpbmcgTWFydmVsbCBoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ1BIX0ZMT1dfUEFSU0VfRVhUX1ZMQU4gID0gMHgwMiwgIC8qIHBhcnNpbmcgZXh0ZXJuYWwgVkxBTiB0YWcgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4gID0gMHgwNCwgIC8qIHBhcnNpbmcgYm90aCBvZiBleHRlcm5hbCBhbmQgaW50ZXJuYWwgVkxBTiB0YWdzICovCisgICAgQ1BIX0ZMT1dfUEFSU0VfRVRIX1RZUEUgID0gMHgwOCwgIC8qIHBhcnNpbmcgRXRoZXJuZXQgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ1BIX0ZMT1dfUEFSU0VfTUNfUFJPVE8gID0gMHgxMCwgIC8qIHBhcnNpbmcgbXVsdGljYXN0IHByb3RvY29sICAgICAgICAgICAgICAgICAgICAgICovCit9IENQSF9GTE9XX1BBUlNFX0U7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQk9PTCAgICAgICAgICAgICAgIHZhbGlkOworICAgIENQSF9ESVJfRSAgICAgICAgICBkaXI7CisgICAgQ1BIX0ZMT1dfUEFSU0VfRSAgIHBhcnNlX2JtOworICAgIEJPT0wgICAgICAgICAgICAgICBpc19kZWZhdWx0OworICAgIFVJTlQxNiAgICAgICAgICAgICBtaDsKKyAgICBDUEhfRkxPV19UQ0lfVCAgICAgcGFyc2Vfb3V0ZXJfdGNpOworICAgIENQSF9GTE9XX1RDSV9UICAgICBwYXJzZV9pbm5lcl90Y2k7CisgICAgVUlOVDE2ICAgICAgICAgICAgIGV0aF90eXBlOworICAgIENQSF9WTEFOX09QX1RZUEVfRSBvcF90eXBlOworICAgIENQSF9GTE9XX1RDSV9UICAgICBtb2Rfb3V0ZXJfdGNpOworICAgIENQSF9GTE9XX1RDSV9UICAgICBtb2RfaW5uZXJfdGNpOworICAgIENQSF9GTE9XX0ZSV0RfVCAgICBwa3RfZnJ3ZDsKKyAgICBVSU5UMzIgICAgICAgICAgICAgY291bnQ7Cit9IENQSF9GTE9XX0VOVFJZX1Q7CisKKyNkZWZpbmUgQ1BIX0ZMT1dfRU5UUllfTlVNICAgKDUxMikKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVSU5UMzIgICAgICAgICAgICAgcnVsZV9udW07CisgICAgc3BpbmxvY2tfdCAgICAgICAgIGZsb3dfbG9jazsKKyAgICBDUEhfRkxPV19FTlRSWV9UICAgZmxvd19ydWxlW0NQSF9GTE9XX0VOVFJZX05VTV07Cit9IENQSF9GTE9XX1RBQkxFX1Q7CisKKy8qIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgdGFibGUgZGVmaW5pdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgTVZfQ1BIX0RTQ1BfUEJJVFNfVEFCTEVfTUFYX1NJWkUgICg2NCkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVSU5UMzIgaW5fdXNlOworICAgIFVJTlQ4ICBwYml0c1tNVl9DUEhfRFNDUF9QQklUU19UQUJMRV9NQVhfU0laRV07Cit9IENQSF9EU0NQX1BCSVRTX1Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVjbGFyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19hZGRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXRzIGZsb3cgbWFwcGluZyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9mbG93X2FkZF9ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kZWxfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGVzIGZsb3cgbWFwcGluZyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfZmxvd19kZWxfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfY2xlYXJfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhcnMgYWxsIGZsb3cgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9mbG93X2NsZWFyX3J1bGUoVk9JRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfY2xlYXJfcnVsZV9ieV9taCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhcnMgZmxvdyBtYXBwaW5nIHJ1bGVzIGJ5IE1ICisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAtICBNYXJ2ZWxsIGhlYWRlci4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Zsb3dfY2xlYXJfcnVsZV9ieV9taChVSU5UMTYgbWgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2dldF90YWdfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXRzIGZsb3cgbWFwcGluZyBydWxlIGZvciB0YWdnZWQgZnJhbWVzLgorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gSW5wdXQgdmlkLCBwYml0cywgZGlyCisqCisqIE9VVFBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gb3V0cHV0IHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgR0VNIHBvcnQsIAorKiAgICAgICAgICAgICAgICAgIFQtQ09OVCwgcXVldWUgYW5kIHBhY2tldCBtb2RpZmljYXRpb24gZm9yIFZJRCwgUC1iaXRzLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfZ2V0X3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3NldF9kc2NwX21hcCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXRzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBkc2NwX21hcCAgLSBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZmxvd19zZXRfZHNjcF9tYXAoQ1BIX0RTQ1BfUEJJVFNfVCAqZHNjcF9tYXApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RlbF9kc2NwX21hcCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGVzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZmxvd19kZWxfZHNjcF9tYXAoVk9JRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfYWRkX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQWRkIG9uZSBWTEFOIHRhZyBiZWhpbmQgb2Ygc291cmNlIE1BQyBhZGRyZXNzLgorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgICAtIFdoZXRoZXIgaGFzIE1IIG9yIG5vdAorKiAgICAgICBwX2RhdGEgLSBQb2ludGVyIHRvIHBhY2tldAorKiAgICAgICB0cGlkICAgLSBUeXBlIG9mIFZMQU4gSUQKKyogICAgICAgdmlkICAgIC0gVkxBTiB0byBiZSBhZGRlZAorKiAgICAgICBwYml0cyAgLSBQLWJpdHMgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgVGhlIHNoaWZ0IG9mIFNLQiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOTElORSBJTlQzMiBjcGhfZmxvd19hZGRfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhLCBVSU5UMTYgdHBpZCwgVUlOVDE2IHZpZCwgVUlOVDggcGJpdHMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RlbF92bGFuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZSBvbmUgVkxBTiB0YWcgYmVoaW5kIG9mIHNvdXJjZSBNQUMgYWRkcmVzcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgcF9kYXRhIC0gUG9pbnRlciB0byBwYWNrZXQuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfZGVsX3ZsYW4oQk9PTCBtaCwgVUlOVDggKnBfZGF0YSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfcmVwbGFjZV92bGFuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFJlcGxhY2Ugb25lIFZMQU4gdGFnIGJlaGluZCBvZiBzb3VyY2UgTUFDIGFkZHJlc3MuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0CisqICAgICAgIHRwaWQgICAtIFR5cGUgb2YgVkxBTiBJRAorKiAgICAgICB2aWQgICAgLSBWTEFOIHRvIGJlIGFkZGVkCisqICAgICAgIHBiaXRzICAtIFAtYml0cyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBUaGUgc2hpZnQgb2YgU0tCIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5MSU5FIElOVDMyIGNwaF9mbG93X3JlcGxhY2VfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhLCBVSU5UMTYgdHBpZCwgVUlOVDE2IHZpZCwgVUlOVDggcGJpdHMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3N3YXBfdmxhbigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTd2FwIGJldHdlZW4gdHdvIFZMQU4gdGFnLgorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgICAtIFdoZXRoZXIgaGFzIE1IIG9yIG5vdAorKiAgICAgICBwX2RhdGEgLSBQb2ludGVyIHRvIHBhY2tldAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBUaGUgc2hpZnQgb2YgU0tCIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5MSU5FIElOVDMyIGNwaF9mbG93X3N3YXBfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19zdHJpcF92bGFuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZSBhbGwgVkxBTiB0YWdzIGJlaGluZCBvZiBzb3VyY2UgTUFDIGFkZHJlc3MuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0LgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBUaGUgc2hpZnQgb2YgU0tCIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5MSU5FIElOVDMyIGNwaF9mbG93X3N0cmlwX3ZsYW4oQk9PTCBtaCwgVUlOVDggKnBfZGF0YSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfY29tcGFyZV9ydWxlcygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDb21wYXJzZSB0d28gZmxvdyBydWxlcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ydWxlICAtIFRoZSBwYXJzaW5nIGZpZWxkIHZhbHVlcyBjb21lIGZyb20gdGhlIHBhY2tldHMKKyogICAgICAgZGJfcnVsZSAgICAgLSBUaGUgZmxvdyBydWxlIHN0b3JlZCBpbiBmbG93IGRhdGFiYXNlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIEluIGNhc2Ugc2FtZSwgcmV0dXJuIFRSVUUsIAorKiAgICAgICBJbiBjYXNlIGRpZmZlcmVudCwgcmV0dXJuIEZBTFNFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2Zsb3dfY29tcGFyZV9ydWxlcyAoQ1BIX0ZMT1dfRU5UUllfVCAqcGFyc2VfcnVsZSwgQ1BIX0ZMT1dfRU5UUllfVCAqZGJfcnVsZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfY29tcGFyZV9wYWNrZXRfYW5kX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ29tcGFyZSBmbG93IHBhY2tldCBhbmQgcnVsZS4KKyoKKyogSU5QVVRTOgorKiAgICAgICBwYWNrZXRfcnVsZSAtIFRoZSBwYXJzaW5nIGZpZWxkIHZhbHVlcyBjb21lIGZyb20gdGhlIHBhY2tldHMKKyogICAgICAgZGJfcnVsZSAgICAgLSBUaGUgZmxvdyBydWxlIHN0b3JlZCBpbiBmbG93IGRhdGFiYXNlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIEluIGNhc2Ugc2FtZSwgcmV0dXJuIFRSVUUsIAorKiAgICAgICBJbiBjYXNlIGRpZmZlcmVudCwgcmV0dXJuIEZBTFNFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2Zsb3dfY29tcGFyZV9wYWNrZXRfYW5kX3J1bGUgKENQSF9GTE9XX0VOVFJZX1QgKnBhY2tldF9ydWxlLCBDUEhfRkxPV19FTlRSWV9UICpkYl9ydWxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19wYXJzZV9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogUGFyc2UgcGFja2V0IGFuZCBvdXRwdXQgZmxvdyBpbmZvcm1hdGlvbi4KKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0IC0gU291cmNlIEdNQUMgcG9ydAorKiAgICAgICBkYXRhIC0gUG9pbnRlciB0byBwYWNrZXQKKyogICAgICAgcnggICAtIFdoZXRoZXIgaW4gUlggZGlyCisqCisqIE9VVFBVVFM6CisqICAgICAgIGZsb3cgLSBGbG93IHBhcnNpbmcgZmllbGQgdmFsdWVzCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19wYXJzZV9wYWNrZXQgKElOVDMyIHBvcnQsIFVJTlQ4ICpkYXRhLCBCT09MIHJ4LCBCT09MIG1oLCBDUEhfRkxPV19FTlRSWV9UICpmbG93KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19tb2RfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IE1vZGlmeSBwYWNrZXQgYWNjb3JkaW5nIHRvIGZsb3cgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIHNrYiAgICAgICAgLSBQb2ludGVyIHRvIHBhY2tldAorKiAgICAgICBtaCAgICAgICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIGZsb3cgICAgICAgLSBGbG93IHBhcnNpbmcgZmllbGQgdmFsdWVzCisqICAgICAgIG91dF9vZmZzZXQgLSBPZmZzZXQgb2YgcGFja2V0CisqICAgICAgIHJ4ICAgICAgICAgLSBXaGV0aGVyIFJYIG9yIFRYCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19tb2RfcGFja2V0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAgQk9PTCBtaCwgQ1BIX0ZMT1dfRU5UUllfVCAqZmxvdywgSU5UMzIgKm91dF9vZmZzZXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X21vZF9mcndkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IE1vZGlmeSBmb3J3YXJkaW5nIHBhcmFtZXRlciBvZiB0cmFuc21pdGluZyBwYWNrZXQgYWNjb3JkaW5nIHRvIGZsb3cgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIGZsb3cgICAgICAgIC0gRmxvdyBwYXJzaW5nIGZpZWxkIHZhbHVlcworKiAgICAgICB0eF9zcGVjX291dCAtIFRYIGRlc2NyaXB0b3IKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X21vZF9mcndkIChDUEhfRkxPV19FTlRSWV9UICpmbG93LCBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19zZW5kX3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZWNlaXZlZCBhcHBsaWNhdGlvbiBwYWNrZXRzIAorKgorKiBJTlBVVFM6CisqICAgICAgIGRldl9vdXQgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBwa3QgICAgICAgICAtIE1hcnZlbGwgcGFja2V0IGluZm9ybWF0aW9uCisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyAwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X291dCwgIHN0cnVjdCBldGhfcGJ1ZiAqcGt0LAorICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2xvb2t1cF9vcF90eXBlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIG9wZXJhdGlvbiB0eXBlIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2Zsb3dfbG9va3VwX29wX3R5cGUoSU5UMzIgZW51bV92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGlzcGxheV9hbGwoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRpc3BsYXlzIHZhbGlkIGZsb3cgbWFwcGluZyB0YWJsZXMgYW5kIERTQ1AgCisqICAgICAgICAgICAgICB0byBQLWJpdHMgbWFwcGluZyB0YWJsZWZvciB1bnRhZ2dlZCBmcmFtZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Zsb3dfZGlzcGxheV9hbGwoVk9JRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplcyBDUEggZmxvdyBtYXBwaW5nIGRhdGEgc3RydWN0dXJlLgorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9mbG93X2luaXQoVk9JRCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTVZfQ1BIX0ZMT1dfTUFQX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfaGVhZGVyLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGNmZGU1MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9oZWFkZXIuaApAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2hlYWRlci5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGhlYWRlciBmaWxlCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX01WX0NQSF9IRUFERVJfSF8KKyNkZWZpbmUgX01WX0NQSF9IRUFERVJfSF8KKworLyogSW5jbHVkZSBGaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxtdkNvbW1vbi5oPgorI2luY2x1ZGUgPG12X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuaD4KKworI2luY2x1ZGUgIm12X2NwaF9pbmZyYS5oIgorI2luY2x1ZGUgIm12X2NwaF9hcHAuaCIKKyNpbmNsdWRlICJtdl9jcGhfZmxvdy5oIgorI2luY2x1ZGUgIm12X2NwaF9kYi5oIgorI2luY2x1ZGUgIm12X2NwaF9hcGkuaCIKKyNpbmNsdWRlICJtdl9jcGhfbW5nX2lmLmgiCisjaW5jbHVkZSAibXZfY3BoX2Rldi5oIgorI2luY2x1ZGUgIm12X2NwaF9uZXRkZXYuaCIKKyNpbmNsdWRlICJtdl9jcGhfc3lzZnMuaCIKKworI2VuZGlmIC8qIF9NVl9DUEhfSEVBREVSX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfaW5mcmEuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9pbmZyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU0YjI5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfaW5mcmEuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9pbmZyYS5jCisqCisqIERFU0NSSVBUSU9OOiBJbmNsdWRlIHVzZXIgc3BhY2UgaW5mcmFzdHJ1Y3R1cmUgbW9kdWxlcyBkZWZpbml0aW9ucworKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisKKyNpbmNsdWRlICJtdl9jcGhfaGVhZGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQ0hBUiBnX3Vua25vd25fc3RyW10gPSAiPHVua25vd24+IjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWluZGV4X3RwbV9zcmNfdG9fYXBwX3BvcnQoKQorKgorKiBERVNDUklQVElPTjpDb252ZXJ0IFRQTSBzb3VyY2UgcG9ydCB0byBhcHBsaWNhdGlvbiBVTkkgcG9ydCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBzcmNfcG9ydCAgICAtIFRQTSBzb3VyY2UgcG9ydAorKgorKiBPVVRQVVRTOgorKiAgICAgICBBcHBsaWNhdGlvbiBVTkkgcG9ydCBpbmRleAorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhcHBsaWNhdGlvbiBVTkkgcG9ydCBpbmRleC4gCisqICAgICAgIE9uIGVycm9yIHJldHVybiBpbnZhbGlkIGFwcGxpY2F0aW9uIFVOSSBwb3J0IGluZGV4LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0FQUF9FVEhfUE9SVF9VTklfRSBtaW5kZXhfdHBtX3NyY190b19hcHBfcG9ydCh0cG1fc3JjX3BvcnRfdHlwZV90IHNyY19wb3J0KQoreworICAgIE1WX0FQUF9FVEhfUE9SVF9VTklfRSBhcHBfcG9ydCA9IE1WX0FQUF9FVEhfUE9SVF9JTlZBTElEOworCisgICAgLyogU2hvdWxkIG1vZGlmeSBiZWxvdyBjb2RlIGluIGNhc2Ugc3VwcG9ydCBtb3JlIHRoYW4gZm91ciBVTkkgcG9ydHMgKi8KKyAgICBpZiAoc3JjX3BvcnQgPD0gVFBNX1NSQ19QT1JUX1VOSV8zKQorICAgIHsKKyAgICAgICAgYXBwX3BvcnQgPSBNVl9BUFBfRVRIX1BPUlRfSU5ERVhfTUlOICsgKHNyY19wb3J0IC0gVFBNX1NSQ19QT1JUX1VOSV8wKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGFwcF9wb3J0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1pbmRleF9taF90b19hcHBfbGxpZCgpCisqCisqIERFU0NSSVBUSU9OOkNvbnZlcnQgTWFydmVsbCBoZWFkZXIgdG8gYXBwbGljYXRpb24gTExJRCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgLSBNYXJ2ZWxsIGhlYWRlcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBBcHBsaWNhdGlvbiBMTElECisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFwcGxpY2F0aW9uIExMSUQuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm4gaW52YWxpZCBhcHBsaWNhdGlvbiBMTElELgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1RDT05UX0xMSURfRSBtaW5kZXhfbWhfdG9fYXBwX2xsaWQoVUlOVDE2IG1oKQoreworICAgIE1WX1RDT05UX0xMSURfRSBsbGlkICAgICAgID0gTVZfVENPTlRfTExJRF9JTlZBTElEOworICAgIFVJTlQ4ICAgICAgICAgICBsbGlkX2luZGV4ID0gMDsKKworICAgIGxsaWRfaW5kZXggPSAobWggPj4gOCkgJiAweDBmOworICAgIAorICAgIGlmIChsbGlkX2luZGV4ID4gMCkKKyAgICB7CisgICAgICAgIGlmICgweDBmID09IGxsaWRfaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxsaWQgPSBNVl9UQ09OVF9MTElEX0JST0FEQ0FTVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxsaWQgPSBsbGlkX2luZGV4IC0xOworICAgICAgICAgICAgaWYobGxpZCA+IE1WX1RDT05UX0xMSURfNykKKyAgICAgICAgICAgICAgICBsbGlkID0gTVZfVENPTlRfTExJRF9JTlZBTElEOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBsbGlkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG10eXBlX2dldF9kaWdpdF9udW0oKQorKgorKiBERVNDUklQVElPTjpDb252ZXJ0IGNoYXJhY3RlciBzdHJpbmcgdG8gZGlnaXRhbCBudW1iZXIgCisqCisqIElOUFVUUzoKKyogICAgICAgc3RyICAgLSBDaGFyYWN0ZXIgc3RyaW5nCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRGlnaXRhbCBudW1iZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1VJTlQzMiBtdHlwZV9nZXRfZGlnaXRfbnVtKGNvbnN0IENIQVIgICpzdHIpCit7CisgICAgVUlOVDMyICB2YWwgPSAwOworCisgICAgaWYgKChzdHJbMV0gPT0gJ3gnKSB8fCAoc3RyWzFdID09ICdYJykpCisgICAgICAgIHNzY2FuZigmc3RyWzJdLCAiJXgiLCAmdmFsKTsKKyAgICBlbHNlCisgICAgICAgIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMTApOworCisgICAgcmV0dXJuIHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdHlwZV9sb29rdXBfZW51bV9zdHIoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpsb29rdXAgZW51bSBzdHJpbmcgYWNjb3JkaW5nIHRvIGVudW0gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBwX2VudW1fYXJyYXkgICAtIFBvaW50ZXIgdG8gZW51bSBhcnJheQorKiAgICAgICBlbnVtX3ZhbHVlICAgICAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKm10eXBlX2xvb2t1cF9lbnVtX3N0cihNVl9FTlVNX0FSUkFZX1QgKnBfZW51bV9hcnJheSwgSU5UMzIgZW51bV92YWx1ZSkKK3sKKyAgICBJTlQzMiBpZHg7CisgICAgCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBwX2VudW1fYXJyYXktPmVudW1fbnVtOyBpZHgrKykKKyAgICB7CisgICAgICAgIGlmIChlbnVtX3ZhbHVlID09IHBfZW51bV9hcnJheS0+ZW51bV9hcnJheVtpZHhdLmVudW1fdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gcF9lbnVtX2FycmF5LT5lbnVtX2FycmF5W2lkeF0uZW51bV9zdHI7CisgICAgfQorICAgIHJldHVybiBnX3Vua25vd25fc3RyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG11dGlsc19pc19mcndkX2Jyb2FkY2FzdF9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpDaGVjayB3aGV0aGVyIHBhY2tldCBpcyBkaXJlY3RseSBmb3J3YXJkZWQgYnJvYWRjYXN0IG9uZQorKgorKiBJTlBVVFM6CisqICAgICAgIGRhdGEgICAtIHBhY2tldCBkYXRhCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgVFJVRTogYnJvYWRjYXN0IHBhY2tldCwgRkFMU0U6bm9uZSBicm9hZGNhc3QgcGFja2V0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBtdXRpbHNfaXNfZnJ3ZF9icm9hZGNhc3RfcGFja2V0KGNoYXIgKmRhdGEpCit7CisgICAgY2hhciBiY19tYWNbNl0gPSB7MHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRn07CisgICAgY2hhciAqcF9kYXRhOworCisgICAgcF9kYXRhID0gZGF0YSArIE1WX0VUSF9NSF9TSVpFOworCisgICAgaWYgKCFtZW1jbXAocF9kYXRhLCAmYmNfbWFjWzBdLCBzaXplb2YoYmNfbWFjKSkpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2luZnJhLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfaW5mcmEuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMzhkMWFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2luZnJhLmgKQEAgLTAsMCArMSw0MjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfaW5mcmEuaAorKgorKiBERVNDUklQVElPTjogSW5jbHVkZSB1c2VyIHNwYWNlIGluZnJhc3RydWN0dXJlIG1vZHVsZXMgZGVmaW5pdGlvbnMKKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX0lORlJBX0hfCisjZGVmaW5lIF9NVl9DUEhfSU5GUkFfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERhdGEgVHlwZSBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiAgICAgICAgICBjaGFyICAgICAgSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgIFVJTlQ4OwordHlwZWRlZiAgICAgICAgICBzaG9ydCAgICAgSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICBVSU5UMTY7Cit0eXBlZGVmICAgICAgICAgIGludCAgICAgICBJTlQzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgIFVJTlQzMjsKK3R5cGVkZWYgICAgICAgICAgbG9uZyBsb25nIElOVDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUlOVDY0OwordHlwZWRlZiAgICAgICAgICBjaGFyICAgICAgQ0hBUjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgIFVDSEFSOwordHlwZWRlZiAgICAgICAgICBsb25nICAgICAgTE9ORzsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgIFVMT05HOworCit0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICBWT0lEOwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgU1RBVFVTOworCit0eXBlZGVmIGJvb2wgICAgICAgICAgICAgICBCT09MOworI2RlZmluZSBUUlVFICAgICAgICAgICAgICAgdHJ1ZQorI2RlZmluZSBGQUxTRSAgICAgICAgICAgICAgZmFsc2UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQb3J0IEluZGV4IERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFdGhlcm5ldCBwb3J0IGluZGV4ICovCisjZGVmaW5lIE1WX0FQUF9FVEhfUE9SVF9JTkRFWF9NSU4gMQorI2RlZmluZSBNVl9BUFBfRVRIX1BPUlRfSU5ERVhfTUFYIDQKKyNkZWZpbmUgTVZfQVBQX0VUSF9QT1JUX05VTSAgICAgICAoTVZfQVBQX0VUSF9QT1JUX0lOREVYX01BWC1NVl9BUFBfRVRIX1BPUlRfSU5ERVhfTUlOKzEpCisKK3R5cGVkZWYgZW51bSB7CisgICAgTVZfQVBQX0VUSF9QT1JUX1VOSV8wICAgPSAxLAorICAgIE1WX0FQUF9FVEhfUE9SVF9VTklfMSwKKyAgICBNVl9BUFBfRVRIX1BPUlRfVU5JXzIsCisgICAgTVZfQVBQX0VUSF9QT1JUX1VOSV8zLAorICAgIE1WX0FQUF9FVEhfUE9SVF9VTklfNCwKKyAgICBNVl9BUFBfRVRIX1BPUlRfVU5JXzUsCisgICAgTVZfQVBQX0VUSF9QT1JUX1VOSV82LAorICAgIE1WX0FQUF9FVEhfUE9SVF9VTklfNywKKyAgICBNVl9BUFBfRVRIX1BPUlRfSU5WQUxJRCAgIAorfSAgTVZfQVBQX0VUSF9QT1JUX1VOSV9FOworCisvKiBWb0lQIHBvcnQgaW5kZXggKi8KKyNkZWZpbmUgTVZfQVBQX1ZPSVBfUE9SVF9JTkRFWF9NSU4gMQorI2RlZmluZSBNVl9BUFBfVk9JUF9QT1JUX0lOREVYX01BWCAyCisjZGVmaW5lIE1WX0FQUF9WT0lQX1BPUlRfTlVNICAgICAgIChNVl9BUFBfVk9JUF9QT1JUX0lOREVYX01BWC1NVl9BUFBfVk9JUF9QT1JUX0lOREVYX01JTisxKQorCit0eXBlZGVmIGVudW0geworICAgIE1WX0FQUF9WT0lQX1BPUlRfMCA9IDEsCisgICAgTVZfQVBQX1ZPSVBfUE9SVF8xCit9ICBNVl9BUFBfVk9JUF9QT1JUX0U7CisKKy8qIFdJRkkgU1NJRCBwb3J0IGluZGV4ICovCisjZGVmaW5lIE1WX0FQUF9TU0lEX0lOREVYX01JTiAxCisjZGVmaW5lIE1WX0FQUF9TU0lEX0lOREVYX01BWCA0Cit0eXBlZGVmIGVudW0geworICAgIE1WX0FQUF9TU0lEXzAgPSAxLAorICAgIE1WX0FQUF9TU0lEXzEsCisgICAgTVZfQVBQX1NTSURfMiwKKyAgICBNVl9BUFBfU1NJRF8zLAorICAgIE1WX0FQUF9TU0lEXzQsCisgICAgTVZfQVBQX1NTSURfNSwKKyAgICBNVl9BUFBfU1NJRF82LAorICAgIE1WX0FQUF9TU0lEXzcKK30gIE1WX0FQUF9TU0lEX0U7CisKKy8qIFVTQiBwb3J0IGluZGV4ICovCisjZGVmaW5lIE1WX0FQUF9VU0JfUE9SVF9JTkRFWF9NSU4gMQorI2RlZmluZSBNVl9BUFBfVVNCX1BPUlRfSU5ERVhfTUFYIDIKKyNkZWZpbmUgTVZfQVBQX1VTQl9QT1JUX05VTSAgICAgICAoTVZfQVBQX1VTQl9QT1JUX0lOREVYX01BWC1NVl9BUFBfVVNCX1BPUlRfSU5ERVhfTUlOKzEpCisKK3R5cGVkZWYgZW51bSB7CisgICAgTVZfQVBQX1VTQl9QT1JUXzAgPSAxLAorICAgIE1WX0FQUF9VU0JfUE9SVF8xCit9ICBNVl9BUFBfVVNCX1BPUlRfRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR0UgTUFDIFBvcnQgSW5kZXggRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTVZfQVBQX0dNQUNfUE9SVF8wICAgICAgID0gMCwKKyAgICBNVl9BUFBfR01BQ19QT1JUXzEsCisgICAgTVZfQVBQX1BPTl9NQUNfUE9SVCwKKyAgICBNVl9BUFBfR01BQ19QT1JUX05VTSAgICAgPSAzLAorICAgIE1WX0FQUF9HTUFDX1BPUlRfSU5WQUxJRCA9IDMsCit9ICBNVl9BUFBfR01BQ19QT1JUX0U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFQtQ09OVC9MTElEIEluZGV4IERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1WX1RDT05UX0xMSURfTUlOIDAKKyNkZWZpbmUgTVZfVENPTlRfTExJRF9NQVggNworI2RlZmluZSBNVl9UQ09OVF9MTElEX05VTSAoTVZfVENPTlRfTExJRF9NQVgtTVZfVENPTlRfTExJRF9NSU4rMSkKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNVl9UQ09OVF9MTElEXzAgPSAwLAorICAgIE1WX1RDT05UX0xMSURfMSwKKyAgICBNVl9UQ09OVF9MTElEXzIsCisgICAgTVZfVENPTlRfTExJRF8zLAorICAgIE1WX1RDT05UX0xMSURfNCwKKyAgICBNVl9UQ09OVF9MTElEXzUsCisgICAgTVZfVENPTlRfTExJRF82ICwKKyAgICBNVl9UQ09OVF9MTElEXzcsIAorICAgIE1WX1RDT05UX0xMSURfOCwKKyAgICBNVl9UQ09OVF9MTElEXzksCisgICAgTVZfVENPTlRfTExJRF8xMCwKKyAgICBNVl9UQ09OVF9MTElEXzExLAorICAgIE1WX1RDT05UX0xMSURfMTIsCisgICAgTVZfVENPTlRfTExJRF8xMywKKyAgICBNVl9UQ09OVF9MTElEXzE0ICwKKyAgICBNVl9UQ09OVF9MTElEXzE1LCAKKyAgICBNVl9UQ09OVF9MTElEX0JST0FEQ0FTVCwKKyAgICBNVl9UQ09OVF9MTElEX0lOVkFMSUQKK30gTVZfVENPTlRfTExJRF9FOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXQU4gYW5kIExBTiBJbmRleCBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgICBNVl9BUFBfUE9SVF9XQU4gPSAwLAorICAgIE1WX0FQUF9QT1JUX0xBTiwKKyAgICBNVl9BUFBfUE9SVF9JTlZBTElELAorfSAgTVZfQVBQX1BPUlRfVFlQRV9FOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHRU0gUG9ydCBJbmRleCBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNVl9HRU1fUE9SVF9NSU4gIDAKKyNkZWZpbmUgTVZfR0VNX1BPUlRfTUFYICA0MDk1CisjZGVmaW5lIE1WX0dFTV9QT1JUX05VTSAgKE1WX0dFTV9QT1JUX01BWC1NVl9HRU1fUE9SVF9NSU4rMSkKKyNkZWZpbmUgTVZfR0VNX1BPUlRfTUFTSyAweDBGRkYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUXVldWUgSW5kZXggRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVZfUVVFVUVfTUlOICAwCisjZGVmaW5lIE1WX1FVRVVFX01BWCAgNworI2RlZmluZSBNVl9RVUVVRV9OVU0gIChNVl9RVUVVRV9NQVgtTVZfUVVFVUVfTUlOKzEpCisjZGVmaW5lIE1WX0lOVkFMSURfUVVFVUVfTlVNICAoMHhGRikgLyogSW52YWxpZCBxdWV1ZSBudW1iZXIgICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgTVZfUVVFVUVfMCA9IDAsCisgICAgTVZfUVVFVUVfMSwKKyAgICBNVl9RVUVVRV8yLAorICAgIE1WX1FVRVVFXzMsCisgICAgTVZfUVVFVUVfNCwKKyAgICBNVl9RVUVVRV81LAorICAgIE1WX1FVRVVFXzYsCisgICAgTVZfUVVFVUVfNworfSAgTVZfUVVFVUVfRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVkxBTiBJRC9QLWJpdHMgSW5kZXggRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVZfVkxBTl9JRF9NSU4gIDAKKyNkZWZpbmUgTVZfVkxBTl9JRF9NQVggNDA5NQorI2RlZmluZSBNVl9WTEFOX0lEX05VTSAoTVZfVkxBTl9JRF9NQVgtTVZfVkxBTl9JRF9NSU4rMSkKKyNkZWZpbmUgTVZfVkxBTl9JRF9NQVNLIDB4MEZGRgorI2RlZmluZSBNVl9WTEFOX0lEX0lOVkFMSURfVkFMVUUgMHhGRkZGCisKKyNkZWZpbmUgTVZfUEJJVFNfTUlOICAgMAorI2RlZmluZSBNVl9QQklUU19NQVggICA3CisjZGVmaW5lIE1WX1BCSVRTX05VTSAgKE1WX1BCSVRTX01BWC1NVl9QQklUU19NSU4rMSkKKyNkZWZpbmUgTVZfUEJJVFNfU0hJRlQgMTMKKyNkZWZpbmUgTVZfUEJJVFNfTUFTSyAweDA3CisjZGVmaW5lIE1WX1BCSVRTX0lOVkFMSURfVkFMVUUgMHhGRgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdBTiBQb3J0IFN0YXRlIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworICAgIE1WX0dFX1BPUlRfSU5BQ1RJVkUgPSAwLAorICAgIE1WX0dFX1BPUlRfQUNUSVZFLAorICAgIE1WX0dFX1BPUlRfSU5WQUxJRCwKK30gIE1WX0dFX1BPUlRfU1RBVEVfRTsKKworLyogRW51bSBmb3Igd2VsbCBrbm93biBUUElECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBNVl9UUElEXzgxMDAgMHg4MTAwCisjZGVmaW5lIE1WX1RQSURfODhBOCAweDg4QTgKKyNkZWZpbmUgTVZfVFBJRF85MTAwIDB4OTEwMAorI2RlZmluZSBNVl9DUEhfVFBJRF9MRU4gICAgICAoMikKKyNkZWZpbmUgTVZfQ1BIX1ZMQU5fVEFHX0xFTiAgKDIpCisjZGVmaW5lIE1WX0NQSF9FVEhfVFlQRV9MRU4gICgyKQorI2RlZmluZSBNVl9JUFY0X1BST1RPX09GRlNFVCAoOSkKKyNkZWZpbmUgTVZfSUNNUFY2X1RZUEVfTUxEICAgKDEpCisjZGVmaW5lIE1WX0NQSF9FVEhfVFlQRV9JUFY0ICgweDA4MDApCisjZGVmaW5lIE1WX0NQSF9FVEhfVFlQRV9JUFY2ICgweDg2REQpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVFBNIFNvdXJjZSBwb3J0IC0gdXNlZCB0byBzcGVjaWZ5IHRocm91Z2ggd2hpY2ggcG9ydCB0aGUgcGFja2V0IGVudGVyZWQgdGhlIHByb2Nlc3NvcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisgICAgVFBNX1NSQ19QT1JUX1VOSV8wLCAgICAgICAgLyogdXBzdHJlYW0gKi8KKyAgICBUUE1fU1JDX1BPUlRfVU5JXzEsICAgICAgICAvKiB1cHN0cmVhbSAqLworICAgIFRQTV9TUkNfUE9SVF9VTklfMiwgICAgICAgIC8qIHVwc3RyZWFtICovCisgICAgVFBNX1NSQ19QT1JUX1VOSV8zLCAgICAgICAgLyogdXBzdHJlYW0gKi8KKyAgICBUUE1fU1JDX1BPUlRfVU5JXzQsICAgICAgICAvKiB1cHN0cmVhbSAqLworICAgIFRQTV9TUkNfUE9SVF9VTklfNSwgICAgICAgIC8qIHVwc3RyZWFtICovCisgICAgVFBNX1NSQ19QT1JUX1VOSV82LCAgICAgICAgLyogdXBzdHJlYW0gKi8KKyAgICBUUE1fU1JDX1BPUlRfVU5JXzcsICAgICAgICAvKiB1cHN0cmVhbSAqLworICAgIFRQTV9TUkNfUE9SVF9VTklfVklSVCwgICAgIC8qIHVwc3RyZWFtICovCisgICAgVFBNX1NSQ19QT1JUX1dBTiwgICAgICAgICAgLyogZG93bnN0cmFtICovCisgICAgVFBNX1NSQ19QT1JUX1VOSV9BTlksICAgICAgLyogdXBzdHJlYW0gLSBhbGwgVU5JIHBvcnRzICovCisgICAgVFBNX1NSQ19QT1JUX1dBTl9PUl9MQU4sICAgLyogQW55IFBvcnQsIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkICovCisgICAgVFBNX1NSQ19QT1JUX0lMTEVHQUwgPSAweEZGCit9IHRwbV9zcmNfcG9ydF90eXBlX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrIEFQSSByZXR1cm4gdmFsdWUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyZXQsIGxvZykgXAore1wKKyAgICBJTlQzMiByYyA9IDAgO1wKKyAgICBpZigocmMgPSAocmV0KSkgIT0gMClcCisgICAge1wKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlcyglZCkgZXJyb3I6JXMgLCByZXQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAobG9nKSwgcmMpO1wKKyAgICAgICAgcmV0dXJuIChyYykgO1wKKyAgICB9XAorfQorCisjZGVmaW5lIENQSF9UQkxfRU5UUllfTlVNKGEpIChzaXplb2YoYSkvc2l6ZW9mKGFbMF0pKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFbnVtIGZvciBkaXNwbGF5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBJTlQzMiAgZW51bV92YWx1ZTsKKyAgICBDSEFSICAqZW51bV9zdHI7Cit9IE1WX0VOVU1fRU5UUllfVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBJTlQzMiAgICAgICAgICAgIGVudW1fbnVtOworICAgIE1WX0VOVU1fRU5UUllfVCAqZW51bV9hcnJheTsKK30gTVZfRU5VTV9BUlJBWV9UOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWluZGV4X3RwbV9zcmNfdG9fYXBwX3BvcnQoKQorKgorKiBERVNDUklQVElPTjpDb252ZXJ0IFRQTSBzb3VyY2UgcG9ydCB0byBhcHBsaWNhdGlvbiBVTkkgcG9ydCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBzcmNfcG9ydCAgICAtIFRQTSBzb3VyY2UgcG9ydAorKgorKiBPVVRQVVRTOgorKiAgICAgICBBcHBsaWNhdGlvbiBVTkkgcG9ydCBpbmRleAorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhcHBsaWNhdGlvbiBVTkkgcG9ydCBpbmRleC4gCisqICAgICAgIE9uIGVycm9yIHJldHVybiBpbnZhbGlkIGFwcGxpY2F0aW9uIFVOSSBwb3J0IGluZGV4LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0FQUF9FVEhfUE9SVF9VTklfRSBtaW5kZXhfdHBtX3NyY190b19hcHBfcG9ydCh0cG1fc3JjX3BvcnRfdHlwZV90IHNyY19wb3J0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtaW5kZXhfbWhfdG9fYXBwX2xsaWQoKQorKgorKiBERVNDUklQVElPTjpDb252ZXJ0IE1hcnZlbGwgaGVhZGVyIHRvIGFwcGxpY2F0aW9uIExMSUQgCisqCisqIElOUFVUUzoKKyogICAgICAgbWggIC0gTWFydmVsbCBoZWFkZXIKKyoKKyogT1VUUFVUUzoKKyogICAgICAgQXBwbGljYXRpb24gTExJRAorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhcHBsaWNhdGlvbiBMTElELiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJuIGludmFsaWQgYXBwbGljYXRpb24gTExJRC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9UQ09OVF9MTElEX0UgbWluZGV4X21oX3RvX2FwcF9sbGlkKFVJTlQxNiBtaCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXR5cGVfZ2V0X2RpZ2l0X251bSgpCisqCisqIERFU0NSSVBUSU9OOkNvbnZlcnQgY2hhcmFjdGVyIHN0cmluZyB0byBkaWdpdGFsIG51bWJlciAKKyoKKyogSU5QVVRTOgorKiAgICAgICBzdHIgICAtIENoYXJhY3RlciBzdHJpbmcKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBEaWdpdGFsIG51bWJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVUlOVDMyIG10eXBlX2dldF9kaWdpdF9udW0oY29uc3QgQ0hBUiAgKnN0cik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXR5cGVfbG9va3VwX2VudW1fc3RyKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIGVudW0gc3RyaW5nIGFjY29yZGluZyB0byBlbnVtIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgcF9lbnVtX2FycmF5ICAgLSBQb2ludGVyIHRvIGVudW0gYXJyYXkKKyogICAgICAgZW51bV92YWx1ZSAgICAgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICptdHlwZV9sb29rdXBfZW51bV9zdHIoTVZfRU5VTV9BUlJBWV9UICpwX2VudW1fYXJyYXksIElOVDMyIGVudW1fdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG11dGlsc19pc19mcndkX2Jyb2FkY2FzdF9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpDaGVjayB3aGV0aGVyIHBhY2tldCBpcyBkaXJlY3RseSBmb3J3YXJkZWQgYnJvYWRjYXN0IG9uZQorKgorKiBJTlBVVFM6CisqICAgICAgIGRhdGEgICAtIHBhY2tldCBkYXRhCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgVFJVRTogYnJvYWRjYXN0IHBhY2tldCwgRkFMU0U6bm9uZSBicm9hZGNhc3QgcGFja2V0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBtdXRpbHNfaXNfZnJ3ZF9icm9hZGNhc3RfcGFja2V0KGNoYXIgKmRhdGEpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NVl9DUEhfSU5GUkFfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9tbmdfaWYuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9tbmdfaWYuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yY2ZiZDNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX21uZ19pZi5oCkBAIC0wLDAgKzEsMTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX21uZ19pZi5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGRlZmluaXRpb24KKyogICAgICAgICAgICAgIGZvciBpb2N0bAorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMTFEZWMyMDExCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjEKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfTU5HX0lGX0hfCisjZGVmaW5lIF9NVl9DUEhfTU5HX0lGX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBJbmNsdWRlIEZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKworLyogRGVmaW5pdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9TRVRfQ09NUExFWF9QUk9GSUxFICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICAxLCAgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfU0VUX0ZFQVRVUkVfRkxBRyAgICAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgMiwgIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0FQUF9BRERfUlVMRSAgICAgICAgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDMsICBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9BUFBfREVMX1JVTEUgICAgICAgICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICA0LCAgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfQVBQX1VQREFURV9SVUxFICAgICAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgNSwgIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0FQUF9HRVRfUlVMRSAgICAgICAgICAgICBfSU9SKE1WX0NQSF9JT0NUTF9NQUdJQywgIDYsICBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9GTE9XX0FERF9SVUxFICAgICAgICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICA3LCAgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfRkxPV19ERUxfUlVMRSAgICAgICAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgOCwgIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0ZMT1dfR0VUX1JVTEUgICAgICAgICAgICBfSU9SKE1WX0NQSF9JT0NUTF9NQUdJQywgIDksICBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9GTE9XX0NMRUFSX1JVTEUgICAgICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICAxMCwgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfRkxPV19DTEVBUl9SVUxFX0JZX01IICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgMTEsIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0ZMT1dfU0VUX0RTQ1BfTUFQICAgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDEyLCBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9GTE9XX0RFTF9EU0NQX01BUCAgICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICAxMywgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfU0VUX1RDT05UX0xMSURfU1RBVEUgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgMTQsIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX1NFVFVQICAgICAgICAgICAgICAgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDE1LCBVSU5UMzIpCisKKy8qIFR5cGVkZWZzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm07IAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICBwYXJzZV9rZXk7ICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtOyAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAgbW9kX3ZhbHVlOyAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibTsgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgIGZyd2RfdmFsdWU7CisKK30gQ1BIX0lPQ1RMX0FQUF9SVUxFX1Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ1BIX0ZMT1dfRU5UUllfVCBmbG93X21hcDsKK30gQ1BIX0lPQ1RMX0ZMT1dfTUFQX1Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ1BIX0RTQ1BfUEJJVFNfVCBkc2NwX21hcDsKK30gQ1BIX0lPQ1RMX0RTQ1BfTUFQX1Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCBwcm9maWxlX2lkOworICAgIE1WX0FQUF9HTUFDX1BPUlRfRSAgICAgICAgYWN0aXZlX3BvcnQ7CisgICAgQ1BIX0FQUF9GRUFUVVJFX0UgICAgICAgICBmZWF0dXJlX3R5cGU7CisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2ZsYWc7IAorfSBDUEhfSU9DVExfTUlTQ19UOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQzMiAgdGNvbnQ7CisgICAgQk9PTCAgICBzdGF0ZTsKK30gQ1BIX0lPQ1RMX1RDT05UX1NUQVRFX1Q7CisKKy8qIE1WIENQSCBDaGFyIERldmljZSBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIENQSF9JT0NUTF9BUFBfUlVMRV9UICAgIGNwaF9pb2N0bF9hcHBfcnVsZTsKKyAgQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QgICAgY3BoX2lvY3RsX2Zsb3dfbWFwOworICBDUEhfSU9DVExfRFNDUF9NQVBfVCAgICBjcGhfaW9jdGxfZHNjcF9tYXA7CisgIENQSF9JT0NUTF9NSVNDX1QgICAgICAgIGNwaF9pb2N0bF9taXNjOworICBDUEhfSU9DVExfVENPTlRfU1RBVEVfVCBjcGhfaW9jdGxfdGNvbnQ7CisKKyAgc3RydWN0IGNkZXYgICAgICAgICAgICAgY2RldjsgIAorfSBDUEhfQ0RFVl9UOworCisvKiBHbG9iYWwgdmFyaWFibGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHbG9iYWwgZnVuY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX01WX0NQSF9NTkdfSUZfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9tb2QuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9tb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzYzMWMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX21vZC5jCkBAIC0wLDAgKzEsMTQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX21vZC5jCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIG1vZHVsZSBkZWZpbml0aW9uIAorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgIm12X2NwaF9oZWFkZXIuaCIKKworI2RlZmluZSBDUEhfTU9EVUxFX1ZFUlNJT04gICIyMi1KYW4tMjAxMyIKKyNkZWZpbmUgQ1BIX01PRFVMRV9ERVNDICAgICAiTWFydmVsbCBDUFUgUGFja2V0IEhhbmRsZXIgTW9kdWxlIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9tb2RfZXhpdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBFeGl0IGZyb20gQ1BIIG1vZHVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBOb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBWT0lEIF9fZXhpdCBjcGhfbW9kX2V4aXQoVk9JRCkKK3sKKyAgICBjcGhfZGV2X3NodXRkb3duKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX21vZF9pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemUgQ1BIIG1vZHVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UMzIgX19pbml0IGNwaF9tb2RfaW5pdChWT0lEKQoreworICAgIGlmIChjcGhfZGV2X2luaXQoKSAhPSAwKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbkNQSCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkIFxuXG4iKTsKKyAgICAgICAgcmV0dXJuIE1WX0VSUk9SOworICAgIH0KKworICAgIHByaW50ayhLRVJOX0lORk8gIlxuQ1BIIG1vZHVsZSBpbnNlcnRlZCAtICVzXG5cbiIsIENQSF9NT0RVTEVfVkVSU0lPTik7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKK2RldmljZV9pbml0Y2FsbF9zeW5jKGNwaF9tb2RfaW5pdCk7CisKK21vZHVsZV9leGl0KGNwaF9tb2RfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IgKCJWaWN0b3IgR3UiKTsKK01PRFVMRV9WRVJTSU9OIChDUEhfTU9EVUxFX1ZFUlNJT04pOworTU9EVUxFX0RFU0NSSVBUSU9OIChDUEhfTU9EVUxFX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9uZXRkZXYuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9uZXRkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZDFlNmRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX25ldGRldi5jCkBAIC0wLDAgKzEsODgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX25ldGRldi5jCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIG5ldHdvcmsgZGV2aWNlIHBhcnQgZGVmaW5pdGlvbiAKKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4xCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgorCisjaW5jbHVkZSA8Y3RybEVudi9tdkN0cmxFbnZMaWIuaD4KKworI2luY2x1ZGUgIm12RGVidWcuaCIKKyNpbmNsdWRlICJtdl9jcGhfaGVhZGVyLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgRGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRvdGFsIEV0aCBwb3J0IG51bWJlciAqLworc3RhdGljIElOVDMyIGdzX212X2V0aF9wb3J0X251bSA9IDA7CisKKworI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUKK3N0YXRpYyBzdHJ1Y3QgbXZfcG9ydF90eF9zcGVjICAgIHVkcF9wb3J0X3NwZWNfY2ZnW0NPTkZJR19NVl9FVEhfUE9SVFNfTlVNXTsKKyNkZWZpbmUgUE9SVF9FTlRSSUVTICAgICAgICBDUEhfVEJMX0VOVFJZX05VTSh1ZHBfcG9ydF9zcGVjX2NmZykKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIERlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIElOVDMyIGNwaF9kYXRhX2Zsb3dfdHgoSU5UMzIgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgbWgsIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3JlY19za2IoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2VuZCBTS0IgcGFja2V0IHRvIGxpbnV4IG5ldHdvcmsgYW5kIGluY3Jlc2UgY291bnRlciAgCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgc2tiICAgICAtIFNLQiBidWZmZXIgdG8gcmVjZWl2ZSBwYWNrZXQKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitWT0lEIGNwaF9yZWNfc2tiKElOVDMyIHBvcnQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgVUlOVDMyIHJ4X3N0YXR1cyAgICA9IDA7CisgICAgc3RydWN0IGV0aF9wb3J0ICpwcCA9IE5VTEw7CisKKyAgICByeF9zdGF0dXMgPSBuZXRpZl9yZWNlaXZlX3NrYihza2IpOworICAgIHBwICAgICAgICA9IG12X2V0aF9wb3J0X2J5X2lkKHBvcnQpOworICAgIFNUQVRfREJHKGlmIChyeF9zdGF0dXMpIChwcC0+c3RhdHMucnhfZHJvcF9zdysrKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9wYWNrZXRfcngoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ1BIIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgcmVjZWl2ZWQgYXBwbGljYXRpb24gcGFja2V0cyAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBkZXYgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBza2IgICAgIC0gU0tCIGJ1ZmZlciB0byByZWNlaXZlIHBhY2tldAorKiAgICAgICByeF9kZXNjIC0gUlggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyAwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQzMiBjcGhfYXBwX3BhY2tldF9yeChJTlQzMiBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKQoreworICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSA9IDA7CisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgIHBhcnNlX2tleTsKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgcmMgICAgICAgPSBNVl9PSzsKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtICAgPSAwOworICAgIENQSF9BUFBfTU9EX1QgICAgICAgICBtb2RfdmFsdWU7IAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtICA9IDA7IAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICBmcndkX3ZhbHVlOworICAgIEJPT0wgICAgICAgICAgICAgICAgICBzdGF0ZSAgICA9IEZBTFNFOyAgICAKKworICAgIC8qIENoZWNrIHdoZXRoZXIgbmVlZCB0byBoYW5kbGUgZ2VuZXJpYyBhcHBsaWNhdGlvbiBwYWNrZXQgKi8KKyAgICBjcGhfZGJfZ2V0X3BhcmFtKENQSF9EQl9QQVJBTV9BUFBfU1VQUE9SVCwgJnN0YXRlKTsKKyAgICBpZiAoc3RhdGUgPT0gRkFMU0UpCisgICAgICAgIHJldHVybiAwOworCisgICAgbWVtc2V0KCZwYXJzZV9rZXksICAwLCBzaXplb2YocGFyc2Vfa2V5KSk7CisgICAgbWVtc2V0KCZtb2RfdmFsdWUsICAwLCBzaXplb2YobW9kX3ZhbHVlKSk7CisgICAgbWVtc2V0KCZmcndkX3ZhbHVlLCAwLCBzaXplb2YoZnJ3ZF92YWx1ZSkpOyAgICAKKworICAgIC8qIFBhcnNlIGFwcGxpY2F0aW9uIHBhY2tldCAqLworICAgIHJjID0gY3BoX2FwcF9wYXJzZV9wYWNrZXQocG9ydCwgc2tiLT5kYXRhLCAmcGFyc2VfYm0sICZwYXJzZV9rZXkpOworICAgIGlmIChyYyAhPSBNVl9PSykgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX3BhcnNlX3BhY2tldCwgcmMoJWQpXG4iLCByYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEdldCBDUEggYXBwbGljYXRpb24gcnVsZSAqLworICAgIHJjID0gY3BoX2FwcF9nZXRfcnVsZShwYXJzZV9ibSwgJnBhcnNlX2tleSwgJm1vZF9ibSwgJm1vZF92YWx1ZSwgJmZyd2RfYm0sICZmcndkX3ZhbHVlKTsKKyAgICBpZiAocmMgIT0gTVZfT0spIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX2dldF9ydWxlLCByYyglZClcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogSW5jcmVhc2UgY291bnRlciAqLworICAgIHJjID0gY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyKHBhcnNlX2JtLCAmcGFyc2Vfa2V5KTsKKyAgICBpZiAocmMgIT0gTVZfT0spIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyLCByYyglZClcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQXBwbHkgbW9kaWZpY2F0aW9uICovCisgICAgcmMgPSBjcGhfYXBwX21vZF9yeF9wYWNrZXQocG9ydCwgZGV2LCBza2IsIHJ4X2Rlc2MsIG1vZF9ibSwgJm1vZF92YWx1ZSk7CisgICAgaWYgKHJjICE9IE1WX09LKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRmFpbCB0byBjYWxsIGNwaF9hcHBfbW9kX3J4X3BhY2tldCwgcmMoJWQpXG4iLCByYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICAvKiBTZW5kIHRvIExpbnV4IE5ldHdvcmsgU3RhY2sgKi8KKyAgICBjcGhfcmVjX3NrYihwb3J0LCBza2IpOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9wYWNrZXRfdHgoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ1BIIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgdHJhc21pdGluZyBhcHBsaWNhdGlvbiBwYWNrZXRzIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBkZXYgICAgICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgc2tiICAgICAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyAwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9hcHBfcGFja2V0X3R4KElOVDMyIHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKK3sKKyAgICBDUEhfRElSX0UgICAgICAgICAgICAgZGlyOworICAgIFVJTlQxNiAgICAgICAgICAgICAgICBwcm90b190eXBlID0gMDsKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0gICA9IDA7CisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgIHBhcnNlX2tleTsgICAgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0gICAgID0gMDsKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAgbW9kX3ZhbHVlOyAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSAgICA9IDA7IAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICBmcndkX3ZhbHVlOworICAgIElOVDMyICAgICAgICAgICAgICAgICByYyAgICAgICAgID0gTVZfT0s7CisgICAgQk9PTCAgICAgICAgICAgICAgICAgIHN0YXRlICAgICAgPSBGQUxTRTsgICAgCisKKyAgICAvKiBDaGVjayB3aGV0aGVyIG5lZWQgdG8gaGFuZGxlIGdlbmVyaWMgYXBwbGljYXRpb24gcGFja2V0ICovCisgICAgY3BoX2RiX2dldF9wYXJhbShDUEhfREJfUEFSQU1fQVBQX1NVUFBPUlQsICZzdGF0ZSk7CisgICAgaWYgKHN0YXRlID09IEZBTFNFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1lbXNldCgmcGFyc2Vfa2V5LCAgMCwgc2l6ZW9mKHBhcnNlX2tleSkpOworICAgIG1lbXNldCgmbW9kX3ZhbHVlLCAgMCwgc2l6ZW9mKG1vZF92YWx1ZSkpOworICAgIG1lbXNldCgmZnJ3ZF92YWx1ZSwgMCwgc2l6ZW9mKGZyd2RfdmFsdWUpKTsgICAgCisgICAgdHhfc3BlY19vdXQtPnR4X2Z1bmMgPSBOVUxMOworICAgIHR4X3NwZWNfb3V0LT5mbGFncyAgID0gMDsKKworICAgIC8qIEdldCBkaXJlY3Rpb24gb2YgcGFja2V0ICovCisgICAgZGlyID0gY3BoX2FwcF9wYXJzZV9kaXIocG9ydCwgRkFMU0UpOworICAgIGlmKGRpciA9PSBDUEhfRElSX0lOVkFMSUQpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImRpclslZF0gaXMgaW52YWxpZCBcbiIsIGRpcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0gICAKKyAgICAKKyAgICAvKiBHZXQgdGhlIHByb3RvY29sIHR5cGUgYXBwbGljYXRpb24gcGFja2V0ICovCisgICAgcHJvdG9fdHlwZSA9IHNrYi0+cHJvdG9jb2w7CisKKyAgICAvKiBHZXQgQ1BIIGFwcGxpY2F0aW9uIHJ1bGUgYnkgcHJvdG9jb2wgdHlwZSAqLworICAgIHJjID0gY3BoX2FwcF9nZXRfcnVsZV9ieV9kaXJfcHJvdG8oZGlyLCBwcm90b190eXBlLCAmcGFyc2VfYm0sICZwYXJzZV9rZXksICZtb2RfYm0sICZtb2RfdmFsdWUsICZmcndkX2JtLCAmZnJ3ZF92YWx1ZSk7CisgICAgaWYgKHJjICE9IE1WX09LKSB7CisgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9nZXRfcnVsZV9ieV9kaXJfcHJvdG9cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBJbmNyZWFzZSBjb3VudGVyICovCisgICAgcmMgPSBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvKGRpciwgcHJvdG9fdHlwZSk7CisgICAgaWYgKHJjICE9IE1WX09LKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRmFpbCB0byBjYWxsIGNwaF9hcHBfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8sIHJjKCVkKVxuIiwgcmMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBTZXBjaWFsIGhhbmRsaW5nIGZvciBJR01QIGFuZCBNTEQgKi8KKyAgICBpZiAoKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFKSAmJiAKKyAgICAgICAgKHBhcnNlX2tleS5pcHY0X3R5cGUgPT0gTVZfSVBfUFJPVE9fSUdNUCkpICB8fAorICAgICAgICAoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRSkgJiYgCisgICAgICAgIChwYXJzZV9rZXkuaWNtcHY2X3R5cGUgPT0gTVZfSUNNUFY2X1RZUEVfTUxEKSkpCisgICAgeworICAgICAgICBpZiAoY3BoX2RhdGFfZmxvd190eChwb3J0LCBkZXYsIHNrYiwgVFJVRSwgdHhfc3BlY19vdXQpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogQXBwbHkgbW9kaWZpY2F0aW9uIGFuZCBzZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiAqLworICAgIHJjID0gY3BoX2FwcF9tb2RfdHhfcGFja2V0KHNrYiwgdHhfc3BlY19vdXQsIG1vZF9ibSwgJm1vZF92YWx1ZSk7CisgICAgaWYgKHJjICE9IE1WX09LKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRmFpbCB0byBjYWxsIGNwaF9hcHBfbW9kX3R4X3BhY2tldCwgcmMoJWQpXG4iLCByYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFNldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uICovCisgICAgcmMgPSBjcGhfYXBwX3NldF9mcndkKHNrYiwgdHhfc3BlY19vdXQsIGZyd2RfYm0sICZmcndkX3ZhbHVlKTsKKyAgICBpZiAocmMgIT0gTVZfT0spIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9zZXRfZnJ3ZCwgcmMoJWQpXG4iLCByYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorc3RhdGljIGlubGluZSB2b2lkIGNwaF9jb3B5X3R4X3NwZWMoc3RydWN0IG12X2V0aF90eF9zcGVjICogdHhfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR4cCwgdWludDhfdCB0eHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCkKK3sKKyAgICB0eF9zcGVjLT50eHAgPSB0eHA7CisgICAgdHhfc3BlYy0+dHhxID0gdHhxOworICAgIHR4X3NwZWMtPmh3X2NtZCA9IGh3X2NtZDsKKyAgICB0eF9zcGVjLT5mbGFncyA9IGZsYWdzOworfQorCitpbnQgY3BoX3VkcF9zcGVjX3ByaW50KGludCBwb3J0KQoreworICAgIElOVDMyIGk7CisgICAgc3RydWN0IGV0aF9wb3J0ICpwcCA9IG12X2V0aF9wb3J0X2J5X2lkKHBvcnQpOworICAgIHN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjICp1ZHBfc3BlYzsKKworICAgIGlmICghcHApCisgICAgICAgIHJldHVybiAtRU5PREVWOworCisgICAgdWRwX3NwZWMgPSAmKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3RbMF0pOworCisgICAgcHJpbnRrKCJcbioqKiogcG9ydCAjJWQgLSBUWCBVRFAgRGVzdCBQb3J0IGNvbmZpZ3VyYXRpb24gKioqKipcbiIsIHBvcnQpOworICAgIHByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgcHJpbnRrKCJJRCB1ZHBfZHN0ICAgdHhwICAgIHR4cSAgICBmbGFncyAgICBod19jbWQgICAgIGZ1bmNfYWRkXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3QpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0WzBdKTsgaSsrKSB7CisgICAgICAgIGlmICh1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpCisgICAgICAgICAgICBwcmludGsoIiUyZCAgICUwNGQgICAgICAlZCAgICAgICVkICAgICAweCUwNHggICAweCUwOHggICAweCVwXG4iLAorICAgICAgICAgICAgICAgICAgIGksIG50b2hzKHVkcF9zcGVjW2ldLnVkcF9wb3J0KSwKKyAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cCwgdWRwX3NwZWNbaV0udHhfc3BlYy50eHEsCisgICAgICAgICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy5mbGFncywgdWRwX3NwZWNbaV0udHhfc3BlYy5od19jbWQsCisgICAgICAgICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy50eF9mdW5jKTsKKyAgICB9CisgICAgcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKyAgICB1ZHBfc3BlYyA9ICYodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1swXSk7CisKKyAgICBwcmludGsoIioqKiogcG9ydCAjJWQgLSBUWCBVRFAgU291cmNlIFBvcnQgY29uZmlndXJhdGlvbiAqKioqKlxuIiwgcG9ydCk7CisgICAgcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgcHJpbnRrKCJJRCB1ZHBfc3JjICAgdHhwICAgIHR4cSAgICAgZmxhZ3MgICAgaHdfY21kICAgICBmdW5jX2FkZFxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjKS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1swXSk7IGkrKykgeworICAgICAgICBpZiAodWRwX3NwZWNbaV0udHhfc3BlYy50eHEgIT0gTVZfRVRIX1RYUV9JTlZBTElEKQorICAgICAgICAgICAgcHJpbnRrKCIlMmQgICAlMDRkICAgICAgJWQgICAgICAlZCAgICAgMHglMDR4ICAgMHglMDh4ICAgMHglcFxuIiwKKyAgICAgICAgICAgICAgICAgICBpLCBudG9ocyh1ZHBfc3BlY1tpXS51ZHBfcG9ydCksCisgICAgICAgICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy50eHAsIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxLAorICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMuZmxhZ3MsIHVkcF9zcGVjW2ldLnR4X3NwZWMuaHdfY21kLAorICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhfZnVuYyk7CisgICAgfQorICAgIHByaW50aygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKKwordm9pZCBjcGhfdWRwX3NwZWNfcHJpbnRfYWxsKHZvaWQpCit7CisgICAgSU5UMzIgcG9ydDsKKworICAgIGZvciAocG9ydD0wO3BvcnQgPCBDT05GSUdfTVZfRVRIX1BPUlRTX05VTSA7cG9ydCsrKSB7CisgICAgICAgIGNwaF91ZHBfc3BlY19wcmludChwb3J0KTsKKyAgICB9Cit9CisKK01WX1NUQVRVUyAgY3BoX3VkcF9pbnRfc3BlY19zZXQoc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgKnVkcF9zcGVjLCB1aW50MTZfdCB1ZHBfcG9ydCwgSU5UMzIgdGFibGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCkKK3sKKyAgICBJTlQzMiBpOworCisgICAgLyogQ2hlY2sgaWYgYWxyZWFkeSBleGlzdHMgKi8KKyAgICBmb3IgKGk9MDsgaSA8IHRhYmxlX3NpemU7aSsrKSB7CisgICAgICAgIGlmICh1ZHBfc3BlY1tpXS51ZHBfcG9ydCA9PSBodG9ucyh1ZHBfcG9ydCkgJiYKKyAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxICE9IE1WX0VUSF9UWFFfSU5WQUxJRCkgeworICAgICAgICAgICAgY3BoX2NvcHlfdHhfc3BlYygmKHVkcF9zcGVjW2ldLnR4X3NwZWMpLCB0eHAsIHR4cSwgZmxhZ3MsIGh3X2NtZCk7CisgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQ2hlY2sgZW1wdHkgKi8KKyAgICBmb3IgKGk9MDsgaSA8IHRhYmxlX3NpemU7aSsrKSB7CisgICAgICAgIGlmICh1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSA9PSBNVl9FVEhfVFhRX0lOVkFMSUQpIHsKKyAgICAgICAgICAgIHVkcF9zcGVjW2ldLnVkcF9wb3J0ID0gaHRvbnModWRwX3BvcnQpOworICAgICAgICAgICAgY3BoX2NvcHlfdHhfc3BlYygmKHVkcF9zcGVjW2ldLnR4X3NwZWMpLCB0eHAsIHR4cSwgZmxhZ3MsIGh3X2NtZCk7CisgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oTVZfRlVMTCk7Cit9CisKKworTVZfU1RBVFVTICBjcGhfdWRwX3NyY19zcGVjX3NldChpbnQgdHhfcG9ydCwgdWludDE2X3QgdWRwX3NyY19wb3J0LCB1aW50OF90IHR4cCwgdWludDhfdCB0eHEsIHVpbnQxNl90IGZsYWdzLCB1aW50MzJfdCBod19jbWQpCit7CisgICAgc3RydWN0IGV0aF9wb3J0ICpwcCA9IG12X2V0aF9wb3J0X2J5X2lkKHR4X3BvcnQpOworICAgIHN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjICp1ZHBfc3JjX3NwZWMgPSB1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjOworICAgIE1WX1NUQVRVUyBtdl9zdGF0dXM7CisKKyAgICBpZiAoIXBwKQorICAgICAgICByZXR1cm4gLUVOT0RFVjsKKworICAgIG12X3N0YXR1cyA9IGNwaF91ZHBfaW50X3NwZWNfc2V0KHVkcF9zcmNfc3BlYywgdWRwX3NyY19wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyYykvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmNbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHAsIHR4cSwgZmxhZ3MsIGh3X2NtZCk7CisKKyAgICBpZiAobXZfc3RhdHVzICE9IE1WX09LKQorICAgICAgICBwcmludGsoIiVzOiBVRFAgU3BlY2lhbCBTb3VyY2UgUG9ydCBUYWJsZSBpcyBmdWxsXG4iLCBfX2Z1bmNfXyk7CisKKyAgICByZXR1cm4obXZfc3RhdHVzKTsKK30KK0VYUE9SVF9TWU1CT0woY3BoX3VkcF9zcmNfc3BlY19zZXQpOworCisKK01WX1NUQVRVUyAgY3BoX3VkcF9kZXN0X3NwZWNfc2V0KGludCB0eF9wb3J0LCB1aW50MTZfdCB1ZHBfZGVzdF9wb3J0LCB1aW50OF90IHR4cCwgdWludDhfdCB0eHEsIHVpbnQxNl90IGZsYWdzLCB1aW50MzJfdCBod19jbWQpCit7CisgICAgc3RydWN0IGV0aF9wb3J0ICpwcCA9IG12X2V0aF9wb3J0X2J5X2lkKHR4X3BvcnQpOworICAgIHN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjICp1ZHBfZHN0X3NwZWMgPSB1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfZHN0OworICAgIE1WX1NUQVRVUyBtdl9zdGF0dXM7CisKKyAgICBpZiAoIXBwKQorICAgICAgICByZXR1cm4gLUVOT0RFVjsKKworICAgIG12X3N0YXR1cyA9IGNwaF91ZHBfaW50X3NwZWNfc2V0KHVkcF9kc3Rfc3BlYywgdWRwX2Rlc3RfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3QpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfZHN0WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhwLCB0eHEsIGZsYWdzLCBod19jbWQpOworCisgICAgaWYgKG12X3N0YXR1cyAhPSBNVl9PSykKKyAgICAgICAgcHJpbnRrKCIlczogVURQIFNwZWNpYWwgRGVzdC4gUG9ydCBUYWJsZSBpcyBmdWxsXG4iLCBfX2Z1bmNfXyk7CisKKyAgICByZXR1cm4obXZfc3RhdHVzKTsKK30KK0VYUE9SVF9TWU1CT0woY3BoX3VkcF9kZXN0X3NwZWNfc2V0KTsKKworCit2b2lkICBjcGhfdWRwX3RhYmxlX2luaXQodm9pZCkKK3sKKyAgICBJTlQzMiBudW1fcG9ydHMgPSBQT1JUX0VOVFJJRVM7CisgICAgSU5UMzIgdHhfcG9ydCwgaTsKKworICAgIGlmIChudW1fcG9ydHMgPiBnc19tdl9ldGhfcG9ydF9udW0pCisgICAgICAgIG51bV9wb3J0cyA9IGdzX212X2V0aF9wb3J0X251bTsKKworCisgICAgZm9yICh0eF9wb3J0PTA7IHR4X3BvcnQ8bnVtX3BvcnRzO3R4X3BvcnQrKykgeworCisgICAgICAgIC8qIEludmFsaWRhdGUgVURQIERlc3QgcG9ydHMsIHNldCB0eHE9aW52YWxpZCAgKi8KKyAgICAgICAgZm9yIChpPTA7aTwoc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3QpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfZHN0WzBdKSk7aSsrKSB7CisgICAgICAgICAgICBtZW1zZXQoJih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfZHN0W2ldKSwgMCwgc2l6ZW9mKHN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjKSk7CisgICAgICAgICAgICB1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfZHN0W2ldLnR4X3NwZWMudHhxID0gTVZfRVRIX1RYUV9JTlZBTElEOworICAgICAgICB9CisKKyAgICAgICAgLyogSW52YWxpZGF0ZSBVRFAgU291cmNlIHBvcnRzLCAsIHNldCB0eHE9aW52YWxpZCAqLworICAgICAgICBmb3IgKGk9MDtpPChzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyYykvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmNbMF0pKTtpKyspIHsKKyAgICAgICAgICAgIG1lbXNldCgmKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmNbaV0pLCAwLCBzaXplb2Yoc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMpKTsKKyAgICAgICAgICAgIHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmNbaV0udHhfc3BlYy50eHEgPSBNVl9FVEhfVFhRX0lOVkFMSUQ7CisgICAgICAgIH0KKworICAgIH0KKyAgICByZXR1cm47Cit9CisKK2ludCBjcGhfdWRwX3BvcnRfdHgoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQoreworICAgIHN0cnVjdCBpcGhkciAgKmlwaGRycCAgID0gTlVMTDsKKyAgICBzdHJ1Y3QgdWRwaGRyICp1ZHBoZHJwICA9IE5VTEw7CisgICAgSU5UMzIgaTsKKworICAgIGlmIChwb3J0ID4gQ09ORklHX01WX0VUSF9QT1JUU19OVU0pIHsKKyAgICAgICAgcHJpbnRrKCJQb3J0IEVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworICAgIGlmIChza2ItPnByb3RvY29sID09IE1WX0NQSF9FVEhfVFlQRV9JUFY0KSB7CisgICAgICAgIC8qIEdldCBVRFAgUG9ydCAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMikKKyAgICBpcGhkcnAgPSBza2ItPm5oLmlwaDsKKyNlbHNlCisgICAgaXBoZHJwID0gaXBfaGRyKHNrYik7CisjZW5kaWYKKworICAgICAgICBpZiAoKGlwaGRycCkgJiYgKGlwaGRycC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIyKQorICAgICAgICB1ZHBoZHJwID0gc2tiLT5oLnVoOworI2Vsc2UKKyAgICAgICAgdWRwaGRycCA9IHVkcF9oZHIoc2tiKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKHVkcGhkcnApIHsKKyAgICAgICAgICAgICAgICBpZiAodWRwaGRycCA9PSAoc3RydWN0IHVkcGhkciAqKWlwaGRycCkgeworICAgICAgICAgICAgICAgICAgICB1ZHBoZHJwID0gKHN0cnVjdCB1ZHBoZHIgKikoKGNoYXIgKil1ZHBoZHJwICsgKDQqKGlwaGRycC0+aWhsKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBGaW5kIGNvbmZpZ3VyZWQgVURQIFNvdXJjZSBQb3J0Ki8KKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjKS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1swXSk7aSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWRwaGRycC0+c291cmNlID09IHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbaV0udWRwX3BvcnQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkgKHR4X3NwZWNfb3V0LCAmKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbaV0udHhfc3BlYyksIHNpemVvZihzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJmb3VuZCB1ZHBfc3JjIDB4KCUwNHgpXG4iLCBudG9ocyh1ZHBoZHJwLT5zb3VyY2UpKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEZpbmQgY29uZmlndXJlZCBVRFAgRGVzdC4gUG9ydCovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdCkvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3RbMF0pO2krKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHVkcGhkcnAtPmRlc3QgPT0gdWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdFtpXS51ZHBfcG9ydCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICh1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjW2ldLnR4X3NwZWMudHhxICE9IE1WX0VUSF9UWFFfSU5WQUxJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSAodHhfc3BlY19vdXQsICYodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdFtpXS50eF9zcGVjKSwgc2l6ZW9mKHN0cnVjdCBtdl9ldGhfdHhfc3BlYykpOworICAgICAgICAgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgImZvdW5kIHVkcF9kc3QgMHgoJTA0eClcbiIsIG50b2hzKHVkcGhkcnAtPmRlc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBvcnQgPT0gTVZfUE9OX1BPUlRfSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBVRFAsIHVkcCBzb3VyY2Ugb3IgZGVzdCBwb3J0IG5vdCBmb3VuZCB1ZHBfc3JjKCV4KXggdWRwX2RzdCgleCl4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHModWRwaGRycC0+c291cmNlKSwgbnRvaHModWRwaGRycC0+ZGVzdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwb3J0ID09IE1WX1BPTl9QT1JUX0lEICkKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJOT1QgVURQLCBpcF9wcm90byglZCkgXG4iLCBpcGhkcnAtPnByb3RvY29sKTsKKyAgICB9CisgICAgZWxzZSBpZiAocG9ydCA9PSBNVl9QT05fUE9SVF9JRCkKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk5PVCBJUCwgcHJvdG8oJWQpIFxuIiwgc2tiLT5wcm90b2NvbCk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGF0YV9mbG93X3J4KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENQSCBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlY2VpdmVkIGFwcGxpY2F0aW9uIHBhY2tldHMgCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgZGV2ICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgc2tiICAgICAtIFNLQiBidWZmZXIgdG8gcmVjZWl2ZSBwYWNrZXQKKyogICAgICAgcnhfZGVzYyAtIFJYIGRlc2NyaXB0b3IKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMS4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgMC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgSU5UMzIgY3BoX2RhdGFfZmxvd19yeChJTlQzMiBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKQoreworICAgIENQSF9GTE9XX0VOVFJZX1QgZmxvd19ydWxlOworICAgIElOVDMyICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICBCT09MICAgICAgICAgICAgIHN0YXRlICA9IEZBTFNFOworICAgIE1WX1NUQVRVUyAgICAgICAgcmMgICAgID0gTVZfT0s7CisKKyAgICBpZiAoTVZfUE9OX1BPUlRfSUQgIT0gcG9ydCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjcGhfZGJfZ2V0X3BhcmFtKENQSF9EQl9QQVJBTV9GTE9XX1NVUFBPUlQsICZzdGF0ZSk7CisgICAgCisgICAgaWYgKHN0YXRlID09IFRSVUUpIAorICAgIHsKKyAgICAgICAgLyogUGFyc2UgcGFja2V0cyAqLworICAgICAgICByYyA9IGNwaF9mbG93X3BhcnNlX3BhY2tldChwb3J0LCBza2ItPmRhdGEsIFRSVUUsIFRSVUUsICZmbG93X3J1bGUpOworICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKTpmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfcGFyc2VfcGFja2V0LCByYyglZCkgXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBHZXQgTm9uZSBkZWZhdWx0IENQSCBkYXRhIGZsb3cgcnVsZSBhdCBmaXJzdCAqLworICAgICAgICBmbG93X3J1bGUuaXNfZGVmYXVsdCA9IEZBTFNFOworICAgICAgICByYyA9IGNwaF9mbG93X2dldF9ydWxlKCZmbG93X3J1bGUpOworICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldCBkZWZhdWx0IENQSCBkYXRhIGZsb3cgcnVsZSBzZWNvbmRseSAqLworICAgICAgICAgICAgZmxvd19ydWxlLmlzX2RlZmF1bHQgPSBUUlVFOworICAgICAgICAgICAgcmMgPSBjcGhfZmxvd19nZXRfcnVsZSgmZmxvd19ydWxlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogRG8gbm90aGluZyAqLworICAgICAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyogbW9kaWZ5IHBhY2tldCAqLworICAgICAgICByYyA9IGNwaF9mbG93X21vZF9wYWNrZXQoc2tiLCBUUlVFLCAmZmxvd19ydWxlLCAmb2Zmc2V0KTsKKyAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCk6ZmFpbCB0byBjYWxsIGNwaF9mbG93X21vZF9yeF9wYWNrZXQsIHJjKCVkKSBcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGF0YV9mbG93X3R4KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENQSCBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHRyYXNtaXRpbmcgYXBwbGljYXRpb24gcGFja2V0cyAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgICAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgZGV2ICAgICAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHNrYiAgICAgICAgIC0gU0tCIGJ1ZmZlciB0byByZWNlaXZlIHBhY2tldAorKiAgICAgICBtaCAgICAgICAgICAtIFdoZXRoZXIgaGFzIG1hcnZlbGwgaGVhZGVyCisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyAwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9kYXRhX2Zsb3dfdHgoSU5UMzIgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBtaCwgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKK3sKKyAgICBDUEhfRkxPV19FTlRSWV9UIGZsb3dfcnVsZTsKKyAgICBJTlQzMiAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgQk9PTCAgICAgICAgICAgICBsX21oOworICAgIEJPT0wgICAgICAgICAgICAgc3RhdGUgID0gRkFMU0U7CisgICAgTVZfU1RBVFVTICAgICAgICByYyAgICAgPSBNVl9PSzsKKworICAgIGlmIChNVl9QT05fUE9SVF9JRCAhPSBwb3J0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNwaF9kYl9nZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0ZMT1dfU1VQUE9SVCwgJnN0YXRlKTsKKyAgICAKKyAgICBpZiAoc3RhdGUgPT0gVFJVRSkgCisgICAgeworICAgICAgICAvKiBEZWNpZGUgd2hldGhlciBuZWVkIHRvIGhhbmRsZSBNYXJ2ZWxsIGhlYWRlciAqLworICAgICAgICBsX21oID0gbWg7CisgICAgICAgIGlmIChUUlVFID09IG11dGlsc19pc19mcndkX2Jyb2FkY2FzdF9wYWNrZXQoc2tiLT5kYXRhKSkKKyAgICAgICAgICAgICAgbF9taCA9IFRSVUU7CisKKyAgICAgICAgLyogUGFyc2UgcGFja2V0cyAqLworICAgICAgICByYyA9IGNwaF9mbG93X3BhcnNlX3BhY2tldChwb3J0LCBza2ItPmRhdGEsIEZBTFNFLCBsX21oLCAmZmxvd19ydWxlKTsKKyAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCk6ZmFpbCB0byBjYWxsIGNwaF9mbG93X3BhcnNlX3BhY2tldCwgcmM8JWQ+IFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCBDUEggZGF0YSBmbG93IHJ1bGUgKi8KKyAgICAgICAgZmxvd19ydWxlLmlzX2RlZmF1bHQgPSBGQUxTRTsKKyAgICAgICAgcmMgPSBjcGhfZmxvd19nZXRfcnVsZSgmZmxvd19ydWxlKTsKKyAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBIYW5kbGUgbXVsdGljYXQgcGFja2V0cyBhcyB1bmljYXN0IG9uZSAqLworICAgICAgICAgICAgaWYgKGZsb3dfcnVsZS5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX01DX1BST1RPKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZmxvd19ydWxlLnBhcnNlX2JtICY9IH5DUEhfRkxPV19QQVJTRV9NQ19QUk9UTzsKKyAgICAgICAgICAgICAgICByYyA9IGNwaF9mbG93X2dldF9ydWxlKCZmbG93X3J1bGUpOworCisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvd19ydWxlLmlzX2RlZmF1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICByYyA9IGNwaF9mbG93X2dldF9ydWxlKCZmbG93X3J1bGUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICIlcygpOmZhaWwgdG8gY2FsbCBjcGhfZmxvd19nZXRfcnVsZSwgcmM8JWQ+IFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgIGZsb3dfcnVsZS5pc19kZWZhdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICByYyA9IGNwaF9mbG93X2dldF9ydWxlKCZmbG93X3J1bGUpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICIlcygpOmZhaWwgdG8gY2FsbCBjcGhfZmxvd19nZXRfcnVsZSwgcmM8JWQ+IFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIG1vZGlmeSBwYWNrZXQgKi8KKyAgICAgICAgcmMgPSBjcGhfZmxvd19tb2RfcGFja2V0KHNrYiwgbF9taCwgJmZsb3dfcnVsZSwgJm9mZnNldCk7CisgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlcygpOmZhaWwgdG8gY2FsbCBjcGhfZmxvd19tb2RfcnhfcGFja2V0LCByYzwlZD4gXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyogU3RyaXAgVFggTUggKi8KKyAgICAgICAgaWYgKFRSVUUgPT0gbF9taCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHNrYi0+ZGF0YSAgKz0gTVZfRVRIX01IX1NJWkU7CisgICAgICAgICAgICBza2ItPmxlbiAgIC09IE1WX0VUSF9NSF9TSVpFOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBtb2RpZnkgcGFja2V0ICovCisgICAgICAgIHJjID0gY3BoX2Zsb3dfbW9kX2Zyd2QoJmZsb3dfcnVsZSwgdHhfc3BlY19vdXQpOworICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKTpmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfbW9kX2Zyd2QsIHJjPCVkPiBcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3J4X2Z1bmMoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ1BIIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgcmVjZWl2ZWQgc3BlY2lhbCBwYWNrZXRzIAorKiAgICAgICAgICAgICAgZnJvbSBuZXR3b3JrIGRyaXZlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIHJ4cSAgICAgLSBDUFUgcmVjZWl2ZWQgcXVldWUKKyogICAgICAgZGV2ICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgcGt0ICAgICAtIE1hcnZlbGwgcGFja2V0IGluZm9ybWF0aW9uCisqICAgICAgIHJ4X2Rlc2MgLSBSWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjcGhfcnhfZnVuYyhpbnQgcG9ydCwgaW50IHJ4cSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgc3RydWN0IGV0aF9wYnVmICpwa3QsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCit7CisgICAgVUlOVDMyIGlkeCAgICA9IDA7CisgICAgSU5UMzIgIG9mZnNldCA9IDA7CisgICAgVUlOVDggIGJ1ZmZbNTEyXTsKKworICAgIE1WX0NQSF9DTEVBTl9QUklOVChDUEhfREVCVUdfTEVWRUwsICJcbiIpOworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJFbnRlclxuIik7CisKKyAgICBpZiAoZGV2ID09IE5VTEwgfHwgcGt0ID09IE5VTEwgfHwgcnhfZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIHByaW50aygiJXM6IE5VTEwgUG9pbnRlciBkZXYoJXApIHBrdCglcCkgcnhfZGVzYyglcClcbiIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGV2LCBwa3QsIHJ4X2Rlc2MpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHJ4X2Rlc2MtPnBuY0luZm8gJiBORVRBX1BOQ19SWF9TUEVDSUFMKQorICAgIHsKKyAgICAgICAgLyogUmVjZWl2ZSBhcHBsaWNhdGlvbiBwYWNrZXRzICovCisgICAgICAgIGlmIChjcGhfYXBwX3BhY2tldF9yeChwb3J0LCBkZXYsIChzdHJ1Y3Qgc2tfYnVmZiAqKShwa3QtPm9zSW5mbyksIHJ4X2Rlc2MpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgLyogSGFuZGxlIHRoZSBicm9hZGNhc3QgcGFja2V0IGluIGNhc2UgaXQgaXMgZW5hYmxlZCAqLworI2lmZGVmIENPTkZJR19NVl9DUEhfQkNfSEFORExFCisgICAgICAgIGlmIChjcGhfYXBwX3J4X2JjKHBvcnQsIGRldiwgcGt0LCByeF9kZXNjKSkKKyAgICAgICAgICAgIHJldHVybjsKKyNlbmRpZiAKKworICAgICAgICAvKiBEb2VzIG5vdCBtYXRjaCB3aXRoIENQSCBhcHBsaWNhdGlvbiBydWxlcyAqLworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiU3BlY2lhbCBwa3QgYXJyaXZlZCBmcm9tIHBvcnQoJWQpLCB3YXMgbm90IGhhbmRsZWQuIFxuIiwgcG9ydCk7CisgICAgICAgIGRldl9rZnJlZV9za2JfYW55KChzdHJ1Y3Qgc2tfYnVmZiAqKShwa3QtPm9zSW5mbykpOyAgCisgICAgICAgIE1WX0NQSF9DTEVBTl9QUklOVChDUEhfREVCVUdfTEVWRUwsICJJbnB1dCBQYWNrZXQgZmlyc3QgMjQgYnl0ZXM6XG4iKTsKKyAgICAgICAgbWVtc2V0KGJ1ZmYsIDAsIHNpemVvZihidWZmKSk7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgNDg7IGlkeCsrKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ByaW50ZihidWZmK29mZnNldCwgIiUwMnggIiwgKigoKHN0cnVjdCBza19idWZmICopKHBrdC0+b3NJbmZvKSktPmRhdGEgKyBpZHgpKTsKKyAgICAgICAgfQorICAgICAgICBNVl9DUEhfQ0xFQU5fUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAgIiVzXG4iLCBidWZmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiBIYW5kbGUgcmVjZWl2ZWQgZGF0YSBmbG93IHBhY2tldHMgKi8KKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRQorICAgICAgICBpZiAoY3BoX2RhdGFfZmxvd19yeChwb3J0LCBkZXYsIChzdHJ1Y3Qgc2tfYnVmZiAqKShwa3QtPm9zSW5mbyksIHJ4X2Rlc2MpKSB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiRmxvdyBtYXBwaW5nXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3R4X2Z1bmMoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ1BIIGZ1bmN0aW9uIHRvIGhhbmRsZSB0cmFubWl0dGluZyBzcGVjaWFsIHBhY2tldHMgCisqICAgICAgICAgICAgICB0byBuZXR3b3JrIGRyaXZlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBkZXYgICAgICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgc2tiICAgICAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBOb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF90eF9mdW5jKElOVDMyIHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQoreworICAgIC8qIFRyYW5zbWl0IGFwcGxpY2F0aW9uIHBhY2tldHMgKi8KKyAgICBpZiAoY3BoX2FwcF9wYWNrZXRfdHgocG9ydCwgZGV2LCBza2IsIHR4X3NwZWNfb3V0KSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBUcmFuc21pdCBkYXRhIGZsb3cgcGFja2V0cyAqLworI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCisgICAgaWYgKGNwaF9kYXRhX2Zsb3dfdHgocG9ydCwgZGV2LCBza2IsIEZBTFNFLCB0eF9zcGVjX291dCkpCisgICAgICAgIHJldHVybiAxOworI2VuZGlmCisKKyAgICAvKiBUcmFuc21pdCBkYXRhIGZsb3cgcGFja2V0cyBieSBVRFAgU291cmNlIFBvcnQgb3IgRGVzdCBQb3J0ICovCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorICAgIGlmIChjcGhfdWRwX3BvcnRfdHgocG9ydCwgZGV2LCBza2IsIHR4X3NwZWNfb3V0KSkKKyAgICAgICAgcmV0dXJuIDE7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9uZXRkZXZfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIENQSCBuZXR3b3JrIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9uZXRkZXZfaW5pdChWT0lEKQoreworICAgIFVJTlQzMiBwb3J0X2k7CisKKyAgICAvKiBSZXRyaWV2ZSBFdGggcG9ydCBudW1iZXIsIGFzIGluIG12X2V0aF9pbml0X21vZHVsZSAqLworICAgIGdzX212X2V0aF9wb3J0X251bSA9IG12Q3RybEV0aE1heFBvcnRHZXQoKTsKKworICAgIGlmIChnc19tdl9ldGhfcG9ydF9udW0gPiBDT05GSUdfTVZfRVRIX1BPUlRTX05VTSkKKyAgICAgICAgZ3NfbXZfZXRoX3BvcnRfbnVtID0gQ09ORklHX01WX0VUSF9QT1JUU19OVU07CisKKyAgICAvKiBJbml0aWFsaXplIGFwcGxpY2F0aW9uIHBhY2tldCBoYW5kbGluZyAqLworICAgIGNwaF9hcHBfaW5pdCgpOworICAgIAorICAgIC8qIEluaXRpYWxpemUgVURQIHBvcnQgbWFwcGluZyBmZWF0dXJlICovICAgIAorI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUKKyAgICBjcGhfdWRwX3RhYmxlX2luaXQoKTsKKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGl6ZSBkYXRhIGZsb3cgbWFwcGluZyBmZWF0dXJlICovCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKKyAgICBjcGhfZmxvd19pbml0KCk7CisjZW5kaWYKKworICAgIC8qIFJlZ2lzdGVyIHNwZWNpYWwgcmVjZWl2ZSBjaGVjayBmdW5jdGlvbiAqLworI2lmZGVmIENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTAorICAgIGZvciAocG9ydF9pID0gMDtwb3J0X2kgPCBnc19tdl9ldGhfcG9ydF9udW07IHBvcnRfaSsrKSB7CisgICAgICAgIG12X2V0aF9yeF9zcGVjaWFsX3Byb2NfZnVuYyhwb3J0X2ksIGNwaF9yeF9mdW5jKTsKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX01WX0VUSF9SWF9TUEVDSUFMICovCisKKyAgICAvKiBSZWdpc3RlciBzcGVjaWFsIHRyYW5zbWl0IGNoZWNrIGZ1bmN0aW9uICovCisjaWZkZWYgQ09ORklHX01WX0VUSF9UWF9TUEVDSUFMCisgICAgZm9yIChwb3J0X2kgPSAwOyBwb3J0X2kgPCBnc19tdl9ldGhfcG9ydF9udW07IHBvcnRfaSsrKSB7CisgICAgICAgIG12X2V0aF90eF9zcGVjaWFsX2NoZWNrX2Z1bmMocG9ydF9pLCBjcGhfdHhfZnVuYyk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfVFhfU1BFQ0lBTCAqLworICAgIHJldHVybiBNVl9PSzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9uZXRkZXYuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9uZXRkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZTU5YmJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX25ldGRldi5oCkBAIC0wLDAgKzEsMTU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX25ldGRldi5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIG5ldHdvcmsgZGV2aWNlIHBhcnQgZGVmaW5pdGlvbgorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMTFEZWMyMDExCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfTkVUREVWX0hfCisjZGVmaW5lIF9NVl9DUEhfTkVUREVWX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworI2luY2x1ZGUgPG12Q29tbW9uLmg+CisjaW5jbHVkZSA8bXZPcy5oPgorI2luY2x1ZGUgPG12X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuaD4KKworCisjZGVmaW5lIE1WX0NQSF9NQVNfVURQX1NSQ19QT1JUICAgICAgICAgIDgKKyNkZWZpbmUgTVZfQ1BIX01BU19VRFBfRFNUX1BPUlQgICAgICAgICAgOAorI2RlZmluZSBNVl9DUEhfTlVNX0xMSUQgICAgICAgICAgICAgICAgICA4CisKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFCitzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyB7CisgICAgX19iZTE2ICAgIHVkcF9wb3J0OworICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyB0eF9zcGVjOworfTsKKworc3RydWN0IG12X3BvcnRfdHhfc3BlYyB7CisgICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgdWRwX3NyY1tNVl9DUEhfTUFTX1VEUF9TUkNfUE9SVF07CisgICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgdWRwX2RzdFtNVl9DUEhfTUFTX1VEUF9EU1RfUE9SVF07Cit9OworCit2b2lkIGNwaF91ZHBfc3BlY19wcmludF9hbGwodm9pZCk7CitNVl9TVEFUVVMgIGNwaF91ZHBfc3JjX3NwZWNfc2V0KGludCB0eF9wb3J0LCB1aW50MTZfdCB1ZHBfc3JjX3BvcnQsIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCk7CitNVl9TVEFUVVMgIGNwaF91ZHBfZGVzdF9zcGVjX3NldChpbnQgdHhfcG9ydCwgdWludDE2X3QgdWRwX2Rlc3RfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9yZWNfc2tiKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNlbmQgU0tCIHBhY2tldCB0byBsaW51eCBuZXR3b3JrIGFuZCBpbmNyZXNlIGNvdW50ZXIgIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIHNrYiAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCBjcGhfcmVjX3NrYihJTlQzMiBwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfbmV0ZGV2X2luaXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBDUEggbmV0d29yayBkZXZpY2UKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfbmV0ZGV2X2luaXQoVk9JRCk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NVl9DUEhfTkVUREVWX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfc3lzZnMuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlNTQwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfc3lzZnMuYwpAQCAtMCwwICsxLDEyMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfc3lzZnMuYworKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBzeXNmcyBjb21tYW5kIGRlZmluaXRpb24gCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMQorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGdiZS9tdk5ldGEuaD4KKyNpbmNsdWRlIDxwbmMvbXZQbmMuaD4KKworI2luY2x1ZGUgIm12X2NwaF9oZWFkZXIuaCIKKworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY19oZWxwKENIQVIgKmJ1ZikKK3sKKyAgICBJTlQzMiBvZmYgPSAwOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIGhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgdGhpcyBoZWxwXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBoZWxwX2FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaG93IGFkZGl0aW9uYWwgaGVscCBmb3IgcGFyYW1ldGVyc1xuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIHNob3dfYXBwX2RiICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgYWxsIGluZm9ybWF0aW9uIGluIGFwcGxpY2F0aW9uIHJ1bGUgZGF0YSBiYXNlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBzaG93X3BhcnNlX25hbWUgICAgICAgICAgICAgICAgICAgICAgLSBzaG93IHN5c2ZzIHBhcnNpbmcgcnVsZSBkYXRhIGJhc2VcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIHNob3dfbW9kX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgc3lzZnMgbW9kaWZpY2F0aW9uIHJ1bGUgZGF0YSBiYXNlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBzaG93X2Zyd2RfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgLSBzaG93IHN5c2ZzIG1vZGlmaWNhdGlvbiBydWxlIGRhdGEgYmFzZVxuIik7CisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRSAgICAKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICB1ZHBfcG9ydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaG93IHNwZWNpYWwgdWRwIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9ydCBjb25maWd1cmF0aW9uXG4iKTsgICAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgc2hvd19mbG93X3J1bGUgICAgICAgICAgICAgICAgICAgICAgIC0gc2hvdyBmbG93IG1hcHBpbmcgcnVsZXMgXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgY2xlYXJfZmxvd19ydWxlICAgICAgICAgICAgICAgICAgICAgIC0gY2xlYXIgYWxsIGZsb3cgbWFwcGluZyBydWxlc1xuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgZGVsX2RzY3BfbWFwICAgICAgICAgICAgICAgICAgICAgICAgIC0gZGVsZXRlIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXNcbiIpOworI2VuZGlmCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gcHJvZmlsZV9pZCBhY3RpdmVfcG9ydCAgICAgICAgICAgICAgID4gc2V0X2NvbXBsZXggICAgIC0gU2V0IFRQTSBjb21wbGV4IHByb2ZpbGUgSUQgYW5kIGFjdGl2ZSBHTUFDIHBvcnQsIDA6R01BQzAsIDE6R01BQzEsIDI6UE9OIE1BQ1xuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gZmVhdHVyZSBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgID4gc2V0X2ZsYWcgICAgICAgIC0gU2V0IHRoZSBzdXBwb3J0IG9mIENQSCBmZWF0dXJlOiByZWZlciB0byBiZWxvdyBhZGRpdGlvbmFsIGluZm8sIHN0YXRlIDA6ZGlzYWJsZSwgMTplbmFibGVcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHRjb250IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICA+IHNldF90Y29udCAgICAgICAtIFNldCBULUNPTlQgc3RhdGUgaW4gQ1BILCBULUNPTlQgMH43LCBzdGF0ZSwgMTplbmFibGUsIDA6ZGlzYWJsZVxuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGhleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IHRyYWNlX2xldmVsICAgICAtIFNldCBjcGggdHJhY2UgbGV2ZWwgYml0bWFwLiAweDAxOmRlYnVnLCAweDAyOmluZm8sIDB4MDQ6d2FybiwgMHgwODplcnJvclxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gbmFtZSBibShoZXgpIGRpciByeChoZXgpIG1oKGhleCkgZXR5KGhleCkgZXN0eSBpcHY0dHkgbmgxIG5oMiBpY21wdHkgPiBhZGRfcGFyc2UgICAtIGFkZCBwYXJzaW5nIGZpZWxkLCBkaXIgMDpVL1MsIDE6RC9TLCAyOk5vdCBjYXJlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBkZWxfcGFyc2UgICAgICAgLSBkZWxldGUgcGFyc2luZyBmaWVsZFxuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIG5hbWUgYm0oaGV4KSBwcm90b190eXBlKGhleCkgc3RhdGUgICA+IGFkZF9tb2QgICAgICAgICAtIGFkZCBtb2RpZmljYXRpb24gZmllbGQsIHN0YXRlIDA6ZGlhYmxlLCAxOmVuYWJsZVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gZGVsX21vZCAgICAgICAgIC0gZGVsZXRlIG1vZGlmaWNhdGlvbiBmaWVsZFxuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIG5hbWUgYm0oaGV4KSB0cmdfcG9ydCB0cmdfcXVldWUgZ2VtICA+IGFkZF9mcndkICAgICAgICAtIGFkZCBmb3J3YXJkaW5nIGZpZWxkXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBkZWxfZnJ3ZCAgICAgICAgLSBkZWxldGUgZm9yd2FyZGluZyBmaWVsZFxuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHBhcnNlX25hbWUgbW9kX25hbWUgZnJ3ZF9uYW1lICAgICAgICA+IGFkZF9hcHBfcnVsZSAgICAtIGFkZCBhcHBsaWNhdGlvbiBydWxlXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gcGFyc2VfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgID4gZGVsX2FwcF9ydWxlICAgIC0gZGVsZXRlIGFwcGxpY2F0aW9uIHJ1bGVcbiIpOyAgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gcGFyc2VfbmFtZSBtb2RfbmFtZSBmcndkX25hbWUgICAgICAgID4gdXBkYXRlX2FwcF9ydWxlIC0gdXBkYXRlIGFwcGxpY2F0aW9uIHJ1bGVcbiIpOyAgICAKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwYXJzZV9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBnZXRfYXBwX3J1bGUgICAgLSBnZXQgYXBwbGljYXRpb24gcnVsZVxuIik7ICAgIAorI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwIHVkcF9zcmMoZGVjKSB0eHAgdHhxIGZsYWdzIGh3X2NtZCAgPiB1ZHBfc3JjICAgICAgICAgLSBzZXQgdWRwIHNvdXJjZSBwb3J0IHNwZWNpYWwgVHggYmVoYXZpb3JcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHAgdWRwX2RzdChkZWMpIHR4cCB0eHEgZmxhZ3MgaHdfY21kICA+IHVkcF9kc3QgICAgICAgICAtIHNldCB1ZHAgZGVzdGluYXRpb24gcG9ydCBzcGVjaWFsIFR4IGJlaGF2aW9yXG4iKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICB8UGFyc2Ugb3V0ZXIgICAgfFBhcnNlIGlubmVyICAgICAgICAgICAgIHxNb2Qgb3V0ZXIgICAgICB8TW9kIElubmVyICAgICAgfEZvcndhcmRcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGRpciBwYXJzZV9ibSBtaCBldHkgIHRwaWQgdmlkIHBiaXRzICB0cGlkIHZpZCBwYml0cyAgb3BfdHlwZSAgdHBpZCB2aWQgcGJpdHMgIHRwaWQgdmlkIHBiaXRzICBwb3J0IHF1ZXVlIGh3Zl9xdWV1ZSBnZW0gPiBhZGRfZmxvd19ydWxlIC0gQWRkIGZsb3cgcnVsZVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gZGlyIHBhcnNlX2JtIG1oIGV0eSAgdHBpZCB2aWQgcGJpdHMgIHRwaWQgdmlkIHBiaXRzICA+IGRlbF9mbG93X3J1bGUgICAtIGRlbGV0ZSBmbG93IG1hcHBpbmcgcnVsZVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gZGlyIHBhcnNlX2JtIG1oIGV0eSAgdHBpZCB2aWQgcGJpdHMgIHRwaWQgdmlkIHBiaXRzICA+IGdldF9mbG93X3J1bGUgICAtIGdldCBmbG93IG1hcHBpbmcgcnVsZVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gcGJpdHMwIHBiaXRzMSAuLi4gcGJpdHM2MiBwYml0czYzICAgICAgICAgICAgICAgICAgICA+IHNldF9kc2NwX21hcCAgICAtIHNldCBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBvZmY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfaGVscF9hZGQoQ0hBUiAqYnVmKQoreworICAgIElOVDMyIG9mZiA9IDA7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIkNQSCBhZGRpdGlvbmFsIGhlbHAgZm9yIHBhcmFtZXRlcnNcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJbR2VuZXJpYyBQYXJhbWV0ZXJzXVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImZlYXR1cmU6XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMDpHZW5lcmljIGFwcGxpY2F0aW9uLCAxOklHTVAvTUxEIHN1cHBvcnQsIDI6QnJvYWRjYXN0IHN1cHBvcnQsIDM6RGF0YSBmbG93IG1hcHBpbmcgc3VwcG9ydCwgNDogVURQIHBvcnQgbWFwcGluZyBzdXBwb3J0XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiW0FwcCBQYXJhbWV0ZXJzXVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgInBhcnNlIGJtOlxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDB4MDE6UEFSU0VfRklFTERfRElSICAgICAgICAgICAgICAweDAyOlBBUlNFX0ZJRUxEX01IICAgICAgICAgICAgICAgMHgwNDpQQVJTRV9GSUVMRF9FVEhfVFlQRSAgICAgICAgIDB4MDg6UEFSU0VfRklFTERfRVRIX1NVQlRZUEVcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICIgICAweDEwOlBBUlNFX0ZJRUxEX0lQVjRfVFlQRSAgICAgICAgMHgyMDpQQVJTRV9GSUVMRF9JUFY2X05IMSAgICAgICAgIDB4NDA6UEFSU0VfRklFTERfSVBWNl9OSDIgICAgICAgICAweDgwOlBBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZGlyOiAwOiBVL1MsIDE6RC9TLCAyOiBOb3QgY2FyZVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgInJ4OiAwOiBSWCwgMTpUWFxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIm1vZCBibTpcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICIgICAweDAxOlJYX01PRF9BRERfR01BQyAgICAgICAgICAgICAgMHgwMjpSWF9NT0RfUkVQTEFDRV9QUk9UT19UWVBFICAgIDB4MDQ6UlhfTU9EX1NUUklQX01IICAgICAgICAgICAgICAweDA4OlRYX01PRF9BRERfTUhfQllfRFJJVkVSXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMHgxMDpDUEhfQVBQX1RYX01PRF9OT19QQUQgICAgICAgIDB4MjA6TU9EX1NFVF9TVEFURVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImZyd2QgYm06XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMHgwMTpGUldEX1NFVF9UUkdfUE9SVCAgICAgICAgICAgIDB4MDI6RlJXRF9TRVRfVFJHX1FVRVVFICAgICAgICAgICAweDA0OkZSV0RfU0VUX0dFTV9QT1JUXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiW0Zsb3cgUGFyYW1ldGVyc11cbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJkaXI6IDA6IFUvUywgMTpEL1MsIDI6IE5vdCBjYXJlXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImJtOlxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDB4MDE6UEFSU0VfTUggICAgICAgICAgICAgICAgICAgICAweDAyOlBBUlNFX0VYVF9WTEFOICAgICAgICAgICAgICAgMHgwNDpQQVJTRV9UV09fVkxBTiAgICAgICAgICAgICAgIDB4MDg6UEFSU0VfRVRIX1RZUEVcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJtaChoZXgpLCBldHkoaGV4KSwgdHBpZChoZXgpLCB2aWQoZGVjKSwgcGJpdHMoZGVjKVxuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJvcF90eXBlOlxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDAwOkFTSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAwMTpESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgMDI6QUREICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAzOkFERF9DT1BZX0RTQ1BcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICIgICAwNDpBRERfQ09QWV9PVVRFUl9QQklUICAgICAgICAgICAgMDU6QUREX0NPUFlfSU5ORVJfUEJJVCAgICAgICAgICAgIDA2OkFERF8yX1RBR1MgICAgICAgICAgICAgICAgICAgICAwNzpBRERfMl9UQUdTX0NPUFlfRFNDUFxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDA4OkFERF8yX1RBR1NfQ09QWV9QQklUICAgICAgICAgICAwOTpSRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6UkVNXzJfVEFHUyAgICAgICAgICAgICAgICAgICAgIDExOlJFUExBQ0VcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICIgICAxMjpSRVBMQUNFX1ZJRCAgICAgICAgICAgICAgICAgICAgMTM6UkVQTEFDRV9QQklUICAgICAgICAgICAgICAgICAgIDE0OlJFUExBQ0VfSU5ORVJfQUREX09VVEVSICAgICAgICAxNTpSRVBMQUNFX0lOTkVSX0FERF9PVVRFUl9DT1BZX1BCSVRcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICIgICAxNjpSRVBMQUNFX0lOTkVSX1JFTV9PVVRFUiAgICAgICAgMTc6UkVQTEFDRV8yVEFHUyAgICAgICAgICAgICAgICAgIDE4OlJFUExBQ0VfMlRBR1NfVklEICAgICAgICAgICAgICAxOTpTV0FQXG4iKTsKKyAgCisgICAgcmV0dXJuIG9mZjsKK30KKworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmcgZmllbGQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIENQSF9TWVNGU19QQVJTRV9UIGNwaF9zeXNmc19wYXJzZV90YWJsZVtDUEhfU1lTRlNfRklFTERfTUFYX0VOVFJZXTsKKworc3RhdGljIENQSF9TWVNGU19SVUxFX1QgY3BoX3BhcnNlX3J1bGVfZGIgPQoreworICAgIC5tYXhfZW50cnlfbnVtICAgID0gQ1BIX1NZU0ZTX0ZJRUxEX01BWF9FTlRSWSwKKyAgICAuZW50cnlfbnVtICAgICAgICA9IDAsCisgICAgLmVudHJ5X3NpemUgICAgICAgPSBzaXplb2YoQ1BIX1NZU0ZTX1BBUlNFX1QpLAorICAgIC5lbnRyeV9hcmEgICAgICAgID0gY3BoX3N5c2ZzX3BhcnNlX3RhYmxlCit9OworCitzdGF0aWMgVk9JRCBjcGhfc3lzZnNfaW5pdF9wYXJzZV9kYihWT0lEKQoreworICAgIENQSF9TWVNGU19QQVJTRV9UICAqcF9lbnRyeSA9IChDUEhfU1lTRlNfUEFSU0VfVCAqKWNwaF9wYXJzZV9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgLy9wcmludGsoS0VSTl9JTkZPICIlczogSW5pdCBEQlxuIiwgX19GVU5DVElPTl9fKTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9wYXJzZV9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBwX2VudHJ5LT5uYW1lWzBdID0gMDsKKyAgICB9Cit9CisKK0NQSF9TWVNGU19QQVJTRV9UICpjcGhfc3lzZnNfZmluZF9wYXJzZV9lbnRyeV9ieV9uYW1lKENIQVIgKm5hbWUpCit7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX1BBUlNFX1QgKiljcGhfcGFyc2VfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9wYXJzZV9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBpZiAoc3RyY21wKHBfZW50cnktPm5hbWUsIG5hbWUpID09IDApIAorICAgICAgICAgICAgcmV0dXJuIHBfZW50cnk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitDUEhfU1lTRlNfUEFSU0VfVCAqY3BoX3N5c2ZzX2ZpbmRfZnJlZV9wYXJzZV9lbnRyeShWT0lEKQoreworICAgIENQSF9TWVNGU19QQVJTRV9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19QQVJTRV9UICopY3BoX3BhcnNlX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX3BhcnNlX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChwX2VudHJ5LT5uYW1lWzBdID09IDApIAorICAgICAgICAgICAgcmV0dXJuIHBfZW50cnk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitCT09MIGNwaF9zeXNmc19kZWxfcGFyc2VfZW50cnlfYnlfbmFtZShDSEFSICpuYW1lKQoreworICAgIENQSF9TWVNGU19QQVJTRV9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19QQVJTRV9UICopY3BoX3BhcnNlX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX3BhcnNlX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAocF9lbnRyeS0+bmFtZSwgbmFtZSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcF9lbnRyeS0+bmFtZVswXSAgPSAwOworICAgICAgICAgICAgcF9lbnRyeS0+cGFyc2VfYm0gPSAwOworICAgICAgICAgICAgbWVtc2V0KCZwX2VudHJ5LT5wYXJzZV9rZXksIDAsIHNpemVvZihwX2VudHJ5LT5wYXJzZV9rZXkpKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworVk9JRCBjcGhfc3lzZnNfc2hvd19wYXJzZV9kYihWT0lEKQoreworICAgIENQSF9TWVNGU19QQVJTRV9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19QQVJTRV9UICopY3BoX3BhcnNlX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX3BhcnNlX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChwX2VudHJ5LT5uYW1lWzBdICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlBhcnNlIGVudHJ5KCVkKSBuYW1lKCVzKVxuIiwgaWR4LCBwX2VudHJ5LT5uYW1lKTsKKyAgICAgICAgICAgIGNwaF9kYl9kaXNwbGF5X3BhcnNlX2ZpZWxkKHBfZW50cnktPnBhcnNlX2JtLCAmcF9lbnRyeS0+cGFyc2Vfa2V5KTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBmaWVsZCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIENQSF9TWVNGU19NT0RfVCBjcGhfc3lzZnNfbW9kX3RhYmxlW0NQSF9TWVNGU19GSUVMRF9NQVhfRU5UUlldOworCitzdGF0aWMgQ1BIX1NZU0ZTX1JVTEVfVCBjcGhfbW9kX3J1bGVfZGIgPQoreworICAgIC5tYXhfZW50cnlfbnVtICAgID0gQ1BIX1NZU0ZTX0ZJRUxEX01BWF9FTlRSWSwKKyAgICAuZW50cnlfbnVtICAgICAgICA9IDAsCisgICAgLmVudHJ5X3NpemUgICAgICAgPSBzaXplb2YoQ1BIX1NZU0ZTX01PRF9UKSwKKyAgICAuZW50cnlfYXJhICAgICAgICA9IGNwaF9zeXNmc19tb2RfdGFibGUKK307CisKK3N0YXRpYyBWT0lEIGNwaF9zeXNmc19pbml0X21vZF9kYihWT0lEKQoreworICAgIENQSF9TWVNGU19NT0RfVCAgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX01PRF9UICopY3BoX21vZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXQgREJcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfbW9kX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIHBfZW50cnktPm5hbWVbMF0gPSAwOworICAgIH0KK30KKworQ1BIX1NZU0ZTX01PRF9UICpjcGhfc3lzZnNfZmluZF9tb2RfZW50cnlfYnlfbmFtZShDSEFSICpuYW1lKQoreworICAgIENQSF9TWVNGU19NT0RfVCAgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX01PRF9UICopY3BoX21vZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX21vZF9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBpZiAoc3RyY21wKHBfZW50cnktPm5hbWUsIG5hbWUpID09IDApIAorICAgICAgICAgICAgcmV0dXJuIHBfZW50cnk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitDUEhfU1lTRlNfTU9EX1QgKmNwaF9zeXNmc19maW5kX2ZyZWVfbW9kX2VudHJ5KFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX01PRF9UICAqcF9lbnRyeSA9IChDUEhfU1lTRlNfTU9EX1QgKiljcGhfbW9kX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfbW9kX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChwX2VudHJ5LT5uYW1lWzBdID09IDApIAorICAgICAgICAgICAgcmV0dXJuIHBfZW50cnk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitCT09MIGNwaF9zeXNmc19kZWxfbW9kX2VudHJ5X2J5X25hbWUoQ0hBUiAqbmFtZSkKK3sKKyAgICBDUEhfU1lTRlNfTU9EX1QgICpwX2VudHJ5ID0gKENQSF9TWVNGU19NT0RfVCAqKWNwaF9tb2RfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9tb2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmNtcChwX2VudHJ5LT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwX2VudHJ5LT5uYW1lWzBdID0gMDsKKyAgICAgICAgICAgIHBfZW50cnktPm1vZF9ibSAgPSAwOworICAgICAgICAgICAgbWVtc2V0KCZwX2VudHJ5LT5tb2RfdmFsdWUsIDAsIHNpemVvZihwX2VudHJ5LT5tb2RfdmFsdWUpKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworVk9JRCBjcGhfc3lzZnNfc2hvd19tb2RfZGIoVk9JRCkKK3sKKyAgICBDUEhfU1lTRlNfTU9EX1QgICpwX2VudHJ5ID0gKENQSF9TWVNGU19NT0RfVCAqKWNwaF9tb2RfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9tb2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiTW9kIGVudHJ5KCVkKSBuYW1lKCVzKVxuIiwgaWR4LCBwX2VudHJ5LT5uYW1lKTsKKyAgICAgICAgICAgIGNwaF9kYl9kaXNwbGF5X21vZF9maWVsZChwX2VudHJ5LT5tb2RfYm0sICZwX2VudHJ5LT5tb2RfdmFsdWUpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yd2FyZGluZyBmaWVsZCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQ1BIX1NZU0ZTX0ZSV0RfVCBjcGhfc3lzZnNfZnJ3ZF90YWJsZVtDUEhfU1lTRlNfRklFTERfTUFYX0VOVFJZXTsKKworc3RhdGljIENQSF9TWVNGU19SVUxFX1QgY3BoX2Zyd2RfcnVsZV9kYiA9Cit7CisgICAgLm1heF9lbnRyeV9udW0gICAgPSBDUEhfU1lTRlNfRklFTERfTUFYX0VOVFJZLAorICAgIC5lbnRyeV9udW0gICAgICAgID0gMCwKKyAgICAuZW50cnlfc2l6ZSAgICAgICA9IHNpemVvZihDUEhfU1lTRlNfRlJXRF9UKSwKKyAgICAuZW50cnlfYXJhICAgICAgICA9IGNwaF9zeXNmc19mcndkX3RhYmxlCit9OworCitzdGF0aWMgVk9JRCBjcGhfc3lzZnNfaW5pdF9mcndkX2RiKFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX0ZSV0RfVCAqcF9lbnRyeSA9IChDUEhfU1lTRlNfRlJXRF9UICopY3BoX2Zyd2RfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKyAgICAvL3ByaW50ayhLRVJOX0lORk8gIiVzOiBJbml0IERCXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX2Zyd2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgcF9lbnRyeS0+bmFtZVswXSA9IDA7CisgICAgfQorfQorCitDUEhfU1lTRlNfRlJXRF9UICpjcGhfc3lzZnNfZmluZF9mcndkX2VudHJ5X2J5X25hbWUoQ0hBUiAqbmFtZSkKK3sKKyAgICBDUEhfU1lTRlNfRlJXRF9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19GUldEX1QgKiljcGhfZnJ3ZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX2Zyd2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmNtcChwX2VudHJ5LT5uYW1lLCBuYW1lKSA9PSAwKSAKKyAgICAgICAgICAgIHJldHVybiBwX2VudHJ5OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworQ1BIX1NZU0ZTX0ZSV0RfVCAqY3BoX3N5c2ZzX2ZpbmRfZnJlZV9mcndkX2VudHJ5KFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX0ZSV0RfVCAqcF9lbnRyeSA9IChDUEhfU1lTRlNfRlJXRF9UICopY3BoX2Zyd2RfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9mcndkX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChwX2VudHJ5LT5uYW1lWzBdID09IDApIAorICAgICAgICAgICAgcmV0dXJuIHBfZW50cnk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitCT09MIGNwaF9zeXNmc19kZWxfZnJ3ZF9lbnRyeV9ieV9uYW1lKENIQVIgKm5hbWUpCit7CisgICAgQ1BIX1NZU0ZTX0ZSV0RfVCAqcF9lbnRyeSA9IChDUEhfU1lTRlNfRlJXRF9UICopY3BoX2Zyd2RfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9mcndkX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAocF9lbnRyeS0+bmFtZSwgbmFtZSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcF9lbnRyeS0+bmFtZVswXSA9IDA7CisgICAgICAgICAgICBwX2VudHJ5LT5mcndkX2JtID0gMDsKKyAgICAgICAgICAgIG1lbXNldCgmcF9lbnRyeS0+ZnJ3ZF92YWx1ZSwgMCwgc2l6ZW9mKHBfZW50cnktPmZyd2RfdmFsdWUpKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworVk9JRCBjcGhfc3lzZnNfc2hvd19mcndkX2RiKFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX0ZSV0RfVCAqcF9lbnRyeSA9IChDUEhfU1lTRlNfRlJXRF9UICopY3BoX2Zyd2RfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9mcndkX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChwX2VudHJ5LT5uYW1lWzBdICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIkZyd2QgZW50cnkoJWQpIG5hbWUoJXMpXG4iLCBpZHgsIHBfZW50cnktPm5hbWUpOworICAgICAgICAgICAgY3BoX2RiX2Rpc3BsYXlfZnJ3ZF9maWVsZChwX2VudHJ5LT5mcndkX2JtLCAmcF9lbnRyeS0+ZnJ3ZF92YWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBTWVMgRlMgUGFyc2luZyBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBDSEFSICpidWYpCit7CisgICAgSU5UMzIgICAgICAgb2ZmICA9IDA7CisgICAgY29uc3QgQ0hBUiAqbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKKworICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIGlmICghc3RyY21wKG5hbWUsICJoZWxwIikgKSB7CisgICAgICAgIG9mZiA9IGNwaF9zcGVjX3Byb2NfaGVscChidWYpOworICAgIH0KKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiaGVscF9hZGQiKSApIHsKKyAgICAgICAgb2ZmID0gY3BoX3NwZWNfcHJvY19oZWxwX2FkZChidWYpOworICAgIH0gICAgCisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic2hvd19hcHBfZGIiKSApIHsKKyAgICAgICAgY3BoX2RiX2Rpc3BsYXlfYWxsKCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInNob3dfcGFyc2VfbmFtZSIpICkgeworICAgICAgICBjcGhfc3lzZnNfc2hvd19wYXJzZV9kYigpOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJzaG93X21vZF9uYW1lIikgKSB7CisgICAgICAgIGNwaF9zeXNmc19zaG93X21vZF9kYigpOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJzaG93X2Zyd2RfbmFtZSIpICkgeworICAgICAgICBjcGhfc3lzZnNfc2hvd19mcndkX2RiKCk7CisgICAgfQorI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUgICAgICAgCisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidWRwX3BvcnRzIikpIHsKKyAgICAgICAgY3BoX3VkcF9zcGVjX3ByaW50X2FsbCgpOworICAgIH0KKyNlbmRpZiAgICAKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRSAgICAgICAgICAKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJzaG93X2Zsb3dfcnVsZSIpKSB7CisgICAgICAgIGNwaF9mbG93X2Rpc3BsYXlfYWxsKCk7CisgICAgfSAKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJjbGVhcl9mbG93X3J1bGUiKSkgeworICAgICAgICBjcGhfZmxvd19jbGVhcl9ydWxlKCk7CisgICAgfSAgCisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGVsX2RzY3BfbWFwIikpIHsKKyAgICAgICAgY3BoX2Zsb3dfZGVsX2RzY3BfbWFwKCk7CisgICAgfSAgICAgCisjZW5kaWYgICAgCisgICAgZWxzZQorICAgICAgICBvZmYgPSBjcGhfc3BlY19wcm9jX2hlbHAoYnVmKTsKKworICAgIHJldHVybiBvZmY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfMV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUiAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IENIQVIgKm5hbWUgID0gYXR0ci0+YXR0ci5uYW1lOworICAgIFVJTlQzMiAgICAgIHYxICAgID0gMDsKKyAgICBVTE9ORyAgICAgICBmbGFncyA9IDA7ICAgIAorICAgIE1WX1NUQVRVUyAgIHJjICAgID0gIE1WX09LOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgLyogUmVhZCBpbnB1dCAqLworICAgIHNzY2FuZihidWYsICIleCIsICZ2MSk7CisKKyAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIAorICAgIGlmICghc3RyY21wKG5hbWUsICJ0cmFjZV9sZXZlbCIpKSB7CisgICAgICAgIHJjID0gY3BoX3NldF90cmFjZV9mbGFnKHYxKTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gc2V0IHRyYWNlIGxldmVsPDB4JXg+XG4iLCB2MSk7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIHNldCB0cmFjZSBsZXZlbDwweCV4PlxuIiwgdjEpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOworCisgICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfMl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUiAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IENIQVIgKm5hbWUgID0gYXR0ci0+YXR0ci5uYW1lOworICAgIFVJTlQzMiAgICAgIHYxICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2MiAgICA9IDA7CisgICAgVUxPTkcgICAgICAgZmxhZ3MgPSAwOyAgICAKKyAgICBNVl9TVEFUVVMgICByYyAgICA9ICBNVl9PSzsKKworICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIC8qIFJlYWQgaW5wdXQgKi8KKyAgICBzc2NhbmYoYnVmLCAiJWQgJWQiLCAmdjEsICZ2Mik7CisKKyAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIAorICAgIGlmICghc3RyY21wKG5hbWUsICJzZXRfY29tcGxleCIpKSB7CisgICAgICAgIHJjID0gY3BoX3NldF9jb21wbGV4X3Byb2ZpbGUodjEsIHYyKTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gc2V0IGNvbXBsZXggcHJvZmlsZTwlZD4gYWN0aXZlIHBvcnQ8JWQ+XG4iLCB2MSwgdjIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBzZXQgY29tcGxleCBwcm9maWxlPCVkPiBhY3RpdmUgcG9ydDwlZD5cbiIsIHYxLCB2Mik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic2V0X2ZsYWciKSkgeworICAgICAgICByYyA9IGNwaF9zZXRfZmVhdHVyZV9mbGFnKHYxLCB2Mik7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIHNldCBmZWF0dXJlPCVkPiB0byA8JWQ+XG4iLCB2MSwgdjIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBzZXQgZmVhdHVyZTwlZD4gdG88JWQ+XG4iLCB2MSwgdjIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInNldF90Y29udCIpKSB7CisgICAgICAgIHJjID0gY3BoX3NldF90Y29udF9zdGF0ZSh2MSwgdjIpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBzZXQgdGNvbnQ8JWQ+IHRvIDwlZD5cbiIsIHYxLCB2Mik7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIHNldCB0Y29udDwlZD4gdG88JWQ+XG4iLCB2MSwgdjIpOworICAgICAgICB9CisgICAgfSAgICAKKyAgICBlbHNlCisgICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgb3BlcmF0aW9uIDwlcz5cbiIsIF9fRlVOQ1RJT05fXywgYXR0ci0+YXR0ci5uYW1lKTsKKworICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBjcGhfc3BlY19wcm9jX25hbWVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQVIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgICBjb25zdCBDSEFSICpuYW1lICA9IGF0dHItPmF0dHIubmFtZTsKKyAgICBDSEFSICAgICAgICBuYW1lMVtDUEhfU1lTRlNfRklFTERfTUFYX0xFTisxXTsKKyAgICBVSU5UMzIgICAgICB2MSAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjIgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHYzICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2NCAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjUgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHY2ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2NyAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjggICAgPSAwOworICAgIFVJTlQzMiAgICAgIHY5ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2MTAgICA9IDA7CisgICAgVUxPTkcgICAgICAgZmxhZ3MgPSAwOworICAgIENQSF9TWVNGU19QQVJTRV9UICpwX3BhcnNlX2VudHJ5ID0gTlVMTDsKKyAgICBDUEhfU1lTRlNfTU9EX1QgICAqcF9tb2RfZW50cnkgICA9IE5VTEw7CisgICAgQ1BIX1NZU0ZTX0ZSV0RfVCAgKnBfZnJ3ZF9lbnRyeSAgPSBOVUxMOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiYWRkX3BhcnNlIikpIHsKKyAgICAgICAgLyogUmVhZCBpbnB1dCAqLworICAgICAgICBzc2NhbmYoYnVmLCAiJXMgJXggJWQgJWQgJWQgJXggJWQgJWQgJWQgJWQgJWQiLCBuYW1lMSwgJnYxLCAmdjIsICZ2MywgJnY0LCAmdjUsICZ2NiwgJnY3LCAmdjgsICZ2OSwgJnYxMCk7CisKKyAgICAgICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAKKyAgICAgICAgcF9wYXJzZV9lbnRyeSA9IGNwaF9zeXNmc19maW5kX3BhcnNlX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZihwX3BhcnNlX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoIkFscmVhZHkgaGFzIHRoZSBwYXJzZSBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9CisKKyAgICAgICAgcF9wYXJzZV9lbnRyeSA9IGNwaF9zeXNmc19maW5kX2ZyZWVfcGFyc2VfZW50cnkoKTsKKyAgICAgICAgaWYoIXBfcGFyc2VfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiTm8gZnJlZSBwYXJzZSBlbnRyeVxuIik7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3RyY3B5KHBfcGFyc2VfZW50cnktPm5hbWUsIG5hbWUxKTsKKyAgICAgICAgcF9wYXJzZV9lbnRyeS0+cGFyc2VfYm0gICAgICAgICAgICAgID0gdjE7CisgICAgICAgIHBfcGFyc2VfZW50cnktPnBhcnNlX2tleS5kaXIgICAgICAgICA9IHYyOworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXkucnhfdHggICAgICAgPSB2MzsKKyAgICAgICAgcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5Lm1oICAgICAgICAgID0gdjQ7CisgICAgICAgIHBfcGFyc2VfZW50cnktPnBhcnNlX2tleS5ldGhfdHlwZSAgICA9IHY1OworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXkuZXRoX3N1YnR5cGUgPSB2NjsKKyAgICAgICAgcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LmlwdjRfdHlwZSAgID0gdjc7CisgICAgICAgIHBfcGFyc2VfZW50cnktPnBhcnNlX2tleS5pcHY2X25oMSAgICA9IHY4OworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXkuaXB2Nl9uaDIgICAgPSB2OTsKKyAgICAgICAgcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LmljbXB2Nl90eXBlID0gdjEwOworICAgICAgICAKKyAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGFkZCBwYXJzZSBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsKKworICAgICAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJhZGRfbW9kIikpIHsKKyAgICAgICAgLyogUmVhZCBpbnB1dCAqLworICAgICAgICBzc2NhbmYoYnVmLCAiJXMgJXggJXggJWQiLCBuYW1lMSwgJnYxLCAmdjIsICZ2Myk7CisKKyAgICAgICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAgICAgCisgICAgICAgIHBfbW9kX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfbW9kX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZihwX21vZF9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJBbHJlYWR5IGhhcyB0aGUgbW9kIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKworICAgICAgICBwX21vZF9lbnRyeSA9IGNwaF9zeXNmc19maW5kX2ZyZWVfbW9kX2VudHJ5KCk7CisgICAgICAgIGlmKCFwX21vZF9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJObyBmcmVlIG1vZCBlbnRyeVxuIik7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmNweShwX21vZF9lbnRyeS0+bmFtZSwgbmFtZTEpOworICAgICAgICBwX21vZF9lbnRyeS0+bW9kX2JtICAgICAgICAgICAgICAgID0gdjE7CisgICAgICAgIHBfbW9kX2VudHJ5LT5tb2RfdmFsdWUucHJvdG9fdHlwZSAgPSB2MjsKKyAgICAgICAgaWYgKHYzKQorICAgICAgICAgICAgcF9tb2RfZW50cnktPm1vZF92YWx1ZS5zdGF0ZSAgID0gVFJVRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcF9tb2RfZW50cnktPm1vZF92YWx1ZS5zdGF0ZSAgID0gRkFMU0U7CisgICAgICAgIAorICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gYWRkIG1vZCBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsKKyAgICAgICAgCisgICAgICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImFkZF9mcndkIikpIHsKKyAgICAgICAgLyogUmVhZCBpbnB1dCAqLworICAgICAgICBzc2NhbmYoYnVmLCAiJXMgJXggJWQgJWQgJWQiLCBuYW1lMSwgJnYxLCAmdjIsICZ2MywgJnY0KTsKKworICAgICAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgICAgICAKKyAgICAgICAgcF9mcndkX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfZnJ3ZF9lbnRyeV9ieV9uYW1lKG5hbWUxKTsKKyAgICAgICAgaWYocF9mcndkX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoIkFscmVhZHkgaGFzIHRoZSBmcndkIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKworICAgICAgICBwX2Zyd2RfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9mcmVlX2Zyd2RfZW50cnkoKTsKKyAgICAgICAgaWYoIXBfZnJ3ZF9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJObyBmcmVlIGZyd2QgZW50cnlcbiIpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHN0cmNweShwX2Zyd2RfZW50cnktPm5hbWUsIG5hbWUxKTsKKyAgICAgICAgcF9mcndkX2VudHJ5LT5mcndkX2JtICAgICAgICAgICAgICA9IHYxOworICAgICAgICBwX2Zyd2RfZW50cnktPmZyd2RfdmFsdWUudHJnX3BvcnQgID0gdjI7CisgICAgICAgIHBfZnJ3ZF9lbnRyeS0+ZnJ3ZF92YWx1ZS50cmdfcXVldWUgPSB2MzsKKyAgICAgICAgcF9mcndkX2VudHJ5LT5mcndkX3ZhbHVlLmdlbV9wb3J0ICA9IHY0OworICAgICAgICAKKyAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGFkZCBmcndkIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOworCisgICAgICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgfSAgIAorICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOworCisKKworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfYXBwX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUiAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IENIQVIgKm5hbWUgID0gYXR0ci0+YXR0ci5uYW1lOworICAgIENIQVIgICAgICAgIG5hbWUxW0NQSF9TWVNGU19GSUVMRF9NQVhfTEVOKzFdOworICAgIENIQVIgICAgICAgIG5hbWUyW0NQSF9TWVNGU19GSUVMRF9NQVhfTEVOKzFdOworICAgIENIQVIgICAgICAgIG5hbWUzW0NQSF9TWVNGU19GSUVMRF9NQVhfTEVOKzFdOyAgICAKKyAgICBVTE9ORyAgICAgICBmbGFncyA9IDA7CisgICAgTVZfU1RBVFVTICAgcmMgICAgPSAgTVZfT0s7ICAgIAorICAgIENQSF9TWVNGU19QQVJTRV9UICpwX3BhcnNlX2VudHJ5ID0gTlVMTDsKKyAgICBDUEhfU1lTRlNfTU9EX1QgICAqcF9tb2RfZW50cnkgICA9IE5VTEw7ICAgIAorICAgIENQSF9TWVNGU19GUldEX1QgICpwX2Zyd2RfZW50cnkgID0gTlVMTDsKKyAgICBDUEhfU1lTRlNfTU9EX1QgICAgbW9kX2VudHJ5OyAgICAKKyAgICBDUEhfU1lTRlNfRlJXRF9UICAgZnJ3ZF9lbnRyeTsKKworICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIC8qIFJlYWQgaW5wdXQgKi8KKyAgICBzc2NhbmYoYnVmLCAiJXMgJXMgJXMiLCBuYW1lMSwgbmFtZTIsIG5hbWUzKTsKKworICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgCisgICAgaWYgKCFzdHJjbXAobmFtZSwgImFkZF9hcHBfcnVsZSIpKSB7CisgICAgICAgIHBfcGFyc2VfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9wYXJzZV9lbnRyeV9ieV9uYW1lKG5hbWUxKTsKKyAgICAgICAgaWYoIXBfcGFyc2VfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiYWRkX2FwcF9ydWxlOiBpbnZhbGlkIHBhcnNlIG5hbWUgPCVzPlxuIiwgbmFtZTEpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKyAgICAgICAgcF9tb2RfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9tb2RfZW50cnlfYnlfbmFtZShuYW1lMik7CisgICAgICAgIGlmKCFwX21vZF9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgbW9kIG5hbWUgPCVzPlxuIiwgbmFtZTIpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKyAgICAgICAgcF9mcndkX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfZnJ3ZF9lbnRyeV9ieV9uYW1lKG5hbWUzKTsKKyAgICAgICAgaWYoIXBfZnJ3ZF9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgZnJ3ZCBuYW1lIDwlcz5cbiIsIG5hbWUzKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9ICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgcmMgPSBjcGhfYWRkX2FwcF9ydWxlKHBfcGFyc2VfZW50cnktPnBhcnNlX2JtLCAmcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tb2RfZW50cnktPm1vZF9ibSwgJnBfbW9kX2VudHJ5LT5tb2RfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zyd2RfZW50cnktPmZyd2RfYm0sICZwX2Zyd2RfZW50cnktPmZyd2RfdmFsdWUpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBhZGQgYXBwIHJ1bGVcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBhZGQgYXBwIHJ1bGVcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImRlbF9hcHBfcnVsZSIpKSB7CisgICAgICAgIHBfcGFyc2VfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9wYXJzZV9lbnRyeV9ieV9uYW1lKG5hbWUxKTsKKyAgICAgICAgaWYoIXBfcGFyc2VfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiYWRkX2FwcF9ydWxlOiBpbnZhbGlkIHBhcnNlIG5hbWUgPCVzPlxuIiwgbmFtZTEpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJjID0gY3BoX2RlbF9hcHBfcnVsZShwX3BhcnNlX2VudHJ5LT5wYXJzZV9ibSwgJnBfcGFyc2VfZW50cnktPnBhcnNlX2tleSk7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGRlbGV0ZSBhcHAgcnVsZVxuIik7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIGRlbGV0ZSBhcHAgcnVsZVxuIik7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ1cGRhdGVfYXBwX3J1bGUiKSkgeworICAgICAgICBwX3BhcnNlX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfcGFyc2VfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmKCFwX3BhcnNlX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoImFkZF9hcHBfcnVsZTogaW52YWxpZCBwYXJzZSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9CisgICAgICAgIHBfbW9kX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfbW9kX2VudHJ5X2J5X25hbWUobmFtZTIpOworICAgICAgICBpZighcF9tb2RfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiYWRkX2FwcF9ydWxlOiBpbnZhbGlkIG1vZCBuYW1lIDwlcz5cbiIsIG5hbWUyKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9CisgICAgICAgIHBfZnJ3ZF9lbnRyeSA9IGNwaF9zeXNmc19maW5kX2Zyd2RfZW50cnlfYnlfbmFtZShuYW1lMyk7CisgICAgICAgIGlmKCFwX2Zyd2RfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiYWRkX2FwcF9ydWxlOiBpbnZhbGlkIGZyd2QgbmFtZSA8JXM+XG4iLCBuYW1lMyk7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfSAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgIHJjID0gY3BoX3VwZGF0ZV9hcHBfcnVsZShwX3BhcnNlX2VudHJ5LT5wYXJzZV9ibSwgJnBfcGFyc2VfZW50cnktPnBhcnNlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbW9kX2VudHJ5LT5tb2RfYm0sICZwX21vZF9lbnRyeS0+bW9kX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mcndkX2VudHJ5LT5mcndkX2JtLCAmcF9mcndkX2VudHJ5LT5mcndkX3ZhbHVlKTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gdXBkYXRlIGFwcCBydWxlXG4iKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gdXBkYXRlIGFwcCBydWxlXG4iKTsKKyAgICAgICAgfSAgICAgICAgICAKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZ2V0X2FwcF9ydWxlIikpIHsKKyAgICAgICAgcF9wYXJzZV9lbnRyeSA9IGNwaF9zeXNmc19maW5kX3BhcnNlX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZighcF9wYXJzZV9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgcGFyc2UgbmFtZSA8JXM+XG4iLCBuYW1lMSk7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorICAgICAgIAorICAgICAgICByYyA9IGNwaF9nZXRfYXBwX3J1bGUocF9wYXJzZV9lbnRyeS0+cGFyc2VfYm0sICZwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kX2VudHJ5Lm1vZF9ibSwgJm1vZF9lbnRyeS5tb2RfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJ3ZF9lbnRyeS5mcndkX2JtLCAmZnJ3ZF9lbnRyeS5mcndkX3ZhbHVlKTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9wYXJzZV9maWVsZChwX3BhcnNlX2VudHJ5LT5wYXJzZV9ibSwgJnBfcGFyc2VfZW50cnktPnBhcnNlX2tleSk7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9tb2RfZmllbGQobW9kX2VudHJ5Lm1vZF9ibSwgJm1vZF9lbnRyeS5tb2RfdmFsdWUpOworICAgICAgICAgICAgY3BoX2RiX2Rpc3BsYXlfZnJ3ZF9maWVsZChmcndkX2VudHJ5LmZyd2RfYm0sICZmcndkX2VudHJ5LmZyd2RfdmFsdWUpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiTm8gdmFsaWQgQ1BIIGFwcCBydWxlXG4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGVsX3BhcnNlIikpIHsKKyAgICAgICAgcmMgPSBjcGhfc3lzZnNfZGVsX3BhcnNlX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZiAocmMgPT0gVFJVRSkgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGRlbGV0ZSBwYXJzZSBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gZGVsZXRlIHBhcnNlIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImRlbF9tb2QiKSkgeworICAgICAgICByYyA9IGNwaF9zeXNmc19kZWxfbW9kX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZiAocmMgPT0gVFJVRSkgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGRlbGV0ZSBtb2QgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIGRlbGV0ZSBtb2QgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGVsX2Zyd2QiKSkgeworICAgICAgICByYyA9IGNwaF9zeXNmc19kZWxfZnJ3ZF9lbnRyeV9ieV9uYW1lKG5hbWUxKTsKKyAgICAgICAgaWYgKHJjID09IFRSVUUpIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBkZWxldGUgZnJ3ZCBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gZGVsZXRlIGZyd2QgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7CisgICAgICAgIH0gIAorICAgIH0gICAgCisgICAgZWxzZQorICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7CisKKyAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuIGxlbjsKK30KKworI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfdWRwX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUiAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IENIQVIgKm5hbWUgID0gYXR0ci0+YXR0ci5uYW1lOworICAgIFVJTlQzMiAgICAgIHYxICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2MiAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjMgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHY0ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2NSAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjYgICAgPSAwOworICAgIFVMT05HICAgICAgIGZsYWdzID0gMDsKKyAgICBNVl9TVEFUVVMgICByYyAgICA9ICBNVl9PSzsKKworICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIC8qIFJlYWQgaW5wdXQgKi8KKyAgICBzc2NhbmYoYnVmLCAiJWQgJWQgJXggJXggJXggJXgiLCAmdjEsICZ2MiwgJnYzLCAmdjQsICZ2NSwgJnY2KTsKKworICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgCisgICAgaWYgKCFzdHJjbXAobmFtZSwgInVkcF9zcmMiKSkgeworICAgICAgICByYyA9IGNwaF91ZHBfc3JjX3NwZWNfc2V0KHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBhZGQgVURQIHNyYyBydWxlXG4iKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gYWRkIFVEUCBzcmMgcnVsZVxuIik7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ1ZHBfZHN0IikpIHsKKyAgICAgICAgcmMgPSBjcGhfdWRwX2Rlc3Rfc3BlY19zZXQodjEsIHYyLCB2MywgdjQsIHY1LCB2Nik7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGFkZCBVRFAgZGVzdCBydWxlXG4iKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gYWRkIFVEUCBkZXN0IHJ1bGVcbiIpOworICAgICAgICB9ICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOworCisgICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybiBsZW47Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCitzdGF0aWMgc3NpemVfdCBjcGhfc3BlY19wcm9jX2Zsb3dfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQVIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgICBjb25zdCBDSEFSICAgICpuYW1lICA9IGF0dHItPmF0dHIubmFtZTsKKyAgICBVSU5UMzIgICAgICAgICB2MSAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjIgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYzICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2NCAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjUgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHY2ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2NyAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjggICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHY5ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MTAgICA9IDA7ICAgIAorICAgIFVJTlQzMiAgICAgICAgIHYxMSAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MTIgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjEzICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYxNCAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MTUgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjE2ICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYxNyAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MTggICA9IDA7IAorICAgIFVJTlQzMiAgICAgICAgIHYxOSAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MjAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjIxICAgPSAwOyAgIAorICAgIFVMT05HICAgICAgICAgIGZsYWdzID0gMDsKKyAgICBNVl9TVEFUVVMgICAgICByYyAgICA9ICBNVl9PSzsKKyAgICBDUEhfRkxPV19FTlRSWV9UIGNwaF9mbG93OworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgLyogUmVhZCBpbnB1dCAqLworICAgIHNzY2FuZihidWYsICIlZCAleCAleCAleCAleCAlZCAlZCAleCAlZCAlZCAlZCAleCAlZCAlZCAleCAlZCAlZCAlZCAlZCAlZCAlZCIsICZ2MSwgJnYyLCAmdjMsICZ2NCwgJnY1LCAmdjYsICZ2NywgJnY4LCAmdjksICZ2MTAsICZ2MTEsICZ2MTIsICZ2MTMsICZ2MTQsICZ2MTUsICZ2MTYsICZ2MTcsICZ2MTgsICZ2MTksICZ2MjAsICZ2MjEpOworCisgICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFICAgCisgICAgaWYgKCFzdHJjbXAobmFtZSwgImFkZF9mbG93X3J1bGUiKSkgeworICAgICAgICBtZW1zZXQoJmNwaF9mbG93LCAwLCBzaXplb2YoY3BoX2Zsb3cpKTsKKyAgICAgICAgY3BoX2Zsb3cuZGlyICAgICAgID0gKENQSF9ESVJfRSl2MTsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfYm0gID0gKENQSF9GTE9XX1BBUlNFX0UpdjI7CisgICAgICAgIGNwaF9mbG93Lm1oICAgICAgICA9IChVSU5UMTYpdjM7CisgICAgICAgIGNwaF9mbG93LmV0aF90eXBlICA9IChVSU5UMTYpdjQ7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS50cGlkICAgPSAoVUlOVDE2KXY1OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kudmlkICAgID0gKFVJTlQxNil2NjsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnBiaXRzICA9IChVSU5UOCl2NzsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnRwaWQgICA9IChVSU5UMTYpdjg7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS52aWQgICAgPSAoVUlOVDE2KXY5OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kucGJpdHMgID0gKFVJTlQ4KXYxMDsKKyAgICAgICAgY3BoX2Zsb3cub3BfdHlwZSAgICAgICAgICAgICAgICA9IChDUEhfVkxBTl9PUF9UWVBFX0UpdjExOyAgICAgICAgCisgICAgICAgIGNwaF9mbG93Lm1vZF9vdXRlcl90Y2kudHBpZCAgICAgPSAoVUlOVDE2KXYxMjsKKyAgICAgICAgY3BoX2Zsb3cubW9kX291dGVyX3RjaS52aWQgICAgICA9IChVSU5UMTYpdjEzOworICAgICAgICBjcGhfZmxvdy5tb2Rfb3V0ZXJfdGNpLnBiaXRzICAgID0gKFVJTlQ4KXYxNDsKKyAgICAgICAgY3BoX2Zsb3cubW9kX2lubmVyX3RjaS50cGlkICAgICA9IChVSU5UMTYpdjE1OworICAgICAgICBjcGhfZmxvdy5tb2RfaW5uZXJfdGNpLnZpZCAgICAgID0gKFVJTlQxNil2MTY7CisgICAgICAgIGNwaF9mbG93Lm1vZF9pbm5lcl90Y2kucGJpdHMgICAgPSAoVUlOVDgpdjE3OworICAgICAgICBjcGhfZmxvdy5wa3RfZnJ3ZC50cmdfcG9ydCAgICAgID0gKFVJTlQ4KXYxODsKKyAgICAgICAgY3BoX2Zsb3cucGt0X2Zyd2QudHJnX3F1ZXVlICAgICA9IChVSU5UOCl2MTk7CisgICAgICAgIGNwaF9mbG93LnBrdF9mcndkLnRyZ19od2ZfcXVldWUgPSAoVUlOVDgpdjIwOyAgICAgICAgCisgICAgICAgIGNwaF9mbG93LnBrdF9mcndkLmdlbV9wb3J0ICAgICAgPSAoVUlOVDE2KXYyMTsKKyAgICAgICAgCisgICAgICAgIHJjID0gY3BoX2Zsb3dfYWRkX3J1bGUoJmNwaF9mbG93KTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gYWRkIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gYWRkIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfSAgIAorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImRlbF9mbG93X3J1bGUiKSkgeworICAgICAgICBtZW1zZXQoJmNwaF9mbG93LCAwLCBzaXplb2YoY3BoX2Zsb3cpKTsKKyAgICAgICAgY3BoX2Zsb3cuZGlyICAgICAgID0gKENQSF9ESVJfRSl2MTsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfYm0gID0gKENQSF9GTE9XX1BBUlNFX0UpdjI7CisgICAgICAgIGNwaF9mbG93Lm1oICAgICAgICA9IChVSU5UMTYpdjM7CisgICAgICAgIGNwaF9mbG93LmV0aF90eXBlICA9IChVSU5UMTYpdjQ7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS50cGlkICAgPSAoVUlOVDE2KXY1OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kudmlkICAgID0gKFVJTlQxNil2NjsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnBiaXRzICA9IChVSU5UOCl2NzsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnRwaWQgICA9IChVSU5UMTYpdjg7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS52aWQgICAgPSAoVUlOVDE2KXY5OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kucGJpdHMgID0gKFVJTlQ4KXYxMDsKKyAgICAgICAgCisgICAgICAgIHJjID0gY3BoX2Zsb3dfZGVsX3J1bGUoJmNwaF9mbG93KTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gZGVsZXRlIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gZGVsZXRlIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKKyAgICAgICAgfSAgICAgICAgICAKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZ2V0X2Zsb3dfcnVsZSIpKSB7CisgICAgICAgIG1lbXNldCgmY3BoX2Zsb3csIDAsIHNpemVvZihjcGhfZmxvdykpOworICAgICAgICBjcGhfZmxvdy5kaXIgICAgICAgPSAoQ1BIX0RJUl9FKXYxOworICAgICAgICBjcGhfZmxvdy5wYXJzZV9ibSAgPSAoQ1BIX0ZMT1dfUEFSU0VfRSl2MjsKKyAgICAgICAgY3BoX2Zsb3cubWggICAgICAgID0gKFVJTlQxNil2MzsKKyAgICAgICAgY3BoX2Zsb3cuZXRoX3R5cGUgID0gKFVJTlQxNil2NDsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnRwaWQgICA9IChVSU5UMTYpdjU7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS52aWQgICAgPSAoVUlOVDE2KXY2OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kucGJpdHMgID0gKFVJTlQ4KXY3OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kudHBpZCAgID0gKFVJTlQxNil2ODsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnZpZCAgICA9IChVSU5UMTYpdjk7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS5wYml0cyAgPSAoVUlOVDgpdjEwOworICAgICAgICAgICAgCisgICAgICAgIHJjID0gY3BoX2Zsb3dfZ2V0X3J1bGUoJmNwaF9mbG93KTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gZ2V0IGZsb3cgcnVsZVxuIik7CisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIgICAgICAgICAgICAgICAgICAgICAgICB8UGFyc2Ugb3V0ZXIgICAgICAgfFBhcnNlIGlubmVyICAgICAgIHxNb2Qgb3V0ZXIgICAgICAgICB8TW9kIElubmVyICAgICAgICAgfEZvcndhcmRcbiIpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiZGlyIHBhcnNlX2JtIG1oICAgZXR5ICAgIHRwaWQgICB2aWQgIHBiaXRzICB0cGlkICAgdmlkICBwYml0cyAgdHBpZCAgIHZpZCAgcGJpdHMgIHRwaWQgICB2aWQgIHBiaXRzICBwb3J0IHF1ZXVlIGh3Zl9xdWV1ZSBnZW0gIG9wX3R5cGVcbiIpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAgCisgICAgICAgICAgICAgICAgICAgIiUyLjJzICAweCUwNHggICAlLTRkIDB4JTA0eCAweCUwNHggJTRkICUxZCAgICAgIDB4JTA0eCAlNGQgJTFkICAgICAgMHglMDR4ICU0ZCAlMWQgICAgICAweCUwNHggJTRkICUxZCAgICAgICUxZCAgICAlMWQgICAgICUxZCAgICAgICAgICU0ZCAlcyBcbiIsCisgICAgICAgICAgICAgICAgICAgY3BoX2FwcF9sb29rdXBfZGlyKGNwaF9mbG93LmRpciksIGNwaF9mbG93LnBhcnNlX2JtLCBjcGhfZmxvdy5taCwgY3BoX2Zsb3cuZXRoX3R5cGUsCisgICAgICAgICAgICAgICAgICAgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnRwaWQsIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS52aWQsIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS5wYml0cywgCisgICAgICAgICAgICAgICAgICAgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnRwaWQsIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS52aWQsIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS5wYml0cywKKyAgICAgICAgICAgICAgICAgICBjcGhfZmxvdy5tb2Rfb3V0ZXJfdGNpLnRwaWQsICAgY3BoX2Zsb3cubW9kX291dGVyX3RjaS52aWQsICAgY3BoX2Zsb3cubW9kX291dGVyX3RjaS5wYml0cywKKyAgICAgICAgICAgICAgICAgICBjcGhfZmxvdy5tb2RfaW5uZXJfdGNpLnRwaWQsICAgY3BoX2Zsb3cubW9kX2lubmVyX3RjaS52aWQsICAgY3BoX2Zsb3cubW9kX2lubmVyX3RjaS5wYml0cywKKyAgICAgICAgICAgICAgICAgICBjcGhfZmxvdy5wa3RfZnJ3ZC50cmdfcG9ydCwgICAgY3BoX2Zsb3cucGt0X2Zyd2QudHJnX3F1ZXVlLCAgY3BoX2Zsb3cucGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSwgY3BoX2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQsIAorICAgICAgICAgICAgICAgICAgIGNwaF9mbG93X2xvb2t1cF9vcF90eXBlKGNwaF9mbG93Lm9wX3R5cGUpKTsKKyAgICAgICAgICAgICAKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gZ2V0IGZsb3dcbiIpOworICAgICAgICB9CisgICAgfSAgIAorICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOworI2VuZGlmCisKKyAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY19kc2NwX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENIQVIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgICBjb25zdCBDSEFSICAgICAgKm5hbWUgPSBhdHRyLT5hdHRyLm5hbWU7CisgICAgVUlOVDMyICAgICAgICAgICB2WzY0XTsKKyAgICBVSU5UMzIgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICBVTE9ORyAgICAgICAgICAgIGZsYWdzID0gMDsKKyAgICBNVl9TVEFUVVMgICAgICAgIHJjICAgID0gIE1WX09LOyAgICAgCisgICAgQ1BIX0RTQ1BfUEJJVFNfVCBkc2NwX21hcDsKKworICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIC8qIFJlYWQgaW5wdXQgKi8KKyAgICBzc2NhbmYoYnVmLCAiJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgIiwKKyAgICAgICAgICAgJnZbMF0sICAmdlsxXSwgICZ2WzJdLCAgJnZbM10sICAmdls0XSwgICZ2WzVdLCAgJnZbNl0sICAmdls3XSwKKyAgICAgICAgICAgJnZbOF0sICAmdls5XSwgICZ2WzEwXSwgJnZbMTFdLCAmdlsxMl0sICZ2WzEzXSwgJnZbMTRdLCAmdlsxNV0sCisgICAgICAgICAgICZ2WzE2XSwgJnZbMTddLCAmdlsxOF0sICZ2WzE5XSwgJnZbMjBdLCAmdlsyMV0sICZ2WzIyXSwgJnZbMjNdLAorICAgICAgICAgICAmdlsyNF0sICZ2WzI1XSwgJnZbMjZdLCAmdlsyN10sICZ2WzI4XSwgJnZbMjldLCAmdlszMF0sICZ2WzMxXSwKKyAgICAgICAgICAgJnZbMzJdLCAmdlszM10sICZ2WzM0XSwgJnZbMzVdLCAmdlszNl0sICZ2WzM3XSwgJnZbMzhdLCAmdlszOV0sCisgICAgICAgICAgICZ2WzQwXSwgJnZbNDFdLCAmdls0Ml0sICZ2WzQzXSwgJnZbNDRdLCAmdls0NV0sICZ2WzQ2XSwgJnZbNDddLAorICAgICAgICAgICAmdls0OF0sICZ2WzQ5XSwgJnZbNTBdLCAmdls1MV0sICZ2WzUyXSwgJnZbNTNdLCAmdls1NF0sICZ2WzU1XSwKKyAgICAgICAgICAgJnZbNTZdLCAmdls1N10sICZ2WzU4XSwgJnZbNTldLCAmdls2MF0sICZ2WzYxXSwgJnZbNjJdLCAmdls2M10pOworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDY0OyBpbmRleCsrKSB7CisgICAgICAgIGRzY3BfbWFwLnBiaXRzW2luZGV4XSA9IChVSU5UOCl2W2luZGV4XTsKKyAgICB9CisgICAgZHNjcF9tYXAuaW5fdXNlID0gMTsKKworICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAic2V0X2RzY3BfbWFwIikpIHsgICAgCisgICAgICAgIHJjID0gY3BoX2Zsb3dfc2V0X2RzY3BfbWFwKCZkc2NwX21hcCk7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIHNldCBEU0NQIHRvIFAtYml0cyBtYXBwaW5nXG4iKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gc2V0IERTQ1AgdG8gUC1iaXRzIG1hcHBpbmdcbiIpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7CisKKyAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorCitzdGF0aWMgREVWSUNFX0FUVFIoaGVscCwgICAgICAgICAgICBTX0lSVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGhlbHBfYWRkLCAgICAgICAgU19JUlVTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzaG93X2FwcF9kYiwgICAgIFNfSVJVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2hvd19wYXJzZV9uYW1lLCBTX0lSVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHNob3dfbW9kX25hbWUsICAgU19JUlVTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzaG93X2Zyd2RfbmFtZSwgIFNfSVJVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7CisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRSAKK3N0YXRpYyBERVZJQ0VfQVRUUih1ZHBfcG9ydHMsICAgICAgIFNfSVJVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRQorc3RhdGljIERFVklDRV9BVFRSKHNob3dfZmxvd19ydWxlLCAgU19JUlVTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjbGVhcl9mbG93X3J1bGUsIFNfSVJVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsX2RzY3BfbWFwLCAgICBTX0lSVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIE5VTEwpOworI2VuZGlmCitzdGF0aWMgREVWSUNFX0FUVFIoc2V0X2NvbXBsZXgsICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfMl9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2V0X2ZsYWcsICAgICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfMl9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWRkX3BhcnNlLCAgICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfbmFtZV9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsX3BhcnNlLCAgICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfYXBwX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhZGRfbW9kLCAgICAgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19uYW1lX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxfbW9kLCAgICAgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19hcHBfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGFkZF9mcndkLCAgICAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX25hbWVfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGRlbF9mcndkLCAgICAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2FwcF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWRkX2FwcF9ydWxlLCAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfYXBwX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxfYXBwX3J1bGUsICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19hcHBfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9hcHBfcnVsZSwgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2FwcF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ2V0X2FwcF9ydWxlLCAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfYXBwX3N0b3JlKTsKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFIAorc3RhdGljIERFVklDRV9BVFRSKHVkcF9zcmMsICAgICAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX3VkcF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIodWRwX2RzdCwgICAgICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfdWRwX3N0b3JlKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCitzdGF0aWMgREVWSUNFX0FUVFIoYWRkX2Zsb3dfcnVsZSwgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfZmxvd19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsX2Zsb3dfcnVsZSwgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfZmxvd19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ2V0X2Zsb3dfcnVsZSwgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfZmxvd19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2V0X2RzY3BfbWFwLCAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfZHNjcF9zdG9yZSk7CisjZW5kaWYKK3N0YXRpYyBERVZJQ0VfQVRUUihzZXRfdGNvbnQsICAgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY18yX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0cmFjZV9sZXZlbCwgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY18xX3N0b3JlKTsKKworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY3BoX3NwZWNfcHJvY19hdHRyc1tdID0geworICAgICZkZXZfYXR0cl9oZWxwLmF0dHIsCisgICAgJmRldl9hdHRyX2hlbHBfYWRkLmF0dHIsCisgICAgJmRldl9hdHRyX3Nob3dfYXBwX2RiLmF0dHIsCisgICAgJmRldl9hdHRyX3Nob3dfcGFyc2VfbmFtZS5hdHRyLAorICAgICZkZXZfYXR0cl9zaG93X21vZF9uYW1lLmF0dHIsCisgICAgJmRldl9hdHRyX3Nob3dfZnJ3ZF9uYW1lLmF0dHIsCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRSAgICAgCisgICAgJmRldl9hdHRyX3VkcF9wb3J0cy5hdHRyLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKKyAgICAmZGV2X2F0dHJfc2hvd19mbG93X3J1bGUuYXR0ciwKKyAgICAmZGV2X2F0dHJfY2xlYXJfZmxvd19ydWxlLmF0dHIsCisgICAgJmRldl9hdHRyX2RlbF9kc2NwX21hcC5hdHRyLAorI2VuZGlmICAgIAorICAgICZkZXZfYXR0cl9zZXRfY29tcGxleC5hdHRyLAorICAgICZkZXZfYXR0cl9zZXRfZmxhZy5hdHRyLAorICAgICZkZXZfYXR0cl9hZGRfcGFyc2UuYXR0ciwKKyAgICAmZGV2X2F0dHJfZGVsX3BhcnNlLmF0dHIsCisgICAgJmRldl9hdHRyX2FkZF9tb2QuYXR0ciwKKyAgICAmZGV2X2F0dHJfZGVsX21vZC5hdHRyLAorICAgICZkZXZfYXR0cl9hZGRfZnJ3ZC5hdHRyLAorICAgICZkZXZfYXR0cl9kZWxfZnJ3ZC5hdHRyLAorICAgICZkZXZfYXR0cl9hZGRfYXBwX3J1bGUuYXR0ciwgICAgCisgICAgJmRldl9hdHRyX2RlbF9hcHBfcnVsZS5hdHRyLAorICAgICZkZXZfYXR0cl91cGRhdGVfYXBwX3J1bGUuYXR0ciwKKyAgICAmZGV2X2F0dHJfZ2V0X2FwcF9ydWxlLmF0dHIsCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRSAgICAgICAKKyAgICAmZGV2X2F0dHJfdWRwX3NyYy5hdHRyLAorICAgICZkZXZfYXR0cl91ZHBfZHN0LmF0dHIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRQorICAgICZkZXZfYXR0cl9hZGRfZmxvd19ydWxlLmF0dHIsCisgICAgJmRldl9hdHRyX2RlbF9mbG93X3J1bGUuYXR0ciwKKyAgICAmZGV2X2F0dHJfZ2V0X2Zsb3dfcnVsZS5hdHRyLAorICAgICZkZXZfYXR0cl9zZXRfZHNjcF9tYXAuYXR0ciwKKyNlbmRpZgorICAgICZkZXZfYXR0cl9zZXRfdGNvbnQuYXR0ciwKKyAgICAmZGV2X2F0dHJfdHJhY2VfbGV2ZWwuYXR0ciwKKworICAgIE5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNwaF9zcGVjX3Byb2NfZ3JvdXAgPSB7CisgICAgLm5hbWUgPSAicHJvdG8iLAorICAgIC5hdHRycyA9IGNwaF9zcGVjX3Byb2NfYXR0cnMsCit9OworCitJTlQzMiBjcGhfc3lzZnNfaW5pdChWT0lEKQoreworICAgIElOVDMyICAgICAgICAgIGVyciA9IDA7CisgICAgc3RydWN0IGRldmljZSAqcGQgID0gTlVMTDsKKworICAgIHBkID0gYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCAiY3BoIik7CisgICAgaWYgKCFwZCkgeworICAgICAgICBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJjcGgiLCAtMSwgTlVMTCwgMCk7CisgICAgICAgIHBkID0gYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCAiY3BoIik7CisgICAgfQorCisgICAgaWYgKCFwZCkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIiJXM6IGNhbm5vdCBmaW5kIGNwaCBkZXZpY2VcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHBkID0gJnBsYXRmb3JtX2J1czsKKyAgICB9CisKKyAgICBlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkLT5rb2JqLCAmY3BoX3NwZWNfcHJvY19ncm91cCk7CisgICAgaWYgKGVycikgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzeXNmcyBncm91cCBmYWlsZWQgJWRcbiIsIGVycik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIEluaXQgQ1BIIFNZUyBGUyBkYXRhIGJhc2UgdG8gaG9sZCBwYXJzZS9tb2QvZnJ3ZCB2YWx1ZXMgKi8KKyAgICBjcGhfc3lzZnNfaW5pdF9wYXJzZV9kYigpOworICAgIGNwaF9zeXNmc19pbml0X21vZF9kYigpOyAgICAKKyAgICBjcGhfc3lzZnNfaW5pdF9mcndkX2RiKCk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICI9IENVU1QgTW9kdWxlIFNZUyBGUyBpbml0IHN1Y2Nlc3NmdWxseSA9XG4iKTsKK291dDoKKyAgICByZXR1cm4gZXJyOworfQorCitWT0lEIGNwaF9zeXNmc19leGl0KFZPSUQpCit7CisgICAgc3RydWN0IGRldmljZSAqcGQgPSBOVUxMOworCisgICAgcGQgPSBidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsICJjcGgiKTsKKyAgICBpZiAoIXBkKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSIiVzOiBjYW5ub3QgZmluZCBDUEggZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZC0+a29iaiwgJmNwaF9zcGVjX3Byb2NfZ3JvdXApOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiPSBDUEggTW9kdWxlIFNZUyBGUyBleGl0IHN1Y2Nlc3NmdWxseSA9XG4iKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9zeXNmcy5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX3N5c2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTgzYTE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9zeXNmcy5oCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX3N5c2ZzLmgKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgc3lzZnMgY29tbWFuZCBkZWZpbml0aW9uCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAxMURlYzIwMTEKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMQorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX01WX0NQSF9TWVNGU19IXworI2RlZmluZSBfTVZfQ1BIX1NZU0ZTX0hfCisgICAgCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4gICAoMzIpCisjZGVmaW5lIENQSF9TWVNGU19GSUVMRF9NQVhfRU5UUlkgKDY0KQorCisKKy8qIENvbW1vbiBEQiBzdHJ1Y3R1cmUgZm9yIGVudHJpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgIElOVDMyICBtYXhfZW50cnlfbnVtOworICAgIElOVDMyICBlbnRyeV9udW07CisgICAgSU5UMzIgIGVudHJ5X3NpemU7CisgICAgVk9JRCAgKmVudHJ5X2FyYTsKK30gQ1BIX1NZU0ZTX1JVTEVfVDsKKworLyogUGFyc2luZyBmaWxlZCBlbnRyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0hBUiAgICAgICAgICAgICAgICAgIG5hbWVbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4rMV07CisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtOworICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICBwYXJzZV9rZXk7Cit9IENQSF9TWVNGU19QQVJTRV9UOworCisvKiBNb2RpZmljYXRpb24gZmlsZWQgZW50cnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgIENIQVIgICAgICAgICAgICAgICAgICBuYW1lW0NQSF9TWVNGU19GSUVMRF9NQVhfTEVOKzFdOworICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm07IAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICBtb2RfdmFsdWU7Cit9IENQSF9TWVNGU19NT0RfVDsKKworLyogRm9yd2FyZGluZyBmaWxlZCBlbnRyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0hBUiAgICAgICAgICAgICAgICAgIG5hbWVbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4rMV07CisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm07CisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgIGZyd2RfdmFsdWU7Cit9IENQSF9TWVNGU19GUldEX1Q7CisKKworSU5UMzIgY3BoX3N5c2ZzX2luaXQoVk9JRCk7CitWT0lEIGNwaF9zeXNmc19leGl0KFZPSUQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX01WX0NQSF9TWVNGU19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L0tjb25maWcgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTJjNmE0Mi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLW1lbnUgIlNvQyBDVVNUIHN1cHBvcnQiCi1kZXBlbmRzIG9uIE1WX0lOQ0xVREVfQ1VTVAotCi1jb25maWcgIE1WX0NVU1QKLSAgICAgICAgYm9vbCAiU3VwcG9ydCBmb3IgTWFydmVsbCBDdXN0b21lciBEcml2ZXIiCi0gICAgICAgIGRlZmF1bHQgeQotICAgICAgICAtLS1oZWxwLS0tCi0KLWNvbmZpZyAgTVZfQ1VTVF9JR01QX0hBTkRMRQotICAgICAgICBib29sICJFbmFibGUgTVZfQ1VTVCBJR01QIGhhbmRsaW5nIgotICAgICAgICBkZWZhdWx0IHkKLSAgICAgICAgLS0taGVscC0tLQotCi1jb25maWcgIE1WX0NVU1RfTUxEX0hBTkRMRQotICAgICAgICBib29sICJFbmFibGUgTVZfQ1VTVCBNTEQgaGFuZGxpbmciCi0gICAgICAgIGRlZmF1bHQgeQotICAgICAgICAtLS1oZWxwLS0tCi0KLWNvbmZpZyAgTVZfQ1VTVF9MUEJLX0RFVEVDVF9IQU5ETEUKLSAgICAgICAgYm9vbCAiRW5hYmxlIE1WX0NVU1QgVU5JIGxvb3BiYWNrIGRldGVjdCBoYW5kbGluZyIKLSAgICAgICAgZGVmYXVsdCB5Ci0gICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgCi1jb25maWcgIE1WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUKLSAgICAgICAgYm9vbCAiRW5hYmxlIE1WX0NVU1Qgc2FtcGxlIFVEUCBoYW5kbGluZyIKLSAgICAgICAgZGVmYXVsdCBuCi0gICAgICAgIC0tLWhlbHAtLS0KLQotY29uZmlnICBNVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgICAgICBib29sICJFbmFibGUgTVZfQ1VTVCBmbG93IG1hcHBpbmcgaGFuZGxpbmciCi0gICAgICAgIGRlZmF1bHQgeQotICAgICAgICAtLS1oZWxwLS0tICAgICAgICAKLQotZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L01ha2VmaWxlIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZmQyOGIwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBNYXJ2ZWxsIEN1c3RvbWVyIGRyaXZlcgotIwotCi1pZmVxICgkKENPTkZJR19BUkNIX0ZFUk9DRU9OKSx5KQotCWluY2x1ZGUgJChzcmN0cmVlKS8kKE1BQ0hJTkUpL2NvbmZpZy9tdlJ1bGVzLm1rCi1lbmRpZgotCi1pZmRlZiBDT05GSUdfTVZfSEFMX1JVTEVTX1BBVEgKLWluY2x1ZGUgJChzcmN0cmVlKS9pbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYKLWluY2x1ZGUgJChzcmN0cmVlKS8kKHN1YnN0ICIsLCQoQ09ORklHX01WX0hBTF9SVUxFU19QQVRIKSkKLWVuZGlmCi0KLUNVU1RfT0JKUyArPSAJbXZfY3VzdF9kZXYubyBcCi0JCW12X2N1c3RfbW9kLm8gXAotCQltdl9jdXN0X2Zsb3dfbWFwLm8gXAotCQltdl9jdXN0X25ldGRldi5vIFwKLQkJbXZfY3VzdF9zeXNmcy5vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotbXZfY3VzdC1vYmpzIDo9ICQoQ1VTVF9PQkpTKQotb2JqLSQoQ09ORklHX01WX0NVU1QpICs9IG12X2N1c3QubwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9kZXYuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Rldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOWY5M2FjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCi0qIAotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKiAKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X2Rldi5jCi0qCi0qIERFU0NSSVBUSU9OOgotKiAgICAgICAKLSogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvY2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLQotI2luY2x1ZGUgIm12X2N1c3RfZGV2LmgiCi0jaW5jbHVkZSAibXZfY3VzdF9uZXRkZXYuaCIKLSNpbmNsdWRlICJtdl9jdXN0X2Zsb3dfbWFwLmgiCi0jaW5jbHVkZSAibXZfY3VzdF9tbmdfaWYuaCIKLQotCi0vKiBVc2VkIHRvIHByZXZlbnQgbXVsdGlwbGUgYWNjZXNzIHRvIGRldmljZSAqLwotc3RhdGljIGludCAgICAgICAgICAgICAgIG12Y3VzdF9kZXZpY2Vfb3BlbiA9IDA7Ci1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbXZjdXN0X21pc2NfZGV2OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICBtdmN1c3RfZGV2X29wZW4KLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBleGVjdXRlIGRldmljZSBvcGVuIGFjdGlvbnMKLSoqCi0qKiAgUEFSQU1FVEVSUzogIAotKiogICAgICAgICAgICAgICAKLSoqICAgICAgICAgICAgICAgCi0qKiAgICAgICAgICAgICAgIAotKioKLSoqICBPVVRQVVRTOiAgICAgTm9uZQotKioKLSoqICBSRVRVUk5TOiAgICAgKDApCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgbXZjdXN0X2Rldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCU1WQ1VTVF9ERUJVR19QUklOVCgiRW50ZXIiKTsKLQotICAgLy8gaWYgKG12Y3VzdF9kZXZpY2Vfb3BlbiA+IDApCi0gICAvLyAgICAgcmV0dXJuIC1FQlVTWTsKLQotCW12Y3VzdF9kZXZpY2Vfb3BlbisrOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogIG12Y3VzdF9kZXZfcmVsZWFzZQotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGV4ZWN1dGUgZGV2aWNlIHJlbGVhc2UgYWN0aW9ucwotKioKLSoqICBQQVJBTUVURVJTOiAgCi0qKiAgICAgICAgICAgICAgIAotKiogICAgICAgICAgICAgICAKLSoqICAgICAgICAgICAgICAgCi0qKgotKiogIE9VVFBVVFM6ICAgICBOb25lCi0qKgotKiogIFJFVFVSTlM6ICAgICAoMCkKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBtdmN1c3RfZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0gICAgTVZDVVNUX0RFQlVHX1BSSU5UKCJFbnRlciIpOwotCi0gICAvLyBpZiAobXZjdXN0X2RldmljZV9vcGVuID4gMCkKLSAgIC8vICAgICBtdmN1c3RfZGV2aWNlX29wZW4tLTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICBtdl9jdXN0X2Rldl9pb2N0bAotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGV4ZWN1dGUgSU8gY29tbWFuZHMKLSoqCi0qKiAgUEFSQU1FVEVSUzogIHN0cnVjdCBpbm9kZSAqaW5vZGUKLSoqICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgKmZpbHAKLSoqICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZAotKiogICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZwotKioKLSoqICBPVVRQVVRTOiAgICAgTm9uZQotKioKLSoqICBSRVRVUk5TOiAgICAgKDApCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgbXZjdXN0X2Rldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0gICAgbXZfY3VzdF9pb2N0bF9vbWNpX3NldF90ICAgICAgY3VzdF9vbWNpX3NldDsKLSAgICBtdl9jdXN0X2lvY3RsX2xsaWRfc2V0X3QgICAgICBjdXN0X2xsaWRfc2V0OwotICAgIG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAgICAgIGN1c3RfZmxvd19tYXA7Ci0gICAgbXZfY3VzdF9pb2N0bF9kc2NwX21hcF90ICAgICAgY3VzdF9kc2NwX21hcDsKLSAgICBtdl9jdXN0X2lvY3RsX2FwcF9ldHlwZV90ICAgICBjdXN0X2FwcF9ldHlwZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmM7Ci0KLSAgaW50ICByZXQgPSAtRUlOVkFMOwotCi0gICAgTVZDVVNUX0RFQlVHX1BSSU5UKCJFbnRlciIpOwotCi0gIHN3aXRjaChjbWQpCi0gIHsKLSAgICAgIGNhc2UgTVZfQ1VTVF9JT0NUTF9PTUNJX1NFVDoKLQotICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjdXN0X29tY2lfc2V0LCAobXZfY3VzdF9pb2N0bF9vbWNpX3NldF90KilhcmcsIHNpemVvZihtdl9jdXN0X2lvY3RsX29tY2lfc2V0X3QpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICByYyA9IG12X2N1c3Rfb21jaV9zZXQoY3VzdF9vbWNpX3NldC50Y29udCwgY3VzdF9vbWNpX3NldC50eHEsIGN1c3Rfb21jaV9zZXQuZ2VtcG9ydCwgY3VzdF9vbWNpX3NldC5rZWVwX3J4X21oKTsKLSAgICAgICAgICBpZiAocmMgIT0gMCkgewotICAgICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJtdl9jdXN0X29tY2lfc2V0IGZhaWxlZFxuIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTVZfQ1VTVF9JT0NUTF9PTUNJX0VOQUJMRToKLQotICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZlbmFibGUsIChpbnQgKilhcmcsIHNpemVvZihpbnQpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbXZfY3VzdF9hcHBfZmxhZ19zZXQoTVZfQ1VTVF9BUFBfVFlQRV9PTUNJLCBlbmFibGUpOwotICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTVZfQ1VTVF9JT0NUTF9FT0FNX0VOQUJMRToKLQotICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZlbmFibGUsIChpbnQgKilhcmcsIHNpemVvZihpbnQpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbXZfY3VzdF9hcHBfZmxhZ19zZXQoTVZfQ1VTVF9BUFBfVFlQRV9PQU0sIGVuYWJsZSk7Ci0gICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX0VPQU1fTExJRF9TRVQ6Ci0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmN1c3RfbGxpZF9zZXQsIChpbnQgKilhcmcsIHNpemVvZihtdl9jdXN0X2lvY3RsX2xsaWRfc2V0X3QpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtdl9jdXN0X2VvYW1fbGxpZF9zZXQoY3VzdF9sbGlkX3NldC5sbGlkLCAmKGN1c3RfbGxpZF9zZXQubGxpZF9tYWNbMF0pLCBjdXN0X2xsaWRfc2V0LnR4cSk7Ci0gICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX01BUF9SVUxFX1NFVDoKLSAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3VzdF9mbG93X21hcCwgKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHJldCA9IG12X2N1c3RfbWFwX3J1bGVfc2V0KCZjdXN0X2Zsb3dfbWFwKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX0RTQ1BfTUFQX1NFVDoKLSAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3VzdF9kc2NwX21hcCwgKG12X2N1c3RfaW9jdGxfZHNjcF9tYXBfdCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfZHNjcF9tYXBfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHJldCA9IG12X2N1c3RfZHNjcF9tYXBfc2V0KCZjdXN0X2RzY3BfbWFwLmRzY3BfbWFwKTsKLSAgICAgICAgICBicmVhazsgICAgICAgICAgCi0KLSAgICAgIGNhc2UgTVZfQ1VTVF9JT0NUTF9NQVBfUlVMRV9ERUw6Ci0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmN1c3RfZmxvd19tYXAsIChtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgKilhcmcsIHNpemVvZihtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICByZXQgPSBtdl9jdXN0X21hcF9ydWxlX2RlbCgodWludDE2X3QpY3VzdF9mbG93X21hcC52aWQsICh1aW50OF90KWN1c3RfZmxvd19tYXAucGJpdHMsIGN1c3RfZmxvd19tYXAuZGlyKTsKLSAgICAgICAgICBicmVhazsgCi0KLSAgICAgIGNhc2UgTVZfQ1VTVF9JT0NUTF9EU0NQX01BUF9ERUw6Ci0KLSAgICAgICAgICByZXQgPSBtdl9jdXN0X2RzY3BfbWFwX2RlbCgpOwotICAgICAgICAgIGJyZWFrOyAKLSAgICAgICAgICAKLSAgICAgIGNhc2UgTVZfQ1VTVF9JT0NUTF9NQVBfUlVMRV9DTEVBUjoKLSAgICAgIAotICAgICAgICAgIHJldCA9IG12X2N1c3RfbWFwX3J1bGVfY2xlYXIoKTsKLSAgICAgICAgICBicmVhazsgCi0gICAgICAgICAgCi0gICAgICBjYXNlIE1WX0NVU1RfSU9DVExfVEFHX01BUF9SVUxFX0dFVDoKLSAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3VzdF9mbG93X21hcCwgKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLSAgICAgIAotICAgICAgICAgIHJldCA9IG12X2N1c3RfdGFnX21hcF9ydWxlX2dldCgmY3VzdF9mbG93X21hcCk7Ci0KLSAgICAgICAgICBpZihyZXQgIT0gTVZfQ1VTVF9PSykKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0KLSAgICAgICAgICBpZihjb3B5X3RvX3VzZXIoKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCopYXJnLCAmY3VzdF9mbG93X21hcCwgc2l6ZW9mKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgY29weV90b191c2VyIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTVZfQ1VTVF9JT0NUTF9VTlRBR19NQVBfUlVMRV9HRVQ6Ci0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmN1c3RfZmxvd19tYXAsIChtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgKilhcmcsIHNpemVvZihtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLSAgICAgICAgICB9Ci0gICAgICAKLSAgICAgICAgICByZXQgPSBtdl9jdXN0X3VudGFnX21hcF9ydWxlX2dldCgmY3VzdF9mbG93X21hcCk7Ci0KLSAgICAgICAgICBpZihyZXQgIT0gTVZfQ1VTVF9PSykKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0KLSAgICAgICAgICBpZihjb3B5X3RvX3VzZXIoKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCopYXJnLCAmY3VzdF9mbG93X21hcCwgc2l6ZW9mKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgY29weV90b191c2VyIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgTVZfQ1VTVF9JT0NUTF9BUFBfRVRIX1RZUEVfU0VUOgotICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjdXN0X2FwcF9ldHlwZSwgKG12X2N1c3RfaW9jdGxfYXBwX2V0eXBlX3QgKilhcmcsIHNpemVvZihtdl9jdXN0X2lvY3RsX2FwcF9ldHlwZV90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgTVZDVVNUX0VSUl9QUklOVCgiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbXZfY3VzdF9hcHBfZXR5cGVfc2V0KGN1c3RfYXBwX2V0eXBlLmFwcF90eXBlLCBjdXN0X2FwcF9ldHlwZS5ldGhfdHlwZSk7XAotICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgICAgYnJlYWs7IAotCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldCA9IC1FSU5WQUw7Ci0gIH0KLQotaW9jdGxFcnI6Ci0gICAgcmV0dXJuKHJldCk7Ci19Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbXZjdXN0X2Rldl9mb3BzID0gCi17Ci0JLm9wZW4gICAgPSBtdmN1c3RfZGV2X29wZW4sCi0JLnJlbGVhc2UgPSBtdmN1c3RfZGV2X3JlbGVhc2UsCi0JLmlvY3RsICAgPSBtdmN1c3RfZGV2X2lvY3RsLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgbXZjdXN0X2Rldl9pbml0Ci0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIERFU0NSSVBUSU9OOiAKLSoqCi0qKiAgUEFSQU1FVEVSUzogIAotKiogICAgICAgICAgICAgICAKLSoqICAgICAgICAgICAgICAgCi0qKiAgICAgICAgICAgICAgIAotKioKLSoqICBPVVRQVVRTOiAgICAgTm9uZQotKioKLSoqICBSRVRVUk5TOiAgICAgKDApCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludDMyX3QgbXZjdXN0X2Rldl9pbml0KHZvaWQpCi17Ci0gICAgaW50IHJjOwotCi0gICAgTVZDVVNUX0RFQlVHX1BSSU5UKCJFbnRlciIpOwotICAgIAotICAgIG12Y3VzdF9taXNjX2Rldi5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUjsKLSAgICBtdmN1c3RfbWlzY19kZXYubmFtZSAgPSBNVkNVU1RfREVWSUNFX05BTUU7Ci0gICAgbXZjdXN0X21pc2NfZGV2LmZvcHMgID0gJm12Y3VzdF9kZXZfZm9wczsKLQotICAgIHJjID0gbWlzY19yZWdpc3RlcigmbXZjdXN0X21pc2NfZGV2KTsKLSAgICBpZiAocmMgIT0gMCkgCi0gICAgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJyYz0lZCIscmMpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgcmMgPSBtdmN1c3RfbmV0ZGV2X2luaXQoKTsKLSAgICBpZiAocmMgIT0gMCkgCi0gICAgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJyYz0lZCIscmMpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgcmMgPSBtdmN1c3Rfc3lzZnNfaW5pdCgpOwotICAgIGlmIChyYyAhPSAwKSAKLSAgICB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoInJjPSVkIixyYyk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICBwcmludGsoIk1WQ1VTVDogbWlzYyBkZXZpY2UgJXMgcmVnaXN0ZXJlZCB3aXRoIG1pbm9yOiAlZFxuIiwgTVZDVVNUX0RFVklDRV9OQU1FLCBtdmN1c3RfbWlzY19kZXYubWlub3IpOwotICAgIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogIG12Y3VzdF9kZXZfc2h1dGRvd24KLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgREVTQ1JJUFRJT046IAotKioKLSoqICBQQVJBTUVURVJTOiAgCi0qKiAgICAgICAgICAgICAgIAotKiogICAgICAgICAgICAgICAKLSoqICAgICAgICAgICAgICAgCi0qKgotKiogIE9VVFBVVFM6ICAgICBOb25lCi0qKgotKiogIFJFVFVSTlM6ICAgICAoMCkKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBtdmN1c3RfZGV2X3NodXRkb3duKHZvaWQpCi17Ci0JTVZDVVNUX0RFQlVHX1BSSU5UKCJFbnRlciIpOwotCi0gICAgbXZjdXN0X3N5c2ZzX2RlbGV0ZSgpOwotCi0gICAgbWlzY19kZXJlZ2lzdGVyKCZtdmN1c3RfbWlzY19kZXYpOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Rldi5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZGV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0MjUwM2MuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoQykgMjAxMCwgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KLSogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSoKLSogSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgotKiBtb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKLSogUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCi0qIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKLSogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgotKiBvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KLSoKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X2Rldi5oCi0qCi0qIERFU0NSSVBUSU9OOgotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX01WX0NVU1RfREVWX0hfXwotI2RlZmluZSBfX01WX0NVU1RfREVWX0hfXwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0jZGVmaW5lIE1WX0NVU1RfVkVSU0lPTiAgICAgIlYyLjYuMjUiCi0jZGVmaW5lIE1WQ1VTVF9ERVZJQ0VfTkFNRSAgImN1c3QiCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfTUFHSUMgKCdDJykKLQotI2lmZGVmIE1WX0NVU1RfREVCVUcKLSNkZWZpbmUgTVZDVVNUX0RFQlVHX1BSSU5UKGZvcm1hdCwgLi4uKSAgIHByaW50aygiJXMoJWQpOiAgImZvcm1hdCxfX0ZVTkNUSU9OX18sX19MSU5FX18sICMjX19WQV9BUkdTX18pCi0jZWxzZQotI2RlZmluZSBNVkNVU1RfREVCVUdfUFJJTlQoZm9ybWF0LCAuLi4pCi0jZW5kaWYKLQotI2RlZmluZSBNVkNVU1RfRVJSX1BSSU5UKGZvcm1hdCwgLi4uKSAgICAgcHJpbnRrKCIlcyglZCkgRVJST1I6ICAiZm9ybWF0LF9fRlVOQ1RJT05fXyxfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXykKLQotZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBwbGF0Zm9ybV9idXNfdHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gcHJvdG90eXBlcyAtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludDMyX3QgbXZjdXN0X2Rldl9pbml0ICAgICAgICAodm9pZCk7Ci12b2lkICAgIG12Y3VzdF9kZXZfc2h1dGRvd24gICAgKHZvaWQpOwotCi1pbnQgICAgIG12Y3VzdF9uZXRkZXZfaW5pdCAgICAgKHZvaWQpOwotaW50ICAgICBtdmN1c3Rfc3lzZnNfaW5pdCAgICAgICh2b2lkKTsKLXZvaWQgICAgbXZjdXN0X3N5c2ZzX2RlbGV0ZSAgICAodm9pZCk7Ci0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRQotdm9pZCAgICBtdl9jdXN0X3VkcF9zcGVjX3ByaW50X2FsbCAodm9pZCk7Ci0jZW5kaWYKLXZvaWQgICAgbXZfY3VzdF9kZWJ1Z19pbmZvX3NldCAgICAgKGludCB2YWwpOwotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi12b2lkIG12X2N1c3RfZmxvd19tYXBfcHJpbnQodm9pZCk7Ci0KLSNlbmRpZgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKl9fTVZfQ1VTVF9ERVZfSF9fKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Zsb3dfbWFwLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9mbG93X21hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NzczM2U5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Zsb3dfbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgotKgotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKgotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3RfZmxvd19tYXAuYwotKgotKiBERVNDUklQVElPTjoKLSogICBWaWN0b3IgIC0gaW5pdGlhbCB2ZXJzaW9uIGNyZWF0ZWQuICAgMTIvRGVjLzIwMTEgCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPG12Q29tbW9uLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2lwdjYuaD4KLQotI2luY2x1ZGUgPG12T3MuaD4KLSNpbmNsdWRlIDxjdHJsRW52L212Q3RybEVudkxpYi5oPgotCi0jaW5jbHVkZSAibXZfY3VzdF9kZXYuaCIKLSNpbmNsdWRlICJtdl9jdXN0X25ldGRldi5oIgotI2luY2x1ZGUgIm12X2N1c3RfZmxvd19tYXAuaCIKLSNpbmNsdWRlICJtdl9jdXN0X21uZ19pZi5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBEYXRhIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIG12X2N1c3RfdmlkX2luZGV4X3QgIGdzX3ZpZF9pbmRleF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX05VTV07Ci1zdGF0aWMgbXZfY3VzdF9wYml0c19tYXBfdCAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfTlVNXVtNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRV07Ci1zdGF0aWMgbXZfY3VzdF9kc2NwX3BiaXRzX3QgZ3NfZHNjcF9tYXBfdGFibGU7Ci0KLXN0YXRpYyB1aW50MzJfdCBnc19tdl9jdXN0X3RyYWNlX2ZsYWcgPSAwOwotCi0vKiBEZWZpbmVkIHRvIHN1cHBvcnQgVC1DT05UIHN0YXRlICovCi1zdGF0aWMgYm9vbCBnc190Y29udF9zdGF0ZVtDUEhfTUFYX1RDT05UX05VTV07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBEZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3Rfc2V0X3RyYWNlX2ZsYWcKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBtdl9jdXN0IHRyYWNlIGZsYWcuCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBlblRyYWNlICAgICAtIEVuYWJsZSBvciBkaXNhYmxlIG12X2N1c3QgdHJhY2UuCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKLWludCBtdl9jdXN0X3NldF90cmFjZV9mbGFnKHVpbnQzMl90IGVuVHJhY2UpCi17Ci0gICAgZ3NfbXZfY3VzdF90cmFjZV9mbGFnID0gZW5UcmFjZTsKLSAgICAKLSAgICByZXR1cm4gTVZfQ1VTVF9PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X3ZhbGlkX3BiaXRzX3RhYmxlX2dldAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXRzIGF2YWlsYWJsZSBQLWJpdHMgbWFwcGluZyB0YWJsZS4KLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIE5vbmUuCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBBdmFpbGFibGUgUC1iaXRzIG1hcHBpbmcgdGFibGUgaW5kZXguICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKLXVpbnQzMl90IG12X2N1c3RfdmFsaWRfcGJpdHNfdGFibGVfZ2V0KG12X2N1c3RfZmxvd19kaXJfZSBkaXIpCi17Ci0gICAgdWludDMyX3QgdGFibGVfaWR4ID0gMDsKLQotICAgIC8qIFRhYmxlIGluZGV4IE1WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFIGlzIHJlc2VydmVkIGZvciB0YWdnZWQgZGVmYXVsdCBwYWNrZXRzICovCi0gICAgZm9yICh0YWJsZV9pZHg9MDsgdGFibGVfaWR4PE1WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFLTE7IHRhYmxlX2lkeCsrKSB7Ci0gICAgCi0gICAgICAgaWYgKGdzX3BiaXRzX21hcF90YWJsZVtkaXJdW3RhYmxlX2lkeF0uaW5fdXNlID09IDApCi0gICAgICAgICAgIHJldHVybiB0YWJsZV9pZHg7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBNVl9DVVNUX0lOVkFMSURfUEJJVFNfVEFCTEVfSU5ERVg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9wYml0c190YWJsZV9zdGF0dXNfZ2V0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGdldHMgUC1iaXRzIG1hcHBpbmcgdGFibGUgc3RhdHVzLgotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgcGJpdHNfbWFwICAgLSBQLWJpdHMgbWFwcGluZyB0YWJsZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIDA6Tm8gUC1iaXRzIG1hcHBpbmcgcnVsZSBleGlzdCBpbiBjdXJyZW50IHRhYmxlLCAxOiBzdGlsbCBleGlzdHMgUC1iaXRzIG1hcHBpbmcgcnVsZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAotdWludDMyX3QgbXZfY3VzdF9wYml0c190YWJsZV9zdGF0dXNfZ2V0KG12X2N1c3RfcGJpdHNfbWFwX3QgKnBiaXRzX21hcCkKLXsKLSAgICB1aW50MzJfdCBwYml0c19pZHggPSAwOwotCi0gICAgZm9yIChwYml0c19pZHg9MDsgcGJpdHNfaWR4PE1WX0NVU1RfUEJJVFNfTUFQX01BWF9FTlRSWV9OVU07IHBiaXRzX2lkeCsrKSB7Ci0gICAgCi0gICAgICAgaWYgKHBiaXRzX21hcC0+cGt0X2Z3ZFtwYml0c19pZHhdLmluX3VzZSAhPSAwKQotICAgICAgICAgICByZXR1cm4gTVZfQ1VTVF9PSzsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X21hcF9ydWxlX3NldAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIEdQT04gZmxvdyBtYXBwaW5nIHJ1bGVzCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBjdXN0X2Zsb3cgIC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X21hcF9ydWxlX3NldChtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgKmN1c3RfZmxvdykKLXsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAqcFZpZEVudHJ5ICA9IE5VTEw7Ci0gICAgbXZfY3VzdF9wYml0c19tYXBfdCAgKnBQYml0c01hcCAgPSBOVUxMOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBwYml0c0luZGV4ID0gMDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgaW5kZXggICAgICA9IDA7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIHZpZCAgICAgICAgPSAwOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBwYml0cyAgICAgID0gMDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgbW9kX3ZpZCAgICA9IDA7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIG1vZF9wYml0cyAgPSAwOyAgIAotICAgIG12X2N1c3RfZmxvd19kaXJfZSAgICBkaXIgICAgICAgID0gTVZfQ1VTVF9GTE9XX0RJUl9VUzsgICAgCi0gICAgbXZfY3VzdF9wa3RfZnJ3ZF90ICAgKnBrdF9md2QgICAgPSBOVUxMOwotCi0gICAgLyogR2V0IGlucHV0IGluZm9ybWF0aW9uOiBWSUQsIFAtYml0cy4uLiAqLwotICAgIGlmIChjdXN0X2Zsb3cgPT0gTlVMTCkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJjdXN0X2Zsb3cgaXMgTlVMTCBcblxyIik7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfSAKLSAgICB2aWQgICAgICAgPSAgY3VzdF9mbG93LT52aWQ7Ci0gICAgcGJpdHMgICAgID0gIGN1c3RfZmxvdy0+cGJpdHM7Ci0gICAgbW9kX3ZpZCAgID0gIGN1c3RfZmxvdy0+bW9kX3ZpZDsKLSAgICBtb2RfcGJpdHMgPSAgY3VzdF9mbG93LT5tb2RfcGJpdHM7ICAgIAotICAgIHBrdF9md2QgICA9ICZjdXN0X2Zsb3ctPnBrdF9mcndkOwotICAgIGRpciAgICAgICA9ICBjdXN0X2Zsb3ctPmRpcjsKLQotICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVOVEVSPT0lczogdmlkWyVkXSwgcGJpdHNbJWRdLCBtb2RfdmlkWyVkXSwgbW9kX3BiaXRzWyVkXSwgVC1DT05UWyVkXSwgU1dGIHF1ZXVlWyVkXSwgSFdGIHF1ZXVlWyVkXSwgR0VNIHBvcnRbJWRdLCBkaXJbJWRdXG5cciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB2aWQsIHBiaXRzLCBtb2RfdmlkLCBtb2RfcGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBrdF9md2QhPSBOVUxMKT8gcGt0X2Z3ZC0+dHJnX3BvcnQ6MCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwa3RfZndkIT0gTlVMTCk/IHBrdF9md2QtPnRyZ19xdWV1ZTowKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBrdF9md2QhPSBOVUxMKT8gcGt0X2Z3ZC0+dHJnX2h3Zl9xdWV1ZTowKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBrdF9md2QhPSBOVUxMKT8gcGt0X2Z3ZC0+Z2VtX3BvcnQ6MCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPmRpcik7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgVklEICovCi0gICAgaWYgKHZpZCA+IChNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRSAtIDEpKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgInZpZFslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgdmlkLCAoTVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkUgLSAxKSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotICAgIAotICAgIC8qIENoZWNrIFAtYml0cyAqLwotICAgIGlmIChwYml0cyA+IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUUpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiUC1iaXRzWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBwYml0cywgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgbW9kIFZJRCAqLwotICAgIGlmIChtb2RfdmlkID4gKE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFIC0gMSkpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAibW9kX3ZpZFslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgbW9kX3ZpZCwgKE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFIC0gMSkpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0KLSAgICAKLSAgICAvKiBDaGVjayBtb2QgUC1iaXRzICovCi0gICAgaWYgKG1vZF9wYml0cyA+IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUUpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAibW9kX3BiaXRzWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBtb2RfcGJpdHMsIE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUUpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0KLQotICAgIC8qIENoZWNrIGRpciAqLwotICAgIGlmIChkaXIgPj0gTVZfQ1VTVF9GTE9XX0RJUl9OVU0pIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiZGlyWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBkaXIsIE1WX0NVU1RfRkxPV19ESVJfTlVNLTEpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0gICAgCi0KLSAgICAvKiBDaGVjayB0YXJnZXQgcG9ydC9xdWV1ZS9HRU0gcG9ydCAqLyAKLSAgICBpZiAocGt0X2Z3ZC0+dHJnX3BvcnQgPiBNVl9DVVNUX01BWF9UUkdfUE9SVF9WQUxVRSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJ0cmdfcG9ydFslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgcGt0X2Z3ZC0+dHJnX3BvcnQsIE1WX0NVU1RfTUFYX1RSR19QT1JUX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0KLSAgICBpZiAocGt0X2Z3ZC0+dHJnX3F1ZXVlID4gTVZfQ1VTVF9NQVhfVFJHX1FVRVVFX1ZBTFVFKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgIlNXRiB0cmdfcXVldWVbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIHBrdF9md2QtPnRyZ19xdWV1ZSwgTVZfQ1VTVF9NQVhfVFJHX1FVRVVFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9ICAgCi0KLSAgICBpZiAocGt0X2Z3ZC0+dHJnX2h3Zl9xdWV1ZSA+IE1WX0NVU1RfTUFYX1RSR19RVUVVRV9WQUxVRSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJIV0YgdHJnX3F1ZXVlWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBwa3RfZndkLT50cmdfcXVldWUsIE1WX0NVU1RfTUFYX1RSR19RVUVVRV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfSAgICAgICAKLQotICAgIGlmIChwa3RfZndkLT5nZW1fcG9ydCA+IE1WX0NVU1RfTUFYX0dFTV9QT1JUX1ZBTFVFKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgInRyZ19xdWV1ZVslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgcGt0X2Z3ZC0+Z2VtX3BvcnQsIE1WX0NVU1RfTUFYX0dFTV9QT1JUX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9ICAgICAgICAgIAotIAotICAgIAotICAgIC8qIEZpbmQgVklEIGluZGV4IGVudHJ5IGJ5IFZJRCAqLyAgICAKLSAgICBwVmlkRW50cnkgPSAmZ3NfdmlkX2luZGV4X3RhYmxlW2Rpcl0ucGJpdHNfbWFwX2luZGV4W3ZpZF07Ci0KLSAgICAvKiBHZXQgUC1iaXRzIG1hcHBpbmcgdGFibGUgKi8KLSAgICAvKiBJZiB0aGlzIFZJRCBpbmRleCBlbnRyeSBkb2VzIG5vdCBwb2ludCB0byBhbnkgUC1iaXRzIG1hcHBpbmcgdGFibGUsCi0gICAgICAgbmVlZCB0byBzZWFyY2ggZm9yIGFuIGF2YWlsYWJsZSBQLWJpdHMgbWFwcGluZyB0YWJsZSAgICAgICAgICAgICAqLwotICAgIGlmICgqcFZpZEVudHJ5ID49IE1WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFKSB7Ci0gICAgICAgIC8qIFJlc2VydmVkIGZvciBkZWZhdWx0IHRhZ2dlZCBydWxlICovCi0gICAgICAgIGlmICh2aWQgPT0gTVZfQ1VTVF9ERUZBVUxUX1NJTkdMRV9UQUdfUlVMRSkKLSAgICAgICAgICAgIHBiaXRzSW5kZXggPSBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSAtIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBiaXRzSW5kZXggPSBtdl9jdXN0X3ZhbGlkX3BiaXRzX3RhYmxlX2dldChkaXIpOwotICAgICAgICAKLSAgICAgICAgaWYgKHBiaXRzSW5kZXggPj0gTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUpIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgIiAlZCBQLWJpdHMgbWFwcGluZyB0YWJsZSBoYXMgdXNlZCBvdXRcblxyIiwgTVZfQ1VTVF9JTlZBTElEX1BCSVRTX1RBQkxFX0lOREVYKTsKLSAgICAgICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7ICAgICAKLSAgICAgICAgfSAgICAgICAgICAgIAotICAgIH0KLSAgICAvKiBJbiBjYXNlIHRoYXQgdGhlIFZJRCBpbmRleCBhbHJlYWR5IHBvaW50cyB0byBhIFAtYml0cyBtYXBwaW5nIHRhYmxlLAotICAgICAgIE5lZWQgdG8gcmVwbGFjZSB0aGUgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiBvZiB0aGlzIFAtYml0IG1hcHBpbmcgdGFibGUgKi8KLSAgICBlbHNlIHsKLSAgICAgICAgcGJpdHNJbmRleCA9ICpwVmlkRW50cnk7Ci0gICAgfQotICAgIHBQYml0c01hcCA9ICZnc19wYml0c19tYXBfdGFibGVbZGlyXVtwYml0c0luZGV4XTsKLQotICAgIC8qIElmIGxlZ2FsIFAtYml0cyBpcyBjb25maWd1cmVkICovCi0gICAgaWYgKHBiaXRzIDwgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkgewotICAgICAgICAvKiBJbiBjYXNlIHRvIGVuYWJsZSBwYWNrZXQgZm9yd2FyZGluZyAqLwotICAgICAgICBpZiAocGt0X2Z3ZC0+aW5fdXNlICE9IDApIHsKLSAgICAgICAgCi0gICAgICAgICAgICAvKiBTYXZlIGZvcndhcmRpbmcgaW5mb3JtYXRpb24gKi8gICAgICAgIAotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS50cmdfcG9ydCAgICAgID0gcGt0X2Z3ZC0+dHJnX3BvcnQ7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19xdWV1ZSAgICAgPSBwa3RfZndkLT50cmdfcXVldWU7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19od2ZfcXVldWUgPSBwa3RfZndkLT50cmdfaHdmX3F1ZXVlOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS5nZW1fcG9ydCAgICAgID0gcGt0X2Z3ZC0+Z2VtX3BvcnQ7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgbW9kX3ZpZCBtb2RfcGJpdHMgKi8KLSAgICAgICAgICAgIHBQYml0c01hcC0+bW9kX3ZpZFtwYml0c10gICAgICAgICAgID0gbW9kX3ZpZDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+bW9kX3BiaXRzW3BiaXRzXSAgICAgICAgID0gbW9kX3BiaXRzOwotCi0gICAgICAgICAgICAvKiBFbmFibGUgaW5fdXNlIGZsYWcgKi8KLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10uaW5fdXNlICAgID0gMTsKLSAgICAgICAgICAgIHBQYml0c01hcC0+aW5fdXNlICAgICAgICAgICAgICAgICAgID0gMTsKLQotICAgICAgICAgICAgLyogU2F2ZSBQLWJpdCBtYXBwaW5nIHRhYmxlIGluZGV4IGluIFZJRCBpbmRleCB0YWJsZSAqLwotICAgICAgICAgICAgKnBWaWRFbnRyeSA9IHBiaXRzSW5kZXg7ICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIC8qIEluIGNhc2UgdG8gZGlzYWJsZSBwYWNrZXQgZm9yd2FyZGluZyAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIENsZWFyIGZvcndhcmRpbmcgaW5mb3JtYXRpb24gKi8gICAgICAgIAotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS50cmdfcG9ydCAgICAgID0gMDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10udHJnX3F1ZXVlICAgICA9IDA7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19od2ZfcXVldWUgPSAwOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS5nZW1fcG9ydCAgICAgID0gMDsKLQotICAgICAgICAgICAgLyogQ2xlYXIgbW9kX3ZpZCBtb2RfcGJpdHMgKi8KLSAgICAgICAgICAgIHBQYml0c01hcC0+bW9kX3ZpZFtwYml0c10gICAgICAgICAgID0gMDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+bW9kX3BiaXRzW3BiaXRzXSAgICAgICAgID0gMDsgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qIERpc2FibGUgaW5fdXNlIGZsYWcgKi8KLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10uaW5fdXNlICAgID0gMDsKLSAgICAgICAgICAgIGlmIChtdl9jdXN0X3BiaXRzX3RhYmxlX3N0YXR1c19nZXQocFBiaXRzTWFwKSAhPSBNVl9DVVNUX09LKSB7Ci0gICAgICAgICAgICAgICAgcFBiaXRzTWFwLT5pbl91c2UgICAgICAgICAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgKnBWaWRFbnRyeSAgICAgICAgICAgICAgICAgICAgICA9IE1WX0NVU1RfSU5WQUxJRF9QQklUU19UQUJMRV9JTkRFWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHBQYml0c01hcC0+aW5fdXNlICAgICAgICAgICAgICAgPSAxOwotICAgICAgICAgICAgICAgICpwVmlkRW50cnkgICAgICAgICAgICAgICAgICAgICAgPSBwYml0c0luZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qIElmIGRvZXMgbm90IGNhcmUgZm9yIFAtYml0cywgZWFjaCBQLWJpdHMgbWFwcGluZyBlbnRyeSBzaG91bGQgYmUgc2V0ICovCi0gICAgZWxzZSBpZiAocGJpdHMgPT0gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkgewotCi0gICAgICAgIGluZGV4ID0gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRTsKLQotICAgICAgICAvKiBJbiBjYXNlIHRvIGVuYWJsZSBwYWNrZXQgZm9yd2FyZGluZyAqLwotICAgICAgICBpZiAocGt0X2Z3ZC0+aW5fdXNlICE9IDApIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogU2F2ZSBmb3J3YXJkaW5nIGluZm9ybWF0aW9uICovICAgICAgICAKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF0udHJnX3BvcnQgICAgICA9IHBrdF9md2QtPnRyZ19wb3J0OwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XS50cmdfcXVldWUgICAgID0gcGt0X2Z3ZC0+dHJnX3F1ZXVlOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS50cmdfaHdmX3F1ZXVlID0gcGt0X2Z3ZC0+dHJnX2h3Zl9xdWV1ZTsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF0uZ2VtX3BvcnQgICAgICA9IHBrdF9md2QtPmdlbV9wb3J0OwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XS5pbl91c2UgICAgICAgID0gMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogU2F2ZSBtb2RfdmlkIG1vZF9wYml0cyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfdmlkW2luZGV4XSAgICAgICAgICAgPSBtb2RfdmlkOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfcGJpdHNbaW5kZXhdICAgICAgICAgPSBtb2RfcGJpdHM7ICAgICAgICAgICAKLQotICAgICAgICAgICAgLyogRW5hYmxlIGluX3VzZSBmbGFnICovCi0gICAgICAgICAgICBwUGJpdHNNYXAtPmluX3VzZSA9IDE7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgUC1iaXQgbWFwcGluZyB0YWJsZSBpbmRleCBpbiBWSUQgaW5kZXggdGFibGUgKi8KLSAgICAgICAgICAgICpwVmlkRW50cnkgPSBwYml0c0luZGV4OyAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAvKiBJbiBjYXNlIHRvIGRpc2FibGUgcGFja2V0IGZvcndhcmRpbmcgKi8KLSAgICAgICAgZWxzZSB7IAotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDbGVhciBmb3J3YXJkaW5nIGluZm9ybWF0aW9uICovICAgICAgICAKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF0udHJnX3BvcnQgICAgICA9IDA7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbaW5kZXhdLnRyZ19xdWV1ZSAgICAgPSAwOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS50cmdfaHdmX3F1ZXVlID0gMDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF0uZ2VtX3BvcnQgICAgICA9IDA7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbaW5kZXhdLmluX3VzZSAgICAgICAgPSAwOwotICAgICAgICAgICAgLyogY2xlYXIgbW9kX3ZpZCBtb2RfcGJpdHMgKi8KLSAgICAgICAgICAgIHBQYml0c01hcC0+bW9kX3ZpZFtpbmRleF0gICAgICAgICAgID0gMDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+bW9kX3BiaXRzW2luZGV4XSAgICAgICAgID0gMDsKLQotICAgICAgICAgICAgLyogRGlzYWJsZSBpbl91c2UgZmxhZyAqLwotICAgICAgICAgICAgaWYgKG12X2N1c3RfcGJpdHNfdGFibGVfc3RhdHVzX2dldChwUGJpdHNNYXApICE9IE1WX0NVU1RfT0spIHsKLSAgICAgICAgICAgICAgICBwUGJpdHNNYXAtPmluX3VzZSAgICAgICAgICAgICAgID0gMDsKLSAgICAgICAgICAgICAgICAqcFZpZEVudHJ5ICAgICAgICAgICAgICAgICAgICAgID0gTVZfQ1VTVF9JTlZBTElEX1BCSVRTX1RBQkxFX0lOREVYOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFBiaXRzTWFwLT5pbl91c2UgICAgICAgICAgICAgICA9IDE7Ci0gICAgICAgICAgICAgICAgKnBWaWRFbnRyeSAgICAgICAgICAgICAgICAgICAgICA9IHBiaXRzSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVYSVQ9PSAlczpcblxyIixfX0ZVTkNUSU9OX18pOwotICAgIH0KLQotICAgIHJldHVybiBNVl9DVVNUX09LOyAgIAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfZHNjcF9tYXBfc2V0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgR1BPTiBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBkc2NwX21hcCAgICAgLSBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X2RzY3BfbWFwX3NldChtdl9jdXN0X2RzY3BfcGJpdHNfdCAqZHNjcF9tYXApCi17Ci0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RU5URVI9PSVzOiBpbl91c2VbJWRdXG5cciIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZHNjcF9tYXAhPSBOVUxMKT8gZHNjcF9tYXAtPmluX3VzZTowKSk7Ci0gICAgfQotCi0gICAgaWYgKGRzY3BfbWFwID09IE5VTEwpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiSW5wdXQgZHNjcF9tYXAgaXMgTlVMTFxuXHIiKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBDYXNlIDE6IHRvIGVuYWJsZSBEU0NQIHRvIFAtYml0cyBtYXBwaW5nICovCi0gICAgaWYgKGRzY3BfbWFwLT5pbl91c2UgIT0gMCkgewotICAgICAgICBtZW1jcHkoJmdzX2RzY3BfbWFwX3RhYmxlLnBiaXRzWzBdLCAmZHNjcF9tYXAtPnBiaXRzWzBdLCBzaXplb2YoZ3NfZHNjcF9tYXBfdGFibGUucGJpdHMpKTsKLSAgICAgICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMTsKLSAgICAKLSAgICB9Ci0gICAgLyogQ2FzZSAyOiB0byBkaXNhYmxlIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgKi8KLSAgICBlbHNlIHsKLSAgICAgICAgbWVtc2V0KCh1aW50OF90ICopJmdzX2RzY3BfbWFwX3RhYmxlLCAwLCBzaXplb2YoZ3NfZHNjcF9tYXBfdGFibGUpKTsKLSAgICAgICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RVhJVD09ICVzOlxuXHIiLF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBNVl9DVVNUX09LOyAgIAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfbWFwX3J1bGVfZGVsCi0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRlbGV0ZXMgR1BPTiBmbG93IG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIHZpZCAgICAgICAgIC0gVkxBTiBJRC4KLSoqICAgICAgcGJpdHMgICAgICAtIDgwMi4xcCB2YWx1ZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X21hcF9ydWxlX2RlbCh1aW50MTZfdCB2aWQsIHVpbnQ4X3QgcGJpdHMsIG12X2N1c3RfZmxvd19kaXJfZSBkaXIpCi17Ci0gICAgdWludDhfdCAgICAgICAgICAgICAgKnBWaWRFbnRyeSAgPSBOVUxMOwotICAgIG12X2N1c3RfcGJpdHNfbWFwX3QgICpwUGJpdHNNYXAgID0gTlVMTDsKLQotICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVOVEVSPT06IHZpZFslZF0scGJpdHNbJWRdXG5cciIsIHZpZCwgcGJpdHMpOwotICAgIH0KLQotICAgIC8qIENoZWNrIFZJRCAqLwotICAgIGlmICh2aWQgPiAoTVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkUgLSAxKSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJ2aWRbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIHZpZCwgKE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFIC0gMSkpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0KLSAgICAKLSAgICAvKiBDaGVjayBQLWJpdHMgKi8KLSAgICBpZiAocGJpdHMgPiBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgIlAtYml0c1slZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgcGJpdHMsIE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUUpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0KLQotICAgIC8qIENoZWNrIGRpciAqLwotICAgIGlmIChkaXIgPj0gTVZfQ1VTVF9GTE9XX0RJUl9OVU0pIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiZGlyWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBkaXIsIE1WX0NVU1RfRkxPV19ESVJfTlVNLTEpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0gICAKLQotICAgIC8qIEZpbmQgVklEIGluZGV4IGVudHJ5IGJ5IFZJRCAqLyAgICAKLSAgICBwVmlkRW50cnkgPSAmZ3NfdmlkX2luZGV4X3RhYmxlW2Rpcl0ucGJpdHNfbWFwX2luZGV4W3ZpZF07Ci0KLSAgICBpZiAoKnBWaWRFbnRyeSA+PSBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSkgewotICAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywiJXMsIHBWaWRFbnRyeVslZF0sIGRvZXMgbm90IG5lZWQgdG8gZGVsZXRlIFxuXHIiLF9fRlVOQ1RJT05fXywgKnBWaWRFbnRyeSk7ICAgIAotICAgICAgICByZXR1cm4gTVZfQ1VTVF9PSzsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotCi0gICAgLyogRmluZCBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLwotICAgIHBQYml0c01hcCA9ICZnc19wYml0c19tYXBfdGFibGVbZGlyXVsqcFZpZEVudHJ5XTsKLQotICAgIC8qIERlbGV0ZSBQLWJpdHMgbWFwcGluZyBydWxlICovCi0gICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS50cmdfcG9ydCAgID0gMDsKLSAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19xdWV1ZSAgPSAwOwotICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10uZ2VtX3BvcnQgICA9IDA7Ci0gICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS5pbl91c2UgICAgID0gMDsKLSAgICBwUGJpdHNNYXAtPm1vZF92aWRbcGJpdHNdICAgICAgICAgICAgPSAwOwotICAgIHBQYml0c01hcC0+bW9kX3BiaXRzW3BiaXRzXSAgICAgICAgICA9IDA7ICAgICAgICAgIAotICAgIAotICAgIC8qIERpc2FibGUgaW5fdXNlIGZsYWcgKi8KLSAgICBpZiAobXZfY3VzdF9wYml0c190YWJsZV9zdGF0dXNfZ2V0KHBQYml0c01hcCkhPSBNVl9DVVNUX09LKSB7Ci0gICAgICAgIHBQYml0c01hcC0+aW5fdXNlICAgICAgICAgICAgICAgID0gMDsKLSAgICAgICAgKnBWaWRFbnRyeSAgICAgICAgICAgICAgICAgICAgICAgPSBNVl9DVVNUX0lOVkFMSURfUEJJVFNfVEFCTEVfSU5ERVg7Ci0gICAgfQotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RVhJVD09OlxuXHIiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTVZfQ1VTVF9PSzsgIAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfZHNjcF9tYXBfZGVsCi0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRlbGV0ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcwotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgTm9uZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9kc2NwX21hcF9kZWwodm9pZCkKLXsKLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FTlRFUj09XG5cciIpOwotICAgIH0KLQotICAgIC8qIENsZWFyIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgKi8KLSAgICBlbHNlIHsKLSAgICAgICAgbWVtc2V0KCh1aW50OF90ICopJmdzX2RzY3BfbWFwX3RhYmxlLCAwLCBzaXplb2YoZ3NfZHNjcF9tYXBfdGFibGUpKTsKLSAgICAgICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RVhJVD09XG5cciIpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gTVZfQ1VTVF9PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X21hcF9ydWxlX2NsZWFyCi0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNsZWFycyBhbGwgR1BPTiBmbG93IG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIE5vbmUuCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfbWFwX3J1bGVfY2xlYXIodm9pZCkKLXsKLSAgICB1aW50MzJfdCBwYml0c19pbmRleCA9IDA7Ci0KLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FTlRFUj09XG5cciIpOwotICAgIH0KLQotICAgIC8qIENsZWFyIFZJRCBpbmRleCB0YWJsZSAgICAgICAgICAgICAgKi8KLSAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfdmlkX2luZGV4X3RhYmxlLCBNVl9DVVNUX0lOVkFMSURfUEJJVFNfVEFCTEVfSU5ERVgsIHNpemVvZihnc192aWRfaW5kZXhfdGFibGUpKTsKLQotICAgIC8qIENsZWFyIFAtYml0cyBtYXBwaW5nIHRhYmxlcyAgICAgICAgKi8KLSAgICBmb3IgKHBiaXRzX2luZGV4PTA7IHBiaXRzX2luZGV4PE1WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFOyBwYml0c19pbmRleCsrKSB7Ci0gICAgICAgIG1lbXNldCgodWludDhfdCAqKSZnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bcGJpdHNfaW5kZXhdLCAwLCBzaXplb2YobXZfY3VzdF9wYml0c19tYXBfdCkpOwotICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bcGJpdHNfaW5kZXhdLmluX3VzZSA9IDA7Ci0gICAgICAgIG1lbXNldCgodWludDhfdCAqKSZnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9EU11bcGJpdHNfaW5kZXhdLCAwLCBzaXplb2YobXZfY3VzdF9wYml0c19tYXBfdCkpOwotICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9EU11bcGJpdHNfaW5kZXhdLmluX3VzZSA9IDA7ICAgICAgICAKLSAgICB9Ci0KLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT1cblxyIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE1WX0NVU1RfT0s7ICAKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X3RhZ19tYXBfcnVsZV9nZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0cyBHUE9OIGZsb3cgbWFwcGluZyBydWxlIGZvciB0YWdnZWQgZnJhbWVzLgotKioKLSoqICBJTlBVVFM6Ci0qKiAgICBjdXN0X2Zsb3cgIC0gcGFyc2luZyB2aWQsIHBiaXRzLCBkaXIKLSoqCi0qKiAgT1VUUFVUUzoKLSoqICAgIGN1c3RfZmxvdyAgLSBvdXQgcGFja2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBHRU0gcG9ydCwgVC1DT05ULCBxdWV1ZS4KLSoqICAgICAgICAgICAgICAgICBhbmQgcGFja2V0IG1vZGlmaWNhdGlvbiBmb3IgVklELCBQLWJpdHMKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF90YWdfbWFwX3J1bGVfZ2V0KG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqY3VzdF9mbG93KQotewotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICpwVmlkRW50cnkgID0gTlVMTDsKLSAgICBtdl9jdXN0X3BiaXRzX21hcF90ICAqcFBiaXRzTWFwICA9IE5VTEw7Ci0gICAgbXZfY3VzdF9wa3RfZnJ3ZF90ICAgKnBQa3RGcndkICAgPSBOVUxMOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICB2aWQgICAgICAgID0gMDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgcGJpdHMgICAgICA9IDA7ICAKLSAgICBtdl9jdXN0X2Zsb3dfZGlyX2UgICAgZGlyICAgICAgICA9IE1WX0NVU1RfRkxPV19ESVJfVVM7ICAgICAKLSAgICBtdl9jdXN0X3BrdF9mcndkX3QgICAqcGt0X2Z3ZCAgICA9IE5VTEw7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIGluZGV4ICAgICAgPSAwOyAgICAKLQotICAgIC8qIEdldCBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgdmlkICAgICA9IGN1c3RfZmxvdy0+dmlkOwotICAgIHBiaXRzICAgPSBjdXN0X2Zsb3ctPnBiaXRzOwotICAgIGRpciAgICAgPSBjdXN0X2Zsb3ctPmRpcjsKLSAgICBwa3RfZndkID0gJmN1c3RfZmxvdy0+cGt0X2Zyd2Q7Ci0gICAgCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RU5URVI9PTogdmlkWyVkXSwgcGJpdHNbJWRdLCBkaXJbJWRdXG5cciIsIHZpZCwgcGJpdHMsIGRpcik7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgVklEICovCi0gICAgaWYgKHZpZCA+IChNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRSAtIDEpKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgInZpZFslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgdmlkLCAoTVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkUgLSAxKSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotICAgIAotICAgIC8qIENoZWNrIFAtYml0cyAqLwotICAgIGlmIChwYml0cyA+IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUUpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiUC1iaXRzWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBwYml0cywgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZGlyICovCi0gICAgaWYgKGRpciA+PSBNVl9DVVNUX0ZMT1dfRElSX05VTSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJkaXJbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIGRpciwgTVZfQ1VTVF9GTE9XX0RJUl9OVU0tMSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfSAgICAKLQotICAgIC8qIFNldCBkZWZhdWx0IHZhbHVlcyAqLwotICAgIGN1c3RfZmxvdy0+bW9kX3ZpZCAgID0gTVZfQ1VTVF9WSURfTk9UX0NBUkVfVkFMVUU7Ci0gICAgY3VzdF9mbG93LT5tb2RfcGJpdHMgPSBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFOyAKLSAgICAKLSAgICAvKiBGaW5kIFZJRCBpbmRleCBlbnRyeSBieSBWSUQgKi8gICAgCi0gICAgcFZpZEVudHJ5ID0gJmdzX3ZpZF9pbmRleF90YWJsZVtkaXJdLnBiaXRzX21hcF9pbmRleFt2aWRdOwotCi0gICAgaWYgKCpwVmlkRW50cnkgPj0gTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUpIHsKLSAgICAgICAgIC8vTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiJXMsIHBWaWRFbnRyeVslZF0sIE5vIG1hdGNoZWQgUC1iaXRzIG1hcHBpbmcgdGFibGUgXG5cciIsX19GVU5DVElPTl9fLCAqcFZpZEVudHJ5KTsgICAgCi0KLSAgICAgICAgcGt0X2Z3ZC0+aW5fdXNlID0gMDsKLSAgICAgICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT1cblxyIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBGaW5kIFAtYml0cyBtYXBwaW5nIHRhYmxlICovCi0gICAgcFBiaXRzTWFwID0gJmdzX3BiaXRzX21hcF90YWJsZVtkaXJdWypwVmlkRW50cnldOyAgICAKLQotICAgIC8qIEdldCBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiAqLwotICAgIGluZGV4ID0gcGJpdHM7Ci0KLSAgICBwUGt0RnJ3ZCA9ICZwUGJpdHNNYXAtPnBrdF9md2RbaW5kZXhdOwotCi0gICAgLyogSWYgc3BlY2lmaWMgZmxvdyBtYXBwaW5nIHJ1bGUgZXhpc3RzICovCi0gICAgaWYgKHBQa3RGcndkLT5pbl91c2UgIT0gMCkgewotICAgICAgICBwa3RfZndkLT50cmdfcG9ydCAgICAgID0gcFBrdEZyd2QtPnRyZ19wb3J0OwotICAgICAgICBpZiAoZmFsc2UgPT0gbXZfY3VzdF9nZXRfdGNvbnRfc3RhdGUocFBrdEZyd2QtPnRyZ19wb3J0KSkKLSAgICAgICAgICAgIHBrdF9md2QtPnRyZ19xdWV1ZSA9IENQSF9JTlZBTElEX1RSR1RfUVVFVUU7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwa3RfZndkLT50cmdfcXVldWUgPSBwUGt0RnJ3ZC0+dHJnX3F1ZXVlOwotICAgICAgICBwa3RfZndkLT50cmdfaHdmX3F1ZXVlID0gcFBrdEZyd2QtPnRyZ19od2ZfcXVldWU7Ci0gICAgICAgIHBrdF9md2QtPmdlbV9wb3J0ICAgICAgPSBwUGt0RnJ3ZC0+Z2VtX3BvcnQ7Ci0gICAgICAgIGN1c3RfZmxvdy0+bW9kX3ZpZCAgICAgPSBwUGJpdHNNYXAtPm1vZF92aWRbaW5kZXhdOwotICAgICAgICBjdXN0X2Zsb3ctPm1vZF9wYml0cyAgID0gcFBiaXRzTWFwLT5tb2RfcGJpdHNbaW5kZXhdOwotICAgICAgICBwa3RfZndkLT5pbl91c2UgICAgICAgID0gMTsKLSAgICAgICAgCi0gICAgICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZ19wb3J0KCVkKSwgdHJnX3F1ZXVlKCVkKSB0cmdfaHdmX3F1ZXVlKCVkKSBnZW1fcG9ydCglZCksIG1vZF92aWQoJWQpLCBtb2RfcGJpdHMoJWQpXG5cciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX3BvcnQsIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX3F1ZXVlLCBjdXN0X2Zsb3ctPnBrdF9mcndkLnRyZ19od2ZfcXVldWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPnBrdF9mcndkLmdlbV9wb3J0LCBjdXN0X2Zsb3ctPm1vZF92aWQsIGN1c3RfZmxvdy0+bW9kX3BiaXRzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgLyogSWYgc3BlY2lmaWMgZmxvdyBtYXBwaW5nIHJ1bGUgZG9lcyBub3QgZXhpc3QsIGxvb2sgZm9yIGRlZmF1bHQgcnVsZSAqLwotICAgIGVsc2UgewotICAgICAgICBpbmRleCA9IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUU7Ci0gICAgICAgIHBQa3RGcndkID0gJnBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF07Ci0KLSAgICAgICAgLyogSWYgZGVmYXVsdCBmbG93IG1hcHBpbmcgcnVsZSBleGlzdHMgKi8KLSAgICAgICAgaWYgKHBQa3RGcndkLT5pbl91c2UgIT0gMCkgewotICAgICAgICAgICAgcGt0X2Z3ZC0+dHJnX3BvcnQgICAgICA9IHBQa3RGcndkLT50cmdfcG9ydDsKLSAgICAgICAgICAgIGlmIChmYWxzZSA9PSBtdl9jdXN0X2dldF90Y29udF9zdGF0ZShwUGt0RnJ3ZC0+dHJnX3BvcnQpKQotICAgICAgICAgICAgICAgIHBrdF9md2QtPnRyZ19xdWV1ZSA9IENQSF9JTlZBTElEX1RSR1RfUVVFVUU7Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBrdF9md2QtPnRyZ19xdWV1ZSA9IHBQa3RGcndkLT50cmdfcXVldWU7Ci0gICAgICAgICAgICBwa3RfZndkLT50cmdfaHdmX3F1ZXVlID0gcFBrdEZyd2QtPnRyZ19od2ZfcXVldWU7Ci0gICAgICAgICAgICBwa3RfZndkLT5nZW1fcG9ydCAgICAgID0gcFBrdEZyd2QtPmdlbV9wb3J0OwotICAgICAgICAgICAgY3VzdF9mbG93LT5tb2RfdmlkICAgICA9IHBQYml0c01hcC0+bW9kX3ZpZFtpbmRleF07Ci0gICAgICAgICAgICBjdXN0X2Zsb3ctPm1vZF9wYml0cyAgID0gcFBiaXRzTWFwLT5tb2RfcGJpdHNbaW5kZXhdOwotICAgICAgICAgICAgcGt0X2Z3ZC0+aW5fdXNlICAgICAgICA9IDE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJnX3BvcnQoJWQpLCB0cmdfcXVldWUoJWQpIHRyZ19od2ZfcXVldWUoJWQpIGdlbV9wb3J0KCVkKSwgbW9kX3ZpZCglZCksIG1vZF9wYml0cyglZClcblxyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX3BvcnQsIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX3F1ZXVlLCBjdXN0X2Zsb3ctPnBrdF9mcndkLnRyZ19od2ZfcXVldWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC5nZW1fcG9ydCwgY3VzdF9mbG93LT5tb2RfdmlkLCBjdXN0X2Zsb3ctPm1vZF9wYml0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgCi0gICAgICAgICAgICBwa3RfZndkLT5pbl91c2UgICAgICA9IDA7Ci0gICAgICAgICAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgICAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RVhJVD09XG5cciIpOwotICAgICAgICAgICAgfSAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RVhJVD09XG5cciIpOwotICAgIH0KLQotICAgIHJldHVybiBNVl9DVVNUX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGdldHMgR1BPTiBmbG93IG1hcHBpbmcgcnVsZSBmb3IgdW50YWdnZWQgZnJhbWVzLgotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgZHNjcCAgICAgICAgIC0gRFNDUCB2YWx1ZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBjdXN0X2Zsb3cgICAgLSBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIEdFTSBwb3J0LCBULUNPTlQsIHF1ZXVlLgotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X3VudGFnX21hcF9ydWxlX2dldChtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgKmN1c3RfZmxvdykKLXsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAqcFZpZEVudHJ5ICA9IE5VTEw7Ci0gICAgbXZfY3VzdF9wYml0c19tYXBfdCAgKnBQYml0c01hcCAgPSBOVUxMOwotICAgIG12X2N1c3RfcGt0X2Zyd2RfdCAgICpwUGt0RnJ3ZCAgID0gTlVMTDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgcGJpdHNJbmRleCA9IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUU7Ci0gICAgbXZfY3VzdF9mbG93X2Rpcl9lICAgIGRpciAgICAgICAgPSBNVl9DVVNUX0ZMT1dfRElSX1VTOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBkc2NwICAgICAgID0gMDsKLQotICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVOVEVSPT06IGRzY3BbJWRdIFxuXHIiLCBkc2NwKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB0YXJnZXQgcG9ydC9xdWV1ZS9HRU0gcG9ydCAqLwotICAgIGlmIChjdXN0X2Zsb3cgPT0gTlVMTCkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJjdXN0X2Zsb3cgaXMgTlVMTCBcblxyIik7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogU2V0IGZvcndhcmRpbmcgZmxhZyB0byBmYWxzZSBhdCBmaXJzdCAqLwotICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QuaW5fdXNlID0gMDsKLSAgICBjdXN0X2Zsb3ctPm1vZF92aWQgICAgICAgICA9IE1WX0NVU1RfVklEX05PVF9DQVJFX1ZBTFVFOwotICAgIGN1c3RfZmxvdy0+bW9kX3BiaXRzICAgICAgID0gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRTsgCi0KLSAgICBkaXIgID0gY3VzdF9mbG93LT5kaXI7ICAKLSAgICBkc2NwID0gY3VzdF9mbG93LT5kc2NwOyAgCi0KLSAgICAvKiBDaGVjayBEU0NQICovCi0gICAgaWYgKGRzY3AgPCBNVl9DVVNUX0RTQ1BfUEJJVFNfVEFCTEVfTUFYX1NJWkUpIHsKLSAgICAgICAgaWYgKGdzX2RzY3BfbWFwX3RhYmxlLmluX3VzZSAhPSAwKSB7Ci0gICAgICAgICAgICBwYml0c0luZGV4ID0gZ3NfZHNjcF9tYXBfdGFibGUucGJpdHNbZHNjcF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYml0c0luZGV4ID4gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSl7Ci0gICAgICAgIC8vTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAicGJpdHNJbmRleFslZF0gaXMgaWxsZWdhbCBcblxyIiwgcGJpdHNJbmRleCk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogRmluZCBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLwotICAgIHBWaWRFbnRyeSA9ICZnc192aWRfaW5kZXhfdGFibGVbZGlyXS5wYml0c19tYXBfaW5kZXhbTVZfQ1VTVF9ERUZBVUxUX1VOVEFHX1JVTEVdOwotCi0gICAgaWYgKCpwVmlkRW50cnkgPj0gTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUpIHsKLSAgICAgICAgLy9NVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLCIlcywgcFZpZEVudHJ5WyVkXSwgZG9lcyBub3QgZXhpc3QgXG5cciIsX19GVU5DVElPTl9fLCAqcFZpZEVudHJ5KTsgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgCi0gICAgICAgIHBQYml0c01hcCA9ICZnc19wYml0c19tYXBfdGFibGVbZGlyXVsqcFZpZEVudHJ5XTsKLQotICAgICAgICBpZiAocFBiaXRzTWFwLT5pbl91c2UgIT0gMCkgewotCi0gICAgICAgICAgICBwUGt0RnJ3ZCAgPSAmcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzSW5kZXhdOwotICAgICAgICAgICAgaWYgKHBQa3RGcndkLT5pbl91c2UgIT0gMCkgewotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX3BvcnQgICAgICA9IHBQa3RGcndkLT50cmdfcG9ydDsgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZmFsc2UgPT0gbXZfY3VzdF9nZXRfdGNvbnRfc3RhdGUocFBrdEZyd2QtPnRyZ19wb3J0KSkKLSAgICAgICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcXVldWUgPSBDUEhfSU5WQUxJRF9UUkdUX1FVRVVFOwotICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX3F1ZXVlID0gcFBrdEZyd2QtPnRyZ19xdWV1ZTsKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPnBrdF9mcndkLnRyZ19od2ZfcXVldWUgPSBwUGt0RnJ3ZC0+dHJnX2h3Zl9xdWV1ZTsKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPnBrdF9mcndkLmdlbV9wb3J0ICAgICAgPSBwUGt0RnJ3ZC0+Z2VtX3BvcnQ7Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LT5tb2RfdmlkICAgICAgICAgICAgICAgID0gcFBiaXRzTWFwLT5tb2RfdmlkW3BiaXRzSW5kZXhdOwotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+bW9kX3BiaXRzICAgICAgICAgICAgICA9IHBQYml0c01hcC0+bW9kX3BiaXRzW3BiaXRzSW5kZXhdOwotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QuaW5fdXNlICAgICAgICA9IDE7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICAgICAgICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZ19wb3J0KCVkKSwgdHJnX3F1ZXVlKCVkKSwgdHJnX2h3Zl9xdWV1ZSglZCksIGdlbV9wb3J0KCVkKSwgbW9kX3ZpZCglZCksIG1vZF9wYml0cyglZClcblxyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPnBrdF9mcndkLnRyZ19wb3J0LCBjdXN0X2Zsb3ctPnBrdF9mcndkLnRyZ19xdWV1ZSwgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfaHdmX3F1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QuZ2VtX3BvcnQsIGN1c3RfZmxvdy0+bW9kX3ZpZCwgY3VzdF9mbG93LT5tb2RfcGJpdHMpOwotICAgICAgICAgICAgICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RVhJVD09OlxuXHIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gTVZfQ1VTVF9PSzsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgCi0gICAgfQotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RVhJVD09OlxuXHIiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfbWFwX3RhYmxlX3ByaW50Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRpc3BsYXlzIHZhbGlkIEdQT04gZmxvdyBtYXBwaW5nIHRhYmxlcyBhbmQgRFNDUCAKLSoqICAgICAgICAgICAgICAgICB0byBQLWJpdHMgbWFwcGluZyB0YWJsZWZvciB1bnRhZ2dlZCBmcmFtZXMuCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBOb25lLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfbWFwX3RhYmxlX3ByaW50KHZvaWQpCi17Ci0gICAgdWludDMyX3QgIGluZGV4ID0gMDsKLSAgICB1aW50MzJfdCAgdGFibGVfaW5kZXggPSAwOwotCi0gICAgLy9NVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLCI9PUVOVEVSPT1cblxyIik7Ci0KLSAgICAvKiBQcmludCBWYWxpZCBWSUQgaW5kZXggZW50cmllcyAqLwotICAgIHByaW50ayhLRVJOX0lORk8gIkluIFVwc3RyZWFtIERpcmVjdGlvbiAgICAgIFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7IAotICAgIHByaW50ayhLRVJOX0lORk8gIk1WX0NVU1QgVkxBTiBJRCBJbmRleCBUYWJsZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7ICAgICAgICAgCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiVklEICAgUC1iaXRzX3RhYmxlX2luZGV4XG4iKTsKLSAgICBmb3IgKGluZGV4PTA7IGluZGV4PE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmKGdzX3ZpZF9pbmRleF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXS5wYml0c19tYXBfaW5kZXhbaW5kZXhdIDwgTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUpCi0gICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlNC40ZCAgICVkXG4iLCBpbmRleCwgZ3NfdmlkX2luZGV4X3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdLnBiaXRzX21hcF9pbmRleFtpbmRleF0pOyAgICAKLSAgICB9Ci0gICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5cbiIpOwotCi0gICAgLyogUHJpbnQgUC1iaXRzIG1hcHBpbmcgdGFibGVzICovCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiTVZfQ1VTVCBQLWJpdHMgRmxvdyBNYXBwaW5nIFRhYmxlc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsgIAotICAgIGZvciAodGFibGVfaW5kZXg9MDsgdGFibGVfaW5kZXg8TVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkU7IHRhYmxlX2luZGV4KyspIHsKLSAgICAgICAgaWYoZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW3RhYmxlX2luZGV4XS5pbl91c2UgIT0gMCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlAtYml0cyBGbG93IE1hcHBpbmcgVGFibGUgJWRcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsIHRhYmxlX2luZGV4KTsgCi0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUC1iaXRzICBpbl91c2UgIG1vZF92aWQgbW9kX3BiaXRzIHRyZ19wb3J0ICB0cmdfcXVldWUgIHRyZ19od2ZfcXVldWUgIGdlbV9wb3J0XG4iKTsgCi0gICAgICAgICAgICAgICAgZm9yIChpbmRleD0wOyBpbmRleDxNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNOyBpbmRleCsrKSAKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJTEuMWQgICAgICAgJTMuM3MgICAgICU0LjRkICAgICUxLjFkICAgICAgICAgICUyLjJkICAgICAgICAlMi4yZCAgICAgICAgICUyLjJkICAgICAgICAgICAgJTQuNGRcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW3RhYmxlX2luZGV4XS5wa3RfZndkW2luZGV4XS5pbl91c2UhPTApPyAiWUVTIjoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVt0YWJsZV9pbmRleF0ubW9kX3ZpZFtpbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bdGFibGVfaW5kZXhdLm1vZF9wYml0c1tpbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bdGFibGVfaW5kZXhdLnBrdF9md2RbaW5kZXhdLnRyZ19wb3J0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVt0YWJsZV9pbmRleF0ucGt0X2Z3ZFtpbmRleF0udHJnX3F1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW3RhYmxlX2luZGV4XS5wa3RfZndkW2luZGV4XS50cmdfaHdmX3F1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW3RhYmxlX2luZGV4XS5wa3RfZndkW2luZGV4XS5nZW1fcG9ydCk7ICAgIAotICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICBwcmludGsoS0VSTl9JTkZPICJcblxuIik7Ci0KLSAgICBwcmludGsoS0VSTl9JTkZPICJJbiBEb3duc3RyZWFtIERpcmVjdGlvbiAgICBcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAKLSAgICBwcmludGsoS0VSTl9JTkZPICJNVl9DVVNUIFZMQU4gSUQgSW5kZXggVGFibGVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAgICAgICAgIAotICAgIHByaW50ayhLRVJOX0lORk8gIlZJRCAgIFAtYml0c190YWJsZV9pbmRleFxuIik7Ci0gICAgZm9yIChpbmRleD0wOyBpbmRleDxNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRTsgaW5kZXgrKykgewotICAgICAgICBpZihnc192aWRfaW5kZXhfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9EU10ucGJpdHNfbWFwX2luZGV4W2luZGV4XSA8IE1WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFKQotICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJTQuNGQgICAlZFxuIiwgaW5kZXgsIGdzX3ZpZF9pbmRleF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXS5wYml0c19tYXBfaW5kZXhbaW5kZXhdKTsgICAgCi0gICAgfQotICAgIHByaW50ayhLRVJOX0lORk8gIlxuXG4iKTsKLQotICAgIC8qIFByaW50IFAtYml0cyBtYXBwaW5nIHRhYmxlcyAqLwotICAgIHByaW50ayhLRVJOX0lORk8gIk1WX0NVU1QgUC1iaXRzIEZsb3cgTWFwcGluZyBUYWJsZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7ICAKLSAgICBmb3IgKHRhYmxlX2luZGV4PTA7IHRhYmxlX2luZGV4PE1WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFOyB0YWJsZV9pbmRleCsrKSB7Ci0gICAgICAgIGlmKGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVt0YWJsZV9pbmRleF0uaW5fdXNlICE9IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJQLWJpdHMgRmxvdyBNYXBwaW5nIFRhYmxlICVkXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCB0YWJsZV9pbmRleCk7IAotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlAtYml0cyAgaW5fdXNlICBtb2RfdmlkIG1vZF9wYml0cyB0cmdfcXVldWUgIHRyZ19od2ZfcXVldWUgIFxuIik7IAotICAgICAgICAgICAgICAgIGZvciAoaW5kZXg9MDsgaW5kZXg8TVZfQ1VTVF9QQklUU19NQVBfTUFYX0VOVFJZX05VTTsgaW5kZXgrKykgCi0gICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiUxLjFkICAgICAgICUzLjNzICAgICAlNC40ZCAgICAlMS4xZCAgICAgICAgJTIuMmQgICAgICAgICAlMi4yZCAgICAgICAgICAgICAgXG4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVt0YWJsZV9pbmRleF0ucGt0X2Z3ZFtpbmRleF0uaW5fdXNlIT0wKT8gIllFUyI6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9EU11bdGFibGVfaW5kZXhdLm1vZF92aWRbaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdW3RhYmxlX2luZGV4XS5tb2RfcGJpdHNbaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdW3RhYmxlX2luZGV4XS5wa3RfZndkW2luZGV4XS50cmdfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9EU11bdGFibGVfaW5kZXhdLnBrdF9md2RbaW5kZXhdLnRyZ19od2ZfcXVldWUpOyAgICAKLSAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5cbiIpOyAgICAKLQotICAgIC8qIFByaW50IERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgdGFibGUgKi8KLSAgICBwcmludGsoS0VSTl9JTkZPICJNVl9DVVNUIERTQ1AgdG8gUC1iaXRzIE1hcHBpbmcgVGFibGVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAgCi0gICAgaWYgKGdzX2RzY3BfbWFwX3RhYmxlLmluX3VzZSA9PSAwKSB7Ci0gICAgICAgIHByaW50ayhLRVJOX0lORk8gIk5vIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmdcbiIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgCi0gICAgICAgIHByaW50ayhLRVJOX0lORk8gIkRTQ1AgIFBiaXRzXG4iKTsgCi0gICAgICAgIGZvciAoaW5kZXg9MDsgaW5kZXg8TVZfQ1VTVF9QQklUU19NQVBfTUFYX0VOVFJZX05VTTsgaW5kZXgrKykKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiUyLjJkICAgICAlMS4xZFxuIiwgCi0gICAgICAgICAgICAgICAgICAgaW5kZXgsIGdzX2RzY3BfbWFwX3RhYmxlLnBiaXRzW2luZGV4XSk7ICAgIAotICAgIH0KLSAgICBwcmludGsoS0VSTl9JTkZPICJcblxuIik7Ci0KLSAgICAvL01WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sIj09RVhJVD09XG5cciIpOyAgICAKLSAgICByZXR1cm4gTVZfQ1VTVF9PSzsgCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9mbG93X21hcF9pbml0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIG12X2N1c3QgZmxvdyBtYXBwaW5nIGRhdGEgc3RydWN0dXJlLgotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgTm9uZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAotaW50IG12X2N1c3RfZmxvd19tYXBfaW5pdCh2b2lkKQotewotICAgIHVpbnQzMl90IGluZGV4ID0gMDsKLSAgICAKLSAgICAvKiBJbml0aWFsaXplcyBWSUQgaW5kZXggdGFibGUgICAgICAgICAgICAgICovCi0gICAgbWVtc2V0KCh1aW50OF90ICopJmdzX3ZpZF9pbmRleF90YWJsZSwgTVZfQ1VTVF9JTlZBTElEX1BCSVRTX1RBQkxFX0lOREVYLCBzaXplb2YoZ3NfdmlkX2luZGV4X3RhYmxlKSk7Ci0KLSAgICAvKiBJbml0aWFsaXplcyBQLWJpdHMgbWFwcGluZyB0YWJsZXMgICAgICAgICovCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkU7IGluZGV4KyspIHsKLSAgICAgICAgbWVtc2V0KCh1aW50OF90ICopJmdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVtpbmRleF0sIDAsIHNpemVvZihtdl9jdXN0X3BiaXRzX21hcF90KSk7Ci0gICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVtpbmRleF0uaW5fdXNlID0gMDsKLSAgICAgICAgbWVtc2V0KCh1aW50OF90ICopJmdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVtpbmRleF0sIDAsIHNpemVvZihtdl9jdXN0X3BiaXRzX21hcF90KSk7Ci0gICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVtpbmRleF0uaW5fdXNlID0gMDsgICAgICAgIAotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemVzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgdGFibGUgKi8KLSAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfZHNjcF9tYXBfdGFibGUsIDAsIHNpemVvZihtdl9jdXN0X2RzY3BfcGJpdHNfdCkpOwotICAgIGdzX2RzY3BfbWFwX3RhYmxlLmluX3VzZSA9IDA7Ci0KLSAgICAvKiBJbml0aWFsaXplcyBULUNPTlQgc3RhdGUsIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UgKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBDUEhfTUFYX1RDT05UX05VTTsgaW5kZXgrKykKLSAgICAgICAgZ3NfdGNvbnRfc3RhdGVbaW5kZXhdID0gZmFsc2U7Ci0gICAgICAgIAotICAgIHJldHVybiBNVl9DVVNUX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqIG12X2N1c3RfZ2V0X3Rjb250X3N0YXRlCi0qKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGdldCBULUNPTlQgc3RhdGUKLSoqCi0qKiBJTlBVVFM6Ci0qKiAgIHRjb250IC0gVC1DT05UCi0qKgotKiogT1VUUFVUUzoKLSoqICAgTm9uZS4gCi0qKgotKiogUkVUVVJOUzogICAgIAotKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ib29sIG12X2N1c3RfZ2V0X3Rjb250X3N0YXRlKHVpbnQzMl90IHRjb250KQotewotICAgIC8qIENoZWNrIHRjb250ICovCi0gICAgaWYgKHRjb250ID49IENQSF9NQVhfVENPTlRfTlVNKQotICAgIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fRVJSLCJ0Y29udFslZF0gaXMgaWxsZWdhbCwgc2hvdWxkIGJlIGxlc3MgdGhhbiBbJWRdXG4iLCB0Y29udCwgQ1BIX01BWF9UQ09OVF9OVU0pOyAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBnc190Y29udF9zdGF0ZVt0Y29udF07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogbXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUKLSoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBULUNPTlQgc3RhdGUgaW4gbXZfY3VzdAotKioKLSoqIElOUFVUUzoKLSoqICAgdGNvbnQgLSBULUNPTlQKLSoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuCi0qKgotKiogT1VUUFVUUzoKLSoqICAgTm9uZS4gCi0qKgotKiogUkVUVVJOUzogICAgIAotKiogIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX1NUQVRVUyBtdl9jdXN0X3NldF90Y29udF9zdGF0ZSh1aW50MzJfdCB0Y29udCwgYm9vbCBzdGF0ZSkKLXsKLSAgICAvKiBDaGVjayB0Y29udCAqLwotICAgIGlmICh0Y29udCA+PSBDUEhfTUFYX1RDT05UX05VTSkKLSAgICB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0VSUiwidGNvbnRbJWRdIGlzIGlsbGVnYWwsIHNob3VsZCBiZSBsZXNzIHRoYW4gWyVkXVxuIiwgdGNvbnQsIENQSF9NQVhfVENPTlRfTlVNKTsgCi0gICAgICAgIHJldHVybiBNVl9GQUlMOwotICAgIH0KLQotICAgIC8qIEFwcGx5IHQtY29udCBzdGF0ZSB0byBtdl9jdXN0ICovCi0gICAgZ3NfdGNvbnRfc3RhdGVbdGNvbnRdID0gc3RhdGU7Ci0KLSAgICByZXR1cm4gTVZfT0s7Ci19Ci1FWFBPUlRfU1lNQk9MKG12X2N1c3Rfc2V0X3Rjb250X3N0YXRlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Zsb3dfbWFwLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9mbG93X21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODc1NDJhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Zsb3dfbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCi0qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qIFRoaXMgaXMgVU5QVUJMSVNIRUQgUFJPUFJJRVRBUlkgU09VUkNFIENPREUgb2YgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwOwotKiB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBub3QgYmUgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMsIGNvcGllZAotKiBvciBkdXBsaWNhdGVkIGluIGFueSBmb3JtLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBwcmlvcgotKiB3cml0dGVuIHBlcm1pc3Npb24gb2YgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCi0qCi0qIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKLSogbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCi0qIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcwotKiBhdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCi0qIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKLSogb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCi0qCi0qIFRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQKLSogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWQotKiBESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5Ci0qIGRpc2NsYWltZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogbXZfY3VzdF9mbG93X21hcC5oCi0qCi0qIERFU0NSSVBUSU9OOgotKiAgIFZpY3RvciAgLSBpbml0aWFsIHZlcnNpb24gY3JlYXRlZC4gICAxMi9EZWMvMjAxMSAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fbXZfY3VzdF9mbG93X21hcF9oX18KLSNkZWZpbmUgX19tdl9jdXN0X2Zsb3dfbWFwX2hfXwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgRW51bSBhbmQgU3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTVZDVVNUX1RSQUNFX1BSSU5UKGxldmVsLCBmb3JtYXQsIC4uLikgICBwcmludGsobGV2ZWwgIiVzKCVkKToiZm9ybWF0LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjI19fVkFfQVJHU19fKQotCi0jZGVmaW5lIE1WX0NVU1RfT0sgICAgICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgTVZfQ1VTVF9GQUlMICAgICAgICAgICAgICAgICAgICAgICgxKQotCi0jZGVmaW5lIENQSF9NQVhfVENPTlRfTlVNICAgICAgICAgICAgICAgICAoOCkgICAgLyogTWF4aW11bSBULUNPTlQgbnVtYmVyICAgICovCi0jZGVmaW5lIENQSF9JTlZBTElEX1RSR1RfUVVFVUUgICAgICAgICAgICAoMHhGRikgLyogSW52YWxpZCB0YXJnZXQgcXVldWUgbnVtYmVyICAqLwotCi0jZGVmaW5lIE1WX0NVU1RfVklEX05PVF9DQVJFX1ZBTFVFICAgICAgICAoNDA5NikgLyogRG9lcyBub3QgY2FyZSBmb3IgVklEICAgICovCi0jZGVmaW5lIE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUUgICAgICAoOCkgICAgLyogRG9lcyBub3QgY2FyZSBmb3IgUC1iaXRzICovCi0jZGVmaW5lIE1WX0NVU1RfRFNDUF9OT1RfQ0FSRV9WQUxVRSAgICAgICAoNjQpICAgLyogRG9lcyBub3QgY2FyZSBmb3IgRFNDUCAgICovCi0KLSNkZWZpbmUgTVZfQ1VTVF9NQVhfVFJHX1BPUlRfVkFMVUUgICAgICAgICg4LTEpICAvKiBNYXhpbXVtIHRhcmdldCBwb3J0IHZhbHVlLCBULUNPTlQ3ICovCi0jZGVmaW5lIE1WX0NVU1RfTUFYX1RSR19RVUVVRV9WQUxVRSAgICAgICAoNykgICAgLyogTWF4aW11bSB0YXJnZXQgcXVldWUgdmFsdWUgICAgICAgICAqLwotI2RlZmluZSBNVl9DVVNUX01BWF9HRU1fUE9SVF9WQUxVRSAgICAgICAgKDQwOTUpIC8qIE1heGltdW0gR0VNIHBvcnQgdmFsdWUgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBNVl9DVVNUX0lOVkFMSURfUEJJVFNfVEFCTEVfSU5ERVggKDB4ZmYpIC8qIEludmFsaWQgUGJpdHMgdGFibGUgaW5kZXggdmFsdWUgaW4gVklEIGluZGV4IHRhYmxlKi8KLQotI2RlZmluZSBNVl9DVVNUX0RFRkFVTFRfVU5UQUdfUlVMRSAgICAgICAgKDQwOTYrMSkvKiBEZWZhdWx0IHVudGFnZ2VkICBydWxlICAgICAgICAqLwotI2RlZmluZSBNVl9DVVNUX0RFRkFVTFRfU0lOR0xFX1RBR19SVUxFICAgKDQwOTYrMikvKiBEZWZhdWx0IHNpbmxnZSB0YWdnZWQgIHJ1bGUgICAqLwotI2RlZmluZSBNVl9DVVNUX0RFRkFVTFRfRE9VQkxFX1VOVEFHX1JVTEUgKDQwOTYrMykvKiBEZWZhdWx0IGRvdWJsZSB0YWdnZWQgIHJ1bGUgICAqLwotCi0vKiBWTEFOIElEIGluZGV4IHRhYmxlIGRlZmluaXRpb24gZm9yIGZsb3cgbWFwcGluZyAqLwotI2RlZmluZSBNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRSAgKDQwOTYrNCkKLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1aW50OF90IHBiaXRzX21hcF9pbmRleFtNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRV07Ci19IG12X2N1c3RfdmlkX2luZGV4X3Q7Ci0KLS8qIFAtYml0cyBmbG93IG1hcHBpbmcgdGFibGUgZGVmaW5pdGlvbiAqLwotdHlwZWRlZiB1aW50MzJfdCBtdl9jdXN0X3RyZ19wb3J0X3R5cGVfdDsKLXR5cGVkZWYgdWludDMyX3QgbXZfY3VzdF9nZW1fcG9ydF9rZXlfdDsKLXR5cGVkZWYgc3RydWN0IG12X2N1c3RfcGt0X2Zyd2QgewotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIGluX3VzZTsKLSAgICBtdl9jdXN0X3RyZ19wb3J0X3R5cGVfdCB0cmdfcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIHRyZ19xdWV1ZTsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgdHJnX2h3Zl9xdWV1ZTsgICAgCi0gICAgbXZfY3VzdF9nZW1fcG9ydF9rZXlfdCAgZ2VtX3BvcnQ7Ci19IG12X2N1c3RfcGt0X2Zyd2RfdDsKLQotI2RlZmluZSBNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNICAgKDgrMSkKLSNkZWZpbmUgTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUgICg2NCkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQzMl90ICAgICAgICAgICBpbl91c2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgIG1vZF92aWRbTVZfQ1VTVF9QQklUU19NQVBfTUFYX0VOVFJZX05VTV07Ci0gICAgaW50ICAgICAgICAgICAgICAgIG1vZF9wYml0c1tNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNXTsgICAgCi0gICAgbXZfY3VzdF9wa3RfZnJ3ZF90IHBrdF9md2RbTVZfQ1VTVF9QQklUU19NQVBfTUFYX0VOVFJZX05VTV07Ci19IG12X2N1c3RfcGJpdHNfbWFwX3Q7Ci0KLS8qIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgdGFibGUgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBNVl9DVVNUX0RTQ1BfUEJJVFNfVEFCTEVfTUFYX1NJWkUgICg2NCkKLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1aW50MzJfdCBpbl91c2U7Ci0gICAgdWludDhfdCAgcGJpdHNbTVZfQ1VTVF9EU0NQX1BCSVRTX1RBQkxFX01BWF9TSVpFXTsKLX0gbXZfY3VzdF9kc2NwX3BiaXRzX3Q7Ci0gCi10eXBlZGVmIGVudW0KLXsKLSAgICBNVl9DVVNUX0ZMT1dfRElSX1VTICAgPSAwLAotICAgIE1WX0NVU1RfRkxPV19ESVJfRFMgICA9IDEsCi0gICAgTVZfQ1VTVF9GTE9XX0RJUl9OVU0gID0gMgotfSBtdl9jdXN0X2Zsb3dfZGlyX2U7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgbXZfY3VzdF9mbG93X2Rpcl9lIGRpcjsKLSAgICBpbnQgICAgICAgICAgICAgICAgdmlkOwotICAgIGludCAgICAgICAgICAgICAgICBwYml0czsKLSAgICBpbnQgICAgICAgICAgICAgICAgZHNjcDsgIAotICAgIGludCAgICAgICAgICAgICAgICBtb2RfdmlkOwotICAgIGludCAgICAgICAgICAgICAgICBtb2RfcGJpdHM7Ci0gICAgbXZfY3VzdF9wa3RfZnJ3ZF90IHBrdF9mcndkOwotfSBtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3Q7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIERlY2xhcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9zZXRfdHJhY2VfZmxhZwotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIG12X2N1c3QgdHJhY2UgZmxhZy4KLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIGVuVHJhY2UgICAgIC0gRW5hYmxlIG9yIGRpc2FibGUgbXZfY3VzdCB0cmFjZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAotaW50IG12X2N1c3Rfc2V0X3RyYWNlX2ZsYWcodWludDMyX3QgZW5UcmFjZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9tYXBfcnVsZV9zZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBHUE9OIGZsb3cgbWFwcGluZyBydWxlcwotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgY3VzdF9mbG93ICAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9tYXBfcnVsZV9zZXQobXZfY3VzdF9pb2N0bF9mbG93X21hcF90ICpjdXN0X2Zsb3cpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfZHNjcF9tYXBfc2V0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgR1BPTiBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCi0qKgotKiogIElOUFVUUzoKLSoqICAgIGRzY3BfbWFwICAgLSBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzLgotKioKLSoqICBPVVRQVVRTOgotKiogICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKDApLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9kc2NwX21hcF9zZXQobXZfY3VzdF9kc2NwX3BiaXRzX3QgKmRzY3BfbWFwKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X21hcF9ydWxlX2RlbAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBkZWxldGVzIEdQT04gZmxvdyBtYXBwaW5nIHJ1bGVzCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICB2aWQgICAgICAgICAtIFZMQU4gSUQuCi0qKiAgICAgIHBiaXRzICAgICAgLSA4MDIuMXAgdmFsdWUuCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZSAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9tYXBfcnVsZV9kZWwodWludDE2X3QgdmlkLCB1aW50OF90IHBiaXRzLCBtdl9jdXN0X2Zsb3dfZGlyX2UgZGlyKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X2RzY3BfbWFwX2RlbAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBkZWxldGVzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgSU5QVVRTOgotKiogICAgTm9uZS4KLSoqCi0qKiAgT1VUUFVUUzoKLSoqICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zICgwKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfZHNjcF9tYXBfZGVsKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfbWFwX3J1bGVfY2xlYXIKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY2xlYXJzIGFsbCBHUE9OIGZsb3cgbWFwcGluZyBydWxlcwotKioKLSoqICBJTlBVVFM6Ci0qKiAgICBOb25lLgotKioKLSoqICBPVVRQVVRTOgotKiogICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKDApLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9tYXBfcnVsZV9jbGVhcih2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X3RhZ19tYXBfcnVsZV9nZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0cyBHUE9OIGZsb3cgbWFwcGluZyBydWxlIGZvciB0YWdnZWQgZnJhbWVzLgotKioKLSoqICBJTlBVVFM6Ci0qKiAgICBjdXN0X2Zsb3cgIC0gcGFyc2luZyB2aWQsIHBiaXRzLCBkaXIKLSoqCi0qKiAgT1VUUFVUUzoKLSoqICAgIGN1c3RfZmxvdyAgLSBvdXQgcGFja2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBHRU0gcG9ydCwgVC1DT05ULCBxdWV1ZS4KLSoqICAgICAgICAgICAgICAgICBhbmQgcGFja2V0IG1vZGlmaWNhdGlvbiBmb3IgVklELCBQLWJpdHMKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoMCkuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X3RhZ19tYXBfcnVsZV9nZXQobXZfY3VzdF9pb2N0bF9mbG93X21hcF90ICpjdXN0X2Zsb3cpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGdldHMgR1BPTiBmbG93IG1hcHBpbmcgcnVsZSBmb3IgdW50YWdnZWQgZnJhbWVzLgotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgZHNjcCAgICAgICAgIC0gRFNDUCB2YWx1ZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBjdXN0X2Zsb3cgICAgLSBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIEdFTSBwb3J0LCBULUNPTlQsIHF1ZXVlLgotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X3VudGFnX21hcF9ydWxlX2dldChtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgKmN1c3RfZmxvdyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9tYXBfdGFibGVfcHJpbnQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZGlzcGxheXMgdmFsaWQgR1BPTiBmbG93IG1hcHBpbmcgdGFibGVzIGFuZCBEU0NQIAotKiogICAgICAgICAgICAgICB0byBQLWJpdHMgbWFwcGluZyB0YWJsZWZvciB1bnRhZ2dlZCBmcmFtZXMuCi0qKgotKiogIElOUFVUUzoKLSoqICAgIE5vbmUuCi0qKgotKiogIE9VVFBVVFM6Ci0qKiAgICBOb25lLgotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zICgwKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfbWFwX3RhYmxlX3ByaW50KHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfZmxvd19tYXBfaW5pdAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBpbml0aWFsaXplcyBtdl9jdXN0IGZsb3cgbWFwcGluZyBkYXRhIHN0cnVjdHVyZS4KLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIE5vbmUuCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoMCkuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKLWludCBtdl9jdXN0X2Zsb3dfbWFwX2luaXQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogbXZfY3VzdF9nZXRfdGNvbnRfc3RhdGUKLSoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0IFQtQ09OVCBzdGF0ZQotKioKLSoqIElOUFVUUzoKLSoqICAgdGNvbnQgLSBULUNPTlQKLSoqCi0qKiBPVVRQVVRTOgotKiogICBOb25lLiAKLSoqCi0qKiBSRVRVUk5TOiAgICAgCi0qKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgbXZfY3VzdF9nZXRfdGNvbnRfc3RhdGUodWludDMyX3QgdGNvbnQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqIG12X2N1c3Rfc2V0X3Rjb250X3N0YXRlCi0qKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgVC1DT05UIHN0YXRlIGluIG12X2N1c3QKLSoqCi0qKiBJTlBVVFM6Ci0qKiAgIHRjb250IC0gVC1DT05UCi0qKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLgotKioKLSoqIE9VVFBVVFM6Ci0qKiAgIE5vbmUuIAotKioKLSoqIFJFVFVSTlM6ICAgICAKLSoqICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NVl9TVEFUVVMgbXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUodWludDMyX3QgdGNvbnQsIGJvb2wgc3RhdGUpOwotCi0jZW5kaWYgLyogX19tdl9jdXN0X2Zsb3dfbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfbW5nX2lmLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9tbmdfaWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDcwYTgxYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9tbmdfaWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoQykgMjAxMCwgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KLSogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogCi0qIFRoaXMgaXMgVU5QVUJMSVNIRUQgUFJPUFJJRVRBUlkgU09VUkNFIENPREUgb2YgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwOwotKiB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBub3QgYmUgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMsIGNvcGllZAotKiBvciBkdXBsaWNhdGVkIGluIGFueSBmb3JtLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBwcmlvcgotKiB3cml0dGVuIHBlcm1pc3Npb24gb2YgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwLgotKiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgotKiAKLSogSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgotKiBtb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKLSogUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCi0qIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKLSogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgotKiBvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KLSogCi0qIFRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQKLSogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWQotKiBESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5Ci0qIGRpc2NsYWltZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogbXZfY3VzdF9tbmdfaWYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSogREVTQ1JJUFRJT04gOiBUaGlzIGZpbGUgY29udGFpbnMgT05VIE1WIENVU1QgTWFuYWdlbWVudCBJbnRlcmZhY2UgICAgICAgIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9NVl9DVVNUX01OR19JRl9IXwotI2RlZmluZSBfTVZfQ1VTVF9NTkdfSUZfSF8KLQotLyogSW5jbHVkZSBGaWxlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+Ci0KLS8qIERlZmluaXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX09NQ0lfU0VUICAgICAgICAgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDEsICB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfRU9BTV9MTElEX1NFVCAgICAgICAgICAgX0lPVyhNVl9DVVNUX0lPQ1RMX01BR0lDLCAgMiwgIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9FT0FNX0VOQUJMRSAgICAgICAgICAgICBfSU9XKE1WX0NVU1RfSU9DVExfTUFHSUMsICAzLCAgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX09NQ0lfRU5BQkxFICAgICAgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDQsICB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfTUFQX1JVTEVfU0VUICAgICAgICAgICAgX0lPVyhNVl9DVVNUX0lPQ1RMX01BR0lDLCAgNSwgIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9EU0NQX01BUF9TRVQgICAgICAgICAgICBfSU9XKE1WX0NVU1RfSU9DVExfTUFHSUMsICA2LCAgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX01BUF9SVUxFX0RFTCAgICAgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDcsICB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfRFNDUF9NQVBfREVMICAgICAgICAgICAgX0lPVyhNVl9DVVNUX0lPQ1RMX01BR0lDLCAgOCwgIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9NQVBfUlVMRV9DTEVBUiAgICAgICAgICBfSU9XKE1WX0NVU1RfSU9DVExfTUFHSUMsICA5LCAgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX1RBR19NQVBfUlVMRV9HRVQgICAgICAgIF9JT1IoTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDEwLCB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfVU5UQUdfTUFQX1JVTEVfR0VUICAgICAgX0lPUihNVl9DVVNUX0lPQ1RMX01BR0lDLCAgMTEsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9BUFBfRVRIX1RZUEVfU0VUICAgICAgICBfSU9XKE1WX0NVU1RfSU9DVExfTUFHSUMsICAxMiwgdW5zaWduZWQgaW50KQotCi0vKiBFbnVtcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVHlwZWRlZnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIGludCAgICAgICAgICAgICAgICB0Y29udDsKLSAgICBpbnQgICAgICAgICAgICAgICAgdHhxOwotICAgIGludCAgICAgICAgICAgICAgICBnZW1wb3J0OwotICAgIGludCAgICAgICAgICAgICAgICBrZWVwX3J4X21oOwotfSBtdl9jdXN0X2lvY3RsX29tY2lfc2V0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50ICAgICAgICAgICAgICAgIGxsaWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgIHR4cTsKLSAgICB1aW50OF90ICAgICAgICAgICAgbGxpZF9tYWNbNl07Ci19IG12X2N1c3RfaW9jdGxfbGxpZF9zZXRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBtdl9jdXN0X2RzY3BfcGJpdHNfdCBkc2NwX21hcDsKLX0gbXZfY3VzdF9pb2N0bF9kc2NwX21hcF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIG12X2N1c3RfYXBwX3R5cGVfZSBhcHBfdHlwZTsKLSAgICB1aW50MTZfdCAgICAgICAgICAgZXRoX3R5cGU7Ci19IG12X2N1c3RfaW9jdGxfYXBwX2V0eXBlX3Q7Ci0KLS8qIE1WX0NVU1QgQ2hhciBEZXZpY2UgU3RydWN0dXJlICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCi10eXBlZGVmIHN0cnVjdAotewotICBtdl9jdXN0X2lvY3RsX29tY2lfc2V0X3QgICAgICBtdl9jdXN0X2lvY3RsX29tY2lfc2V0OwotICBtdl9jdXN0X2lvY3RsX2xsaWRfc2V0X3QgICAgICBtdl9jdXN0X2lvY3RsX2xsaWRfc2V0OwotICBtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgICAgICBtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwOwotICBtdl9jdXN0X2lvY3RsX2RzY3BfbWFwX3QgICAgICBtdl9jdXN0X2lvY3RsX2RzY3BfbWFwOwotICBtdl9jdXN0X2lvY3RsX2FwcF9ldHlwZV90ICAgICBtdl9jdXN0X2lvY3RsX2FwcF9ldHlwZTsKLQotICBzdHJ1Y3QgY2RldiAgY2RldjsKLX0gbXZfY3VzdF9jZGV2X3Q7Ci0KLS8qIEdsb2JhbCB2YXJpYWJsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdsb2JhbCBmdW5jdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdsb2JhbCB2YXJpYWJsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdsb2JhbCBmdW5jdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIE1hY3JvcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2VuZGlmIC8qIF9NVl9DVVNUX01OR19JRl9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfbW9kLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9tb2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGNlOTIxOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9tb2QuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCi0qIAotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKiAKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X21vZC5jCi0qCi0qIERFU0NSSVBUSU9OOgotKiAgICAgICAKLSogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSAibXZfY3VzdF9kZXYuaCIKLQotCi0jaWZkZWYgTU9EVUxFX0xJQ0VOU0UKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXZfY3VzdF9tb2RfZXhpdCh2b2lkKQotewotICAgIG12Y3VzdF9kZXZfc2h1dGRvd24oKTsKLX0KLW1vZHVsZV9leGl0KG12X2N1c3RfbW9kX2V4aXQpOwotCi0KLXN0YXRpYyBpbnQgX19pbml0IG12X2N1c3RfbW9kX2luaXQodm9pZCkKLXsKLSAgICBpZiAobXZjdXN0X2Rldl9pbml0KCkgIT0gMCkKLSAgICB7Ci0gICAgICAgIC8vbXZfY3VzdF9tb2RfZXhpdCgpOwotICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuTVZfQ1VTVCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkIFxuXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaW50ayhLRVJOX0lORk8gIlxuTVZfQ1VTVCBtb2R1bGUgaW5zZXJ0ZWQgLSAlc1xuXG4iLE1WX0NVU1RfVkVSU0lPTik7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLy9tb2R1bGVfaW5pdChtdl9jdXN0X21vZF9pbml0KTsKLWRldmljZV9pbml0Y2FsbF9zeW5jKG12X2N1c3RfbW9kX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfbmV0ZGV2LmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9uZXRkZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzU3YjA3Ni4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9uZXRkZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCi0qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qIFRoaXMgaXMgVU5QVUJMSVNIRUQgUFJPUFJJRVRBUlkgU09VUkNFIENPREUgb2YgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwOwotKiB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBub3QgYmUgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMsIGNvcGllZAotKiBvciBkdXBsaWNhdGVkIGluIGFueSBmb3JtLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBwcmlvcgotKiB3cml0dGVuIHBlcm1pc3Npb24gb2YgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCi0qCi0qIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKLSogbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCi0qIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcwotKiBhdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCi0qIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKLSogb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCi0qCi0qIFRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQKLSogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWQotKiBESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5Ci0qIGRpc2NsYWltZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogbXZfY3VzdF9uZXRkZXYuYwotKgotKiBERVNDUklQVElPTjoKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bXZDb21tb24uaD4KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXQvaXB2Ni5oPgotI2lmZGVmIENPTkZJR19NVl9DVVNUX01MRF9IQU5ETEUKLSNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bXZPcy5oPgotI2luY2x1ZGUgPGN0cmxFbnYvbXZDdHJsRW52TGliLmg+Ci0KLSNpbmNsdWRlICJtdl9jdXN0X2Rldi5oIgotI2luY2x1ZGUgIm12X2N1c3RfbmV0ZGV2LmgiCi0jaW5jbHVkZSAibXZfY3VzdF9mbG93X21hcC5oIgotI2luY2x1ZGUgIm12X2N1c3RfbW5nX2lmLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFeHRlcm5hbCAgZGVjbGFyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEdsb2JhbCBzdGF0aWMgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogWVVWQUwgLSB1cGRhdGUgdG8gcG5jIGRlZmluZSAqLwotI2RlZmluZSAgICAgTUhfR0VNX1BPUlRfTUFTSyAgICAgICAgICAgICAgICAoMHgwRkZGKQotI2RlZmluZSAgICAgTUhfRVBPTl9PQU1fVFlQRSAgICAgICAgICAgICAgICAoMHg4ODA5KQotI2RlZmluZSAgICAgRVRZX0lQVjQgICAgICAgICAgICAgICAgICAgICAgICAoMHgwODAwKQotI2RlZmluZSAgICAgSVBWNF9QUk9UT19PRkZTRVQgICAgICAgICAgICAgICAoOSkKLSNkZWZpbmUgICAgIE1WX0NVU1RfU1dGX1RYX1FVRVVFICAgICAgICAgICAgKDYpCi0KLSNkZWZpbmUgICAgIENVU1RfVEJMX05VTV9FTlRSSUVTKGEpICAgICAgICAgKHNpemVvZihhKS9zaXplb2YoYVswXSkpCi0KLS8qU3RhdGljIERlY2xhcmF0aW9ucyAqLwotc3RhdGljIGludCAgICBtdl9ldGhfcG9ydHNfbnVtICAgICA9IDA7Ci1zdGF0aWMgaW50ICAgIG12X2N1c3RfZGVidWdfY29kZSAgID0gMDsKLQotc3RhdGljIGludCAgICBtdl9jdXN0X29tY2lfZ2VtcG9ydCA9IDA7Ci1zdGF0aWMgaW50ICAgIG12X2N1c3Rfb21jaV9yeF9naCAgID0gMDsKLXN0YXRpYyBpbnQgICAgbXZfY3VzdF9vYW1fcnhfZ2ggICAgPSAwOwotCi0vKiBQcm90b2NvbCBkZWZpbml0aW9ucyAqLwotc3RhdGljIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAgICAgb21jaV9tZ210X3R4X3NwZWMgPSB7MCwgMCwgMCwgTVZfQ1VTVF9TV0ZfVFhfUVVFVUV9Owotc3RhdGljIHN0cnVjdCBtdl9lb2FtX2xsaWRfc3BlYyAgZXBvbl9tZ210X3R4X3NwZWNbTVZfQ1VTVF9OVU1fTExJRF07Ci0jZGVmaW5lIEVQT05fTUdNVF9FTlRSSUVTICAgQ1VTVF9UQkxfTlVNX0VOVFJJRVMoZXBvbl9tZ210X3R4X3NwZWMpCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRQotc3RhdGljIHN0cnVjdCBtdl9wb3J0X3R4X3NwZWMgICAgdWRwX3BvcnRfc3BlY19jZmdbQ09ORklHX01WX0VUSF9QT1JUU19OVU1dOwotI2RlZmluZSBQT1JUX0VOVFJJRVMgICAgICAgIENVU1RfVEJMX05VTV9FTlRSSUVTKHVkcF9wb3J0X3NwZWNfY2ZnKQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUKLXN0YXRpYyBpbnQgICAgbXZfY3VzdF9mbG93X21hcCA9IDA7Ci0jZW5kaWYKLQotLyogRGVmYXVsdCBBcHBsaWNhdGlvbiBFdGhlcm5ldCB0eXBlIHVzZWQgZm9yIHNvY2tldCBhbmQgc2tiICovCi0jZGVmaW5lIE1WX0NVU1RfRVRIX1RZUEVfSUdNUCAgICAgICgweEEwMDApCi0jZGVmaW5lIE1WX0NVU1RfRVRIX1RZUEVfTUxEICAgICAgICgweEFCMDApCi0jZGVmaW5lIE1WX0NVU1RfRVRIX1RZUEVfTFBCSyAgICAgICgweEZGRkEpCi0jZGVmaW5lIE1WX0NVU1RfRVRIX1RZUEVfT0FNICAgICAgICgweEJBQkEpCi0vKiBUaGUgRXRoZXJuZXQgdHB5ZSBvZiBPQU0vT01DSSBjb3VsZCBiZSBzYW1lIHNpbmNlIHRoZXkgd2lsbCBub3QgdXNlIGF0IHRoZSBzYW1lIHRpbWUqLwotI2RlZmluZSBNVl9DVVNUX0VUSF9UWVBFX09NQ0kgICAgICAoMHhCQUJBKQotCi0vKiBHbG9iYWwgY3VzdCBjb25maWd1cmF0aW9uKi8KLS8qIFBheSBhdHRlbnRpb24gdGhhdCB0aGUgb3JkZXIgY291bGQgYmUgYmUgY2hhbmdlZCBhbmQgdGhlIGVudHJ5IGNvdWxkIG5vdCBiZSByZW1vdmVkICovCi1zdGF0aWMgbXZfY3VzdF9hcHBfY29uZmlnX3QgZ0N1c3RDb25maWdbXSA9Ci17Ci0gICAgLyogQXBwbGljYXRpb24gVHlwZSAqLyAgIC8qIEVuYWJsZSBGbGFnICovICAgLypBcHBsaWNhdGlvbiBFdGggdHlwZSovICAgLyogQXBwbGljYXRpb24gRGVzY3JpcHRpb24qLwotICAgIHtNVl9DVVNUX0FQUF9UWVBFX0lHTVAsICBNVl9DVVNUX0FQUF9ESVNBQkxFLCBNVl9DVVNUX0VUSF9UWVBFX0lHTVAsICAgICAiSUdNUCBhcHBsaWNhdGlvbiJ9LAotICAgIHtNVl9DVVNUX0FQUF9UWVBFX01MRCwgICBNVl9DVVNUX0FQUF9ESVNBQkxFLCBNVl9DVVNUX0VUSF9UWVBFX01MRCwgICAgICAiTUxEIGFwcGxpY2F0aW9uIn0sCi0gICAge01WX0NVU1RfQVBQX1RZUEVfTFBCSywgIE1WX0NVU1RfQVBQX0RJU0FCTEUsIE1WX0NVU1RfRVRIX1RZUEVfTFBCSywgICAgICJMb29wYmFjayBkZXRlY3Rpb24gYXBwbGljYXRpb24ifSwKLSAgICB7TVZfQ1VTVF9BUFBfVFlQRV9PQU0sICAgTVZfQ1VTVF9BUFBfRElTQUJMRSwgTVZfQ1VTVF9FVEhfVFlQRV9PQU0sICAgICAgImVPQU0gYXBwbGljYXRpb24ifSwKLSAgICB7TVZfQ1VTVF9BUFBfVFlQRV9PTUNJLCAgTVZfQ1VTVF9BUFBfRElTQUJMRSwgTVZfQ1VTVF9FVEhfVFlQRV9PTUNJLCAgICAgIk9NQ0kgYXBwbGljYXRpb24ifSwgICAgCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRnVuY3Rpb24gaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgbXZfY3VzdF9kZWJ1Z19pbmZvX3NldChpbnQgdmFsKQotewotICAgIG12X2N1c3RfZGVidWdfY29kZSA9IHZhbDsKLSAgICByZXR1cm47Ci19Ci0KLQotdm9pZCBtdl9jdXN0X2FwcF9mbGFnX3NldChtdl9jdXN0X2FwcF90eXBlX2UgYXBwX3R5cGUsIHVpbnQxNl90IGVuYWJsZSkKLXsKLSAgICBpZiAobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICBwcmludGsoIiVzKCkgSW4sIGFwcF90eXBlWyVkXSwgZW5hYmxlWyVkXSBcbiIsIF9fZnVuY19fLCBhcHBfdHlwZSwgZW5hYmxlKTsKLSAgICAKLSAgICBpZiAoYXBwX3R5cGUgPiAoTVZfQ1VTVF9BUFBfVFlQRV9NQVgtMSkpCi0gICAgewotICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIGFwcGxpY2F0aW9uIHR5cGVbJWRdLCBhbGxvd2VkIG1heCB0eXBlWyVkXSAgXG4iLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhcHBfdHlwZSwgTVZfQ1VTVF9BUFBfVFlQRV9NQVgtMSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYXBwX3R5cGUgPT0gTVZfQ1VTVF9BUFBfVFlQRV9PTUNJKQotICAgIHsKLSAgICAgICAgaWYgKGVuYWJsZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09BTV0uZW5hYmxlKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJFUE9OIGlzIGFscmVhZHkgdmFsaWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT01DSV0uZW5hYmxlID0gTVZfQ1VTVF9BUFBfRU5BQkxFOwotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgICAgICAgICAgbXZfY3VzdF9mbG93X21hcCAgID0gMTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT01DSV0uZW5hYmxlID0gTVZfQ1VTVF9BUFBfRElTQUJMRTsKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUKLSAgICAgICAgICAgIG12X2N1c3RfZmxvd19tYXAgICA9IDA7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKGFwcF90eXBlID09IE1WX0NVU1RfQVBQX1RZUEVfT0FNKQotICAgIHsKLSAgICAgICAgaWYgKGVuYWJsZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09NQ0ldLmVuYWJsZSkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTVZDVVNUX0VSUl9QUklOVCgiR1BPTiBpcyBhbHJlYWR5IHZhbGlkXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09BTV0uZW5hYmxlID0gTVZfQ1VTVF9BUFBfRU5BQkxFOwotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgICAgICAgICAgbXZfY3VzdF9mbG93X21hcCAgID0gMDsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT0FNXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9ESVNBQkxFOwotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgICAgICAgICAgbXZfY3VzdF9mbG93X21hcCAgID0gMDsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGVuYWJsZSA9PSBNVl9DVVNUX0FQUF9FTkFCTEUpCi0gICAgICAgICAgICBnQ3VzdENvbmZpZ1thcHBfdHlwZV0uZW5hYmxlID0gTVZfQ1VTVF9BUFBfRU5BQkxFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBnQ3VzdENvbmZpZ1thcHBfdHlwZV0uZW5hYmxlID0gTVZfQ1VTVF9BUFBfRElTQUJMRTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKG12X2N1c3RfYXBwX2ZsYWdfc2V0KTsKLQotCi12b2lkIG12X2N1c3RfYXBwX2V0eXBlX3NldChtdl9jdXN0X2FwcF90eXBlX2UgYXBwX3R5cGUsIHVpbnQxNl90IGV0aF90eXBlKQotewotICAgIGlmIChtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXMoKSBJbiwgYXBwX3R5cGVbJWRdLCBldGhfdHlwZVslZF0gXG4iLCBfX2Z1bmNfXywgYXBwX3R5cGUsIGV0aF90eXBlKTsKLSAgICAKLSAgICBpZiAoYXBwX3R5cGUgPiAoTVZfQ1VTVF9BUFBfVFlQRV9NQVgtMSkpCi0gICAgewotICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIGFwcGxpY2F0aW9uIHR5cGVbJWRdLCBhbGxvd2VkIG1heCB0eXBlWyVkXSAgXG4iLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhcHBfdHlwZSwgTVZfQ1VTVF9BUFBfVFlQRV9NQVgtMSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBnQ3VzdENvbmZpZ1thcHBfdHlwZV0uZXRoX3R5cGUgPSBldGhfdHlwZTsKLQotICAgIHJldHVybjsKLX0KLUVYUE9SVF9TWU1CT0wobXZfY3VzdF9hcHBfZXR5cGVfc2V0KTsKLQotCi12b2lkIG12X2N1c3RfcmVjX3NrYihpbnQgcG9ydCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLSAgICB1aW50MzJfdCByeF9zdGF0dXM7Ci0gICAgc3RydWN0IGV0aF9wb3J0ICpwcDsKLQotICAgIHJ4X3N0YXR1cyA9IG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0gICAgcHAgPSBtdl9ldGhfcG9ydF9ieV9pZChwb3J0KTsKLSAgICBTVEFUX0RCRyhpZiAocnhfc3RhdHVzKSAocHAtPnN0YXRzLnJ4X2Ryb3Bfc3crKykpOwotfQotCi12b2lkIG12X2N1c3Rfb21jaV9yeF9naF9zZXQoaW50IHZhbCkKLXsKLSAgICBtdl9jdXN0X29tY2lfcnhfZ2ggPSB2YWw7Ci0gICAgcmV0dXJuOwotfQotCi1pbnQgbXZfY3VzdF9vbWNpX3R4X3NldChpbnQgdGNvbnQsIGludCB0eHEpCi17Ci0gICAgaWYgKG12TmV0YVR4cENoZWNrKE1WX1BPTl9QT1JUX0lELCB0Y29udCkpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHR4cTwwIHx8IHR4cT5DT05GSUdfTVZfRVRIX1RYUSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBvbWNpX21nbXRfdHhfc3BlYy50eHAgPSB0Y29udDsKLSAgICBvbWNpX21nbXRfdHhfc3BlYy50eHEgPSB0eHE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBtdl9jdXN0X29tY2lfZ2VtcG9ydF9zZXQoaW50IGdlbXBvcnQpCi17Ci0gICAgbXZfY3VzdF9vbWNpX2dlbXBvcnQgPSBnZW1wb3J0OwotICAgIHJldHVybjsKLX0KLQotdm9pZCBtdl9jdXN0X29tY2lfaHdfY21kX3NldCh1aW50MzJfdCBod19jbWQpCi17Ci0gICAgb21jaV9tZ210X3R4X3NwZWMuaHdfY21kID0gaHdfY21kOwotfQotCi1pbnQgbXZfY3VzdF9vbWNpX3NldChpbnQgdGNvbnQsIGludCB0eHEsIGludCBnZW1fcG9ydCwgaW50IGtlZXBfcnhfbWgpCi17Ci0gICAgaW50IHJldCwgaHdfY21kOwotCi0gICAgb21jaV9tZ210X3R4X3NwZWMudHhfZnVuYyA9IE5VTEw7Ci0gICAgb21jaV9tZ210X3R4X3NwZWMuZmxhZ3MgPSBNVl9FVEhfRl9OT19QQUQgfCBNVl9FVEhfRl9NSDsKLQotICAgIHJldCA9IG12X2N1c3Rfb21jaV90eF9zZXQodGNvbnQsIHR4cSk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJtdl9jdXN0X29tY2lfdHhfc2V0IC0gcmV0KCVkKSAgXG4iLCByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIG12X2N1c3Rfb21jaV9nZW1wb3J0X3NldChnZW1fcG9ydCk7Ci0gICAgaHdfY21kID0gKChnZW1fcG9ydCA8PCA4KSB8IDB4MDAxMCk7Ci0gICAgbXZfY3VzdF9vbWNpX2h3X2NtZF9zZXQoaHdfY21kKTsKLSAgICBtdl9jdXN0X29tY2lfcnhfZ2hfc2V0KGtlZXBfcnhfbWgpOwotCi0gICAgbXZfY3VzdF9hcHBfZmxhZ19zZXQoTVZfQ1VTVF9BUFBfVFlQRV9PTUNJLCBNVl9DVVNUX0FQUF9FTkFCTEUpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG12X2N1c3Rfb21jaV9zZXQpOwotCi12b2lkIG12X2N1c3Rfb21jaV9wcmludCh2b2lkKQotewotICAgIHByaW50aygiKioqKioqKioqKioqKiBPTUNJIENvbmZpZ3VyYXRpb24gKioqKioqKioqKioqKioqKipcblxuIik7Ci0gICAgcHJpbnRrKCJPTUNJOiB2YWxpZCA9ICVkLCBnZW1wb3J0ID0gJWQsIGV0aHR5cGUgPSAweCUwNHgsIGdoX2tlZXAgPSAlZFxuIiwKLSAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PTUNJXS5lbmFibGUsCi0gICAgICAgICAgIG12X2N1c3Rfb21jaV9nZW1wb3J0LCAKLSAgICAgICAgICAgbnRvaHMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PTUNJXS5ldGhfdHlwZSksIAotICAgICAgICAgICBtdl9jdXN0X29tY2lfcnhfZ2gpOwotICAgIHByaW50aygiT01DSTogdHhwICAgPSAlZCwgdHhxID0gJWQsIGh3X2NtZCA9IDB4JTA4eCwgZmxhZ3MgPSAweCUwNHggb24gVFggXG4iLAotICAgICAgICAgICBvbWNpX21nbXRfdHhfc3BlYy50eHAsIG9tY2lfbWdtdF90eF9zcGVjLnR4cSwgb21jaV9tZ210X3R4X3NwZWMuaHdfY21kLCBvbWNpX21nbXRfdHhfc3BlYy5mbGFncyk7Ci0gICAgcHJpbnRrKCJcbiIpOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3Rfb21jaV9nZW1fcGFyc2UodWludDhfdCAqZGF0YSkKLXsKLSAgICB1aW50MTZfdCBnaDsKLQotICAgIGdoID0gbnRvaHMoKih1aW50MTZfdCAqKWRhdGEpOwotCi0gICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICBwcmludGsoIiVzOmdoPSAweCglMDR4KSAtIG12X2N1c3Rfb21jaV9nZW1wb3J0PSAweCglMDR4KSAgXG4iLCBfX2Z1bmNfXywgZ2gsIG12X2N1c3Rfb21jaV9nZW1wb3J0KTsKLQotICAgIC8qIENvbXBhcmUgR0ggZm9yIG9tY2lfZ2VtcG9ydCAqLwotICAgIGlmICggKGdoICYgTUhfR0VNX1BPUlRfTUFTSykgIT0gbXZfY3VzdF9vbWNpX2dlbXBvcnQgKSB7Ci0gICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgIHByaW50aygiJXM6IGNvbXBhcmUgR0ggZm9yIE9NQ0lfZ2VtcG9ydCBmYWlsZWQ6IGdoPSAweCglMDR4KSAtIG12X2N1c3Rfb21jaV9nZW1wb3J0PSAweCglMDR4KSAgXG4iLCBfX2Z1bmNfXywgZ2gsIG12X2N1c3Rfb21jaV9nZW1wb3J0KTsKLSAgICAgICAgcmV0dXJuKDApOwotICAgIH0KLQotICAgIHJldHVybigxKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X29tY2lfcngoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCi17Ci0gICAgdWludDMyX3QgcnhfYnl0ZXM7Ci0KLSAgICBpZiAoIW12X2N1c3Rfb21jaV9nZW1fcGFyc2Uoc2tiLT5kYXRhKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKG12X2N1c3Rfb21jaV9yeF9naCkgewotICAgICAgICByeF9ieXRlcyA9IHJ4X2Rlc2MtPmRhdGFTaXplOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc2tiLT5kYXRhICs9IE1WX0VUSF9NSF9TSVpFOwotICAgICAgICByeF9ieXRlcyA9IHJ4X2Rlc2MtPmRhdGFTaXplIC0gTVZfRVRIX01IX1NJWkU7Ci0gICAgfQotICAgIHNrYi0+dGFpbCArPSByeF9ieXRlczsKLSAgICBza2ItPmxlbiA9IHJ4X2J5dGVzOwotICAgIHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT01DSV0uZXRoX3R5cGUpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKLSAgICBza2ItPmRldiA9IGRldjsKLSNlbmRpZgotICAgIG12X2N1c3RfcmVjX3NrYihwb3J0LCBza2IpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBtdl9jdXN0X29tY2lfdHgoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKLXsKLSAgICBpZiAoKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PTUNJXS5ldGhfdHlwZSkpCi0gICAgICAgICYmIChNVl9DVVNUX0FQUF9FTkFCTEUgPT0gZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PTUNJXS5lbmFibGUpCi0gICAgICAgICYmIChwb3J0ID09IE1WX1BPTl9QT1JUX0lEKSkgewotICAgICAgICBtZW1jcHkgKHR4X3NwZWNfb3V0LCAmb21jaV9tZ210X3R4X3NwZWMsIHNpemVvZihzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMpKTsKLSAgICAgICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgcHJpbnRrKCIlcyIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLXZvaWQgbXZfY3VzdF9vYW1fcnhfZ2hfc2V0KGludCB2YWwpCi17Ci0gICAgbXZfY3VzdF9vYW1fcnhfZ2ggPSB2YWw7Ci0gICAgcmV0dXJuOwotfQotCi1pbnQgbXZfY3VzdF9lb2FtX2xsaWRfc2V0KGludCBsbGlkLCB1aW50OF90ICpsbGlkX21hYywgaW50IHR4cSkKLXsKLQotICAgIGlmIChtdk5ldGFUeHBDaGVjayhNVl9QT05fUE9SVF9JRCwgbGxpZCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotCi0gICAgaWYgKHR4cTwwIHx8IHR4cT5DT05GSUdfTVZfRVRIX1RYUSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmICghbGxpZF9tYWMpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIG1lbWNweSgodm9pZCAqKSAmKGVwb25fbWdtdF90eF9zcGVjW2xsaWRdLmxsaWRfbWFjX2FkZHJlc3MpLCAodm9pZCAqKSBsbGlkX21hYywgRVRIX0FMRU4pOwotCi0gICAgZXBvbl9tZ210X3R4X3NwZWNbbGxpZF0udHhfc3BlYy50eHEgPSB0eHE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobXZfY3VzdF9lb2FtX2xsaWRfc2V0KTsKLQotdm9pZCBtdl9jdXN0X2VvYW1faW5pdCh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpPTA7aSA8KEVQT05fTUdNVF9FTlRSSUVTKTtpKyspIHsKLSAgICAgICAgbWVtc2V0KCZlcG9uX21nbXRfdHhfc3BlY1tpXSwwLCBzaXplb2Yoc3RydWN0IG12X2VvYW1fbGxpZF9zcGVjKSk7Ci0KLSAgICAgICAgLyogRWFjaCB0YWJsZSBlbnRyeSAoaSkgYS1wcmlvcmkgY29ycmVzcG9uZHMgdG8gTExJRCAoaSkgKi8KLSAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0udHhfc3BlYy50eHAgPSBpOwotCi0gICAgICAgIC8qIFRoZSBtdl9uZXRhIGRyaXZlciB3aWxsIGFkZCB0aGUgZGVmYXVsdCBNSC4gVGhlIE1IIHZhbHVlIGhhcyBubyBzaWduaWZpY2FuY2UgaW4gRVBPTiBVcHN0cmVhbSAqLwotICAgICAgICBlcG9uX21nbXRfdHhfc3BlY1tpXS50eF9zcGVjLmZsYWdzID0gTVZfRVRIX0ZfTUg7Ci0gICAgfQotCi0gICAgLyogSW4gUngsIGtlZXAgdGhlIE1IIGZvciBFT0FNICovCi0gICAgbXZfY3VzdF9vYW1fcnhfZ2hfc2V0KDEpOwotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgbXZfY3VzdF9lb2FtX3ByaW50KHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgcHJpbnRrKCIqKioqKioqKioqKioqIGVPQU0gQ29uZmlndXJhdGlvbiAqKioqKioqKioqKioqKioqKlxuXG4iKTsKLSAgICBwcmludGsoIkVPQU06IHZhbGlkID0gJWQsIGV0aHR5cGUgPSAweCUwNHgsIGdoX2tlZXAgPSAlZFxuIiwKLSAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmVuYWJsZSwgCi0gICAgICAgICAgIG50b2hzKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT0FNXS5ldGhfdHlwZSksIAotICAgICAgICAgICBtdl9jdXN0X29hbV9yeF9naCk7Ci0gICAgZm9yIChpPTA7aSA8KEVQT05fTUdNVF9FTlRSSUVTKTtpKyspIHsKLSAgICAgICAgcHJpbnRrKCJsbGlkJWQ6IG1hYz0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCwgdHhwPSVkLCB0eHE9JWQsIGh3X2NtZD0weCUwOHgsIGZsYWdzID0gMHglMDR4XG4iLAotICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgIGVwb25fbWdtdF90eF9zcGVjW2ldLmxsaWRfbWFjX2FkZHJlc3NbMF0sZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1sxXSwKLSAgICAgICAgICAgICAgIGVwb25fbWdtdF90eF9zcGVjW2ldLmxsaWRfbWFjX2FkZHJlc3NbMl0sZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1szXSwKLSAgICAgICAgICAgICAgIGVwb25fbWdtdF90eF9zcGVjW2ldLmxsaWRfbWFjX2FkZHJlc3NbNF0sZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1s1XSwKLSAgICAgICAgICAgICAgIGVwb25fbWdtdF90eF9zcGVjW2ldLnR4X3NwZWMudHhwLCBlcG9uX21nbXRfdHhfc3BlY1tpXS50eF9zcGVjLnR4cSwKLSAgICAgICAgICAgICAgIGVwb25fbWdtdF90eF9zcGVjW2ldLnR4X3NwZWMuaHdfY21kLCBlcG9uX21nbXRfdHhfc3BlY1tpXS50eF9zcGVjLmZsYWdzKTsKLSAgICAgICAgcHJpbnRrKCJcbiIpOwotICAgIH0KLX0KLQotc3RhdGljIGludCBtdl9jdXN0X2VvYW1fdHlwZV9wYXJzZSh1aW50OF90ICpkYXRhKQotewotICAgIHVpbnQxNl90IGV0eTsKLQotICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKikoZGF0YSArIE1WX0VUSF9NSF9TSVpFICsgRVRIX0FMRU4gKyBFVEhfQUxFTikpOwotCi0gICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICBwcmludGsoIiVzOiBldHkgMHgoJTA0eClcbiIsIF9fZnVuY19fLCBldHkpOwotCi0gICAgLyogQ29tcGFyZSBFUE9OIE9BTSBldGhlcl90eXBlICovCi0gICAgaWYgKGV0eSA9PSBNSF9FUE9OX09BTV9UWVBFKQotICAgICAgICByZXR1cm4oMSk7Ci0KLSAgICByZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXZfY3VzdF9lcG9uX29hbV9yeChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKLXsKLSAgICB1aW50MzJfdCByeF9ieXRlczsKLQotICAgIGlmICghbXZfY3VzdF9lb2FtX3R5cGVfcGFyc2Uoc2tiLT5kYXRhKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAobXZfY3VzdF9vYW1fcnhfZ2gpIHsKLSAgICAgICAgcnhfYnl0ZXMgPSByeF9kZXNjLT5kYXRhU2l6ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNrYi0+ZGF0YSArPSBNVl9FVEhfTUhfU0laRTsKLSAgICAgICAgcnhfYnl0ZXMgPSByeF9kZXNjLT5kYXRhU2l6ZSAtIE1WX0VUSF9NSF9TSVpFOwotICAgIH0KLQotICAgIHNrYi0+dGFpbCArPSByeF9ieXRlczsKLSAgICBza2ItPmxlbiA9IHJ4X2J5dGVzOwotICAgIHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT0FNXS5ldGhfdHlwZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQotICAgIHNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCi0gICAgbXZfY3VzdF9yZWNfc2tiKHBvcnQsIHNrYik7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IG12X2N1c3RfZW9hbV90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKLXsKLSAgICBpbnQgbWFjX21hdGNoLCBpOwotCi0gICAgaWYgKChza2ItPnByb3RvY29sID09IGh0b25zKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT0FNXS5ldGhfdHlwZSkpCi0gICAgICAgICYmIChNVl9DVVNUX0FQUF9FTkFCTEUgPT0gZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmVuYWJsZSkKLSAgICAgICAgJiYgcG9ydCA9PSBNVl9QT05fUE9SVF9JRCkgewotICAgICAgICAvKiBMb29rdXAgTUFDIEFkZHJlc3MgKi8KLSAgICAgICAgZm9yIChpPTA7IGk8KEVQT05fTUdNVF9FTlRSSUVTKTtpKyspIHsKLSAgICAgICAgICAgIG1hY19tYXRjaCA9IG1lbWNtcCgodm9pZCAqKSAmKGVwb25fbWdtdF90eF9zcGVjW2ldLmxsaWRfbWFjX2FkZHJlc3NbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHNrYi0+ZGF0YSArIC8qTVZfRVRIX01IX1NJWkUgKyovIEVUSF9BTEVOKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVEhfQUxFTik7Ci0gICAgICAgICAgICBpZiAoIW1hY19tYXRjaCkgewotICAgICAgICAgICAgICAgIG1lbWNweSAodHhfc3BlY19vdXQsICZlcG9uX21nbXRfdHhfc3BlY1tpXS50eF9zcGVjLCBzaXplb2Yoc3RydWN0IG12X2V0aF90eF9zcGVjKSk7Ci0gICAgICAgICAgICAgICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgICAgICAgICBwcmludGsoIiVzLCBsbGlkID0gJWQiLCBfX2Z1bmNfXywgaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogU291cmNlIE1BQyBBZGRyZXNzIG5vdCBmb3VuZCAqLwotICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpIHsKLSAgICAgICAgICAgIHByaW50aygiKCVzKUlucHV0IFBhY2tldCBmaXJzdCBieXRlczpcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIGZvciAoaT0wO2k8MjQ7aSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGklOD09IDApCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKLSAgICAgICAgICAgICAgICBwcmludGsgKCIlMDJ4ICIsICooc2tiLT5kYXRhICsgaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9JR01QX0hBTkRMRQotdm9pZCBtdl9jdXN0X2lnbXBfcHJpbnQodm9pZCkKLXsKLSAgICBwcmludGsoIioqKioqKioqKioqKiogSUdNUCBDb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqXG5cbiIpOwotICAgIHByaW50aygiSUdNUCB2YWxpZCA9ICVkLCAgZXRodHlwZSA9IDB4JTA0eCBcbiIsCi0gICAgICAgICAgIGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfSUdNUF0uZW5hYmxlLCAKLSAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5ldGhfdHlwZSk7Ci0gICAgcHJpbnRrKCJJR01QIGRlZmF1bHQgdHhxID0gJWRcbiIsTVZfQ1VTVF9TV0ZfVFhfUVVFVUUpOwotICAgIHByaW50aygiXG4iKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X2lnbXBfcGFyc2UodWludDhfdCAqZGF0YSkKLXsKLSAgICB1aW50MTZfdCBldHk7Ci0gICAgdWludDhfdCAgcHJvdG87Ci0gICAgdWludDhfdCAqZmllbGRwID0gZGF0YSArIE1WX0VUSF9NSF9TSVpFICsgRVRIX0FMRU4gKyBFVEhfQUxFTjsKLQotICAgIC8qIExvb3AgdGhyb3VnaCBWTEFOIHRhZ3MgKi8KLSAgICBldHkgPSBudG9ocygqKHVpbnQxNl90ICopZmllbGRwKTsKLSAgICB3aGlsZSAoZXR5ID09IDB4ODEwMCB8fCBldHkgPT0gMHg5MTAwIHx8IGV0eSA9PSAweDg4QTgpIHsKLSAgICAgICAgZmllbGRwKz0gVkxBTl9ITEVOOwotICAgICAgICBldHkgPSBudG9ocygqKHVpbnQxNl90ICopZmllbGRwKTsKLSAgICB9Ci0KLSAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXM6ZXR5IDB4KCUwNHgpXG4iLCBfX2Z1bmNfXywgZXR5KTsKLQotICAgIGlmIChldHkgPT0gRVRZX0lQVjQpIHsKLSAgICAgICAgZmllbGRwKz0gMjsKLSAgICAgICAgZmllbGRwKz0gSVBWNF9QUk9UT19PRkZTRVQ7Ci0gICAgICAgIHByb3RvID0gKmZpZWxkcDsKLSAgICAgICAgaWYgKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgIHByaW50aygiJXM6cHJvdG8gMHgoJTAyeClcbiIsIF9fZnVuY19fLCBwcm90byk7Ci0KLSAgICAgICAgaWYgKHByb3RvID09IElQUFJPVE9fSUdNUCkKLSAgICAgICAgICAgIHJldHVybigxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXZfY3VzdF9pZ21wX3J4KGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKQotewotICAgIHVpbnQzMl90IHJ4X2J5dGVzOwotCi0gICAgaWYgKCFtdl9jdXN0X2lnbXBfcGFyc2Uoc2tiLT5kYXRhKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBUbyBJbmRpY2F0ZSB0aGUgc291cmNlIEdNQUMgKi8KLSAgICBza2ItPmRhdGFbMF0gPSBwb3J0OwotCi0gICAgcnhfYnl0ZXMgPSByeF9kZXNjLT5kYXRhU2l6ZTsKLQotICAgIHNrYi0+dGFpbCArPSByeF9ieXRlczsKLSAgICBza2ItPmxlbiA9IHJ4X2J5dGVzOwotICAgIHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfSUdNUF0uZXRoX3R5cGUpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKLSAgICBza2ItPmRldiA9IGRldjsKLSNlbmRpZgotICAgIG12X2N1c3RfcmVjX3NrYihwb3J0LCBza2IpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBtdl9jdXN0X2lnbXBfdHgoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCi17Ci0gICAgaWYgKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfSUdNUF0uZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkgewotICAgICAgICAvKiBDaGVjayBhcHBsaWNhdGlvbiBFdGhlcm5ldCB0eXBlICovCi0gICAgICAgIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfSUdNUF0uZXRoX3R5cGUpKSB7Ci0KLSAgICAgICAgICAgIC8qIFRoZSBNYXBwaW5nIGFuZCBWTEFOIG1vZCBzaG91bGQgYmUgc3VwcG9ydCBpbiBuZXh0IHBoYXNlICovCi0gICAgICAgICAgICBpZiAoTVZfUE9OX1BPUlRfSUQgPT0gcG9ydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgPSBNVl9FVEhfRl9NSDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0eF9zcGVjX291dC0+dHhwICAgICA9IDA7Ci0gICAgICAgICAgICB0eF9zcGVjX291dC0+dHhxICAgICA9IE1WX0NVU1RfU1dGX1RYX1FVRVVFOwotICAgICAgICAgICAgdHhfc3BlY19vdXQtPmh3X2NtZCAgPSAwOwotI2lmZGVmIENPTkZJR19NVl9FVEhfVFhfU1BFQ0lBTAotICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4X2Z1bmMgPSBOVUxMOwotI2VuZGlmCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX01MRF9IQU5ETEUKLXZvaWQgbXZfY3VzdF9tbGRfcHJpbnQodm9pZCkKLXsKLSAgICBwcmludGsoIioqKioqKioqKioqKiogTUxEIENvbmZpZ3VyYXRpb24gKioqKioqKioqKioqKioqKipcblxuIik7Ci0gICAgcHJpbnRrKCJNTEQgdmFsaWQgPSAlZCwgIGV0aHR5cGUgPSAweCUwNHggXG4iLAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX01MRF0uZW5hYmxlLCAKLSAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9NTERdLmV0aF90eXBlKTsKLSAgICBwcmludGsoIk1MRCBkZWZhdWx0IHR4cSA9ICVkXG4iLE1WX0NVU1RfU1dGX1RYX1FVRVVFKTsKLSAgICBwcmludGsoIlxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgbXZfY3VzdF9tbGRfcGFyc2UodWludDhfdCAqZGF0YSkKLXsKLSAgICB1aW50MTZfdCBldHk7Ci0gICAgdWludDhfdCAqZmllbGRwID0gZGF0YSArIE1WX0VUSF9NSF9TSVpFICsgRVRIX0FMRU4gKyBFVEhfQUxFTjsKLQotCi0gICAgLyogTG9vcCB0aHJvdWdoIFZMQU4gdGFncyAqLwotICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIHdoaWxlIChldHkgPT0gMHg4MTAwIHx8IGV0eSA9PSAweDkxMDAgfHxldHkgPT0gMHg4OEE4KSB7Ci0gICAgICAgIGZpZWxkcCs9IFZMQU5fSExFTjsKLSAgICAgICAgZXR5ID0gbnRvaHMoKih1aW50MTZfdCAqKWZpZWxkcCk7Ci0gICAgfQotCi0gICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICBwcmludGsoIiVzOmV0eSAweCglMDR4KVxuIiwgX19mdW5jX18sIGV0eSk7Ci0KLSAgICBpZiAoZXR5ID09IEVUSF9QX0lQVjYpIAotICAgIHsKLSAgICAgICAgc3RydWN0IGlwdjZoZHIgKmhkciA9IChzdHJ1Y3QgaXB2NmhkciAqKShmaWVsZHArMik7Ci0gICAgICAgIHN0cnVjdCBpcHY2X2hvcG9wdF9oZHIgKmhvcG9wdGhkciA7Ci0gICAgICAgIHN0cnVjdCBpY21wNmhkciAqcGljOwotCi0gICAgICAgIGlmIChoZHItPm5leHRoZHIgIT0gTkVYVEhEUl9IT1AgKQotICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGhvcG9wdGhkciA9IChzdHJ1Y3QgaXB2Nl9ob3BvcHRfaGRyICopKCh1aW50OF90ICopaGRyKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKLQotICAgICAgICBpZiAoIGhvcG9wdGhkci0+bmV4dGhkciAhPSBJUFBST1RPX0lDTVBWNikKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHBpYyA9ICAoc3RydWN0IGljbXA2aGRyICopKCh1aW50OF90ICopaG9wb3B0aGRyK2lwdjZfb3B0bGVuKGhvcG9wdGhkcikpOwotCi0gICAgICAgIHN3aXRjaCAocGljLT5pY21wNl90eXBlKSB7Ci0gICAgICAgIGNhc2UgSUNNUFY2X01HTV9RVUVSWToKLSAgICAgICAgY2FzZSBJQ01QVjZfTUdNX1JFUE9SVDoKLSAgICAgICAgY2FzZSBJQ01QVjZfTUdNX1JFRFVDVElPTjoKLSAgICAgICAgY2FzZSBJQ01QVjZfTUxEMl9SRVBPUlQ6Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXZfY3VzdF9tbGRfcngoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCi17Ci0gICAgdWludDMyX3QgcnhfYnl0ZXM7Ci0KLSAgICBpZiAoIW12X2N1c3RfbWxkX3BhcnNlKHNrYi0+ZGF0YSkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogVG8gSW5kaWNhdGUgdGhlIHNvdXJjZSBHTUFDICovCi0gICAgc2tiLT5kYXRhWzBdID0gcG9ydDsKLQotICAgIHJ4X2J5dGVzID0gcnhfZGVzYy0+ZGF0YVNpemU7Ci0KLSAgICBza2ItPnRhaWwgKz0gcnhfYnl0ZXM7Ci0gICAgc2tiLT5sZW4gPSByeF9ieXRlczsKLSAgICBza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwotICAgIHNrYi0+cHJvdG9jb2wgPSBodG9ucyhnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX01MRF0uZXRoX3R5cGUpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKLSAgICBza2ItPmRldiA9IGRldjsKLSNlbmRpZgotCi0gICAgbXZfY3VzdF9yZWNfc2tiKHBvcnQsIHNrYik7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IG12X2N1c3RfbWxkX3R4KGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCi17Ci0gICAgaWYgKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTUxEXS5lbmFibGUgPT0gTVZfQ1VTVF9BUFBfRU5BQkxFKSB7Ci0gICAgICAgIC8qIENoZWNrIGFwcGxpY2F0aW9uIEV0aGVybmV0IHR5cGUgKi8KLSAgICAgICAgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9NTERdLmV0aF90eXBlKSkgewotCi0gICAgICAgICAgICAvKiBUaGUgTWFwcGluZyBhbmQgVkxBTiBtb2Qgc2hvdWxkIGJlIHN1cHBvcnQgaW4gbmV4dCBwaGFzZSAqLwotICAgICAgICAgICAgaWYgKE1WX1BPTl9QT1JUX0lEID09IHBvcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzID0gTVZfRVRIX0ZfTUg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4cCAgICAgPSAwOwotICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4cSAgICAgPSBNVl9DVVNUX1NXRl9UWF9RVUVVRTsKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gMDsKLSNpZmRlZiBDT05GSUdfTVZfRVRIX1RYX1NQRUNJQUwKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKLSNlbmRpZgotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9MUEJLX0RFVEVDVF9IQU5ETEUKLXZvaWQgbXZfY3VzdF9sb29wZGV0X3ByaW50KHZvaWQpCi17Ci0gICAgcHJpbnRrKCIqKioqKioqKioqKioqIFVOSSBsb29wYmFjayBkZXRlY3Rpb24gQ29uZmlndXJhdGlvbiAqKioqKioqKioqKioqKioqKlxuXG4iKTsKLSAgICBwcmludGsoIkxwYmsgZGV0ZWN0IHZhbGlkID0gJWQsICBldGh0eXBlID0gMHglMDR4IFxuIiwKLSAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9MUEJLXS5lbmFibGUsIAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX0xQQktdLmV0aF90eXBlKTsKLSAgICBwcmludGsoIkxwYmsgZGV0ZWN0IGRlZmF1bHQgdHhxID0gJWRcbiIsTVZfQ1VTVF9TV0ZfVFhfUVVFVUUpOwotICAgIHByaW50aygiXG4iKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X2xvb3BkZXRfcGFyc2UodWludDhfdCAqZGF0YSkKLXsKLSAgICB1aW50MTZfdCBldHk7Ci0gICAgdWludDhfdCAqZmllbGRwID0gZGF0YSArIE1WX0VUSF9NSF9TSVpFICsgRVRIX0FMRU4gKyBFVEhfQUxFTjsKLQotICAgIC8qIExvb3AgdGhyb3VnaCBWTEFOIHRhZ3MgKi8KLSAgICBldHkgPSBudG9ocygqKHVpbnQxNl90ICopZmllbGRwKTsKLSAgICB3aGlsZSAoZXR5ID09IDB4ODEwMCB8fCBldHkgPT0gMHg5MTAwIHx8ZXR5ID09IDB4ODhBOCkgewotICAgICAgICBmaWVsZHArPSBWTEFOX0hMRU47Ci0gICAgICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIH0KLSAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXM6IGV0eSAweCglMDR4KVxuIiwgX19mdW5jX18sIGV0eSk7Ci0KLSAgICAvKiBDb21wYXJlIEVQT04gT0FNIGV0aGVyX3R5cGUgKi8KLSAgICBpZiAoZXR5ID09IGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTFBCS10uZXRoX3R5cGUpCi0gICAgICAgIHJldHVybigxKTsKLQotICAgIHJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X2xvb3BkZXRfcngoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCi17Ci0gICAgdWludDMyX3QgcnhfYnl0ZXM7Ci0KLSAgICBpZiAoIW12X2N1c3RfbG9vcGRldF9wYXJzZShza2ItPmRhdGEpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICAvKiBUbyBJbmRpY2F0ZSB0aGUgc291cmNlIEdNQUMgKi8KLSAgICBza2ItPmRhdGFbMF0gPSBwb3J0OwotCi0gICAgcnhfYnl0ZXMgPSByeF9kZXNjLT5kYXRhU2l6ZTsKLQotICAgIHNrYi0+dGFpbCArPSByeF9ieXRlczsKLSAgICBza2ItPmxlbiA9IHJ4X2J5dGVzOwotICAgIHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTFBCS10uZXRoX3R5cGUpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKLSAgICBza2ItPmRldiA9IGRldjsKLSNlbmRpZgotICAgIG12X2N1c3RfcmVjX3NrYihwb3J0LCBza2IpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBtdl9jdXN0X2xvb3BkZXRfdHgoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCi17Ci0gICAgaWYgKE1WX0NVU1RfQVBQX0VOQUJMRSA9PSBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX0xQQktdLmVuYWJsZSkgewotICAgICAgICAvKiBDaGVjayBhcHBsaWNhdGlvbiBFdGhlcm5ldCB0eXBlICovCi0gICAgICAgIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTFBCS10uZXRoX3R5cGUpKSB7Ci0gICAgICAgICAKLSAgICAgICAgICAgIGlmIChNVl9QT05fUE9SVF9JRCA9PSBwb3J0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyA9IE1WX0VUSF9GX01IOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHAgICAgID0gMDsKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gTVZfQ1VTVF9TV0ZfVFhfUVVFVUU7Ci0gICAgICAgICAgICB0eF9zcGVjX291dC0+aHdfY21kICA9IDA7Ci0jaWZkZWYgQ09ORklHX01WX0VUSF9UWF9TUEVDSUFMCi0gICAgICAgICAgICB0eF9zcGVjX291dC0+dHhfZnVuYyA9IE5VTEw7Ci0jZW5kaWYgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFCi1zdGF0aWMgaW5saW5lIHZvaWQgbXZfY3VzdF9jb3B5X3R4X3NwZWMoc3RydWN0IG12X2V0aF90eF9zcGVjICogdHhfc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR4cCwgdWludDhfdCB0eHEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCkKLXsKLSAgICB0eF9zcGVjLT50eHAgPSB0eHA7Ci0gICAgdHhfc3BlYy0+dHhxID0gdHhxOwotICAgIHR4X3NwZWMtPmh3X2NtZCA9IGh3X2NtZDsKLSAgICB0eF9zcGVjLT5mbGFncyA9IGZsYWdzOwotfQotCi1pbnQgbXZfY3VzdF91ZHBfc3BlY19wcmludChpbnQgcG9ydCkKLXsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgZXRoX3BvcnQgKnBwID0gbXZfZXRoX3BvcnRfYnlfaWQocG9ydCk7Ci0gICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgKnVkcF9zcGVjOwotCi0gICAgaWYgKCFwcCkKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICB1ZHBfc3BlYyA9ICYodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdFswXSk7Ci0KLSAgICBwcmludGsoIlxuKioqKiBwb3J0ICMlZCAtIFRYIFVEUCBEZXN0IFBvcnQgY29uZmlndXJhdGlvbiAqKioqKlxuIiwgcG9ydCk7Ci0gICAgcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICBwcmludGsoIklEIHVkcF9kc3QgICB0eHAgICAgdHhxICAgIGZsYWdzICAgIGh3X2NtZCAgICAgZnVuY19hZGRcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdCkvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3RbMF0pOyBpKyspIHsKLSAgICAgICAgaWYgKHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxICE9IE1WX0VUSF9UWFFfSU5WQUxJRCkKLSAgICAgICAgICAgIHByaW50aygiJTJkICAgJTA0ZCAgICAgICVkICAgICAgJWQgICAgIDB4JTA0eCAgIDB4JTA4eCAgIDB4JXBcbiIsCi0gICAgICAgICAgICAgICAgICAgaSwgbnRvaHModWRwX3NwZWNbaV0udWRwX3BvcnQpLAotICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhwLCB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSwKLSAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLmZsYWdzLCB1ZHBfc3BlY1tpXS50eF9zcGVjLmh3X2NtZCwKLSAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4X2Z1bmMpOwotICAgIH0KLSAgICBwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQotICAgIHVkcF9zcGVjID0gJih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjWzBdKTsKLQotICAgIHByaW50aygiKioqKiBwb3J0ICMlZCAtIFRYIFVEUCBTb3VyY2UgUG9ydCBjb25maWd1cmF0aW9uICoqKioqXG4iLCBwb3J0KTsKLSAgICBwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICBwcmludGsoIklEIHVkcF9zcmMgICB0eHAgICAgdHhxICAgICBmbGFncyAgICBod19jbWQgICAgIGZ1bmNfYWRkXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmMpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjWzBdKTsgaSsrKSB7Ci0gICAgICAgIGlmICh1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpCi0gICAgICAgICAgICBwcmludGsoIiUyZCAgICUwNGQgICAgICAlZCAgICAgICVkICAgICAweCUwNHggICAweCUwOHggICAweCVwXG4iLAotICAgICAgICAgICAgICAgICAgIGksIG50b2hzKHVkcF9zcGVjW2ldLnVkcF9wb3J0KSwKLSAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cCwgdWRwX3NwZWNbaV0udHhfc3BlYy50eHEsCi0gICAgICAgICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy5mbGFncywgdWRwX3NwZWNbaV0udHhfc3BlYy5od19jbWQsCi0gICAgICAgICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy50eF9mdW5jKTsKLSAgICB9Ci0gICAgcHJpbnRrKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi12b2lkIG12X2N1c3RfdWRwX3NwZWNfcHJpbnRfYWxsKHZvaWQpCi17Ci0gICAgaW50IHBvcnQ7Ci0KLSAgICBmb3IgKHBvcnQ9MDtwb3J0IDwgQ09ORklHX01WX0VUSF9QT1JUU19OVU0gO3BvcnQrKykgewotICAgICAgICBtdl9jdXN0X3VkcF9zcGVjX3ByaW50KHBvcnQpOwotICAgIH0KLX0KLQotTVZfU1RBVFVTICBtdl9jdXN0X3VkcF9pbnRfc3BlY19zZXQoc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgKnVkcF9zcGVjLCB1aW50MTZfdCB1ZHBfcG9ydCwgaW50IHRhYmxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHR4cCwgdWludDhfdCB0eHEsIHVpbnQxNl90IGZsYWdzLCB1aW50MzJfdCBod19jbWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBDaGVjayBpZiBhbHJlYWR5IGV4aXN0cyAqLwotICAgIGZvciAoaT0wOyBpIDwgdGFibGVfc2l6ZTtpKyspIHsKLSAgICAgICAgaWYgKHVkcF9zcGVjW2ldLnVkcF9wb3J0ID09IGh0b25zKHVkcF9wb3J0KSAmJgotICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy50eHEgIT0gTVZfRVRIX1RYUV9JTlZBTElEKSB7Ci0gICAgICAgICAgICBtdl9jdXN0X2NvcHlfdHhfc3BlYygmKHVkcF9zcGVjW2ldLnR4X3NwZWMpLCB0eHAsIHR4cSwgZmxhZ3MsIGh3X2NtZCk7Ci0gICAgICAgICAgICByZXR1cm4gTVZfT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogQ2hlY2sgZW1wdHkgKi8KLSAgICBmb3IgKGk9MDsgaSA8IHRhYmxlX3NpemU7aSsrKSB7Ci0gICAgICAgIGlmICh1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSA9PSBNVl9FVEhfVFhRX0lOVkFMSUQpIHsKLSAgICAgICAgICAgIHVkcF9zcGVjW2ldLnVkcF9wb3J0ID0gaHRvbnModWRwX3BvcnQpOwotICAgICAgICAgICAgbXZfY3VzdF9jb3B5X3R4X3NwZWMoJih1ZHBfc3BlY1tpXS50eF9zcGVjKSwgdHhwLCB0eHEsIGZsYWdzLCBod19jbWQpOwotICAgICAgICAgICAgcmV0dXJuIE1WX09LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKE1WX0ZVTEwpOwotfQotCi0KLU1WX1NUQVRVUyAgbXZfY3VzdF91ZHBfc3JjX3NwZWNfc2V0KGludCB0eF9wb3J0LCB1aW50MTZfdCB1ZHBfc3JjX3BvcnQsIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCkKLXsKLSAgICBzdHJ1Y3QgZXRoX3BvcnQgKnBwID0gbXZfZXRoX3BvcnRfYnlfaWQodHhfcG9ydCk7Ci0gICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgKnVkcF9zcmNfc3BlYyA9IHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmM7Ci0gICAgTVZfU1RBVFVTIG12X3N0YXR1czsKLQotICAgIGlmICghcHApCi0gICAgICAgIHJldHVybiAtRU5PREVWOwotCi0gICAgbXZfc3RhdHVzID0gbXZfY3VzdF91ZHBfaW50X3NwZWNfc2V0KHVkcF9zcmNfc3BlYywgdWRwX3NyY19wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyYykvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmNbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHAsIHR4cSwgZmxhZ3MsIGh3X2NtZCk7Ci0KLSAgICBpZiAobXZfc3RhdHVzICE9IE1WX09LKQotICAgICAgICBwcmludGsoIiVzOiBVRFAgU3BlY2lhbCBTb3VyY2UgUG9ydCBUYWJsZSBpcyBmdWxsXG4iLCBfX2Z1bmNfXyk7Ci0KLSAgICByZXR1cm4obXZfc3RhdHVzKTsKLX0KLUVYUE9SVF9TWU1CT0wobXZfY3VzdF91ZHBfc3JjX3NwZWNfc2V0KTsKLQotCi1NVl9TVEFUVVMgIG12X2N1c3RfdWRwX2Rlc3Rfc3BlY19zZXQoaW50IHR4X3BvcnQsIHVpbnQxNl90IHVkcF9kZXN0X3BvcnQsIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCkKLXsKLSAgICBzdHJ1Y3QgZXRoX3BvcnQgKnBwID0gbXZfZXRoX3BvcnRfYnlfaWQodHhfcG9ydCk7Ci0gICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgKnVkcF9kc3Rfc3BlYyA9IHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3Q7Ci0gICAgTVZfU1RBVFVTIG12X3N0YXR1czsKLQotICAgIGlmICghcHApCi0gICAgICAgIHJldHVybiAtRU5PREVWOwotCi0gICAgbXZfc3RhdHVzID0gbXZfY3VzdF91ZHBfaW50X3NwZWNfc2V0KHVkcF9kc3Rfc3BlYywgdWRwX2Rlc3RfcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3QpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfZHN0WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhwLCB0eHEsIGZsYWdzLCBod19jbWQpOwotCi0gICAgaWYgKG12X3N0YXR1cyAhPSBNVl9PSykKLSAgICAgICAgcHJpbnRrKCIlczogVURQIFNwZWNpYWwgRGVzdC4gUG9ydCBUYWJsZSBpcyBmdWxsXG4iLCBfX2Z1bmNfXyk7Ci0KLSAgICByZXR1cm4obXZfc3RhdHVzKTsKLX0KLUVYUE9SVF9TWU1CT0wobXZfY3VzdF91ZHBfZGVzdF9zcGVjX3NldCk7Ci0KLQotdm9pZCAgbXZfY3VzdF91ZHBfdGFibGVfZGVsKHZvaWQpCi17Ci0gICAgaW50IG51bV9wb3J0cyA9IFBPUlRfRU5UUklFUzsKLSAgICBpbnQgdHhfcG9ydCwgaTsKLQotICAgIGlmIChudW1fcG9ydHMgPiBtdl9ldGhfcG9ydHNfbnVtKQotICAgICAgICBudW1fcG9ydHMgPSBtdl9ldGhfcG9ydHNfbnVtOwotCi0KLSAgICBmb3IgKHR4X3BvcnQ9MDsgdHhfcG9ydDxudW1fcG9ydHM7dHhfcG9ydCsrKSB7Ci0KLSAgICAgICAgLyogSW52YWxpZGF0ZSBVRFAgRGVzdCBwb3J0cywgc2V0IHR4cT1pbnZhbGlkICAqLwotICAgICAgICBmb3IgKGk9MDtpPChzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdCkvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3RbMF0pKTtpKyspIHsKLSAgICAgICAgICAgIG1lbXNldCgmKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3RbaV0pLCAwLCBzaXplb2Yoc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMpKTsKLSAgICAgICAgICAgIHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3RbaV0udHhfc3BlYy50eHEgPSBNVl9FVEhfVFhRX0lOVkFMSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJbnZhbGlkYXRlIFVEUCBTb3VyY2UgcG9ydHMsICwgc2V0IHR4cT1pbnZhbGlkICovCi0gICAgICAgIGZvciAoaT0wO2k8KHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjKS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyY1swXSkpO2krKykgewotICAgICAgICAgICAgbWVtc2V0KCYodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyY1tpXSksIDAsIHNpemVvZihzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYykpOwotICAgICAgICAgICAgdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyY1tpXS50eF9zcGVjLnR4cSA9IE1WX0VUSF9UWFFfSU5WQUxJRDsKLSAgICAgICAgfQotCi0gICAgfQotICAgIHJldHVybjsKLX0KLQotaW50IG12X2N1c3RfdWRwX3BvcnRfdHgoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQotewotICAgIHN0cnVjdCBpcGhkciAgKiBpcGhkcnAgICA9IE5VTEw7Ci0gICAgc3RydWN0IHVkcGhkciAqIHVkcGhkcnAgID0gTlVMTDsKLSAgICBpbnQgaTsKLQotICAgIGlmIChwb3J0ID4gQ09ORklHX01WX0VUSF9QT1JUU19OVU0pIHsKLSAgICAgICAgcHJpbnRrKCJQb3J0IEVycm9yXG4iKTsKLSAgICAgICAgcmV0dXJuKDApOwotICAgIH0KLQotICAgIGlmIChza2ItPnByb3RvY29sID09IEVUWV9JUFY0KSB7Ci0gICAgICAgIC8qIEdldCBVRFAgUG9ydCAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMikKLSAgICBpcGhkcnAgPSBza2ItPm5oLmlwaDsKLSNlbHNlCi0gICAgaXBoZHJwID0gaXBfaGRyKHNrYik7Ci0jZW5kaWYKLQotICAgICAgICBpZiAoKGlwaGRycCkgJiYgKGlwaGRycC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIyKQotICAgICAgICB1ZHBoZHJwID0gc2tiLT5oLnVoOwotI2Vsc2UKLSAgICAgICAgdWRwaGRycCA9IHVkcF9oZHIoc2tiKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKHVkcGhkcnApIHsKLSAgICAgICAgICAgICAgICBpZiAodWRwaGRycCA9PSAoc3RydWN0IHVkcGhkciAqKWlwaGRycCkgewotICAgICAgICAgICAgICAgICAgICB1ZHBoZHJwID0gKHN0cnVjdCB1ZHBoZHIgKikoKGNoYXIgKil1ZHBoZHJwICsgKDQqKGlwaGRycC0+aWhsKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBGaW5kIGNvbmZpZ3VyZWQgVURQIFNvdXJjZSBQb3J0Ki8KLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjKS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1swXSk7aSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodWRwaGRycC0+c291cmNlID09IHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbaV0udWRwX3BvcnQpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkgKHR4X3NwZWNfb3V0LCAmKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbaV0udHhfc3BlYyksIHNpemVvZihzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlczogZm91bmQgdWRwX3NyYyAweCglMDR4KVxuIiwgX19mdW5jX18sIG50b2hzKHVkcGhkcnAtPnNvdXJjZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRmluZCBjb25maWd1cmVkIFVEUCBEZXN0LiBQb3J0Ki8KLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0KS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdFswXSk7aSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodWRwaGRycC0+ZGVzdCA9PSB1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0W2ldLnVkcF9wb3J0KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbaV0udHhfc3BlYy50eHEgIT0gTVZfRVRIX1RYUV9JTlZBTElEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5ICh0eF9zcGVjX291dCwgJih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0W2ldLnR4X3NwZWMpLCBzaXplb2Yoc3RydWN0IG12X2V0aF90eF9zcGVjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiJXM6IGZvdW5kIHVkcF9kc3QgMHgoJTA0eClcbiIsIF9fZnVuY19fLCBudG9ocyh1ZHBoZHJwLT5kZXN0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBpZiAoIChwb3J0ID09IE1WX1BPTl9QT1JUX0lEKSAmJiBtdl9jdXN0X2RlYnVnX2NvZGUpIHsKLSAgICAgICAgICAgIHByaW50aygiJXM6REVCVUcgOiBQYWNrZXQgVURQLCB1ZHAgc291cmNlIG9yIGRlc3QgcG9ydCBub3QgZm91bmQgdWRwX3NyYygleCl4IHVkcF9kc3QoJXgpeFxuIiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyxudG9ocyh1ZHBoZHJwLT5zb3VyY2UpLCBudG9ocyh1ZHBoZHJwLT5kZXN0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAocG9ydCA9PSBNVl9QT05fUE9SVF9JRCkgJiYgbXZfY3VzdF9kZWJ1Z19jb2RlICkKLSAgICAgICAgICAgIHByaW50aygiJXM6REVCVUcgOiBOT1QgVURQLCBpcF9wcm90byglZCkgXG4iLCBfX2Z1bmNfXywgaXBoZHJwLT5wcm90b2NvbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAocG9ydCA9PSBNVl9QT05fUE9SVF9JRCkgJiYgbXZfY3VzdF9kZWJ1Z19jb2RlICkKLSAgICAgICAgcHJpbnRrKCIlczpERUJVRyA6IE5PVCBJUCwgcHJvdG8oJWQpIFxuIiwgX19mdW5jX18sIHNrYi0+cHJvdG9jb2wpOwotCi0gICAgcmV0dXJuIDA7Ci0KLX0KLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUKLXZvaWQgbXZfY3VzdF9mbG93X21hcF9wcmludCh2b2lkKQotewotICAgIHByaW50aygiKioqKioqKioqKioqKiBGbG93IE1hcHBpbmcgQ29uZmlndXJhdGlvbiAqKioqKioqKioqKioqKioqKlxuXG4iKTsKLSAgICBwcmludGsoIkZsb3cgbWFwcGluZyB2YWxpZCA9ICVkXG4iLCBtdl9jdXN0X2Zsb3dfbWFwKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X2Zsb3dfbWFwX3BhcnNlKHVpbnQ4X3QgKmRhdGEsIHVpbnQxNl90ICp2bGFuLCB1aW50OF90ICpwYml0cywgdWludDhfdCBkaXIpCi17Ci0gICAgdWludDE2X3QgZXR5OwotICAgIHVpbnQ4X3QgKmZpZWxkcCA7Ci0KLSAgICBpZiAoTVZfQ1VTVF9GTE9XX0RJUl9VUyA9PSBkaXIpCi0gICAgICAgIGZpZWxkcCA9IGRhdGEgKyBFVEhfQUxFTiArIEVUSF9BTEVOOwotICAgIGVsc2UKLSAgICAgICAgZmllbGRwID0gZGF0YSArIEVUSF9BTEVOICsgRVRIX0FMRU4gKyBNVl9FVEhfTUhfU0laRTsKLQotICAgIC8qIExvb3AgdGhyb3VnaCBWTEFOIHRhZ3MgKi8KLSAgICBldHkgPSBudG9ocygqKHVpbnQxNl90ICopZmllbGRwKTsKLSAgICBpZiAoZXR5ID09IDB4ODEwMCB8fCBldHkgPT0gMHg4OEE4IHx8IGV0eSA9PSAweDkxMDApIHsKLSAgICAgICAgZmllbGRwICs9IDI7Ci0gICAgICAgICp2bGFuICA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgICAgICAqcGJpdHMgPSAoKnZsYW4gPj4gMTMgKSAmIDB4NzsKLSAgICAgICAgKnZsYW4gID0gKCp2bGFuKSAmIDB4ZmZmOwotICAgICAgICByZXR1cm4oMSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfZmxvd19tYXBfbW9kKHVpbnQ4X3QgKmRhdGEsIHVpbnQxNl90IHZpZCwgdWludDhfdCBwYml0cywgdWludDhfdCBkaXIpCi17Ci0gICAgdWludDE2X3QgZXR5ICA9IDA7Ci0gICAgdWludDE2X3QgdmxhbiA9IDA7Ci0gICAgdWludDhfdCAqZmllbGRwOwotCi0gICAgaWYgKE1WX0NVU1RfRkxPV19ESVJfVVMgPT0gZGlyKQotICAgICAgICBmaWVsZHAgPSBkYXRhICsgRVRIX0FMRU4gKyBFVEhfQUxFTjsKLSAgICBlbHNlCi0gICAgICAgIGZpZWxkcCA9IGRhdGEgKyBFVEhfQUxFTiArIEVUSF9BTEVOICsgTVZfRVRIX01IX1NJWkU7Ci0KLSAgICAvKiBJZiBub3QgbmVlZCB0byBtb2RpZnkgVklEIG9yIFAtYml0cyAqLwotICAgIGlmKCh2aWQgPT0gTVZfQ1VTVF9WSURfTk9UX0NBUkVfVkFMVUUpICYmCi0gICAgICAgKHBiaXRzID09IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUUpKQotICAgICAgICByZXR1cm4gKDEpOwotCi0gICAgLyogTG9vcCB0aHJvdWdoIFZMQU4gdGFncyAqLwotICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIGlmIChldHkgPT0gMHg4MTAwIHx8IGV0eSA9PSAweDg4QTggfHwgZXR5ID09IDB4OTEwMCkgewotICAgICAgICBmaWVsZHAgKz0gMjsKLQotICAgICAgICB2bGFuID0gbnRvaHMoKih1aW50MTZfdCAqKWZpZWxkcCk7Ci0KLSAgICAgICAgaWYgKHZpZCA8IE1WX0NVU1RfVklEX05PVF9DQVJFX1ZBTFVFKQotICAgICAgICAgICAgdmxhbiA9ICh2bGFuICYgMHhmMDAwKSB8ICh2aWQgJiAweGZmZik7Ci0gICAgICAgIGlmIChwYml0cyA8IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUUpCi0gICAgICAgICAgICB2bGFuID0gKHZsYW4gJiAweDBmZmYpIHwgKChwYml0cyAmIDB4NykgPDwgMTMpOwotCi0gICAgICAgICoodWludDE2X3QgKilmaWVsZHAgPSBodG9ucyh2bGFuKTsKLSAgICAgICAgcmV0dXJuKDEpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuKDApOwotICAgIH0KLQotICAgIHJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X2Zsb3dfbWFwX3J4KGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKQotewotICAgIHVpbnQxNl90IHZsYW4gICAgICAgID0gMDsKLSAgICB1aW50OF90ICBwYml0cyAgICAgICA9IDA7Ci0gICAgaW50ICAgICAgYnRhZyAgICAgICAgPSAwOwotICAgIGludCAgICAgIHJldCAgICAgICAgID0gMDsKLSAgICBtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgY3VzdF9mbG93OwotCi0gICAgaWYgKE1WX1BPTl9QT1JUX0lEICE9IHBvcnQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKG12X2N1c3RfZmxvd19tYXApIHsKLQotICAgICAgICAvKiBQYXJzZSBwYWNrZXRzIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMgdGFnZ2VkIG9yIHVudGFnZ2VkLCBhbmQgZ2V0IHZsYW4gYW5kIHBiaXRzIGluIHRhZ2dlZCBtb2RlICovCi0gICAgICAgIGJ0YWcgPSBtdl9jdXN0X2Zsb3dfbWFwX3BhcnNlKHNrYi0+ZGF0YSwgJnZsYW4sICZwYml0cywgTVZfQ1VTVF9GTE9XX0RJUl9EUyk7Ci0gICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICIgJXMgVFggcGFja2V0IDEgYnRhZ1slZF0gdmxhblslZF0gIHBiaXRzWyVkXVxuIiwgX19mdW5jX18sIGJ0YWcsIHZsYW4sIHBiaXRzKTsKLQotICAgICAgICAvKiBUaGUgZnJhbWUgaXMgdGFnZ2VkICovCi0gICAgICAgIGlmIChidGFnID09IDEpIHsKLSAgICAgICAgICAgIGN1c3RfZmxvdy52aWQgICAgPSB2bGFuOwotICAgICAgICAgICAgY3VzdF9mbG93LnBiaXRzICA9IHBiaXRzOwotICAgICAgICAgICAgY3VzdF9mbG93LmRpciAgICA9IE1WX0NVU1RfRkxPV19ESVJfRFM7Ci0KLSAgICAgICAgICAgIHJldCA9IG12X2N1c3RfdGFnX21hcF9ydWxlX2dldCgmY3VzdF9mbG93KTsKLSAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICIgJXMgVFggcGFja2V0IDIgdHJnX3BvcnRbJWRdIHRyZ19xdWV1ZVslZF0gIGdlbV9wb3J0WyVkXVxuIiwgX19mdW5jX18sIHBrdF9md2QudHJnX3BvcnQsIHBrdF9md2QudHJnX3F1ZXVlLCBwa3RfZndkLmdlbV9wb3J0KTsKLQotICAgICAgICAgICAgLyogTW9kaWZ5IFZJRCBhbmQgUC1iaXRzIGlmIG5lZWRlZCAqLwotICAgICAgICAgICAgaWYgKHJldCA9PSBNVl9DVVNUX09LKSB7Ci0KLSAgICAgICAgICAgICAgICAvKiBtb2RpZnkgVklEIGFuZCBQLWJpdHMgaWYgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgcmV0ID0gbXZfY3VzdF9mbG93X21hcF9tb2Qoc2tiLT5kYXRhLCBjdXN0X2Zsb3cubW9kX3ZpZCwgY3VzdF9mbG93Lm1vZF9wYml0cywgTVZfQ1VTVF9GTE9XX0RJUl9EUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IG12X2N1c3RfZmxvd19tYXBfdHgoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQotewotICAgIHN0cnVjdCBpcGhkciAqaXBoZHJwID0gTlVMTDsKLSAgICB1aW50MTZfdCB2bGFuICAgICAgICA9IDA7Ci0gICAgdWludDhfdCAgcGJpdHMgICAgICAgPSAwOwotICAgIGludCAgICAgIGJ0YWcgICAgICAgID0gMDsKLSAgICBpbnQgICAgICByZXQgICAgICAgICA9IDA7Ci0gICAgbXZfY3VzdF9pb2N0bF9mbG93X21hcF90IGN1c3RfZmxvdzsKLQotICAgIGlmIChNVl9QT05fUE9SVF9JRCAhPSBwb3J0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChtdl9jdXN0X2Zsb3dfbWFwKSB7Ci0KLSAgICAgICAgY3VzdF9mbG93LmRpciAgPSBNVl9DVVNUX0ZMT1dfRElSX1VTOwotCi0gICAgICAgIC8qIFBhcnNlIHBhY2tldHMgdG8gY2hlY2sgd2hldGhlciBpdCBpcyB0YWdnZWQgb3IgdW50YWdnZWQsIGFuZCBnZXQgdmxhbiBhbmQgcGJpdHMgaW4gdGFnZ2VkIG1vZGUgKi8KLSAgICAgICAgYnRhZyA9IG12X2N1c3RfZmxvd19tYXBfcGFyc2Uoc2tiLT5kYXRhLCAmdmxhbiwgJnBiaXRzLCBNVl9DVVNUX0ZMT1dfRElSX1VTKTsKLQotICAgICAgICAvKiBUaGUgZnJhbWUgaXMgdGFnZ2VkICovCi0gICAgICAgIGlmIChidGFnID09IDEpIHsKLSAgICAgICAgICAgIGN1c3RfZmxvdy52aWQgICAgPSB2bGFuOwotICAgICAgICAgICAgY3VzdF9mbG93LnBiaXRzICA9IHBiaXRzOwotCi0gICAgICAgICAgICByZXQgPSBtdl9jdXN0X3RhZ19tYXBfcnVsZV9nZXQoJmN1c3RfZmxvdyk7Ci0gICAgICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAiICVzIFRYIHBhY2tldCAyIHRyZ19wb3J0WyVkXSB0cmdfcXVldWVbJWRdICBnZW1fcG9ydFslZF1cbiIsIF9fZnVuY19fLCBwa3RfZndkLnRyZ19wb3J0LCBwa3RfZndkLnRyZ19xdWV1ZSwgcGt0X2Z3ZC5nZW1fcG9ydCk7Ci0KLSAgICAgICAgICAgIC8qIFNldCBHRU0gcG9ydCwgdGFyZ2V0IHBvcnQgYW5kIHF1ZXVlICovCi0gICAgICAgICAgICBpZiAocmV0ID09IE1WX0NVU1RfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4cCAgICAgPSAodTgpY3VzdF9mbG93LnBrdF9mcndkLnRyZ19wb3J0OwotICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhxICAgICA9ICh1OCljdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3F1ZXVlOwotICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+aHdfY21kICA9ICgoY3VzdF9mbG93LnBrdF9mcndkLmdlbV9wb3J0IDw8IDgpfDB4MDAxMCk7Ci0gICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzICAgPSBNVl9FVEhfRl9NSDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBtb2RpZnkgVklEIGFuZCBQLWJpdHMgaWYgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IG12X2N1c3RfZmxvd19tYXBfbW9kKHNrYi0+ZGF0YSwgY3VzdF9mbG93Lm1vZF92aWQsIGN1c3RfZmxvdy5tb2RfcGJpdHMsIE1WX0NVU1RfRkxPV19ESVJfVVMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyogTG9vayBmb3IgcnVsZXMgdGhhdCBkb2VzIG5vdCBjYXJlIFZMQU4gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3cudmlkICAgPSBNVl9DVVNUX0RFRkFVTFRfU0lOR0xFX1RBR19SVUxFOwotICAgICAgICAgICAgICAgIHJldCA9IG12X2N1c3RfdGFnX21hcF9ydWxlX2dldCgmY3VzdF9mbG93KTsKLQotICAgICAgICAgICAgICAgIC8qIFNldCBHRU0gcG9ydCwgdGFyZ2V0IHBvcnQgYW5kIHF1ZXVlICovCi0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSBNVl9DVVNUX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhwICAgICA9ICh1OCljdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3BvcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhxICAgICA9ICh1OCljdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3F1ZXVlOwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmh3X2NtZCAgPSAoKGN1c3RfZmxvdy5wa3RfZnJ3ZC5nZW1fcG9ydCA8PCA4KXwweDAwMTApOwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4X2Z1bmMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzICAgPSBNVl9FVEhfRl9NSDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kaWZ5IFZJRCBhbmQgUC1iaXRzIGlmIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbXZfY3VzdF9mbG93X21hcF9tb2Qoc2tiLT5kYXRhLCBjdXN0X2Zsb3cubW9kX3ZpZCwgY3VzdF9mbG93Lm1vZF9wYml0cywgTVZfQ1VTVF9GTE9XX0RJUl9VUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogVGhlIGZyYW1lIGlzIHVudGFnZ2VkLCB0cnkgdG8gZ2V0IERTQ1AgdmFsdWUgKi8KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2tiLT5wcm90b2NvbCA9PSBFVFlfSVBWNCkgewotICAgICAgICAgICAgICAgIC8qIEdldCBVRFAgUG9ydCAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMikKLSAgICAgICAgICAgICAgICBpcGhkcnAgPSBza2ItPm5oLmlwaDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgaXBoZHJwID0gaXBfaGRyKHNrYik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3cuZHNjcCAgPSAoaXBoZHJwLT50b3MgPj4gMikgJiAweDNmOwotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5kaXIgICA9IE1WX0NVU1RfRkxPV19ESVJfVVM7Ci0KLSAgICAgICAgICAgICAgICByZXQgPSBtdl9jdXN0X3VudGFnX21hcF9ydWxlX2dldCgmY3VzdF9mbG93KTsKLSAgICAgICAgICAgICAgICAvKiBTZXQgR0VNIHBvcnQsIHRhcmdldCBwb3J0IGFuZCBxdWV1ZSAqLwotICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gTVZfQ1VTVF9PSykgewotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4cCAgICAgPSBjdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3BvcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhxICAgICA9IGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+aHdfY21kICA9ICgoY3VzdF9mbG93LnBrdF9mcndkLmdlbV9wb3J0IDw8IDgpfDB4MDAxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhfZnVuYyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgICA9IE1WX0VUSF9GX01IOzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5kc2NwICA9IDA7Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LmRpciAgID0gTVZfQ1VTVF9GTE9XX0RJUl9VUzsKLQotICAgICAgICAgICAgICAgIHJldCA9IG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3cpOwotICAgICAgICAgICAgICAgIC8qIFNldCBHRU0gcG9ydCwgdGFyZ2V0IHBvcnQgYW5kIHF1ZXVlICovCi0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSBNVl9DVVNUX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhwICAgICA9IGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gY3VzdF9mbG93LnBrdF9mcndkLnRyZ19xdWV1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gKChjdXN0X2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQgPDwgOCl8MHgwMDEwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyAgID0gTVZfRVRIX0ZfTUg7OwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi0KLQotdm9pZCBtdl9jdXN0X3ByaW50KGludCB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfSUdNUF9IQU5ETEUKLSAgICAgICAgY2FzZSBNVl9DVVNUX0FQUF9UWVBFX0lHTVA6Ci0gICAgICAgICAgICBtdl9jdXN0X2lnbXBfcHJpbnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfTUxEX0hBTkRMRQotICAgICAgICBjYXNlIE1WX0NVU1RfQVBQX1RZUEVfTUxEOgotICAgICAgICAgICAgbXZfY3VzdF9tbGRfcHJpbnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfTFBCS19ERVRFQ1RfSEFORExFCi0gICAgICAgIGNhc2UgTVZfQ1VTVF9BUFBfVFlQRV9MUEJLOgotICAgICAgICAgICAgbXZfY3VzdF9sb29wZGV0X3ByaW50KCk7Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICBjYXNlIE1WX0NVU1RfQVBQX1RZUEVfT0FNOgotICAgICAgICAgICAgbXZfY3VzdF9lb2FtX3ByaW50KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNVl9DVVNUX0FQUF9UWVBFX09NQ0k6Ci0gICAgICAgICAgICBtdl9jdXN0X29tY2lfcHJpbnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotRVhQT1JUX1NZTUJPTChtdl9jdXN0X3ByaW50KTsKLQotCi12b2lkIG12X2N1c3RfcnhfZnVuYyhpbnQgcG9ydCwgaW50IHJ4cSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCi17Ci0gICAgdWludDMyX3QgaTsKLQotICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOwotCi0gICAgaWYgKGRldiA9PSBOVUxMIHx8IHNrYiA9PSBOVUxMIHx8IHJ4X2Rlc2MgPT0gTlVMTCkgewotICAgICAgICBwcmludGsoIiVzOiBOVUxMIFBvaW50ZXIgZGV2KCVwKSBza2IoJXApIHJ4X2Rlc2MoJXApXG4iLAotICAgICAgICAgICAgICAgX19mdW5jX18sIGRldiwgc2tiLCByeF9kZXNjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyeF9kZXNjLT5wbmNJbmZvICYgTkVUQV9QTkNfUlhfU1BFQ0lBTCkKLSAgICB7Ci0gICAgICAgIGlmIChnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09NQ0ldLmVuYWJsZSA9PSBNVl9DVVNUX0FQUF9FTkFCTEUpIHsKLSAgICAgICAgICAgIGlmIChtdl9jdXN0X29tY2lfcngocG9ydCwgZGV2LCBza2IsIHJ4X2Rlc2MpKSB7Ci0gICAgICAgICAgICAgICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgICAgICAgICBwcmludGsoIiVzIG9tY2lfcGFja2V0XG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgICBpZiAoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmVuYWJsZSA9PSBNVl9DVVNUX0FQUF9FTkFCTEUpIHsKLSAgICAgICAgICAgICAgICBpZiAobXZfY3VzdF9lcG9uX29hbV9yeChwb3J0LCBkZXYsIHNrYiwgcnhfZGVzYykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiJXMgZW9hbV9wYWNrZXRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfSUdNUF9IQU5ETEUKLSAgICAgICAgaWYgKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfSUdNUF0uZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkgewotICAgICAgICAgICAgaWYgKG12X2N1c3RfaWdtcF9yeChwb3J0LCBkZXYsIHNrYiwgcnhfZGVzYykpIHsKLSAgICAgICAgICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiJXMgaWdtcF9wYWNrZXRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfTUxEX0hBTkRMRQotICAgICAgICBpZiAoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9NTERdLmVuYWJsZSA9PSBNVl9DVVNUX0FQUF9FTkFCTEUpIHsKLSAgICAgICAgICAgIGlmIChtdl9jdXN0X21sZF9yeChwb3J0LCBkZXYsIHNrYiwgcnhfZGVzYykpIHsKLSAgICAgICAgICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiJXMgbWxkX3BhY2tldFxuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9MUEJLX0RFVEVDVF9IQU5ETEUKLSAgICAgICAgaWYgKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTFBCS10uZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkgewotICAgICAgICAgICAgaWYgKG12X2N1c3RfbG9vcGRldF9yeChwb3J0LCBkZXYsIHNrYiwgcnhfZGVzYykpIHsKLSAgICAgICAgICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiJXMgbG9vcF9kZXRfcGFja2V0XG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAvL01WQ1VTVF9FUlJfUFJJTlQoIlNwZWNpYWwgcGt0IGFycml2ZWQgZnJvbSBwb3J0KCVkKSwgd2FzIG5vdCBoYW5kbGVkLiBcbiIsIHBvcnQpOwotICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpIHsKLSAgICAgICAgICAgIHByaW50aygiSW5wdXQgUGFja2V0IGZpcnN0IGJ5dGVzOlxuIik7Ci0gICAgICAgICAgICBmb3IgKGk9MDtpPDI0O2krKykgewotICAgICAgICAgICAgICAgIGlmIChpJTg9PSAwKQotICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7Ci0gICAgICAgICAgICAgICAgcHJpbnRrICgiJTAyeCAiLCAqKHNrYi0+ZGF0YSArIGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUKLSAgICAgICAgaWYgKG12X2N1c3RfZmxvd19tYXApIHsKLSAgICAgICAgICAgIGlmIChtdl9jdXN0X2Zsb3dfbWFwX3J4KHBvcnQsIGRldiwgc2tiLCByeF9kZXNjKSkgewotICAgICAgICAgICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyBmbG93IG1hcFxuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSNlbmRpZgotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotCi1pbnQgbXZfY3VzdF90eF9mdW5jKGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQotewotICAgIGlmIChtdl9jdXN0X29tY2lfdHgocG9ydCwgZGV2LCBza2IsIHR4X3NwZWNfb3V0KSkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICBpZiAobXZfY3VzdF9lb2FtX3R4KHBvcnQsIGRldiwgc2tiLCB0eF9zcGVjX291dCkpCi0gICAgICAgIHJldHVybiAxOwotICAgIAotI2lmZGVmIENPTkZJR19NVl9DVVNUX0lHTVBfSEFORExFCi0gICAgaWYgKG12X2N1c3RfaWdtcF90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQotICAgICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfTUxEX0hBTkRMRQotICAgIGlmIChtdl9jdXN0X21sZF90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQotICAgICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfTFBCS19ERVRFQ1RfSEFORExFCi0gICAgaWYgKG12X2N1c3RfbG9vcGRldF90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQotICAgICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgaWYgKG12X2N1c3RfZmxvd19tYXBfdHgocG9ydCwgZGV2LCBza2IsIHR4X3NwZWNfb3V0KSkKLSAgICAgICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFCi0gICAgLyogU2ltcGxlIGV4YW1wbGUgZm9yIFVEUCBTb3VyY2UgUG9ydCBvciBEZXN0IFBvcnQgUGFyc2luZyAqLwotICAgIC8qIFBlciBVRFAgc291cmNlIG9yIGRlc3QgcG9ydCBjb25maWd1cmF0aW9uICovCi0gICAgaWYgKG12X2N1c3RfdWRwX3BvcnRfdHgocG9ydCwgZGV2LCBza2IsIHR4X3NwZWNfb3V0KSkKLSAgICAgICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotICAgIHJldHVybiAwOwotfQotCi0KLWludCBtdmN1c3RfbmV0ZGV2X2luaXQodm9pZCkKLXsKLSAgICB1aW50MzJfdCBwb3J0X2k7Ci0KLSAgICAvKiBSZXRyaWV2ZSBudW1fcG9ydHMsIGFzIGluIG12X2V0aF9pbml0X21vZHVsZSovCi0gICAgbXZfZXRoX3BvcnRzX251bSA9IG12Q3RybEV0aE1heFBvcnRHZXQoKTsKLQotICAgIGlmIChtdl9ldGhfcG9ydHNfbnVtID4gQ09ORklHX01WX0VUSF9QT1JUU19OVU0pCi0gICAgICAgIG12X2V0aF9wb3J0c19udW0gPSBDT05GSUdfTVZfRVRIX1BPUlRTX05VTTsKLQotICAgIG12X2N1c3RfZW9hbV9pbml0KCk7Ci0gICAgCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUKLSAgICBtdl9jdXN0X3VkcF90YWJsZV9kZWwoKTsKLSNlbmRpZgotCi0vKiBJbml0aWFsaXplIGZsb3cgbWFwcGluZyBkYXRhIHN0cnVjdHVyZSAqLwotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgIG12X2N1c3RfZmxvd19tYXBfaW5pdCgpOwotI2VuZGlmCi0KLSAgICAvKiBSZWdpc3RlciBzcGVjaWFsIHJlY2VpdmUgY2hlY2sgZnVuY3Rpb24gKi8KLSNpZmRlZiBDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwKLSAgICBmb3IgKHBvcnRfaT0wO3BvcnRfaTwgbXZfZXRoX3BvcnRzX251bTtwb3J0X2krKykgewotICAgICAgICBtdl9ldGhfcnhfc3BlY2lhbF9wcm9jX2Z1bmMocG9ydF9pLCBtdl9jdXN0X3J4X2Z1bmMpOwotICAgIH0KLSNlbmRpZiAvKiBDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwgKi8KLQotCi0gICAgLyogUmVnaXN0ZXIgc3BlY2lhbCB0cmFuc21pdCBjaGVjayBmdW5jdGlvbiAqLwotI2lmZGVmIENPTkZJR19NVl9FVEhfVFhfU1BFQ0lBTAotICAgIGZvciAocG9ydF9pPTA7cG9ydF9pPCBtdl9ldGhfcG9ydHNfbnVtO3BvcnRfaSsrKSB7Ci0gICAgICAgIG12X2V0aF90eF9zcGVjaWFsX2NoZWNrX2Z1bmMocG9ydF9pLCBtdl9jdXN0X3R4X2Z1bmMpOwotICAgIH0KLSNlbmRpZiAvKiBDT05GSUdfTVZfRVRIX1RYX1NQRUNJQUwgKi8KLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfbmV0ZGV2LmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9uZXRkZXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDA3OTYzMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9uZXRkZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoQykgMjAxMCwgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KLSogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSoKLSogSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgotKiBtb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKLSogUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCi0qIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKLSogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgotKiBvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KLSoKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X25ldGRldi5oCi0qCi0qIERFU0NSSVBUSU9OOgotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19tdl9jdXN0X25ldGRldl9oX18KLSNkZWZpbmUgX19tdl9jdXN0X25ldGRldl9oX18KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0KLSNpbmNsdWRlIDxtdkNvbW1vbi5oPgotI2luY2x1ZGUgPG12T3MuaD4KLSNpbmNsdWRlIDxtdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2Lmg+Ci0KLQotI2RlZmluZSBNVl9DVVNUX01BU19VRFBfU1JDX1BPUlQgICAgICAgICAgOAotI2RlZmluZSBNVl9DVVNUX01BU19VRFBfRFNUX1BPUlQgICAgICAgICAgOAotI2RlZmluZSBNVl9DVVNUX05VTV9MTElEICAgICAgICAgICAgICAgICAgOAotCi0KLXN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjIHsKLSAgICBfX2JlMTYgICAgdWRwX3BvcnQ7Ci0gICAgc3RydWN0IG12X2V0aF90eF9zcGVjIHR4X3NwZWM7Ci19OwotCi1zdHJ1Y3QgbXZfcG9ydF90eF9zcGVjIHsKLSAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyB1ZHBfc3JjW01WX0NVU1RfTUFTX1VEUF9TUkNfUE9SVF07Ci0gICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgdWRwX2RzdFtNVl9DVVNUX01BU19VRFBfRFNUX1BPUlRdOwotfTsKLQotCi1zdHJ1Y3QgbXZfZW9hbV9sbGlkX3NwZWMgewotICAgIHVpbnQ4X3QgbGxpZF9tYWNfYWRkcmVzc1s2XTsKLSAgICBzdHJ1Y3QgIG12X2V0aF90eF9zcGVjIHR4X3NwZWM7Ci19OwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNVl9DVVNUX0FQUF9UWVBFX0lHTVAgPSAwLCAvKiBGb3IgSUdNUCBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICovCi0gICAgTVZfQ1VTVF9BUFBfVFlQRV9NTEQsICAgICAgLyogRm9yIE1MRCBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAqLwotICAgIE1WX0NVU1RfQVBQX1RZUEVfTFBCSywgICAgIC8qIEZvciBsb29wYmFjayBkZXRlY3Rpb24gYXBwbGljYXRpb24gKi8KLSAgICBNVl9DVVNUX0FQUF9UWVBFX09BTSwgICAgICAvKiBGb3IgZU9BTSBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICovCi0gICAgTVZfQ1VTVF9BUFBfVFlQRV9PTUNJLCAgICAgLyogRm9yIE9NQ0kgYXBwbGljYXRpb24gICAgICAgICAgICAgICAqLwotICAgIE1WX0NVU1RfQVBQX1RZUEVfTUFYICAgICAgIC8qIE1heCBudW1iZXIgb2YgYXBwbGljYXRpb24gICAgICAgICAgKi8gCi19IG12X2N1c3RfYXBwX3R5cGVfZTsKLQotLyogIEVudW06IGVuYWJsZSBvciBkaXNhYmxlIGFwcGxpY2F0aW9uKi8KLXR5cGVkZWYgZW51bQotewotICAgIE1WX0NVU1RfQVBQX0RJU0FCTEUgID0gMCwKLSAgICBNVl9DVVNUX0FQUF9FTkFCTEUgICA9IDEsCi19IG12X2N1c3RfYXBwX2ZsYWdfZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBtdl9jdXN0X2FwcF90eXBlX2UgYXBwX3R5cGU7IC8qIEFwcGxpY2F0aW9uIHR5cGUsIHN1Y2ggYXMgSUdNUCwgTUxEICAgICAgICAgICAgICAgICovCi0gICAgdWludDE2X3QgICAgICAgICAgIGVuYWJsZTsgICAvKiBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSBhcHBsaWNhdGlvbiBSeC9UeCAqLyAgICAgICAgIAotICAgIHVpbnQxNl90ICAgICAgICAgICBldGhfdHlwZTsgLyogQXBwbGljYXRpb24gRXRoZXJuZXQgdHlwZSB1c2VkIGZvciBzb2NrZXQvc2tiICAgICAgKi8KLSAgICBjaGFyICAgICAgICAgICAgICAqbmFtZTsgICAgIC8qIFRoZSByZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICovCi19IG12X2N1c3RfYXBwX2NvbmZpZ190OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICAgICAgICBtdl9jdXN0X29tY2lfaHdfY21kX3NldCh1bnNpZ25lZCBpbnQgaHdfY21kKTsKLWludCAgICAgICAgIG12X2N1c3Rfb21jaV90eF9zZXQoaW50IHRjb250LCBpbnQgdHhxKTsKLQotI2lmZGVmICBDT05GSUdfTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRQotTVZfU1RBVFVTICAgbXZfY3VzdF91ZHBfc3JjX3NwZWNfc2V0KGludCB0eF9wb3J0LCB1aW50MTZfdCB1ZHBfc3JjX3BvcnQsIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCk7Ci1NVl9TVEFUVVMgICBtdl9jdXN0X3VkcF9kZXN0X3NwZWNfc2V0KGludCB0eF9wb3J0LCB1aW50MTZfdCB1ZHBfZGVzdF9wb3J0LCB1aW50OF90IHR4cCwgdWludDhfdCB0eHEsIHVpbnQxNl90IGZsYWdzLCB1aW50MzJfdCBod19jbWQpOwotI2VuZGlmCi0KLXZvaWQgICAgICAgIG12X2N1c3Rfb2FtX3J4X2doX3NldChpbnQgdmFsKTsKLWludCAgICAgICAgIG12X2N1c3Rfb21jaV9zZXQoaW50IHRjb250LCBpbnQgdHhxLCBpbnQgZ2VtcG9ydCwgaW50IGtlZXBfcnhfbWgpOwotaW50ICAgICAgICAgbXZfY3VzdF9lb2FtX2xsaWRfc2V0KGludCBsbGlkLCB1aW50OF90ICpsbGlkX21hYywgaW50IHR4cSk7Ci0KLXZvaWQgICAgICAgIG12X2N1c3RfYXBwX2ZsYWdfc2V0KG12X2N1c3RfYXBwX3R5cGVfZSBhcHBfdHlwZSwgdWludDE2X3QgZW5hYmxlKTsKLXZvaWQgICAgICAgIG12X2N1c3RfYXBwX2V0eXBlX3NldChtdl9jdXN0X2FwcF90eXBlX2UgYXBwX3R5cGUsIHVpbnQxNl90IGV0aF90eXBlKTsKLXZvaWQgICAgICAgIG12X2N1c3RfcHJpbnQoaW50IHR5cGUpOwotCi0KLSNlbmRpZiAvKiBfX212X2N1c3RfbmV0ZGV2X2hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3Rfc3lzZnMuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X3N5c2ZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjNTBjODguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3Rfc3lzZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoQykgMjAxMCwgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KLSogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSoKLSogSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgotKiBtb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKLSogUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCi0qIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKLSogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgotKiBvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KLSoKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X3N5c2ZzLmMKLSoKLSogREVTQ1JJUFRJT046Ci0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotCi0jaW5jbHVkZSA8Z2JlL212TmV0YS5oPgotI2luY2x1ZGUgPHBuYy9tdlBuYy5oPgotCi0jaW5jbHVkZSAibXZfY3VzdF9kZXYuaCIKLSNpbmNsdWRlICJtdl9jdXN0X25ldGRldi5oIgotI2luY2x1ZGUgIm12X2N1c3RfZmxvd19tYXAuaCIKLSNpbmNsdWRlICJtdl9jdXN0X21uZ19pZi5oIgotCi1zdGF0aWMgaW50ICAgICAgZW9hbV90eHEgPSAwOwotc3RhdGljIHVpbnQ4X3QgIGVvYW1fbWFjWzZdID0gezB9OwotCi0KLXN0YXRpYyBzc2l6ZV90IG12X2N1c3Rfc3BlY19wcm9jX2hlbHAoY2hhciAqYnVmKQotewotICAgIGludCBvZmYgPSAwOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIGhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgdGhpcyBoZWxwXG4iKTsKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRSAgICAKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICB1ZHBfcG9ydHMgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaG93IHNwZWNpYWwgdWRwIHNvdXJjZSBhbmQgZGVzdC4gcG9ydCBjb25maWd1cmF0aW9uXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIGZsb3dfbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgZmxvdyBtYXBwaW5nIGNvbmZpZ3VyYXRpb25cbiIpOyAgICAgICAgCi0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgZmxvd19tYXBfc2hvdyAgICAgICAgICAgICAgICAgICAgIC0gc2hvdyBmbG93IG1hcHBpbmcgcnVsZXMgXG4iKTsgICAgCi0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgZmxvd19tYXBfY2xlYXIgICAgICAgICAgICAgICAgICAgIC0gY2xlYXIgYWxsIGZsb3cgbWFwcGluZyBydWxlc1xuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgZHNjcF9tYXBfZGVsICAgICAgICAgICAgICAgICAgICAgIC0gZGVsZXRlIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXNcbiIpOyAgICAKLSNlbmRpZgotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIHRjb250X3Nob3cgICAgICAgICAgICAgICAgICAgICAgICAtIFNob3cgYWxsIFQtQ09OVCBzdGF0ZVxuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gdGNvbnQgc3RhdGUgICAgICAgID4gdGNvbnRfc2V0ICAgIC0gU2V0IFQtQ09OVCB0YXR1cywgdGNvbnQoMH43KSwgc3RhdGUoMTplbmFibGUsIDA6ZGlzYWJsZSkgXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBoZXggICAgICAgICAgICAgICAgPiBkZWJ1ZyAgICAgICAgLSBTZXQgQ3VzdG9taXplZCBtb2R1bGUgZGVidWcgaW5mb3JtYXRpb24gXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBhcHBfdHlwZSAgICAgICAgICAgPiBhcHBfc2hvdyAgICAgLSBTaG93IGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uIDA6aWdtcCwgMTptbGQsIDI6bHBiaywgMzplb2FtLCA0Om9tY2lcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGFwcF90eXBlIGVuYWJsZSAgICA+IGFwcF9mbGFnX3NldCAtIEVuYWJsZS9kaXNhYmxlIGFwcGxpY2F0aW9uLiAwOmlnbXAsIDE6bWxkLCAyOmxwYmssIDM6ZW9hbSwgNDpvbWNpLCAxOmVuYWJsZSwgMDpkaXNhYmxlXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBhcHBfdHlwZSBoZXggICAgICAgPiBhcHBfZXR5cGVfc2V0LSBTZXQgYXBwbGljYXRpb24gRXRoIHR5cGUuIDA6aWdtcCwgMTptbGQsIDI6bHBiaywgMzplb2FtLCA0Om9tY2lcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHRjIHR4cSBnZW0ga2VlcF9taCA+IG9tY2lfc2V0ICAgICAtIHNldCB1ZHAgc291cmNlIHBvcnQgc3BlY2lhbCBUeCBiZWhhdmlvclxuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8ga2VlcF9taCAgICAgICAgICAgID4gZW9hbV9naF9rZWVwIC0gS2VlcCBvciBub3Qga2VlcCBHSCBmb3IgZU9BTSBwYWNrZXRzLCAxOmtlZXAsIDA6ZG8gbm90IGtlZXBcbiIpOyAgICAKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyB0eHEgICAgICAgICAgICAgICAgPiBlb2FtX3R4cSAgICAgLSBzZXQgVFggcXVldWUgaW50byBzd19idWZmZXIgZm9yIEVPQU0gbGxpZCBjb21tYW5kXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBtYWNbMF0tbWFjWzVdICAgICAgPiBlb2FtX21hYyAgICAgLSBzZXQgTExJRCBtYWMgaW50byBzd19idWZmZXIgZm9yIEVPQU0gbGxpZCBjb21tYW5kXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBsbGlkICAgICAgICAgICAgICAgPiBlb2FtX3dyaXRlICAgLSBXcml0ZSBFT0FNIHR4cSBhbmQgbWFjIGFkZHJlc3MgZnJvbSBzd19idWZmZXIgaW50byBMTElEXG4iKTsKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRSAgICAKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwIHVkcF9zcmMoZGVjKSB0eHAgdHhxIGZsYWdzIGh3X2NtZCAgPiB1ZHBfc3JjIC0gc2V0IHVkcCBzb3VyY2UgcG9ydCBzcGVjaWFsIFR4IGJlaGF2aW9yXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwIHVkcF9kc3QoZGVjKSB0eHAgdHhxIGZsYWdzIGh3X2NtZCAgPiB1ZHBfZHN0IC0gc2V0IHVkcCBkZXN0LiAgcG9ydCBzcGVjaWFsIFR4IGJlaGF2aW9yXG4iKTsKLSNlbmRpZiAgICAKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBoZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBmbG93X21hcF9kZWJ1ZyAgLSBTZXQgZmxvdyBtYXBwaW5nIGRlYnVnIGZsYWcsIDE6ZW5hYmxlLCAwOmRpc2FibGUgXG4iKTsgICAgCi0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gdmlkIHBiaXRzIG1vZF92aWQgbW9kX3BiaXRzIHRyZ19wb3J0IHRyZ19xdWV1ZSB0cmdfaHdmX3F1ZXVlIGdlbV9wb3J0ICA+IGZsb3dfbWFwX3VzX3NldCAtIHNldCBVL1MgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHZpZCBwYml0cyBtb2RfdmlkIG1vZF9wYml0cyAgICAgICAgICA+IGZsb3dfbWFwX2RzX3NldCAtIHNldCBEL1MgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOyAgICAKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwYml0czAgcGJpdHMxIC4uLiBwYml0czYyIHBiaXRzNjMgICAgPiBkc2NwX21hcF9zZXQgICAgLSBzZXQgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlc1xuIik7ICAgIAotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHZsYW4gcGJpdHMgZGlyKDA6VS9TLCAxOkQvUykgICAgICAgICA+IGZsb3dfbWFwX2RlbCAgICAtIGRlbGV0ZSBmbG93IG1hcHBpbmcgcnVsZVxuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gdmxhbiBwYml0cyBkaXIoMDpVL1MsIDE6RC9TKSAgICAgICAgID4gdGFnX2Zsb3dfZ2V0ICAgIC0gZ2V0IHRhZ2dlZCBmbG93IG1hcHBpbmcgcnVsZVxuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gZHNjcCBkaXIoMDpVL1MsIDE6RC9TKSAgICAgICAgICAgICAgID4gdW50YWdfZmxvd19nZXQgIC0gZ2V0IHVudGFnZ2VkIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKLSNlbmRpZiAgICAgICAgCi0KLSAgICByZXR1cm4gb2ZmOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IG12X2N1c3Rfc3BlY19wcm9jX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotICAgIGludCBvZmYgICA9IDA7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBib29sIHN0YXRlOwotICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBhdHRyLT5hdHRyLm5hbWU7Ci0KLSAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiaGVscCIpICkgewotICAgICAgICBvZmYgPSBtdl9jdXN0X3NwZWNfcHJvY19oZWxwKGJ1Zik7Ci0gICAgfQotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFICAgICAgIAotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInVkcF9wb3J0cyIpKSB7Ci0gICAgICAgIG12X2N1c3RfdWRwX3NwZWNfcHJpbnRfYWxsKCk7Ci0gICAgfQotI2VuZGlmICAgIAotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRSAgICAgICAKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmbG93X21hcCIpKSB7IAotICAgICAgICBtdl9jdXN0X2Zsb3dfbWFwX3ByaW50KCk7Ci0gICAgfSAgICAgCi0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZmxvd19tYXBfc2hvdyIpKSB7Ci0gICAgICAgIG12X2N1c3RfbWFwX3RhYmxlX3ByaW50KCk7Ci0gICAgfSAKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmbG93X21hcF9jbGVhciIpKSB7Ci0gICAgICAgIG12X2N1c3RfbWFwX3J1bGVfY2xlYXIoKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJkc2NwX21hcF9kZWwiKSkgewotICAgICAgICBtdl9jdXN0X2RzY3BfbWFwX2RlbCgpOwotICAgIH0gICAgIAotI2VuZGlmCi0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidGNvbnRfc2hvdyIpKSB7Ci0gICAgICAgIHByaW50ayhLRVJOX0lORk8gIk1WX0NVU1QgVC1DT05UIHN0YXRlIHRhYmxlXG4iKTsKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRGVmYXVsdCBpbnZhbGlkIFR4cTolZCBcbiIsIENQSF9JTlZBTElEX1RSR1RfUVVFVUUpOwotICAgICAgICBwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IENQSF9NQVhfVENPTlRfTlVNOyBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG12X2N1c3RfZ2V0X3Rjb250X3N0YXRlKGluZGV4KTsKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlQtQ09OVCUxLjFkOiAlc1xuIiwgaW5kZXgsIChzdGF0ZT09dHJ1ZSk/ImVuYWJsZWQiOiJkaXNhYmxlZCIpOwotICAgICAgICB9Ci0gICAgfSAKLSAgICBlbHNlCi0gICAgICAgIG9mZiA9IG12X2N1c3Rfc3BlY19wcm9jX2hlbHAoYnVmKTsKLQotICAgIHJldHVybiBvZmY7Ci19Ci0KLQotc3RhdGljIHNzaXplX3QgbXZfY3VzdF9zcGVjX3Byb2NfMV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0gICAgY29uc3QgY2hhciogICAgIG5hbWUgPSBhdHRyLT5hdHRyLm5hbWU7Ci0gICAgdW5zaWduZWQgaW50ICAgIHY7Ci0gICAgdW5zaWduZWQgbG9uZyAgIGZsYWdzOwotCi0gICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotICAgICAgICByZXR1cm4gLUVQRVJNOwotCi0gICAgLyogUmVhZCBpbnB1dCAqLwotICAgIHYgPSAwOwotCi0gICAgc3NjYW5mKGJ1ZiwgIiV4IiwgJnYpOwotICAgIAotICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiZGVidWciKSkgewotICAgICAgICBtdl9jdXN0X2RlYnVnX2luZm9fc2V0KHYpOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJhcHBfc2hvdyIpKSB7Ci0gICAgICAgIG12X2N1c3RfcHJpbnQodik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImVvYW1fZ2hfa2VlcCIpKSB7Ci0gICAgICAgIG12X2N1c3Rfb2FtX3J4X2doX3NldCh2KTsKLSAgICB9ICAgCi0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZW9hbV90eHEiKSkgewotICAgICAgICBlb2FtX3R4cSA9IHY7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImVvYW1fd3JpdGUiKSkgewotICAgICAgICBtdl9jdXN0X2VvYW1fbGxpZF9zZXQoKGludCl2LCAmZW9hbV9tYWNbMF0sIGVvYW1fdHhxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBtdl9jdXN0X3NwZWNfcHJvY18yX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBjaGFyKiAgICAgbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgcCwgdjsKLSAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7Ci0KLSAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICAvKiBSZWFkIGlucHV0ICovCi0gICAgcCA9IDA7Ci0gICAgdiA9IDA7Ci0gICAgc3NjYW5mKGJ1ZiwgIiVkICV4IiwgJnAsICZ2KTsKLQotICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiYXBwX2ZsYWdfc2V0IikpIHsKLSAgICAgICAgbXZfY3VzdF9hcHBfZmxhZ19zZXQocCwgdik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImFwcF9ldHlwZV9zZXQiKSkgewotICAgICAgICBtdl9jdXN0X2FwcF9ldHlwZV9zZXQocCwgdik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInRjb250X3NldCIpKSB7Ci0gICAgICAgIGlmICh2KQotICAgICAgICAgICAgbXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUocCwgdHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG12X2N1c3Rfc2V0X3Rjb250X3N0YXRlKHAsIGZhbHNlKTsKLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOwotCi0gICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQotc3RhdGljIHNzaXplX3QgbXZfY3VzdF9zcGVjX3Byb2NfNl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0gICAgY29uc3QgY2hhciogICAgIG5hbWUgPSBhdHRyLT5hdHRyLm5hbWU7Ci0gICAgdW5zaWduZWQgaW50ICAgIHAsIHYxPTAsIHYyPTAsIHYzPTAsIHY0PTAsIHY1PTA7Ci0gICAgdW5zaWduZWQgbG9uZyAgIGZsYWdzOwotCi0gICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotICAgICAgICByZXR1cm4gLUVQRVJNOwotCi0gICAgLyogUmVhZCBpbnB1dCAqLwotICAgIHNzY2FuZihidWYsICIlZCAlZCAleCAleCAleCAleCIsICZwLCAmdjEsICZ2MiwgJnYzLCAmdjQsICZ2NSk7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0gICAgaWYgKCFzdHJjbXAobmFtZSwgInVkcF9zcmMiKSkgewotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFCi0gICAgICAgIG12X2N1c3RfdWRwX3NyY19zcGVjX3NldChwLCB2MSwgdjIsIHYzLCB2NCwgdjUpOwotI2Vsc2UKLSAgICAgICAgcHJpbnRrKCJtdl9jdXN0IG1vZHVsZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggVURQIFNBTVBMRSBDb25maWcgU3VwcG9ydFxuIik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidWRwX2RzdCIpKSB7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUKLSAgICAgICAgbXZfY3VzdF91ZHBfZGVzdF9zcGVjX3NldChwLCB2MSwgdjIsIHYzLCB2NCwgdjUpOwotI2Vsc2UKLSAgICAgICAgcHJpbnRrKCJtdl9jdXN0IG1vZHVsZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggVURQIFNBTVBMRSBDb25maWcgU3VwcG9ydFxuIik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAib21jaV9zZXQiKSkgewotICAgICAgICBtdl9jdXN0X29tY2lfc2V0KHAsIHYxLCB2MiwgdjMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgb3BlcmF0aW9uIDwlcz5cbiIsIF9fRlVOQ1RJT05fXywgYXR0ci0+YXR0ci5uYW1lKTsKLQotICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLSAgICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc3NpemVfdCBtdl9jdXN0X3NwZWNfcHJvY19mbG93X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBjaGFyKiAgICAgICAgbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgdjE9MCwgdjI9MCwgdjM9MCwgdjQ9MCwgdjU9MCwgdjY9MCwgdjc9MCwgdjg9MDsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgZmxhZ3M7Ci0gICAgbXZfY3VzdF9pb2N0bF9mbG93X21hcF90IGN1c3RfZmxvdzsKLQotICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKLQotICAgIC8qIFJlYWQgaW5wdXQgKi8KLSAgICBzc2NhbmYoYnVmLCAiJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQiLCAmdjEsICZ2MiwgJnYzLCAmdjQsICZ2NSwgJnY2LCAmdjcsICZ2OCk7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFICAgCi0KLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiZmxvd19tYXBfZGVidWciKSkgewotICAgICAgICBtdl9jdXN0X3NldF90cmFjZV9mbGFnKCh1aW50MzJfdCl2MSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZsb3dfbWFwX3VzX3NldCIpKSB7Ci0gICAgICAgIG1lbXNldCgmY3VzdF9mbG93LCAwLCBzaXplb2YoY3VzdF9mbG93KSk7Ci0gICAgICAgIGN1c3RfZmxvdy5kaXIgICAgICAgPSBNVl9DVVNUX0ZMT1dfRElSX1VTOwotICAgICAgICBjdXN0X2Zsb3cudmlkICAgICAgID0gdjE7Ci0gICAgICAgIGN1c3RfZmxvdy5wYml0cyAgICAgPSB2MjsKLSAgICAgICAgY3VzdF9mbG93Lm1vZF92aWQgICA9IHYzOwotICAgICAgICBjdXN0X2Zsb3cubW9kX3BiaXRzID0gdjQ7Ci0gICAgICAgIAotICAgICAgICBjdXN0X2Zsb3cucGt0X2Zyd2QuaW5fdXNlICAgICAgICA9IDE7Ci0gICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcG9ydCAgICAgID0gKG12X2N1c3RfdHJnX3BvcnRfdHlwZV90KXY1OwotICAgICAgICBjdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3F1ZXVlICAgICA9ICh1aW50MzJfdCl2NjsKLSAgICAgICAgY3VzdF9mbG93LnBrdF9mcndkLnRyZ19od2ZfcXVldWUgPSAodWludDMyX3Qpdjc7ICAgICAgICAKLSAgICAgICAgY3VzdF9mbG93LnBrdF9mcndkLmdlbV9wb3J0ICAgICAgPSAobXZfY3VzdF9nZW1fcG9ydF9rZXlfdCl2ODsKLSAgICAgICAgCi0gICAgICAgIG12X2N1c3RfbWFwX3J1bGVfc2V0KCZjdXN0X2Zsb3cpOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmbG93X21hcF9kc19zZXQiKSkgewotICAgICAgICBtZW1zZXQoJmN1c3RfZmxvdywgMCwgc2l6ZW9mKGN1c3RfZmxvdykpOwotICAgICAgICBjdXN0X2Zsb3cuZGlyICAgICAgID0gTVZfQ1VTVF9GTE9XX0RJUl9EUzsKLSAgICAgICAgY3VzdF9mbG93LnZpZCAgICAgICA9IHYxOwotICAgICAgICBjdXN0X2Zsb3cucGJpdHMgICAgID0gdjI7Ci0gICAgICAgIGN1c3RfZmxvdy5tb2RfdmlkICAgPSB2MzsKLSAgICAgICAgY3VzdF9mbG93Lm1vZF9wYml0cyA9IHY0OwotICAgICAgICBjdXN0X2Zsb3cucGt0X2Zyd2QuaW5fdXNlICAgID0gMTsKLSAgICAgICAgCi0gICAgICAgIG12X2N1c3RfbWFwX3J1bGVfc2V0KCZjdXN0X2Zsb3cpOwotICAgIH0gICAgCi0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZmxvd19tYXBfZGVsIikpIHsKLSAgICAgICAgbXZfY3VzdF9tYXBfcnVsZV9kZWwoKHVpbnQxNl90KXYxLCAodWludDhfdCl2MiwgKG12X2N1c3RfZmxvd19kaXJfZSl2Myk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInRhZ19mbG93X2dldCIpKSB7Ci0gICAgICAgIG1lbXNldCgmY3VzdF9mbG93LCAwLCBzaXplb2YoY3VzdF9mbG93KSk7Ci0gICAgICAgIGN1c3RfZmxvdy52aWQgICA9IHYxOwotICAgICAgICBjdXN0X2Zsb3cucGJpdHMgPSB2MjsgICAKLSAgICAgICAgY3VzdF9mbG93LmRpciAgID0gKG12X2N1c3RfZmxvd19kaXJfZSl2MzsgICAgICAgIAotICAgICAgICBtdl9jdXN0X3RhZ19tYXBfcnVsZV9nZXQoJmN1c3RfZmxvdyk7Ci0gICAgICAgIHByaW50aygiaW5fdXNlWyVkXSwgbW9kX3ZpZFslZF0gbW9kX3BiaXRzWyVkXSB0cmdfcG9ydFslZF0sIHRyZ19xdWV1ZVslZF0sIGdlbV9wb3J0WyVkXVxyXG4iLAotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC5pbl91c2UsIGN1c3RfZmxvdy5tb2RfdmlkLCAKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3cubW9kX3BiaXRzLCBjdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3BvcnQsIAotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWUsIGN1c3RfZmxvdy5wa3RfZnJ3ZC5nZW1fcG9ydCk7Ci0gICAgfSAgICAKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ1bnRhZ19mbG93X2dldCIpKSB7Ci0gICAgICAgIG1lbXNldCgmY3VzdF9mbG93LCAwLCBzaXplb2YoY3VzdF9mbG93KSk7Ci0gICAgICAgIGN1c3RfZmxvdy5kc2NwICA9ICB2MTsKLSAgICAgICAgY3VzdF9mbG93LmRpciAgID0gKG12X2N1c3RfZmxvd19kaXJfZSl2MjsgICAgICAgIAotICAgICAgICBtdl9jdXN0X3VudGFnX21hcF9ydWxlX2dldCgmY3VzdF9mbG93KTsgICAgCi0gICAgICAgIHByaW50aygiaW5fdXNlWyVkXSwgbW9kX3ZpZFslZF0gbW9kX3BiaXRzWyVkXSB0cmdfcG9ydFslZF0sIHRyZ19xdWV1ZVslZF0sIGdlbV9wb3J0WyVkXVxyXG4iLCAKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3cucGt0X2Zyd2QuaW5fdXNlLCBjdXN0X2Zsb3cubW9kX3ZpZCwgCi0gICAgICAgICAgICAgICAgY3VzdF9mbG93Lm1vZF9wYml0cywgY3VzdF9mbG93LnBrdF9mcndkLnRyZ19wb3J0LCAKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3F1ZXVlLCBjdXN0X2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQpOyAgICAgICAgCi0gICAgfSAgICAgIAotICAgIGVsc2UKLSAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOwotI2VuZGlmCi0KLSAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHNzaXplX3QgbXZfY3VzdF9zcGVjX3Byb2NfNmhfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0gICAgY29uc3QgY2hhciogICAgIG5hbWUgPSBhdHRyLT5hdHRyLm5hbWU7Ci0gICAgdW5zaWduZWQgaW50ICAgIHYxPTAsIHYyPTAsIHYzPTAsIHY0PTAsIHY1PTAsIHY2PTA7Ci0gICAgdW5zaWduZWQgbG9uZyAgIGZsYWdzOwotCi0gICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotICAgICAgICByZXR1cm4gLUVQRVJNOwotCi0gICAgLyogUmVhZCBpbnB1dCAqLwotICAgIHNzY2FuZihidWYsICIleCAleCAleCAleCAleCAleCIsICZ2MSwgJnYyLCAmdjMsICZ2NCwgJnY1LCAmdjYpOwotCi0gICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotICAgIGlmICghc3RyY21wKG5hbWUsICJlb2FtX21hYyIpKSB7Ci0gICAgICAgIGVvYW1fbWFjWzBdID0gKHVpbnQ4X3QpdjE7Ci0gICAgICAgIGVvYW1fbWFjWzFdID0gKHVpbnQ4X3QpdjI7Ci0gICAgICAgIGVvYW1fbWFjWzJdID0gKHVpbnQ4X3QpdjM7Ci0gICAgICAgIGVvYW1fbWFjWzNdID0gKHVpbnQ4X3QpdjQ7Ci0gICAgICAgIGVvYW1fbWFjWzRdID0gKHVpbnQ4X3QpdjU7Ci0gICAgICAgIGVvYW1fbWFjWzVdID0gKHVpbnQ4X3QpdjY7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOwotCi0gICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG12X2N1c3Rfc3BlY19wcm9jXzY0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICAgIGNvbnN0IGNoYXIqICAgICAgICAgIG5hbWUgPSBhdHRyLT5hdHRyLm5hbWU7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgdls2NF07Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgaW5kZXggPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgIGZsYWdzOwotICAgIG12X2N1c3RfZHNjcF9wYml0c190IGRzY3BfbWFwOwotCi0gICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotICAgICAgICByZXR1cm4gLUVQRVJNOwotCi0gICAgLyogUmVhZCBpbnB1dCAqLwotICAgIGZvciAoaW5kZXg9MDsgaW5kZXg8NjQ7IGluZGV4KyspIHsKLSAgICAgICAgc3NjYW5mKGJ1ZiwgIiVkIiwgJnZbaW5kZXhdKTsKLSAgICAgICAgZHNjcF9tYXAucGJpdHNbaW5kZXhdID0gKHVpbnQ4X3QpdltpbmRleF07Ci0gICAgfQotICAgIGRzY3BfbWFwLmluX3VzZSA9IDE7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0gICAgaWYgKCFzdHJjbXAobmFtZSwgImRzY3BfbWFwX3NldCIpKSB7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFICAgICAgIAotICAgICAgICBtdl9jdXN0X2RzY3BfbWFwX3NldCgmZHNjcF9tYXApOwotI2VuZGlmICAgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGhlbHAsICAgICAgICAgICBTX0lSVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWJ1ZywgICAgICAgICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfMV9zdG9yZSk7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihvbWNpX3NldCwgICAgICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfNl9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZW9hbV9naF9rZWVwLCAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzFfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGVvYW1fdHhxLCAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY18xX3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihlb2FtX21hYywgICAgICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfNmhfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGVvYW1fd3JpdGUsICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY18xX3N0b3JlKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHRjb250X3Nob3csICAgICBTX0lSVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih0Y29udF9zZXQsICAgICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfMl9zdG9yZSk7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihhcHBfc2hvdywgICAgICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfMV9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYXBwX2ZsYWdfc2V0LCAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzJfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGFwcF9ldHlwZV9zZXQsICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY18yX3N0b3JlKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHVkcF9wb3J0cywgICAgICBTX0lSVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih1ZHBfc3JjLCAgICAgICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfNl9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodWRwX2RzdCwgICAgICAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzZfc3RvcmUpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIoZmxvd19tYXAsICAgICAgIFNfSVJVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGZsb3dfbWFwX3Nob3csICBTX0lSVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihmbG93X21hcF9jbGVhciwgU19JUlVTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZHNjcF9tYXBfZGVsLCAgIFNfSVJVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGZsb3dfbWFwX2RlYnVnLCBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY19mbG93X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihmbG93X21hcF91c19zZXQsU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfZmxvd19zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmxvd19tYXBfZHNfc2V0LFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jX2Zsb3dfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGZsb3dfbWFwX2RlbCwgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY19mbG93X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih0YWdfZmxvd19nZXQsICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfZmxvd19zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodW50YWdfZmxvd19nZXQsIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jX2Zsb3dfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGRzY3BfbWFwX3NldCwgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY182NF9zdG9yZSk7Ci0KLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm12X2N1c3Rfc3BlY19wcm9jX2F0dHJzW10gPSB7Ci0gICAgJmRldl9hdHRyX2hlbHAuYXR0ciwgICAgCi0gICAgJmRldl9hdHRyX2RlYnVnLmF0dHIsCi0gICAgJmRldl9hdHRyX29tY2lfc2V0LmF0dHIsCi0gICAgJmRldl9hdHRyX2VvYW1fZ2hfa2VlcC5hdHRyLAotICAgICZkZXZfYXR0cl9lb2FtX3R4cS5hdHRyLAotICAgICZkZXZfYXR0cl9lb2FtX21hYy5hdHRyLAotICAgICZkZXZfYXR0cl9lb2FtX3dyaXRlLmF0dHIsCi0gICAgJmRldl9hdHRyX3Rjb250X3Nob3cuYXR0ciwKLSAgICAmZGV2X2F0dHJfdGNvbnRfc2V0LmF0dHIsICAgIAotICAgICZkZXZfYXR0cl9hcHBfc2hvdy5hdHRyLAotICAgICZkZXZfYXR0cl9hcHBfZmxhZ19zZXQuYXR0ciwKLSAgICAmZGV2X2F0dHJfYXBwX2V0eXBlX3NldC5hdHRyLCAgIAotICAgICZkZXZfYXR0cl91ZHBfcG9ydHMuYXR0ciwgICAgCi0gICAgJmRldl9hdHRyX3VkcF9zcmMuYXR0ciwKLSAgICAmZGV2X2F0dHJfdWRwX2RzdC5hdHRyLAotICAgICZkZXZfYXR0cl9mbG93X21hcF9kZWJ1Zy5hdHRyLAotICAgICZkZXZfYXR0cl9mbG93X21hcF91c19zZXQuYXR0ciwKLSAgICAmZGV2X2F0dHJfZmxvd19tYXBfZHNfc2V0LmF0dHIsICAgIAotICAgICZkZXZfYXR0cl9kc2NwX21hcF9zZXQuYXR0ciwKLSAgICAmZGV2X2F0dHJfZmxvd19tYXBfZGVsLmF0dHIsCi0gICAgJmRldl9hdHRyX3RhZ19mbG93X2dldC5hdHRyLAotICAgICZkZXZfYXR0cl91bnRhZ19mbG93X2dldC5hdHRyLAotICAgICZkZXZfYXR0cl9mbG93X21hcC5hdHRyLCAgICAKLSAgICAmZGV2X2F0dHJfZmxvd19tYXBfc2hvdy5hdHRyLCAgICAgCi0gICAgJmRldl9hdHRyX2Zsb3dfbWFwX2NsZWFyLmF0dHIsICAgCi0gICAgJmRldl9hdHRyX2RzY3BfbWFwX2RlbC5hdHRyLCAgICAgICAKLQotICAgIE5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG12X2N1c3Rfc3BlY19wcm9jX2dyb3VwID0gewotICAgIC5uYW1lID0gInByb3RvIiwKLSAgICAuYXR0cnMgPSBtdl9jdXN0X3NwZWNfcHJvY19hdHRycywKLX07Ci0KLWludCBtdmN1c3Rfc3lzZnNfaW5pdCh2b2lkKQotewotICAgIGludCBlcnI7Ci0gICAgc3RydWN0IGRldmljZSAqcGQ7Ci0KLSAgICBwZCA9IGJ1c19maW5kX2RldmljZV9ieV9uYW1lKCZwbGF0Zm9ybV9idXNfdHlwZSwgTlVMTCwgImN1c3QiKTsKLSAgICBpZiAoIXBkKSB7Ci0gICAgICAgIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImN1c3QiLCAtMSwgTlVMTCwgMCk7Ci0gICAgICAgIHBkID0gYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCAiY3VzdCIpOwotICAgIH0KLQotICAgIGlmICghcGQpIHsKLSAgICAgICAgcHJpbnRrKEtFUk5fRVJSIiVzOiBjYW5ub3QgZmluZCBjdXN0IGRldmljZVxuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcGQgPSAmcGxhdGZvcm1fYnVzOwotICAgIH0KLQotICAgIGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGQtPmtvYmosICZtdl9jdXN0X3NwZWNfcHJvY19ncm91cCk7Ci0gICAgaWYgKGVycikgewotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzeXNmcyBncm91cCBmYWlsZWQgJWRcbiIsIGVycik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIHByaW50ayhLRVJOX0lORk8gIj0gQ1VTVCBNb2R1bGUgU1lTIEZTIEluaXQgZW5kZWQgc3VjY2Vzc2Z1bGx5ID1cbiIpOwotICAgIG91dDoKLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIG12Y3VzdF9zeXNmc19kZWxldGUodm9pZCkKLXsKLSAgICBzdHJ1Y3QgZGV2aWNlICpwZDsKLQotICAgIHBkID0gYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCAiY3VzdCIpOwotICAgIGlmICghcGQpCi0gICAgewotICAgICAgICBwcmludGsoS0VSTl9FUlIiJXM6IGNhbm5vdCBmaW5kIENVU1QgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZC0+a29iaiwgJm12X2N1c3Rfc3BlY19wcm9jX2dyb3VwKTsKLQotICAgIHByaW50ayhLRVJOX0lORk8gIj0gQ1VTVCBNb2R1bGUgU1lTIEZTIFJlbW92ZSBlbmRlZCBzdWNjZXNzZnVsbHkgPVxuIik7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2V6eG1sL2V6eG1sX3JlYWRtZS50eHQgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2V6eG1sL2V6eG1sX3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjk3MmFmYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfZXp4bWwvZXp4bWxfcmVhZG1lLnR4dApAQCAtMCwwICsxLDE5IEBACitlenhtbC5jDQorMS4JT3JpZ2luYWwgZmlsZSBsaW5lIDI1LCByZW1vdmVkIJMjaW5jbHVkZSA8c3RkbGliLmg+lCwgaXQgaXMgZm9yIHVzZXIgc3BhY2UNCisyLglPcmlnaW5hbCBmaWxlIGxpbmUgMzIsIHJlbW92ZWQgkyNpZm5kZWYgRVpYTUxfTk9NTUFQlCBibG9jaywgYW5kIGFkZCBsaW51eCBrZXJuZWwgaGVhZGVyIGZpbGVzDQorMy4JT3JpZ2luYWwgZmlsZSBsaW5lIDM4LCBhZGRlZCBmdW5jdGlvbiBlenhtbF9yZWFsbG9jL21hbGxvYy9yZWFsbG9jL2ZyZWUvc3RhdCBkZWZpbml0aW9ucw0KKzQuCU9yaWdpbmFsIGZpbGUgbGluZSA1OSwgYWRkZWQgZnVuY3Rpb24gc3RyZHVwDQorNS4JT3JpZ2luYWwgZmlsZSBsaW5lIDYwNCwgcmVtb3ZlIGZ1bmN0aW9uIGV6eG1sX3BhcnNlX2ZwDQorNi4JT3JpZ2luYWwgZmlsZSBsaW5lIDYyNiwgY2hhbmdlZCBlenhtbF9wYXJzZV9mZCBpbXBsZW1lbnRhdGlvbiB0byBrZXJuZWwgc3R5bGUNCis3LglPcmlnaW5hbCBmaWxlIGxpbmUgNjU2LCBjaGFuZ2VkIGV6eG1sX3BhcnNlX2ZpbGUgaW1wbGVtZW50YXRpb24gdG8ga2VybmVsIHN0eWxlDQorOC4JT3JpZ2luYWwgZmlsZSBsaW5lIDgxNCwgcmVtb3ZlZCCTI2lmbmRlZiBFWlhNTF9OT01NQVCUIGJsb2NrLCBub3QgdXNlZCBjb2RlIA0KKzkuCU9yaWdpbmFsIGZpbGUgbGluZSA5OTksIHJlbW92ZWQgkyNpZmRlZiBFWlhNTF9URVNUlCBibG9jaywgbm90IHVzZWQgY29kZSANCisxMC4JT3JpZ2luYWwgZmlsZSBsaW5lIDk5OSwgYWRkZWQgZnVuY3Rpb24gZXp4bWxfcmVhbGxvYyBpbXBsZW1lbnRhdGlvbg0KKyANCitlenhtbC5oDQorMS4JT3JpZ2luYWwgZmlsZSBsaW5lIDI4LCByZW1vdmVkIHVzZXIgc3BhY2UgaGVhZGVyIGZpbGVzDQorMi4JT3JpZ2luYWwgZmlsZSBsaW5lIDQyLCBhZGRlZCBGSUxFIGRlZmluaXRpb24NCiszLglPcmlnaW5hbCBmaWxlIGxpbmUgNjIsIGFkZGVkIGZ1bmN0aW9uIGV6eG1sX3QgZXp4bWxfcGFyc2VfZmlsZSggY2hhciAqZmlsZSkgZGVjbGFyYXRpb24NCis0LglPcmlnaW5hbCBmaWxlIGxpbmUgNjIsIGFkZGVkIJMjaWZkZWYgRVpYTUxfVEVTVJQgDQorNS4JT3JpZ2luYWwgZmlsZSBsaW5lIDY4LCByZW1vdmVkIGZ1bmN0aW9uIGV6eG1sX3QgZXp4bWxfcGFyc2VfZmlsZSggY2hhciAqZmlsZSkgZGVjbGFyYXRpb24NCis2LglPcmlnaW5hbCBmaWxlIGxpbmUgMTIyLCAxMzAsIDEzNywgMTQ1LCBjaGFuZ2VkIHN0cmR1cCB0byBNTVBfT1NfU1RSRFVQDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2LmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuYwppbmRleCA4NmQ4NDk0Li40ZDU0MDI5IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuYwpAQCAtNjYzLDkgKzY2Myw2IEBACiAJaWYgKHBwID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHBwID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCiAJdHhxX2N0cmwgPSAmcHAtPnR4cV9jdHJsW3R4cCAqIENPTkZJR19NVl9FVEhfVFhRICsgdHhxXTsKIAlpZiAodHhxX2N0cmwtPmNwdV9vd25lcikgewogCQltb2RlID0gTVZfRVRIX1RYUV9DUFU7CkBAIC04MjYsNyArODIzLDcgQEAKICNpZmRlZiBDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwKIC8qIFJlZ2lzdGVyIHNwZWNpYWwgdHJhbnNtaXQgY2hlY2sgZnVuY3Rpb24gKi8KIHZvaWQgbXZfZXRoX3J4X3NwZWNpYWxfcHJvY19mdW5jKGludCBwb3J0LCB2b2lkICgqZnVuYykoaW50IHBvcnQsIGludCByeHEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykpCisJCQkJCQkJc3RydWN0IGV0aF9wYnVmICpwa3QsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpKQogewogCXN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZChwb3J0KTsKIApAQCAtMTYyMCwxMyArMTYxNywxMyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfTVZfRVRIX1BOQykgJiYgZGVmaW5lZChDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwpCiAJCS8qIFNwZWNpYWwgUlggcHJvY2Vzc2luZyAqLwotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCiAJCWlmICgoTVZfUE9OX1BPUlRfSUQgPT0gcHAtPnBvcnQpIHx8IChyeF9kZXNjLT5wbmNJbmZvICYgTkVUQV9QTkNfUlhfU1BFQ0lBTCkpIHsKICNlbHNlCiAJCWlmIChyeF9kZXNjLT5wbmNJbmZvICYgTkVUQV9QTkNfUlhfU1BFQ0lBTCkgewogI2VuZGlmCiAJCQlpZiAocHAtPnJ4X3NwZWNpYWxfcHJvYykgewotCQkJCXBwLT5yeF9zcGVjaWFsX3Byb2MocHAtPnBvcnQsIHJ4cSwgZGV2LCAoc3RydWN0IHNrX2J1ZmYgKikocGt0LT5vc0luZm8pLCByeF9kZXNjKTsKKwkJCQlwcC0+cnhfc3BlY2lhbF9wcm9jKHBwLT5wb3J0LCByeHEsIGRldiwgcGt0LCByeF9kZXNjKTsKIAkJCQlTVEFUX0lORk8ocHAtPnN0YXRzLnJ4X3NwZWNpYWwrKyk7CiAKICAgICAgICAgICAgICAgICBpZiAocnhfZGVzYy0+cG5jSW5mbyAmIE5FVEFfUE5DX1JYX1NQRUNJQUwpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbmV0YS9uZXRfZGV2L212X25ldGRldi5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2LmgKaW5kZXggNjA3YTRiYy4uNGI0ZDJiZCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2LmgKQEAgLTMzMyw3ICszMzMsNyBAQAogI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfUlhfQ1NVTV9PRkZMT0FEICovCiAjaWZkZWYgQ09ORklHX01WX0VUSF9SWF9TUEVDSUFMCiAJdm9pZCAgICAoKnJ4X3NwZWNpYWxfcHJvYykoaW50IHBvcnQsIGludCByeHEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpOworCQkJCQlzdHJ1Y3QgZXRoX3BidWYgKnBrdCwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYyk7CiAjZW5kaWYgLyogQ09ORklHX01WX0VUSF9SWF9TUEVDSUFMICovCiAjaWZkZWYgQ09ORklHX01WX0VUSF9UWF9TUEVDSUFMCiAJaW50ICAgICAoKnR4X3NwZWNpYWxfY2hlY2spKGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtNzIzLDcgKzcyMyw3IEBACiAKICNpZmRlZiBDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwKIHZvaWQgICAgICAgIG12X2V0aF9yeF9zcGVjaWFsX3Byb2NfZnVuYyhpbnQgcG9ydCwgdm9pZCAoKmZ1bmMpKGludCBwb3J0LCBpbnQgcnhxLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpKTsKKwkJCQkJCQlzdHJ1Y3QgZXRoX3BidWYgKnBrdCwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykpOwogI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTCAqLwogCiAjaWZkZWYgQ09ORklHX01WX01BQ19MRUFSTgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVBcGkuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251QXBpLmMKaW5kZXggOWVhN2Q1OS4uZWI5Njk3OSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVBcGkuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUFwaS5jCkBAIC04MDYsOSArODA2LDIzIEBACiAJfQ0KIH0NCiANCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG12RXBvbkFwaTJrU3VwcG9ydGVkU2V0DQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKg0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgMksgYnl0ZSBwYWNrZXRzIHN1cHBvcnRlZCBvbiBNQyBib2FyZA0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICBwa3Qya1N1cHBvcnRlZCAtIDJLIGJ5dGUgZW5hYmxlIG9yIGRpc2FibGUNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFDQorKioNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KIE1WX1NUQVRVUyBtdkVwb25BcGkya1N1cHBvcnRlZFNldChNVl9VMzIgcGt0MmtTdXBwb3J0ZWQpDQogew0KLSAgICBNVl9TVEFUVVMgc3RhdHVzID0gMDsNCisgICAgTVZfU1RBVFVTIHN0YXR1czsNCiAgICAgTVZfVTMyICAgIGRldklkOw0KIA0KICAgICBkZXZJZCA9IG12Q3RybE1vZGVsR2V0KCk7DQpAQCAtODM1LDQgKzg0OSwyOTIgQEAKICAgICByZXR1cm4gKHN0YXR1cyk7DQogfQ0KIA0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgbXZFcG9uQXBpTG9zVGltZUNvbmZpZw0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKioNCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRpbWUgZHVyYXRpb24gdG8gZXhwaXJlIGZvciBlbnRlcmluZyBob2xkb3Zlcg0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICBvcHRpY2FsTG9zVGltZSAtIHRpbWUgZHVyYXRpb24gd2hlbiBubyBvcHRpY2FsIHNpZ25hbCBkZXRlY3RlZA0KKyoqICAgICAgICAgICAgICAgbWFjTG9zVGltZSAgICAgLSB0aW1lIGR1cmF0aW9uIHdoZW4gbm8gR0FURSBNUENQRFUgcmVjZWl2ZWQNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFDQorKioNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBtdkVwb25BcGlMb3NUaW1lQ29uZmlnKE1WX1UxNiBvcHRpY2FsTG9zVGltZSwgTVZfVTE2IG1hY0xvc1RpbWUpDQorew0KKyAgICBNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7DQorICAgIA0KKyAgICBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZVNldChvcHRpY2FsTG9zVGltZSk7DQorICAgIG9udUVwb25EYk9udU1hY0xvc1RpbWVTZXQobWFjTG9zVGltZSk7DQorDQorICAgIC8qIElmIHRoZSBob2xkb3ZlciB0aW1lciBpcyBub3QgYWN0aXZlLCB3ZSBhZGQgdGhlIE9wdGljYWxMb3NUaW1lciB0byB0aGUgaG9sZG92ZXIgdGltZSBhbmQgc2F2ZSAqLw0KKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVQb25Ib2xkb3ZlclRpbWVySWQub251UG9uVGltZXJBY3RpdmUgPT0gT05VX1BPTl9USU1FUl9OT1RfQUNUSVZFKQ0KKyAgICB7DQorICAgICAgICAvKiBBZGQgdGhlIGNvbmZpZ3VyZWQgT3B0TG9zVGltZSB0byBob2xkb3ZlciB0aW1lIGFuZCBzYXZlIGZvciBuZXh0IGhvbGRvdmVyICovDQorICAgICAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251UG9uSG9sZG92ZXJUaW1lcklkKSwgMCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBvbnVFcG9uRGJPbnVIb2xkb3ZlclRpbWVHZXQoKSArIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lR2V0KCksIDApOw0KKyAgICB9DQorDQorICAgIHJldHVybiBzdGF0dXM7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgbXZFcG9uQXBpVHhQb3dlckN0cmxDb25maWcNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29udHJvbHMgdGhlIFRYIHBvd2VyIG9uIGFuZCBvZmYNCisqKg0KKyoqICBQQVJBTUVURVJTOiAgYWN0aW9uIC0gdHVybiBvbiBhbmQgdHVybiBvZmYgdGhlIFRYIHBvd2VyLCBvciB0dXJuIG9mZiBhZnRlciANCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRhaW4gdGltZSBkdXJhdGlvbi4NCisqKiAgICAgICAgICAgICAgIHRpbWUgICAtIHRpbWUgZHVyYXRpb24gdG8gYmUgZXhwaXJlZCBiZWZvcmUgdHVybmluZyBvZmYgVFgNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFDQorKioNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBtdkVwb25BcGlUeFBvd2VyQ3RybENvbmZpZyhNVl9VMTYgYWN0aW9uLCBNVl9VMTYgdGltZSkNCit7DQorICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsNCisgICAgDQorICAgIGlmIChhY3Rpb24gPT0gRV9FUE9OX0lPQ1RMX0VOQUJMRV9UWCkNCisgICAgew0KKyAgICAgICAgb251UG9uVHhQb3dlck9uKE1WX1RSVUUpOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKGFjdGlvbiA9PSBFX0VQT05fSU9DVExfRElTQUJMRV9UWCkNCisgICAgew0KKyAgICAgICAgb251UG9uVHhQb3dlck9uKE1WX0ZBTFNFKTsNCisgICAgfQ0KKyAgICBlbHNlIGlmIChhY3Rpb24gPT0gRV9FUE9OX0lPQ1RMX0RJU0FCTEVfVFhfREVMQVkpDQorICAgIHsgICAgICAgIA0KKyAgICAgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25UeENvbnRyb2xUaW1lcklkKSwgMCwgdGltZSwgMSk7DQorICAgIH0NCisNCisgICAgcmV0dXJuIHN0YXR1czsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBtdkVwb25BcGlQb3dlclNhdmluZ0NvbmZpZw0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKioNCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICBlYXJseVdha2V1cCAtIHNldCB0aGUgYWJpbGl0eSBvZiBzdXBwb3J0aW5nIGVhcmx5IHdha2UgdXANCisqKiAgICAgICAgICAgICAgIG1heFNsZWVwRHVyYXRpb24gLSB0aW1lIHBlcmlvZCBmb3Iga2VlcGluZyBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgb3IgTVZfRkxBU0UNCisqKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG12RXBvbkFwaVBvd2VyU2F2aW5nQ29uZmlnKE1WX1U4IGVhcmx5V2FrZXVwLCBNVl9VNjQgbWF4U2xlZXBEdXJhdGlvbikNCit7DQorICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsNCisgICAgDQorICAgIGlmICgob251RXBvbkRiT251U2xlZXBEdXJhdGlvbkdldCgpICsgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25HZXQoKSkNCisgICAgICAgID49IG1heFNsZWVwRHVyYXRpb24pDQorICAgIHsNCisgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0lORk8sIFBPTl9BUElfTU9EVUxFLA0KKwkJCSAgICAgICAiRVJST1I6IFdyb25nIHBhcmFtZXRlcnMsIHNsZWVwKCVkKSArIHdha2V1cCglZCkgPj0gbWF4U2xlZXBEdXJhdGlvbiglZClcclxuIiwgDQorCQkJICAgICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQoKSwgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25HZXQoKSwgDQorCQkJICAgICAgIG1heFNsZWVwRHVyYXRpb24pOw0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gTVZfQkFEX1BBUkFNOw0KKyAgICB9DQorDQorICAgIG9udUVwb25EYk9udVBvd2VyU2F2aW5nV2FrZXVwU2V0KGVhcmx5V2FrZXVwKTsNCisgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uU2V0KG1heFNsZWVwRHVyYXRpb24pOw0KKw0KKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkLm9udVBvblRpbWVyQWN0aXZlID09IE9OVV9QT05fVElNRVJfQUNUSVZFKQ0KKyAgICB7DQorICAgICAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvbk1heFNsZWVwVGltZXJJZCksIDAsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2xlZXBEdXJhdGlvbiwgMSk7DQorICAgIH0NCisNCisgICAgcmV0dXJuIHN0YXR1czsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBtdkVwb25BcGlTbGVlcE1vZGVDdHJsDQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKg0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNvbnRyb2xzIHNsZWVwIG1vZGUNCisqKg0KKyoqICBQQVJBTUVURVJTOiAgZW5hYmxlIC0gdHVybiBvZmYgYW5kIHR1cm4gb24gdGhlIFRYIG9yIFJYDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQ0KKyoqDQorKiogIFJlZjogICAgICAgICBDYWxsZWQgYnkgbXZFcG9uQXBpU2xlZXBDdHJsRW5hYmxlLCBtdkVwb25BcGlTbGVlcEN0cmxEaXNhYmxlLCANCisqKiAgICAgICAgICAgICAgIG12RXBvbkFwaVNsZWVwQ3RybENmZywgb251RXBvbk1heFNsZWVwVGltZXJIbmRsLCANCisqKiAgICAgICAgICAgICAgIG9udUVwb25TbGVlcFdha2VEdXJhdGlvblRpbWVySG5kbA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG12RXBvbkFwaVNsZWVwTW9kZUN0cmwoTVZfVTMyIGVuYWJsZSkNCit7DQorICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsNCisgICAgDQorICAgIGlmIChvbnVFcG9uRGJPbnVTbGVlcE1vZGVHZXQoKSA9PSBFX0VQT05fU0xFRVBfTU9ERV9DVFJMX1RYKQ0KKyAgICB7DQorICAgICAgICBpZiAoZW5hYmxlID09IE1WX1RSVUUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RhdHVzIHw9IG9udVBvblR4UG93ZXJPbihNVl9GQUxTRSk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RhdHVzIHw9IG9udVBvblR4UG93ZXJPbihNVl9UUlVFKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlIGlmIChvbnVFcG9uRGJPbnVTbGVlcE1vZGVHZXQoKSA9PSBFX0VQT05fU0xFRVBfTU9ERV9DVFJMX1RYX1JYKQ0KKyAgICB7DQorICAgICAgICBpZiAoZW5hYmxlID09IE1WX1RSVUUpDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RhdHVzIHw9IG9udVBvblR4UG93ZXJPbihNVl9GQUxTRSk7DQorICAgICAgICAgICAgc3RhdHVzIHw9IG12T251RXBvbk1hY1NlcmRlc1B1UnhXcml0ZShNVl9GQUxTRSk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgc3RhdHVzIHw9IG9udVBvblR4UG93ZXJPbihNVl9UUlVFKTsNCisgICAgICAgICAgICBzdGF0dXMgfD0gbXZPbnVFcG9uTWFjU2VyZGVzUHVSeFdyaXRlKE1WX1RSVUUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiBzdGF0dXM7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgbXZFcG9uQXBpU2xlZXBDdHJsRGlzYWJsZQ0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKioNCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIE9OVSB0byBsZWF2ZSB0aGUgcG93ZXIgc2F2aW5nIG1vZGUNCisqKg0KKyoqICBQQVJBTUVURVJTOiAgDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQ0KKyoqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBDdHJsRGlzYWJsZSgpDQoreyAgIA0KKyAgICAvKiBTdG9wIG1heCBzbGVlcCB0aW1lciAqLw0KKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkLm9udVBvblRpbWVyQWN0aXZlID09IE9OVV9QT05fVElNRVJfQUNUSVZFKQ0KKyAgICB7DQorICAgICAgICBvbnVQb25UaW1lckRpc2FibGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25NYXhTbGVlcFRpbWVySWQpKTsNCisgICAgfQ0KKw0KKyAgICAvKiBTdG9wIHNsZWVwL3dha2V1cCBkdXJhdGlvbiB0aW1lciAqLw0KKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQub251UG9uVGltZXJBY3RpdmUgPT0gT05VX1BPTl9USU1FUl9BQ1RJVkUpDQorICAgIHsNCisgICAgICAgIG9udVBvblRpbWVyRGlzYWJsZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkKSk7DQorICAgIH0NCisNCisgICAgLyogRW5hYmxlIFRYL1JYIHBvd2VyICovDQorICAgIG12RXBvbkFwaVNsZWVwTW9kZUN0cmwoTVZfRkFMU0UpOw0KKw0KKyAgICAvKiBMZWF2ZSB0aGUgcG93ZXIgc2F2aW5nIHN0YXR1cyAqLw0KKyAgICBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldChFX0VQT05fTk9UX1BPV0VSX1NBVklOR19TVEFUVVMpOw0KKw0KKyAgICByZXR1cm4oTVZfT0spOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG12RXBvbkFwaVNsZWVwQ3RybEVuYWJsZQ0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKioNCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIE9OVSB0byBlbnRlciB0aGUgcG93ZXIgc2F2aW5nIG1vZGUNCisqKg0KKyoqICBQQVJBTUVURVJTOiAgDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQ0KKyoqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBDdHJsRW5hYmxlKCkNCit7DQorICAgIC8qIHJlZnJlc2ggbWF4IHNsZWVwIHRpbWVyLCBubyBtYXR0ZXIgaXQncyBhY3RpdmUgb3Igbm90ICovDQorICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkKSwgMCwgDQorICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udVBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvbkdldCgpLCAxKTsNCisNCisgICAgLyogcmVmcmVzaCBzbGVlcC93YWtldXAgZHVyYXRpb24gdGltZXIsIG5vIG1hdHRlciBpdCdzIGFjdGl2ZSBvciBub3QgKi8NCisgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uVGltZXJJZCksIDAsIA0KKyAgICAgICAgICAgICAgICAgICAgICBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uR2V0KCksIDEpOw0KKw0KKyAgICAvKiBpZiB0aGUgY3VycmVudCBzdGF0dXMgaXMgbm90IHNsZWVwLCB0aGVuIGdvIHRvIHNsZWVwIHN0YXR1cyAqLw0KKyAgICBpZiAob251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNHZXQoKSAhPSBFX0VQT05fUE9XRVJfU0FWSU5HX1NMRUVQX1NUQVRVUykNCisgICAgew0KKyAgICAgICAgLyogRGlzYWJsZSBUWC9SWCBwb3dlciAqLw0KKyAgICAgICAgbXZFcG9uQXBpU2xlZXBNb2RlQ3RybChNVl9UUlVFKTsNCisNCisgICAgICAgIC8qIHVwZGF0ZSBzdGF0dXMgdG8gc2xlZXAgc3RhdHVzICovDQorICAgICAgICBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldChFX0VQT05fUE9XRVJfU0FWSU5HX1NMRUVQX1NUQVRVUyk7DQorICAgIH0NCisNCisgICAgcmV0dXJuKE1WX09LKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBtdkVwb25BcGlTbGVlcEN0cmxDZmcNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGFyYW1ldGVycyB1c2VkIGluIHRoZSBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICBtb2RlIC0gMDogZG8gbm90aGluZywgMTogdHVybiBvZmYgVHgsIDI6IHR1cm4gb2ZmIFR4IGFuZCBSeA0KKyoqICAgICAgICAgICAgICAgc2xlZXBEdXJhdGlvbiAtIHRpbWUgZHVyYXRpb24gZm9yIGtlZXBpbmcgc2xlZXANCisqKiAgICAgICAgICAgICAgIHdha2V1cER1cmF0aW9uIC0gdGltZSBkdXJhdGlvbiBmb3IgYmVpbmcgd2FrZXVwDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQ0KKyoqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBDdHJsQ2ZnKE1WX1U4IG1vZGUsIE1WX1UzMiBzbGVlcER1cmF0aW9uLCBNVl9VMzIgd2FrZXVwRHVyYXRpb24pDQorew0KKyAgICBpZiAoKHNsZWVwRHVyYXRpb24gKyB3YWtldXBEdXJhdGlvbikgPj0gb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KCkpDQorICAgIHsNCisgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQVBJX01PRFVMRSwNCisJCQkgICAgICAgIkVSUk9SOiBXcm9uZyBwYXJhbWV0ZXJzLCBzbGVlcCglZCkgKyB3YWtldXAoJWQpID49IG1heFNsZWVwRHVyYXRpb24oJWQpXHJcbiIsIA0KKwkJCSAgICAgICBzbGVlcER1cmF0aW9uLCBzbGVlcER1cmF0aW9uLCANCisJCQkgICAgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KCkpOw0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gTVZfQkFEX1BBUkFNOw0KKyAgICB9DQorDQorICAgIC8qIHNhdmUgcGFyYXRlcnMgaW50byBEQiAqLw0KKyAgICBvbnVFcG9uRGJPbnVTbGVlcE1vZGVTZXQobW9kZSk7DQorICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25TZXQoc2xlZXBEdXJhdGlvbik7DQorICAgIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uU2V0KHdha2V1cER1cmF0aW9uKTsNCisNCisgICAgLyogcmVmcmVzaCBtYXggc2xlZXAgdGltZXIsIG5vIG1hdHRlciBpdCdzIGFjdGl2ZSBvciBub3QgKi8NCisgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25NYXhTbGVlcFRpbWVySWQpLCAwLCANCisgICAgICAgICAgICAgICAgICAgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KCksIDEpOw0KKw0KKyAgICAvKiByZWZyZXNoIHNsZWVwL3dha2V1cCBkdXJhdGlvbiB0aW1lciwgbm8gbWF0dGVyIGl0J3MgYWN0aXZlIG9yIG5vdCAqLw0KKyAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkKSwgMCwgDQorICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQoKSwgMSk7DQorDQorICAgIC8qIGlmIHRoZSBjdXJyZW50IHN0YXR1cyBpcyBub3Qgc2xlZXAsIHRoZW4gZ28gdG8gc2xlZXAgc3RhdHVzICovDQorICAgIGlmIChvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c0dldCgpICE9IEVfRVBPTl9QT1dFUl9TQVZJTkdfU0xFRVBfU1RBVFVTKQ0KKyAgICB7DQorICAgICAgICAvKiBEaXNhYmxlIFRYL1JYIHBvd2VyICovDQorICAgICAgICBtdkVwb25BcGlTbGVlcE1vZGVDdHJsKE1WX1RSVUUpOw0KKw0KKyAgICAgICAgLyogdXBkYXRlIHN0YXR1cyB0byBzbGVlcCBzdGF0dXMgKi8NCisgICAgICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzU2V0KEVfRVBPTl9QT1dFUl9TQVZJTkdfU0xFRVBfU1RBVFVTKTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4oTVZfT0spOw0KK30NCisNCiANCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUFwaS5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVBcGkuaAppbmRleCA5ZTIzOTg0Li43NTkwZGFmIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUFwaS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251QXBpLmgKQEAgLTgzLDYgKzgzLDcgQEAKIA0KIC8qIEluY2x1ZGUgRmlsZXMNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKyNpbmNsdWRlICJlcG9uT251RGIuaCINCiAgDQogLyogRGVmaW5pdGlvbnMNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyANCkBAIC0xNDUsNiArMTQ2LDE0IEBACiAvKiBDb25maWcgQVBJICovDQogTVZfU1RBVFVTIG12RXBvbkFwaTJrU3VwcG9ydGVkU2V0KE1WX1UzMiBwa3Qya1N1cHBvcnRlZCk7DQogDQorTVZfU1RBVFVTIG12RXBvbkFwaUxvc1RpbWVDb25maWcoTVZfVTE2IG9wdGljYWxMb3NUaW1lLCBNVl9VMTYgbWFjTG9zVGltZSk7DQorTVZfU1RBVFVTIG12RXBvbkFwaVR4UG93ZXJDdHJsQ29uZmlnKE1WX1UxNiBhY3Rpb24sIE1WX1UxNiB0aW1lKTsNCitNVl9TVEFUVVMgbXZFcG9uQXBpUG93ZXJTYXZpbmdDb25maWcoTVZfVTggZWFybHlXYWtldXAsIE1WX1U2NCBtYXhTbGVlcER1cmF0aW9uKTsNCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBNb2RlQ3RybChNVl9VMzIgZW5hYmxlKTsNCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBDdHJsRGlzYWJsZSh2b2lkKTsNCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBDdHJsRW5hYmxlKHZvaWQpOw0KK01WX1NUQVRVUyBtdkVwb25BcGlTbGVlcEN0cmxDZmcoTVZfVTggbW9kZSwgTVZfVTMyIHNsZWVwRHVyYXRpb24sIE1WX1UzMiB3YWtldXBEdXJhdGlvbik7DQorDQogLyogTWFjcm9zDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgDQogDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVEYi5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVEYi5jCmluZGV4IGM1YmNmM2IuLjNiZjZiNTcgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251RGIuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udURiLmMKQEAgLTI4MiwxMSArMjgyLDE5IEBACiANCiAJLyogc2V0IGhvbGRvdmVyICovDQogCW9udUVwb25EYk9udUhvbGRvdmVyU3RhdGVTZXQoT05VX0hPTERPVkVSX05PVF9BQ1RJVkUpOw0KKyAgICBvbnVFcG9uRGJPbnVIb2xkb3ZlclRpbWVTZXQoT05VX1BPTl9USU1FUl9IT0xET1ZFUl9JTlRFUlZBTCk7DQorICAgIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lU2V0KDApOw0KKw0KKyAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25TZXQoT05VX1BPTl9USU1FUl9NQVhfU0xFRVBfSU5URVJWQUwpOw0KKyAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cFNldCgwKTsNCisgICAgb251RXBvbkRiT251U2xlZXBNb2RlU2V0KEVfRVBPTl9TTEVFUF9NT0RFX0NUUkxfVFgpOw0KKyAgICBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uU2V0KE9OVV9QT05fVElNRVJfU0xFRVBfRFVSQVRJT04pOw0KKyAgICBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvblNldChPTlVfUE9OX1RJTUVSX1dBS0VVUF9EVVJBVElPTik7DQorICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzU2V0KEVfRVBPTl9OT1RfUE9XRVJfU0FWSU5HX1NUQVRVUyk7DQogDQogCS8qIHNldCBzaWxlbmNlICovDQogCW9udUVwb25EYk9udVNpbGVuY2VTdGF0ZVNldChPTlVfU0lMRU5DRV9OT1RfQUNUSVZFKTsNCiANCi0NCiAJLyogU1cgREJBIHBhcmFtcyAqLw0KIAlvbnVFcG9uRGJPbnVTd1JwcnRUaW1lclR5cGVTZXQoT05VX0VQT05fU1dfREJBX1JQUlRfVElNRVIpOw0KIAlvbnVFcG9uRGJPbnVTd1JwcnRNYWNUaW1lckludGVydmFsU2V0KDYyNTAwKTsgLyogMSBtc2VjIGluIDE2bmFubyB1bml0cyAqLw0KQEAgLTE0NTMsNiArMTQ2MSwzMzIgQEAKIH0NCiANCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVTZXQNCisgKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgKiogDQorICoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGltZSBkdXJhdGlvbiB2YWx1ZSBpbiBkYXRhYmFzZSANCisgKiogICAgICAgICAgICAgICB3aGVuIG5vIG9wdGljYWwgc2lnbmFsIGlzIGRldGVjdGVkDQorICoqICAgICAgICAgICAgICAgDQorICoqICBQQVJBTUVURVJTOiAgbG9zVGltZSAtIHRpbWUgZHVyYXRpb24NCisgKioNCisgKiogIE9VVFBVVFM6ICAgICBOb25lDQorICoqDQorICoqICBSRVRVUk5TOiAgICAgDQorICoqICAgICAgICAgICAgICAgICAgIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZVNldChNVl9VMTYgbG9zVGltZSkNCit7DQorICAgIG9udUVwb25EYl9zLm9udUVwb25HZW5UYmxfcy5vbnVFcG9uT3B0aWNhbExvc1RpbWUgPSBsb3NUaW1lOw0KKyAgICANCisgICAgcmV0dXJuIE1WX09LOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lR2V0DQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKiANCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZXR1cm5zIHRpbWUgZHVyYXRpb24gdG8gYmUgdXNlZCANCisqKiAgICAgICAgICAgICAgIHdoZW4gbm8gb3B0aWNhbCBzaWduYWwgaXMgZGV0ZWN0ZWQNCisqKiAgICAgICAgICAgICAgIA0KKyoqICBQQVJBTUVURVJTOiAgTm9uZQ0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIHRpbWUgZHVyYXRpb24gdmFsdWUNCisqKiAgICAgICAgICAgICAgICAgICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1UzMiBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZUdldCgpDQorew0KKyAgICByZXR1cm4gb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25PcHRpY2FsTG9zVGltZTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKioNCisgKiogIG9udUVwb25EYk9udU1hY0xvc1RpbWVTZXQNCisgKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgKiogDQorICoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGltZSBkdXJhdGlvbiB2YWx1ZSBpbiBkYXRhYmFzZSANCisgKiogICAgICAgICAgICAgICB3aGVuIG5vIEdBVEUgTVBDUERVIGlzIHJlY2VpdmVkDQorICoqDQorICoqICBQQVJBTUVURVJTOiAgbG9zVGltZSAtIHRpbWUgZHVyYXRpb24NCisgKioNCisgKiogIE9VVFBVVFM6ICAgICBOb25lDQorICoqDQorICoqICBSRVRVUk5TOiAgICAgDQorICoqICAgICAgICAgICAgICAgICAgIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVNYWNMb3NUaW1lU2V0KE1WX1UxNiBsb3NUaW1lKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25NYWNMb3NUaW1lID0gbG9zVGltZTsNCisgICAgDQorICAgIHJldHVybiBNVl9PSzsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBvbnVFcG9uRGJPbnVNYWNMb3NUaW1lR2V0DQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKiANCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZXR1cm5zIHRpbWUgZHVyYXRpb24gdG8gYmUgdXNlZCANCisqKiAgICAgICAgICAgICAgIHdoZW4gbm8gR0FURSBNUENQRFUgaXMgcmVjZWl2ZWQNCisqKiAgICAgICAgICAgICAgIA0KKyoqICBQQVJBTUVURVJTOiAgTm9uZQ0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIHRpbWUgZHVyYXRpb24gdmFsdWUNCisqKiAgICAgICAgICAgICAgICAgICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1UzMiBvbnVFcG9uRGJPbnVNYWNMb3NUaW1lR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvbk1hY0xvc1RpbWU7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoqDQorICoqICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cFNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgc3VwcG9ydCBmb3IgZWFybHkgd2FrZXVwIA0KKyAqKiAgICAgICAgICAgICAgIGluIHBvd2VyIHNhdmluZyBtb2RlDQorICoqDQorICoqICBQQVJBTUVURVJTOiAgd2FrZVVwRW5hYmxlIC0gRW5hYmxlIG9yIGRpc2FibGUgdGhlIGVhcmx5IHdha2V1cCBzdXBwb3J0DQorICoqDQorICoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyAqKg0KKyAqKiAgUkVUVVJOUzogICAgIA0KKyAqKiAgICAgICAgICAgICAgICAgICANCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgb251RXBvbkRiT251UG93ZXJTYXZpbmdXYWtldXBTZXQoTVZfVTggd2FrZVVwRW5hYmxlKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25Qb3dlclNhdmluZ1dha2V1cCA9IHdha2VVcEVuYWJsZTsNCisNCisgICAgcmV0dXJuIChNVl9PSyk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgb251RXBvbkRiT251UG93ZXJTYXZpbmdXYWtldXBHZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN1cHBvcnQgZm9yIGVhcmx5IHdha2V1cA0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgZW5hYmxlIG9yIGRpc2FibGUNCisqKiAgICAgICAgICAgICAgICAgICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1UzMiBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cEdldCgpDQorew0KKyAgICByZXR1cm4gb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25Qb3dlclNhdmluZ1dha2V1cDsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKioNCisgKiogIG9udUVwb25EYk9udVBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvblNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgbWF4IHNsZWVwIGR1cmF0aW9uIA0KKyAqKiAgICAgICAgICAgICAgIGluIHBvd2VyIHNhdmluZyBtb2RlDQorICoqDQorICoqICBQQVJBTUVURVJTOiAgbWF4U2xlZXBEdXJhdGlvbiAtIG1heCBzbGVlcCBkdXJhdGlvbg0KKyAqKg0KKyAqKiAgT1VUUFVUUzogICAgIE5vbmUNCisgKioNCisgKiogIFJFVFVSTlM6ICAgICANCisgKiogICAgICAgICAgICAgICAgICAgDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG9udUVwb25EYk9udVBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvblNldChNVl9VNjQgbWF4U2xlZXBEdXJhdGlvbikNCit7DQorICAgIG9udUVwb25EYl9zLm9udUVwb25HZW5UYmxfcy5vbnVFcG9uUG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uPSBtYXhTbGVlcER1cmF0aW9uOw0KKw0KKyAgICByZXR1cm4gKE1WX09LKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25HZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1heCBzbGVlcCBkdXJhdGlvbiBpbiBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgbWF4IHNsZWVwIGR1cmF0aW9uDQorKiogICAgICAgICAgICAgICAgICAgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9VMzIgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvblBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvbjsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKioNCisgKiogIG9udUVwb25EYk9udVNsZWVwTW9kZVNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBjb250cm9sIG1vZGUgZm9yIHBvd2VyIHNhdmluZw0KKyAqKg0KKyAqKiAgUEFSQU1FVEVSUzogIG1vZGUgLSB0dXJuIG9mZiB0eCBvciB0eC9yeA0KKyAqKg0KKyAqKiAgT1VUUFVUUzogICAgIE5vbmUNCisgKioNCisgKiogIFJFVFVSTlM6ICAgICANCisgKiogICAgICAgICAgICAgICAgICAgDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG9udUVwb25EYk9udVNsZWVwTW9kZVNldChNVl9VOCBtb2RlKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25TbGVlcE1vZGUgPSBtb2RlOw0KKw0KKyAgICByZXR1cm4gTVZfT0s7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgb251RXBvbkRiT251U2xlZXBNb2RlR2V0DQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKiANCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzbGVlcCBtb2RlIGZvciBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgc2xlZXAgbW9kZQ0KKyoqICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorRV9FcG9uU2xlZXBDdHJsTW9kZSBvbnVFcG9uRGJPbnVTbGVlcE1vZGVHZXQoKQ0KK3sNCisgICAgcmV0dXJuIG9udUVwb25EYl9zLm9udUVwb25HZW5UYmxfcy5vbnVFcG9uU2xlZXBNb2RlOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251U2xlZXBEdXJhdGlvblNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGVyaW9kaWNhbCBzbGVlcCBkdXJhdGlvbiANCisgKiogICAgICAgICAgICAgICBmb3IgcG93ZXIgc2F2aW5nDQorICoqDQorICoqICBQQVJBTUVURVJTOiAgc2xlZXBEdXJhdGlvbiAtIHBlcmlvZGljYWwgc2xlZXAgZHVyYXRpb24NCisgKioNCisgKiogIE9VVFBVVFM6ICAgICBOb25lDQorICoqDQorICoqICBSRVRVUk5TOiAgICAgDQorICoqICAgICAgICAgICAgICAgICAgIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uU2V0KE1WX1UzMiBzbGVlcER1cmF0aW9uKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uID0gc2xlZXBEdXJhdGlvbjsNCisNCisgICAgcmV0dXJuIE1WX09LOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBlcmlvZGljYWwgc2xlZXAgZHVyYXRpb24gZm9yIHBvd2VyIHNhdmluZw0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgbWF4IHNsZWVwIGR1cmF0aW9uDQorKiogICAgICAgICAgICAgICAgICAgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9VMzIgb251RXBvbkRiT251U2xlZXBEdXJhdGlvbkdldCgpDQorew0KKyAgICByZXR1cm4gb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25TZXQNCisgKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgKiogDQorICoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBlcmlvZGljYWwgd2FrZXVwIGR1cmF0aW9uIA0KKyAqKiAgICAgICAgICAgICAgIGZvciBwb3dlciBzYXZpbmcNCisgKioNCisgKiogIFBBUkFNRVRFUlM6ICB3YWtldXBEdXJhdGlvbiAtIHBlcmlvZGljYWwgd2FrZXVwIGR1cmF0aW9uDQorICoqDQorICoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyAqKg0KKyAqKiAgUkVUVVJOUzogICAgIA0KKyAqKiAgICAgICAgICAgICAgICAgICANCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25TZXQoTVZfVTMyIHdha2V1cER1cmF0aW9uKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25XYWtldXBEdXJhdGlvbiA9IHdha2V1cER1cmF0aW9uOw0KKw0KKyAgICByZXR1cm4gTVZfT0s7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25HZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBlcmlvZGljYWwgd2FrZXVwIGR1cmF0aW9uIGZvciBwb3dlciBzYXZpbmcNCisqKiAgICAgICAgICAgICAgIA0KKyoqICBQQVJBTUVURVJTOiAgTm9uZQ0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIG1heCBzbGVlcCBkdXJhdGlvbg0KKyoqICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfVTMyIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvbldha2V1cER1cmF0aW9uOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNTZXQNCisgKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgKiogDQorICoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgcG93ZXIgc2F2aW5nIHN0YXR1cw0KKyAqKg0KKyAqKiAgUEFSQU1FVEVSUzogIHN0YXR1cyAtIG5vIHBvd2VyIHNhdmluZy9zbGVlcC93YWtldXANCisgKioNCisgKiogIE9VVFBVVFM6ICAgICBOb25lDQorICoqDQorICoqICBSRVRVUk5TOiAgICAgDQorICoqICAgICAgICAgICAgICAgICAgIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldChNVl9VMzIgc3RhdHVzKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25Qb3dlclNhdmluZ1N0YXR1cyA9IHN0YXR1czsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c0dldA0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKiogDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcG93ZXIgc2F2aW5nIHN0YXR1cw0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgcG93ZXIgc2F2aW5nIHN0YXR1cw0KKyoqICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfVTMyIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvblBvd2VyU2F2aW5nU3RhdHVzOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICoqDQogKiogIG9udUVwb25EYk9udVNpbGVuY2VTdGF0ZVNldA0KICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVEYi5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVEYi5oCmluZGV4IGRmMjAwM2UuLmIyZjI4NWQgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251RGIuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udURiLmgKQEAgLTgzLDYgKzgzLDcgQEAKIA0KIC8qIEluY2x1ZGUgRmlsZXMNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKyNpbmNsdWRlICJlcG9uT251TG54S3NNSS5oIg0KICANCiAvKiBEZWZpbml0aW9ucw0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIA0KQEAgLTMzMCw2ICszMzEsMjAgQEAKICAgTVZfVTMyIHNoYWRvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiB9U19PbnVFcG9uRGJhU2hhZG93UmVnTWFwOw0KIA0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgRV9FUE9OX1NMRUVQX01PREVfQ1RSTF9OT1RISU5HID0gMCwNCisgICAgRV9FUE9OX1NMRUVQX01PREVfQ1RSTF9UWCAgICAgID0gMSwNCisgICAgRV9FUE9OX1NMRUVQX01PREVfQ1RSTF9UWF9SWCAgID0gMiwgDQorfSBFX0Vwb25TbGVlcEN0cmxNb2RlOw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgRV9FUE9OX05PVF9QT1dFUl9TQVZJTkdfU1RBVFVTICAgID0gMCwgDQorICAgIEVfRVBPTl9QT1dFUl9TQVZJTkdfU0xFRVBfU1RBVFVTICA9IDEsIA0KKyAgICBFX0VQT05fUE9XRVJfU0FWSU5HX1dBS0VVUF9TVEFUVVMgPSAyLCANCit9IEVfRXBvblBvd2VyU2F2aW5nU3RhdHVzOw0KKw0KIHR5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICBNVl9VMzIgICAgICAgICAgIG9udUVwb25WYWxpZFtFUE9OX01BWF9NQUNfTlVNXTsgICAgICAvKiBPTlUgVmFsaWQgZm9yIHN5bmMgKi8gIA0KQEAgLTM1OCw3ICszNzMsMTYgQEAKICAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uT3ZlckhlYWQ7ICAgICAgICAgICAgIA0KICAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uUGh5T3V0cHV0OyAgICAgICAgICAgICANCiAgIE1WX1UzMiAgICAgICAgICAgb251RXBvblh2ckJ1cnN0RW5Qb2xhcml0eTsNCi19U19PbnVFcG9uR2VuVGJsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIE1WX1UzMiAgICAgICAgICAgb251RXBvbk9wdGljYWxMb3NUaW1lOw0KKyAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uTWFjTG9zVGltZTsNCisgIE1WX1UzMiAgICAgICAgICAgb251RXBvblBvd2VyU2F2aW5nV2FrZXVwOw0KKyAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uUG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uOw0KKyAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uU2xlZXBBY3Rpb247DQorICBNVl9VMzIgICAgICAgICAgIG9udUVwb25TbGVlcE1vZGU7DQorICBNVl9VMzIgICAgICAgICAgIG9udUVwb25TbGVlcER1cmF0aW9uOw0KKyAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uV2FrZXVwRHVyYXRpb247DQorICBNVl9VMzIgICAgICAgICAgIG9udUVwb25Qb3dlclNhdmluZ1N0YXR1czsNCit9U19PbnVFcG9uR2VuVGJsOw0KIA0KIC8qIE9OVSBFUE9OIERhdGEgUGF0aCB0YWJsZXMgKi8NCiB0eXBlZGVmIHN0cnVjdA0KQEAgLTQ2NCw2ICs0ODgsMjQgQEAKIE1WX1UzMiAgICBvbnVFcG9uRGJPbnVIb2xkb3ZlclRpbWVHZXQodm9pZCk7DQogTVZfU1RBVFVTIG9udUVwb25EYk9udUhvbGRvdmVyRXhlY1NldChNVl9VMzIgc3RhdGUpOw0KIE1WX1UzMiAgICBvbnVFcG9uRGJPbnVIb2xkb3ZlckV4ZWNHZXQodm9pZCk7DQorTVZfU1RBVFVTIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lU2V0KE1WX1UxNiBsb3NUaW1lKTsNCitNVl9VMzIgICAgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVHZXQodm9pZCk7DQorTVZfU1RBVFVTIG9udUVwb25EYk9udU1hY0xvc1RpbWVTZXQoTVZfVTE2IGxvc1RpbWUpOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVNYWNMb3NUaW1lR2V0KHZvaWQpOw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cFNldChNVl9VOCB3YWtlVXBFbmFibGUpOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cEdldCh2b2lkKTsNCitNVl9TVEFUVVMgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uU2V0KE1WX1U2NCBtYXhTbGVlcER1cmF0aW9uKTsNCitNVl9VMzIgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KHZvaWQpOw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVTbGVlcEFjdGlvblNldChNVl9VOCBhY3Rpb24pOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVTbGVlcEFjdGlvbkdldCh2b2lkKTsNCitNVl9TVEFUVVMgb251RXBvbkRiT251U2xlZXBNb2RlU2V0KE1WX1U4IG1vZGUpOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVTbGVlcE1vZGVHZXQodm9pZCk7DQorTVZfU1RBVFVTIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25TZXQoTVZfVTMyIHNsZWVwRHVyYXRpb24pOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uR2V0KHZvaWQpOw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvblNldChNVl9VMzIgd2FrZXVwRHVyYXRpb24pOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvbkdldCh2b2lkKTsNCitNVl9TVEFUVVMgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNTZXQoTVZfVTMyIHN0YXR1cyk7DQorTVZfVTMyICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzR2V0KHZvaWQpOw0KIE1WX1NUQVRVUyBvbnVFcG9uRGJPbnVTaWxlbmNlU3RhdGVTZXQoTVZfVTMyIHN0YXRlKTsNCiBNVl9VMzIgICAgb251RXBvbkRiT251U2lsZW5jZVN0YXRlR2V0KHZvaWQpOw0KIE1WX1NUQVRVUyBvbnVFcG9uRGJPbnVTd1JwcnRUaW1lclR5cGVTZXQoTVZfVTMyIHRpbWVyVHlwZSk7DQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVJc3IuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251SXNyLmMKaW5kZXggMTU3Nzk0MC4uZWU2MDNmYyAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVJc3IuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUlzci5jCkBAIC0xMDk2LDg0ICsxMDk2LDg3IEBACiAJCXJldHVybihNVl9FUlJPUik7CiAJICB9CiAJfQotCS8qIEtXMiBBU0lDIFJldiBaMiAqLwotCS8qID09PT09PT09PT09PT09PSAqLwotCWVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikKLQl7Ci0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIG91dHB1dCBzdGF0dXMqLwotCSAgUE9OX0dQSU9fR0VUKEJPQVJEX0dQUF9QT05fWFZSX1RYLCBncGlvR3JvdXAsIGdwaW9NYXNrKTsKLQkgIGlmIChncGlvTWFzayAhPSBQT05fR1BJT19OT1RfVVNFRCkKLQkgIHsKLQkgIAlzdGF0dXMgPSBtdkdwcFR5cGVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgfmdwaW9NYXNrLypvdXRwdXQqLyk7Ci0JICAJaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIAl7Ci0JICAJICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCi0JICAJCQkgICAiRVJST1I6ICglczolZCkgbXZHcHBUeXBlU2V0XG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkgIAkgIHJldHVybihNVl9FUlJPUik7Ci0JICAJfQorICAgZWxzZQorICAgeworCSAgIC8qIEtXMiBBU0lDIFJldiBaMiAqLworCSAgIC8qID09PT09PT09PT09PT09PSAqLworCSAgIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfWjIpCisJICAgeworCQkvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIG91dHB1dCBzdGF0dXMqLworCQlQT05fR1BJT19HRVQoQk9BUkRfR1BQX1BPTl9YVlJfVFgsIGdwaW9Hcm91cCwgZ3Bpb01hc2spOworCQlpZiAoZ3Bpb01hc2sgIT0gUE9OX0dQSU9fTk9UX1VTRUQpCisJCXsKKwkJICAgICBzdGF0dXMgPSBtdkdwcFR5cGVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgfmdwaW9NYXNrLypvdXRwdXQqLyk7CisJCSAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJICAgICB7CisJCSAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJCSJFUlJPUjogKCVzOiVkKSBtdkdwcFR5cGVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJICAgICB9CiAKLQkgIAlzdGF0dXMgPSBtdkdwcFZhbHVlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIGdwaW9NYXNrIC8qZW5hYmxlKi8pOwotCSAgCWlmIChzdGF0dXMgIT0gTVZfT0spCi0JICAJewotCSAgCSAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkJICAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVHlwZVNldFxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAJICByZXR1cm4oTVZfRVJST1IpOwotCSAgCX0KLQkgIH0KKwkJICAgICBzdGF0dXMgPSBtdkdwcFZhbHVlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIGdwaW9NYXNrIC8qZW5hYmxlKi8pOworCQkgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisJCSAgICAgeworCQkgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCQkiRVJST1I6ICglczolZCkgbXZHcHBUeXBlU2V0XG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwkJICAgICAgIHJldHVybihNVl9FUlJPUik7CisJCSAgICAgfQorCQl9CiAKLQkgIHN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfQkVOX0lPX0VOLCBPTlVfUEhZX0lOUFVULCAwKTsKLQkgIGlmIChzdGF0dXMgIT0gTVZfT0spCi0JICB7Ci0JICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkgIAkJICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgICByZXR1cm4oTVZfRVJST1IpOwotCSAgfQotCX0KKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfSU5QVVQsIDApOworCQlpZiAoc3RhdHVzICE9IE1WX09LKQorCQl7CisJCSBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgcmV0dXJuKE1WX0VSUk9SKTsKKwkJfQorCSAgIH0KIAotCS8qIEtXMiBBU0lDIFJldiBBMCAqLwotCS8qID09PT09PT09PT09PT09PSAqLwotCWVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkKLQl7Ci0gICAgICBzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOwotCSAgaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIHsKLQkgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgICByZXR1cm4oTVZfRVJST1IpOwotCSAgfQotCi0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSAqLwotCSAgc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fRU4sIDEsIDApOwotCSAgaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIHsKLQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCSAgIC8qIEtXMiBBU0lDIFJldiBBMCAqLworCSAgIC8qID09PT09PT09PT09PT09PSAqLworCSAgIGVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkKKwkgICB7CisJCXN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfQkVOX0lPX0VOLCBPTlVfUEhZX09VVFBVVCwgMCk7CisJCWlmIChzdGF0dXMgIT0gTVZfT0spCisJCXsKKwkJICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCiAJCQkgICAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCQlyZXR1cm4oTVZfRVJST1IpOwotCSAgfQorCQkgIHJldHVybihNVl9FUlJPUik7CisJCX0KIAotICAgICAgcG9sYXJpdHkgPSBvbnVQMlBEYlh2ckJ1cnN0RW5hYmxlUG9sYXJpdHlHZXQoKTsKKwkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBlbmFibGUgKi8KKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fRU4sIDEsIDApOworCQlpZiAoc3RhdHVzICE9IE1WX09LKQorCQl7CisJCSAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkgICAgICJFUlJPUjogKCVzOiVkKSBhc2ljT250TWlzY1JlZ1dyaXRlXG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwkJICAgICAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJfQogCi0JICAvKiBYVlIgcG9sYXJpdHkgKi8KLQkgIC8qIFhWUiBwb2xhcml0eSA9PSAwLCBBY3RpdmUgSGlnaCwgdHJhbnNtaXQgMSB0byB0aGUgbGluZSAgKi8KLQkgIC8qIFhWUiBwb2xhcml0eSA9PSAxLCBBY3RpdmUgTG93LCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLworCQlwb2xhcml0eSA9IG9udVAyUERiWHZyQnVyc3RFbmFibGVQb2xhcml0eUdldCgpOwogCi0JICAvKiBQMlAgbW9kZSAqLwotCSAgLyogRm9yY2UgVmFsdWUgPT0gMCwgdHJhbnNtaXQgMCB0byB0aGUgbGluZSAgKi8KLQkgIC8qIEZvcmNlIFZhbHVlID09IDEsIHRyYW5zbWl0IDEgdG8gdGhlIGxpbmUgICovCisJCS8qIFhWUiBwb2xhcml0eSAqLworCQkvKiBYVlIgcG9sYXJpdHkgPT0gMCwgQWN0aXZlIEhpZ2gsIHRyYW5zbWl0IDEgdG8gdGhlIGxpbmUgICovCisJCS8qIFhWUiBwb2xhcml0eSA9PSAxLCBBY3RpdmUgTG93LCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLwogCi0JICAvKiBTZXR0aW5nIFAyUCBzaG91bGQgYmUgcmV2ZXJzZWQgZnJvbSBYVlIgcG9sYXJpdHkgKi8KLQkgIC8qIFhWUiBwb2xhcml0eSA9PSAwLCBBY3RpdmUgSGlnaCwgd3JpdGUgMSBmb3IgRm9yY2UgVmFsdWUgKi8KLQkgIC8qIFhWUiBwb2xhcml0eSA9PSAxLCBBY3RpdmUgTG93LCB3cml0ZSAwIGZvciBGb3JjZSBWYWx1ZSAqLworCQkvKiBQMlAgbW9kZSAqLworCQkvKiBGb3JjZSBWYWx1ZSA9PSAwLCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLworCQkvKiBGb3JjZSBWYWx1ZSA9PSAxLCB0cmFuc21pdCAxIHRvIHRoZSBsaW5lICAqLwogCi0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSB2YWx1ZSAtIGFjY29yZGluZyB0byBwb2xhcml0eSAqLwotCSAgc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fVkFMLCBwb2xhcml0eSwgMCk7Ci0JICBpZiAoc3RhdHVzICE9IE1WX09LKQotCSAgewotCQltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCi0JCQkgICAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCQlyZXR1cm4oTVZfRVJST1IpOwotCSAgfQotCX0KKwkJLyogU2V0dGluZyBQMlAgc2hvdWxkIGJlIHJldmVyc2VkIGZyb20gWFZSIHBvbGFyaXR5ICovCisJCS8qIFhWUiBwb2xhcml0eSA9PSAwLCBBY3RpdmUgSGlnaCwgd3JpdGUgMSBmb3IgRm9yY2UgVmFsdWUgKi8KKwkJLyogWFZSIHBvbGFyaXR5ID09IDEsIEFjdGl2ZSBMb3csIHdyaXRlIDAgZm9yIEZvcmNlIFZhbHVlICovCisKKwkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBlbmFibGUgdmFsdWUgLSBhY2NvcmRpbmcgdG8gcG9sYXJpdHkgKi8KKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fVkFMLCBwb2xhcml0eSwgMCk7CisJCWlmIChzdGF0dXMgIT0gTVZfT0spCisJCXsKKwkJICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCSAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICByZXR1cm4oTVZfRVJST1IpOworCQl9CisJICAgfQorICAgfQogCiAJLyogUmVhZCBjdXJyZW50IEZFQyBjb25maWd1cmF0aW9uICovCiAgICAgc3RhdHVzID0gbXZPbnVFcG9uTWFjUnhwRW5jQ29uZmlnR2V0KCZpc3JQMnBQcmV2aW91c0ZlY1N0YXRlKTsKQEAgLTEzMjQsNjkgKzEzMjcsNzMgQEAKIAkJIHJldHVybihNVl9FUlJPUik7CiAJICAgfQogICAgfQotCS8qIEtXMiBBU0lDIFJldiBaMiAqLwotCS8qID09PT09PT09PT09PT09PSAqLwotCWVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikKLQl7Ci0JICBQT05fR1BJT19HRVQoQk9BUkRfR1BQX1BPTl9YVlJfVFgsIGdwaW9Hcm91cCwgZ3Bpb01hc2spOwotCSAgaWYgKGdwaW9NYXNrICE9IFBPTl9HUElPX05PVF9VU0VEKQotCSAgewotCSAgCXN0YXR1cyA9IG12R3BwVHlwZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCB+Z3Bpb01hc2svKm91dHB1dCovKTsKLQkgIAlpZiAoc3RhdHVzICE9IE1WX09LKQotCSAgCXsKLQkgIAkgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkgIAkJCSAgICAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVHlwZVNldFxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAJICByZXR1cm4oTVZfRVJST1IpOwotCSAgCX0KKyAgIGVsc2UKKyAgIHsKKwkgICAvKiBLVzIgQVNJQyBSZXYgWjIgKi8KKwkgICAvKiA9PT09PT09PT09PT09PT0gKi8KKwkgICBpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX1oyKQorCSAgIHsKKwkJUE9OX0dQSU9fR0VUKEJPQVJEX0dQUF9QT05fWFZSX1RYLCBncGlvR3JvdXAsIGdwaW9NYXNrKTsKKwkJaWYgKGdwaW9NYXNrICE9IFBPTl9HUElPX05PVF9VU0VEKQorCQl7CisJCSAgICAgc3RhdHVzID0gbXZHcHBUeXBlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIH5ncGlvTWFzay8qb3V0cHV0Ki8pOworCQkgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisJCSAgICAgeworCQkgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCQkgICJFUlJPUjogKCVzOiVkKSBtdkdwcFR5cGVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJICAgICB9CiAKLQkgIAlzdGF0dXMgPSBtdkdwcFZhbHVlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIH5ncGlvTWFzay8qZGlzYWJsZSovKTsKLQkgIAlpZiAoc3RhdHVzICE9IE1WX09LKQotCSAgCXsKLQkgIAkgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkgIAkJCSAgICAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVmFsdWVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgCSAgcmV0dXJuKE1WX0VSUk9SKTsKLQkgIAl9CisJCSAgICAgc3RhdHVzID0gbXZHcHBWYWx1ZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCB+Z3Bpb01hc2svKmRpc2FibGUqLyk7CisJCSAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJICAgICB7CisJCSAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJCSAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVmFsdWVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJICAgICB9CiAKLQkgIAlzdGF0dXMgPSBtdkdwcFR5cGVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgZ3Bpb01hc2svKmlucHV0Ki8pOwotCSAgCWlmIChzdGF0dXMgIT0gTVZfT0spCi0JICAJewotCSAgCSAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkJICAgICAiRVJST1I6ICglczolZCkgbXZHcHBUeXBlU2V0XG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkgIAkgIHJldHVybihNVl9FUlJPUik7Ci0JICAJfQotCSAgfQorCQkgICAgIHN0YXR1cyA9IG12R3BwVHlwZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCBncGlvTWFzay8qaW5wdXQqLyk7CisJCSAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJICAgICB7CisJCSAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJCSAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVHlwZVNldFxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCSAgICAgICByZXR1cm4oTVZfRVJST1IpOworCQkgICAgIH0KKwkJfQogCi0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIG91dHB1dCBzdGF0dXMgc2V0ICovCi0JICBzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOwotCSAgaWYgKHN0YXR1cyAhPSBNVl9PSykKLSAgICAgIHsKLQkgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkgICAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgICByZXR1cm4oTVZfRVJST1IpOwotCSAgfQotCX0KLQkvKiBLVzIgQVNJQyBSZXYgQTAgKi8KLQkvKiA9PT09PT09PT09PT09PT0gKi8KLQllbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfQTApCi0JewotCSAgLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBvdXRwdXQgc3RhdHVzIHNldCAqLwotCSAgc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfT1VUUFVULCAwKTsKLQkgIGlmIChzdGF0dXMgIT0gTVZfT0spCi0JICB7Ci0JICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkgIAkJICAgICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAgIHJldHVybihNVl9FUlJPUik7Ci0JICB9CisJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gb3V0cHV0IHN0YXR1cyBzZXQgKi8KKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfT1VUUFVULCAwKTsKKwkJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJeworCQkJIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkJICAgICJFUlJPUjogKCVzOiVkKSBhc2ljT250TWlzY1JlZ1dyaXRlXG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwkJCSByZXR1cm4oTVZfRVJST1IpOworCQl9CisJICAgfQogCi0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGRpc2FibGUgKi8KLQkgIHN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfRk9SQ0VfQkVOX0lPX0VOLCAwLCAwKTsKLQkgIGlmIChzdGF0dXMgIT0gTVZfT0spCi0JICB7Ci0JCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkJCSAgICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybihNVl9FUlJPUik7Ci0JICB9Ci0JfQorCSAgIC8qIEtXMiBBU0lDIFJldiBBMCAqLworCSAgIC8qID09PT09PT09PT09PT09PSAqLworCSAgIGVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkKKwkgICB7CisJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gb3V0cHV0IHN0YXR1cyBzZXQgKi8KKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfT1VUUFVULCAwKTsKKwkJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJeworCQkgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkgICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCSAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJfQorCisJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gZm9yY2UgZGlzYWJsZSAqLworCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19FTiwgMCwgMCk7CisJCWlmIChzdGF0dXMgIT0gTVZfT0spCisJCXsKKwkJICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCSAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICByZXR1cm4oTVZfRVJST1IpOworCQl9CisJICAgfQorICAgfQogCiAJCWlmIChvbnVFcG9uRGJQMlBGb3JjZU1vZGVHZXQoKSkKIAkJewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBbGxvYy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBbGxvYy5jCmluZGV4IDIyYzM0ZDguLjU0NDJmYWMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251QWxsb2MuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUFsbG9jLmMKQEAgLTE2MiwxMCArMTYyLDEwIEBACiAqKgogKiogIE9VVFBVVFM6ICAgICBNVl9VMzIgKmVudHJ5CiAqKgotKiogIFJFVFVSTlM6ICAgICBNVl9PSyBvciBNVl9FUlJPUgorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZBTFNFCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX1NUQVRVUyBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRXhpc3RDaGVjayhNVl9VMzIgYWxsb2NJZCwgTVZfVTMyICplbnRyeSwgTVZfVTMyICp0Y29udCkKK01WX0JPT0wgb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiAqZW50cnksIE1WX1UzMiAqdGNvbnQpCiB7CiAJTVZfVTMyICBpRW50cnk7CiAJTVZfVTMyICBtYWNBbGxvY0lkOwpAQCAtMTc4LDUwICsxNzgsMTUgQEAKIAkJaWYgKChzdGF0dXMgPT0gTVZfT0spICYmIChtYWNBbGxvY0lkID09IGFsbG9jSWQpICYmICh2YWxpZCA9PSBNVl9UUlVFKSkgewogCQkJKmVudHJ5ID0gaUVudHJ5OwogCQkJKnRjb250ID0gdGNvbnROdW07Ci0JCQlyZXR1cm4gKE1WX09LKTsKKwkJCXJldHVybiAoTVZfVFJVRSk7CiAJCX0KIAl9CiAKLQlyZXR1cm4gKE1WX0VSUk9SKTsKKwlyZXR1cm4gKE1WX0ZBTFNFKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCi0qKiAgb251R3BvbkFsbG9jSWRNYWNBbGxvY0NoZWNrCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiBCVyBNYXAgZW50cnkgaXMgdmFsaWQgYW5kIHJldHVybiBULUNvbnQKLSoqICAgICAgICAgICAgICAgYW5kIEFsbG9jIE51bWJlcgotKioKLSoqICBQQVJBTUVURVJTOiAgbm9uZQotKioKLSoqICBPVVRQVVRTOiAgICAgTVZfVTMyICphbGxvY0lkCi0qKiAgICAgIAkgTVZfVTMyICp0Y29udAotKioKLSoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgTVZfRVJST1IKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkTWFjQWxsb2NDaGVjayhNVl9VMzIgaW5kZXgsIE1WX1UzMiAqYWxsb2NJZCwgTVZfVTMyICp0Y29udCkKLXsKLQlNVl9VMzIgIG1hY0FsbG9jSWQ7Ci0JTVZfVTMyICB0Y29udE51bTsKLQlNVl9CT09MIHZhbGlkOwotCU1WX1NUQVRVUyBzdGF0dXM7Ci0KLSAgICAgICBzdGF0dXMgPSBtdk9udUdwb25NYWNSeEJ3TWFwR2V0KGluZGV4LCAmbWFjQWxsb2NJZCwgJnZhbGlkLCAmdGNvbnROdW0pOwotICAgICAgIGlmICgoc3RhdHVzID09IE1WX09LKSAmJiAodmFsaWQgPT0gTVZfVFJVRSkpCi0gICAgICAgewotCSAgICAgICAqYWxsb2NJZCA9IG1hY0FsbG9jSWQ7Ci0JICAgICAgICp0Y29udCAgID0gdGNvbnROdW07Ci0JICAgICAgIHJldHVybiAoTVZfT0spOwotICAgICAgIH0KLQotICAgICAgIHJldHVybiAoTVZfRVJST1IpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgogKiogIG9udUdwb25BbGxvY0lkTWFjQWxsb2NGcmVlRW50cnlHZXQKICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAqKgpAQCAtMjMxLDEwICsxOTYsMTAgQEAKICoqCiAqKiAgT1VUUFVUUzogICAgIE1WX1UzMiAqZW50cnkKICoqCi0qKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIE1WX0VSUk9SCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgb3IgTVZfRkFMU0UKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkTWFjQWxsb2NGcmVlRW50cnlHZXQoTVZfVTMyICplbnRyeSkKK01WX0JPT0wgb251R3BvbkFsbG9jSWRNYWNBbGxvY0ZyZWVFbnRyeUdldChNVl9VMzIgKmVudHJ5KQogewogCU1WX1UzMiAgaUVudHJ5OwogCU1WX1UzMiAgbWFjQWxsb2NJZDsKQEAgLTI0NiwxMSArMjExLDExIEBACiAJCXN0YXR1cyA9IG12T251R3Bvbk1hY1J4QndNYXBHZXQoaUVudHJ5LCAmbWFjQWxsb2NJZCwgJnZhbGlkLCAmdGNvbnROdW0pOwogCQlpZiAoKHN0YXR1cyA9PSBNVl9PSykgJiYgKHZhbGlkID09IE1WX0ZBTFNFKSkgewogCQkJKmVudHJ5ID0gaUVudHJ5OwotCQkJcmV0dXJuIChNVl9PSyk7CisJCQlyZXR1cm4gKE1WX1RSVUUpOwogCQl9CiAJfQogCi0JcmV0dXJuIChNVl9FUlJPUik7CisJcmV0dXJuIChNVl9GQUxTRSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNzIsOSArMjM3LDEwIEBACiB7CiAJTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOwogCU1WX1UzMiAgICBlbnRyeTsKKwlNVl9CT09MICAgZXhpc3Q7CiAKLQlzdGF0dXMgPSBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRnJlZUVudHJ5R2V0KCZlbnRyeSk7Ci0JaWYgKHN0YXR1cyAhPSBNVl9PSykKKwlleGlzdCA9IG9udUdwb25BbGxvY0lkTWFjQWxsb2NGcmVlRW50cnlHZXQoJmVudHJ5KTsKKwlpZiAoZXhpc3QgPT0gTVZfRkFMU0UpCiAJCXJldHVybiAoTVZfRVJST1IpOwogCiAJc3RhdHVzID0gbXZPbnVHcG9uTWFjUnhCd01hcFNldChlbnRyeSwgYWxsb2NJZCwgdGNvbnRJZCwgTVZfVFJVRSk7CkBAIC0zMDcsNiArMjczLDcgQEAKIE1WX1NUQVRVUyBvbnVHcG9uQWxsb2NJZE1hY0Nvbm5lY3QoTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiB0Y29udE51bSkKIHsKIAlNVl9TVEFUVVMgc3RhdHVzOworCU1WX0JPT0wgICBleGlzdDsKIAlNVl9VMzIgICAgZW50cnk7CiAJTVZfVTMyICAgIHRjb250OwogCU1WX1UzMiAgICBuZXdJZGxlVGNvbnRFbnRyeTsKQEAgLTMyMSw4ICsyODgsOCBAQAogI2VuZGlmIC8qIE1WX0dQT05fREVCVUdfUFJJTlQgKi8KIAogCS8qIHZhbGlkYXRlIHRoYXQgcmVxdWVzdGVkIGFsbG9jLUlkIGlzIGNvbmZpZ3VyZWQgaW4gSFcgYW5kIGlzIHZhbGlkICovCi0Jc3RhdHVzID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soYWxsb2NJZCwgJmVudHJ5LCAmdGNvbnQpOwotCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKKwlleGlzdCA9IG9udUdwb25BbGxvY0lkTWFjQWxsb2NFeGlzdENoZWNrKGFsbG9jSWQsICZlbnRyeSwgJnRjb250KTsKKwlpZiAoZXhpc3QgIT0gTVZfVFJVRSkgewogCQltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FMTE9DX01PRFVMRSwKIAkJCQkJIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkTWFjQ29ubmVjdCwgYWxsb2MgSWQoJWQpIGVudHJ5KCVkKVxuIiwKIAkJCQkJX19GSUxFX0RFU0NfXywgX19MSU5FX18sIGFsbG9jSWQsIGVudHJ5KTsKQEAgLTMzNCw4ICszMDEsOCBAQAogCQkqKiBzaG91bGQgYmUgY2hhbmdlZCB0byBhbm90aGVyIElkbGUgVC1Db250ICovCiAKIAkJLyogQ2hlY2sgZm9yIGEgZnJlZSAoaWRsZSkgZW50cnkgaW4gdGhlIFRjb250IERCIHRhYmxlICovCi0JCXN0YXR1cyA9IG9udUdwb25EYkJ3VGNvbnRGcmVlR2V0KGFsbG9jSWQsICZmcmVlVGNvbnRFbnRyeSk7Ci0JCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKKwkJZXhpc3QgPSBvbnVHcG9uRGJCd1Rjb250RnJlZUdldChhbGxvY0lkLCAmZnJlZVRjb250RW50cnkpOworCQlpZiAoZXhpc3QgIT0gTVZfVFJVRSkgewogI2lmZGVmIE1WX0dQT05fREVCVUdfUFJJTlQKIAkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLAogCQkJCQkJIkRFQlVHOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkTWFjQ29ubmVjdCwgYWxsb2MgSWQoJWQpIGZyZWVUY29udEVudHJ5KCVkKVxuIiwKQEAgLTM1MSw4ICszMTgsOCBAQAogCQkJCW9udUdwb25EYkJ3SWRsZUFsbG9jR2V0KG5ld0lkbGVUY29udEVudHJ5LCAmZW50cnlBbGxvY0lkKTsKIAkJCQlpZiAoZW50cnlBbGxvY0lkICE9IFBPTl9PTlVfQUxMT0NfTk9UX0VYSVNUKSB7CiAJCQkJCS8qIENoZWNrIGlmIHRoaXMgaWRsZSBBbGxvYyBJRCBleGlzdHMgaW4gdGhlIEhXIHRhYmxlICovCi0JCQkJCXN0YXR1cyA9IG9udUdwb25BbGxvY0lkTWFjQWxsb2NFeGlzdENoZWNrKGVudHJ5QWxsb2NJZCwgJmJ3TWFwRW50cnksICZ0Y29udCk7Ci0JCQkJCWlmIChzdGF0dXMgPT0gTVZfT0spIHsKKwkJCQkJZXhpc3QgPSBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRXhpc3RDaGVjayhlbnRyeUFsbG9jSWQsICZid01hcEVudHJ5LCAmdGNvbnQpOworCQkJCQlpZiAoZXhpc3QgPT0gTVZfVFJVRSkgewogCQkJCQkJLyogcmUtYXNzaWduIHRoaXMgQWxsb2MgSUQgdG8gdGhlIG5ldyBpZGxlIFRjb250IGluIEhXICovCiAJCQkJCQlzdGF0dXMgPSBtdk9udUdwb25NYWNSeEJ3TWFwU2V0KGJ3TWFwRW50cnksIGVudHJ5QWxsb2NJZCwgb251SWRsZUFsbG9jVGNvbnQsIE1WX1RSVUUpOwogCQkJCQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgewpAQCAtMzc4LDExICszNDUsMTkgQEAKIAogI2lmZGVmIE1WX0dQT05fREVCVUdfUFJJTlQKIAltdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwKLQkJICAgIkRFQlVHOiAoJXM6JWQpIFRDT05UICglZCkgYWN0aXZlLCBDb25uZWN0XG4iLAotCQkgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnROdW0pOworICAgICAgICAgICAgICAiREVCVUc6ICglczolZCkgQWxsb2NJZE1hY0Nvbm5lY3QsIHRwbV9hY3RpdmVfdGNvbnQsIFRjb250KCVkKVxuIiwKKyAgICAgICAgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250TnVtKTsKICNlbmRpZiAvKiBNVl9HUE9OX0RFQlVHX1BSSU5UICovCiAKLQlvbnVHcG9uV3FUY29udEFjdGl2YXRlKHRjb250TnVtKTsKKwlwcmludGsoIlRDT05UICglZCkgYWN0aXZlLCBDb25uZWN0XG4iLCB0Y29udE51bSk7CisJc3RhdHVzID0gb251R3BvbldxVGNvbnRBY3RpdmF0ZSh0Y29udE51bSk7CisJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwl7CisJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQUxMT0NfTU9EVUxFLAorCQkJICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkTWFjQWRkLCBmYWlsZWQgdG8gc2NoZWR1bGUgVC1Db250KCVkKSBhY3RpdmF0ZSBpbiBXUVxuIiwKKwkJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udE51bSk7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CkBAIC00MDQsNiArMzc5LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9TVEFUVVMgb251R3BvbkFsbG9jSWRNYWNSZWNvbm5lY3QoTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiB0Y29udE51bSkKIHsKKwlNVl9CT09MICAgZXhpc3Q7CiAJTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOwogCU1WX1UzMiAgICBlbnRyeTsKIAlNVl9VMzIgICAgb251SWQ7CkBAIC00MTcsMTIgKzM5MywxMiBAQAogI2VuZGlmIC8qIE1WX0dQT05fREVCVUdfUFJJTlQgKi8KIAogCS8qIEdldCBmcmVlIGVudHJ5ICovCi0Jc3RhdHVzID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soYWxsb2NJZCwgJmVudHJ5LCAmdGNvbnQpOwotCWlmIChzdGF0dXMgPT0gTVZfT0spCi0JCXJldHVybihzdGF0dXMpOworCWV4aXN0ID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soYWxsb2NJZCwgJmVudHJ5LCAmdGNvbnQpOworCWlmIChleGlzdCAhPSBNVl9UUlVFKQorCQlyZXR1cm4gKE1WX0VSUk9SKTsKIAotCXN0YXR1cyA9IG9udUdwb25EYkJ3VGNvbnRGcmVlR2V0KGFsbG9jSWQsICZ0Y29udEZyZWVOdW0pOwotCWlmIChzdGF0dXMgIT0gTVZfT0spCisJZXhpc3QgPSBvbnVHcG9uRGJCd1Rjb250RnJlZUdldChhbGxvY0lkLCAmdGNvbnRGcmVlTnVtKTsKKwlpZiAoZXhpc3QgIT0gTVZfVFJVRSkKIAkJb251SWRsZUFsbG9jVGNvbnQgPSB0Y29udEZyZWVOdW07CiAKIAkvKiBDaGVjayBpZiBkZWZhdWx0IEFsbG9jIElkICovCkBAIC00MzUsNiArNDExLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250TnVtKTsKICNlbmRpZiAvKiBNVl9HUE9OX0RFQlVHX1BSSU5UICovCiAKKwkgICAgICAgLy8gcHJpbnRrKCJUQ09OVCAoJWQpIGZsdXNoLCBSZWNvbm5lY3RcbiIsIHRjb250TnVtKTsKKwkgICAgICAgLy8gc3RhdHVzID0gb251R3BvbldxVGNvbnRGbHVzaCh0Y29udE51bSk7CisJICAgICAgIC8vIGlmIChzdGF0dXMgIT0gTVZfT0spCisJICAgICAgIC8veworCSAgICAgICAvLyAJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BTExPQ19NT0RVTEUsCisJICAgICAgIC8vIAkJICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkTWFjUmVjb25uZWN0LCBmYWlsZWQgdG8gc2NoZWR1bGUgVC1Db250KCVkKSBmbHVzaCBpbiBXUVxuIiwKKwkgICAgICAgLy8gCQkgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnROdW0pOworCSAgICAgICAvL30KKwogCQkvKiBTZXQgQWxsb2MgSWQgdG8gVC1Db250IGluIHRoZSBHTUFDIGhhcmR3YXJlICovCiAJCXN0YXR1cyA9IG12T251R3Bvbk1hY1J4QndNYXBTZXQoZW50cnksIGFsbG9jSWQsIG9udUlkbGVBbGxvY1Rjb250LCBNVl9UUlVFKTsKIAl9CkBAIC00NDIsNTEgKzQyNyw2IEBACiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogIG9udUdwb25BbGxvY0lkTWFjUmVBY3RpdmF0ZQotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZWFjdGl2YXRlIG9udSB0Y29udCBpbmNhc2UgdGhlIHRjb250IGlzIG5vdAotKiogICAgICAgICAgICAgICBjbGVhciBhbmQgc2V0IGJ5IG1uZwotKioKLSoqICBQQVJBTUVURVJTOiAgTm9uZQotKioKLSoqICBPVVRQVVRTOiAgICAgTm9uZQotKioKLSoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgZXJyb3IKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkTWFjUmVBY3RpdmF0ZSh2b2lkKQotewotCU1WX1NUQVRVUyBzdGF0dXM7Ci0JTVZfVTMyICAgIGVudHJ5OwotCU1WX1UzMgkgIGFsbG9jSWQ7Ci0JTVZfVTMyICAgIHRjb250OwotCi0jaWZkZWYgTVZfR1BPTl9ERUJVR19QUklOVAotCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLAotICAgICAgICAgICAgICAiREVCVUc6ICglczolZCkgb251R3BvbkFsbG9jSWRNYWNSZUFjdGl2YXRlXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0jZW5kaWYgLyogTVZfR1BPTl9ERUJVR19QUklOVCAqLwotCi0JZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgT05VX0dQT05fTUFYX05VTV9PRl9UX0NPTlRTOyBlbnRyeSsrKQotCXsKLQkJc3RhdHVzID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0NoZWNrKGVudHJ5LCAmYWxsb2NJZCwgJnRjb250KTsKLQkJaWYgKHN0YXR1cyA9PSBNVl9PSykKLQkJewotCQkJbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsCi0JCQkJICAgIkRFQlVHOiAoJXM6JWQpIFRDT05UICglZCkgYWN0aXZlLCBDb25uZWN0XG4iLAotCQkJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCk7Ci0KLQkJCW9udUdwb25XcVRjb250QWN0aXZhdGUodGNvbnQpOwotCQl9Ci0JfQotCi0KLQlyZXR1cm4gKE1WX09LKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiAgb251R3BvbkFsbG9jSWRNYWNEaXNjb25uZWN0CkBAIC01MDYsNiArNDQ2LDcgQEAKIAlNVl9VMzIgIG9udUlkOwogCU1WX1UzMiAgZW50cnk7CiAJTVZfVTMyICB0Y29udDsKKwlNVl9CT09MIGV4aXN0OwogCU1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsKIAogI2lmZGVmIE1WX0dQT05fREVCVUdfUFJJTlQKQEAgLTUxNSwyMSArNDU2LDI4IEBACiAjZW5kaWYgLyogTVZfR1BPTl9ERUJVR19QUklOVCAqLwogCiAJLyogQ2hlY2sgaWYgYWxyZWFkeSBleGlzdCAqLwotCXN0YXR1cyA9IG9udUdwb25BbGxvY0lkTWFjQWxsb2NFeGlzdENoZWNrKGFsbG9jSWQsICZlbnRyeSwgJnRjb250KTsKLQlpZiAoc3RhdHVzICE9IE1WX09LKQotCQlyZXR1cm4oTVZfRVJST1IpOworCWV4aXN0ID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soYWxsb2NJZCwgJmVudHJ5LCAmdGNvbnQpOworCWlmIChleGlzdCA9PSBNVl9GQUxTRSkKKwkJcmV0dXJuIChNVl9FUlJPUik7CiAKIAkvKiBDaGVjayBpZiBkZWZhdWx0IEFsbG9jIElkICovCiAJb251SWQgPSBvbnVHcG9uRGJPbnVJZEdldCgpOwogCWlmIChhbGxvY0lkICE9IG9udUlkKQogCXsKICNpZmRlZiBNVl9HUE9OX0RFQlVHX1BSSU5UCi0JCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLAotCQkJICAgIkRFQlVHOiAoJXM6JWQpIFRDT05UICglZCkgZmx1c2gsIERpc2Nvbm5lY3RcbiIsCi0JCQkgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnQpOworCSAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgICAgIkRFQlVHOiAoJXM6JWQpIHRwbV9kZWFjdGl2ZV90Y29udCwgVGNvbnQoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCk7CiAjZW5kaWYgLyogTVZfR1BPTl9ERUJVR19QUklOVCAqLwogCi0JCW9udUdwb25XcVRjb250Rmx1c2godGNvbnQpOworCQlwcmludGsoIlRDT05UICglZCkgZmx1c2gsIERpc2Nvbm5lY3RcbiIsIHRjb250KTsKKwkJc3RhdHVzID0gb251R3BvbldxVGNvbnRGbHVzaCh0Y29udCk7CisJCWlmIChzdGF0dXMgIT0gTVZfT0spCisJCXsKKwkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQUxMT0NfTU9EVUxFLAorCQkJCSAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZE1hY0Rpc2Nvbm5lY3QsIGZhaWxlZCB0byBzY2hlZHVsZSBULUNvbnQoJWQpIGZsdXNoIGluIFdRXG4iLAorCQkJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCk7CisJCX0KIAogCQlzdGF0dXMgPSBtdk9udUdwb25NYWNSeEJ3TWFwU2V0KGVudHJ5LCAwLCAwLCBNVl9GQUxTRSk7CiAJCWlmIChzdGF0dXMgIT0gTVZfT0spCkBAIC02MTIsNyArNTYwLDcgQEAKIAkvKiBjaGVjayBpZiBBbGxvYy1JZCBleGlzdCBpbiB0aGUgYWxsb2MgSWQgREIgdGFibGUgKi8KIAlhbGxvY0lkRXhpc3QgPSBvbnVHcG9uRGJCd0FsbG9jRXhpc3QoYWxsb2NJZCk7CiAJaWYgKGFsbG9jSWRFeGlzdCA9PSBNVl9UUlVFKQotCQlyZXR1cm4gKE1WX05PX0NIQU5HRS8qTVZfT0sqLyk7CisJCXJldHVybiAoTVZfT0spOwogCiAJLyogc2V0IHRoZSBBbGxvYy1JZCBleGlzdCB0byB0aGUgZGF0YWJhc2UgKi8KIAlzdGF0dXMgPSBvbnVHcG9uRGJCd0FsbG9jSW5zZXJ0KGFsbG9jSWQsICZlbnRyeSk7CkBAIC03NjYsMTUgKzcxNCwyMSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1NUQVRVUyBvbnVHcG9uQWxsb2NJZEZyZWVBbGxCdWZmZXJzKHZvaWQpCiB7Ci0gICAgTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOworICAgIE1WX1NUQVRVUyBzdGF0dXM7CiAgICAgTVZfVTMyICAgIHRjb250TnVtID0gMHhGRjsKLQogI2lmZGVmIE1WX0dQT05fREVCVUdfUFJJTlQKICAgICBtdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwKLQkgICAgICAgIkRFQlVHOiAoJXM6JWQpIEZyZWVBbGxCdWZmZXJzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAiREVCVUc6ICglczolZCkgcmVsZWFzZSBBbGwgVC1Db250cyBidWZmZXJzLCB0cG1fZGVhY3RpdmVfdGNvbnRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKICNlbmRpZiAvKiBNVl9HUE9OX0RFQlVHX1BSSU5UICovCiAKLSAgICBvbnVHcG9uV3FUY29udEZsdXNoKHRjb250TnVtKTsKKyAgICBwcmludGsoIlRDT05UIGZsdXNoLCBGcmVlQWxsQnVmZmVyc1xuIik7CisgICAgc3RhdHVzID0gb251R3BvbldxVGNvbnRGbHVzaCh0Y29udE51bSk7CisgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKyAgICB7CisgICAgICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FMTE9DX01PRFVMRSwKKyAgICAgICAgCSAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvbkFsbG9jSWRGcmVlQWxsQnVmZmVycywgZmFpbGVkIHRvIHNjaGVkdWxlIEFsbCBULUNvbnQgZmx1c2ggaW4gV1FcbiIsCisgICAgICAgIAkgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250TnVtKTsKKyAgICB9CiAKICAgICByZXR1cm4oc3RhdHVzKTsKIH0KQEAgLTEwMDcsMTQgKzk2MSwxNCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1NUQVRVUyBvbnVHcG9uQWxsb2NJZFRjb250Q2xlYXJBbGwodm9pZCkKIHsKLQlNVl9VMzIgICAgaUVudHJ5OwotCU1WX0JPT0wgICBleGlzdDsKLQlNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7CisJTVZfVTMyICBpRW50cnk7CisJTVZfQk9PTCBleGlzdDsKKwlNVl9TVEFUVVMgc3RhdHVzOwogCU1WX1UzMiAgICB0Y29udE51bSA9IDB4RkY7CiAKICNpZmRlZiBNVl9HUE9OX0RFQlVHX1BSSU5UCiAJbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsCi0JCSAgICJERUJVRzogKCVzOiVkKSBUQ09OVCBmbHVzaCwgQ2xlYXIgQWxsXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCQkJIkRFQlVHOiAoJXM6JWQpIENsZWFyIEFsbCBBbGxvYy1JZHMgZnJvbSBULVRDT05Uc1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwogI2VuZGlmIC8qIE1WX0dQT05fREVCVUdfUFJJTlQgKi8KIAogCWZvciAoaUVudHJ5ID0gMCA7IGlFbnRyeSA8IE9OVV9HUE9OX01BWF9OVU1fT0ZfVF9DT05UUyA7IGlFbnRyeSsrKSB7CkBAIC0xMDI0LDcgKzk3OCwxNSBAQAogCQkJb251R3BvbkFsbG9jSWRUY29udENsZWFyKGlFbnRyeSk7CiAJfQogCi0Jb251R3BvbldxVGNvbnRGbHVzaCh0Y29udE51bSk7CisJcHJpbnRrKCJUQ09OVCBmbHVzaCwgQ2xlYXIgQWxsXG4iKTsKKwlzdGF0dXMgPSBvbnVHcG9uV3FUY29udEZsdXNoKHRjb250TnVtKTsKKwlpZiAoc3RhdHVzICE9IE1WX09LKQorCXsKKwkgCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQUxMT0NfTU9EVUxFLAorCSAJCSAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZFRjb250Q2xlYXJBbGwsIGZhaWxlZCB0byBzY2hlZHVsZSBBbGwgVC1Db250IGZsdXNoIGluIFdRXG4iLAorCSAJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwl9CisKIAogCXJldHVybiAoTVZfT0spOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBbGxvYy5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBbGxvYy5oCmluZGV4IDVjYTJkYjUuLjE0ZDJmNWMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251QWxsb2MuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUFsbG9jLmgKQEAgLTEwNSw3ICsxMDUsNiBAQAogTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkRGVBc3NpZ25BbGwodm9pZCk7DQogTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkRnJlZUFsbEJ1ZmZlcnModm9pZCk7DQogTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkVGNvbnRDbGVhckFsbCh2b2lkKTsNCi1NVl9TVEFUVVMgb251R3BvbkFsbG9jSWRNYWNSZUFjdGl2YXRlKHZvaWQpOw0KIE1WX1UzMiAgICBvbnVHcG9uSWRsZUFsbG9jSWRUY29udEdldCh2b2lkKTsNCiANCiAvKiBNYWNyb3MNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udURiLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udURiLmMKaW5kZXggNTJjNmRkYy4uMzkxYmMzNSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVEYi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251RGIuYwpAQCAtMzI1NCwxMCArMzI1NCwxMCBAQAogKioKICoqICBPVVRQVVRTOiAgICAgTm9uZQogKioKLSoqICBSRVRVUk5TOiAgICAgTVZfT0sgaWYgdGhlcmUgaXMgYSBmcmVlIGVudHJ5LCBNVl9FUlJPUiBvdGhlcndpc2UKKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBpZiB0aGVyZSBpcyBhIGZyZWUgZW50cnksIE1WX0ZBTFNFIG90aGVyd2lzZQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NVl9TVEFUVVMgb251R3BvbkRiQndUY29udEZyZWVHZXQoTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiAqdGNvbnROdW0pCitNVl9CT09MIG9udUdwb25EYkJ3VGNvbnRGcmVlR2V0KE1WX1UzMiBhbGxvY0lkLCBNVl9VMzIgKnRjb250TnVtKQogewogCU1WX0JPT0wgZXhpc3Q7CiAJTVZfVTMyICBkYkFsbG9jSWQ7CkBAIC0zMjcwLDcgKzMyNzAsNyBAQAogCQlvbnVHcG9uRGJCd1Rjb250R2V0KGlUY29udCwgJmV4aXN0LCAmZGJBbGxvY0lkLCAmZGJWYWxpZCk7CiAJCWlmICgoZXhpc3QgPT0gTVZfVFJVRSkgJiYgKGRiVmFsaWQgPT0gTVZfRkFMU0UpKSB7CiAJCQkqdGNvbnROdW0gPSBpVGNvbnQ7Ci0JCQlyZXR1cm4oTVZfT0spOworCQkJcmV0dXJuKE1WX1RSVUUpOwogCQl9CiAKIAkJaWYgKGRiQWxsb2NJZCA9PSBhbGxvY0lkKQpAQCAtMzI3OSw3ICszMjc5LDcgQEAKIAogCSp0Y29udE51bSA9IHRlbXBUY29udDsKIAotCXJldHVybihNVl9FUlJPUik7CisJcmV0dXJuKE1WX0ZBTFNFKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251RGIuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251RGIuaAppbmRleCA1OWRlYjcyLi41MzViNmVhIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udURiLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVEYi5oCkBAIC0zOTIsNyArMzkyLDcgQEAKIE1WX1NUQVRVUyBvbnVHcG9uRGJCd1Rjb250Q2xlYXIoTVZfVTMyIHRjb250TnVtKTsKIE1WX1NUQVRVUyBvbnVHcG9uRGJCd1Rjb250QWxsb2MoTVZfVTMyIHRjb250TnVtLCBNVl9VMzIgYWxsb2NJZCk7CiBNVl9TVEFUVVMgb251R3BvbkRiQndUY29udENvbm5lY3RDaGVjayhNVl9VMzIgYWxsb2NJZCwgTVZfVTMyICp0Y29udE51bSwgTVZfQk9PTCAqdmFsaWQpOwotTVZfU1RBVFVTIG9udUdwb25EYkJ3VGNvbnRGcmVlR2V0KE1WX1UzMiBhbGxvY0lkLCBNVl9VMzIgKnRjb250TnVtKTsKK01WX0JPT0wgICBvbnVHcG9uRGJCd1Rjb250RnJlZUdldChNVl9VMzIgYWxsb2NJZCwgTVZfVTMyICp0Y29udE51bSk7CiAKIE1WX1NUQVRVUyBvbnVHcG9uRGJCd01hcENudER1bXBTZXQoTVZfVTMyIGVuYWJsZSk7CiBNVl9CT09MICAgb251R3BvbkRiQndNYXBDbnREdW1wR2V0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVJc3IuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251SXNyLmgKaW5kZXggNDlmNWM5Mi4uMTFlZTk2YiAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVJc3IuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUlzci5oCkBAIC0xMTMsNyArMTEzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogI2RlZmluZSBPTl9HUE9OX01BWF9BTEFSTVMgICAgICAgICAgICAgICAgICAgICAgKDMpDQogDQotI2RlZmluZSBPTlVfR1BPTl9JTlRfQUxBUk1TICAgICAgICAgICAgICAgICAgICAgKE9OVV9HUE9OX0xPRl9BTEFSTV9NQVNLKQ0KKyNkZWZpbmUgT05VX0dQT05fSU5UX0FMQVJNUyAgICAgICAgICAgICAgICAgICAgIChPTlVfR1BPTl9MT0ZfQUxBUk1fTUFTSyB8XA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTlVfR1BPTl9MQ0RHX0FMQVJNX01BU0spDQogDQogI2RlZmluZSBPTlVfR1BPTl9QQVJJVFlfRVJST1IgICAgICAgICAgICAgICAgICAgKE9OVV9HUE9OX1JBTV9URVNUX0dSWF9QQVJJVFlfRVJSX01BU0sgIHxcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9OVV9HUE9OX1JBTV9URVNUX0dFTV9QQVJJVFlfRVJSX01BU0sgIHxcDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVNbmdyLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udU1uZ3IuYwppbmRleCBlYzE5NTdjLi4xMzllOTY0IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udU1uZ3IuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udU1uZ3IuYwpAQCAtMzY0LDcgKzM2NCw3IEBACiAgIE1WX1UzMiAgICAgICAgICBvbnVTdGF0ZTsNCiAgIEdQT05GVU5DUFRSICAgICBwdHJGdW5jOw0KICAgU19PbnVHcG9uR2VuVGJsICpvbnVHcG9uR2VuVGJsX3AgPSAmKG9udUdwb25EYl9zLm9udUdwb25HZW5UYmxfcyk7DQotICBNVl9VMzIgICAgICAgICAgKm1zZ0RhdGFfcCA9IChNVl9VMzIqKW1zZ0RhdGE7DQorICBNVl9VMzIgICAgICAgICAgKm1zZ0RhdGFfcCA9IG1zZ0RhdGE7DQogDQogICAvKiBnZXQgb251IElkICovDQogICBhcHBPbnVJZCA9IG9udUdwb25EYk9udUlkR2V0KCk7DQpAQCAtMzg4LDExICszODgsMTEgQEAKICAgICAgIH0NCiAgICAgICBlbHNlDQogICAgICAgew0KLQlvbnVHcG9uU3luY0xvZyhPTlVfR1BPTl9MT0dfTVNHLCBvbnVJZCwgbXNnSWQsIDApOw0KLQlvbnVHcG9uU3luY0xvZyhPTlVfR1BPTl9MT0dfTVNHX0NPTlRFTlQsICoobXNnRGF0YV9wKSwgKihtc2dEYXRhX3AgKyAxKSwgKihtc2dEYXRhX3AgKyAyKSk7DQogICAgICAgICAoKnB0ckZ1bmMpKG9udUlkLCBtc2dJZCwgbXNnRGF0YSk7DQogICAgICAgfSAgICAgICAgICAgDQogDQorICAgICAgb251R3BvblN5bmNMb2coT05VX0dQT05fTE9HX01TRywgb251SWQsIG1zZ0lkLCAwKTsNCisgICAgICBvbnVHcG9uU3luY0xvZyhPTlVfR1BPTl9MT0dfTVNHX0NPTlRFTlQsICoobXNnRGF0YV9wKSwgKihtc2dEYXRhX3AgKyAxKSwgKihtc2dEYXRhX3AgKyAyKSk7DQogICAgIH0NCiAgICAgLyogaGFuZGxlIGludmFsaWQgbWVzc2FnZXMgKi8NCiAgICAgZWxzZQ0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251TW5nclN0YXRlTWFjaGluZS5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVNbmdyU3RhdGVNYWNoaW5lLmMKaW5kZXggMjY4NjgyNi4uZjY0NWIzNCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVNbmdyU3RhdGVNYWNoaW5lLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVNbmdyU3RhdGVNYWNoaW5lLmMKQEAgLTg0LDEyICs4NCw2IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBfX0ZJTEVfREVTQ19fICJtdl9wb24vY29yZS9ncG9uL2dwb25PbnVTdGF0ZU1hY2hpbmUuYyIKIAotI2RlZmluZSBJTkRJQ0FUSU9OX0JJVF9NQVBfTk9ORSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCi0jZGVmaW5lIElORElDQVRJT05fQklUX01BUF9GSUJFUl9FVkVOVCAgICAgICAgICAoMHgwMDAwMDAwMSkKLSNkZWZpbmUgSU5ESUNBVElPTl9CSVRfTUFQX0ZPUkNFX1RDT05UX0NMRUFSICAgICgweDAwMDAwMDAyKQotI2RlZmluZSBJTkRJQ0FUSU9OX0JJVF9NQVBfRk9SQ0VfVENPTlRfUkVDT05GSUcgKDB4MDAwMDAwMDQpCi0jZGVmaW5lIElORElDQVRJT05fQklUX01BUF9SRVNFUlZFRCAgICAgICAgICAgICAoMHgwMDAwMDAwOCkKLQogLyogR2xvYmFsIFZhcmlhYmxlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGV4dGVybiBzcGlubG9ja190IG9udVBvbklycUxvY2s7CkBAIC0xMDcsOSArMTAxLDkgQEAKIC8qIExvY2FsIEZ1bmN0aW9ucwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIE1WX1NUQVRVUyBvbnVHcG9uUG9uTW5nclVwZGF0ZVN0YXRlKE1WX1UzMiBuZXdTdGF0ZSk7Ci1NVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251SW5mbyhNVl9VMzIgaW5kaWNhdGlvbkJpdE1hcCk7Ci1NVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251VGNvbnRzKE1WX1UzMiBpbmRpY2F0aW9uQml0TWFwKTsKLU1WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVCdWZmZXJzKE1WX1UzMiBpbmRpY2F0aW9uQml0TWFwKTsKK01WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKHZvaWQpOworTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udUJ1ZmZlcnModm9pZCk7CitNVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251VGNvbnRzKHZvaWQpOwogTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udVBvcnRzKHZvaWQpOwogTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udUlkKHZvaWQpOwogTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udURlbGF5KHZvaWQpOwpAQCAtMjUzLDkgKzI0Nyw5IEBACiAqKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIGVycm9yCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVCdWZmZXJzKE1WX1UzMiBpbmRpY2F0aW9uQml0TWFwKQorTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udUJ1ZmZlcnModm9pZCkKIHsKLSAgIE1WX1NUQVRVUyByY29kZSA9IE1WX09LOworICAgTVZfU1RBVFVTIHJjb2RlOwogCiAgICByY29kZSA9IG9udUdwb25BbGxvY0lkRnJlZUFsbEJ1ZmZlcnMoKTsKICAgIGlmIChyY29kZSAhPSBNVl9PSykKQEAgLTI2NCwxOSArMjU4LDYgQEAKICAgIAkgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVCdWZmZXJzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CiAgICB9CiAKLQotICAgaWYgKChvbnVHcG9uRGJUY29udFJlc2V0R2V0KCkgIT0gTVZfVFJVRSkgJiYKLSAgICAgICAoaW5kaWNhdGlvbkJpdE1hcCAmIElORElDQVRJT05fQklUX01BUF9GSUJFUl9FVkVOVCkpCi0gICB7Ci0JIHJjb2RlID0gb251R3BvbkFsbG9jSWRNYWNSZUFjdGl2YXRlKCk7Ci0JIGlmIChyY29kZSAhPSBNVl9PSykKLQkgewotCSAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAotCQkgICAgICAiRVJST1I6ICglczolZCkgb251R3BvblBvbk1uZ0NsZWFyT251VGNvbnRzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAgcmV0dXJuKHJjb2RlKTsKLQkgfQotICAgfQotCiAgICByZXR1cm4oTVZfT0spOwogfQogCkBAIC0yOTUsNyArMjc2LDcgQEAKICoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgZXJyb3IKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oTVZfVTMyIGluZGljYXRpb25CaXRNYXApCitNVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251SW5mbyh2b2lkKQogewogICBNVl9TVEFUVVMgcmNvZGU7CiAKQEAgLTMwMywzMiArMjg0LDI5IEBACiAgIGlmIChyY29kZSAhPSBNVl9PSykKICAgewogICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAotICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25Qb25NbmdDbGVhck9udVBvcnRzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0gICAgcmV0dXJuKHJjb2RlKTsKKyAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVQb3J0c1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOyAgICByZXR1cm4ocmNvZGUpOwogICB9CiAKLSAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVUY29udHMoaW5kaWNhdGlvbkJpdE1hcCk7CisgIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251VGNvbnRzKCk7CiAgIGlmIChyY29kZSAhPSBNVl9PSykKICAgewogICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAotICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25Qb25NbmdDbGVhck9udVRjb250c1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotICAgIHJldHVybihyY29kZSk7CisgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvblBvbk1uZ0NsZWFyT251VGNvbnRzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7ICAgIHJldHVybihyY29kZSk7CiAgIH0KIAotICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUJ1ZmZlcnMoaW5kaWNhdGlvbkJpdE1hcCk7CisgIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251QnVmZmVycygpOwogICBpZiAocmNvZGUgIT0gTVZfT0spCiAgIHsKICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKICAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVCdWZmZXJzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0gICAgcmV0dXJuKHJjb2RlKTsKKyAgICByZXR1cm47CiAgIH0KIAogICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUlkKCk7CiAgIGlmIChyY29kZSAhPSBNVl9PSykKICAgewogICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAotICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25Qb25NbmdDbGVhck9udUlkXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0gICAgcmV0dXJuKHJjb2RlKTsKKyAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJZFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOyAgICByZXR1cm4ocmNvZGUpOwogICB9CiAKICAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVEZWxheSgpOwpAQCAtNDA5LDIwICszODcsMTggQEAKICoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgZXJyb3IKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udVRjb250cyhNVl9VMzIgaW5kaWNhdGlvbkJpdE1hcCkKK01WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVUY29udHModm9pZCkKIHsKICAgTVZfU1RBVFVTIHJjb2RlID0gTVZfT0s7CiAKLSAgaWYgKChvbnVHcG9uRGJUY29udFJlc2V0R2V0KCkgPT0gTVZfVFJVRSkgfHwKLSAgICAgIChpbmRpY2F0aW9uQml0TWFwICYgSU5ESUNBVElPTl9CSVRfTUFQX0ZPUkNFX1RDT05UX0NMRUFSKSkKLSAgewotCXJjb2RlID0gb251R3BvbkFsbG9jSWREZUFzc2lnbkFsbCgpOwotCWlmIChyY29kZSAhPSBNVl9PSykKLQl7Ci0JICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKLQkJICAgICAiRVJST1I6ICglczolZCkgb251R3BvblBvbk1uZ0NsZWFyT251VGNvbnRzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICByZXR1cm4ocmNvZGUpOwotCX0KKyAgaWYgKG9udUdwb25EYlRjb250UmVzZXRHZXQoKT09TVZfVFJVRSkgeworICAgICAgcmNvZGUgPSBvbnVHcG9uQWxsb2NJZERlQXNzaWduQWxsKCk7CisgICAgICBpZiAocmNvZGUgIT0gTVZfT0spCisgICAgICB7CisgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAorICAgICAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZERlQXNzaWduQWxsXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisgICAgICAgIHJldHVybihyY29kZSk7CisgICAgICB9CiAgIH0KIAogICByZXR1cm4oTVZfT0spOwpAQCAtMTAxMiwyMSArOTg4LDE0IEBACiAKICAgICAvKiBzZXQgRGVmYXVsdCBhbGxvY0lkIGFjY29yZGluZyB0byB0aGUgb251SWQgKi8KICAgICByY29kZSA9IG9udUdwb25BbGxvY0lkQXNzaWduKG1zZ09udUlkLCAwKTsKLSAgICBpZiAoKHJjb2RlICE9IE1WX09LKSAmJiAocmNvZGUgIT0gTVZfTk9fQ0hBTkdFKSkKKyAgICBpZiAocmNvZGUgIT0gTVZfT0spCiAgICAgewotCSAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKLQkJICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZEFzc2lnblxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCQkgICAgICAgcmV0dXJuOworICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCisgICAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZEFzc2lnblxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBlbHNlIGlmICgocmNvZGUgIT0gTVZfT0spICYmIChyY29kZSA9PSBNVl9OT19DSEFOR0UpKQotICAgIHsKLQkgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCi0JCSAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvbkFsbG9jSWRBc3NpZ24sIEFsbG9jIElkIGV4aXN0XG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0gICAgfQotICAgIGVsc2UgLyogTVZfT0sgKi8KLSAgICB7Ci0JICAgIG9udUdwb25BbGxvY0lkTWFjQWRkKG1zZ09udUlkLCBQT05fT05VX0RFRkFVTFRfQUxMT0NfVENPTlQpOwotICAgIH0KKworICAgIG9udUdwb25BbGxvY0lkTWFjQWRkKG1zZ09udUlkLCBQT05fT05VX0RFRkFVTFRfQUxMT0NfVENPTlQpOwogCiAgICAgLyogU2V0IGRlbGF5IHJlY2VpdmVkIGZyb20gT0xUICovCiAgICAgZXF1YWxpemF0aW9uRGVsYXlUZW1wID0gb251R3BvbkRiRXF1YWxpemF0aW9uRGVsYXlHZXQoKTsKQEAgLTEyOTQsMTIgKzEyNjMsMTIgQEAKIAkJIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCBjdXJyRmluYWxEZWxheSk7CiAKICAgICAgIC8qIENoZWNrIGlmIGNhbiBjaGFuZ2UgdGhlIFRYIEZpbmFsIERlbGF5IG9ubHkgKi8KLSAgICAgIGlmIChjaGFuZ2VEZWxheSArIGN1cnJGaW5hbERlbGF5IDw9IEdQT05fVFhfRklOQUxfREVMQVlfTUFYKQorICAgICAgaWYgKGNoYW5nZURlbGF5ICsgY3VyckZpbmFsRGVsYXkgPiBHUE9OX1RYX0ZJTkFMX0RFTEFZX01BWCkKICAgICAgIHsKICAgICAgICAgZmluYWxEZWxheSA9IGN1cnJGaW5hbERlbGF5ICsgY2hhbmdlRGVsYXk7CiAKIAltdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX1NNX1NUQVRFX01PRFVMRSwKLQkJICAgIlJhbmdlIERlYnVnIEluZm86ICglczolZCksIFN0YXRlIE81LCBDaGFuZ2UgZGVsYXkgKyBjdXJyZW50IEZpbmFsIGRlbGF5IDw9IE1BWCBGaW5hbCBkZWxheSgweDNGKSwgdXBkYXRlZCBmaW5hbCBkZWxheSwgZmluYWxEZWxheSA9IGN1cnJGaW5hbERlbGF5ICsgY2hhbmdlRGVsYXksICgweCV4KVxuIiwKKwkJICAgIlJhbmdlIERlYnVnIEluZm86ICglczolZCksIFN0YXRlIE81LCBDaGFuZ2UgZGVsYXkgKyBjdXJyZW50IEZpbmFsIGRlbGF5ID4gTUFYIEZpbmFsIGRlbGF5KDB4M0YpLCB1cGRhdGVkIGZpbmFsIGRlbGF5LCBmaW5hbERlbGF5ID0gY3VyckZpbmFsRGVsYXkgKyBjaGFuZ2VEZWxheSwgKDB4JXgpXG4iLAogCQkgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgZmluYWxEZWxheSk7CiAgICAgICB9CiAgICAgICBlbHNlCkBAIC0xMzEwLDcgKzEyNzksNyBAQAogI2VuZGlmIC8qIE1WX0dQT05fREVCVUdfUFJJTlQgKi8KIAogCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fU01fU1RBVEVfTU9EVUxFLAotCQkgICAiUmFuZ2UgRGVidWcgSW5mbzogKCVzOiVkKSwgU3RhdGUgTzUsIENoYW5nZSBkZWxheSArIEZpbmFsIGRlbGF5ID4gTUFYIEZpbmFsIGRlbGF5ID0gMHgzRiwgdXBkYXRlZCBlcXVhbGl6YXRpb24gZGVsYXlcbiIsCisJCSAgICJSYW5nZSBEZWJ1ZyBJbmZvOiAoJXM6JWQpLCBTdGF0ZSBPNSwgQ2hhbmdlIGRlbGF5ICsgRmluYWwgZGVsYXkgPCBNQVggRmluYWwgZGVsYXkgPSAweDNGLCB1cGRhdGVkIGVxdWFsaXphdGlvbiBkZWxheVxuIiwKIAkJICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwogCiAgICAgICAgIC8qIGNhbGMgZGVsYXkgKi8KQEAgLTE0MDMsNyArMTM3Miw3IEBACiAKICAgLyogY2xlYXIgb251IGluZm9ybWF0aW9uICovCiAgIC8qID09PT09PT09PT09PT09PT09PT09PSAqLwotICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oSU5ESUNBVElPTl9CSVRfTUFQX0ZPUkNFX1RDT05UX0NMRUFSKTsKKyAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKCk7CiAgIGlmIChyY29kZSAhPSBNVl9PSykKICAgewogICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLApAQCAtMTQ5OSw3ICsxNDY4LDcgQEAKIAogCQkvKiBjbGVhciBvbnUgaW5mb3JtYXRpb24gKi8KIAkJLyogPT09PT09PT09PT09PT09PT09PT09ICovCi0JCXJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SW5mbyhJTkRJQ0FUSU9OX0JJVF9NQVBfRk9SQ0VfVENPTlRfQ0xFQVIpOworCQlyY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oKTsKIAkJaWYgKHJjb2RlICE9IE1WX09LKSB7CiAJCQltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKIAkJCQkJICAgIkVSUk9SOiAoJXM6JWQpIERJU0FCTEU6IG9udUdwb25Qb25NbmdDbGVhck9udUluZm9cbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKQEAgLTE4NzEsNyArMTg0MCw3IEBACiAgICAgaWYgKG5ld0FsbG9jU3RhdHVzID09IE1WX1RSVUUpCiAgICAgewogICAgICAgc3RhdHVzID0gb251R3BvbkFsbG9jSWRBc3NpZ24oYWxsb2NJZCwgMSk7Ci0gICAgICBpZiAoKHN0YXR1cyAhPSBNVl9PSykgJiYgKHN0YXR1cyAhPSBNVl9OT19DSEFOR0UpKQorICAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKICAgICAgIHsKICAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCiAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkQXNzaWduIG9udUlkKCVkKSwgYWxsb2NJZCglZClcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCBvbnVJZCwgYWxsb2NJZCk7CkBAIC0yNjYyLDcgKzI2MzEsNyBAQAogCiAgIC8qIGNsZWFyIG9udSBpbmZvcm1hdGlvbiAqLwogICAvKiA9PT09PT09PT09PT09PT09PT09PT0gKi8KLSAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKElORElDQVRJT05fQklUX01BUF9GSUJFUl9FVkVOVCk7CisgIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SW5mbygpOwogICBpZiAocmNvZGUgIT0gTVZfT0spCiAgIHsKICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKQEAgLTI3MzUsNyArMjcwNCw3IEBACiAKICAgLyogY2xlYXIgb251IGluZm9ybWF0aW9uICovCiAgIC8qID09PT09PT09PT09PT09PT09PT09PSAqLwotICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oSU5ESUNBVElPTl9CSVRfTUFQX0ZJQkVSX0VWRU5UKTsKKyAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKCk7CiAgIGlmIChyY29kZSAhPSBNVl9PSykKICAgewogICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLApAQCAtMjkxOSw3ICsyODg4LDcgQEAKIAogICAgIC8qIGNsZWFyIG9udSBpbmZvcm1hdGlvbiAqLwogICAgIC8qID09PT09PT09PT09PT09PT09PT09PSAqLwotICAgIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SW5mbyhJTkRJQ0FUSU9OX0JJVF9NQVBfRklCRVJfRVZFTlQpOworICAgIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SW5mbygpOwogICAgIGlmIChyY29kZSAhPSBNVl9PSykKICAgICB7CiAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251U3J2Yy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVTcnZjLmMKaW5kZXggNWIzYzQ1NC4uMDQ0ZjU4OSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVTcnZjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVTcnZjLmMKQEAgLTEyMjEsNyArMTIyMSw3IEBACiAgICAgICAgICAgICBicmVhazsNCiANCiAgICAgICAgIGNhc2UgT05VX0dQT05fTE9HX01TR19DT05URU5UOg0KLSAgICAgICAgICAgIHByaW50aygiWyUwM2RdIFBMT0FNIG1lc3NhZ2UsIGRhdGE9MHglMDh4JTA4eCUwOHggWzAzMDIwMTAwMDcwNjA1MDQxMTEwMDkwOF1cbiIsIHByaW50RW50cnksDQorICAgICAgICAgICAgcHJpbnRrKCJbJTAzZF0gUExPQU0gbWVzc2FnZSwgZGF0YT0weCUwOHglMDh4JTA4eFxuIiwgcHJpbnRFbnRyeSwNCiAgICAgICAgICAgICAgICAgICAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS5kYXRhVmFsMSwNCiAgICAgICAgICAgICAgICAgICAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS5kYXRhVmFsMiwNCiAgICAgICAgICAgICAgICAgICAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS5kYXRhVmFsMyk7DQpAQCAtMTIzMiw3ICsxMjMyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLnN0YXRlLA0KICAgICAgICAgICAgICAgICAgICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLnRpbWUsDQogICAgICAgICAgICAgICAgICAgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0uZGF0YVZhbDEpOw0KLSAgICAgICAgICAgIHByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7DQogICAgICAgICAgICAgYnJlYWs7DQogDQogICAgICAgICBjYXNlIE9OVV9HUE9OX0xPR19JTlRFUlJVUFRfWFZSX1NEOg0KQEAgLTEyNTYsNyArMTI1NSw3IEBACiAgICAgICAgICAgICBicmVhazsNCiANCiAgICAgICAgIGNhc2UgT05VX0dQT05fTE9HX0lOVEVSUlVQVF9TRVJERVNfU1RPUDoNCi0gICAgICAgICAgICBwcmludGsoIlslMDNkXSBTRVJERVMgU3RvcCwgc3RhdGU9JWQsIHRpbWU9JTA4eFxuIiwgcHJpbnRFbnRyeSwNCisgICAgICAgICAgICBwcmludGsoIlslMDNkXSBJbnRlcnJ1cHQsIHN0YXRlPSVkLCB0aW1lPSUwOHhcbiIsIHByaW50RW50cnksDQogICAgICAgICAgICAgICAgICAgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0uc3RhdGUsDQogICAgICAgICAgICAgICAgICAgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0udGltZSk7DQogICAgICAgICAgICAgYnJlYWs7DQpAQCAtMTI2NywxNCArMTI2Niw2IEBACiAgICAgICAgICAgICAgICAgICAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS50aW1lKTsNCiAgICAgICAgICAgICBicmVhazsNCiANCi0gICAgICAgIGNhc2UgT05VX0dQT05fTE9HX0ZSRUVfVEVYVDoNCi0gICAgICAgICAgICBwcmludGsoIlslMDNkXSBGcmVlLCB0aW1lPSUwOHggJWQgJWQgJWRcbiIsIHByaW50RW50cnksDQotICAgICAgICAgICAgICAgICAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS50aW1lLA0KLQkJICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLmRhdGFWYWwxLA0KLQkJICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLmRhdGFWYWwyLA0KLQkJICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLmRhdGFWYWwzKTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCiAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgcHJpbnRrKCJbJTAzZF0gT3RoZXJcclxuIiwgcHJpbnRFbnRyeSk7DQogICAgICAgICAgICAgYnJlYWs7DQpAQCAtMTMxMCwxMCArMTMwMSwxNSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiBNVl9TVEFUVVMgb251R3BvbldxVGNvbnRGbHVzaChNVl9VMzIgdGNvbnQpDQogew0KKyAgICBNVl9TVEFUVVMgcmNvZGU7DQorDQogICAgIGlmICh0Y29udCAhPSAweEZGKQ0KLQlxdWV1ZV93b3JrKGdwb25UY29udEZsdXNoV3EucG9uV3EsIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKikmZ3BvblRjb250Q2xlYW5Xb3JrW3Rjb250XSk7DQorCXJjb2RlID0gcXVldWVfd29yayhncG9uVGNvbnRGbHVzaFdxLnBvbldxLCAoc3RydWN0IHdvcmtfc3RydWN0ICopJmdwb25UY29udENsZWFuV29ya1t0Y29udF0pOw0KICAgICBlbHNlDQotICAgICAgICBxdWV1ZV93b3JrKGdwb25UY29udEZsdXNoV3EucG9uV3EsIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKikmZ3BvblRjb250Q2xlYW5BbGxXb3JrKTsNCisgICAgICAgIHJjb2RlID0gcXVldWVfd29yayhncG9uVGNvbnRGbHVzaFdxLnBvbldxLCAoc3RydWN0IHdvcmtfc3RydWN0ICopJmdwb25UY29udENsZWFuQWxsV29yayk7DQorDQorICAgIGlmKHJjb2RlID09IDApDQorCXJldHVybihNVl9FUlJPUik7DQogDQogICAgIHJldHVybihNVl9PSyk7DQogfQ0KQEAgLTEzMzUsNyArMTMzMSwxMSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiBNVl9TVEFUVVMgb251R3BvbldxVGNvbnRBY3RpdmF0ZShNVl9VMzIgdGNvbnQpDQogew0KLSAgICBxdWV1ZV93b3JrKGdwb25UY29udEZsdXNoV3EucG9uV3EsIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKikmZ3BvblRjb250QWN0aXZlV29ya1t0Y29udF0pOw0KKyAgICBNVl9TVEFUVVMgcmNvZGU7DQorDQorICAgIHJjb2RlID0gcXVldWVfd29yayhncG9uVGNvbnRGbHVzaFdxLnBvbldxLCAoc3RydWN0IHdvcmtfc3RydWN0ICopJmdwb25UY29udEFjdGl2ZVdvcmtbdGNvbnRdKTsNCisgICAgaWYocmNvZGUgPT0gMCkNCisgICAgICAgIHJldHVybihNVl9FUlJPUik7DQogDQogICAgIHJldHVybihNVl9PSyk7DQogfQ0KQEAgLTEzNzEsMTcgKzEzNzEsMTQgQEAKICAgICB7DQogCWlmIChvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9PSBUQ09OVF9GTFVTSF9SVU5OSU5HX1NUQVRFKQ0KIAl7DQotCQltdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwNCi0JCQkgICAiREVCVUc6ICglczolZCkgVENPTlQgKCVkKSBDTEVBTl9FVkVOVFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250KTsNCi0JCW9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID0gVENPTlRfRkxVU0hfQkxPQ0tJTkdfU1RBVEU7DQotCQl0cG1fZGVhY3RpdmVfdGNvbnQodGNvbnQpOw0KLQkJb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPSBUQ09OVF9GTFVTSF9SRUFEWV9TVEFURTsNCisJICAgb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPSBUQ09OVF9GTFVTSF9CTE9DS0lOR19TVEFURTsNCisJICAgdHBtX2RlYWN0aXZlX3Rjb250KHRjb250KTsNCisJICAgcHJpbnRrKCJUQ09OVCAoJWQpIENMRUFOX0VWRU5UXG4iLCB0Y29udCk7DQorCSAgIG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID0gVENPTlRfRkxVU0hfUkVBRFlfU1RBVEU7DQogCX0NCiAJZWxzZQ0KIAl7DQotCQltdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwNCi0JCQkgICAiREVCVUc6ICglczolZCkgUmVjZWl2ZWQgVENPTlRfQ0xFQU5fRVZFTlQgd2hpbGUgaW4gVC1DT05UKCVkKSBzdGF0ZSglcylcbiIsDQotCQkJICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250LCBzdGF0ZVRleHRbb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF1dKTsNCisJICAgcHJpbnRrKCJSZWNlaXZlZCBUQ09OVF9DTEVBTl9FVkVOVCB3aGlsZSBpbiBULUNPTlQoJWQpIHN0YXRlKCVzKVxuIiwgdGNvbnQsIHN0YXRlVGV4dFtvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XV0pOw0KIAl9DQogICAgIH0NCiANCkBAIC0xMzkzLDE3ICsxMzkwLDE0IEBACiAJew0KIAkgICAgaWYgKG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID09IFRDT05UX0ZMVVNIX1JVTk5JTkdfU1RBVEUpDQogCSAgICB7DQotCQkgICAgbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsDQotCQkJICAgICAgICJERUJVRzogKCVzOiVkKSBUQ09OVCAoJWQpIENMRUFOX0VWRU5UXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnQpOw0KLQkJICAgIG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID0gVENPTlRfRkxVU0hfQkxPQ0tJTkdfU1RBVEU7DQotCQkgICAgdHBtX2RlYWN0aXZlX3Rjb250KHRjb250KTsNCi0JCSAgICBvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9IFRDT05UX0ZMVVNIX1JFQURZX1NUQVRFOw0KKwkgICAgICAgb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPSBUQ09OVF9GTFVTSF9CTE9DS0lOR19TVEFURTsNCisJICAgICAgIHRwbV9kZWFjdGl2ZV90Y29udCh0Y29udCk7DQorCSAgICAgICBwcmludGsoIlRDT05UICglZCkgQ0xFQU5fRVZFTlRcbiIsIHRjb250KTsNCisJICAgICAgIG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID0gVENPTlRfRkxVU0hfUkVBRFlfU1RBVEU7DQogCSAgICB9DQogCSAgICBlbHNlDQogCSAgICB7DQotCQkgICAgbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsDQotCQkJICAgICAgICJERUJVRzogKCVzOiVkKSBSZWNlaXZlZCBUQ09OVF9DTEVBTl9FVkVOVCB3aGlsZSBpbiBULUNPTlQoJWQpIHN0YXRlKCVzKVxuIiwNCi0JCQkgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250LCBzdGF0ZVRleHRbb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF1dKTsNCisJICAgICAgIHByaW50aygiUmVjZWl2ZWQgVENPTlRfQ0xFQU5fRVZFTlQgd2hpbGUgaW4gVC1DT05UKCVkKSBzdGF0ZSglcylcbiIsIHRjb250LCBzdGF0ZVRleHRbb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF1dKTsNCiAJICAgIH0NCiAJfQ0KICAgICB9DQpAQCAtMTQxNCwxNiArMTQwOCwxMyBAQAogICAgIHsNCiAgICAgICAgaWYgKG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID09IFRDT05UX0ZMVVNIX1JFQURZX1NUQVRFKQ0KICAgICAgICB7DQotCSAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwNCi0JICAgICAgICAgICAgIkRFQlVHOiAoJXM6JWQpIFRDT05UICglZCkgQUNUSVZFX0VWRU5UXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnQpOw0KLQkgICAgICAgb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPSBUQ09OVF9GTFVTSF9SVU5OSU5HX1NUQVRFOw0KLQkgICAgICAgdHBtX2FjdGl2ZV90Y29udCh0Y29udCk7DQorICAgICAgICAgIG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID0gVENPTlRfRkxVU0hfUlVOTklOR19TVEFURTsNCisgICAgICAgICAgdHBtX2FjdGl2ZV90Y29udCh0Y29udCk7DQorICAgICAgICAgIHByaW50aygiVENPTlQgKCVkKSBBQ1RJVkVfRVZFTlRcbiIsIHRjb250KTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCi0JICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLA0KLQkJCSAgIkRFQlVHOiAoJXM6JWQpIFJlY2VpdmVkIFRDT05UX0FDVElWRV9FVkVOVCB3aGlsZSBpbiBULUNPTlQgc3RhdGUoJXMpXG4iLA0KLQkJCSAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHN0YXRlVGV4dFtvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XV0pOw0KKyAgICAgICAgICAgcHJpbnRrKCJSZWNlaXZlZCBUQ09OVF9BQ1RJVkVfRVZFTlQgd2hpbGUgaW4gVC1DT05UIHN0YXRlKCVzKVxuIiwgc3RhdGVUZXh0W29udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdXSk7DQogICAgICAgIH0NCiAgICAgfQ0KIA0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251U3J2Yy5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVTcnZjLmgKaW5kZXggNWQ4NGIxMy4uZWQwOGIyZCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVTcnZjLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVTcnZjLmgKQEAgLTg5LDcgKzg5LDYgQEAKICNkZWZpbmUgT05VX0dQT05fTE9HX1NUQVRFCQkJKDYpDQogI2RlZmluZSBPTlVfR1BPTl9MT0dfTVNHCQkJKDcpDQogI2RlZmluZSBPTlVfR1BPTl9MT0dfTVNHX0NPTlRFTlQJCSg4KQ0KLSNkZWZpbmUgT05VX0dQT05fTE9HX0ZSRUVfVEVYVAkJCSg5KQ0KIA0KICNkZWZpbmUgT05VX0dQT05fTE9HX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICg1MTIpDQogDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc01JLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzTUkuYwppbmRleCBjYjUyN2UwLi5mMTg1ZmQ0IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzTUkuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzTUkuYwpAQCAtODksOCArODksNiBAQAogCiAvKiBMb2NhbCBWYXJpYWJsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgICBTX0Vwb25Jb2N0bFRkbVF1ZXVlIGlvY3RsVGRtUXVldWU7Ci1zdGF0aWMgICBTX0Vwb25Jb2N0bERiYSAgICAgIGlvY3RsRGJhOwogCiAvKiBFeHBvcnQgRnVuY3Rpb25zCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNDc3LDcgKzQ3NSw5IEBACiAgIG9udUVwb25EYk9udUhvbGRvdmVyU3RhdGVTZXQoaW9jdGxIb2xkb3Zlci0+aG9sZG92ZXJTdGF0ZSk7CiAgIG9udUVwb25EYk9udUhvbGRvdmVyVGltZVNldChpb2N0bEhvbGRvdmVyLT5ob2xkb3ZlclRpbWUpOwogCi0gIG9udUVwb25Jc3JUaW1lckhvbGRvdmVySW50ZXJ2YWxTZXQoaW9jdGxIb2xkb3Zlci0+aG9sZG92ZXJUaW1lLCAwKTsKKyAgLyogQWRkIHRoZSBuZXdseSBjb25maWd1cmVkIGhvbGRvdmVyIHRpbWUgd2l0aCBPcHRpY2FsTG9zVGltZSAqLworICBvbnVFcG9uSXNyVGltZXJIb2xkb3ZlckludGVydmFsU2V0KG9udUVwb25EYk9udUhvbGRvdmVyVGltZUdldCgpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVHZXQoKSwgMCk7CiAKICAgbXZQb25QcmludChQT05fUFJJTlRfSU5GTywgUE9OX0FQSV9NT0RVTEUsCiAJCQkgIkRFQlVHOiBIb2xkb3ZlciBjb25maWcsIHN0YXRlKCVkKSwgdGltZSglZCkpXG4iLApAQCAtNTEyLDYgKzUxMiwxMzIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCisqKiAgb251RXBvbk1pTG9zVGltZUNvbmZpZworKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRoZSB0aW1lIGRlbGF5IGZvciBlbnRlcmluZyBob2xkb3ZlciBzdGF0dXMKKyoqCisqKiAgUEFSQU1FVEVSUzogICppb2N0bExvc1RpbWUgLSB0aW1lIGRlbGF5IHZhbHVlCisqKgorKiogIE9VVFBVVFM6ICAgICBOb25lCisqKgorKiogIFJFVFVSTlM6ICAgICBOb25lCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBvbnVFcG9uTWlMb3NUaW1lQ29uZmlnKFNfRXBvbklvY3RsTG9zVGltZSAqaW9jdGxMb3NUaW1lKQoreworICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsKKworICAgIE1WX1UxNiBvcHRpY2FsTG9zVGltZTsKKyAgICBNVl9VMTYgbWFjTG9zVGltZTsKKworICAgIG9wdGljYWxMb3NUaW1lID0gaW9jdGxMb3NUaW1lLT5vcHRpY2FsX2xvc190aW1lOworICAgIG1hY0xvc1RpbWUgICAgID0gaW9jdGxMb3NUaW1lLT5tYWNfbG9zX3RpbWU7CisKKyAgICBzdGF0dXMgPSBtdkVwb25BcGlMb3NUaW1lQ29uZmlnKG9wdGljYWxMb3NUaW1lLCBtYWNMb3NUaW1lKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25NaVR4UG93ZXJDb250cm9sQ29uZmlnCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNvbnRyb2xzIHRoZSBUWCBwb3dlciBvbiBhbmQgb2ZmCisqKgorKiogIFBBUkFNRVRFUlM6ICBpb2N0bFR4Q29udHJvbCAtIG9uLCBvZmYgYW5kIHRpbWUgZGVsYXkgYmVmb3JlIG9mZgorKioKKyoqICBPVVRQVVRTOiAgICAgTm9uZQorKioKKyoqICBSRVRVUk5TOiAgICAgTm9uZQorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgb251RXBvbk1pVHhQb3dlckNvbnRyb2xDb25maWcoU19FcG9uSW9jdGxUeENvbnRyb2wgKmlvY3RsVHhDb250cm9sKQoreworICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsKKyAgICBNVl9VMTYgYWN0aW9uOworICAgIE1WX1UxNiB0aW1lOworICAgICAgICAKKyAgICBhY3Rpb24gPSBpb2N0bFR4Q29udHJvbC0+YWN0aW9uOworICAgIHRpbWUgICA9IGlvY3RsVHhDb250cm9sLT50aW1lICogMTAwMDsgICAvKiBUaGUgdGltZSBmcm9tIHVzZXIgc3BhY2UgaXMgZXhwcmVzc2VkIGluIHNlY29uZCAqLworCisgICAgc3RhdHVzID0gbXZFcG9uQXBpVHhQb3dlckN0cmxDb25maWcoYWN0aW9uLCB0aW1lKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25NaVBvd2VyU2F2aW5nQ29uZmlnCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgbWF4U2xlZXBEdXJhdGlvbiBmb3IgcG93ZXIgc2F2aW5nIG1vZGUKKyoqCisqKiAgUEFSQU1FVEVSUzogICppb2N0bFBvd2VyU2F2aW5nIC0gcG93ZXIgc2F2aW5nIG1vZGUgZHVyYXRpb24KKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE5vbmUKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG9udUVwb25NaVBvd2VyU2F2aW5nQ29uZmlnKFNfRXBvbklvY3RsUG93ZXJTYXZpbmcgKmlvY3RsUG93ZXJTYXZpbmcpCit7CisgICAgTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOworCisgICAgTVZfVTggIGVhcmx5V2FrZXVwOworICAgIE1WX1U2NCBtYXhTbGVlcER1cmF0aW9uOworCisgICAgZWFybHlXYWtldXAgICAgICA9IGlvY3RsUG93ZXJTYXZpbmctPmVhcmx5V2FrZVVwOworICAgIG1heFNsZWVwRHVyYXRpb24gPSBpb2N0bFBvd2VyU2F2aW5nLT5tYXhTbGVlcER1cmF0aW9uOworCisgICAgc3RhdHVzID0gbXZFcG9uQXBpUG93ZXJTYXZpbmdDb25maWcoZWFybHlXYWtldXAsIG1heFNsZWVwRHVyYXRpb24pOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvbk1pQ29udHJvbFNsZWVwQ29uZmlnCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHRyaWdnZXJzIHRoZSBhY3Rpb24gb2YgcG93ZXIgbW9kZSB0cmFuc2Zvcm1hdGlvbgorKioKKyoqICBQQVJBTUVURVJTOiAgKmlvY3RsQ29udHJvbFNsZWVwIC0gcG93ZXIgY29udHJvbCBhbmQgc2xlZXAvd2FrZXVwIGR1cmF0aW9uCisqKgorKiogIE9VVFBVVFM6ICAgICBOb25lCisqKgorKiogIFJFVFVSTlM6ICAgICBOb25lCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBvbnVFcG9uTWlDb250cm9sU2xlZXBDb25maWcoU19FcG9uSW9jdGxDb250cm9sU2xlZXAgKmlvY3RsQ29udHJvbFNsZWVwKQoreworICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsKKworICAgIHVpbnQ4X3QgYWN0aW9uOworCisgICAgYWN0aW9uID0gaW9jdGxDb250cm9sU2xlZXAtPmFjdGlvbjsKKworICAgIGlmIChhY3Rpb24gPT0gRV9HUE9OX1NMRUVQX0FDVElPTl9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgbXZFcG9uQXBpU2xlZXBDdHJsRGlzYWJsZSgpOworICAgIH0KKyAgICBlbHNlIGlmIChhY3Rpb24gPT0gRV9HUE9OX1NMRUVQX0FDVElPTl9FTkFCTEUpCisgICAgeworICAgICAgICBtdkVwb25BcGlTbGVlcEN0cmxFbmFibGUoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYWN0aW9uID09IEVfR1BPTl9TTEVFUF9BQ1RJT05fQ09ORklHKQorICAgIHsKKyAgICAgICAgbXZFcG9uQXBpU2xlZXBDdHJsQ2ZnKGlvY3RsQ29udHJvbFNsZWVwLT5zbGVlcE1vZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGxDb250cm9sU2xlZXAtPnNsZWVwRHVyYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGxDb250cm9sU2xlZXAtPndhaXREdXJhdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCiAqKiAgb251RXBvbk1pU2lsZW5jZUNvbmZpZwogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICoqCkBAIC02NTAsMTEgKzc3NiwxNyBAQAogICBTX0Vwb25Jb2N0bEZlYyAgICAgIGlvY3RsRmVjOwogICBTX0Vwb25Jb2N0bEVuYyAgICAgIGlvY3RsRW5jOwogICBTX0Vwb25Jb2N0bE9hbVR4ICAgIGlvY3RsVHhPYW07CisgIFNfRXBvbklvY3RsRGJhICAgICAgaW9jdGxEYmE7CiAgIFNfRXBvbklvY3RsSG9sZE92ZXIgaW9jdGxIb2xkb3ZlcjsKICAgU19FcG9uSW9jdGxTaWxlbmNlICBpb2N0bFNpbGVuY2U7CisgIFNfRXBvbklvY3RsVGRtUXVldWUgaW9jdGxUZG1RdWV1ZTsKICAgTVZfVTMyICAgICAgICAgICAgICBpb2N0bFN0YXRlOwogICBNVl9VMzIgICAgICAgICAgICAgIGlvY3RsQWxhcm07CiAgIFNfRXBvbklvY3RsUm9ndWVPbnUgaW9jdGxSb2d1ZU9udTsKKyAgU19FcG9uSW9jdGxMb3NUaW1lICAgICAgaW9jdGxMb3NUaW1lOworICBTX0Vwb25Jb2N0bFR4Q29udHJvbCAgICBpb2N0bFR4Q29udHJvbDsKKyAgU19FcG9uSW9jdGxQb3dlclNhdmluZyAgaW9jdGxQb3dlclNhdmluZzsKKyAgU19FcG9uSW9jdGxDb250cm9sU2xlZXAgaW9jdGxDb250cm9sU2xlZXA7CiAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7CiAgIGludCAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKIApAQCAtODcwLDYgKzEwMDIsOTAgQEAKICAgICAgIHJldCA9IDA7CiAgICAgICBicmVhazsKIAorICAgIC8qID09PT09PSBNVkVQT05fSU9DVExfTE9TX1RJTUUgPT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICBjYXNlIE1WRVBPTl9JT0NUTF9MT1NfVElNRToKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZpb2N0bExvc1RpbWUsIChTX0Vwb25Jb2N0bExvc1RpbWUqKWFyZywgc2l6ZW9mKFNfRXBvbklvY3RsTG9zVGltZSkpKQorICAgICAgICB7CisgICAgICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FQSV9NT0RVTEUsCisgICAgICAJCSAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworICAgICAgICAgICAgZ290byBpb2N0bEVycjsKKyAgICAgICAgfQorCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgICAgIHN0YXR1cyA9IG9udUVwb25NaUxvc1RpbWVDb25maWcoJihpb2N0bExvc1RpbWUpKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworICAgICAgICBpZiAoc3RhdHVzICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGlvY3RsRXJyOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgCisgICAgICAgIGJyZWFrOworCisgICAgLyogPT09PT09IE1WRVBPTl9JT0NUTF9UWF9DT05UUk9MID09PT09PT09PT09PT09PT09PT09ICovCisgICAgY2FzZSBNVkVQT05fSU9DVExfVFhfQ09OVFJPTDoKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZpb2N0bFR4Q29udHJvbCwgKFNfRXBvbklvY3RsVHhDb250cm9sKilhcmcsIHNpemVvZihTX0Vwb25Jb2N0bFR4Q29udHJvbCkpKQorICAgICAgICB7CisgICAgICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FQSV9NT0RVTEUsCisgICAgICAJCSAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworICAgICAgICAgICAgZ290byBpb2N0bEVycjsKKyAgICAgICAgfQorCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgICAgIHN0YXR1cyA9IG9udUVwb25NaVR4UG93ZXJDb250cm9sQ29uZmlnKCYoaW9jdGxUeENvbnRyb2wpKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworICAgICAgICBpZiAoc3RhdHVzICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGlvY3RsRXJyOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgCisgICAgICAgIGJyZWFrOworCisgICAgLyogPT09PT09IE1WRVBPTl9JT0NUTF9QT1dFUl9TQVZJTkcgPT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICBjYXNlIE1WRVBPTl9JT0NUTF9QT1dFUl9TQVZJTkc6CisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmaW9jdGxQb3dlclNhdmluZywgKFNfRXBvbklvY3RsUG93ZXJTYXZpbmcqKWFyZywgc2l6ZW9mKFNfRXBvbklvY3RsUG93ZXJTYXZpbmcpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BUElfTU9EVUxFLAorICAgICAgCQkgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7CisgICAgICAgIH0KKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworICAgICAgICBzdGF0dXMgPSBvbnVFcG9uTWlQb3dlclNhdmluZ0NvbmZpZygmKGlvY3RsUG93ZXJTYXZpbmcpKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworICAgICAgICBpZiAoc3RhdHVzICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGlvY3RsRXJyOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gMDsKKworICAgICAgICBicmVhazsKKworICAgIC8qID09PT09PSBNVkVQT05fSU9DVExfQ09OVFJPTF9TTEVFUCA9PT09PT09PT09PT09PT09PT09PSAqLworICAgIGNhc2UgTVZFUE9OX0lPQ1RMX0NPTlRST0xfU0xFRVA6CisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmaW9jdGxDb250cm9sU2xlZXAsIChTX0Vwb25Jb2N0bENvbnRyb2xTbGVlcCopYXJnLCBzaXplb2YoU19FcG9uSW9jdGxDb250cm9sU2xlZXApKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BUElfTU9EVUxFLAorICAgICAgCQkgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7CisgICAgICAgIH0KKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworICAgICAgICBzdGF0dXMgPSBvbnVFcG9uTWlDb250cm9sU2xlZXBDb25maWcoJihpb2N0bENvbnRyb2xTbGVlcCkpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSAwOworICAgICAgICAKKyAgICAgICAgYnJlYWs7CisKICAgICAvKiA9PT09PT0gTVZFUE9OX0lPQ1RMX1NJTEVOQ0UgPT09PT09PT09PT09PT09PT09PT0gKi8KICAgICBjYXNlIE1WRVBPTl9JT0NUTF9TSUxFTkNFOgogICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmlvY3RsU2lsZW5jZSwgKFNfRXBvbklvY3RsU2lsZW5jZSopYXJnLCBzaXplb2YoU19FcG9uSW9jdGxTaWxlbmNlKSkpCkBAIC05MjUsNyArMTE0MSw3IEBACiAKICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKICAgICAgICAgCi0gICAgICAgIHN0YXR1cyA9IG9udUVwb25EYlAyUEZvcmNlTW9kZVNldChpb2N0bFN0YXRlKTsKKyAgICAgICAgb251RXBvbkRiUDJQRm9yY2VNb2RlU2V0KGlvY3RsU3RhdGUpOwogICAgICAgICAKICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzTUkuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NNSS5oCmluZGV4IGQ3M2I0ZTMuLmZlNGFhMzkgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NNSS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NNSS5oCkBAIC05OCw2ICs5OCwxMCBAQAogI2RlZmluZSBNVkVQT05fSU9DVExfVERNX1FVRV9DRkcgICBfSU9XKE1WUE9OX0lPQ1RMX01BR0lDLCAxNCwgdW5zaWduZWQgaW50KQ0KICNkZWZpbmUgTVZFUE9OX0lPQ1RMX0FMQVJNX0dFVCAgICAgX0lPUihNVlBPTl9JT0NUTF9NQUdJQywgMTUsIHVuc2lnbmVkIGludCkNCiAjZGVmaW5lIE1WRVBPTl9JT0NUTF9ST0dVRV9PTlVfU0VUIF9JT1coTVZQT05fSU9DVExfTUFHSUMsIDE2LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIE1WRVBPTl9JT0NUTF9MT1NfVElNRSAgICAgIF9JT1coTVZQT05fSU9DVExfTUFHSUMsIDE3LCB1bnNpZ25lZCBpbnQpDQorI2RlZmluZSBNVkVQT05fSU9DVExfVFhfQ09OVFJPTCAgICBfSU9XKE1WUE9OX0lPQ1RMX01BR0lDLCAxOCwgdW5zaWduZWQgaW50KQ0KKyNkZWZpbmUgTVZFUE9OX0lPQ1RMX1BPV0VSX1NBVklORyAgX0lPVyhNVlBPTl9JT0NUTF9NQUdJQywgMTksIHVuc2lnbmVkIGludCkNCisjZGVmaW5lIE1WRVBPTl9JT0NUTF9DT05UUk9MX1NMRUVQIF9JT1coTVZQT05fSU9DVExfTUFHSUMsIDIwLCB1bnNpZ25lZCBpbnQpDQogDQogI2RlZmluZSBFUE9OX01BWF9OVU1fT0ZfTUFDICAgICAgICAgICg4KQ0KICNkZWZpbmUgRVBPTl9NQVhfTlVNX09GX1FVRVVFICAgICAgICAoOCkNCkBAIC0xNDIsOSArMTQ2LDMwIEBACiB7DQogICBFX0VQT05fSU9DVExfU1REX01PREUsDQogICBFX0VQT05fSU9DVExfUDJQX01PREUsDQotICBFX0VQT05fSU9DVExfTUFYX01PREVfTlVNDQorICBFX0VQT05fSU9DVExfTUFYX01PREVfTlVNLA0KIH1FX0Vwb25Jb2N0bE1vZGU7DQogDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBFX0VQT05fSU9DVExfRU5BQkxFX1RYICAgICAgICA9IDAsIA0KKyAgICBFX0VQT05fSU9DVExfRElTQUJMRV9UWCAgICAgICA9IDEsIA0KKyAgICBFX0VQT05fSU9DVExfRElTQUJMRV9UWF9ERUxBWSA9IDIsIA0KK30gRV9FcG9uSW9jdGxUeENvbnRyb2w7DQorDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBFX0dQT05fU0xFRVBfQUNUSU9OX0RJU0FCTEUgPSAwLCANCisgICAgRV9HUE9OX1NMRUVQX0FDVElPTl9FTkFCTEUgID0gMSwgDQorICAgIEVfR1BPTl9TTEVFUF9BQ1RJT05fQ09ORklHICA9IDIsIA0KK30gRV9HcG9uU2xlZXBBY3Rpb247DQorDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBFX0dQT05fU0xFRVBfTU9ERV9ET19OT1RISU5HID0gMCwgDQorICAgIEVfR1BPTl9TTEVFUF9NT0RFX1RYICAgICAgICAgPSAxLCANCisgICAgRV9HUE9OX1NMRUVQX01PREVfVFhfUlggICAgICA9IDIsIA0KK30gRV9HcG9uU2xlZXBNb2RlOw0KKw0KIC8qIFR5cGVkZWZzDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAvKiBUWCBDb3VudGVycyAqLw0KQEAgLTI5Miw2ICszMTcsMzIgQEAKICAgTVZfVTMyIGhvbGRvdmVyVGltZTsNCiB9U19FcG9uSW9jdGxIb2xkT3ZlcjsNCiANCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAgdWludDE2X3Qgb3B0aWNhbF9sb3NfdGltZTsNCisgICAgdWludDE2X3QgbWFjX2xvc190aW1lOw0KK30gU19FcG9uSW9jdGxMb3NUaW1lOw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICB1aW50MTZfdCBhY3Rpb247DQorICAgIHVpbnQxNl90IHRpbWU7DQorfSBTX0Vwb25Jb2N0bFR4Q29udHJvbDsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAgdWludDhfdCAgZWFybHlXYWtlVXA7DQorICAgIHVpbnQ2NF90IG1heFNsZWVwRHVyYXRpb247DQorfSBTX0Vwb25Jb2N0bFBvd2VyU2F2aW5nOw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICB1aW50OF90ICBhY3Rpb247DQorICAgIHVpbnQ4X3QgIHNsZWVwTW9kZTsNCisgICAgdWludDMyX3Qgc2xlZXBEdXJhdGlvbjsNCisgICAgdWludDMyX3Qgd2FpdER1cmF0aW9uOw0KK30gU19FcG9uSW9jdGxDb250cm9sU2xlZXA7DQorDQogLyogU2lsZW5jZSAqLw0KIHR5cGVkZWYgc3RydWN0DQogew0KQEAgLTMzNSw2ICszODYsMTEgQEAKIE1WX1NUQVRVUyBvbnVFcG9uTW5nSW50ZXJmYWNlUmVsZWFzZSh2b2lkKTsNCiB2b2lkICAgICAgb251RXBvbk1pTm90aWZ5Q2FsbGJhY2soTVZfVTMyIG9udVN0YXRlKTsNCiANCitNVl9TVEFUVVMgb251RXBvbk1pTG9zVGltZUNvbmZpZyhTX0Vwb25Jb2N0bExvc1RpbWUgKmlvY3RsTG9zVGltZSk7DQorTVZfU1RBVFVTIG9udUVwb25NaVR4UG93ZXJDb250cm9sQ29uZmlnKFNfRXBvbklvY3RsVHhDb250cm9sICppb2N0bFR4Q29udHJvbCk7DQorTVZfU1RBVFVTIG9udUVwb25NaVBvd2VyU2F2aW5nQ29uZmlnKFNfRXBvbklvY3RsUG93ZXJTYXZpbmcgKmlvY3RsUG93ZXJTYXZpbmcpOw0KK01WX1NUQVRVUyBvbnVFcG9uTWlDb250cm9sU2xlZXBDb25maWcoU19FcG9uSW9jdGxDb250cm9sU2xlZXAgKmlvY3RsQ29udHJvbFNsZWVwKTsNCisNCiBNVl9TVEFUVVMgbXZQMlBTdGFydCh2b2lkKTsNCiBNVl9TVEFUVVMgbXZQMlBTdG9wKHZvaWQpOw0KIC8qIE1hY3Jvcw0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NVSS5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc1VJLmMKaW5kZXggYTQ5ZDgzMS4uNjZkYmJiMCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc1VJLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc1VJLmMKQEAgLTEwMSw3ICsxMDEsNiBAQAogLyogTG9jYWwgVmFyaWFibGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogTVZfQk9PTCBpbmZvRXBvbkNudFJlYWRDbGVhckluZCA9IE1WX1RSVUU7Ci1zdGF0aWMgU19FcG9uSW9jdGxEYmEgaW9jdGxEYmE7CiAKIC8qIEV4cG9ydCBGdW5jdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC04ODIsMTQgKzg4MSwxNSBAQAogCQkJCQkJCQkJCSJJbnRlcnJ1cHRcbiIpOwogCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gWyNRdWV1ZV1bVGhyZXNoXT4gZGdDZmcgICAgICAgICAgICAtIGNvbmZpZ3VyZSBEeWluZyBHYXNwIERCQSByZXBvcnRcbiIpOwogCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW21vZHVsZV1bTGV2ZWxdW09wdGlvbnNdID4gcHJpbnRNYXNrIC0gY2hhbmdlIHByaW50aW5nIG9wdGlvbnNcbiIpOwotCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW2VuYWJsZV1bcGF0dGVybl1bYnVyc3RdW2R1cmF0aW9uXVxuIik7Ci0Jb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICBbcGVyaW9kXSAgICAgICAgPiBwYXR0ZXJuICAgICAgICAgIC0gc3RhcnQgZW5hYmxlWzFdIG9yIHN0b3BbMF0gdHJhbnNtaXNzaW9uIgotCQkJCQkJCQkJCSIgb2YgcGF0dGVybjogMHgxLTFULCAweDItMlQsIDB4ODAtUlBCUyIKLQkJCQkJCQkJCQkiLTksIDB4ODItUlBCUy0xNSwgMHg4My1SUEJTLTIzIGluICIKLQkJCQkJCQkJCQkiYnVyc3Q6IDAtc3RhdGljLCAxLSBwZXJpb2RpYyBmb3IgIgotCQkJCQkJCQkJCSJkdXJhdGlvbjogcGVhYyB0aW1lIGludGVydmFsIgotCQkJCQkJCQkJCSJbbWljcm8gc2Vjb25kc10gaW4gcGVyaW9kIC0gZnVsbCBjaWNsZSIKLQkJCQkJCQkJCQkiIHRpbWUgaW50ZXJ2YWxbbWljcm8gc2Vjb25kc11cbiIpOworICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW2FjdGlvbl1bdGltZV0gID4gdHhQb3dlckNvbnRyb2wgICAtIGFjdGlvbigwOmVuYWJsZSwxOmRpc2FibGUsMjpzaHV0IGRvd24gdGhlbiBlbmFibGUpXG4iKTsKKyAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtlbmFibGVdW3RpbWVdICA+IHBvd2VyU2F2aW5nICAgICAgLSBjb25maWd1cmUgZWFybHkgd2FrZXVwIGFuZCBtYXggc2xlZXAgZHVyYXRpb25cbiIpOworICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW2FjdGlvbl1bbW9kZV1bdGltZV1bdGltZV0gPiBzbGVlcENvbnRyb2wgLSBjb25maWd1cmUgc2xlZXAvd2FrZXVwIHBhcmFtZXRlcnNcbiIpOworICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW3BhdHRlcm5NU0JdW3BhdHRlcm5dW3BhdHRlcm5MU0JdXG4iKTsKKyAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICA+IHByYnNVc2VyRGVmaW5lZFBhdHRlcm4gLSA4MGJpdCB1c2VyIGRhdGE6IDE2Yml0IHBhdHRlcm5NTFNCICsgMzJiaXQgcGF0dGVybiArIDMyYml0IHBhdHRlcm5MU0JcbiIpOworICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW2VuYWJsZV1bcGF0dGVybl1bYnVyc3RdW2R1cmF0aW9uXVtwZXJpb2RdIFxuIik7CisgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgPiBwcmJzUHJlRGVmaW5lZFBhdHRlcm4gLSBzdGFydCBlbmFibGVbMV0gb3Igc3RvcCBbMF0gdHJhbnNtaXNzaW9uIG9mXG4iKTsKKyAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiAweDEtMVQsIDB4Mi0yVCwgMHg1LVVzZXIsIDB4ODAtUFJCUy03LCAweDgxLVBSQlMtOSwgMHg4Mi1QUkJTLTE1LCAweDgzLVBSQlMtMjNcbiIpOworICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cnN0OiAwLXN0YXRpYywgMS1wZXJpb2RpY1xuIik7CiAJaWYgKGRldklkID09IE1WXzY2MDFfREVWX0lEKSB7CiAJCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW2xhdGVuY3ldW3NpemVdID4gcGNzRnJhbWVMaW1pdHMgICAtIENvbmZpZ3VyZSBQQ1MgRnJhbWUgU2l6ZSAiCiAJCQkJCQkJCQkJCSJsaW1pdHNcbiIpOwpAQCAtOTA0LDYgKzkwNCw3IEBACiAJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKIAlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBjYXQgcHJpbnRNYXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBkdW1wIHByaW50aW5nIG9wdGlvbnNcbiIpOwogCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGNhdCBkYmFTd0NmZ1ByaW50ICAgICAgICAgICAgICAgICAgICAgICAtIGR1bXAgREJBIGNmZ1xuIik7CisgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBjYXQgcHJic1VzZXJQYXR0ZXJuICAgICAgICAgICAgICAgICAgICAgLSBkdW1wIFBSQlMgdXNlciBkZWZpbmVkIHBhdHRlcm5cbiIpOwogCWlmIChkZXZJZCA9PSBNVl82NjAxX0RFVl9JRCkgewogCQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBjYXQgcGNzRnJhbWVMaW1pdHMgICAgICAgICAgICAgICAgICAgICAtIGR1bXAgUENTIEZyYW1lIFNpemUgTGltaXRzXG4iKTsKIAkJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgY2F0IHJ4RGF0YUZpZm9UaHJlc2ggICAgICAgICAgICAgICAgICAgLSBkdW1wIFJYIFBhcnNlciBEYXRhIEZJRk8gIgpAQCAtMTA4OSw2ICsxMDkwLDcgQEAKICAgTVZfVTMyICAgICAgICAgaWR4OwogICBNVl9VMzIgICAgICAgICBxc2V0aWR4OwogICBNVl9VMzIgICAgICAgICBudW1PZlF1ZXVlcyA9IDA7CisgIFNfRXBvbklvY3RsRGJhIGlvY3RsRGJhOwogCiAgIG1lbXNldCAoJmlvY3RsRGJhLCAwLCBzaXplb2YoU19FcG9uSW9jdGxEYmEpKTsKIApAQCAtMTI4Myw3ICsxMjg1LDMyIEBACiAgIHJldHVybihvZmYpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uVWlDZmdQcmJzVXNlclBhdHRlcm4KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcHJpbnQgUFJCUyB1c2VyIGRlZmluZWQgcGF0dGVybgorKioKKyoqICBQQVJBTUVURVJTOiAgY2hhciogYnVmCisqKgorKiogIE9VVFBVVFM6ICAgICBjaGFyKiBidWYKKyoqCisqKiAgUkVUVVJOUzogICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG9udUVwb25VaUNmZ1ByYnNVc2VyUGF0dGVybihjaGFyKiBidWYpCit7CisgIE1WX1UzMiB1c2VyUGF0dGVyblszXTsKKyAgaW50IG9mZiA9IDA7CiAKKyAgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuR2V0KHVzZXJQYXR0ZXJuKTsKKworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIlBSQlMgVXNlciBQYXR0ZXJuIDB4JTR4JTh4JTh4XG4iLAorCQkgICAgIHVzZXJQYXR0ZXJuWzJdLCB1c2VyUGF0dGVyblsxXSwgdXNlclBhdHRlcm5bMF0pOworCisgIHJldHVybihvZmYpOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKQEAgLTEzOTAsMTAgKzE0MTcsMTEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCi0qKiAgb251RXBvblVpQ2ZnU2V0UGF0dGVybkJ1cnN0CisqKiAgb251RXBvblVpQ2ZnU2V0VXNlclBhdHRlcm5CdXJzdAogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICoqCi0qKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjb25maWcgc3RhcnQvc3RvcCBvbnUgdHJhbnNtaXNzaW9uIG9mIHBhdHRlcm4gYnVyc3QKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNvbmZpZyBzdGFydC9zdG9wIG9udSB0cmFuc21pc3Npb24gb2YgdXNlciBkZWZpbmVkCisqKiAgICAgICAgICAgICAgIHBhdHRlcm4gYnVyc3QKICoqCiAqKiAgUEFSQU1FVEVSUzogIGNoYXIqIGJ1ZgogKioKQEAgLTE0MDIsNyArMTQzMCwzMyBAQAogKiogIFJFVFVSTlM6ICAgICB2b2lkCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgb251RXBvblVpQ2ZnU2V0UGF0dGVybkJ1cnN0KE1WX1UzMiBlbmFibGUsIE1WX1UzMiBwYXR0ZXJuLCBNVl9VMzIgYnVyc3QsIE1WX1UzMiBkdXJhdGlvbiwgTVZfVTMyIHBlcmlvZCkKK3ZvaWQgb251RXBvblVpQ2ZnU2V0VXNlclBhdHRlcm5CdXJzdChNVl9VMzIgcGF0dGVybk1TQiwgTVZfVTMyIHBhdHRlcm4sIE1WX1UzMiBwYXR0ZXJuTFNCKQoreworICBNVl9VMzIgdXNlclBhdHRlcm5bM107CisKKyAgdXNlclBhdHRlcm5bMF0gPSBwYXR0ZXJuTFNCOworICB1c2VyUGF0dGVyblsxXSA9IHBhdHRlcm47CisgIHVzZXJQYXR0ZXJuWzJdID0gcGF0dGVybk1TQjsKKworICBtdk9udVBvbk1hY1ByYnNVc2VyRGVmaW5lZFBhdHRlcm5TZXQodXNlclBhdHRlcm4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uVWlDZmdTZXREZWZpbmVkUGF0dGVybkJ1cnN0CisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNvbmZpZyBzdGFydC9zdG9wIG9udSB0cmFuc21pc3Npb24gb2YgcHJlLWRlZmluZWQKKyoqICAgICAgICAgICAgICAgcGF0dGVybiBidXJzdAorKioKKyoqICBQQVJBTUVURVJTOiAgY2hhciogYnVmCisqKgorKiogIE9VVFBVVFM6ICAgICBjaGFyKiBidWYKKyoqCisqKiAgUkVUVVJOUzogICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvbnVFcG9uVWlDZmdTZXREZWZpbmVkUGF0dGVybkJ1cnN0KE1WX1UzMiBlbmFibGUsIE1WX1UzMiBwYXR0ZXJuLCBNVl9VMzIgYnVyc3QsIE1WX1UzMiBkdXJhdGlvbiwgTVZfVTMyIHBlcmlvZCkKIHsKICAgaWYgKGVuYWJsZSA9PSAwKQogICB7CkBAIC0xNDE3LDYgKzE0NzEsMTM5IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgorKiogIG9udUVwb25VaUNmZ0xvc1RpbWUKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgdGltZSBkdXJhdGlvbiB0byBiZSB1c2VkIAorKiogICAgICAgICAgICAgICB3aGVuIG5vIG9wdGljYWwgZGV0ZWN0ZWQgYW5kIG5vIEdBVEUgTVBDUERVIHJlY2VpdmVkCisqKgorKiogIFBBUkFNRVRFUlM6ICBvcHRpY2FsTG9zVGltZSAtIHRpbWUgZHVyYXRpb24gdG8gYmUgdXNlZCB3aGVuIG5vIG9wdGljYWwgZGV0ZWN0ZWQKKyoqICAgICAgICAgICAgICAgbWFjTG9zVGltZSAgICAgLSB0aW1lIGR1cmF0aW9uIHRvIGJlIHVzZWQgd2hlbiBubyBHQVRFIE1QQ1BEVSByZWNlaXZlZAorKiogIE9VVFBVVFM6ICAgICB2b2lkCisqKgorKiogIFJFVFVSTlM6ICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb251RXBvblVpQ2ZnTG9zVGltZShNVl9VMzIgb3B0aWNhbExvc1RpbWUsIE1WX1UzMiBtYWNMb3NUaW1lKQoreworICAgIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lU2V0KG9wdGljYWxMb3NUaW1lKTsKKyAgICBvbnVFcG9uRGJPbnVNYWNMb3NUaW1lU2V0KG1hY0xvc1RpbWUpOworCisgICAgLyogSWYgdGhlIGhvbGRvdmVyIHRpbWVyIGlzIG5vdCBhY3RpdmUsIHdlIGFkZCB0aGUgT3B0aWNhbExvc1RpbWVyIHRvIHRoZSBob2xkb3ZlciB0aW1lIGFuZCBzYXZlICovCisgICAgaWYgKG9udVBvblJlc291cmNlVGJsX3Mub251UG9uSG9sZG92ZXJUaW1lcklkLm9udVBvblRpbWVyQWN0aXZlID09IE9OVV9QT05fVElNRVJfTk9UX0FDVElWRSkKKyAgICB7CisgICAgICAgIC8qIEFkZCB0aGUgY29uZmlndXJlZCBPcHRMb3NUaW1lIHRvIGhvbGRvdmVyIHRpbWUgYW5kIHNhdmUgZm9yIG5leHQgaG9sZG92ZXIgKi8KKyAgICAgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udVBvbkhvbGRvdmVyVGltZXJJZCksIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBvbnVFcG9uRGJPbnVIb2xkb3ZlclRpbWVHZXQoKSArIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lR2V0KCksIDApOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvblVpQ2ZnVHhQb3dlckNvbnRyb2wKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29udHJvbHMgdGhlIFRYIHBvd2VyIG9uIGFuZCBvZmYKKyoqCisqKiAgUEFSQU1FVEVSUzogIGFjdGlvbiAtIHR1cm4gb24gYW5kIHR1cm4gb2ZmIHRoZSBUWCBwb3dlciwgb3IgdHVybiBvZmYgYWZ0ZXIgCisqKiAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRhaW4gdGltZSBkdXJhdGlvbi4KKyoqICAgICAgICAgICAgICAgdGltZSAgIC0gdGltZSBkdXJhdGlvbiB0byBiZSBleHBpcmVkIGJlZm9yZSB0dXJuaW5nIG9mZiBUWAorKioKKyoqICBPVVRQVVRTOiAgICAgTm9uZQorKioKKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG9udUVwb25VaUNmZ1R4UG93ZXJDb250cm9sKE1WX1UzMiBhY3Rpb24sIE1WX1UzMiB0aW1lKQoreworICAgIGlmIChhY3Rpb24gPT0gRV9FUE9OX0lPQ1RMX0VOQUJMRV9UWCkKKyAgICB7CisgICAgICAgIG9udVBvblRpbWVyRGlzYWJsZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblR4Q29udHJvbFRpbWVySWQpKTsKKyAgICAgICAgb251UG9uVHhQb3dlck9uKE1WX1RSVUUpOworICAgIH0KKyAgICBlbHNlIGlmIChhY3Rpb24gPT0gRV9FUE9OX0lPQ1RMX0RJU0FCTEVfVFgpCisgICAgeworICAgICAgICBvbnVQb25UaW1lckRpc2FibGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25UeENvbnRyb2xUaW1lcklkKSk7CisgICAgICAgIG9udVBvblR4UG93ZXJPbihNVl9GQUxTRSk7CisgICAgfQorICAgIGVsc2UgaWYgKGFjdGlvbiA9PSBFX0VQT05fSU9DVExfRElTQUJMRV9UWF9ERUxBWSkKKyAgICB7ICAgICAgICAKKyAgICAgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25UeENvbnRyb2xUaW1lcklkKSwgMCwgdGltZSwgMSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uVWlDZmdQb3dlclNhdmluZworKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciBwb3dlciBzYXZpbmcgbW9kZQorKioKKyoqICBQQVJBTUVURVJTOiAgZWFybHlXYWtldXAgLSBzZXQgdGhlIGFiaWxpdHkgb2Ygc3VwcG9ydGluZyBlYXJseSB3YWtlIHVwCisqKiAgICAgICAgICAgICAgIG1heFNsZWVwRHVyYXRpb24gLSB0aW1lIHBlcmlvZCBmb3Iga2VlcGluZyBwb3dlciBzYXZpbmcgbW9kZQorKioKKyoqICBPVVRQVVRTOiAgICAgTm9uZQorKioKKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG9udUVwb25VaUNmZ1Bvd2VyU2F2aW5nKE1WX1UzMiBlYXJseVdha2V1cCwgTVZfVTMyIG1heFNsZWVwRHVyYXRpb24pCit7ICAgIAorICAgIGlmICgob251RXBvbkRiT251U2xlZXBEdXJhdGlvbkdldCgpICsgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25HZXQoKSkgPj0gbWF4U2xlZXBEdXJhdGlvbikKKyAgICB7CisgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQVBJX01PRFVMRSwKKyAgICAgICAgCSAgICAgICAiRVJST1I6IFdyb25nIHBhcmFtZXRlcnMsIHNsZWVwKCVkKSArIHdha2V1cCglZCkgPj0gbWF4U2xlZXBEdXJhdGlvbiglZClcclxuIiwgCisgICAgICAgIAkgICAgICAgb251RXBvbkRiT251U2xlZXBEdXJhdGlvbkdldCgpLCBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvbkdldCgpLCAKKyAgICAgICAgCSAgICAgICBtYXhTbGVlcER1cmF0aW9uKTsKKworICAgICAgICByZXR1cm4gTVZfQkFEX1BBUkFNOworICAgIH0KKworICAgIG9udUVwb25EYk9udVBvd2VyU2F2aW5nV2FrZXVwU2V0KGVhcmx5V2FrZXVwKTsKKyAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25TZXQobWF4U2xlZXBEdXJhdGlvbik7CisKKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkLm9udVBvblRpbWVyQWN0aXZlID09IE9OVV9QT05fVElNRVJfQUNUSVZFKQorICAgIHsKKyAgICAgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25NYXhTbGVlcFRpbWVySWQpLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2xlZXBEdXJhdGlvbiwgMSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uVWlDZmdDb250cm9sU2xlZXAKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gdHJpZ2dlcnMgdGhlIGFjdGlvbiBvZiBwb3dlciBtb2RlIHRyYW5zZm9ybWF0aW9uCisqKgorKiogIFBBUkFNRVRFUlM6ICBhY3Rpb24gICAgICAgICAtIGVuYWJsZSwgZGlzYWJsZSBvciBjb25maWd1cmUKKyoqICAgICAgICAgICAgICAgc2xlZXBNb2RlICAgICAgLSB0dXJuIG9mZiB0eCBvciB0eC9yeAorKiogICAgICAgICAgICAgICBzbGVlcER1cmF0aW9uICAtIHBlcmlvZGljYWwgdGltZSBkdXJhdGlvbiBmb3Igc2xlZXAKKyoqICAgICAgICAgICAgICAgd2FrZXVwRHVyYXRpb24gLSBwZXJpb2RpY2FsIHRpbWUgZHVyYXRpb24gZm9yIHdha2V1cAorKioKKyoqICBPVVRQVVRTOiAgICAgTm9uZQorKioKKyoqICBSRVRVUk5TOiAgICAgTm9uZQorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG9udUVwb25VaUNmZ0NvbnRyb2xTbGVlcChNVl9VMzIgYWN0aW9uLCBNVl9VMzIgc2xlZXBNb2RlLCBNVl9VMzIgc2xlZXBEdXJhdGlvbiwgTVZfVTMyIHdha2V1cER1cmF0aW9uKQoreworICAgIGlmIChhY3Rpb24gPT0gRV9HUE9OX1NMRUVQX0FDVElPTl9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgbXZFcG9uQXBpU2xlZXBDdHJsRGlzYWJsZSgpOworICAgIH0KKyAgICBlbHNlIGlmIChhY3Rpb24gPT0gRV9HUE9OX1NMRUVQX0FDVElPTl9FTkFCTEUpCisgICAgeworICAgICAgICBtdkVwb25BcGlTbGVlcEN0cmxFbmFibGUoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYWN0aW9uID09IEVfR1BPTl9TTEVFUF9BQ1RJT05fQ09ORklHKQorICAgIHsKKyAgICAgICAgbXZFcG9uQXBpU2xlZXBDdHJsQ2ZnKHNsZWVwTW9kZSwgc2xlZXBEdXJhdGlvbiwgd2FrZXVwRHVyYXRpb24pOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCiAqKiAgb251RXBvblVpQ2ZnU2V0UGNzRnJhbWVMaW1pdHMKICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAqKgpAQCAtMTU3Myw5ICsxNzYwLDkgQEAKIAkJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICJGYWlsZWQgdG8gb2J0YWluIDJLIHBhY2tldCBzdXBwb3J0IHJlbGF0ZWQgcmVnaXN0ZXIgdmFsdWUhXHJcbiIpOwogCWVsc2UgewogCQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIlxyXG4iKTsKLQkJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICJQY3NGcmFtZVNpemVMaW1pdFNpemUgICAgPSAlI2RcclxuIiwgZnJhbWVTaXplTGltaXRTaXplKTsKLSAgICAgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICJQY3NGcmFtZVNpemVMaW1pdExhdGVuY3kgPSAlI2RcclxuIiwgZnJhbWVTaXplTGltaXRMYXRlbmN5KTsKLSAgICAgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICJEYXRhRmlmb1RocmVzaG9sZCAgICAgICAgPSAlI2RcclxuIiwgZGF0YUZpZm9UaHJlc2hvbGQpOworCQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIlBjc0ZyYW1lU2l6ZUxpbWl0U2l6ZSAgICA9ICVkXHJcbiIsIGZyYW1lU2l6ZUxpbWl0U2l6ZSk7CisgICAgICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiUGNzRnJhbWVTaXplTGltaXRMYXRlbmN5ID0gJWRcclxuIiwgZnJhbWVTaXplTGltaXRMYXRlbmN5KTsKKyAgICAgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICJEYXRhRmlmb1RocmVzaG9sZCAgICAgICAgPSAlZFxyXG4iLCBkYXRhRmlmb1RocmVzaG9sZCk7CiAJfQogCiAJcmV0dXJuKG9mZik7CkBAIC0xODQ4LDYgKzIwMzUsOCBAQAogCQlyZXR1cm4ob251RXBvblVpQ2ZnRGJhQ2ZnUHJpbnQoYnVmKSk7CiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGJhU3RhdGljQ2ZnUHJpbnQiKSkKIAkJcmV0dXJuKG9udUVwb25VaUNmZ0RiYVN0YXRpY0NmZ1ByaW50KGJ1ZikpOworICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInByYnNVc2VyUGF0dGVybiIpKQorICAgICAgICByZXR1cm4gKG9udUVwb25VaUNmZ1ByYnNVc2VyUGF0dGVybihidWYpKTsKIAllbHNlIGlmICghc3RyY21wKG5hbWUsICJoZWxwQ2ZnIikpCiAJCXJldHVybihvbnVFcG9uVWlDZmdIZWxwU2hvdyhidWYpKTsKIAllbHNlIGlmIChkZXZJZCA9PSBNVl82NjAxX0RFVl9JRCkgewpAQCAtMTkyMCw4ICsyMTA5LDIyIEBACiAJCW9udUVwb25VaUNmZ0RnQ2ZnKChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMik7CiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicHJpbnRNYXNrIikpCQkJCQkvKiBtb2R1bGUsIHByaW50IGxldmVsLCBvcHRpb25zICovCiAJCXBvbk9udUNoYW5nZVByaW50U3RhdHVzKChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMiwgKE1WX1UzMilwYXJhbTMpOwotCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInBhdHRlcm4iKSkKLQkJb251RXBvblVpQ2ZnU2V0UGF0dGVybkJ1cnN0KChNVl9VMzIpcGFyYW0xLChNVl9VMzIpcGFyYW0yLChNVl9VMzIpcGFyYW0zLChNVl9VMzIpcGFyYW00LChNVl9VMzIpcGFyYW01KTsKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ0eFBvd2VyQ29udHJvbCIpKQorICAgIHsKKyAgICAgICAgb251RXBvblVpQ2ZnVHhQb3dlckNvbnRyb2woKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicG93ZXJTYXZpbmciKSkKKyAgICB7CisgICAgICAgIG9udUVwb25VaUNmZ1Bvd2VyU2F2aW5nKChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMik7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInNsZWVwQ29udHJvbCIpKQorICAgIHsKKyAgICAgICAgb251RXBvblVpQ2ZnQ29udHJvbFNsZWVwKChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMiwgKE1WX1UzMilwYXJhbTMsIChNVl9VMzIpcGFyYW00KTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicHJic1VzZXJEZWZpbmVkUGF0dGVybiIpKQorICAgICAgICBvbnVFcG9uVWlDZmdTZXRVc2VyUGF0dGVybkJ1cnN0KChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMiwgKE1WX1UzMilwYXJhbTMpOyAvKiA4MGJpdCB1c2VyIGRhdGE6IDE2Yml0IHBhdHRlcm5NTFNCICsgMzJiaXQgcGF0dGVybiArIDMyYml0IHBhdHRlcm5MU0JcbiIgKi8KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJwcmJzUHJlRGVmaW5lZFBhdHRlcm4iKSkKKyAgICAgICAgb251RXBvblVpQ2ZnU2V0RGVmaW5lZFBhdHRlcm5CdXJzdCgoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIsIChNVl9VMzIpcGFyYW0zICwgKE1WX1UzMilwYXJhbTQgLCAoTVZfVTMyKXBhcmFtNSk7ICAvKiBwYXR0ZXJuIHR5cGUsIGJ1cnN0IHR5cGUsIGR1cmF0aW9uLCBwZXJpb2QgKi8KIAllbHNlIGlmIChkZXZJZCA9PSBNVl82NjAxX0RFVl9JRCkgewogCQlpZiAoIXN0cmNtcChuYW1lLCAicGNzRnJhbWVMaW1pdHMiKSkKIAkJCW9udUVwb25VaUNmZ1NldFBjc0ZyYW1lTGltaXRzKChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMik7CkBAIC0xOTY0LDEyICsyMTY3LDE3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoc2lsZW5jZVNpbSwgICAgICAgICAgICAgIFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKGRnRGVidWcsICAgICAgICAgICAgICAgICBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihkZ0NmZywgICAgICAgICAgICAgICAgICAgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGF0dGVybiwgICAgICAgICAgICAgICAgIFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHByYnNVc2VyUGF0dGVybiwgICAgICAgICBTX0lSVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwcmJzVXNlckRlZmluZWRQYXR0ZXJuLCAgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJic1ByZURlZmluZWRQYXR0ZXJuLCAgIFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKHByaW50TWFzaywgICAgICAgICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIocGNzRnJhbWVMaW1pdHMsICAgICAgICAgIFNfSVdVU1IgfCBTX0lSVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihyeERhdGFGaWZvVGhyZXNoLCAgICAgICAgU19JV1VTUiB8IFNfSVJVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKGRkbVR4UG9sYXJpdHksICAgICAgICAgICBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihwa3Qya0VuLCAgICAgICAgICAgICAgICAgU19JV1VTUiB8IFNfSVJVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHR4UG93ZXJDb250cm9sLCAgICAgICAgICBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwb3dlclNhdmluZywgICAgICAgICAgICAgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2xlZXBDb250cm9sLCAgICAgICAgICAgIFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKGhlbHBDZmcsICAgICAgICAgICAgICAgICBTX0lSVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKICAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjZmdfYXR0cnNbXSA9IHsKQEAgLTE5OTAsMTIgKzIxOTgsMTcgQEAKIAkmZGV2X2F0dHJfc2lsZW5jZVNpbS5hdHRyLAogCSZkZXZfYXR0cl9kZ0RlYnVnLmF0dHIsCiAJJmRldl9hdHRyX2RnQ2ZnLmF0dHIsCi0JJmRldl9hdHRyX3BhdHRlcm4uYXR0ciwKKwkmZGV2X2F0dHJfcHJic1VzZXJQYXR0ZXJuLmF0dHIsCisJJmRldl9hdHRyX3ByYnNVc2VyRGVmaW5lZFBhdHRlcm4uYXR0ciwKKwkmZGV2X2F0dHJfcHJic1ByZURlZmluZWRQYXR0ZXJuLmF0dHIsCiAJJmRldl9hdHRyX3ByaW50TWFzay5hdHRyLAogCSZkZXZfYXR0cl9wY3NGcmFtZUxpbWl0cy5hdHRyLAogCSZkZXZfYXR0cl9yeERhdGFGaWZvVGhyZXNoLmF0dHIsIAogCSZkZXZfYXR0cl9kZG1UeFBvbGFyaXR5LmF0dHIsCiAJJmRldl9hdHRyX3BrdDJrRW4uYXR0ciwgCisJJmRldl9hdHRyX3R4UG93ZXJDb250cm9sLmF0dHIsIAorCSZkZXZfYXR0cl9wb3dlclNhdmluZy5hdHRyLCAKKwkmZGV2X2F0dHJfc2xlZXBDb250cm9sLmF0dHIsIAogCSZkZXZfYXR0cl9oZWxwQ2ZnLmF0dHIsCiAJTlVMTAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NVSS5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc1VJLmgKaW5kZXggZjhjOWNkZS4uYTZlOTJmMSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc1VJLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc1VJLmgKQEAgLTk2LDYgKzk2LDEyIEBACiBNVl9TVEFUVVMgb251RXBvblVzckludGVyZmFjZUNyZWF0ZSh2b2lkKTsNCiBNVl9TVEFUVVMgb251RXBvblVzckludGVyZmFjZVJlbGVhc2Uodm9pZCk7DQogDQordm9pZCBvbnVFcG9uVWlDZmdMb3NUaW1lKE1WX1UzMiBvcHRpY2FsTG9zVGltZSwgTVZfVTMyIG1hY0xvc1RpbWUpOw0KK3ZvaWQgb251RXBvblVpQ2ZnVHhQb3dlckNvbnRyb2woTVZfVTMyIGFjdGlvbiwgTVZfVTMyIHRpbWUpOw0KK3ZvaWQgb251RXBvblVpQ2ZnUG93ZXJTYXZpbmcoTVZfVTMyIGVhcmx5V2FrZXVwLCBNVl9VMzIgbWF4U2xlZXBEdXJhdGlvbik7DQordm9pZCBvbnVFcG9uVWlDZmdDb250cm9sU2xlZXAoTVZfVTMyIGFjdGlvbiwgTVZfVTMyIHNsZWVwTW9kZSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfVTMyIHNsZWVwRHVyYXRpb24sIE1WX1UzMiB3YWtldXBEdXJhdGlvbik7DQorDQogLyogTWFjcm9zDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgDQogDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9ncG9uL2dwb25PbnVMbnhLc1VJLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2dwb24vZ3Bvbk9udUxueEtzVUkuYwppbmRleCBkM2JmNWVmLi5jZjQ1MDc1IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2dwb24vZ3Bvbk9udUxueEtzVUkuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2dwb24vZ3Bvbk9udUxueEtzVUkuYwpAQCAtMjk0NiwxMCArMjk0NiwxMSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKiAgb251R3BvblVpQ2ZnU2V0UGF0dGVybkJ1cnN0CisqKioqICBvbnVHcG9uVWlDZmdTZXRVc2VyUGF0dGVybkJ1cnN0CiAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwogKioKLSoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNvbmZpZyBzdGFydCBvbnUgdHJhbnNtaXNzaW9uIG9mIHBhdHRlcm4gYnVyc3QKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNvbmZpZyBzdGFydCBvbnUgdHJhbnNtaXNzaW9uIG9mIHVzZXItZGVmaW5lZAorKiogICAgICAgICAgICAgICBwYXR0ZXJuIGJ1cnN0CiAqKgogKiogIFBBUkFNRVRFUlM6ICBjaGFyKiBidWYKICoqCkBAIC0yOTU4LDExICsyOTU5LDM0IEBACiAqKiAgUkVUVVJOUzogICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBvbnVHcG9uVWlDZmdTZXRQYXR0ZXJuQnVyc3QoTVZfVTMyIGVuYWJsZSxNVl9VMzIgcGF0dGVybiwgTVZfVTMyIGJ1cnN0LCBNVl9VMzIgZHVyYXRpb24sIE1WX1UzMiBwZXJpb2QpCit2b2lkIG9udUdwb25VaUNmZ1NldFVzZXJQYXR0ZXJuQnVyc3QoTVZfVTMyIHBhdHRlcm5NU0IsIE1WX1UzMiBwYXR0ZXJuLCBNVl9VMzIgcGF0dGVybkxTQikKK3sKKyAgTVZfVTMyIHVzZXJQYXR0ZXJuWzNdOworCisgIHVzZXJQYXR0ZXJuWzBdID0gcGF0dGVybkxTQjsKKyAgdXNlclBhdHRlcm5bMV0gPSBwYXR0ZXJuOworICB1c2VyUGF0dGVyblsyXSA9IHBhdHRlcm5NU0I7CisKKyAgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuU2V0KHVzZXJQYXR0ZXJuKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqICBvbnVHcG9uVWlDZmdTZXREZWZpbmVkUGF0dGVybkJ1cnN0CisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNvbmZpZyBzdGFydCBvbnUgdHJhbnNtaXNzaW9uIG9mIHByZS1kZWZpbmVkCisqKiAgICAgICAgICAgICAgIHBhdHRlcm4gYnVyc3QKKyoqCisqKiAgUEFSQU1FVEVSUzogIGNoYXIqIGJ1ZgorKioKKyoqICBPVVRQVVRTOiAgICAgY2hhciogYnVmCisqKgorKiogIFJFVFVSTlM6ICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb251R3BvblVpQ2ZnU2V0RGVmaW5lZFBhdHRlcm5CdXJzdChNVl9VMzIgZW5hYmxlLCBNVl9VMzIgcGF0dGVybiwgTVZfVTMyIGJ1cnN0LCBNVl9VMzIgZHVyYXRpb24sIE1WX1UzMiBwZXJpb2QpCiB7CiAKLSAgICBpZiAoZW5hYmxlID09IDApCi0gICAgeworICAgIGlmIChlbmFibGUgPT0gMCkgewogICAgICAgb251UG9uUGF0dGVybkJ1cnN0T2ZmKCk7CiAgICAgfQogICAgIGVsc2UKQEAgLTMxOTAsNiArMzIxNCwzMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKKyoqICBvbnVHcG9uVWlDZmdQcmJzVXNlclBhdHRlcm4KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcHJpbnQgUFJCUyB1c2VyIGRlZmluZWQgcGF0dGVybgorKioKKyoqICBQQVJBTUVURVJTOiAgY2hhciogYnVmCisqKgorKiogIE9VVFBVVFM6ICAgICBjaGFyKiBidWYKKyoqCisqKiAgUkVUVVJOUzogICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG9udUdwb25VaUNmZ1ByYnNVc2VyUGF0dGVybihjaGFyKiBidWYpCit7CisgIE1WX1UzMiB1c2VyUGF0dGVyblszXTsKKyAgaW50IG9mZiA9IDA7CisKKyAgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuR2V0KHVzZXJQYXR0ZXJuKTsKKworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIlBSQlMgVXNlciBQYXR0ZXJuIDB4JTR4JTh4JTh4XG4iLAorCQkgICAgIHVzZXJQYXR0ZXJuWzJdLCB1c2VyUGF0dGVyblsxXSwgdXNlclBhdHRlcm5bMF0pOworCisgIHJldHVybihvZmYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKICoqICBvbnVHcG9uVWlTeW5jTG9nRW5hYmxlCiAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwogKioKQEAgLTMyNjcsMTcgKzMzMTgsMTUgQEAKIAlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFttb2R1bGVdIFtMZXZlbF0gW09wdGlvbnNdID4gcHJpbnRNYXNrICAgICAgIC0gY2hhbmdlIHByaW50aW5nIG9wdGlvbnNcbiIpOwogCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW3N0YXRlXSAgICAgICAgICAgICAgICAgICAgPiBhZG1pbkNmZyAgICAgICAgLSAiCiAJCQkJCQkiY2hhbmdlIFBPTiBCRSAoVFggRU4pIHN0YXRlIDA9RW5hYmxlLCAxPURpc2FibGVcbiIpOwotCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW2VuYWJsZV1bcGF0dGVybl1bYnVyc3RdW2R1cmF0aW9uXVtwZXJpb2RdID4gcGF0dGVyblxuIik7Ci0Jb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICIKLQkJCQkJCSJzdGFydCBlbmFibGVbMV0gb3Igc3RvcCBbMF0gdHJhbnNtaXNzaW9uIG9mXG4iKTsKLQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotCQkJCQkJInBhdHRlcm46IDB4MS0xVCwgMHgyLTJULCAweDgwLVJQQlMtOSwgMHg4Mi1SUEJTLTE1LCAweDgzLVJQQlMtMjNcbiIpOwotCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0JCQkJCQkiYnVyc3Q6IDAtc3RhdGljLCAxLXBlcmlvZGljXG4iKTsKLQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotCQkJCQkJImR1cmF0aW9uOiBwZWFrIHRpbWUgaW50ZXJ2YWxbbWljcm8gc2Vjb25kc11cbiIpOwotCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0JCQkJCQkicGVyaW9kIC0gZnVsbCBjaWNsZSB0aW1lIGludGVydmFsW21pY3JvIHNlY29uZHNdXG4iKTsKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbcGF0dGVybk1TQl1bcGF0dGVybl1bcGF0dGVybkxTQl1cbiIpOworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gcHJic1VzZXJEZWZpbmVkUGF0dGVybiAtIC8qIDgwYml0IHVzZXIgZGF0YTogMTZiaXQgcGF0dGVybk1MU0IgKyAzMmJpdCBwYXR0ZXJuICsgMzJiaXQgcGF0dGVybkxTQlxuIik7CisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW2VuYWJsZV1bcGF0dGVybl1bYnVyc3RdW2R1cmF0aW9uXVtwZXJpb2RdXG4iKTsKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IHByYnNQcmVEZWZpbmVkUGF0dGVyblxuIik7CisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzdGFydCBlbmFibGVbMV0gb3Igc3RvcCBbMF0gdHJhbnNtaXNzaW9uIG9mXG4iKTsKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm46IDB4MS0xVCwgMHgyLTJULCAweDUtVXNlciwgMHg4MC1QUkJTLTcsIDB4ODEtUFJCUy05LCAweDgyLVBSQlMtMTVcbiIpOworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVyc3Q6IDAtc3RhdGljLCAxLXBlcmlvZGljXG4iKTsKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBwZWFrIHRpbWUgaW50ZXJ2YWxbbWljcm8gc2Vjb25kc11cbiIpOworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kIC0gZnVsbCBjeWNsZSB0aW1lIGludGVydmFsW21pY3JvIHNlY29uZHNdXG4iKTsKIAlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtUMDEgSW50ZXJ2YWxdICAgICAgICAgICAgID4gdDAxSW50ZXJ2YWxDZmcgIC0gIgogCQkJCQkJImNvbmZpZyBUMDEgdGltZXIgaW50ZXJ2YWwgaW4gbVNcbiIpOwogCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW1QwMiBJbnRlcnZhbF0gICAgICAgICAgICAgPiB0MDJJbnRlcnZhbENmZyAgLSAiCkBAIC0zMjk2LDcgKzMzNDUsNyBAQAogaW50IG9udUdwb25VaVN5bmNMb2dFbmFibGVTaG93KCkKIHsKICAgICBwcmludGsoIlRoZSBTeW5jIExvZyBpcyAiKTsKLSAgICAKKwogICAgIGlmIChvbnVHcG9uTG9nRW5hYmxlID09IE1WX1RSVUUpCiAgICAgewogICAgICAgICBwcmludGsoImVuYWJsZWRcclxuIik7CkBAIC0zMzA1LDcgKzMzNTQsNyBAQAogICAgIHsKICAgICAgICAgcHJpbnRrKCJkaXNhYmxlZFxyXG4iKTsKICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzM0Miw2ICszMzkxLDggQEAKIAogCWlmICghc3RyY21wKG5hbWUsICJwcmludE1hc2siKSkKIAkJcmV0dXJuIHBvbk9udVByaW50U3RhdHVzKGJ1Zik7CisgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInByYnNVc2VyUGF0dGVybiIpKQorICAJcmV0dXJuIG9udUdwb25VaUNmZ1ByYnNVc2VyUGF0dGVybihidWYpOwogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhlbHBNaXNjIikpCiAJCXJldHVybiBvbnVHcG9uVWlNaXNjSGVscFNob3coYnVmKTsKIAllbHNlIGlmICghc3RyY21wKG5hbWUsICJzeW5jTG9nRW5hYmxlIikpCS8qIHN5bmMgbG9nIGVuYWJsZSBvciBkaXNhYmxlICovCkBAIC0zMzk5LDkgKzM0NTAsMTAgQEAKICNlbmRpZiAvKiBNVl9HUE9OX1BFUkZPUk1BTkNFX0NIRUNLICovCiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicHJpbnRNYXNrIikpCQkvKiBtb2R1bGUsIHByaW50IGxldmVsLCBvcHRpb25zICovCiAJCXBvbk9udUNoYW5nZVByaW50U3RhdHVzKChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMiwgKE1WX1UzMilwYXJhbTMpOwotCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInBhdHRlcm4iKSkJCS8qIHBhdHRlcm4gdHlwZSwgYnVyc3QgdHlwZSwgZHVyYXRpb24sIHBlcmlvZCAqLwotCQlvbnVHcG9uVWlDZmdTZXRQYXR0ZXJuQnVyc3QoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yLCAoTVZfVTMyKXBhcmFtMyAsCi0JCQkJCSAgICAoTVZfVTMyKXBhcmFtNCAsIChNVl9VMzIpcGFyYW01KTsKKyAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicHJic1VzZXJEZWZpbmVkUGF0dGVybiIpKQorICAgIG9udUdwb25VaUNmZ1NldFVzZXJQYXR0ZXJuQnVyc3QoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yLCAoTVZfVTMyKXBhcmFtMyk7IC8qIDgwYml0IHVzZXIgZGF0YTogMTZiaXQgcGF0dGVybk1MU0IgKyAzMmJpdCBwYXR0ZXJuICsgMzJiaXQgcGF0dGVybkxTQlxuIiAqLworICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJwcmJzUHJlRGVmaW5lZFBhdHRlcm4iKSkKKyAgICBvbnVHcG9uVWlDZmdTZXREZWZpbmVkUGF0dGVybkJ1cnN0KChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMiwgKE1WX1UzMilwYXJhbTMgLCAoTVZfVTMyKXBhcmFtNCAsIChNVl9VMzIpcGFyYW01KTsgIC8qIHBhdHRlcm4gdHlwZSwgYnVyc3QgdHlwZSwgZHVyYXRpb24sIHBlcmlvZCAqLwogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImFkbWluQ2ZnIikpCQkvKiBhZG1pbiAwPWVuYWJsZSAxID0gZGlzYWJsZSAqLwogCQlvbnVHcG9uVWlEZWJ1Z0FkbWluTW9kZSgoTVZfVTMyKXBhcmFtMSk7CiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidDAxSW50ZXJ2YWxDZmciKSkJLyogVDAxIGludGVydmFsIGluIG1TICovCkBAIC0zNDM1LDEwICszNDg3LDEyIEBACiBzdGF0aWMgREVWSUNFX0FUVFIocG1DaGVjaywgICAgICAgICAgICAgICBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKHBtQ2xlYXIsICAgICAgICAgICAgICAgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKICNlbmRpZiAvKiBNVl9HUE9OX1BFUkZPUk1BTkNFX0NIRUNLICovCi1zdGF0aWMgREVWSUNFX0FUVFIocHJpbnRNYXNrLCAgICAgICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwYXR0ZXJuLCAgICAgICAgICAgICAgIFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJic1VzZXJEZWZpbmVkUGF0dGVybixTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHByYnNQcmVEZWZpbmVkUGF0dGVybiwgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihhZG1pbkNmZywgICAgICAgICAgICAgIFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJpbnRNYXNrLCAgICAgICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihoZWxwTWlzYywgICAgICAgICAgICAgIFNfSVJVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJic1VzZXJQYXR0ZXJuLCAgICAgICBTX0lSVVNSIHwgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0MDFJbnRlcnZhbENmZywgICAgICAgIFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodDAySW50ZXJ2YWxDZmcsICAgICAgICBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKHN5bmNMb2dFbmFibGUsICAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CkBAIC0zNDU5LDEwICszNTEzLDEyIEBACiAJJmRldl9hdHRyX3BtQ2hlY2suYXR0ciwKIAkmZGV2X2F0dHJfcG1DbGVhci5hdHRyLAogI2VuZGlmIC8qIE1WX0dQT05fUEVSRk9STUFOQ0VfQ0hFQ0sgKi8KKwkmZGV2X2F0dHJfcHJic1VzZXJEZWZpbmVkUGF0dGVybi5hdHRyLAorCSZkZXZfYXR0cl9wcmJzUHJlRGVmaW5lZFBhdHRlcm4uYXR0ciwKKwkmZGV2X2F0dHJfYWRtaW5DZmcuYXR0ciwKIAkmZGV2X2F0dHJfcHJpbnRNYXNrLmF0dHIsCiAJJmRldl9hdHRyX2hlbHBNaXNjLmF0dHIsCi0JJmRldl9hdHRyX3BhdHRlcm4uYXR0ciwKLQkmZGV2X2F0dHJfYWRtaW5DZmcuYXR0ciwKKwkmZGV2X2F0dHJfcHJic1VzZXJQYXR0ZXJuLmF0dHIsCiAJJmRldl9hdHRyX3QwMUludGVydmFsQ2ZnLmF0dHIsCiAJJmRldl9hdHRyX3QwMkludGVydmFsQ2ZnLmF0dHIsCiAJJmRldl9hdHRyX3N5bmNMb2dFbmFibGUuYXR0ciwKQEAgLTM1MDUsOCArMzU2MSw4IEBACiAJZWxzZSBpZiAoZGV2SWQgPT0gTVZfNjYwMV9ERVZfSUQpIHsKIAkJaWYgKCFzdHJjbXAobmFtZSwgImFjQ291cGxpbmciKSkKIAkJCXJldHVybiBvbnVHcG9uVWlEZWJ1Z01hbmFnZXJBY0NvdXBsaW5nR2V0KGJ1Zik7Ci0JCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImFjdGl2ZVR4Qm0iKSkKLQkJCXJldHVybiBvbnVHcG9uVWlEZWJ1Z01hbmFnZXJBY3RpdmVUeEJpdG1hcEdldChidWYpOworCSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYWN0aXZlVHhCbSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9udUdwb25VaURlYnVnTWFuYWdlckFjdGl2ZVR4Qml0bWFwR2V0KGJ1Zik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzU2NCw3ICszNjIwLDcgQEAKIAllbHNlIGlmICghc3RyY21wKG5hbWUsICJmaWZvU3VwcG9ydCIpKQkJLyogZW5hYmxlL2Rpc2FibGUgKi8KIAkJb251R3BvblVpRGVidWdNYW5hZ2VyRmlmb1N1cHBvcnRTZXQoKE1WX1UzMilwYXJhbTEpOwogCWVsc2UgaWYgKGRldklkID09IE1WXzY2MDFfREVWX0lEKSB7Ci0JCWlmICghc3RyY21wKG5hbWUsICJhY0NvdXBsaW5nIikpCQorCQlpZiAoIXN0cmNtcChuYW1lLCAiYWNDb3VwbGluZyIpKQogICAgICAgICAgICAgLyogbW9kZSwgdGltZSwgcGF0dGVybjEsIHBhdHRlcm4yICovCiAJCQlvbnVHcG9uVWlEZWJ1Z01hbmFnZXJBY0NvdXBsaW5nU2V0KChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMiwgKE1WX1UzMilwYXJhbTMsIChNVl9VMzIpcGFyYW00KTsKIAkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYWN0aXZlVHhCbSIpKQkJCQkvKiBiaXRtYXAsIHZhbGlkICovCkBAIC0zNjE5LDcgKzM2NzUsNyBAQAogCSZkZXZfYXR0cl9wbG9hbUJ1cnN0Q2ZnLmF0dHIsCiAJJmRldl9hdHRyX2NsZWFyRmlmb0NudHMuYXR0ciwKIAkmZGV2X2F0dHJfZmlmb1N1cHBvcnQuYXR0ciwKLQkmZGV2X2F0dHJfYWNDb3VwbGluZy5hdHRyLCAKKwkmZGV2X2F0dHJfYWNDb3VwbGluZy5hdHRyLAogCSZkZXZfYXR0cl9hY3RpdmVUeEJtLmF0dHIsCiAJJmRldl9hdHRyX2hlbHBQcm90by5hdHRyLAogCU5VTEwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251Qm9hcmQuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251Qm9hcmQuYwppbmRleCA3ZDVjZDk3Li5jZmI2YjYzIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L2Vwb24vZXBvbk9udUJvYXJkLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVCb2FyZC5jCkBAIC03Nyw2ICs3Nyw3IEBACiAvKiBJbmNsdWRlIEZpbGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2luY2x1ZGUgInBvbk9udUhlYWRlci5oIgorI2luY2x1ZGUgImVwb25PbnVEYi5oIgogCiAvKiBMb2NhbCBDb25zdGFudAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtOTIsNiArOTMsNyBAQAogCiAvKiBFeHBvcnQgRnVuY3Rpb25zCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIE1WX1NUQVRVUyBtdkVwb25BcGlTbGVlcE1vZGVDdHJsKE1WX1UzMiBlbmFibGUpOwogCiAvKiBMb2NhbCBGdW5jdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC01MzgsNCArNTQwLDEyNiBAQAogICByZXR1cm4oTVZfT0spOwogfQogI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25UeENvbnRyb2xUaW1lckhuZGwKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gaXMgdGhlIHRpbWVyIGNhbGxiYWNrIHdoZW4gdGltZXIgZm9yIAorKiogICAgICAgICAgICAgICBzaHV0dGluZyB0aGUgVHggaXMgZXhwaXJlZAorKioKKyoqICBQQVJBTUVURVJTOiAgdm9pZAorKioKKyoqICBPVVRQVVRTOiAgICAgdm9pZAorKioKKyoqICBSRVRVUk5TOiAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG9udUVwb25UeENvbnRyb2xUaW1lckhuZGwodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgCisgICAgb251UG9uVGltZXJEaXNhYmxlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uVHhDb250cm9sVGltZXJJZCkpOworCisgICAgLyogVHVybiBvZmYgdGhlIHR4IHBvd2VyICovCisgICAgb251UG9uVHhQb3dlck9uKE1WX0ZBTFNFKTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvbk1heFNsZWVwVGltZXJIbmRsCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGlzIHRoZSB0aW1lciBjYWxsYmFjayB3aGVuIHRpbWVyIGZvciAKKyoqICAgICAgICAgICAgICAga2VlcGluZyBwb3dlciBzYXZpbmcgbW9kZSBpcyBleHBpcmVkCisqKgorKiogIFBBUkFNRVRFUlM6ICB2b2lkCisqKgorKiogIE9VVFBVVFM6ICAgICB2b2lkCisqKgorKiogIFJFVFVSTlM6ICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb251RXBvbk1heFNsZWVwVGltZXJIbmRsKHZvaWQpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworICAgIAorICAgIG9udVBvblRpbWVyRGlzYWJsZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvbk1heFNsZWVwVGltZXJJZCkpOworCisgICAgaWYgKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkLm9udVBvblRpbWVyQWN0aXZlID09IE9OVV9QT05fVElNRVJfQUNUSVZFKQorICAgIHsKKyAgICAgICAgb251UG9uVGltZXJEaXNhYmxlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQpKTsKKyAgICB9CisKKyAgICAvKiBMZWF2ZSBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzU2V0KEVfRVBPTl9OT1RfUE9XRVJfU0FWSU5HX1NUQVRVUyk7CisKKyAgICAvKiBFbmFibGUgVFgvUlggKi8KKyAgICBtdkVwb25BcGlTbGVlcE1vZGVDdHJsKE1WX0ZBTFNFKTsKKworICAgIC8qIFNlbmQgU2xlZXBTdGF0dXNVcGRhdGUgYWxhcm0gdG8gT0xUICovCisgICAgLy8gdG9kbworICAgIAorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uU2xlZXBXYWtlRHVyYXRpb25UaW1lckhuZGwKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gaXMgdGhlIHRpbWVyIGNhbGxiYWNrIHdoZW4gcGVyaW9kaWNhbCB0aW1lciBmb3IKKyoqICAgICAgICAgICAgICAgc3dpdGNoaW5nIGJldHdlZW4gc2xlZXAgc3RhdHVzIGFuZCB3YWtldXAgc3RhdHVzIGlzIGV4cGlyZWQKKyoqCisqKiAgUEFSQU1FVEVSUzogIHZvaWQKKyoqCisqKiAgT1VUUFVUUzogICAgIHZvaWQKKyoqCisqKiAgUkVUVVJOUzogICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvbnVFcG9uU2xlZXBXYWtlRHVyYXRpb25UaW1lckhuZGwodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgCisgICAgaWYgKG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzR2V0KCkgPT0gRV9FUE9OX1BPV0VSX1NBVklOR19TTEVFUF9TVEFUVVMpCisgICAgeworICAgICAgICAvKiBDaGFuZ2UgdGhlIHN0YXR1cyB0byB3YWtldXAgKi8KKyAgICAgICAgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNTZXQoRV9FUE9OX1BPV0VSX1NBVklOR19XQUtFVVBfU1RBVFVTKTsKKyAgICAgICAgCisgICAgICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uR2V0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgICAgICAvKiBFbmFibGUgVFgvUlggKi8KKyAgICAgICAgbXZFcG9uQXBpU2xlZXBNb2RlQ3RybChNVl9GQUxTRSk7CisgICAgfQorICAgIGVsc2UgaWYob251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNHZXQoKSA9PSBFX0VQT05fUE9XRVJfU0FWSU5HX1dBS0VVUF9TVEFUVVMpCisgICAgeworICAgICAgICAvKiBDaGFuZ2UgdGhlIHN0YXR1cyB0byBzbGVlcCAqLworICAgICAgICBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldChFX0VQT05fUE9XRVJfU0FWSU5HX1NMRUVQX1NUQVRVUyk7CisgICAgICAgIAorICAgICAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uR2V0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgICAgICAvKiBEaXNhYmxlIFRYL1JYICovCisgICAgICAgIG12RXBvbkFwaVNsZWVwTW9kZUN0cmwoTVZfVFJVRSk7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworfQorCiAjZW5kaWYgLyogUE9OX0ZQR0EgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251Qm9hcmQuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251Qm9hcmQuaAppbmRleCA0NmQxNjljLi5mMGFhYTk5IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L2Vwb24vZXBvbk9udUJvYXJkLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVCb2FyZC5oCkBAIC05Myw2ICs5Myw5IEBACiANCiAvKiBHbG9iYWwgZnVuY3Rpb25zDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCit2b2lkIG9udUVwb25UeENvbnRyb2xUaW1lckhuZGwodm9pZCk7DQordm9pZCBvbnVFcG9uTWF4U2xlZXBUaW1lckhuZGwodm9pZCk7DQordm9pZCBvbnVFcG9uU2xlZXBXYWtlRHVyYXRpb25UaW1lckhuZGwodm9pZCk7DQogDQogI2lmbmRlZiBQT05fRlBHQQ0KIE1WX1NUQVRVUyBvbnVFcG9uU2VyZGVzSW5pdCh2b2lkKTsNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L2Vwb24vZXBvbk9udUxueEtzT3MuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251TG54S3NPcy5jCmluZGV4IGFmM2QzZTUuLjkwNTY0NTUgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251TG54S3NPcy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251TG54S3NPcy5jCkBAIC0yNTIsNiArMjUyLDUyIEBACiAgICAgcmV0dXJuKE1WX0VSUk9SKTsNCiAgIH0NCiANCisgICAgLyogT05VIEVQT04gdHhfcG93ZXIgc3VwcGx5IGNvbnRyb2wgdGltZXIgKi8NCisgICAgIHJldGNvZGUgPSBvbnVQb25UaW1lckNyZWF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblR4Q29udHJvbFRpbWVySWQpLCAgICAvKiB0aW1lciBJZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcG9uX1R4Q29udHJvbFRpbWVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWVyIGRlc2NyaXB0aW9uICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBUSU1FUl9GVU5DUFRSKW9udUVwb25UeENvbnRyb2xUaW1lckhuZGwsICAgICAgICAgLyogdGltZXIgZnVuY3Rpb24gKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lciBmdW5jdGlvbiBwYXJhbSAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9OVV9QT05fVElNRVJfTk9UX0FDVElWRSAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgdmFsdWUgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJpb2RpYyB2YWx1ZSAqLw0KKyAgICBpZiAocmV0Y29kZSAhPSBNVl9PSykNCisgICAgew0KKyAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BUElfTU9EVUxFLA0KKyAgICAgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgRVBPTiBUeCBwb3dlciBjb250cm9sIHRpbWVyIGNyZWF0ZVxuXHIiLCANCisgICAgICAgICAgICAgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOw0KKyAgICAgICAgcmV0dXJuIChNVl9FUlJPUik7DQorICAgIH0NCisNCisgICAgIC8qIE9OVSBFUE9OIHNsZWVwIG1vZGU6IG1heCBzbGVlcCB0aW1lciAqLw0KKyAgICAgcmV0Y29kZSA9IG9udVBvblRpbWVyQ3JlYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkKSwgICAgIC8qIHRpbWVyIElkICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVwb25fTWF4U2xlZXBUaW1lciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgZGVzY3JpcHRpb24gKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFRJTUVSX0ZVTkNQVFIpb251RXBvbk1heFNsZWVwVGltZXJIbmRsLCAgICAgICAgICAvKiB0aW1lciBmdW5jdGlvbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWVyIGZ1bmN0aW9uIHBhcmFtICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05VX1BPTl9USU1FUl9OT1RfQUNUSVZFLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCB2YWx1ZSAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmlvZGljIHZhbHVlICovDQorICAgIGlmIChyZXRjb2RlICE9IE1WX09LKQ0KKyAgICB7DQorICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FQSV9NT0RVTEUsDQorICAgICAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBFUE9OIHBvd2VyIHNhdmluZyBtb2RlOiBtYXggc2xlZXAgdGltZXIgY3JlYXRlXG5cciIsIA0KKyAgICAgICAgICAgICAgICAgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7DQorICAgICAgICByZXR1cm4gKE1WX0VSUk9SKTsNCisgICAgfQ0KKw0KKyAgICAvKiBPTlUgRVBPTiBzbGVlcCBtb2RlOiBzbGVlcCBkdXJhdGlvbiBhbmQgd2FpdCBkdXJhdGlvbiB0aW1lciAqLw0KKyAgICByZXRjb2RlID0gb251UG9uVGltZXJDcmVhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uVGltZXJJZCksIC8qIHRpbWVyIElkICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXBvbl9TbGVlcFdha2VEdXJhdGlvblRpbWVyIiwgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgZGVzY3JpcHRpb24gKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVElNRVJfRlVOQ1BUUilvbnVFcG9uU2xlZXBXYWtlRHVyYXRpb25UaW1lckhuZGwsICAvKiB0aW1lciBmdW5jdGlvbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWVyIGZ1bmN0aW9uIHBhcmFtICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTlVfUE9OX1RJTUVSX05PVF9BQ1RJVkUgLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCB2YWx1ZSAqLyANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwZXJpb2RpYyB2YWx1ZSAqLyANCisgICAgaWYgKHJldGNvZGUgIT0gTVZfT0spDQorICAgIHsNCisgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQVBJX01PRFVMRSwNCisgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIEVQT04gcG93ZXIgc2F2aW5nIG1vZGU6IHNsZWVwIGFuZCB3YWl0IGR1cmF0aW9uIHRpbWVyIGNyZWF0ZVxuXHIiLCANCisgICAgICAgICAgICAgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOw0KKyAgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsNCisgICAgfQ0KKyAgDQorDQogICAvKiBvbnUgZXBvbiBzaWxlbmNlIHRpbWVyICovDQogICBmb3IgKGlkeCA9IDA7IGlkeCA8IEVQT05fTUFYX01BQ19OVU07IGlkeCsrKSANCiAgIHsNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L2dwb24vZ3Bvbk9udUxueEtzT3MuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZ3Bvbi9ncG9uT251TG54S3NPcy5jCmluZGV4IGFjZDY1OWUuLjg2YjkyMWMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZ3Bvbi9ncG9uT251TG54S3NPcy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZ3Bvbi9ncG9uT251TG54S3NPcy5jCkBAIC0xNTQsNiArMTU0LDggQEAKICAgICBJTklUX1dPUksoKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSAmZ3BvblRjb250Q2xlYW5BbGxXb3JrLCBvbnVHcG9uV3FUY29udEZ1bmMpOw0KICAgICBncG9uVGNvbnRDbGVhbkFsbFdvcmsuYWN0aW9uID0gVENPTlRfQ0xFQU5fQUxMX0VWRU5UOw0KIA0KKyAgICBwcmludGsoIlNUQVJUSU5HIFBPTiBXT1JLIFFVRVVFISEhISFcbiIpOw0KKw0KICAgICByZXR1cm4oTVZfT0spOw0KICAgfQ0KIA0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251Qm9hcmQuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251Qm9hcmQuYwppbmRleCAzNzhlZGJmLi4zNmM0ZDMyIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUJvYXJkLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVCb2FyZC5jCkBAIC04OCw2ICs4OCw5IEBACiAKIC8qIEdsb2JhbCBmdW5jdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitNVl9VMzIgcHJic1VzZXJEZWZpbmVkUGF0dGVyblszXSA9IHsweEE1QTVBNUE1LCAvKiBbMzE6MDBdICovCisJCQkJICAgIDB4QTVBNUE1QTUsIC8qIFs2MzozMl0gKi8KKwkJCQkgICAgMHhBNUE1fTsgICAgLyogWzc5OjY0XSAqLwogCiAvKiBMb2NhbCBWYXJpYWJsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zMDAsNiArMzAzLDQ4IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgorKiogIG12T251UG9uTWFjUHJic1VzZXJEZWZpbmVkUGF0dGVyblNldAorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBpbml0IFVzZXIgZGVmaW5lZCBQUkJTIHBhdHRlcm4KKyoqCisqKiAgUEFSQU1FVEVSUzogIE5vbmUKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIGVycm9yCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuU2V0KE1WX1UzMiAqcHJic1VzZXJQYXR0ZXJuKQoreworICBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzBdID0gcHJic1VzZXJQYXR0ZXJuWzBdOworICBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzFdID0gcHJic1VzZXJQYXR0ZXJuWzFdOworICBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzJdID0gcHJic1VzZXJQYXR0ZXJuWzJdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBtdk9udVBvbk1hY1ByYnNVc2VyRGVmaW5lZFBhdHRlcm5HZXQKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcmV0dXJuIFVzZXIgZGVmaW5lZCBQUkJTIHBhdHRlcm4KKyoqCisqKiAgUEFSQU1FVEVSUzogIE5vbmUKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIGVycm9yCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuR2V0KE1WX1UzMiAqcHJic1VzZXJQYXR0ZXJuKQoreworICBwcmJzVXNlclBhdHRlcm5bMF0gPSBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzBdOworICBwcmJzVXNlclBhdHRlcm5bMV0gPSBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzFdOworICBwcmJzVXNlclBhdHRlcm5bMl0gPSBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzJdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKICoqICBtdk9udVBvbk1hY0J1cnN0RW5hYmxlSW5pdAogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICoqCkBAIC0zNDIsNyArMzg3LDEwIEBACiAJCQkgICAgICJFUlJPUjogYXNpY09udE1pc2NSZWdXcml0ZSBmYWlsZWQgZm9yIFBPTiBwaHkgU1cgY3RybCBub3QgZm9yY2VcblxyIik7CiAJCSAgICAgICByZXR1cm4oTVZfRVJST1IpOwogCSAgICAgICB9Ci0JfSBlbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfWjIpIHsKKwl9CisJZWxzZQorCXsKKwkJaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikgewogCiAJCS8qIEtXMiBBU0lDIFJldiBaMiAqLwogCQkvKiA9PT09PT09PT09PT09PT0gKi8KQEAgLTM2MCwyNCArNDA4LDI2IEBACiAJCWlmIChzdGF0dXMgPT0gTVZfT0spCiAJCQlzdGF0dXMgPSBtdkdwcFR5cGVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgZ3Bpb01hc2sgLyogMC1pbnB1dCBOT1QgYWxsb3cgdHJhbnNzbWl0Ki8pOwogCi0JfSBlbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfQTApIHsKKwkJfQorCQllbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfQTApIHsKIAogCQkvKiBLVzIgQVNJQyBSZXYgQTAgKi8KIAkJLyogPT09PT09PT09PT09PT09ICovCiAJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gb3V0cHV0IHN0YXR1cyBzZXQgKi8KLQkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfT1VUUFVULCAwKTsKLQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgewotCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCQkJCSAgICJFUlJPUjogYXNpY09udE1pc2NSZWdXcml0ZSBmYWlsZWQgZm9yIFBPTiBwaHkgY3RybCBlbmFibGUgLSBvdXRwdXRcblxyIik7Ci0JCQlyZXR1cm4oTVZfRVJST1IpOwotCQl9CisJCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOworCQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgeworCQkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkJICAgIkVSUk9SOiBhc2ljT250TWlzY1JlZ1dyaXRlIGZhaWxlZCBmb3IgUE9OIHBoeSBjdHJsIGVuYWJsZSAtIG91dHB1dFxuXHIiKTsKKwkJCQlyZXR1cm4oTVZfRVJST1IpOworCQkJfQogCi0JCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gZm9yY2UgZGlzYWJsZSAqLwotCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19FTiwgMCwgMCk7Ci0JCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKLQkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkJCQkgICAiRVJST1I6IGFzaWNPbnRNaXNjUmVnV3JpdGUgZmFpbGVkIGZvciBQT04gcGh5IGN0cmwgbm90IGZvcmNlXG5cciIpOwotCQkJcmV0dXJuKE1WX0VSUk9SKTsKKwkJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gZm9yY2UgZGlzYWJsZSAqLworCQkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fRU4sIDAsIDApOworCQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgeworCQkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkJICAgIkVSUk9SOiBhc2ljT250TWlzY1JlZ1dyaXRlIGZhaWxlZCBmb3IgUE9OIHBoeSBjdHJsIG5vdCBmb3JjZVxuXHIiKTsKKwkJCQlyZXR1cm4oTVZfRVJST1IpOworCQkJfQogCQl9CiAJfQogCkBAIC01MTksNTMgKzU2OSw1NyBAQAogCQkgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsKIAkgICAgICAgfQogCi0JfSBlbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfWjIpIHsKKwl9CisJZWxzZQorCXsKKwkJaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikgewogCi0JICAgIAkvKiBBU0lDIFJldiBaMiAqLwotCSAgICAJLyogPT09PT09PT09PT0gKi8KLQkJUE9OX0dQSU9fR0VUKEJPQVJEX0dQUF9QT05fWFZSX1RYLCBncGlvR3JvdXAsIGdwaW9NYXNrKTsKLQkJaWYgKGdwaW9NYXNrID09IFBPTl9HUElPX05PVF9VU0VEKQotCQkJcmV0dXJuIE1WX0VSUk9SOworCQkJLyogQVNJQyBSZXYgWjIgKi8KKwkJCS8qID09PT09PT09PT09ICovCisJCQlQT05fR1BJT19HRVQoQk9BUkRfR1BQX1BPTl9YVlJfVFgsIGdwaW9Hcm91cCwgZ3Bpb01hc2spOworCQkJaWYgKGdwaW9NYXNrID09IFBPTl9HUElPX05PVF9VU0VEKQorCQkJCXJldHVybiBNVl9FUlJPUjsKIAotCQl0cmFuc192YWx1ZSA9ICgob24gPT0gTVZfVFJVRSkgPyAoZ3Bpb01hc2svKjEqLykgOiAofmdwaW9NYXNrLyowKi8pKTsKKwkJCXRyYW5zX3ZhbHVlID0gKChvbiA9PSBNVl9UUlVFKSA/IChncGlvTWFzay8qMSovKSA6ICh+Z3Bpb01hc2svKjAqLykpOwogCi0JCXN0YXR1cyA9IG12R3BwVmFsdWVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgdHJhbnNfdmFsdWUpOwotCQlpZiAoc3RhdHVzICE9IE1WX09LKQotCQkJcmV0dXJuKE1WX0VSUk9SKTsKLQotCX0gZWxzZSBpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX0EwKSB7Ci0KLQkJLyogQVNJQyBSZXYgQTAgKi8KLQkJLyogPT09PT09PT09PT0gKi8KLQkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBlbmFibGUgKi8KLQkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fRU4sIDEsIDApOwotCQlpZiAoc3RhdHVzICE9IE1WX09LKSB7Ci0JCQltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCi0JCQkJICAgIkVSUk9SOiBhc2ljT250TWlzY1JlZ1dyaXRlIGZhaWxlZCBmb3IgUE9OIHBoeSBjdHJsIGZvcmNlXG5cciIpOwotCQkJcmV0dXJuKE1WX0VSUk9SKTsKKwkJCXN0YXR1cyA9IG12R3BwVmFsdWVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgdHJhbnNfdmFsdWUpOworCQkJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJCQlyZXR1cm4oTVZfRVJST1IpOwogCQl9CisJCWVsc2UgaWYJKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkgewogCi0gICAgICAgIHBvbGFyaXR5ID0gb251UDJQRGJYdnJCdXJzdEVuYWJsZVBvbGFyaXR5R2V0KCk7CisJCQkvKiBBU0lDIFJldiBBMCAqLworCQkJLyogPT09PT09PT09PT0gKi8KKwkJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gZm9yY2UgZW5hYmxlICovCisJCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19FTiwgMSwgMCk7CisJCQlpZiAoc3RhdHVzICE9IE1WX09LKSB7CisJCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCQkgICAiRVJST1I6IGFzaWNPbnRNaXNjUmVnV3JpdGUgZmFpbGVkIGZvciBQT04gcGh5IGN0cmwgZm9yY2VcblxyIik7CisJCQkJcmV0dXJuKE1WX0VSUk9SKTsKKwkJCX0KIAotCQkvKiBYVlIgcG9sYXJpdHkgKi8KLQkJLyogWFZSIHBvbGFyaXR5ID09IDAsIEFjdGl2ZSBIaWdoLCB0cmFuc21pdCAxIHRvIHRoZSBsaW5lICAqLwotCQkvKiBYVlIgcG9sYXJpdHkgPT0gMSwgQWN0aXZlIExvdywgdHJhbnNtaXQgMCB0byB0aGUgbGluZSAgKi8KKwkJCXBvbGFyaXR5ID0gb251UDJQRGJYdnJCdXJzdEVuYWJsZVBvbGFyaXR5R2V0KCk7CiAKLQkJLyogUDJQIG1vZGUgKi8KLQkJLyogRm9yY2UgVmFsdWUgPT0gMCwgdHJhbnNtaXQgMCB0byB0aGUgbGluZSAgKi8KLQkJLyogRm9yY2UgVmFsdWUgPT0gMSwgdHJhbnNtaXQgMSB0byB0aGUgbGluZSAgKi8KKwkJCS8qIFhWUiBwb2xhcml0eSAqLworCQkJLyogWFZSIHBvbGFyaXR5ID09IDAsIEFjdGl2ZSBIaWdoLCB0cmFuc21pdCAxIHRvIHRoZSBsaW5lICAqLworCQkJLyogWFZSIHBvbGFyaXR5ID09IDEsIEFjdGl2ZSBMb3csIHRyYW5zbWl0IDAgdG8gdGhlIGxpbmUgICovCiAKLQkJLyogU2V0dGluZyBQMlAgc2hvdWxkIGJlIHJldmVyc2VkIGZyb20gWFZSIHBvbGFyaXR5ICovCi0JCS8qIFhWUiBwb2xhcml0eSA9PSAwLCBBY3RpdmUgSGlnaCwgd3JpdGUgMSBmb3IgRm9yY2UgVmFsdWUgKi8KLQkJLyogWFZSIHBvbGFyaXR5ID09IDEsIEFjdGl2ZSBMb3csIHdyaXRlIDAgZm9yIEZvcmNlIFZhbHVlICovCisJCQkvKiBQMlAgbW9kZSAqLworCQkJLyogRm9yY2UgVmFsdWUgPT0gMCwgdHJhbnNtaXQgMCB0byB0aGUgbGluZSAgKi8KKwkJCS8qIEZvcmNlIFZhbHVlID09IDEsIHRyYW5zbWl0IDEgdG8gdGhlIGxpbmUgICovCiAKLQkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBlbmFibGUgdmFsdWUgLSBhY2NvcmRpbmcgdG8gcG9sYXJpdHkgKi8KLQkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fVkFMLCBwb2xhcml0eSwgMCk7Ci0JCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKLQkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkJCQkgICAiRVJST1I6IGFzaWNPbnRNaXNjUmVnV3JpdGUgZmFpbGVkIGZvciBQT04gcGh5IGN0cmwgZm9yY2UgdmFsdWUgJWRcblxyIiwKLQkJCQkgICB0cmFuc192YWx1ZSk7Ci0JCQlyZXR1cm4oTVZfRVJST1IpOworCQkJLyogU2V0dGluZyBQMlAgc2hvdWxkIGJlIHJldmVyc2VkIGZyb20gWFZSIHBvbGFyaXR5ICovCisJCQkvKiBYVlIgcG9sYXJpdHkgPT0gMCwgQWN0aXZlIEhpZ2gsIHdyaXRlIDEgZm9yIEZvcmNlIFZhbHVlICovCisJCQkvKiBYVlIgcG9sYXJpdHkgPT0gMSwgQWN0aXZlIExvdywgd3JpdGUgMCBmb3IgRm9yY2UgVmFsdWUgKi8KKworCQkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBlbmFibGUgdmFsdWUgLSBhY2NvcmRpbmcgdG8gcG9sYXJpdHkgKi8KKwkJCXN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfRk9SQ0VfQkVOX0lPX1ZBTCwgcG9sYXJpdHksIDApOworCQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgeworCQkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkJICAgIkVSUk9SOiBhc2ljT250TWlzY1JlZ1dyaXRlIGZhaWxlZCBmb3IgUE9OIHBoeSBjdHJsIGZvcmNlIHZhbHVlICVkXG5cciIsCisJCQkJCSAgIHRyYW5zX3ZhbHVlKTsKKwkJCQlyZXR1cm4oTVZfRVJST1IpOworCQkJCX0KIAkJfQogCX0KIApAQCAtNjA1LDYgKzY1OSw4IEBACiAJLypwYXR0ZXJuIHZhbGlkYXRpb24qLwogCWlmICghKChwYXR0ZXJuID09IE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1QxKSB8fAogCSAgICAgIChwYXR0ZXJuID09IE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1QyKSB8fAorCSAgICAgIChwYXR0ZXJuID09IE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1VTRVIpIHx8CisgICAgICAgICAgKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfUFJCU183KSB8fAogCSAgICAgIChwYXR0ZXJuID09IE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1BSQlNfOSkgfHwKIAkgICAgICAocGF0dGVybiA9PSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9QUkJTXzE1KSB8fAogCSAgICAgIChwYXR0ZXJuID09IE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1BSQlNfMjMpKSkgewpAQCAtNjYzLDEwICs3MTksMzIgQEAKIAlpZiAoc3RhdHVzICE9IE1WX09LKQogCQlyZXR1cm4oc3RhdHVzKTsKIAotCS8qc2V0IHBhdHRlcm4gdHlwZSovCi0Jc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BUX1BBVFRFUk5fREFUQSwgcGF0dGVybiwgMCk7Ci0JaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkJcmV0dXJuKHN0YXR1cyk7CisgICAgLypzZXQgcGF0dGVybiB0eXBlKi8KKyAgICBpZiAocGF0dGVybiAhPSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9VU0VSKQorICAgIHsKKyAgICAgICBzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUFRfUEFUVEVSTl9EQVRBLCBwYXR0ZXJuLCAwKTsKKyAgICAgICBpZiAoc3RhdHVzICE9IE1WX09LKQorICAgICAgICAgcmV0dXJuKHN0YXR1cyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgLyoKKyAgICAgICAqKiAgMHhGMTBBMkU2QyA8LSBQSFkgVGVzdCBEYXRhWzE1OjBdOyAgW1VzZXJEYXRhWzg6MF0sIFR5cGUgPSA1fQorICAgICAgICoqICAweEYxMEEyRTY4IDwtIFBIWSBUZXN0IERhdGFbMzE6MTZdOyBbVXNlckRhdGFbMjM6OV19CisgICAgICAgKiogIDB4RjEwQTJFNjQgPC0gUEhZIFRlc3QgRGF0YVs0NzozMl07IFtVc2VyRGF0YVszOToyNF19CisgICAgICAgKiogIDB4RjEwQTJFNjAgPC0gUEhZIFRlc3QgRGF0YVs2Mzo0OF07IFtVc2VyRGF0YVs1NTo0MF19CisgICAgICAgKiogIDB4RjEwQTJFNUMgPC0gUEhZIFRlc3QgRGF0YVs3OTo2NF07IFtVc2VyRGF0YVs3MTo1Nl19CisgICAgICAgKiogIDB4RjEwQTJFNTggPC0gUEhZIFRlc3QgRGF0YVs5Njo4MF07IFtVc2VyRGF0YVs3OTo3Ml19CisgICAgICAgKi8KKyAgICAgICBzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUFRfUEFUVEVSTl9EQVRBLCAgICAgICAgICgoKHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMF0gJiAgMHhGRikgPDwgOCkgICB8IChwYXR0ZXJuICYgMHhGRikpLCAwKTsKKyAgICAgICBzdGF0dXMgfD0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDEsICAoKHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMF0gPj4gOCkgICYgMHhGRkZGKSwgMCk7CisgICAgICAgc3RhdHVzIHw9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAyLCAoKChwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzBdID4+IDI0KSAmIDB4RkYpICAgfCAoKHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMV0gJiAweEZGKSA8PCA4KSksIDApOworICAgICAgIHN0YXR1cyB8PSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wMywgICgocHJic1VzZXJEZWZpbmVkUGF0dGVyblsxXSA+PiA4KSAgJiAweEZGRkYpLCAwKTsKKyAgICAgICBzdGF0dXMgfD0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDQsICgoKHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMV0gPj4gMjQpICYgMHhGRikgICB8ICgocHJic1VzZXJEZWZpbmVkUGF0dGVyblsyXSAmIDB4RkYpIDw8IDgpKSwgMCk7CisgICAgICAgc3RhdHVzIHw9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzA1LCAgKChwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzJdID4+IDgpICAmIDB4RkYpLCAwKTsKKyAgICAgICBpZiAoc3RhdHVzICE9IE1WX09LKQorICAgICAgICAgcmV0dXJuKHN0YXR1cyk7CisgICAgfQogCiAJLyp0dXJuIG9uIHNlbGVjdGVkIHBhdHRlcm4qLwogCXN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QVF9QQVRURVJOX0VOQUJMRUQsIDB4MSwgMCk7CkBAIC05NDMsMTUgKzEwMjEsMTUgQEAKICoqCiAqKiAgb251UDJQRGJYdnJCdXJzdEVuYWJsZVBvbGFyaXR5U2V0CiAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKiogCisqKgogKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBFUE9OIFhWUiBwb2xhcml0eSByZWdpc3RlciB2YWx1ZSBpbiB0aGUgZGF0YWJhc2UKLSoqICAgICAgICAgICAgICAgCisqKgogKiogIFBBUkFNRVRFUlM6ICBNVl9VMzIgdmFsCiAqKgogKiogIE9VVFBVVFM6ICAgICBOb25lCiAqKgogKiogIFJFVFVSTlM6ICAgICBNVl9PSyBvciBlcnJvcgotKiogICAgICAgICAgICAgICAgICAgCisqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1NUQVRVUyBvbnVQMlBEYlh2ckJ1cnN0RW5hYmxlUG9sYXJpdHlTZXQoTVZfVTMyIHZhbCkKIHsKQEAgLTk2NCwxNSArMTA0MiwxNSBAQAogKioKICoqICBvbnVQMlBEYlh2ckJ1cnN0RW5hYmxlUG9sYXJpdHlHZXQKICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKiAKKyoqCiAqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZXR1cm5zIEVQT04gWFZSIHBvbGFyaXR5IHJlZ2lzdGVyIHZhbHVlCi0qKiAgICAgICAgICAgICAgIAorKioKICoqICBQQVJBTUVURVJTOiAgTm9uZQogKioKICoqICBPVVRQVVRTOiAgICAgTm9uZQogKioKICoqICBSRVRVUk5TOiAgICAgTVZfVTMyIG1vZGUKLSoqICAgICAgICAgICAgICAgICAgIAorKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9VMzIgb251UDJQRGJYdnJCdXJzdEVuYWJsZVBvbGFyaXR5R2V0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUJvYXJkLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUJvYXJkLmgKaW5kZXggNmVmZTRlNS4uZmY0OGYwNSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVCb2FyZC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251Qm9hcmQuaApAQCAtOTMsNyArOTMsOSBAQAogCiAjZGVmaW5lIE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1QxICAgICAgICAoMHgxKQogI2RlZmluZSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9UMiAgICAgICAgKDB4MikKLSNkZWZpbmUgT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfUFJCU185ICAgICgweDgwKQorI2RlZmluZSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9VU0VSICAgICAgKDB4NSkKKyNkZWZpbmUgT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfUFJCU183ICAgICgweDgwKQorI2RlZmluZSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9QUkJTXzkgICAgKDB4ODEpCiAjZGVmaW5lIE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1BSQlNfMTUgICAoMHg4MikKICNkZWZpbmUgT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfUFJCU18yMyAgICgweDgzKQogCkBAIC0xNTUsNiArMTU3LDggQEAKIE1WX1NUQVRVUyBvbnVQb25MZWRIYW5kbGVyKE1WX1UzMiBsZWQsIE1WX1UzMiBhY3Rpb24pOwogTVZfU1RBVFVTIG9udVBvbkR5aW5nR2FzcFByb2Nlc3Modm9pZCk7CiBNVl9TVEFUVVMgb251UG9uRHlpbmdHYXNwRXhpdCh2b2lkKTsKK3ZvaWQgICAgICBtdk9udVBvbk1hY1ByYnNVc2VyRGVmaW5lZFBhdHRlcm5TZXQoTVZfVTMyICpwcmJzVXNlclBhdHRlcm4pOwordm9pZCAgICAgIG12T251UG9uTWFjUHJic1VzZXJEZWZpbmVkUGF0dGVybkdldChNVl9VMzIgKnByYnNVc2VyUGF0dGVybik7CiBNVl9TVEFUVVMgbXZPbnVQb25NYWNCdXJzdEVuYWJsZUluaXQodm9pZCk7CiBNVl9TVEFUVVMgbXZPbnVQb25NYWNCdXJzdEVuYWJsZVBvbGFyaXR5SW5pdChNVl9VMzIgcG9sYXJpdHkpOwogTVZfU1RBVFVTIG9udVBvblBhdHRlcm5CdXJzdE9uKE1WX1UzMiBwYXR0ZXJuLCBNVl9CT09MIGlzUGVyaW9kaWMsIE1WX1UzMiBwZXJpb2QsIE1WX1UzMiBkdXJhdGlvbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUxueEtzT3MuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251TG54S3NPcy5oCmluZGV4IDUyMDVlMWMuLmMzYjFiNjQgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251TG54S3NPcy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251TG54S3NPcy5oCkBAIC0xODQsMTAgKzE4NCwxMyBAQAogI2RlZmluZSBPTlVfUE9OX1RJTUVSX0hXX1JQUlRfVDBfSU5URVJWQUwgICAgKDIpICAgICAvKiAyIG1zZWMgKi8NCiAjZGVmaW5lIE9OVV9QT05fVElNRVJfSFdfUlBSVF9UMV9JTlRFUlZBTCAgICAoMTUwKSAgIC8qIDE1MCBtc2VjICovDQogI2RlZmluZSBPTlVfUE9OX1RJTUVSX0hPTERPVkVSX0lOVEVSVkFMICAgICAgKDIwMCkgICAvKiAyMDAgbXNlYyAqLw0KKyNkZWZpbmUgT05VX1BPTl9USU1FUl9NQVhfU0xFRVBfSU5URVJWQUwgICAgICg2MDAwMCkgLyogNjAgc2VjICovDQorI2RlZmluZSBPTlVfUE9OX1RJTUVSX1NMRUVQX0RVUkFUSU9OICAgICAgICAgKDUwMCkgICAgLyogMC41IHNlYyAqLw0KKyNkZWZpbmUgT05VX1BPTl9USU1FUl9XQUtFVVBfRFVSQVRJT04gICAgICAgICg1MDApICAgIC8qIDAuNSBzZWMgKi8NCiAjZGVmaW5lIE9OVV9QT05fVElNRVJfU0lMRU5DRV9JTlRFUlZBTCAgICAgICAoNjAwMDApIC8qIDYwIHNlYyAqLw0KICNkZWZpbmUgT05VX1BPTl9USU1FUl9UWF9NT0RfSU5URVJWQUwgICAgICAgICgxKSAgIC8qIDEgbXNlYyAqLw0KICNkZWZpbmUgT05VX1BPTl9USU1FUl9FVkVOVF9NSVNTX0lOVEVSVkFMICAgICgxMCkgICAvKiAxMCBtc2VjICovDQotI2RlZmluZSBPTlVfUE9OX1RJTUVSX1RYX1BXUl9JTlRFUlZBTCAgICAgICAgKDYwMDApICAvKiAxICAgc2VjICAqLw0KKyNkZWZpbmUgT05VX1BPTl9USU1FUl9UWF9QV1JfSU5URVJWQUwgICAgICAgICgxMDAwKSAgLyogMSBzZWMgKi8NCiANCiAjZGVmaW5lIE9OVV9QT05fVElNRVJfQUNUSVZFICAgICAgICAgICAgICAgICAoMSkNCiAjZGVmaW5lIE9OVV9QT05fVElNRVJfTk9UX0FDVElWRSAgICAgICAgICAgICAoMCkNCkBAIC0yNTYsNiArMjU5LDExIEBACiAgIFNfT251UG9uVGltZXIgb251UG9uVHhQd3JUaW1lcklkOyAgICAgICAgIC8qIE9OVSBQT04gVFggUG93ZXIgdGltZXIgKi8NCiAgIFNfT251UG9uVGltZXIgb251UG9uUG1UaW1lcklkOyAgICAgICAgICAgIC8qIE9OVSBQT04gUE0gdGltZXIgKi8NCiAgIFNfT251UG9uVGltZXIgb251UG9uUGF0dGVybkJ1cnN0VGltZXJJZDsgIC8qIE9OVSBQT04gUGF0dGVybiBCdXJzdCB0aW1lciAqLw0KKw0KKyAgICBTX09udVBvblRpbWVyIG9udUVwb25UeENvbnRyb2xUaW1lcklkOyAgICAgIC8qIEVQT04gdHhfY29udHJvbCBkZWxheSB0aW1lciAqLw0KKyAgICBTX09udVBvblRpbWVyIG9udUVwb25NYXhTbGVlcFRpbWVySWQ7ICAgICAgIC8qIEVQT04gcG93ZXJfc2F2aW5nIG1vZGU6IG1heCBzbGVlcCBkdXJhdGlvbiB0aW1lciAqLw0KKyAgICBTX09udVBvblRpbWVyIG9udUVwb25TbGVlcER1cmF0aW9uVGltZXJJZDsgIC8qIEVQT04gcG93ZXJfc2F2aW5nIG1vZGU6IHNsZWVwIGR1cmF0aW9uIGFuZCB3YWl0IGR1cmF0aW9uIHRpbWVyICovDQorICANCiAjaWZuZGVmIFBPTl9GUEdBICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgU19PbnVQb25UaW1lciBvbnVQb25Jc3JYdnJSc3RUaW1lcklkOyAgICAgLyogT05VIFBPTiBYVlIgUmVzZXQgdGltZXIgKi8NCiAjZW5kaWYgLyogUE9OX0ZQR0EgKi8gICAgICAgICAgICAgICAgICAgICAgIA0KQEAgLTI3NSw2ICsyODMsNyBAQAogLyogR2xvYmFsIHZhcmlhYmxlcw0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogZXh0ZXJuIFNfT251UG9uUmVzb3VyY2VUYmwgb251UG9uUmVzb3VyY2VUYmxfczsNCitleHRlcm4gc3BpbmxvY2tfdCBvbnVQb25JcnFMb2NrOw0KIA0KIC8qIEdsb2JhbCBmdW5jdGlvbnMNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KQEAgLTMxNSw2ICszMjQsOCBAQAogZXh0ZXJuIE1WX1NUQVRVUyBwb25PbnVHZXRQcmludFN0YXR1cyhNVl9VMzIgbW9kdWxlLCBNVl9VMzIgKnByaW50TGV2ZWwsIE1WX1UzMiAqbW9kdWxlT3B0aW9ucyk7DQogZXh0ZXJuIGludCAgICAgICBwb25PbnVQcmludFN0YXR1cyhjaGFyKiBidWYpOw0KIA0KK2V4dGVybiBpbnQgCSBvbnVHcG9uVWlDZmdQcmJzVXNlclBhdHRlcm4oY2hhciogYnVmKTsNCisNCiAvKiBNYWNyb3MNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICANCiANCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9hcGkuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2FwaS5oCmluZGV4IDExZmRkMmQuLjYyZjhiZjEgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2FwaS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2FwaS5oCkBAIC00MTgxLDYgKzQxODEsMzcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0cG1fZXJyb3JfY29kZV90IHRwbV9kZWFjdGl2ZV90Y29udCh1aW50MzJfdCB0Y29udF9udW0pOwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB0cG1fc3dfc2V0X3N0YXRpY19tdWx0aWNhc3RfbWFjCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgb3IgZGVzdG9yeSBhIHN0YXRpYyBNQUMgZW50cnkgaW4gdGhlIE1BQyBhZGRyZXNzIHRhYmxlIGZvciB0YWdldAorKiAgICAgICBVTkkgcG9ydCBiaXRtYXAgaW4gdGhlIGludGVncmF0ZWQgc3dpdGNoCisqCisqIElOUFVUUzoKKyogICAgICAgb3duZXJfaWQgICAgCS0gQVBQIG93bmVyIGlkLCBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIEFQSSBjYWxscy4KKyogICAgICAgdHBtX3RyZ19wb3J0ICAgIC0gdGFyZ2V0IHBvcnQgYm0gaW4gVU5JIHBvcnQgaW5kZXgsIFRQTV9UUkdfVU5JXzAgfCBUUE1fVFJHX1VOSV8xIHwgLi4uCisqICAgICAgIHN0YXRpY19tYWMgIAktIDYgYnl0ZSBuZXR3b3JrIG9yZGVyIE1BQyBzb3VyY2UgYWRkcmVzcy4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcyAtIFRQTV9SQ19PSy4KKyogICAgICAgT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UgLSBzZWUgdHBtX2Vycm9yX2NvZGVfdC4KKyoKKyogQ09NTUVOVFM6CisqICAgICAgIE5vbmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHBtX2Vycm9yX2NvZGVfdCB0cG1fc3dfc2V0X3N0YXRpY19tdWx0aWNhc3RfbWFjCisoCisgICAgdWludDMyX3QgICAgICAgICAgICBvd25lcl9pZCwKKyAgICB0cG1fdHJnX3BvcnRfdHlwZV90IHRwbV90cmdfcG9ydCwKKyAgICB1aW50OF90ICAgICAgICAgICAgIHN0YXRpY19tYWNbNl0KKyk7CisKKwogLyogT0xEIEFQSSBmdW5jdGlvbnMgKi8KICNkZWZpbmUgdHBtX2FkZF9sMl9wcmltX2FjbF9ydWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwbV9hZGRfbDJfcnVsZQogI2RlZmluZSB0cG1fYWRkX2wzX3R5cGVfYWNsX3J1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBtX2FkZF9sM190eXBlX3J1bGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2luaXQuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2luaXQuYwppbmRleCAwMDZkZDczLi5iNDdkMmFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9pbml0LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1faW5pdC5jCkBAIC0zMTUyLDYgKzMxNTIsNyBAQAogCXVpbnQzMl90IGk7CiAJdWludDMyX3Qgc3dfcG9ydF9ibXAgPSAwOwogCXVuc2lnbmVkIGNoYXIgZ3FfZGFbNl0gPSB7IDB4MDEsIDB4MDAsIDB4NWUsIDB4MDAsIDB4MDAsIDB4MDEgfTsKKwl1bnNpZ25lZCBjaGFyIGdxX21sZF9kYVs2XSA9IHsgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9OwogCXRwbV9nbWFjc19lbnVtX3QgZ21hY19pOwogCWludDMyX3Qgc3dpdGNoX3BvcnQ7CiAKQEAgLTMzMjIsNyArMzMyMyw5IEBACiAJfQogCWlmIChtdl9zd2l0Y2hfbWFjX2FkZHJfc2V0KGdxX2RhLCAwLCBzd19wb3J0X2JtcCwgMSkpCiAJCVRQTV9PU19XQVJOKFRQTV9JTklUX01PRCwgIm12X3N3aXRjaF9tYWNfYWRkcl9zZXQgZXJyLiBzd19wb3J0X2JtcCAwWCV4XG4iLCBzd19wb3J0X2JtcCk7Ci0KKwlpZiAobXZfc3dpdGNoX21hY19hZGRyX3NldChncV9tbGRfZGEsIDAsIHN3X3BvcnRfYm1wLCAxKSkKKwkJVFBNX09TX1dBUk4oVFBNX0lOSVRfTU9ELCAibXZfc3dpdGNoX21hY19hZGRyX3NldCBlcnIuZm9yIG1sZCBnZW5lcmFsIHF1ZXJ5IHN3X3BvcnRfYm1wIDBYJXhcbiIsIHN3X3BvcnRfYm1wKTsKKyAgICAKIAkvKiBJZiBTd2l0Y2ggcG9ydCBNQUMgbm8gY29ubmVjdGVkIHRvIFBIWSwgZGlzYWJsZSBHTUFDIFBIWSBwb2xsaW5nICovCiAJZm9yIChnbWFjX2kgPSBUUE1fRU5VTV9HTUFDXzA7IGdtYWNfaSA8IFRQTV9NQVhfTlVNX0dNQUNTOyBnbWFjX2krKykgewogCQlpZiAoVFBNX0ZBTFNFID09IHRwbV9pbml0LmdtYWNfcG9ydF9jb25mW2dtYWNfaV0udmFsaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9wa3RfcHJvY19sb2dpYy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fcGt0X3Byb2NfbG9naWMuYwppbmRleCBmZDBhODI3Li4wNWFmNzlkIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9wa3RfcHJvY19sb2dpYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX3BrdF9wcm9jX2xvZ2ljLmMKQEAgLTg0LDkgKzg0LDcgQEAKICNpbmNsdWRlICJ0cG1fY29tbW9uLmgiCiAjaW5jbHVkZSAidHBtX2hlYWRlci5oIgogCi0vKiBMb2NhbCBkZWZpbml0aW9ucyAqLwotZXh0ZXJuIE1WX1NUQVRVUyBtdl9jdXN0X3NldF90Y29udF9zdGF0ZSh1aW50MzJfdCB0Y29udCwgYm9vbCBzdGF0ZSk7Ci0KK2V4dGVybiBpbnQgY3BoX3NldF90Y29udF9zdGF0ZSh1bnNpZ25lZCBpbnQgdGNvbnQsIGJvb2wgc3RhdGUpOwogdHlwZWRlZiB0cG1fZXJyb3JfY29kZV90ICgqdHBtX3Byb2NfY29tbW9uX2ludF9kZWxfZnVuY190KSAodWludDMyX3QsIHVpbnQzMl90KTsKIAogaW50MzJfdCB0cG1fcHJvY192aXJ0X3VuaV90cmdfcG9ydF92YWxpZGF0aW9uKHRwbV90cmdfcG9ydF90eXBlX3QgdHJnX3BvcnQpOwpAQCAtMTQyNTAsNyArMTQyNDgsNyBAQAogCQlyZXRfY29kZSA9IHRwbV9kYl9hcGlfZW50cnlfaW52YWxpZGF0ZShhcGlfc2VjdGlvbiwgc3RyZWFtX251bSk7CiAJCUlGX0VSUk9SKHJldF9jb2RlKTsKIAotCQkKKwogCQlpZiAoVFBNX0lQX1ZFUl82ID09IGlwX3ZlcnNpb24pIHsKIAkJCS8qIHJlbW92ZSBTSVAgUE5DIGVudHJ5ICovCiAJCQlyZXRfY29kZSA9IHRwbV9kYl9nZXRfaXB2Nl9tY19zdHJlYW1fZW50cnkoc3RyZWFtX251bSwgJm1jX3N0cmVhbSk7CkBAIC0xNzgyNSw3ICsxNzgyMyw3IEBACiAKIAkvL1RQTV9PU19JTkZPKFRQTV9QTkNMX01PRCwgInBvcnQgPSAlZCB0eHAgPSAlZCBlbmFibGUgPSAlZFxuIiwgcG9ydCwgdHhwLCBlbmFibGUpOwogCi0gICAgcHJpbnRrKEtFUk5fREVCVUcgIlRQTSBULUNvbnQgQVBJLCBwb3J0KCVkKSwgdHhwKCVkKSBlbmFibGUoJWQpXG4iLCBwb3J0LCB0eHAsIGVuYWJsZSk7CisJcHJpbnRrKCJUUE0gVC1Db250IEFQSSwgcG9ydCglZCksIHR4cCglZCkgZW5hYmxlKCVkKVxuIiwgcG9ydCwgdHhwLCBlbmFibGUpOwogCiAJdHhfbW9kID0gcG9ydCArIHR4cDsKIApAQCAtMTc4NTUsNyArMTc4NTMsNyBAQAogCiAJCQkvKiBlbmFibGUvZGlzYWJsZSBod2YgKi8KIAkJCWlmIChlbmFibGUgPT0gdHJ1ZSkKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiSFdGIFQtQ29udCBhY3RpdmUsIHBvcnQoJWQpLCB0eHAoJWQpLCBxdWUoJWQpXG4iLCBwb3J0LCB0eHAsIHFfbnVtKTsKKwkJCQlwcmludGsoIkhXRiBULUNvbnQgYWN0aXZlLCBwb3J0KCVkKSwgdHhwKCVkKSwgcXVlKCVkKVxuIiwgcG9ydCwgdHhwLCBxX251bSk7CiAKIAkJCW12TmV0YUh3ZlR4cUVuYWJsZSgocXVldWVfb3duZXIgLSAxKSwgcG9ydCwgdHhwLCBxX251bSwgZW5hYmxlKTsKIApAQCAtMTc4NjQsNyArMTc4NjIsNyBAQAogCQkJaWYgKCghZW5hYmxlKSAmJiAoY3Vycl9zdGF0ZSkpCiAJCQl7CiAJCQkJLy9UUE1fT1NfSU5GTyhUUE1fUE5DTF9NT0QsICJDYWxsIG12X2V0aF90eHFfY2xlYW4gLSBjdXJyZW50IHN0YXRlOiAlZCwgZW5hYmxlICVkXG4iLCBjdXJyX3N0YXRlLCBlbmFibGUpOwotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJIV0YgVC1Db250IHN0b3AvY2xlYW4sIHBvcnQoJWQpLCB0eHAoJWQpLCBxdWUoJWQpXG4iLCBwb3J0LCB0eHAsIHFfbnVtKTsKKwkJCQlwcmludGsoIkhXRiBULUNvbnQgc3RvcC9jbGVhbiwgcG9ydCglZCksIHR4cCglZCksIHF1ZSglZClcbiIsIHBvcnQsIHR4cCwgcV9udW0pOwogCQkJCW12X2V0aF90eHFfY2xlYW4ocG9ydCwgdHhwLCBxX251bSk7CiAJCQl9CiAJCX0KQEAgLTE3ODc0LDE0ICsxNzg3MiwxNCBAQAogCQl7CiAJCQlpZiAoIWVuYWJsZSkKIAkJCXsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiU1dGIFQtQ29udCBzdG9wL2NsZWFuLCBwb3J0KCVkKSwgdHhwKCVkKSwgcXVlKCVkKVxuIiwgcG9ydCwgdHhwLCBxX251bSk7Ci0JCQkJbXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUodHhwLCBmYWxzZSk7CisJCQkJcHJpbnRrKCJTV0YgVC1Db250IHN0b3AvY2xlYW4sIHBvcnQoJWQpLCB0eHAoJWQpLCBxdWUoJWQpXG4iLCBwb3J0LCB0eHAsIHFfbnVtKTsKKwkJCQljcGhfc2V0X3Rjb250X3N0YXRlKHR4cCwgZmFsc2UpOwogCQkJCW12X2V0aF90eHFfY2xlYW4ocG9ydCwgdHhwLCBxX251bSk7CiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIlNXRiBULUNvbnQgYWN0aXZlLCBwb3J0KCVkKSwgdHhwKCVkKSwgcXVlKCVkKVxuIiwgcG9ydCwgdHhwLCBxX251bSk7Ci0JCQkJbXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUodHhwLCB0cnVlKTsKKwkJCQlwcmludGsoIlNXRiBULUNvbnQgYWN0aXZlLCBwb3J0KCVkKSwgdHhwKCVkKSwgcXVlKCVkKVxuIiwgcG9ydCwgdHhwLCBxX251bSk7CisJCQkJY3BoX3NldF90Y29udF9zdGF0ZSh0eHAsIHRydWUpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGVyZi90cG1fbW5nX2lmLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wZXJmL3RwbV9tbmdfaWYuYwppbmRleCA2YTQ2N2JlLi4wYjllNzI4IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wZXJmL3RwbV9tbmdfaWYuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wZXJmL3RwbV9tbmdfaWYuYwpAQCAtMTY5NSw2ICsxNjk1LDE2IEBACiAgICAgICAgICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgLyogPT09PT09IE1WX1RQTV9JT0NUTF9TV19TRVRfU1RBVElDX01VTFRJQ0FTVF9NQUMgPT09PT09PT09ICovCisgICAgICAgICAgICAgIGNhc2UgTVZfVFBNX0lPQ1RMX1NXX1NFVF9TVEFUSUNfTVVMVElDQVNUX01BQzoKKyAgICAgICAgICAgICAgICAgIHJjb2RlID0gdHBtX3N3X3NldF9zdGF0aWNfbXVsdGljYXN0X21hYyggIHRwbV9zd19tYWNfc2VjdXJpdHktPm93bmVyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cG1fc3dfbWFjX3NlY3VyaXR5LT5wb3J0X3ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYodHBtX3N3X21hY19zZWN1cml0eS0+c3RhdGljX21hY1swXSkpOworICAgICAgICAgICAgICAgICAgaWYocmNvZGUgIT0gVFBNX09LKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGlvY3RsRXJyOworICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKICAgICAgICAgICB9CkBAIC0zODAwLDYgKzM4MTAsNyBAQAogRVhQT1JUX1NZTUJPTCh0cG1fc3dfZ2V0X3BvcnRfbWlycm9yKTsKIEVYUE9SVF9TWU1CT0wodHBtX3N3X3NldF9pc29sYXRlX2V0aF9wb3J0X3ZlY3Rvcik7CiBFWFBPUlRfU1lNQk9MKHRwbV9zd19nZXRfaXNvbGF0ZV9ldGhfcG9ydF92ZWN0b3IpOworRVhQT1JUX1NZTUJPTCh0cG1fc3dfc2V0X3N0YXRpY19tdWx0aWNhc3RfbWFjKTsKIEVYUE9SVF9TWU1CT0wodHBtX3N3X3NldF9wb3J0X3RhZ2dlZCk7CiBFWFBPUlRfU1lNQk9MKHRwbV9zd19zZXRfcG9ydF91bnRhZ2dlZCk7CiBFWFBPUlRfU1lNQk9MKHRwbV9zd19zZXRfcG9ydF9kZWZfdmxhbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wZXJmL3RwbV9tbmdfaWYuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL3BlcmYvdHBtX21uZ19pZi5oCmluZGV4IDljZWZmYzYuLjYxYjBkZjggMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL3BlcmYvdHBtX21uZ19pZi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL3BlcmYvdHBtX21uZ19pZi5oCkBAIC0zMTksNiArMzE5LDcgQEAKICAgICBNVl9UUE1fSU9DVExfQUREX0lQdjRfTUNfU1RSRUFNX1NFVF9RVUVVRSwKICAgICBNVl9UUE1fSU9DVExfQUREX0lQdjZfTUNfU1RSRUFNX1NFVF9RVUVVRSwKICAgICBNVl9UUE1fSU9DVExfU1dfUE9SVF9BRERfVklEX1NFVF9FR1JFU1NfTU9ERSwKKyAgICBNVl9UUE1fSU9DVExfU1dfU0VUX1NUQVRJQ19NVUxUSUNBU1RfTUFDLAogCiB9IHRwbV9pb2N0bF9jbWRfdHlwZV90OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wbGF0L3RwbV9zd2l0Y2hfbWdyLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wbGF0L3RwbV9zd2l0Y2hfbWdyLmMKaW5kZXggZTYyYmNlNC4uMGJhOTQ3MiAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGxhdC90cG1fc3dpdGNoX21nci5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL3BsYXQvdHBtX3N3aXRjaF9tZ3IuYwpAQCAtMjM0LDYgKzIzNCwxMTMgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogdHBtX3N3X3NldF9nbWFjX3NwZWVkX2R1cGxleF9mYworKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHVwZGF0ZSBHTUFDIFBvcnQgQXV0by1OZWdvdGlhdGlvbiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIGlmIFBIWSBpcworKiAgICAgICAgY29ubmVjdGVkIHRvIEdNQUMgZGlyZWN0bHkuIE1haWx5IGZvciBNZWRpYSBDb252ZXJ0LgorKgorKiBJTlBVVFM6CisqICAgICAgIHNyY19wb3J0ICAgICAgICAgLSBTb3VyY2UgcG9ydCBpbiBVTkkgcG9ydCBpbmRleCwgVU5JMCwgVU5JMS4uLlVOSTQuCisqICAgICAgIGF1dG9fbmVnb19lbiAtIEF1dG8tbmVnb3RpYXRpb24gZW5hYmxlIHN0YXR1cworKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzIC0gVFBNX1JDX09LLgorKiAgICAgICBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZSAtIHNlZSB0cG1fZXJyb3JfY29kZV90LgorKgorKiBDT01NRU5UUzoKKyogICAgICAgIE5PTkUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHRwbV9lcnJvcl9jb2RlX3QgdHBtX3N3X3NldF9nbWFjX3NwZWVkX2R1cGxleF9mYyh1aW50MzJfdCBvd25lcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBtX3NyY19wb3J0X3R5cGVfdCBzcmNfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvX25lZ29fZW4pCit7CisgICAgdHBtX2Vycm9yX2NvZGVfdCByZXRWYWwgPSBUUE1fUkNfT0s7CisgICAgdHBtX3BoeV9jdHJsX3QgICBwaHlfYWNjZXNzX3dheTsKKyAgICB1aW50MzJfdCBzd2l0Y2hfaW5pdDsKKyAgICB0cG1fZ21hY3NfZW51bV90IGdtYWNfcG9ydDsKKyAgICB1aW50MzJfdCBwaHlfZGlyZWN0X2FkZHI7CisgICAgdHBtX3BoeV9zcGVlZF90IGNmZ19zcGVlZDsKKyAgICBib29sICBjZmdfZHVwbGV4LCBjZmdfZmM7CisKKyAgICByZXRWYWwgPSB0cG1fcGh5X2FjY2Vzc19jaGVjayhzcmNfcG9ydCwgJnBoeV9hY2Nlc3Nfd2F5LCAmcGh5X2RpcmVjdF9hZGRyKTsKKyAgICBpZiAocmV0VmFsICE9IFRQTV9SQ19PSykgeworICAgICAgICBwcmludGsoS0VSTl9FUlIKKyAgICAgICAgICAgICAgICJQb3J0JWQgUEhZIGFjY2VzcyB3YXkgY2hlY2sgZmFpbGVkXG4iLCBzcmNfcG9ydCk7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorICAgIC8qIGNoZWNrIHN3aWN0aCBpbml0IG9yIG5vdCAqLworICAgIGlmICh0cG1fZGJfc3dpdGNoX2luaXRfZ2V0KCZzd2l0Y2hfaW5pdCkgIT0gVFBNX0RCX09LKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgdHBtX2RiX3N3aXRjaF9pbml0X2dldCBGYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICByZXRWYWwgPSBFUlJfR0VORVJBTDsKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisgICAgLyogVGhlIHJvdXRpbmUgb25seSBhcHBseSBQSFkgY29ubmVjdGVkIHRvIEdNQUMgKi8KKyAgICBpZiAoKFBIWV9TTUlfTUFTVEVSX0NQVSA9PSBwaHlfYWNjZXNzX3dheSkgJiYKKyAgICAgICAgICghc3dpdGNoX2luaXQpKSB7CisgICAgICAgIGZvciAoZ21hY19wb3J0ID0gVFBNX0VOVU1fR01BQ18wOyBnbWFjX3BvcnQgPCBUUE1fTUFYX05VTV9HTUFDUzsgZ21hY19wb3J0KyspIHsKKyAgICAgICAgICAgIGlmIChwaHlfZGlyZWN0X2FkZHIgPT0gbXZCb2FyZFBoeUFkZHJHZXQoZ21hY19wb3J0KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChnbWFjX3BvcnQgPT0gVFBNX01BWF9OVU1fR01BQ1MpIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgQ2FuIG5vdCBmaW5kIGdtYWMgcG9ydFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICByZXRWYWwgPSBFUlJfR0VORVJBTDsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXV0b19uZWdvX2VuKSB7LyogYXV0by1uZWdvIGVuYWJsZSAqLworICAgICAgICAgICAgaWYgKG12TmV0YVNwZWVkRHVwbGV4U2V0KChpbnQpZ21hY19wb3J0LCBNVl9FVEhfU1BFRURfQU4sIE1WX0VUSF9EVVBMRVhfQU4pICE9IE1WX09LKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBtdk5ldGFTcGVlZER1cGxleFNldCBGYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgIHJldFZhbCA9IEVSUl9HRU5FUkFMOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXZOZXRhRmxvd0N0cmxTZXQoKGludClnbWFjX3BvcnQsIE1WX0VUSF9GQ19BTl9OTykgICE9IE1WX09LKXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoJXM6JWQpIG12TmV0YUZsb3dDdHJsU2V0IEZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gRVJSX0dFTkVSQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsvKiBhdXRvLW5lZ28gZGlzYWJsZSAqLworICAgICAgICAgICAgcmV0VmFsID0gdHBtX3BoeV9nZXRfcG9ydF9zcGVlZChvd25lcl9pZCwgc3JjX3BvcnQsICZjZmdfc3BlZWQpOworICAgICAgICAgICAgaWYgKHJldFZhbCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgUEhZIHNwZWVkIGNvbmZpZyBnZXQgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0VmFsID0gdHBtX3BoeV9nZXRfcG9ydF9kdXBsZXhfbW9kZShvd25lcl9pZCwgc3JjX3BvcnQsICZjZmdfZHVwbGV4KTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoJXM6JWQpIFBIWSBkdXBsZXggY29uZmlnIGdldCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXRWYWwgPSB0cG1fcGh5X2dldF9wb3J0X2Zsb3dfY29udHJvbF9zdXBwb3J0KG93bmVyX2lkLCBzcmNfcG9ydCwgJmNmZ19mYyk7CisgICAgICAgICAgICBpZiAocmV0VmFsKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBQSFkgZmxvdyBjb250cm9sIGNvbmZpZyBnZXQgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG12TmV0YVNwZWVkRHVwbGV4U2V0KChpbnQpZ21hY19wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZmdfc3BlZWQgKyBNVl9FVEhfU1BFRURfMTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZmdfZHVwbGV4ID8gTVZfRVRIX0RVUExFWF9GVUxMIDogTVZfRVRIX0RVUExFWF9IQUxGKSkgIT0gTVZfT0spIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoJXM6JWQpIG12TmV0YVNwZWVkRHVwbGV4U2V0IEZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gRVJSX0dFTkVSQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtdk5ldGFGbG93Q3RybFNldCgoaW50KWdtYWNfcG9ydCwgKGNmZ19mYyA/IE1WX0VUSF9GQ19FTkFCTEUgOiBNVl9FVEhfRkNfRElTQUJMRSkpICE9IE1WX09LKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBtdk5ldGFGbG93Q3RybFNldCBGYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgIHJldFZhbCA9IEVSUl9HRU5FUkFMOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIlBIWSBub3QgY29ubmVjdGVkIHRvIEdNQUNcbiIpOworICAgICAgICByZXRWYWwgPSBFUlJfR0VORVJBTDsKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0VmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiB0cG1fc3dfc2V0X2RlYnVnX3RyYWNlX2ZsYWcKICoKICogREVTQ1JJUFRJT046CkBAIC00OTgxLDYgKzUwODgsMTIgQEAKICAgICAgICAgICAgICAgICByZXRWYWwgPSBFUlJfUEhZX1NSQ19QT1JUX0NPTk5fSU5WQUxJRDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvKiBVcGRhdGUgR01BQyBzcGVlZCwgZHVwbGV4IGFuZCBmbG93IGNvbnRyb2wgKi8KKyAgICAgICAgcmV0VmFsID0gdHBtX3N3X3NldF9nbWFjX3NwZWVkX2R1cGxleF9mYyhvd25lcl9pZCwgc3JjX3BvcnQsIChzdGF0ZSA/IHRydWUgOiBmYWxzZSkpOworICAgICAgICBpZiAocmV0VmFsICE9IFRQTV9SQ19PSykgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gdXBkYXRlIEdNQUMgY29uZmlnIHdpdGggcG9ydCVkXG4iLCBzcmNfcG9ydCk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogUEhZIGFjY2Vzc2VkIHRocm91Z2ggc3dpdGNoLCBhcyBvcmlnaW5hbCBkbyAqLwogICAgICAgICBsUG9ydCA9IHRwbV9kYl9ldGhfcG9ydF9zd2l0Y2hfcG9ydF9nZXQoc3JjX3BvcnQpOwpAQCAtNjQ0NCw2ICs2NTU3LDEzIEBACiAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIKICAgICAgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgUEhZIExTUCBBUEkgY2FsbCBmYWlsZWQgb24gcG9ydCglZClcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHNyY19wb3J0KTsKICAgICAgICAgICAgIHJldFZhbCA9IEVSUl9QSFlfU1JDX1BPUlRfQ09OTl9JTlZBTElEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogVXBkYXRlIEdNQUMgc3BlZWQsIGR1cGxleCBhbmQgZmxvdyBjb250cm9sICovCisgICAgICAgICAgICByZXRWYWwgPSB0cG1fc3dfc2V0X2dtYWNfc3BlZWRfZHVwbGV4X2ZjKG93bmVyX2lkLCBzcmNfcG9ydCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKHJldFZhbCAhPSBUUE1fUkNfT0spIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byB1cGRhdGUgR01BQyBjb25maWcgd2l0aCBwb3J0JWRcbiIsIHNyY19wb3J0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogUEhZIGFjY2Vzc2VkIHRocm91Z2ggc3dpdGNoLCBhcyBvcmlnaW5hbCBkbyAqLwpAQCAtNjYxOSw2ICs2NzM5LDEzIEBACiAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIKICAgICAgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgUEhZIExTUCBBUEkgY2FsbCBmYWlsZWQgb24gcG9ydCglZClcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHNyY19wb3J0KTsKICAgICAgICAgICAgIHJldFZhbCA9IEVSUl9QSFlfU1JDX1BPUlRfQ09OTl9JTlZBTElEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogVXBkYXRlIEdNQUMgc3BlZWQsIGR1cGxleCBhbmQgZmxvdyBjb250cm9sICovCisgICAgICAgICAgICByZXRWYWwgPSB0cG1fc3dfc2V0X2dtYWNfc3BlZWRfZHVwbGV4X2ZjKG93bmVyX2lkLCBzcmNfcG9ydCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKHJldFZhbCAhPSBUUE1fUkNfT0spIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byB1cGRhdGUgR01BQyBjb25maWcgd2l0aCBwb3J0JWRcbiIsIHNyY19wb3J0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogUEhZIGFjY2Vzc2VkIHRocm91Z2ggc3dpdGNoLCBhcyBvcmlnaW5hbCBkbyAqLwpAQCAtNzg4Myw2ICs4MDEwLDEzIEBACiAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIKICAgICAgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgUEhZIExTUCBBUEkgY2FsbCBmYWlsZWQgb24gcG9ydCglZClcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHNyY19wb3J0KTsKICAgICAgICAgICAgIHJldFZhbCA9IEVSUl9QSFlfU1JDX1BPUlRfQ09OTl9JTlZBTElEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogVXBkYXRlIEdNQUMgc3BlZWQsIGR1cGxleCBhbmQgZmxvdyBjb250cm9sICovCisgICAgICAgICAgICByZXRWYWwgPSB0cG1fc3dfc2V0X2dtYWNfc3BlZWRfZHVwbGV4X2ZjKG93bmVyX2lkLCBzcmNfcG9ydCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKHJldFZhbCAhPSBUUE1fUkNfT0spIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byB1cGRhdGUgR01BQyBjb25maWcgd2l0aCBwb3J0JWRcbiIsIHNyY19wb3J0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogUEhZIGFjY2Vzc2VkIHRocm91Z2ggc3dpdGNoLCBhcyBvcmlnaW5hbCBkbyAqLwpAQCAtODAzNiwzICs4MTcwLDcwIEBACiAgICAgICAgICAgICAgICAgIj09RVhJVD09ICVzXG5cciIsX19GVU5DVElPTl9fKTsKICAgICB9CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHRwbV9zd19zZXRfc3RhdGljX211bHRpY2FzdF9tYWMKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBvciBkZXN0b3J5IGEgc3RhdGljIE1BQyBlbnRyeSBpbiB0aGUgTUFDIGFkZHJlc3MgdGFibGUgZm9yIHRhZ2V0CisqICAgICAgIFVOSSBwb3J0IGJpdG1hcCBpbiB0aGUgaW50ZWdyYXRlZCBzd2l0Y2gKKyoKKyogSU5QVVRTOgorKiAgICAgICBvd25lcl9pZCAgICAJLSBBUFAgb3duZXIgaWQsIHNob3VsZCBiZSB1c2VkIGZvciBhbGwgQVBJIGNhbGxzLgorKiAgICAgICB0cG1fdHJnX3BvcnQgICAgLSB0YXJnZXQgcG9ydCBibSBpbiBVTkkgcG9ydCBpbmRleCwgVFBNX1RSR19VTklfMCB8IFRQTV9UUkdfVU5JXzEgfCAuLi4KKyogICAgICAgc3RhdGljX21hYyAgCS0gNiBieXRlIG5ldHdvcmsgb3JkZXIgTUFDIHNvdXJjZSBhZGRyZXNzLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzIC0gVFBNX1JDX09LLgorKiAgICAgICBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZSAtIHNlZSB0cG1fZXJyb3JfY29kZV90LgorKgorKiBDT01NRU5UUzoKKyogICAgICAgTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0cG1fZXJyb3JfY29kZV90IHRwbV9zd19zZXRfc3RhdGljX211bHRpY2FzdF9tYWMKKygKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG93bmVyX2lkLAorICAgIHRwbV90cmdfcG9ydF90eXBlX3QgdHBtX3RyZ19wb3J0LAorICAgIHVpbnQ4X3QgICAgICAgICAgICAgc3RhdGljX21hY1s2XQorKQoreworICAgIGludDMyX3QgcmV0X2NvZGU7CisgICAgdWludDMyX3QgdHJnX3BvcnRfYm0gPSAwOworCisgICAgU1dJVENIX0lOSVRfQ0hFQ0soKTsKKworICAgIGlmICh0cmFjZV9zd19kYmdfZmxhZykKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICI9PUVOVEVSPT0lczogb3duZXJfaWRbJWRdLHRwbV90cmdfcG9ydFsweCV4XSxzdGF0aWNfbWFjIFsweCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeF1cbiIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sb3duZXJfaWQsdHBtX3RyZ19wb3J0LHN0YXRpY19tYWNbMF0sc3RhdGljX21hY1sxXSwgc3RhdGljX21hY1syXSwKKyAgICAgICAgICAgICAgIHN0YXRpY19tYWNbM10sc3RhdGljX21hY1s0XSwgc3RhdGljX21hY1s1XSk7CisgICAgfQorCisJaWYoKHN0YXRpY19tYWNbMF0gIT0gMHgwMSkgJiYgKHN0YXRpY19tYWNbMF0gIT0gMHgzMyB8fCBzdGF0aWNfbWFjWzFdICE9IDB4MzMpKQorICAgIHsKKyAgICAJcHJpbnRrKEtFUk5fRVJSCisgICAgICAgICAgICIlczolZDogZnVuY3Rpb24gZmFpbGVkLCAweCV4OiV4OiV4OiV4OiV4OiV4IGlzIG5vdCBtdWx0aWNhc3QgYWRkcmVzcyBcclxuIiwgCisgICAgICAgICAgIF9fRlVOQ1RJT05fXyxfX0xJTkVfXywgc3RhdGljX21hY1swXSwgc3RhdGljX21hY1sxXSwgc3RhdGljX21hY1syXSwgc3RhdGljX21hY1szXSwgCisgICAgICAgICAgIHN0YXRpY19tYWNbNF0sIHN0YXRpY19tYWNbNV0pOworICAgIAlJRl9FUlJPUihFUlJfU1dfTUFDX0lOVkFMSUQpOworICAgIH0KKyAgICAKKyAgICB0cmdfcG9ydF9ibSA9IHRwbV9kYl90cmdfcG9ydF9zd2l0Y2hfcG9ydF9nZXQodHBtX3RyZ19wb3J0KTsKKworICAgIGlmICh0cG1fdHJnX3BvcnQgPT0gMCkgeworICAgICAgICByZXRfY29kZSA9IHRwbV9zd19kZWxfc3RhdGljX21hYyhUUE1fTU9EX09XTkVSX1RQTSwgc3RhdGljX21hYyk7CisgICAgICAgIElGX0VSUk9SKHJldF9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXRfY29kZSA9IHRwbV9zd19zZXRfc3RhdGljX21hY193X3BvcnRzX21hc2soVFBNX01PRF9PV05FUl9UUE0sIHRyZ19wb3J0X2JtLCBzdGF0aWNfbWFjKTsKKyAgICAgICAgSUZfRVJST1IocmV0X2NvZGUpOworICAgIH0KKworICAgIHJldHVybihUUE1fUkNfT0spOworfQorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udU1hYy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251TWFjLmMKaW5kZXggM2Q0ZDJkMC4uZmJiNTc1ZiAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251TWFjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251TWFjLmMKQEAgLTgxOTcsNiArODE5NywzMCBAQAogICByZXR1cm4oc3RhdHVzKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgbXZPbnVFcG9uTWFjU2VyZGVzUHVSeFdyaXRlCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHdyaXRlIHRvIHNlcmRlcyBwb3dlciB1cCByZWNlaXZlciAKKyoqCisqKiAgUEFSQU1FVEVSUzogIGVuYWJsZSAtIDA6IHBvd2VyIGRvd24sIDE6ICBwb3dlciB1cAorKioKKyoqICBPVVRQVVRTOiAgICAgTm9uZQorKioKKyoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgTVZfRVJST1IKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG12T251RXBvbk1hY1NlcmRlc1B1UnhXcml0ZShNVl9VMzIgZW5hYmxlKQoreworICAgIE1WX1NUQVRVUyBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzBfUFVfUlgsIGVuYWJsZSwgMCk7CisKKyAgICByZXR1cm4oc3RhdHVzKTsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVNYWMuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udU1hYy5oCmluZGV4IDQxYzYyYjguLmIxMTVjMWEgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udU1hYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udU1hYy5oCkBAIC03MzYsNiArNzM2LDExIEBACiBNVl9TVEFUVVMgbXZPbnVFcG9uTWFjQ3BxVHhDdHJsUXVldWVGcmVlKE1WX1UzMiAqZnJlZUNvdW50LCBNVl9VMzIgbWFjSWQpOwogTVZfU1RBVFVTIG12T251RXBvbk1hY0NwcVR4Q3RybFF1ZXVlV3JpdGUoTVZfVTMyIGRhdGEsIE1WX1UzMiBtYWNJZCk7CiAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIFNFUkRFUyBGdW5jdGlvbnMgU2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK01WX1NUQVRVUyBtdk9udUVwb25NYWNTZXJkZXNQdVJ4V3JpdGUoTVZfVTMyIGVuYWJsZSk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udVJlZ3MuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udVJlZ3MuYwppbmRleCA4Y2U4M2YwLi5hZjM5ZjQyIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVSZWdzLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251UmVncy5jCkBAIC03MTEsNyArNzExLDEyIEBACiAgIFttdkFzaWNSZWdfUE9OX0RHX1RIUkVTSE9MRF0gICAgICAgICAgICAgICAgICAgICAgPSB7bXZBc2ljUmVnX1BPTl9ER19USFJFU0hPTEQsICAgICAgICAgICAgICAgICAgICAgIDB4MTgyNzQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgyNzQsICBhc2ljUlcsICAgICAweDAwMDAwMDAwLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIk9OVSBEeWluZyBHYXNwIHRocmVzaG9sZCJ9LAogICBbbXZBc2ljUmVnX1BUX1BBVFRFUk5fU0VMRUNUXSAgICAgICAgICAgICAgICAgICAgID0ge212QXNpY1JlZ19QVF9QQVRURVJOX1NFTEVDVCwgICAgICAgICAgICAgICAgICAgICAweEEyRTU0LCAgICAgICAgICAgICAgICAgICAgICAgICAweEEyRTU0LCAgYXNpY1JXLCAgICAgMHgwMDAwMDAwNywgICAgIDUsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICJQSFkgdGVzdCBwYXR0ZXJuIHNlbGVjdCJ9LAogICBbbXZBc2ljUmVnX1BUX1BBVFRFUk5fRU5BQkxFRF0gICAgICAgICAgICAgICAgICAgID0ge212QXNpY1JlZ19QVF9QQVRURVJOX0VOQUJMRUQsICAgICAgICAgICAgICAgICAgICAweEEyRTU0LCAgICAgICAgICAgICAgICAgICAgICAgICAweEEyRTU0LCAgYXNpY1JXLCAgICAgMHgwMDAwMDAwMSwgICAgIDE1LCAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICJQSFkgdGVzdCBwYXR0ZXJuIGVuYWJsZWQifSwKLSAgW212QXNpY1JlZ19QVF9QQVRURVJOX0RBVEFdICAgICAgICAgICAgICAgICAgICAgICA9IHttdkFzaWNSZWdfUFRfUEFUVEVSTl9EQVRBLCAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU2QywgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU2QywgIGFzaWNSVywgICAgIDB4MDAwMDAwRkYsICAgICAwLCAgICAgIDAsICAgICAwLCAgICAgIDAsICAgICAiUEhZIHRlc3QgcGF0dGVybiBkYXRhIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9EQVRBXSAgICAgICAgICAgICAgICAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fREFUQSwgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNkMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNkMsICBhc2ljUlcsICAgICAweDAwMDAwMEZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHBhdHRlcm4gZGF0YSAvIHVzZXIgcGF0dGVybiBbMTU6MF0ifSwKKyAgW212QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wMV0gICAJICAgICAgICA9IHttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDEsICAgICAgICAgICAgICAgMHhBMkU2OCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU2OCwgIGFzaWNSVywgICAgIDB4MDAwMEZGRkYsICAgICAwLCAgICAgIDAsICAgICAwLCAgICAgIDAsICAgICAiUEhZIHRlc3QgdXNlciBwYXR0ZXJuIFszMToxNl0ifSwKKyAgW212QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wMl0gICAJICAgICAgICA9IHttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDIsICAgICAgICAgICAgICAgMHhBMkU2NCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU2NCwgIGFzaWNSVywgICAgIDB4MDAwMEZGRkYsICAgICAwLCAgICAgIDAsICAgICAwLCAgICAgIDAsICAgICAiUEhZIHRlc3QgdXNlciBwYXR0ZXJuIFs0NzozMl0ifSwKKyAgW212QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wM10gICAJICAgICAgICA9IHttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDMsICAgICAgICAgICAgICAgMHhBMkU2MCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU2MCwgIGFzaWNSVywgICAgIDB4MDAwMEZGRkYsICAgICAwLCAgICAgIDAsICAgICAwLCAgICAgIDAsICAgICAiUEhZIHRlc3QgdXNlciBwYXR0ZXJuIFs2Mzo0OF0ifSwKKyAgW212QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wNF0gICAJICAgICAgICA9IHttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDQsICAgICAgICAgICAgICAgMHhBMkU1QywgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU1QywgIGFzaWNSVywgICAgIDB4MDAwMEZGRkYsICAgICAwLCAgICAgIDAsICAgICAwLCAgICAgIDAsICAgICAiUEhZIHRlc3QgdXNlciBwYXR0ZXJuIFs3OTo2NF0ifSwKKyAgW212QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wNV0gICAJICAgICAgICA9IHttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDUsICAgICAgICAgICAgICAgMHhBMkU1OCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU1OCwgIGFzaWNSVywgICAgIDB4MDAwMEZGRkYsICAgICAwLCAgICAgIDAsICAgICAwLCAgICAgIDAsICAgICAiUEhZIHRlc3QgdXNlciBwYXR0ZXJuIFs5Njo4MF0ifSwKICAgW212QXNpY1JlZ19HVU5JVF9UWF8wX1FVRVVFU10gICAgICAgICAgICAgICAgICAgICA9IHttdkFzaWNSZWdfR1VOSVRfVFhfMF9RVUVVRVMsICAgICAgICAgICAgICAgICAgICAgMHhBNTkwMCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBNTkwMCwgIGFzaWNSVywgICAgIDB4RkZGRkZGRkYsICAgICAwLCAgICAgIDgsICAgICAxLCAgICAgIDAsICAgICAiR1BPTiBHVU5JVCBRdWV1ZXMgZm9yIFRYIDAifSwKICAgW212QXNpY1JlZ19HVU5JVF9UWF8xX1FVRVVFU10gICAgICAgICAgICAgICAgICAgICA9IHttdkFzaWNSZWdfR1VOSVRfVFhfMV9RVUVVRVMsICAgICAgICAgICAgICAgICAgICAgMHhBNUQwMCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBNUQwMCwgIGFzaWNSVywgICAgIDB4RkZGRkZGRkYsICAgICAwLCAgICAgIDgsICAgICAxLCAgICAgIDAsICAgICAiR1BPTiBHVU5JVCBRdWV1ZXMgZm9yIFRYIDEifSwKICAgW212QXNpY1JlZ19HVU5JVF9UWF8yX1FVRVVFU10gICAgICAgICAgICAgICAgICAgICA9IHttdkFzaWNSZWdfR1VOSVRfVFhfMl9RVUVVRVMsICAgICAgICAgICAgICAgICAgICAgMHhBNzkwMCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBNzkwMCwgIGFzaWNSVywgICAgIDB4RkZGRkZGRkYsICAgICAwLCAgICAgIDgsICAgICAxLCAgICAgIDAsICAgICAiR1BPTiBHVU5JVCBRdWV1ZXMgZm9yIFRYIDIifSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udVJlZ3MuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udVJlZ3MuaAppbmRleCA5NmE2YmEzLi5jZGUxNDE4IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVSZWdzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251UmVncy5oCkBAIC02MDcsMzMgKzYwNywzOCBAQAogICBtdkFzaWNSZWdfUFRfUEFUVEVSTl9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1NywKICAgbXZBc2ljUmVnX1BUX1BBVFRFUk5fRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgPSA0NTgsCiAgIG12QXNpY1JlZ19QVF9QQVRURVJOX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDU5LAorICBtdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDEgICAgICAgICAgICAgICAgICA9IDQ2MCwKKyAgbXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAyICAgICAgICAgICAgICAgICAgPSA0NjEsCisgIG12QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wMyAgICAgICAgICAgICAgICAgID0gNDYyLAorICBtdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDQgICAgICAgICAgICAgICAgICA9IDQ2MywKKyAgbXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzA1ICAgICAgICAgICAgICAgICAgPSA0NjQsCiAKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzBfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjAsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8xX1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDYxLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfMl9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2MiwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzNfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjMsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF80X1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDY0LAotICBtdkFzaWNSZWdfR1VOSVRfVFhfNV9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2NSwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzZfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjYsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF83X1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDY3LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfMF9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3MCwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzFfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzEsCisgIG12QXNpY1JlZ19HVU5JVF9UWF8yX1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDcyLAorICBtdkFzaWNSZWdfR1VOSVRfVFhfM19RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3MywKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzRfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzQsCisgIG12QXNpY1JlZ19HVU5JVF9UWF81X1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDc1LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfNl9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3NiwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzdfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzcsCiAKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzBfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0NzAsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8xX1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDcxLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfMl9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ3MiwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzNfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0NzMsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF80X1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDc0LAotICBtdkFzaWNSZWdfR1VOSVRfVFhfNV9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ3NSwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzZfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0NzYsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF83X1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDc3LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfMF9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ4MCwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzFfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0ODEsCisgIG12QXNpY1JlZ19HVU5JVF9UWF8yX1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDgyLAorICBtdkFzaWNSZWdfR1VOSVRfVFhfM19QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ4MywKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzRfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0ODQsCisgIG12QXNpY1JlZ19HVU5JVF9UWF81X1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDg1LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfNl9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ4NiwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzdfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0ODcsCiAKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzBfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0ODAsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8xX1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDgxLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfMl9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ4MiwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzNfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0ODMsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF80X1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDg0LAotICBtdkFzaWNSZWdfR1VOSVRfVFhfNV9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ4NSwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzZfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0ODYsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF83X1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDg3LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfMF9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ5MCwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzFfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0OTEsCisgIG12QXNpY1JlZ19HVU5JVF9UWF8yX1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDkyLAorICBtdkFzaWNSZWdfR1VOSVRfVFhfM19QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ5MywKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzRfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0OTQsCisgIG12QXNpY1JlZ19HVU5JVF9UWF81X1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDk1LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfNl9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ5NiwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzdfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0OTcsCiAKICNlbmRpZiAvKiBQT05fRlBHQSAqLwogICBtdkFzaWNSZWdfTUFYX05VTV9PRl9SRUdTCg==