ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAwODE3OTZhLi43MTE0YjMxIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKK1R1ZSBBdWcgMTAgMDc6MTk6MzEgUERUIDIwMDQgRGFuaWVsIFZlaWxsYXJkIDxkYW5pZWxAdmVpbGxhcmQuY29tPgorCisJKiBjb25maWd1cmUuaW4geG1scmVnZXhwLmMgeG1sc2NoZW1hcy5jIHhtbHNjaGVtYXN0eXBlcy5jCisJICBpbmNsdWRlL2xpYnhtbC9zY2hlbWFzSW50ZXJuYWxzLmggaW5jbHVkZS9saWJ4bWwveG1sZXJyb3IuaAorCSAgaW5jbHVkZS9saWJ4bWwveG1sc2NoZW1hc3R5cGVzLmg6IGFwcGxpZWQgU2NoZW1hcyBwYXRjaGVzCisJICBmcm9tIEthc2ltaWVyIEJ1Y2hjaWsKKwkqIHRlc3QvIHJlc3VsdC8gYnVnMTQxMzMzKiBhbm5vdC1lcnIqIGFueVsxLTRdKiBidWcxNDUyNDYqCisJICBlbGVtZW50LWVyciogZWxlbWVudC1taW5tYXgtZXJyKiBpbmNsdWRlMSogcmVzdHJpY3QtQ1QtYXR0ci1yZWYqOgorCSAgbG90IG9mIG5ldyB0ZXN0cyBmb3IgdGhpbmdzIGZpeGVkIGJ5IHRoZSBwYXRjaAorCiBGcmkgQXVnICA2IDA5OjIyOjM0IFBEVCAyMDA0IFdpbGxpYW0gQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPgogCiAJKiB2YWxpZC5jOiBmaXhlZCBteSBtaXMtaGFuZGxpbmcgb2YgRXh0ZXJuYWwgSUQgb24gbGFzdApkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKaW5kZXggOWQzYjkwZS4uYjE4Y2NhOSAxMDA2NDQKLS0tIGEvTkVXUworKysgYi9ORVdTCkBAIC05LDcgKzksMTIgQEAKICAgIC0gRmluaXNoaW5nIHVwIFhNTAogICBTY2hlbWFzCiAKLVRoZXJlIGlzIHRoZSBsaXN0IG9mIHB1YmxpYyByZWxlYXNlczoKK1RoZSBjaGFuZ2UgbG9nIGF0IAorQ2hhbmdlTG9nLmh0bWwKKyBkZXNjcmliZXMgdGhlIHJlY2VudHMgY29tbWl0cwordG8gdGhlIENWUyBhdCAKK2h0dHA6Ly9jdnMuZ25vbWUub3JnL3ZpZXdjdnMvbGlieG1sMi8KKyBjb2RlIGJhc2UuVGhlcmUgaXMgdGhlIGxpc3Qgb2YgcHVibGljIHJlbGVhc2VzOgogMi42LjExOiBKdWx5IDUgMjAwNDoKICAgIC0gU2NoZW1hczogYSBsb3Qgb2YgY2hhbmdlcyBhbmQgaW1wcm92ZW1lbnRzIGJ5IEthc2ltaWVyIEJ1Y2hjaWsgZm9yCiAgICAgYXR0cmlidXRlcywgbmFtZXNwYWNlcyBhbmQgc2ltcGxlIHR5cGVzLgpkaWZmIC0tZ2l0IGEvY29uZmlnLmguaW4gYi9jb25maWcuaC5pbgppbmRleCBmNTRkMGJmLi45NjQ2Zjc1IDEwMDY0NAotLS0gYS9jb25maWcuaC5pbgorKysgYi9jb25maWcuaC5pbgpAQCAtMSwyODQgKzEsMjQ1IEBACi0vKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLSN1bmRlZiBQQUNLQUdFCi0jdW5kZWYgVkVSU0lPTgotI3VuZGVmIEhBVkVfTElCWgotI3VuZGVmIEhBVkVfTElCTQotI3VuZGVmIEhBVkVfSVNJTkYKLSN1bmRlZiBIQVZFX0lTTkFOCi0jdW5kZWYgSEFWRV9MSUJISVNUT1JZCi0jdW5kZWYgSEFWRV9MSUJSRUFETElORQotI3VuZGVmIFNPQ0tMRU5fVAotI3VuZGVmIEhBVkVfTElCUFRIUkVBRAotI3VuZGVmIEhBVkVfUFRIUkVBRF9ICisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwogCi0vKiBEZWZpbmUgaWYgSVBWNiBzdXBwb3J0IGlzIHRoZXJlICovCi0jdW5kZWYgU1VQUE9SVF9JUDYKLQotLyogRGVmaW5lIGlmIGdldGFkZHJpbmZvIGlzIHRoZXJlICovCi0jdW5kZWYgSEFWRV9HRVRBRERSSU5GTwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFuc2lkZWNsLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfQU5TSURFQ0xfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvaW5ldC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0FSUEFfSU5FVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YXJwYS9uYW1lc2VyLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfQVJQQV9OQU1FU0VSX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjbGFzcycgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9DTEFTUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGN0eXBlLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfQ1RZUEVfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0RJUkVOVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9ETEZDTl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9FUlJOT19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9GQ05UTF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmluaXRlJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0ZJTklURQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZsb2F0Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfRkxPQVRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZwY2xhc3MnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfRlBDTEFTUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZwcmludGYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfRlBSSU5URgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZwX2NsYXNzJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0ZQX0NMQVNTCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZnBfY2xhc3MuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9GUF9DTEFTU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnRpbWUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfRlRJTUUKLQotLyogRGVmaW5lIGlmIGdldGFkZHJpbmZvIGlzIHRoZXJlICovCi0jdW5kZWYgSEFWRV9HRVRBRERSSU5GTwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHRpbWVvZmRheScgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpZWVlZnAuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9JRUVFRlBfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAotCi0vKiBEZWZpbmUgaWYgaXNpbmYgaXMgdGhlcmUgKi8KLSN1bmRlZiBIQVZFX0lTSU5GCi0KLS8qIERlZmluZSBpZiBpc25hbiBpcyB0aGVyZSAqLwotI3VuZGVmIEhBVkVfSVNOQU4KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc25hbmQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfSVNOQU5ECi0KLS8qIERlZmluZSBpZiBoaXN0b3J5IGxpYnJhcnkgaXMgdGhlcmUgKC1saGlzdG9yeSkgKi8KLSN1bmRlZiBIQVZFX0xJQkhJU1RPUlkKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbmV0JyBsaWJyYXJ5ICgtbGluZXQpLiAqLwotI3VuZGVmIEhBVkVfTElCSU5FVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5zbCcgbGlicmFyeSAoLWxuc2wpLiAqLwotI3VuZGVmIEhBVkVfTElCTlNMCi0KLS8qIERlZmluZSBpZiBwdGhyZWFkIGxpYnJhcnkgaXMgdGhlcmUgKC1scHRocmVhZCkgKi8KLSN1bmRlZiBIQVZFX0xJQlBUSFJFQUQKLQotLyogRGVmaW5lIGlmIHJlYWRsaW5lIGxpYnJhcnkgaXMgdGhlcmUgKC1scmVhZGxpbmUpICovCi0jdW5kZWYgSEFWRV9MSUJSRUFETElORQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldCcgbGlicmFyeSAoLWxzb2NrZXQpLiAqLwotI3VuZGVmIEhBVkVfTElCU09DS0VUCi0KLS8qIEhhdmUgY29tcHJlc3Npb24gbGlicmFyeSAqLwotI3VuZGVmIEhBVkVfTElCWgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0xJTUlUU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9jYWx0aW1lJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0xPQ0FMVElNRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWF0aC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01BVEhfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmFuLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfTkFOX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4gKi8KLSN1bmRlZiBIQVZFX05ESVJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGRiLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfTkVUREJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaW4uaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9ORVRJTkVUX0lOX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwcmludGYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfUFJJTlRGCi0KLS8qIERlZmluZSBpZiA8cHRocmVhZC5oPiBpcyB0aGVyZSAqLwotI3VuZGVmIEhBVkVfUFRIUkVBRF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cmVzb2x2Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfUkVTT0xWX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWduYWwnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0lHTkFMCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2lnbmFsLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU0lHTkFMX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzbnByaW50ZicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TTlBSSU5URgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNwcmludGYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1BSSU5URgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNzY2FuZicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TU0NBTkYKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdGF0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NUQVQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRhcmcuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERBUkdfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NURElOVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJkdXAnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSRFVQCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3InIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSRVJST1IKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJmdGltZScgZnVuY3Rpb24uICovCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmZ0aW1lIGZ1bmN0aW9uLiAgKi8KICN1bmRlZiBIQVZFX1NUUkZUSU1FCiAKLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKIAotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfc3RhdCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fU1RBVAogCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cm5kdXAnIGZ1bmN0aW9uLiAqLworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjbGFzcyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9DTEFTUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZpbml0ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9GSU5JVEUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmcF9jbGFzcyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9GUF9DTEFTUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZwY2xhc3MgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfRlBDTEFTUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZwcmludGYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfRlBSSU5URgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZ0aW1lIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0ZUSU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0dGltZW9mZGF5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGlzbmFuZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9JU05BTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBsb2NhbHRpbWUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTE9DQUxUSU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHJpbnRmIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BSSU5URgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ25hbCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TSUdOQUwKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzbnByaW50ZiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TTlBSSU5URgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNwcmludGYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1BSSU5URgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNzY2FuZiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TU0NBTkYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdGF0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUQVQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJkdXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSRFVQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSRVJST1IKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJmdGltZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJGVElNRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cm5kdXAgZnVuY3Rpb24uICAqLwogI3VuZGVmIEhBVkVfU1RSTkRVUAogCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLgotICAgKi8KLSN1bmRlZiBIQVZFX1NZU19ESVJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9tbWFuLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX01NQU5fSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4KLSAgICovCi0jdW5kZWYgSEFWRV9TWVNfTkRJUl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19TRUxFQ1RfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb2NrZXQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU09DS0VUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19TVEFUX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZWIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRUJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdmZwcmludGYnIGZ1bmN0aW9uLiAqLworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB2ZnByaW50ZiBmdW5jdGlvbi4gICovCiAjdW5kZWYgSEFWRV9WRlBSSU5URgogCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZzbnByaW50ZiBmdW5jdGlvbi4gICovCiAjdW5kZWYgSEFWRV9WU05QUklOVEYKIAotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2c3ByaW50ZicgZnVuY3Rpb24uICovCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZzcHJpbnRmIGZ1bmN0aW9uLiAgKi8KICN1bmRlZiBIQVZFX1ZTUFJJTlRGCiAKLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8emxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFuc2lkZWNsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0FOU0lERUNMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJwYS9pbmV0Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0FSUEFfSU5FVF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvbmFtZXNlci5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9BUlBBX05BTUVTRVJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxjdHlwZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9DVFlQRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9ESVJFTlRfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9ETEZDTl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0VSUk5PX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRkNOVExfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmbG9hdC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9GTE9BVF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwX2NsYXNzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZQX0NMQVNTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8aWVlZWZwLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0lFRUVGUF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MSU1JVFNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWF0aC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQVRIX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmFuLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX05BTl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkRJUl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGRiLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX05FVERCX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmV0aW5ldC9pbi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9ORVRJTkVUX0lOX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8cmVzb2x2Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1JFU09MVl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TSUdOQUxfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRhcmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1REQVJHX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19ESVJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW1hbi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfTU1BTl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19ORElSX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfU0VMRUNUX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfU09DS0VUX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHpsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfWkxJQl9ICiAKLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3N0YXQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfX1NUQVQKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaW5ldCBsaWJyYXJ5ICgtbGluZXQpLiAgKi8KKyN1bmRlZiBIQVZFX0xJQklORVQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBuc2wgbGlicmFyeSAoLWxuc2wpLiAgKi8KKyN1bmRlZiBIQVZFX0xJQk5TTAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNvY2tldCBsaWJyYXJ5ICgtbHNvY2tldCkuICAqLworI3VuZGVmIEhBVkVfTElCU09DS0VUCiAKIC8qIE5hbWUgb2YgcGFja2FnZSAqLwogI3VuZGVmIFBBQ0tBR0UKIAotLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCi0jdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBWRVJTSU9OCiAKLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX05BTUUKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIEMgY29tcGlsZXIgc3VwcG9ydHMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKy8qIERlZmluZSBpZiBjb21waWxlciBoYXMgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogI3VuZGVmIFBST1RPVFlQRVMKIAorLyogSGF2ZSBjb21wcmVzc2lvbiBsaWJyYXJ5ICovCisjdW5kZWYgSEFWRV9MSUJaCisKIC8qIERldGVybWluZSB3aGF0IHNvY2tldCBsZW5ndGggKHNvY2tsZW5fdCkgZGF0YSB0eXBlIGlzICovCiAjdW5kZWYgU09DS0xFTl9UCiAKLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCiAvKiBTdXBwb3J0IGZvciBJUHY2ICovCiAjdW5kZWYgU1VQUE9SVF9JUDYKIAotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KKy8qIERlZmluZSBpZiBnZXRhZGRyaW5mbyBpcyB0aGVyZSAqLworI3VuZGVmIEhBVkVfR0VUQUREUklORk8KKworLyogRGVmaW5lIGlmIGlzbmFuIGlzIHRoZXJlICovCisjdW5kZWYgSEFWRV9JU05BTgorCisvKiBEZWZpbmUgaWYgaXNuYW4gaXMgdGhlcmUgKi8KKyN1bmRlZiBIQVZFX0lTTkFOCisKKy8qIERlZmluZSBpZiBpc2luZiBpcyB0aGVyZSAqLworI3VuZGVmIEhBVkVfSVNJTkYKKworLyogRGVmaW5lIGlmIGlzaW5mIGlzIHRoZXJlICovCisjdW5kZWYgSEFWRV9JU0lORgorCisvKiBEZWZpbmUgaWYgcHRocmVhZCBsaWJyYXJ5IGlzIHRoZXJlICgtbHB0aHJlYWQpICovCisjdW5kZWYgSEFWRV9MSUJQVEhSRUFECisKKy8qIERlZmluZSBpZiA8cHRocmVhZC5oPiBpcyB0aGVyZSAqLworI3VuZGVmIEhBVkVfUFRIUkVBRF9ICisKKy8qIERlZmluZSBpZiBoaXN0b3J5IGxpYnJhcnkgaXMgdGhlcmUgKC1saGlzdG9yeSkgKi8KKyN1bmRlZiBIQVZFX0xJQkhJU1RPUlkKKworLyogRGVmaW5lIGlmIHJlYWRsaW5lIGxpYnJhcnkgaXMgdGhlcmUgKC1scmVhZGxpbmUpICovCisjdW5kZWYgSEFWRV9MSUJSRUFETElORQogCiAvKiBVc2luZyB0aGUgV2luMzIgU29ja2V0IGltcGxlbWVudGF0aW9uICovCiAjdW5kZWYgX1dJTlNPQ0tBUElfCiAKLS8qIERlZmluZSBsaWtlIFBST1RPVFlQRVM7IHRoaXMgY2FuIGJlIHVzZWQgYnkgc3lzdGVtIGhlYWRlcnMuICovCi0jdW5kZWYgX19QUk9UT1RZUEVTCi0KIC8qIFdpbjMyIFN0ZCBDIG5hbWUgbWFuZ2xpbmcgd29yay1hcm91bmQgKi8KICN1bmRlZiBzbnByaW50ZgogCiAvKiBXaW4zMiBTdGQgQyBuYW1lIG1hbmdsaW5nIHdvcmstYXJvdW5kICovCiAjdW5kZWYgdnNucHJpbnRmCisKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCBiM2QzZWM4Li5kN2U5ZTY2IDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC0yOTgsNyArMjk4LDcgQEAKIAlDRkxBR1M9IiR7Q0ZMQUdTfSAtZmV4Y2VwdGlvbnMiCiAgICAgZmkKICAgICAgICAKLSAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtV2FsbCIKKyAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtZyAtTyAtcGVkYW50aWMgLVcgLVd1bnVzZWQgLVdpbXBsaWNpdCAtV3JldHVybi10eXBlIC1Xc3dpdGNoIC1XY29tbWVudCAtV3RyaWdyYXBocyAtV2Zvcm1hdCAtV2NoYXItc3Vic2NyaXB0cyAtV3VuaW5pdGlhbGl6ZWQgLVdwYXJlbnRoZXNlcyAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLVdjYXN0LWFsaWduIC1Xd3JpdGUtc3RyaW5ncyAtV2FnZ3JlZ2F0ZS1yZXR1cm4gLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAtV25lc3RlZC1leHRlcm5zIC1XaW5saW5lIC1XcmVkdW5kYW50LWRlY2xzIiAKICAgICBjYXNlICIke2hvc3R9IiBpbgogICAgICAgICAgIGFscGhhKi0qLWxpbnV4KiApCiAJICAgICAgIENGTEFHUz0iJHtDRkxBR1N9IC1taWVlZSIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlieG1sL3NjaGVtYXNJbnRlcm5hbHMuaCBiL2luY2x1ZGUvbGlieG1sL3NjaGVtYXNJbnRlcm5hbHMuaAppbmRleCA4MDExOTFhLi42YWE4ZGQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpYnhtbC9zY2hlbWFzSW50ZXJuYWxzLmgKKysrIGIvaW5jbHVkZS9saWJ4bWwvc2NoZW1hc0ludGVybmFscy5oCkBAIC0yMDQsMTggKzIwNCwzMCBAQAogICovCiAjZGVmaW5lIFhNTF9TQ0hFTUFTX0FUVFJfVVNFX09QVElPTkFMIDIKIC8qKgotICogWE1MX1NDSEVNQVNfQVRUUl9HTE9CQUw6CisgKiBYTUxfU0NIRU1BU19BVFRSX0dMT0FCQUw6CiAgKgogICogYWxsb3cgZWxlbWVudHMgaW4gbm8gbmFtZXNwYWNlCiAgKi8KICNkZWZpbmUgWE1MX1NDSEVNQVNfQVRUUl9HTE9CQUwgICAgICAgIDEgPDwgMAotCiAvKioKICAqIFhNTF9TQ0hFTUFTX0FUVFJfTlNERUZBVUxUOgogICoKICAqIGFsbG93IGVsZW1lbnRzIGluIG5vIG5hbWVzcGFjZQogICovCiAjZGVmaW5lIFhNTF9TQ0hFTUFTX0FUVFJfTlNERUZBVUxUCTEgPDwgNworLyoqCisgKiBYTUxfU0NIRU1BU19BVFRSX05TREVGQVVMVDoKKyAqCisgKiB0aGlzIGlzIHNldCB3aGVuIHRoZSAidHlwZSIgYW5kICJyZWYiIHJlZmVyZW5jZXMgCisgKiBoYXZlIGJlZW4gcmVzb2x2ZWQuCisgKi8KKyNkZWZpbmUgWE1MX1NDSEVNQVNfQVRUUl9JTlRFUk5BTF9SRVNPTFZFRAkxIDw8IDgKKy8qKgorICogWE1MX1NDSEVNQVNfQVRUUl9GSVhFRDoKKyAqCisgKiB0aGUgYXR0cmlidXRlIGhhcyBhIGZpeGVkIHZhbHVlCisgKi8KKyNkZWZpbmUgWE1MX1NDSEVNQVNfQVRUUl9GSVhFRAkxIDw8IDkKIAogLyoqCiAgKiB4bWxTY2hlbWFBdHRyaWJ1dGU6CkBAIC0yMjYsMjIgKzIzOCwyMyBAQAogdHlwZWRlZiB4bWxTY2hlbWFBdHRyaWJ1dGUgKnhtbFNjaGVtYUF0dHJpYnV0ZVB0cjsKIHN0cnVjdCBfeG1sU2NoZW1hQXR0cmlidXRlIHsKICAgICB4bWxTY2hlbWFUeXBlVHlwZSB0eXBlOwkvKiBUaGUga2luZCBvZiB0eXBlICovCi0gICAgc3RydWN0IF94bWxTY2hlbWFBdHRyaWJ1dGUgKm5leHQ7LyogdGhlIG5leHQgYXR0cmlidXRlIGlmIGluIGEgZ3JvdXAgLi4uICovCi0gICAgY29uc3QgeG1sQ2hhciAqbmFtZTsKKyAgICBzdHJ1Y3QgX3htbFNjaGVtYUF0dHJpYnV0ZSAqbmV4dDsvKiB0aGUgbmV4dCBhdHRyaWJ1dGUgaWYgaW4gYSBncm91cCAuLi4gKi8gCisgICAgY29uc3QgeG1sQ2hhciAqbmFtZTsgLyogbmFtZSBvZiB0aGUgZGVjbGFyYXRpb24gb3IgZW1wdHkgaWYgcGFydGljbGUgKi8KICAgICBjb25zdCB4bWxDaGFyICppZDsKLSAgICBjb25zdCB4bWxDaGFyICpyZWY7Ci0gICAgY29uc3QgeG1sQ2hhciAqcmVmTnM7Ci0gICAgY29uc3QgeG1sQ2hhciAqdHlwZU5hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqdHlwZU5zOworICAgIGNvbnN0IHhtbENoYXIgKnJlZjsgLyogdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBkZWNsLiBpZiBhIHBhcnRpY2xlICovCisgICAgY29uc3QgeG1sQ2hhciAqcmVmTnM7IC8qIHRoZSBucyBVUkkgb2YgdGhlIGF0dHJpYnV0ZSBkZWNsLiBpZiBhIHBhcnRpY2xlICovCisgICAgY29uc3QgeG1sQ2hhciAqdHlwZU5hbWU7IC8qIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSB0eXBlIGRlZmluaXRpb24gKi8KKyAgICBjb25zdCB4bWxDaGFyICp0eXBlTnM7IC8qIHRoZSBucyBVUkkgb2YgdGhlIHR5cGUgZGVmaW5pdGlvbiAqLwogICAgIHhtbFNjaGVtYUFubm90UHRyIGFubm90OwogCi0gICAgeG1sU2NoZW1hVHlwZVB0ciBiYXNlOworICAgIHhtbFNjaGVtYVR5cGVQdHIgYmFzZTsgLyogb2Jzb2xldGUsIG5vdCB1c2VkICovCiAgICAgaW50IG9jY3VyczsKICAgICBjb25zdCB4bWxDaGFyICpkZWZWYWx1ZTsKLSAgICB4bWxTY2hlbWFUeXBlUHRyIHN1YnR5cGVzOworICAgIHhtbFNjaGVtYVR5cGVQdHIgc3VidHlwZXM7IC8qIHRoZSB0eXBlIGRlZmluaXRpb24gKi8KICAgICB4bWxOb2RlUHRyIG5vZGU7Ci0gICAgY29uc3QgeG1sQ2hhciAqdGFyZ2V0TmFtZXNwYWNlOworICAgIGNvbnN0IHhtbENoYXIgKnRhcmdldE5hbWVzcGFjZTsgCiAgICAgaW50IGZsYWdzOworICAgIGNvbnN0IHhtbENoYXIgKnJlZlByZWZpeDsKIH07CiAKIC8qKgpAQCAtMzI3LDYgKzM0MCw3IEBACiAgICAgeG1sTm9kZVB0ciBub2RlOwogICAgIGludCBmbGFnczsKICAgICB4bWxTY2hlbWFXaWxkY2FyZFB0ciBhdHRyaWJ1dGVXaWxkY2FyZDsKKyAgICBjb25zdCB4bWxDaGFyICpyZWZQcmVmaXg7CiB9OwogCiAvKioKQEAgLTQzMiwxNSArNDQ2LDE1IEBACiAgKi8KICNkZWZpbmUgWE1MX1NDSEVNQVNfVFlQRV9GSU5BTF9VTklPTiAgICAxIDw8IDEyCiAvKioKLSAqIFhNTF9TQ0hFTUFTX1RZUEVfRklOQUxfREVGQVVMVDoKKyAqIFhNTF9TQ0hFTUFTX1RZUEVfRklOQUxfVU5JT046CiAgKgotICogdGhlIHNpbXBsZVR5cGUgaGFzIGEgZmluYWwgb2YgImRlZmF1bHQiLgorICogdGhlIHNpbXBsZVR5cGUgaGFzIGEgZmluYWwgb2YgInVuaW9uIi4KICAqLwogI2RlZmluZSBYTUxfU0NIRU1BU19UWVBFX0ZJTkFMX0RFRkFVTFQgICAgMSA8PCAxMwogLyoqCi0gKiBYTUxfU0NIRU1BU19UWVBFX0JVSUxUSU5fUFJJTUlUSVZFOgorICogWE1MX1NDSEVNQVNfVFlQRV9GSU5BTF9VTklPTjoKICAqCi0gKiB0aGUgc2ltcGxlVHlwZSBpcyBhIGJ1aWx0LWluIHByaW1pdGl2ZS4KKyAqIHRoZSBzaW1wbGVUeXBlIGhhcyBhIGZpbmFsIG9mICJ1bmlvbiIuCiAgKi8KICNkZWZpbmUgWE1MX1NDSEVNQVNfVFlQRV9CVUlMVElOX1BSSU1JVElWRSAgICAxIDw8IDE0CiAKQEAgLTQ2Nyw3ICs0ODEsNyBAQAogICAgIHhtbFNjaGVtYUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlOwogICAgIGNvbnN0IHhtbENoYXIgKmJhc2U7CiAgICAgY29uc3QgeG1sQ2hhciAqYmFzZU5zOwotICAgIHhtbFNjaGVtYVR5cGVQdHIgYmFzZVR5cGU7CisgICAgeG1sU2NoZW1hVHlwZVB0ciBiYXNlVHlwZTsgCiAgICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXRzOwogICAgIHN0cnVjdCBfeG1sU2NoZW1hVHlwZSAqcmVkZWY7LyogcG9zc2libGUgcmVkZWZpbml0aW9ucyBmb3IgdGhlIHR5cGUgKi8KICAgICBpbnQgcmVjdXJzZTsKQEAgLTQ3Niw2ICs0OTAsOCBAQAogICAgIGludCBidWlsdEluVHlwZTsKICAgICB4bWxTY2hlbWFUeXBlTGlua1B0ciBtZW1iZXJUeXBlczsKICAgICB4bWxTY2hlbWFGYWNldExpbmtQdHIgZmFjZXRTZXQ7CisgICAgY29uc3QgeG1sQ2hhciAqcmVmUHJlZml4OworICAgIHhtbFNjaGVtYVR5cGVQdHIgY29udGVudFR5cGVEZWY7CiB9OwogCiAvKgpAQCAtNTM1LDYgKzU1MSw2MiBAQAogICogT2Jzb2xldGUsIG5vdCB1c2VkIGFueW1vcmUuCiAgKi8KICNkZWZpbmUgWE1MX1NDSEVNQVNfRUxFTV9OU0RFRkFVTFQJMSA8PCA3CisvKioKKyAqIFhNTF9TQ0hFTUFTX0VMRU1fSU5URVJOQUxfUkVTT0xWRUQKKyAqCisgKiB0aGlzIGlzIHNldCB3aGVuICJ0eXBlIiwgInJlZiIsICJzdWJzdGl0dXRpb25Hcm91cCIKKyAqIHJlZmVyZW5jZXMgaGF2ZSBiZWVuIHJlc29sdmVkLgorICovCisjZGVmaW5lIFhNTF9TQ0hFTUFTX0VMRU1fSU5URVJOQUxfUkVTT0xWRUQJMSA8PCA4CisgLyoqCisgKiBYTUxfU0NIRU1BU19FTEVNX0NJUkNVTEFSCisgKgorICogYSBoZWxwZXIgZmxhZyBmb3IgdGhlIHNlYXJjaCBvZiBjaXJjdWxhciByZWZlcmVuY2VzLgorICovCisjZGVmaW5lIFhNTF9TQ0hFTUFTX0VMRU1fQ0lSQ1VMQVIJMSA8PCA5CisvKioKKyAqIFhNTF9TQ0hFTUFTX0VMRU1fQkxPQ0tfQUJTRU5UOgorICoKKyAqIHRoZSAiYmxvY2siIGF0dHJpYnV0ZSBpcyBhYnNlbnQKKyAqLworI2RlZmluZSBYTUxfU0NIRU1BU19FTEVNX0JMT0NLX0FCU0VOVAkxIDw8IDEwCisvKioKKyAqIFhNTF9TQ0hFTUFTX0VMRU1fQkxPQ0tfRVhURU5TSU9OOgorICoKKyAqIGRpc2FsbG93ZWQgc3Vic3RpdHV0aW9ucyBhcmUgYWJzZW50CisgKi8KKyNkZWZpbmUgWE1MX1NDSEVNQVNfRUxFTV9CTE9DS19FWFRFTlNJT04JMSA8PCAxMQorLyoqCisgKiBYTUxfU0NIRU1BU19FTEVNX0JMT0NLX1JFU1RSSUNUSU9OOgorICoKKyAqIGRpc2FsbG93ZWQgc3Vic3RpdHV0aW9uczogInJlc3RyaWN0aW9uIgorICovCisjZGVmaW5lIFhNTF9TQ0hFTUFTX0VMRU1fQkxPQ0tfUkVTVFJJQ1RJT04JMSA8PCAxMgorLyoqCisgKiBYTUxfU0NIRU1BU19FTEVNX0JMT0NLX1NVQlNUSVRVVElPTjoKKyAqCisgKiBkaXNhbGxvd2VkIHN1YnN0aXR1dGlvbnM6ICJzdWJzdGl0dWlvbiIKKyAqLworI2RlZmluZSBYTUxfU0NIRU1BU19FTEVNX0JMT0NLX1NVQlNUSVRVVElPTgkxIDw8IDEzCisvKioKKyAqIFhNTF9TQ0hFTUFTX0VMRU1fRklOQUxfQUJTRU5UOgorICoKKyAqIHN1YnN0aXR1dGlvbiBncm91cCBleGNsdXNpb25zIGFyZSBhYnNlbnQKKyAqLworI2RlZmluZSBYTUxfU0NIRU1BU19FTEVNX0ZJTkFMX0FCU0VOVAkxIDw8IDE0CisvKioKKyAqIFhNTF9TQ0hFTUFTX0VMRU1fQkxPQ0tfRVhURU5TSU9OOgorICoKKyAqIHN1YnN0aXR1dGlvbiBncm91cCBleGNsdXNpb25zOiAiZXh0ZW5zaW9uIgorICovCisjZGVmaW5lIFhNTF9TQ0hFTUFTX0VMRU1fRklOQUxfRVhURU5TSU9OCTEgPDwgMTUKKy8qKgorICogWE1MX1NDSEVNQVNfRUxFTV9CTE9DS19SRVNUUklDVElPTjoKKyAqCisgKiBzdWJzdGl0dXRpb24gZ3JvdXAgZXhjbHVzaW9uczogInJlc3RyaWN0aW9uIgorICovCisjZGVmaW5lIFhNTF9TQ0hFTUFTX0VMRU1fRklOQUxfUkVTVFJJQ1RJT04JMSA8PCAxNgorCiAKIHR5cGVkZWYgc3RydWN0IF94bWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQ7CiB0eXBlZGVmIHhtbFNjaGVtYUVsZW1lbnQgKnhtbFNjaGVtYUVsZW1lbnRQdHI7CkBAIC01NDMsMTAgKzYxNSwxMCBAQAogICAgIHN0cnVjdCBfeG1sU2NoZW1hVHlwZSAqbmV4dDsvKiB0aGUgbmV4dCB0eXBlIGlmIGluIGEgc2VxdWVuY2UgLi4uICovCiAgICAgY29uc3QgeG1sQ2hhciAqbmFtZTsKICAgICBjb25zdCB4bWxDaGFyICppZDsKLSAgICBjb25zdCB4bWxDaGFyICpyZWY7Ci0gICAgY29uc3QgeG1sQ2hhciAqcmVmTnM7CisgICAgY29uc3QgeG1sQ2hhciAqcmVmOyAvKiB0aGUgbG9jYWwgbmFtZSBvZiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpZiBhIHBhcnRpY2xlICovCisgICAgY29uc3QgeG1sQ2hhciAqcmVmTnM7IC8qIHRoZSBucyBVUkkgb2YgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaWYgYSBwYXJ0aWNsZSAqLwogICAgIHhtbFNjaGVtYUFubm90UHRyIGFubm90OwotICAgIHhtbFNjaGVtYVR5cGVQdHIgc3VidHlwZXM7CisgICAgeG1sU2NoZW1hVHlwZVB0ciBzdWJ0eXBlczsgLyogdGhlIHR5cGUgZGVmaW5pdGlvbiAqLwogICAgIHhtbFNjaGVtYUF0dHJpYnV0ZVB0ciBhdHRyaWJ1dGVzOwogICAgIHhtbE5vZGVQdHIgbm9kZTsKICAgICBpbnQgbWluT2NjdXJzOwpAQCAtNTYwLDkgKzYzMiwxMCBAQAogICAgIGNvbnN0IHhtbENoYXIgKnN1YnN0R3JvdXBOczsKICAgICBjb25zdCB4bWxDaGFyICpzY29wZTsKICAgICBjb25zdCB4bWxDaGFyICp2YWx1ZTsKLSAgICBzdHJ1Y3QgX3htbFNjaGVtYUVsZW1lbnQgKnJlZkRlY2w7CisgICAgc3RydWN0IF94bWxTY2hlbWFFbGVtZW50ICpyZWZEZWNsOyAvKiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpZiBhIHBhcnRpY2xlICovCiAgICAgeG1sUmVnZXhwUHRyIGNvbnRNb2RlbDsKICAgICB4bWxTY2hlbWFDb250ZW50VHlwZSBjb250ZW50VHlwZTsKKyAgICBjb25zdCB4bWxDaGFyICpyZWZQcmVmaXg7CiB9OwogCiAvKgpAQCAtNjIwLDQwICs2OTMsNjUgQEAKIC8qKgogICogWE1MX1NDSEVNQVNfUVVBTElGX0VMRU06CiAgKgotICogdGhlIHNoZW1hcyByZXF1aXJlcyBxdWFsaWZpZWQgZWxlbWVudHMKKyAqIHRoZSBzY2hlbWEgcmVxdWlyZXMgcXVhbGlmaWVkIGVsZW1lbnRzCiAgKi8KICNkZWZpbmUgWE1MX1NDSEVNQVNfUVVBTElGX0VMRU0JCTEgPDwgMAogLyoqCiAgKiBYTUxfU0NIRU1BU19RVUFMSUZfQVRUUjoKICAqCi0gKiB0aGUgc2hlbWFzIHJlcXVpcmVzIHF1YWxpZmllZCBhdHRyaWJ1dGVzCisgKiB0aGUgc2NoZW1hIHJlcXVpcmVzIHF1YWxpZmllZCBhdHRyaWJ1dGVzCiAgKi8KICNkZWZpbmUgWE1MX1NDSEVNQVNfUVVBTElGX0FUVFIJICAgIDEgPDwgMQogLyoqCiAgKiBYTUxfU0NIRU1BU19GSU5BTF9ERUZBVUxUX0VYVEVOU0lPTjoKICAqCi0gKiB0aGUgc2hlbWEgaGFzICJleHRlbnNpb24iIGluIHRoZSBzZXQgb2YgZmluYWxEZWZhdWx0LgorICogdGhlIHNjaGVtYSBoYXMgImV4dGVuc2lvbiIgaW4gdGhlIHNldCBvZiBmaW5hbERlZmF1bHQuCiAgKi8KICNkZWZpbmUgWE1MX1NDSEVNQVNfRklOQUxfREVGQVVMVF9FWFRFTlNJT04JMSA8PCAyCiAvKioKICAqIFhNTF9TQ0hFTUFTX0ZJTkFMX0RFRkFVTFRfUkVTVFJJQ1RJT046CiAgKgotICogdGhlIHNoZW1hIGhhcyAicmVzdHJpY3Rpb24iIGluIHRoZSBzZXQgb2YgZmluYWxEZWZhdWx0LgorICogdGhlIHNjaGVtYSBoYXMgInJlc3RyaWN0aW9uIiBpbiB0aGUgc2V0IG9mIGZpbmFsRGVmYXVsdC4KICAqLwogI2RlZmluZSBYTUxfU0NIRU1BU19GSU5BTF9ERUZBVUxUX1JFU1RSSUNUSU9OCSAgICAxIDw8IDMKIC8qKgogICogWE1MX1NDSEVNQVNfRklOQUxfREVGQVVMVF9MSVNUOgogICoKLSAqIHRoZSBzaGVtYSBoYXMgImxpc3QiIGluIHRoZSBzZXQgb2YgZmluYWxEZWZhdWx0LgorICogdGhlIGNzaGVtYSBoYXMgImxpc3QiIGluIHRoZSBzZXQgb2YgZmluYWxEZWZhdWx0LgogICovCiAjZGVmaW5lIFhNTF9TQ0hFTUFTX0ZJTkFMX0RFRkFVTFRfTElTVAkgICAgMSA8PCA0CiAvKioKICAqIFhNTF9TQ0hFTUFTX0ZJTkFMX0RFRkFVTFRfVU5JT046CiAgKgotICogdGhlIHNoZW1hIGhhcyAidW5pb24iIGluIHRoZSBzZXQgb2YgZmluYWxEZWZhdWx0LgorICogdGhlIHNjaGVtYSBoYXMgInVuaW9uIiBpbiB0aGUgc2V0IG9mIGZpbmFsRGVmYXVsdC4KICAqLwogI2RlZmluZSBYTUxfU0NIRU1BU19GSU5BTF9ERUZBVUxUX1VOSU9OCSAgICAxIDw8IDUKIC8qKgorICogWE1MX1NDSEVNQVNfQkxPQ0tfREVGQVVMVF9FWFRFTlNJT046CisgKgorICogdGhlIHNjaGVtYSBoYXMgImV4dGVuc2lvbiIgaW4gdGhlIHNldCBvZiBibG9ja0RlZmF1bHQuCisgKi8KKyNkZWZpbmUgWE1MX1NDSEVNQVNfQkxPQ0tfREVGQVVMVF9FWFRFTlNJT04JICAgIDEgPDwgNgorLyoqCisgKiBYTUxfU0NIRU1BU19CTE9DS19ERUZBVUxUX1JFU1RSSUNUSU9OOgorICoKKyAqIHRoZSBzY2hlbWEgaGFzICJyZXN0cmljdGlvbiIgaW4gdGhlIHNldCBvZiBibG9ja0RlZmF1bHQuCisgKi8KKyNkZWZpbmUgWE1MX1NDSEVNQVNfQkxPQ0tfREVGQVVMVF9SRVNUUklDVElPTgkgICAgMSA8PCA3CisvKioKKyAqIFhNTF9TQ0hFTUFTX0JMT0NLX0RFRkFVTFRfU1VCU1RJVFVUSU9OOgorICoKKyAqIHRoZSBzY2hlbWEgaGFzICJzdWJzdGl0dXRpb24iIGluIHRoZSBzZXQgb2YgYmxvY2tEZWZhdWx0LgorICovCisjZGVmaW5lIFhNTF9TQ0hFTUFTX0JMT0NLX0RFRkFVTFRfU1VCU1RJVFVUSU9OCSAgICAxIDw8IDgKKy8qKgorICogWE1MX1NDSEVNQVNfSU5DTFVESU5HX0NPTlZFUlRfTlM6CisgKgorICogdGhlIHNjaGVtYSBpcyBjdXJyZW50bHkgaW5jbHVkaW5nIGFuIG90aGVyIHNjaGVtYSB3aXRoCisgKiBubyB0YXJnZXQgbmFtZXNwYWNlLgorICovCisjZGVmaW5lIFhNTF9TQ0hFTUFTX0lOQ0xVRElOR19DT05WRVJUX05TCSAgICAxIDw8IDkKKy8qKgogICogX3htbFNjaGVtYToKICAqCiAgKiBBIFNjaGVtYXMgZGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJ4bWwveG1sZXJyb3IuaCBiL2luY2x1ZGUvbGlieG1sL3htbGVycm9yLmgKaW5kZXggNTEzYzI0NC4uOTk1NzlmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJ4bWwveG1sZXJyb3IuaAorKysgYi9pbmNsdWRlL2xpYnhtbC94bWxlcnJvci5oCkBAIC02MzcsMjIgKzYzNywyMiBAQAogICAgIFhNTF9TQ0hFTUFQX1NSQ19TSU1QTEVfVFlQRV8zLCAvKiAzMDAyICovCiAgICAgWE1MX1NDSEVNQVBfU1JDX1NJTVBMRV9UWVBFXzQsIC8qIDMwMDMgKi8KICAgICBYTUxfU0NIRU1BUF9TUkNfUkVTT0xWRSwgLyogMzAwNCAqLyAKLSAgICBYTUxfU0NIRU1BUF9TUkNfUkVTVFJJQ1RJT05fQkFTRV9PUl9TSU1QTEVUWVBFLCAvKiAzMDA0ICovCi0gICAgWE1MX1NDSEVNQVBfU1JDX0xJU1RfSVRFTVRZUEVfT1JfU0lNUExFVFlQRSwgLyogMzAwNSAqLwotICAgIFhNTF9TQ0hFTUFQX1NSQ19VTklPTl9NRU1CRVJUWVBFU19PUl9TSU1QTEVUWVBFUywgLyogMzAwNiAqLwotICAgIFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMSwgLyogMzAwNyAqLwotICAgIFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMiwgLyogMzAwOCAqLwotICAgIFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMywgLyogMzAwOSAqLyAgICAgCi0gICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18xXzEsIC8qIDMwMTAgKi8KLSAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzFfMiwgLyogMzAxMSAqLyAgICAKLSAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzFfM18xLCAvKiAzMDEyICovCi0gICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18xXzNfMiwgLyogMzAxMyAqLwotICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8xLCAvKiAzMDE0ICovCi0gICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMV8xLCAvKiAzMDE1ICovCi0gICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMV8yLCAvKiAzMDE2ICovCi0gICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMl8xLCAvKiAzMDE3ICovCi0gICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMl8yLCAvKiAzMDE4ICovCi0gICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMl8zLCAvKiAzMDE5ICovCisgICAgWE1MX1NDSEVNQVBfU1JDX1JFU1RSSUNUSU9OX0JBU0VfT1JfU0lNUExFVFlQRSwgLyogMzAwNSAqLworICAgIFhNTF9TQ0hFTUFQX1NSQ19MSVNUX0lURU1UWVBFX09SX1NJTVBMRVRZUEUsIC8qIDMwMDYgKi8KKyAgICBYTUxfU0NIRU1BUF9TUkNfVU5JT05fTUVNQkVSVFlQRVNfT1JfU0lNUExFVFlQRVMsIC8qIDMwMDcgKi8KKyAgICBYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzEsIC8qIDMwMDggKi8KKyAgICBYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzIsIC8qIDMwMDkgKi8KKyAgICBYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzMsIC8qIDMwMTAgKi8gICAgIAorICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMV8xLCAvKiAzMDExICovCisgICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18xXzIsIC8qIDMwMTIgKi8gICAgCisgICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18xXzNfMSwgLyogMzAxMyAqLworICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMV8zXzIsIC8qIDMwMTQgKi8KKyAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzJfMSwgLyogMzAxNSAqLworICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8zXzFfMSwgLyogMzAxNiAqLworICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8zXzFfMiwgLyogMzAxNyAqLworICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8zXzJfMSwgLyogMzAxOCAqLworICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8zXzJfMiwgLyogMzAxOSAqLworICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8zXzJfMywgLyogMzAyMCAqLwogICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8zXzJfNCwgLyogMzAyMSAqLwogICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8zXzJfNSwgLyogMzAyMiAqLwogICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfM18xLCAvKiAzMDIzICovCkBAIC02NjgsNyArNjY4LDI4IEBACiAgICAgWE1MX1NDSEVNQVBfUzRTX0VMRU1fTk9UX0FMTE9XRUQsIC8qIDMwMzMgKi8KICAgICBYTUxfU0NIRU1BUF9TNFNfRUxFTV9NSVNTSU5HLCAvKiAzMDM0ICovCiAgICAgWE1MX1NDSEVNQVBfUzRTX0FUVFJfTk9UX0FMTE9XRUQsIC8qIDMwMzUgKi8KLSAgICBYTUxfU0NIRU1BUF9TNFNfQVRUUl9NSVNTSU5HIC8qIDMwMzYgKi8KKyAgICBYTUxfU0NIRU1BUF9TNFNfQVRUUl9NSVNTSU5HLCAvKiAzMDM2ICovCisgICAgWE1MX1NDSEVNQVBfUzRTX0FUVFJfSU5WQUxJRF9WQUxVRSwgLyogMzAzNyAqLworICAgIFhNTF9TQ0hFTUFQX1NSQ19FTEVNRU5UXzEsIC8qIDMwMzggKi8KKyAgICBYTUxfU0NIRU1BUF9TUkNfRUxFTUVOVF8yXzEsIC8qIDMwMzkgKi8KKyAgICBYTUxfU0NIRU1BUF9TUkNfRUxFTUVOVF8yXzIsIC8qIDMwNDAgKi8KKyAgICBYTUxfU0NIRU1BUF9TUkNfRUxFTUVOVF8zLCAvKiAzMDQxICovCisgICAgWE1MX1NDSEVNQVBfUF9QUk9QU19DT1JSRUNUXzEsIC8qIDMwNDIgKi8KKyAgICBYTUxfU0NIRU1BUF9QX1BST1BTX0NPUlJFQ1RfMl8xLCAvKiAzMDQzICovCisgICAgWE1MX1NDSEVNQVBfUF9QUk9QU19DT1JSRUNUXzJfMiwgLyogMzA0NCAqLworICAgIFhNTF9TQ0hFTUFQX0VfUFJPUFNfQ09SUkVDVF8yLCAvKiAzMDQ1ICovCisgICAgWE1MX1NDSEVNQVBfRV9QUk9QU19DT1JSRUNUXzMsIC8qIDMwNDYgKi8KKyAgICBYTUxfU0NIRU1BUF9FX1BST1BTX0NPUlJFQ1RfNCwgLyogMzA0NyAqLworICAgIFhNTF9TQ0hFTUFQX0VfUFJPUFNfQ09SUkVDVF81LCAvKiAzMDQ4ICovCisgICAgWE1MX1NDSEVNQVBfRV9QUk9QU19DT1JSRUNUXzYsIC8qIDMwNDkgKi8KKyAgICBYTUxfU0NIRU1BUF9TUkNfSU5DTFVERSwgLyogMzA1MCAqLyAgICAKKyAgICBYTUxfU0NIRU1BUF9TUkNfQVRUUklCVVRFXzEsIC8qIDMwNTEgKi8KKyAgICBYTUxfU0NIRU1BUF9TUkNfQVRUUklCVVRFXzIsIC8qIDMwNTIgKi8KKyAgICBYTUxfU0NIRU1BUF9TUkNfQVRUUklCVVRFXzNfMSwgLyogMzA1MyAqLworICAgIFhNTF9TQ0hFTUFQX1NSQ19BVFRSSUJVVEVfM18yLCAvKiAzMDU0ICovCisgICAgWE1MX1NDSEVNQVBfU1JDX0FUVFJJQlVURV80LCAvKiAzMDU1ICovCisgICAgWE1MX1NDSEVNQVBfTk9fWE1MTlMsIC8qIDMwNTYgKi8KKyAgICBYTUxfU0NIRU1BUF9OT19YU0kgLyogMzA1NyAqLwogfSB4bWxQYXJzZXJFcnJvcnM7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJ4bWwveG1sc2NoZW1hc3R5cGVzLmggYi9pbmNsdWRlL2xpYnhtbC94bWxzY2hlbWFzdHlwZXMuaAppbmRleCBiODFlOWI0Li45YjBkNTU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpYnhtbC94bWxzY2hlbWFzdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpYnhtbC94bWxzY2hlbWFzdHlwZXMuaApAQCAtNzAsOCArNzAsMTkgQEAKIFhNTFBVQkZVTiBpbnQgWE1MQ0FMTAogeG1sU2NoZW1hSXNCdWlsdEluVHlwZUZhY2V0KHhtbFNjaGVtYVR5cGVQdHIgdHlwZSwgCiAJCQkgICAgaW50IGZhY2V0VHlwZSk7Ci1YTUxQVUJGVU4geG1sQ2hhciAqICBYTUxDQUxMCitYTUxQVUJGVU4geG1sQ2hhciAqIFhNTENBTEwKIHhtbFNjaGVtYUNvbGxhcHNlU3RyaW5nKGNvbnN0IHhtbENoYXIgKnZhbHVlKTsKK1hNTFBVQkZVTiB1bnNpZ25lZCBsb25nICBYTUxDQUxMCit4bWxTY2hlbWFHZXRGYWNldFZhbHVlQXNVTG9uZyh4bWxTY2hlbWFGYWNldFB0ciBmYWNldCk7CitYTUxQVUJGVU4gaW50IFhNTENBTEwKK3htbFNjaGVtYVZhbGlkYXRlTGVuZ3RoRmFjZXQoeG1sU2NoZW1hVHlwZVB0ciB0eXBlLCAKKwkJCSAgICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQsCisJCQkgICAgIGNvbnN0IHhtbENoYXIgKnZhbHVlLAorCQkJICAgICB4bWxTY2hlbWFWYWxQdHIgdmFsLAorCQkJICAgICB1bnNpZ25lZCBsb25nICpsZW5ndGgpIDsKK1hNTFBVQkZVTiBpbnQgWE1MQ0FMTAoreG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGVOb05vcm0oeG1sU2NoZW1hVHlwZVB0ciB0eXBlLCBjb25zdCB4bWxDaGFyICp2YWx1ZSwKKwkJCQkgeG1sU2NoZW1hVmFsUHRyICp2YWwsIHhtbE5vZGVQdHIgbm9kZSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL2xpYnhtbDJjbGFzcy50eHQgYi9weXRob24vbGlieG1sMmNsYXNzLnR4dAppbmRleCAyZjA4MmVhLi45MGRhODUyIDEwMDY0NAotLS0gYS9weXRob24vbGlieG1sMmNsYXNzLnR4dAorKysgYi9weXRob24vbGlieG1sMmNsYXNzLnR4dApAQCAtNjM2LDU2ICs2MzYsNiBAQAogCiAgICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgeHBvaW50ZXIKICAgICB4cG9pbnRlck5ld0NvbnRleHQoKQotQ2xhc3MgeHBhdGhDb250ZXh0KCkKLSAgICAjIGFjY2Vzc29ycwotICAgIGNvbnRleHREb2MoKQotICAgIGNvbnRleHROb2RlKCkKLSAgICBjb250ZXh0UG9zaXRpb24oKQotICAgIGNvbnRleHRTaXplKCkKLSAgICBmdW5jdGlvbigpCi0gICAgZnVuY3Rpb25VUkkoKQotICAgIHNldENvbnRleHREb2MoKQotICAgIHNldENvbnRleHROb2RlKCkKLQotICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIHB5dGhvbgotICAgIHJlZ2lzdGVyWFBhdGhGdW5jdGlvbigpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4cGF0aAotICAgIHhwYXRoRXZhbCgpCi0gICAgeHBhdGhFdmFsRXhwcmVzc2lvbigpCi0gICAgeHBhdGhGcmVlQ29udGV4dCgpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4cGF0aEludGVybmFscwotICAgIHhwYXRoTmV3UGFyc2VyQ29udGV4dCgpCi0gICAgeHBhdGhOc0xvb2t1cCgpCi0gICAgeHBhdGhSZWdpc3RlckFsbEZ1bmN0aW9ucygpCi0gICAgeHBhdGhSZWdpc3Rlck5zKCkKLSAgICB4cGF0aFJlZ2lzdGVyZWRGdW5jc0NsZWFudXAoKQotICAgIHhwYXRoUmVnaXN0ZXJlZE5zQ2xlYW51cCgpCi0gICAgeHBhdGhSZWdpc3RlcmVkVmFyaWFibGVzQ2xlYW51cCgpCi0gICAgeHBhdGhWYXJpYWJsZUxvb2t1cCgpCi0gICAgeHBhdGhWYXJpYWJsZUxvb2t1cE5TKCkKLQotICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIHhwb2ludGVyCi0gICAgeHBvaW50ZXJFdmFsKCkKLQotCi1DbGFzcyB4bWxBdHRyaWJ1dGUoeG1sTm9kZSkKLUNsYXNzIGNhdGFsb2coKQotCi0gICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgY2F0YWxvZwotICAgIGFkZCgpCi0gICAgY2F0YWxvZ0lzRW1wdHkoKQotICAgIGNvbnZlcnRTR01MQ2F0YWxvZygpCi0gICAgZHVtcCgpCi0gICAgcmVtb3ZlKCkKLSAgICByZXNvbHZlKCkKLSAgICByZXNvbHZlUHVibGljKCkKLSAgICByZXNvbHZlU3lzdGVtKCkKLSAgICByZXNvbHZlVVJJKCkKLQotCi1DbGFzcyB4bWxFbGVtZW50KHhtbE5vZGUpCiAKIAogQ2xhc3MgeG1sQXR0cih4bWxOb2RlKQpAQCAtNzA0LDk1ICs2NTQsMTIgQEAKICAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB2YWxpZAogICAgIHJlbW92ZUlEKCkKICAgICByZW1vdmVSZWYoKQotCi0KLUNsYXNzIHhtbFRleHRSZWFkZXIoeG1sVGV4dFJlYWRlckNvcmUpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4bWxyZWFkZXIKLSAgICBBdHRyaWJ1dGVDb3VudCgpCi0gICAgQmFzZVVyaSgpCi0gICAgQ2xvc2UoKQotICAgIEN1cnJlbnREb2MoKQotICAgIEN1cnJlbnROb2RlKCkKLSAgICBEZXB0aCgpCi0gICAgRXhwYW5kKCkKLSAgICBHZXRBdHRyaWJ1dGUoKQotICAgIEdldEF0dHJpYnV0ZU5vKCkKLSAgICBHZXRBdHRyaWJ1dGVOcygpCi0gICAgR2V0UGFyc2VyUHJvcCgpCi0gICAgR2V0UmVtYWluZGVyKCkKLSAgICBIYXNBdHRyaWJ1dGVzKCkKLSAgICBIYXNWYWx1ZSgpCi0gICAgSXNEZWZhdWx0KCkKLSAgICBJc0VtcHR5RWxlbWVudCgpCi0gICAgSXNWYWxpZCgpCi0gICAgTG9jYWxOYW1lKCkKLSAgICBMb29rdXBOYW1lc3BhY2UoKQotICAgIE1vdmVUb0F0dHJpYnV0ZSgpCi0gICAgTW92ZVRvQXR0cmlidXRlTm8oKQotICAgIE1vdmVUb0F0dHJpYnV0ZU5zKCkKLSAgICBNb3ZlVG9FbGVtZW50KCkKLSAgICBNb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpCi0gICAgTW92ZVRvTmV4dEF0dHJpYnV0ZSgpCi0gICAgTmFtZSgpCi0gICAgTmFtZXNwYWNlVXJpKCkKLSAgICBOZXdEb2MoKQotICAgIE5ld0ZkKCkKLSAgICBOZXdGaWxlKCkKLSAgICBOZXdNZW1vcnkoKQotICAgIE5ld1dhbGtlcigpCi0gICAgTmV4dCgpCi0gICAgTmV4dFNpYmxpbmcoKQotICAgIE5vZGVUeXBlKCkKLSAgICBOb3JtYWxpemF0aW9uKCkKLSAgICBQcmVmaXgoKQotICAgIFByZXNlcnZlKCkKLSAgICBRdW90ZUNoYXIoKQotICAgIFJlYWQoKQotICAgIFJlYWRBdHRyaWJ1dGVWYWx1ZSgpCi0gICAgUmVhZElubmVyWG1sKCkKLSAgICBSZWFkT3V0ZXJYbWwoKQotICAgIFJlYWRTdGF0ZSgpCi0gICAgUmVhZFN0cmluZygpCi0gICAgUmVsYXhOR1NldFNjaGVtYSgpCi0gICAgUmVsYXhOR1ZhbGlkYXRlKCkKLSAgICBTZXRQYXJzZXJQcm9wKCkKLSAgICBTdHJpbmcoKQotICAgIFZhbHVlKCkKLSAgICBYbWxMYW5nKCkKIENsYXNzIHhtbFJlZygpCiAKICAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4bWxyZWdleHAKICAgICByZWdleHBFeGVjKCkKICAgICByZWdleHBJc0RldGVybWluaXN0KCkKICAgICByZWdleHBQcmludCgpCi0KLQotQ2xhc3MgeG1sRW50aXR5KHhtbE5vZGUpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSBwYXJzZXJJbnRlcm5hbHMKLSAgICBoYW5kbGVFbnRpdHkoKQotQ2xhc3MgcmVsYXhOZ1NjaGVtYSgpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSByZWxheG5nCi0gICAgcmVsYXhOR0R1bXAoKQotICAgIHJlbGF4TkdEdW1wVHJlZSgpCi0gICAgcmVsYXhOR05ld1ZhbGlkQ3R4dCgpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4bWxyZWFkZXIKLSAgICBSZWxheE5HU2V0U2NoZW1hKCkKLUNsYXNzIEVycm9yKCkKLSAgICAjIGFjY2Vzc29ycwotICAgIGNvZGUoKQotICAgIGRvbWFpbigpCi0gICAgZmlsZSgpCi0gICAgbGV2ZWwoKQotICAgIGxpbmUoKQotICAgIG1lc3NhZ2UoKQotCi0gICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgeG1sZXJyb3IKLSAgICBjb3B5RXJyb3IoKQotICAgIHJlc2V0RXJyb3IoKQogQ2xhc3MgcmVsYXhOZ1ZhbGlkQ3R4dCgpCiAKICAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSByZWxheG5nCkBAIC04MDEsNzMgKzY2OCw2IEBACiAgICAgcmVsYXhOR1ZhbGlkYXRlUG9wRWxlbWVudCgpCiAgICAgcmVsYXhOR1ZhbGlkYXRlUHVzaENEYXRhKCkKICAgICByZWxheE5HVmFsaWRhdGVQdXNoRWxlbWVudCgpCi1DbGFzcyB4cGF0aFBhcnNlckNvbnRleHQoKQotICAgICMgYWNjZXNzb3JzCi0gICAgY29udGV4dCgpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4cGF0aEludGVybmFscwotICAgIHhwYXRoQWRkVmFsdWVzKCkKLSAgICB4cGF0aEJvb2xlYW5GdW5jdGlvbigpCi0gICAgeHBhdGhDZWlsaW5nRnVuY3Rpb24oKQotICAgIHhwYXRoQ29tcGFyZVZhbHVlcygpCi0gICAgeHBhdGhDb25jYXRGdW5jdGlvbigpCi0gICAgeHBhdGhDb250YWluc0Z1bmN0aW9uKCkKLSAgICB4cGF0aENvdW50RnVuY3Rpb24oKQotICAgIHhwYXRoRGl2VmFsdWVzKCkKLSAgICB4cGF0aEVxdWFsVmFsdWVzKCkKLSAgICB4cGF0aEVycigpCi0gICAgeHBhdGhFdmFsRXhwcigpCi0gICAgeHBhdGhGYWxzZUZ1bmN0aW9uKCkKLSAgICB4cGF0aEZsb29yRnVuY3Rpb24oKQotICAgIHhwYXRoRnJlZVBhcnNlckNvbnRleHQoKQotICAgIHhwYXRoSWRGdW5jdGlvbigpCi0gICAgeHBhdGhMYW5nRnVuY3Rpb24oKQotICAgIHhwYXRoTGFzdEZ1bmN0aW9uKCkKLSAgICB4cGF0aExvY2FsTmFtZUZ1bmN0aW9uKCkKLSAgICB4cGF0aE1vZFZhbHVlcygpCi0gICAgeHBhdGhNdWx0VmFsdWVzKCkKLSAgICB4cGF0aE5hbWVzcGFjZVVSSUZ1bmN0aW9uKCkKLSAgICB4cGF0aE5leHRBbmNlc3RvcigpCi0gICAgeHBhdGhOZXh0QW5jZXN0b3JPclNlbGYoKQotICAgIHhwYXRoTmV4dEF0dHJpYnV0ZSgpCi0gICAgeHBhdGhOZXh0Q2hpbGQoKQotICAgIHhwYXRoTmV4dERlc2NlbmRhbnQoKQotICAgIHhwYXRoTmV4dERlc2NlbmRhbnRPclNlbGYoKQotICAgIHhwYXRoTmV4dEZvbGxvd2luZygpCi0gICAgeHBhdGhOZXh0Rm9sbG93aW5nU2libGluZygpCi0gICAgeHBhdGhOZXh0TmFtZXNwYWNlKCkKLSAgICB4cGF0aE5leHRQYXJlbnQoKQotICAgIHhwYXRoTmV4dFByZWNlZGluZygpCi0gICAgeHBhdGhOZXh0UHJlY2VkaW5nU2libGluZygpCi0gICAgeHBhdGhOZXh0U2VsZigpCi0gICAgeHBhdGhOb3JtYWxpemVGdW5jdGlvbigpCi0gICAgeHBhdGhOb3RFcXVhbFZhbHVlcygpCi0gICAgeHBhdGhOb3RGdW5jdGlvbigpCi0gICAgeHBhdGhOdW1iZXJGdW5jdGlvbigpCi0gICAgeHBhdGhQYXJzZU5DTmFtZSgpCi0gICAgeHBhdGhQYXJzZU5hbWUoKQotICAgIHhwYXRoUG9wQm9vbGVhbigpCi0gICAgeHBhdGhQb3BOdW1iZXIoKQotICAgIHhwYXRoUG9wU3RyaW5nKCkKLSAgICB4cGF0aFBvc2l0aW9uRnVuY3Rpb24oKQotICAgIHhwYXRoUm9vdCgpCi0gICAgeHBhdGhSb3VuZEZ1bmN0aW9uKCkKLSAgICB4cGF0aFN0YXJ0c1dpdGhGdW5jdGlvbigpCi0gICAgeHBhdGhTdHJpbmdGdW5jdGlvbigpCi0gICAgeHBhdGhTdHJpbmdMZW5ndGhGdW5jdGlvbigpCi0gICAgeHBhdGhTdWJWYWx1ZXMoKQotICAgIHhwYXRoU3Vic3RyaW5nQWZ0ZXJGdW5jdGlvbigpCi0gICAgeHBhdGhTdWJzdHJpbmdCZWZvcmVGdW5jdGlvbigpCi0gICAgeHBhdGhTdWJzdHJpbmdGdW5jdGlvbigpCi0gICAgeHBhdGhTdW1GdW5jdGlvbigpCi0gICAgeHBhdGhUcmFuc2xhdGVGdW5jdGlvbigpCi0gICAgeHBhdGhUcnVlRnVuY3Rpb24oKQotICAgIHhwYXRoVmFsdWVGbGlwU2lnbigpCi0gICAgeHBhdGhlcnJvcigpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4cG9pbnRlcgotICAgIHhwb2ludGVyRXZhbFJhbmdlUHJlZGljYXRlKCkKLSAgICB4cG9pbnRlclJhbmdlVG9GdW5jdGlvbigpCiAKIAogQ2xhc3MgcGFyc2VyQ3R4dChwYXJzZXJDdHh0Q29yZSkKQEAgLTk3NSw2ICs3NzUsOTAgQEAKICAgICBkdGRFbGVtZW50RGVzYygpCiAgICAgZHRkUUF0dHJEZXNjKCkKICAgICBkdGRRRWxlbWVudERlc2MoKQorQ2xhc3MgcmVsYXhOZ1BhcnNlckN0eHQoKQorCisgICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgcmVsYXhuZworICAgIHJlbGF4TkdQYXJzZSgpCisgICAgcmVsYXhQYXJzZXJTZXRGbGFnKCkKK0NsYXNzIHhwYXRoUGFyc2VyQ29udGV4dCgpCisgICAgIyBhY2Nlc3NvcnMKKyAgICBjb250ZXh0KCkKKworICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIHhwYXRoSW50ZXJuYWxzCisgICAgeHBhdGhBZGRWYWx1ZXMoKQorICAgIHhwYXRoQm9vbGVhbkZ1bmN0aW9uKCkKKyAgICB4cGF0aENlaWxpbmdGdW5jdGlvbigpCisgICAgeHBhdGhDb21wYXJlVmFsdWVzKCkKKyAgICB4cGF0aENvbmNhdEZ1bmN0aW9uKCkKKyAgICB4cGF0aENvbnRhaW5zRnVuY3Rpb24oKQorICAgIHhwYXRoQ291bnRGdW5jdGlvbigpCisgICAgeHBhdGhEaXZWYWx1ZXMoKQorICAgIHhwYXRoRXF1YWxWYWx1ZXMoKQorICAgIHhwYXRoRXJyKCkKKyAgICB4cGF0aEV2YWxFeHByKCkKKyAgICB4cGF0aEZhbHNlRnVuY3Rpb24oKQorICAgIHhwYXRoRmxvb3JGdW5jdGlvbigpCisgICAgeHBhdGhGcmVlUGFyc2VyQ29udGV4dCgpCisgICAgeHBhdGhJZEZ1bmN0aW9uKCkKKyAgICB4cGF0aExhbmdGdW5jdGlvbigpCisgICAgeHBhdGhMYXN0RnVuY3Rpb24oKQorICAgIHhwYXRoTG9jYWxOYW1lRnVuY3Rpb24oKQorICAgIHhwYXRoTW9kVmFsdWVzKCkKKyAgICB4cGF0aE11bHRWYWx1ZXMoKQorICAgIHhwYXRoTmFtZXNwYWNlVVJJRnVuY3Rpb24oKQorICAgIHhwYXRoTmV4dEFuY2VzdG9yKCkKKyAgICB4cGF0aE5leHRBbmNlc3Rvck9yU2VsZigpCisgICAgeHBhdGhOZXh0QXR0cmlidXRlKCkKKyAgICB4cGF0aE5leHRDaGlsZCgpCisgICAgeHBhdGhOZXh0RGVzY2VuZGFudCgpCisgICAgeHBhdGhOZXh0RGVzY2VuZGFudE9yU2VsZigpCisgICAgeHBhdGhOZXh0Rm9sbG93aW5nKCkKKyAgICB4cGF0aE5leHRGb2xsb3dpbmdTaWJsaW5nKCkKKyAgICB4cGF0aE5leHROYW1lc3BhY2UoKQorICAgIHhwYXRoTmV4dFBhcmVudCgpCisgICAgeHBhdGhOZXh0UHJlY2VkaW5nKCkKKyAgICB4cGF0aE5leHRQcmVjZWRpbmdTaWJsaW5nKCkKKyAgICB4cGF0aE5leHRTZWxmKCkKKyAgICB4cGF0aE5vcm1hbGl6ZUZ1bmN0aW9uKCkKKyAgICB4cGF0aE5vdEVxdWFsVmFsdWVzKCkKKyAgICB4cGF0aE5vdEZ1bmN0aW9uKCkKKyAgICB4cGF0aE51bWJlckZ1bmN0aW9uKCkKKyAgICB4cGF0aFBhcnNlTkNOYW1lKCkKKyAgICB4cGF0aFBhcnNlTmFtZSgpCisgICAgeHBhdGhQb3BCb29sZWFuKCkKKyAgICB4cGF0aFBvcE51bWJlcigpCisgICAgeHBhdGhQb3BTdHJpbmcoKQorICAgIHhwYXRoUG9zaXRpb25GdW5jdGlvbigpCisgICAgeHBhdGhSb290KCkKKyAgICB4cGF0aFJvdW5kRnVuY3Rpb24oKQorICAgIHhwYXRoU3RhcnRzV2l0aEZ1bmN0aW9uKCkKKyAgICB4cGF0aFN0cmluZ0Z1bmN0aW9uKCkKKyAgICB4cGF0aFN0cmluZ0xlbmd0aEZ1bmN0aW9uKCkKKyAgICB4cGF0aFN1YlZhbHVlcygpCisgICAgeHBhdGhTdWJzdHJpbmdBZnRlckZ1bmN0aW9uKCkKKyAgICB4cGF0aFN1YnN0cmluZ0JlZm9yZUZ1bmN0aW9uKCkKKyAgICB4cGF0aFN1YnN0cmluZ0Z1bmN0aW9uKCkKKyAgICB4cGF0aFN1bUZ1bmN0aW9uKCkKKyAgICB4cGF0aFRyYW5zbGF0ZUZ1bmN0aW9uKCkKKyAgICB4cGF0aFRydWVGdW5jdGlvbigpCisgICAgeHBhdGhWYWx1ZUZsaXBTaWduKCkKKyAgICB4cGF0aGVycm9yKCkKKworICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIHhwb2ludGVyCisgICAgeHBvaW50ZXJFdmFsUmFuZ2VQcmVkaWNhdGUoKQorICAgIHhwb2ludGVyUmFuZ2VUb0Z1bmN0aW9uKCkKK0NsYXNzIGNhdGFsb2coKQorCisgICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgY2F0YWxvZworICAgIGFkZCgpCisgICAgY2F0YWxvZ0lzRW1wdHkoKQorICAgIGNvbnZlcnRTR01MQ2F0YWxvZygpCisgICAgZHVtcCgpCisgICAgcmVtb3ZlKCkKKyAgICByZXNvbHZlKCkKKyAgICByZXNvbHZlUHVibGljKCkKKyAgICByZXNvbHZlU3lzdGVtKCkKKyAgICByZXNvbHZlVVJJKCkKIAogCiBDbGFzcyB4bWxOcyh4bWxOb2RlKQpAQCAtOTk4LDQwICs4ODIsNiBAQAogCiAgICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgeHBhdGhJbnRlcm5hbHMKICAgICB4cGF0aE5vZGVTZXRGcmVlTnMoKQotCi0KLUNsYXNzIGlucHV0QnVmZmVyKGlvUmVhZFdyYXBwZXIpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4bWxJTwotICAgIGdyb3coKQotICAgIHB1c2goKQotICAgIHJlYWQoKQotCi0gICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgeG1scmVhZGVyCi0gICAgbmV3VGV4dFJlYWRlcigpCi1DbGFzcyByZWxheE5nUGFyc2VyQ3R4dCgpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSByZWxheG5nCi0gICAgcmVsYXhOR1BhcnNlKCkKLSAgICByZWxheFBhcnNlclNldEZsYWcoKQotCi0KLUNsYXNzIG91dHB1dEJ1ZmZlcihpb1dyaXRlV3JhcHBlcikKLQotICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIEhUTUx0cmVlCi0gICAgaHRtbERvY0NvbnRlbnREdW1wRm9ybWF0T3V0cHV0KCkKLSAgICBodG1sRG9jQ29udGVudER1bXBPdXRwdXQoKQotICAgIGh0bWxOb2RlRHVtcEZvcm1hdE91dHB1dCgpCi0gICAgaHRtbE5vZGVEdW1wT3V0cHV0KCkKLQotICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIHRyZWUKLSAgICBub2RlRHVtcE91dHB1dCgpCi0gICAgc2F2ZUZpbGVUbygpCi0gICAgc2F2ZUZvcm1hdEZpbGVUbygpCi0KLSAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4bWxJTwotICAgIHdyaXRlKCkKLSAgICB3cml0ZVN0cmluZygpCiBDbGFzcyB4bWxUZXh0UmVhZGVyTG9jYXRvcigpCiAKICAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4bWxyZWFkZXIKQEAgLTEwNjIsMyArOTEyLDE1MyBAQAogICAgIHBhcnNlVVJJUmVmZXJlbmNlKCkKICAgICBwcmludFVSSSgpCiAgICAgc2F2ZVVyaSgpCisKKworQ2xhc3MgeG1sQXR0cmlidXRlKHhtbE5vZGUpCitDbGFzcyB4cGF0aENvbnRleHQoKQorICAgICMgYWNjZXNzb3JzCisgICAgY29udGV4dERvYygpCisgICAgY29udGV4dE5vZGUoKQorICAgIGNvbnRleHRQb3NpdGlvbigpCisgICAgY29udGV4dFNpemUoKQorICAgIGZ1bmN0aW9uKCkKKyAgICBmdW5jdGlvblVSSSgpCisgICAgc2V0Q29udGV4dERvYygpCisgICAgc2V0Q29udGV4dE5vZGUoKQorCisgICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgcHl0aG9uCisgICAgcmVnaXN0ZXJYUGF0aEZ1bmN0aW9uKCkKKworICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIHhwYXRoCisgICAgeHBhdGhFdmFsKCkKKyAgICB4cGF0aEV2YWxFeHByZXNzaW9uKCkKKyAgICB4cGF0aEZyZWVDb250ZXh0KCkKKworICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIHhwYXRoSW50ZXJuYWxzCisgICAgeHBhdGhOZXdQYXJzZXJDb250ZXh0KCkKKyAgICB4cGF0aE5zTG9va3VwKCkKKyAgICB4cGF0aFJlZ2lzdGVyQWxsRnVuY3Rpb25zKCkKKyAgICB4cGF0aFJlZ2lzdGVyTnMoKQorICAgIHhwYXRoUmVnaXN0ZXJlZEZ1bmNzQ2xlYW51cCgpCisgICAgeHBhdGhSZWdpc3RlcmVkTnNDbGVhbnVwKCkKKyAgICB4cGF0aFJlZ2lzdGVyZWRWYXJpYWJsZXNDbGVhbnVwKCkKKyAgICB4cGF0aFZhcmlhYmxlTG9va3VwKCkKKyAgICB4cGF0aFZhcmlhYmxlTG9va3VwTlMoKQorCisgICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgeHBvaW50ZXIKKyAgICB4cG9pbnRlckV2YWwoKQorCisKK0NsYXNzIHhtbEVsZW1lbnQoeG1sTm9kZSkKKworCitDbGFzcyB4bWxUZXh0UmVhZGVyKHhtbFRleHRSZWFkZXJDb3JlKQorCisgICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgeG1scmVhZGVyCisgICAgQXR0cmlidXRlQ291bnQoKQorICAgIEJhc2VVcmkoKQorICAgIENsb3NlKCkKKyAgICBDdXJyZW50RG9jKCkKKyAgICBDdXJyZW50Tm9kZSgpCisgICAgRGVwdGgoKQorICAgIEV4cGFuZCgpCisgICAgR2V0QXR0cmlidXRlKCkKKyAgICBHZXRBdHRyaWJ1dGVObygpCisgICAgR2V0QXR0cmlidXRlTnMoKQorICAgIEdldFBhcnNlclByb3AoKQorICAgIEdldFJlbWFpbmRlcigpCisgICAgSGFzQXR0cmlidXRlcygpCisgICAgSGFzVmFsdWUoKQorICAgIElzRGVmYXVsdCgpCisgICAgSXNFbXB0eUVsZW1lbnQoKQorICAgIElzVmFsaWQoKQorICAgIExvY2FsTmFtZSgpCisgICAgTG9va3VwTmFtZXNwYWNlKCkKKyAgICBNb3ZlVG9BdHRyaWJ1dGUoKQorICAgIE1vdmVUb0F0dHJpYnV0ZU5vKCkKKyAgICBNb3ZlVG9BdHRyaWJ1dGVOcygpCisgICAgTW92ZVRvRWxlbWVudCgpCisgICAgTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKQorICAgIE1vdmVUb05leHRBdHRyaWJ1dGUoKQorICAgIE5hbWUoKQorICAgIE5hbWVzcGFjZVVyaSgpCisgICAgTmV3RG9jKCkKKyAgICBOZXdGZCgpCisgICAgTmV3RmlsZSgpCisgICAgTmV3TWVtb3J5KCkKKyAgICBOZXdXYWxrZXIoKQorICAgIE5leHQoKQorICAgIE5leHRTaWJsaW5nKCkKKyAgICBOb2RlVHlwZSgpCisgICAgTm9ybWFsaXphdGlvbigpCisgICAgUHJlZml4KCkKKyAgICBQcmVzZXJ2ZSgpCisgICAgUXVvdGVDaGFyKCkKKyAgICBSZWFkKCkKKyAgICBSZWFkQXR0cmlidXRlVmFsdWUoKQorICAgIFJlYWRJbm5lclhtbCgpCisgICAgUmVhZE91dGVyWG1sKCkKKyAgICBSZWFkU3RhdGUoKQorICAgIFJlYWRTdHJpbmcoKQorICAgIFJlbGF4TkdTZXRTY2hlbWEoKQorICAgIFJlbGF4TkdWYWxpZGF0ZSgpCisgICAgU2V0UGFyc2VyUHJvcCgpCisgICAgU3RyaW5nKCkKKyAgICBWYWx1ZSgpCisgICAgWG1sTGFuZygpCisKKworQ2xhc3MgeG1sRW50aXR5KHhtbE5vZGUpCisKKyAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSBwYXJzZXJJbnRlcm5hbHMKKyAgICBoYW5kbGVFbnRpdHkoKQorQ2xhc3MgRXJyb3IoKQorICAgICMgYWNjZXNzb3JzCisgICAgY29kZSgpCisgICAgZG9tYWluKCkKKyAgICBmaWxlKCkKKyAgICBsZXZlbCgpCisgICAgbGluZSgpCisgICAgbWVzc2FnZSgpCisKKyAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4bWxlcnJvcgorICAgIGNvcHlFcnJvcigpCisgICAgcmVzZXRFcnJvcigpCitDbGFzcyByZWxheE5nU2NoZW1hKCkKKworICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIHJlbGF4bmcKKyAgICByZWxheE5HRHVtcCgpCisgICAgcmVsYXhOR0R1bXBUcmVlKCkKKyAgICByZWxheE5HTmV3VmFsaWRDdHh0KCkKKworICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIHhtbHJlYWRlcgorICAgIFJlbGF4TkdTZXRTY2hlbWEoKQorCisKK0NsYXNzIGlucHV0QnVmZmVyKGlvUmVhZFdyYXBwZXIpCisKKyAgICAjIGZ1bmN0aW9ucyBmcm9tIG1vZHVsZSB4bWxJTworICAgIGdyb3coKQorICAgIHB1c2goKQorICAgIHJlYWQoKQorCisgICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgeG1scmVhZGVyCisgICAgbmV3VGV4dFJlYWRlcigpCisKKworQ2xhc3Mgb3V0cHV0QnVmZmVyKGlvV3JpdGVXcmFwcGVyKQorCisgICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgSFRNTHRyZWUKKyAgICBodG1sRG9jQ29udGVudER1bXBGb3JtYXRPdXRwdXQoKQorICAgIGh0bWxEb2NDb250ZW50RHVtcE91dHB1dCgpCisgICAgaHRtbE5vZGVEdW1wRm9ybWF0T3V0cHV0KCkKKyAgICBodG1sTm9kZUR1bXBPdXRwdXQoKQorCisgICAgIyBmdW5jdGlvbnMgZnJvbSBtb2R1bGUgdHJlZQorICAgIG5vZGVEdW1wT3V0cHV0KCkKKyAgICBzYXZlRmlsZVRvKCkKKyAgICBzYXZlRm9ybWF0RmlsZVRvKCkKKworICAgICMgZnVuY3Rpb25zIGZyb20gbW9kdWxlIHhtbElPCisgICAgd3JpdGUoKQorICAgIHdyaXRlU3RyaW5nKCkKZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2FsbF8wXzMuZXJyIGIvcmVzdWx0L3NjaGVtYXMvYWxsXzBfMy5lcnIKaW5kZXggZGRjMzc4NS4uYmVkNWZhYSAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvYWxsXzBfMy5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvYWxsXzBfMy5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2FsbF8zLnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgZG9jIGNvbnRlbnQgY2hlY2sgZmFpbGVkCisuL3Rlc3Qvc2NoZW1hcy9hbGxfMy54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCAnZG9jJzogVGhlIGVsZW1lbnQgY29udGVudCBpcyBub3QgdmFsaWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9hbGxfMF80LmVyciBiL3Jlc3VsdC9zY2hlbWFzL2FsbF8wXzQuZXJyCmluZGV4IGM1ZDg3NjEuLjhlYzc0NDUgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2FsbF8wXzQuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2FsbF8wXzQuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9hbGxfNC54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50IGRvYyBjb250ZW50IGNoZWNrIGZhaWxlZAorLi90ZXN0L3NjaGVtYXMvYWxsXzQueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ2RvYyc6IFRoZSBlbGVtZW50IGNvbnRlbnQgaXMgbm90IHZhbGlkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvYWxsXzBfNS5lcnIgYi9yZXN1bHQvc2NoZW1hcy9hbGxfMF81LmVycgppbmRleCA1NDRhOWE1Li44ZmI4ZjNmIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9hbGxfMF81LmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9hbGxfMF81LmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvYWxsXzUueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCBkb2MgY29udGVudCBjaGVjayBmYWlsZWQKKy4vdGVzdC9zY2hlbWFzL2FsbF81LnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdkb2MnOiBUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2FsbF8wXzYuZXJyIGIvcmVzdWx0L3NjaGVtYXMvYWxsXzBfNi5lcnIKaW5kZXggZjM4Zjc3OC4uMTBjMjVjNCAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvYWxsXzBfNi5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvYWxsXzBfNi5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2FsbF82LnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgZG9jIGNvbnRlbnQgY2hlY2sgZmFpbGVkCisuL3Rlc3Qvc2NoZW1hcy9hbGxfNi54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCAnZG9jJzogVGhlIGVsZW1lbnQgY29udGVudCBpcyBub3QgdmFsaWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9hbGxfMF83LmVyciBiL3Jlc3VsdC9zY2hlbWFzL2FsbF8wXzcuZXJyCmluZGV4IDVlNDBkZjAuLjllMTA4MzAgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2FsbF8wXzcuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2FsbF8wXzcuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9hbGxfNy54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50IGRvYyBjb250ZW50IGNoZWNrIGZhaWxlZAorLi90ZXN0L3NjaGVtYXMvYWxsXzcueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ2RvYyc6IFRoZSBlbGVtZW50IGNvbnRlbnQgaXMgbm90IHZhbGlkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvYWxsXzFfNS5lcnIgYi9yZXN1bHQvc2NoZW1hcy9hbGxfMV81LmVycgppbmRleCA1NDRhOWE1Li44ZmI4ZjNmIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9hbGxfMV81LmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9hbGxfMV81LmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvYWxsXzUueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCBkb2MgY29udGVudCBjaGVjayBmYWlsZWQKKy4vdGVzdC9zY2hlbWFzL2FsbF81LnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdkb2MnOiBUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2FsbF8yXzAuZXJyIGIvcmVzdWx0L3NjaGVtYXMvYWxsXzJfMC5lcnIKaW5kZXggODQxNjEyNC4uMDJhMTM3MSAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvYWxsXzJfMC5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvYWxsXzJfMC5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2FsbF8wLnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgZG9jIGNvbnRlbnQgY2hlY2sgZmFpbGVkCisuL3Rlc3Qvc2NoZW1hcy9hbGxfMC54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCAnZG9jJzogVGhlIGVsZW1lbnQgY29udGVudCBpcyBub3QgdmFsaWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9hbGxfMl8xLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2FsbF8yXzEuZXJyCmluZGV4IDEyOTU5NWYuLmM3MjExYzggMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2FsbF8yXzEuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2FsbF8yXzEuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9hbGxfMS54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50IGRvYyBjb250ZW50IGNoZWNrIGZhaWxlZAorLi90ZXN0L3NjaGVtYXMvYWxsXzEueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ2RvYyc6IFRoZSBlbGVtZW50IGNvbnRlbnQgaXMgbm90IHZhbGlkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvYWxsXzJfMi5lcnIgYi9yZXN1bHQvc2NoZW1hcy9hbGxfMl8yLmVycgppbmRleCBjM2UwNDgyLi4wZGUxMmU1IDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9hbGxfMl8yLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9hbGxfMl8yLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvYWxsXzIueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCBkb2MgY29udGVudCBjaGVjayBmYWlsZWQKKy4vdGVzdC9zY2hlbWFzL2FsbF8yLnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdkb2MnOiBUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2FsbF8yXzQuZXJyIGIvcmVzdWx0L3NjaGVtYXMvYWxsXzJfNC5lcnIKaW5kZXggYzVkODc2MS4uOGVjNzQ0NSAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvYWxsXzJfNC5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvYWxsXzJfNC5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2FsbF80LnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgZG9jIGNvbnRlbnQgY2hlY2sgZmFpbGVkCisuL3Rlc3Qvc2NoZW1hcy9hbGxfNC54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCAnZG9jJzogVGhlIGVsZW1lbnQgY29udGVudCBpcyBub3QgdmFsaWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9hbGxfMl81LmVyciBiL3Jlc3VsdC9zY2hlbWFzL2FsbF8yXzUuZXJyCmluZGV4IDU0NGE5YTUuLjhmYjhmM2YgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2FsbF8yXzUuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2FsbF8yXzUuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9hbGxfNS54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50IGRvYyBjb250ZW50IGNoZWNrIGZhaWxlZAorLi90ZXN0L3NjaGVtYXMvYWxsXzUueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ2RvYyc6IFRoZSBlbGVtZW50IGNvbnRlbnQgaXMgbm90IHZhbGlkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvYW5ub3QtZXJyXzBfMCBiL3Jlc3VsdC9zY2hlbWFzL2Fubm90LWVycl8wXzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2Fubm90LWVycl8wXzAKZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2Fubm90LWVycl8wXzAuZXJyIGIvcmVzdWx0L3NjaGVtYXMvYW5ub3QtZXJyXzBfMC5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1YTY2OAotLS0gL2Rldi9udWxsCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2Fubm90LWVycl8wXzAuZXJyCkBAIC0wLDAgKzEsNyBAQAorLi90ZXN0L3NjaGVtYXMvYW5ub3QtZXJyXzAueHNkOjc6IGVsZW1lbnQgYW5ub3RhdGlvbjogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdhbm5vdGF0aW9uJzogVGhlIGF0dHJpYnV0ZSAnZGVhdGgnIGlzIG5vdCBhbGxvd2VkLgorLi90ZXN0L3NjaGVtYXMvYW5ub3QtZXJyXzAueHNkOjc6IGVsZW1lbnQgYW5ub3RhdGlvbjogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdhbm5vdGF0aW9uJzogVGhlIGNvbnRlbnQgaXMgbm90IHZhbGlkLiBFeHBlY3RlZCBpcyAoYXBwaW5mbyB8IGRvY3VtZW50YXRpb24pKi4KKy4vdGVzdC9zY2hlbWFzL2Fubm90LWVycl8wLnhzZDoxMDogZWxlbWVudCBhcHBpbmZvOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ2FwcGluZm8nOiBUaGUgYXR0cmlidXRlICdpZCcgaXMgbm90IGFsbG93ZWQuCisuL3Rlc3Qvc2NoZW1hcy9hbm5vdC1lcnJfMC54c2Q6MTA6IGVsZW1lbnQgYXBwaW5mbzogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdhcHBpbmZvJzogVGhlIGF0dHJpYnV0ZSAnZnVuJyBpcyBub3QgYWxsb3dlZC4KKy4vdGVzdC9zY2hlbWFzL2Fubm90LWVycl8wLnhzZDoxNDogZWxlbWVudCBkb2N1bWVudGF0aW9uOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ2RvY3VtZW50YXRpb24nOiBUaGUgYXR0cmlidXRlICdpZCcgaXMgbm90IGFsbG93ZWQuCisuL3Rlc3Qvc2NoZW1hcy9hbm5vdC1lcnJfMC54c2Q6MTQ6IGVsZW1lbnQgZG9jdW1lbnRhdGlvbjogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdkb2N1bWVudGF0aW9uJzogVGhlIGF0dHJpYnV0ZSAnbW90aGVycycgaXMgbm90IGFsbG93ZWQuCisuL3Rlc3Qvc2NoZW1hcy9hbm5vdC1lcnJfMC54c2Q6MTQ6IGVsZW1lbnQgZG9jdW1lbnRhdGlvbjogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdkb2N1bWVudGF0aW9uJywgYXR0cmlidXRlICd4bWw6bGFuZycgWydsYW5ndWFnZSddOiBUaGUgdmFsdWUgJyonIGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2FueTFfMF8wIGIvcmVzdWx0L3NjaGVtYXMvYW55MV8wXzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlYzBmYwotLS0gL2Rldi9udWxsCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2FueTFfMF8wCkBAIC0wLDAgKzEgQEAKKy4vdGVzdC9zY2hlbWFzL2FueTFfMC54bWwgdmFsaWRhdGVzCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9hbnkxXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9hbnkxXzBfMC5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2FueTFfMF8wLmVycgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvYW55Ml8wXzAgYi9yZXN1bHQvc2NoZW1hcy9hbnkyXzBfMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY3M2I4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVzdWx0L3NjaGVtYXMvYW55Ml8wXzAKQEAgLTAsMCArMSBAQAorLi90ZXN0L3NjaGVtYXMvYW55Ml8wLnhtbCB2YWxpZGF0ZXMKZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2FueTJfMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2FueTJfMF8wLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVzdWx0L3NjaGVtYXMvYW55Ml8wXzAuZXJyCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9hbnkzXzBfMCBiL3Jlc3VsdC9zY2hlbWFzL2FueTNfMF8wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OGFmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9yZXN1bHQvc2NoZW1hcy9hbnkzXzBfMApAQCAtMCwwICsxIEBACisuL3Rlc3Qvc2NoZW1hcy9hbnkzXzAueG1sIGZhaWxzIHRvIHZhbGlkYXRlCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9hbnkzXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9hbnkzXzBfMC5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0ZDcyNwotLS0gL2Rldi9udWxsCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2FueTNfMF8wLmVycgpAQCAtMCwwICsxIEBACisuL3Rlc3Qvc2NoZW1hcy9hbnkzXzAueG1sOjEwOiBlbGVtZW50IGZvbzogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdmb286Zm9vJzogVGhlIGVsZW1lbnQgY29udGVudCBpcyBub3QgdmFsaWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9hbnk0XzBfMCBiL3Jlc3VsdC9zY2hlbWFzL2FueTRfMF8wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZWE0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9yZXN1bHQvc2NoZW1hcy9hbnk0XzBfMApAQCAtMCwwICsxIEBACisuL3Rlc3Qvc2NoZW1hcy9hbnk0XzAueG1sIHZhbGlkYXRlcwpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvYW55NF8wXzAuZXJyIGIvcmVzdWx0L3NjaGVtYXMvYW55NF8wXzAuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9yZXN1bHQvc2NoZW1hcy9hbnk0XzBfMC5lcnIKZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2FueUF0dHItcHJvY2Vzc0NvbnRlbnRzLWVycjFfMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2FueUF0dHItcHJvY2Vzc0NvbnRlbnRzLWVycjFfMF8wLmVycgppbmRleCBiMDllMjY4Li44NGIzYzk4IDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9hbnlBdHRyLXByb2Nlc3NDb250ZW50cy1lcnIxXzBfMC5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvYW55QXR0ci1wcm9jZXNzQ29udGVudHMtZXJyMV8wXzAuZXJyCkBAIC0xLDMgKzEsMiBAQAotLi90ZXN0L3NjaGVtYXMvYW55QXR0ci1wcm9jZXNzQ29udGVudHMtZXJyMV8wLnhtbDoxMTogZWxlbWVudCBlbGVtLmxheDogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IFRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuCi0uL3Rlc3Qvc2NoZW1hcy9hbnlBdHRyLXByb2Nlc3NDb250ZW50cy1lcnIxXzAueG1sOjExOiBlbGVtZW50IGVsZW0ubGF4OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogQXR0cmlidXRlICJiYXIiOiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLgotLi90ZXN0L3NjaGVtYXMvYW55QXR0ci1wcm9jZXNzQ29udGVudHMtZXJyMV8wLnhtbDoxMjogZWxlbWVudCBlbGVtLnN0cmljdDogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEF0dHJpYnV0ZSAiYmFyQiIgaXMgbm90IGFsbG93ZWQuCisuL3Rlc3Qvc2NoZW1hcy9hbnlBdHRyLXByb2Nlc3NDb250ZW50cy1lcnIxXzAueG1sOjExOiBlbGVtZW50IGVsZW0ubGF4OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCAnZWxlbS5sYXgnLCBhdHRyaWJ1dGUgJ2ZvbzpiYXInIFsnbGFuZ3VhZ2UnXTogVGhlIHZhbHVlICdvIG8nIGlzIG5vdCB2YWxpZC4KKy4vdGVzdC9zY2hlbWFzL2FueUF0dHItcHJvY2Vzc0NvbnRlbnRzLWVycjFfMC54bWw6MTI6IGVsZW1lbnQgZWxlbS5zdHJpY3Q6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50ICdlbGVtLnN0cmljdCc6IFRoZSBhdHRyaWJ1dGUgJ2ZvbzpiYXJCJyBpcyBub3QgYWxsb3dlZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2F0dHJ1c2VfMF8xLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2F0dHJ1c2VfMF8xLmVycgppbmRleCAxOWVmNzJhLi4wODVmNWJhIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9hdHRydXNlXzBfMS5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvYXR0cnVzZV8wXzEuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9hdHRydXNlXzBfMS54bWw6MzogZWxlbWVudCBiYXJBOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogQXR0cmlidXRlICJhdHRyIiBpcyByZXF1aXJlZCBidXQgbWlzc2luZy4KKy4vdGVzdC9zY2hlbWFzL2F0dHJ1c2VfMF8xLnhtbDozOiBlbGVtZW50IGJhckE6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50ICdiYXJBJzogVGhlIGF0dHJpYnV0ZSB7J2F0dHInfSBpcyByZXF1aXJlZCBidXQgbWlzc2luZy4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2F0dHJ1c2VfMF8yLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2F0dHJ1c2VfMF8yLmVycgppbmRleCBkNjhkYjdiLi41ODUyYmM4IDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9hdHRydXNlXzBfMi5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvYXR0cnVzZV8wXzIuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9hdHRydXNlXzBfMi54bWw6NjogZWxlbWVudCBiYXJDOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogQXR0cmlidXRlICJhdHRyIiBpcyBub3QgYWxsb3dlZC4KKy4vdGVzdC9zY2hlbWFzL2F0dHJ1c2VfMF8yLnhtbDo2OiBlbGVtZW50IGJhckM6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50ICdiYXJDJzogVGhlIGF0dHJpYnV0ZSAnYXR0cicgaXMgbm90IGFsbG93ZWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9idWcxNDEzMzNfMF8wIGIvcmVzdWx0L3NjaGVtYXMvYnVnMTQxMzMzXzBfMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODk2NjBmCi0tLSAvZGV2L251bGwKKysrIGIvcmVzdWx0L3NjaGVtYXMvYnVnMTQxMzMzXzBfMApAQCAtMCwwICsxIEBACisuL3Rlc3Qvc2NoZW1hcy9idWcxNDEzMzNfMC54bWwgdmFsaWRhdGVzCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9idWcxNDEzMzNfMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2J1ZzE0MTMzM18wXzAuZXJyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9yZXN1bHQvc2NoZW1hcy9idWcxNDEzMzNfMF8wLmVycgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvYnVnMTQ1MjQ2XzBfMCBiL3Jlc3VsdC9zY2hlbWFzL2J1ZzE0NTI0Nl8wXzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2J1ZzE0NTI0Nl8wXzAKZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2J1ZzE0NTI0Nl8wXzAuZXJyIGIvcmVzdWx0L3NjaGVtYXMvYnVnMTQ1MjQ2XzBfMC5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyOWM0OQotLS0gL2Rldi9udWxsCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2J1ZzE0NTI0Nl8wXzAuZXJyCkBAIC0wLDAgKzEsMyBAQAorSS9PIHdhcm5pbmcgOiBmYWlsZWQgdG8gbG9hZCBleHRlcm5hbCBlbnRpdHkgInRlc3Qvc2NoZW1hcy9idWcxNDUyNDYueHNkLmltcCIKK1NjaGVtYXMgcGFyc2VyIGVycm9yIDogeG1sU2NoZW1hUGFyc2U6IGNvdWxkIG5vdCBsb2FkICd0ZXN0L3NjaGVtYXMvYnVnMTQ1MjQ2LnhzZC5pbXAnLgorU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBGYWlsZWQgdG8gaW1wb3J0IHNjaGVtYSBmcm9tIGxvY2F0aW9uICJ0ZXN0L3NjaGVtYXMvYnVnMTQ1MjQ2LnhzZC5pbXAiLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzBfMi5lcnIgYi9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMF8yLmVycgppbmRleCA2YWJkNTE1Li4zMjdhM2FkIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMF8yLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMF8yLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvY2hvaWNlXzIueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCBkb2MgY29udGVudCBjaGVjayBmYWlsZWQKKy4vdGVzdC9zY2hlbWFzL2Nob2ljZV8yLnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdkb2MnOiBUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8wXzMuZXJyIGIvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzBfMy5lcnIKaW5kZXggMTQ5Zjk2OS4uOTYyMGQ3MiAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzBfMy5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzBfMy5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2Nob2ljZV8zLnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgZG9jIGNvbnRlbnQgY2hlY2sgZmFpbGVkCisuL3Rlc3Qvc2NoZW1hcy9jaG9pY2VfMy54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCAnZG9jJzogVGhlIGVsZW1lbnQgY29udGVudCBpcyBub3QgdmFsaWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMF80LmVyciBiL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8wXzQuZXJyCmluZGV4IDg4NDM3NjguLmRmY2U3NDYgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8wXzQuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8wXzQuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9jaG9pY2VfNC54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50IGRvYyBjb250ZW50IGNoZWNrIGZhaWxlZAorLi90ZXN0L3NjaGVtYXMvY2hvaWNlXzQueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ2RvYyc6IFRoZSBlbGVtZW50IGNvbnRlbnQgaXMgbm90IHZhbGlkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzBfNS5lcnIgYi9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMF81LmVycgppbmRleCA4ODYxZTk5Li4wZmIzM2IwIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMF81LmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMF81LmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvY2hvaWNlXzUueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCBkb2MgY29udGVudCBjaGVjayBmYWlsZWQKKy4vdGVzdC9zY2hlbWFzL2Nob2ljZV81LnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdkb2MnOiBUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8wXzYuZXJyIGIvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzBfNi5lcnIKaW5kZXggZmZhNDc2YS4uODY4ZTU4NiAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzBfNi5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzBfNi5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2Nob2ljZV82LnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgZG9jIGNvbnRlbnQgY2hlY2sgZmFpbGVkCisuL3Rlc3Qvc2NoZW1hcy9jaG9pY2VfNi54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCAnZG9jJzogVGhlIGVsZW1lbnQgY29udGVudCBpcyBub3QgdmFsaWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMV8yLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8xXzIuZXJyCmluZGV4IDZhYmQ1MTUuLjMyN2EzYWQgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8xXzIuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8xXzIuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9jaG9pY2VfMi54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50IGRvYyBjb250ZW50IGNoZWNrIGZhaWxlZAorLi90ZXN0L3NjaGVtYXMvY2hvaWNlXzIueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ2RvYyc6IFRoZSBlbGVtZW50IGNvbnRlbnQgaXMgbm90IHZhbGlkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzFfMy5lcnIgYi9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMV8zLmVycgppbmRleCAxNDlmOTY5Li45NjIwZDcyIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMV8zLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMV8zLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvY2hvaWNlXzMueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCBkb2MgY29udGVudCBjaGVjayBmYWlsZWQKKy4vdGVzdC9zY2hlbWFzL2Nob2ljZV8zLnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdkb2MnOiBUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8xXzUuZXJyIGIvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzFfNS5lcnIKaW5kZXggODg2MWU5OS4uMGZiMzNiMCAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzFfNS5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzFfNS5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2Nob2ljZV81LnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgZG9jIGNvbnRlbnQgY2hlY2sgZmFpbGVkCisuL3Rlc3Qvc2NoZW1hcy9jaG9pY2VfNS54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCAnZG9jJzogVGhlIGVsZW1lbnQgY29udGVudCBpcyBub3QgdmFsaWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMV82LmVyciBiL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8xXzYuZXJyCmluZGV4IGZmYTQ3NmEuLjg2OGU1ODYgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8xXzYuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8xXzYuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9jaG9pY2VfNi54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50IGRvYyBjb250ZW50IGNoZWNrIGZhaWxlZAorLi90ZXN0L3NjaGVtYXMvY2hvaWNlXzYueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ2RvYyc6IFRoZSBlbGVtZW50IGNvbnRlbnQgaXMgbm90IHZhbGlkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzJfNC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMl80LmVycgppbmRleCA4ODQzNzY4Li5kZmNlNzQ2IDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMl80LmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9jaG9pY2VfMl80LmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvY2hvaWNlXzQueG1sOjE6IGVsZW1lbnQgZG9jOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCBkb2MgY29udGVudCBjaGVjayBmYWlsZWQKKy4vdGVzdC9zY2hlbWFzL2Nob2ljZV80LnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50ICdkb2MnOiBUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2Nob2ljZV8yXzYuZXJyIGIvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzJfNi5lcnIKaW5kZXggZmZhNDc2YS4uODY4ZTU4NiAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzJfNi5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvY2hvaWNlXzJfNi5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2Nob2ljZV82LnhtbDoxOiBlbGVtZW50IGRvYzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgZG9jIGNvbnRlbnQgY2hlY2sgZmFpbGVkCisuL3Rlc3Qvc2NoZW1hcy9jaG9pY2VfNi54bWw6MTogZWxlbWVudCBkb2M6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCAnZG9jJzogVGhlIGVsZW1lbnQgY29udGVudCBpcyBub3QgdmFsaWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9jb3Mtc3QtcmVzdHJpY3RzLTEtMi1lcnJfMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2Nvcy1zdC1yZXN0cmljdHMtMS0yLWVycl8wXzAuZXJyCmluZGV4IDQ0YTVjYmEuLjg4Mjg4ZDEgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2Nvcy1zdC1yZXN0cmljdHMtMS0yLWVycl8wXzAuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2Nvcy1zdC1yZXN0cmljdHMtMS0yLWVycl8wXzAuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9jb3Mtc3QtcmVzdHJpY3RzLTEtMi1lcnJfMC54bWw6MzogZWxlbWVudCBmb286IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBUaGUgdmFsdWUgd2l0aCBsZW5ndGggIjIiIGlzIG5vdCBmYWNldC12YWxpZCB3aXRoIHJlc3BlY3QgdG8gbGVuZ3RoID0gIjMiLgorLi90ZXN0L3NjaGVtYXMvY29zLXN0LXJlc3RyaWN0cy0xLTItZXJyXzAueG1sOjM6IGVsZW1lbnQgZm9vOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCAnZm9vJyBbU1QgJ3R5cGUuQScsIGZhY2V0ICdsZW5ndGgnXTogVGhlIHZhbHVlIGhhcyBhIGxlbmd0aCBvZiAnMic7IHRoaXMgZGlmZmVycyBmcm9tIHRoZSBhbGxvd2VkIGxlbmd0aCBvZiAnMycuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLWV4dGVuc2lvbi1lcnJfMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2Rlcml2YXRpb24tb2stZXh0ZW5zaW9uLWVycl8wXzAuZXJyCmluZGV4IGJhN2MyYTguLjE1YjRhZTAgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2Rlcml2YXRpb24tb2stZXh0ZW5zaW9uLWVycl8wXzAuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2Rlcml2YXRpb24tb2stZXh0ZW5zaW9uLWVycl8wXzAuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLWV4dGVuc2lvbi1lcnJfMC54c2Q6MTc6IGVsZW1lbnQgYXR0cmlidXRlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IGN0LXByb3BzLWNvcnJlY3QuNDogRHVwbGljYXRlIGF0dHJpYnV0ZSB1c2Ugd2l0aCB0aGUgbmFtZSAiYmFyQV8xIiBzcGVjaWZpZWQKKy4vdGVzdC9zY2hlbWFzL2Rlcml2YXRpb24tb2stZXh0ZW5zaW9uLWVycl8wLnhzZDo2OiBlbGVtZW50IGNvbXBsZXhUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IENUIGxvY2FsLCBhdHRyLiB1c2UgeydiYXJBXzEnfTogRHVwbGljYXRlIGF0dHJpYnV0ZSB1c2Ugc3BlY2lmaWVkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1leHRlbnNpb25fMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2Rlcml2YXRpb24tb2stZXh0ZW5zaW9uXzBfMC5lcnIKaW5kZXggODA2NGZkMi4uMGM1OGFiNSAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1leHRlbnNpb25fMF8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLWV4dGVuc2lvbl8wXzAuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLWV4dGVuc2lvbl8wLnhzZDoxNzogZWxlbWVudCBhdHRyaWJ1dGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogY3QtcHJvcHMtY29ycmVjdC40OiBEdXBsaWNhdGUgYXR0cmlidXRlIHVzZSB3aXRoIHRoZSBuYW1lICJiYXJBXzEiIHNwZWNpZmllZAorLi90ZXN0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1leHRlbnNpb25fMC54c2Q6NjogZWxlbWVudCBjb21wbGV4VHlwZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBDVCBsb2NhbCwgYXR0ci4gdXNlIHsnYmFyQV8xJ306IER1cGxpY2F0ZSBhdHRyaWJ1dGUgdXNlIHNwZWNpZmllZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2Rlcml2YXRpb24tb2stcmVzdHJpY3Rpb24tMi0xLTFfMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2Rlcml2YXRpb24tb2stcmVzdHJpY3Rpb24tMi0xLTFfMF8wLmVycgppbmRleCBkMDA2NjIwLi40YTY5Y2QwIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTItMS0xXzBfMC5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi0yLTEtMV8wXzAuZXJyCkBAIC0xLDYgKzEsNiBAQAotLi90ZXN0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi0yLTEtMV8wLnhzZDoxNjogZWxlbWVudCBhdHRyaWJ1dGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi4yLjEuMTogVGhlICJvcHRpb25hbCIgYXR0cmlidXRlIHVzZSAiYmFyQl8xIiBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIG1hdGNoaW5nICJyZXF1aXJlZCIgYXR0cmlidXRlIHVzZSBvZiB0aGUgYmFzZSB0eXBlCi0uL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTItMS0xXzAueHNkOjIwOiBlbGVtZW50IGF0dHJpYnV0ZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBkZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLjM6IFRoZSAicmVxdWlyZWQiIGF0dHJpYnV0ZSB1c2UgImJhckJfMyIgb2YgdGhlIGJhc2UgdHlwZSBkb2VzIG5vdCBoYXZlIGEgbWF0Y2hpbmcgYXR0cmlidXRlIHVzZSBpbiB0aGUgZGVyaXZlZCB0eXBlCi0uL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTItMS0xXzAueHNkOjIzOiBlbGVtZW50IGF0dHJpYnV0ZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBkZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLjIuMjogVGhlIGF0dHJpYnV0ZSB1c2UgImJhckNfMSIgaGFzIG5laXRoZXIgYSBtYXRjaGluZyBhdHRyaWJ1dGUgdXNlLCBub3IgYSBtYXRjaGluZyB3aWxkY2FyZCBpbiB0aGUgYmFzZSB0eXBlCi0uL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTItMS0xXzAueHNkOjI1OiBlbGVtZW50IGF0dHJpYnV0ZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBkZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLjIuMjogVGhlIGF0dHJpYnV0ZSB1c2UgImJhckNfMiIgaGFzIG5laXRoZXIgYSBtYXRjaGluZyBhdHRyaWJ1dGUgdXNlLCBub3IgYSBtYXRjaGluZyB3aWxkY2FyZCBpbiB0aGUgYmFzZSB0eXBlCi0uL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTItMS0xXzAueHNkOjMwOiBlbGVtZW50IGF0dHJpYnV0ZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBkZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLjIuMjogVGhlIGF0dHJpYnV0ZSB1c2UgImJhckRfMSIgaGFzIG5laXRoZXIgYSBtYXRjaGluZyBhdHRyaWJ1dGUgdXNlLCBub3IgYSBtYXRjaGluZyB3aWxkY2FyZCBpbiB0aGUgYmFzZSB0eXBlCi0uL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTItMS0xXzAueHNkOjMyOiBlbGVtZW50IGF0dHJpYnV0ZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBkZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLjIuMjogVGhlIGF0dHJpYnV0ZSB1c2UgImJhckRfMiIgaGFzIG5laXRoZXIgYSBtYXRjaGluZyBhdHRyaWJ1dGUgdXNlLCBub3IgYSBtYXRjaGluZyB3aWxkY2FyZCBpbiB0aGUgYmFzZSB0eXBlCisuL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTItMS0xXzAueHNkOjY6IGVsZW1lbnQgY29tcGxleFR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogQ1QgbG9jYWwsIGF0dHIuIHVzZSB7J2JhckJfMSd9OiBUaGUgJ29wdGlvbmFsJyB1c2UgaXMgaW5jb25zaXN0ZW50IHdpdGggYSBtYXRjaGluZyAncmVxdWlyZWQnIHVzZSBvZiB0aGUgYmFzZSB0eXBlLgorLi90ZXN0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi0yLTEtMV8wLnhzZDo2OiBlbGVtZW50IGNvbXBsZXhUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IENUIGxvY2FsOiBBIG1hdGNoaW5nIGF0dHJpYnV0ZSB1c2UgZm9yIHRoZSAncmVxdWlyZWQnIGF0dHJpYnV0ZSB1c2UgeydiYXJCXzMnfSBvZiB0aGUgYmFzZSB0eXBlIGlzIG1pc3NpbmcuCisuL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTItMS0xXzAueHNkOjY6IGVsZW1lbnQgY29tcGxleFR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogQ1QgbG9jYWwsIGF0dHIuIHVzZSB7J2JhckNfMSd9OiBOZWl0aGVyIGEgbWF0Y2hpbmcgYXR0cmlidXRlIHVzZSwgbm9yIGEgbWF0Y2hpbmcgd2lsZGNhcmQgaW4gdGhlIGJhc2UgdHlwZSBkb2VzIGV4aXN0LgorLi90ZXN0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi0yLTEtMV8wLnhzZDo2OiBlbGVtZW50IGNvbXBsZXhUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IENUIGxvY2FsLCBhdHRyLiB1c2UgeydiYXJDXzInfTogTmVpdGhlciBhIG1hdGNoaW5nIGF0dHJpYnV0ZSB1c2UsIG5vciBhIG1hdGNoaW5nIHdpbGRjYXJkIGluIHRoZSBiYXNlIHR5cGUgZG9lcyBleGlzdC4KKy4vdGVzdC9zY2hlbWFzL2Rlcml2YXRpb24tb2stcmVzdHJpY3Rpb24tMi0xLTFfMC54c2Q6NjogZWxlbWVudCBjb21wbGV4VHlwZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBDVCBsb2NhbCwgYXR0ci4gdXNlIHsnYmFyRF8xJ306IE5laXRoZXIgYSBtYXRjaGluZyBhdHRyaWJ1dGUgdXNlLCBub3IgYSBtYXRjaGluZyB3aWxkY2FyZCBpbiB0aGUgYmFzZSB0eXBlIGRvZXMgZXhpc3QuCisuL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTItMS0xXzAueHNkOjY6IGVsZW1lbnQgY29tcGxleFR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogQ1QgbG9jYWwsIGF0dHIuIHVzZSB7J2JhckRfMid9OiBOZWl0aGVyIGEgbWF0Y2hpbmcgYXR0cmlidXRlIHVzZSwgbm9yIGEgbWF0Y2hpbmcgd2lsZGNhcmQgaW4gdGhlIGJhc2UgdHlwZSBkb2VzIGV4aXN0LgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi00LTEtZXJyXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTQtMS1lcnJfMF8wLmVycgppbmRleCA0MTE3MzUzLi4yN2ZmM2I4IDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTQtMS1lcnJfMF8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTQtMS1lcnJfMF8wLmVycgpAQCAtMSwzICsxLDMgQEAKLS4vdGVzdC9zY2hlbWFzL2Rlcml2YXRpb24tb2stcmVzdHJpY3Rpb24tNC0xLWVycl8wLnhzZDozMzogZWxlbWVudCBjb21wbGV4VHlwZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBUaGUgZGVyaXZlZCB0eXBlICJ0eXBlLkEiIGhhcyBhbiBhdHRyaWJ1dGUgd2lsZGNhcmQsIGJ1dCB0aGUgYmFzZSB0eXBlICJiYXNlLnR5cGUuQSIgZG9lcyBub3QgaGF2ZSBvbmUuCi0uL3Rlc3Qvc2NoZW1hcy9kZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLTQtMS1lcnJfMC54c2Q6NDU6IGVsZW1lbnQgY29tcGxleFR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogVGhlIHdpbGRjYXJkIGluIHRoZSBkZXJpdmVkIHR5cGUgInR5cGUuQiIgaXMgbm90IGEgdmFsaWQgc3Vic2V0IG9mIHRoZSBvbmUgaW4gdGhlIGJhc2UgdHlwZSAiYmFzZS50eXBlLkIiLgotLi90ZXN0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi00LTEtZXJyXzAueHNkOjU3OiBlbGVtZW50IGNvbXBsZXhUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IFRoZSBwcm9jZXNzIGNvbnRlbnRzIG9mIHRoZSB3aWxkY2FyZCBpbiB0aGUgZGVyaXZlZCB0eXBlICJ0eXBlLkMiIGlzIHdlYWtlciB0aGFuIHRoYXQgaW4gdGhlIGJhc2UgdHlwZSAiYmFzZS50eXBlLkMiLgorLi90ZXN0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi00LTEtZXJyXzAueHNkOjMzOiBlbGVtZW50IGNvbXBsZXhUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IENUICd0eXBlLkEnOiBUaGUgdHlwZSBoYXMgYW4gYXR0cmlidXRlIHdpbGRjYXJkLCBidXQgdGhlIGJhc2UgdHlwZSBDVCAnYmFzZS50eXBlLkEnIGRvZXMgbm90IGhhdmUgb25lLgorLi90ZXN0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi00LTEtZXJyXzAueHNkOjQ1OiBlbGVtZW50IGNvbXBsZXhUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IENUICd0eXBlLkInOiBUaGUgYXR0cmlidXRlIHdpbGRjYXJkIGlzIG5vdCBhIHZhbGlkIHN1YnNldCBvZiB0aGUgd2lsZGNhcmQgaW4gdGhlIGJhc2UgdHlwZSBDVCAnYmFzZS50eXBlLkInLgorLi90ZXN0L3NjaGVtYXMvZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi00LTEtZXJyXzAueHNkOjU3OiBlbGVtZW50IGNvbXBsZXhUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IENUICd0eXBlLkMnOiBUaGUgJ3Byb2Nlc3MgY29udGVudHMnIG9mIHRoZSBhdHRyaWJ1dGUgd2lsZGNhcmQgaXMgd2Vha2VyIHRoYW4gdGhlIG9uZSBpbiB0aGUgYmFzZSB0eXBlIENUICdiYXNlLnR5cGUuQycuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9kZXRlcjBfMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2RldGVyMF8wXzAuZXJyCmluZGV4IGNjNDJjM2IuLmY5MDhhNTEgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2RldGVyMF8wXzAuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2RldGVyMF8wXzAuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9kZXRlcjBfMC54c2Q6NTogZWxlbWVudCBlbGVtZW50OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IENvbnRlbnQgbW9kZWwgb2YgYm9vayBpcyBub3QgZGV0ZXJtaW5pc3Q6CisuL3Rlc3Qvc2NoZW1hcy9kZXRlcjBfMC54c2Q6NTogZWxlbWVudCBlbGVtZW50OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgZGVjbC4gJ2Jvb2snOiBUaGUgY29udGVudCBtb2RlbCBpcyBub3QgZGV0ZXJtaW5pc3QuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9lbGVtZW50LWVycl8wXzAgYi9yZXN1bHQvc2NoZW1hcy9lbGVtZW50LWVycl8wXzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzBfMApkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvZWxlbWVudC1lcnJfMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzBfMC5lcnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmZDFmMQotLS0gL2Rldi9udWxsCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzBfMC5lcnIKQEAgLTAsMCArMSwyMCBAQAorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54c2Q6ODogZWxlbWVudCBlbGVtZW50OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgZGVjbC46IFRoZSBhdHRyaWJ1dGUgJ25hbWUnIGlzIHJlcXVpcmVkIGJ1dCBtaXNzaW5nLgorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54c2Q6MTQ6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2wuICdmb28nOiBUaGUgYXR0cmlidXRlICdyZWYnIGlzIG5vdCBhbGxvd2VkLgorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54c2Q6MTQ6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2wuICdmb28nOiBUaGUgYXR0cmlidXRlICdtaW5PY2N1cnMnIGlzIG5vdCBhbGxvd2VkLgorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54c2Q6MTQ6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2wuICdmb28nOiBUaGUgYXR0cmlidXRlICdtYXhPY2N1cnMnIGlzIG5vdCBhbGxvd2VkLgorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54c2Q6MTQ6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2wuICdmb28nOiBUaGUgYXR0cmlidXRlICdmb3JtJyBpcyBub3QgYWxsb3dlZC4KKy4vdGVzdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzAueHNkOjE0OiBlbGVtZW50IGVsZW1lbnQ6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCBkZWNsLiAnZm9vJywgYXR0cmlidXRlICdmaW5hbCcgWygjYWxsIHwgTGlzdCBvZiAoZXh0ZW5zaW9uIHwgcmVzdHJpY3Rpb24pKV06IFRoZSB2YWx1ZSAnZmFudGFzeScgaXMgbm90IHZhbGlkLgorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54c2Q6MTQ6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2wuICdmb28nLCBhdHRyaWJ1dGUgJ2Jsb2NrJyBbKCNhbGwgfCBMaXN0IG9mIChleHRlbnNpb24gfCByZXN0cmljdGlvbiB8IHN1YnN0aXR1dGlvbikpXTogVGhlIHZhbHVlICdmbHV0ZScgaXMgbm90IHZhbGlkLgorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54c2Q6MTQ6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2wuICdmb28nOiBUaGUgYXR0cmlidXRlcyAnZGVmYXVsdCcgYW5kICdmaXhlZCcgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKy4vdGVzdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzAueHNkOjIyOiBlbGVtZW50IGVsZW1lbnQ6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCByZWYuICdmb286YmFyJzogVGhlIGF0dHJpYnV0ZXMgJ3JlZicgYW5kICduYW1lJyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54c2Q6MjI6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IHJlZi4gJ2ZvbzpiYXInLCBhdHRyaWJ1dGUgJ2Fic3RyYWN0JzogT25seSB0aGUgYXR0cmlidXRlcyAnbWluT2NjdXJzJywgJ21heE9jY3VycycgYW5kICdpZCcgYXJlIGFsbG93ZWQgaW4gYWRkaXRpb24gdG8gJ3JlZicuCisuL3Rlc3Qvc2NoZW1hcy9lbGVtZW50LWVycl8wLnhzZDoyMjogZWxlbWVudCBlbGVtZW50OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgcmVmLiAnZm9vOmJhcicsIGF0dHJpYnV0ZSAnbWluT2NjdXJzJzogVGhlIHZhbHVlIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2YgJ21heE9jY3VycycuCisuL3Rlc3Qvc2NoZW1hcy9lbGVtZW50LWVycl8wLnhzZDoyMzogZWxlbWVudCBjb21wbGV4VHlwZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IHJlZi4gJ2ZvbzpiYXInOiBUaGUgY29udGVudCBpcyBub3QgdmFsaWQuIEV4cGVjdGVkIGlzIChhbm5vdGF0aW9uPykuCisuL3Rlc3Qvc2NoZW1hcy9lbGVtZW50LWVycl8wLnhzZDozMDogZWxlbWVudCBlbGVtZW50OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgZGVjbC4gJ215b215JzogVGhlIGF0dHJpYnV0ZSAnYWJzdHJhY3QnIGlzIG5vdCBhbGxvd2VkLgorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54c2Q6MzA6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2wuICdteW9teSc6IFRoZSBhdHRyaWJ1dGUgJ3N1YnN0aXR1dGlvbkdyb3VwJyBpcyBub3QgYWxsb3dlZC4KKy4vdGVzdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzAueHNkOjMwOiBlbGVtZW50IGVsZW1lbnQ6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCBkZWNsLiAnbXlvbXknOiBUaGUgYXR0cmlidXRlICdmaW5hbCcgaXMgbm90IGFsbG93ZWQuCisuL3Rlc3Qvc2NoZW1hcy9lbGVtZW50LWVycl8wLnhzZDozMDogZWxlbWVudCBlbGVtZW50OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgZGVjbC4gJ215b215JywgYXR0cmlidXRlICdibG9jaycgWygjYWxsIHwgTGlzdCBvZiAoZXh0ZW5zaW9uIHwgcmVzdHJpY3Rpb24gfCBzdWJzdGl0dXRpb24pKV06IFRoZSB2YWx1ZSAnZmx1dGUnIGlzIG5vdCB2YWxpZC4KKy4vdGVzdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzAueHNkOjMwOiBlbGVtZW50IGVsZW1lbnQ6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCBkZWNsLiAnbXlvbXknOiBUaGUgYXR0cmlidXRlcyAnZGVmYXVsdCcgYW5kICdmaXhlZCcgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKy4vdGVzdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzAueHNkOjMwOiBlbGVtZW50IGVsZW1lbnQ6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCBkZWNsLiAnbXlvbXknLCBhdHRyaWJ1dGUgJ21heE9jY3Vycyc6IFRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLgorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54c2Q6MzE6IGVsZW1lbnQgY29tcGxleFR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCBkZWNsLiAnbXlvbXknOiBUaGUgYXR0cmlidXRlICd0eXBlJyBhbmQgdGhlIDxjb21wbGV4VHlwZT4gY2hpbGQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKy4vdGVzdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzAueHNkOjMyOiBlbGVtZW50IHNpbXBsZVR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCBkZWNsLiAnbXlvbXknOiBUaGUgY29udGVudCBpcyBub3QgdmFsaWQuIEV4cGVjdGVkIGlzIChhbm5vdGF0aW9uPywgKChzaW1wbGVUeXBlIHwgY29tcGxleFR5cGUpPywgKHVuaXF1ZSB8IGtleSB8IGtleXJlZikqKSkuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9lbGVtZW50LW1pbm1heC1lcnJfMF8wIGIvcmVzdWx0L3NjaGVtYXMvZWxlbWVudC1taW5tYXgtZXJyXzBfMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVzdWx0L3NjaGVtYXMvZWxlbWVudC1taW5tYXgtZXJyXzBfMApkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvZWxlbWVudC1taW5tYXgtZXJyXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9lbGVtZW50LW1pbm1heC1lcnJfMF8wLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDcxZWZmCi0tLSAvZGV2L251bGwKKysrIGIvcmVzdWx0L3NjaGVtYXMvZWxlbWVudC1taW5tYXgtZXJyXzBfMC5lcnIKQEAgLTAsMCArMSBAQAorLi90ZXN0L3NjaGVtYXMvZWxlbWVudC1taW5tYXgtZXJyXzAueHNkOjY6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2wuICdiYXInLCBhdHRyaWJ1dGUgJ21heE9jY3Vycyc6IFRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvZXh0ZW5zaW9uMV8wXzEuZXJyIGIvcmVzdWx0L3NjaGVtYXMvZXh0ZW5zaW9uMV8wXzEuZXJyCmluZGV4IDg0ZDE2YmMuLmM1YmE2NGQgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2V4dGVuc2lvbjFfMF8xLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9leHRlbnNpb24xXzBfMS5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2V4dGVuc2lvbjFfMS54bWw6MTogZWxlbWVudCB0aXRsZTogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEF0dHJpYnV0ZSAibGFuZ3VlIiBpcyBub3QgYWxsb3dlZC4KKy4vdGVzdC9zY2hlbWFzL2V4dGVuc2lvbjFfMS54bWw6MTogZWxlbWVudCB0aXRsZTogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgJ3RpdGxlJzogVGhlIGF0dHJpYnV0ZSAnbGFuZ3VlJyBpcyBub3QgYWxsb3dlZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2ZhY2V0LXVuaW9uU1QtZXJyMV8wXzAuZXJyIGIvcmVzdWx0L3NjaGVtYXMvZmFjZXQtdW5pb25TVC1lcnIxXzBfMC5lcnIKaW5kZXggZjc1Nzg0OC4uNWI0MmY3MyAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvZmFjZXQtdW5pb25TVC1lcnIxXzBfMC5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvZmFjZXQtdW5pb25TVC1lcnIxXzBfMC5lcnIKQEAgLTEsMiArMSBAQAotLi90ZXN0L3NjaGVtYXMvZmFjZXQtdW5pb25TVC1lcnIxXzAueG1sOjM6IGVsZW1lbnQgZm9vOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogVGhlIHZhbHVlIGZhaWxlZCB0byB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBmYWNldCAiZW51bWVyYXRpb24iLgotLi90ZXN0L3NjaGVtYXMvZmFjZXQtdW5pb25TVC1lcnIxXzAueG1sOjM6IGVsZW1lbnQgZm9vOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogVGhlIHZhbHVlIGlzIG5vdCB2YWxpZC4KKy4vdGVzdC9zY2hlbWFzL2ZhY2V0LXVuaW9uU1QtZXJyMV8wLnhtbDozOiBlbGVtZW50IGZvbzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgJ2ZvbycgW1NUICdmb29UeXBlLkInXTogVGhlIGNoYXJhY3RlciBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2hleGJpbmFyeV8wXzEuZXJyIGIvcmVzdWx0L3NjaGVtYXMvaGV4YmluYXJ5XzBfMS5lcnIKaW5kZXggYjlmMTkzMy4uNDE2ZTU3NSAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvaGV4YmluYXJ5XzBfMS5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvaGV4YmluYXJ5XzBfMS5lcnIKQEAgLTEsMTIgKzEsOSBAQAotLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjQ6IGVsZW1lbnQgaGV4OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogVGhlIHZhbHVlIGlzIG5vdCB2YWxpZC4KLS4vdGVzdC9zY2hlbWFzL2hleGJpbmFyeV8xLnhtbDo1OiBlbGVtZW50IGhleDogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IFRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuCi0uL3Rlc3Qvc2NoZW1hcy9oZXhiaW5hcnlfMS54bWw6NjogZWxlbWVudCBoZXg6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBUaGUgdmFsdWUgaXMgbm90IHZhbGlkLgotLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjc6IGVsZW1lbnQgaGV4OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogVGhlIHZhbHVlIGlzIG5vdCB2YWxpZC4KLS4vdGVzdC9zY2hlbWFzL2hleGJpbmFyeV8xLnhtbDo4OiBlbGVtZW50IGhleDogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IFRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuCi0uL3Rlc3Qvc2NoZW1hcy9oZXhiaW5hcnlfMS54bWw6OTogZWxlbWVudCBoZXg6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBUaGUgdmFsdWUgaXMgbm90IHZhbGlkLgotLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjExOiBlbGVtZW50IGhleDI6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBUaGUgdmFsdWUgZmFpbGVkIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIGZhY2V0ICJtYXhMZW5ndGgiLgotLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjExOiBlbGVtZW50IGhleDI6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBUaGUgdmFsdWUgaXMgbm90IHZhbGlkLgotLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjEzOiBlbGVtZW50IGhleDM6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBUaGUgdmFsdWUgZmFpbGVkIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIGZhY2V0ICJsZW5ndGgiLgotLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjEzOiBlbGVtZW50IGhleDM6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBUaGUgdmFsdWUgaXMgbm90IHZhbGlkLgotLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjE0OiBlbGVtZW50IGhleDM6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBUaGUgdmFsdWUgZmFpbGVkIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIGZhY2V0ICJsZW5ndGgiLgotLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjE0OiBlbGVtZW50IGhleDM6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBUaGUgdmFsdWUgaXMgbm90IHZhbGlkLgorLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjQ6IGVsZW1lbnQgaGV4OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCAnaGV4JyBbJ2hleEJpbmFyeSddOiBUaGUgY2hhcmFjdGVyIGNvbnRlbnQgaXMgbm90IHZhbGlkLgorLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjU6IGVsZW1lbnQgaGV4OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCAnaGV4JyBbJ2hleEJpbmFyeSddOiBUaGUgY2hhcmFjdGVyIGNvbnRlbnQgaXMgbm90IHZhbGlkLgorLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjY6IGVsZW1lbnQgaGV4OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCAnaGV4JyBbJ2hleEJpbmFyeSddOiBUaGUgY2hhcmFjdGVyIGNvbnRlbnQgaXMgbm90IHZhbGlkLgorLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjc6IGVsZW1lbnQgaGV4OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCAnaGV4JyBbJ2hleEJpbmFyeSddOiBUaGUgY2hhcmFjdGVyIGNvbnRlbnQgaXMgbm90IHZhbGlkLgorLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjg6IGVsZW1lbnQgaGV4OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCAnaGV4JyBbJ2hleEJpbmFyeSddOiBUaGUgY2hhcmFjdGVyIGNvbnRlbnQgaXMgbm90IHZhbGlkLgorLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjk6IGVsZW1lbnQgaGV4OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCAnaGV4JyBbJ2hleEJpbmFyeSddOiBUaGUgY2hhcmFjdGVyIGNvbnRlbnQgaXMgbm90IHZhbGlkLgorLi90ZXN0L3NjaGVtYXMvaGV4YmluYXJ5XzEueG1sOjExOiBlbGVtZW50IGhleDI6IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50ICdoZXgyJyBbU1QgbG9jYWwsIGZhY2V0ICdtYXhMZW5ndGgnXTogVGhlIHZhbHVlIGhhcyBhIGxlbmd0aCBvZiAnOSc7IHRoaXMgZXhjZWVkcyB0aGUgYWxsb3dlZCBtYXhpbXVtIGxlbmd0aCBvZiAnOCcuCisuL3Rlc3Qvc2NoZW1hcy9oZXhiaW5hcnlfMS54bWw6MTM6IGVsZW1lbnQgaGV4MzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgJ2hleDMnIFtTVCBsb2NhbCwgZmFjZXQgJ2xlbmd0aCddOiBUaGUgdmFsdWUgaGFzIGEgbGVuZ3RoIG9mICcxJzsgdGhpcyBkaWZmZXJzIGZyb20gdGhlIGFsbG93ZWQgbGVuZ3RoIG9mICcyJy4KKy4vdGVzdC9zY2hlbWFzL2hleGJpbmFyeV8xLnhtbDoxNDogZWxlbWVudCBoZXgzOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCAnaGV4MycgW1NUIGxvY2FsLCBmYWNldCAnbGVuZ3RoJ106IFRoZSB2YWx1ZSBoYXMgYSBsZW5ndGggb2YgJzMnOyB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgYWxsb3dlZCBsZW5ndGggb2YgJzInLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvaW5jbHVkZTFfMF8wIGIvcmVzdWx0L3NjaGVtYXMvaW5jbHVkZTFfMF8wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYThhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9yZXN1bHQvc2NoZW1hcy9pbmNsdWRlMV8wXzAKQEAgLTAsMCArMSBAQAorLi90ZXN0L3NjaGVtYXMvaW5jbHVkZTFfMC54bWwgdmFsaWRhdGVzCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9pbmNsdWRlMV8wXzAuZXJyIGIvcmVzdWx0L3NjaGVtYXMvaW5jbHVkZTFfMF8wLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVzdWx0L3NjaGVtYXMvaW5jbHVkZTFfMF8wLmVycgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvbGVuZ3RoM18wXzAuZXJyIGIvcmVzdWx0L3NjaGVtYXMvbGVuZ3RoM18wXzAuZXJyCmluZGV4IDc1MzEzNmYuLmY0ZTkwOTUgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2xlbmd0aDNfMF8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9sZW5ndGgzXzBfMC5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2xlbmd0aDNfMC54c2Q6NTogZWxlbWVudCBlbGVtZW50OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgInNpemUiOiB0aGUgUU5hbWUgIm5vbi1wb3NpdGl2ZS1pbnRlZ2VyIiBvZiB0aGUgYXR0cmlidXRlICJ0eXBlIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgc2NoZW1hIGNvbXBvbmVudC4KKy4vdGVzdC9zY2hlbWFzL2xlbmd0aDNfMC54c2Q6NTogZWxlbWVudCBlbGVtZW50OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgZGVjbC4gJ3NpemUnLCBhdHRyaWJ1dGUgJ3R5cGUnOiBUaGUgUU5hbWUgdmFsdWUgeydodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScsICdub24tcG9zaXRpdmUtaW50ZWdlcid9IGRvZXMgbm90IHJlc29sdmUgdG8gYShuKSB0eXBlIGRlZmluaXRpb24uCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9saXN0MF8wXzEuZXJyIGIvcmVzdWx0L3NjaGVtYXMvbGlzdDBfMF8xLmVycgppbmRleCBkODJhNGRjLi42OWMyYzA2IDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9saXN0MF8wXzEuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2xpc3QwXzBfMS5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2xpc3QwXzEueG1sOjE6IGVsZW1lbnQgdGVzdDogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgdGVzdCBjb250ZW50IGNoZWNrIGZhaWxlZAorLi90ZXN0L3NjaGVtYXMvbGlzdDBfMS54bWw6MTogZWxlbWVudCB0ZXN0OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ3Rlc3QnOiBUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2xpc3QwXzFfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9saXN0MF8xXzAuZXJyCmluZGV4IDBhMjllMWQuLjY3NjI2NmNkIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9saXN0MF8xXzAuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL2xpc3QwXzFfMC5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL2xpc3QwXzAueG1sOjE6IGVsZW1lbnQgdGVzdDogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgdGVzdCBjb250ZW50IGNoZWNrIGZhaWxlZAorLi90ZXN0L3NjaGVtYXMvbGlzdDBfMC54bWw6MTogZWxlbWVudCB0ZXN0OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ3Rlc3QnOiBUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL2xpc3QwXzFfMS5lcnIgYi9yZXN1bHQvc2NoZW1hcy9saXN0MF8xXzEuZXJyCmluZGV4IGQ4MmE0ZGMuLjY5YzJjMDYgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL2xpc3QwXzFfMS5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvbGlzdDBfMV8xLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvbGlzdDBfMS54bWw6MTogZWxlbWVudCB0ZXN0OiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogRWxlbWVudCB0ZXN0IGNvbnRlbnQgY2hlY2sgZmFpbGVkCisuL3Rlc3Qvc2NoZW1hcy9saXN0MF8xLnhtbDoxOiBlbGVtZW50IHRlc3Q6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCAndGVzdCc6IFRoZSBlbGVtZW50IGNvbnRlbnQgaXMgbm90IHZhbGlkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvbnMwXzBfMy5lcnIgYi9yZXN1bHQvc2NoZW1hcy9uczBfMF8zLmVycgppbmRleCAyNWU1YmYzLi43NjAxNmNiIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9uczBfMF8zLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9uczBfMF8zLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvbnMwXzMueG1sOjE6IGVsZW1lbnQgZm9vOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogQXR0cmlidXRlICJpZCIgaXMgbm90IGFsbG93ZWQuCisuL3Rlc3Qvc2NoZW1hcy9uczBfMy54bWw6MTogZWxlbWVudCBmb286IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50ICduOmZvbyc6IFRoZSBhdHRyaWJ1dGUgJ246aWQnIGlzIG5vdCBhbGxvd2VkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvbnMwXzBfNC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9uczBfMF80LmVycgppbmRleCBmYzZlZmMwLi40NzZjNzljIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9uczBfMF80LmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9uczBfMF80LmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvbnMwXzQueG1sOjI6IGVsZW1lbnQgZm9vOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogQXR0cmlidXRlICJpZCIgaXMgbm90IGFsbG93ZWQuCisuL3Rlc3Qvc2NoZW1hcy9uczBfNC54bWw6MjogZWxlbWVudCBmb286IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50ICdsOmZvbyc6IFRoZSBhdHRyaWJ1dGUgJ2I6aWQnIGlzIG5vdCBhbGxvd2VkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvbnMwXzFfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9uczBfMV8wLmVycgppbmRleCA4M2IyZmM5Li44OTY3OTE4IDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9uczBfMV8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9uczBfMV8wLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvbnMwXzAueG1sOjE6IGVsZW1lbnQgZm9vOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogQXR0cmlidXRlICJpZCIgaXMgbm90IGFsbG93ZWQuCisuL3Rlc3Qvc2NoZW1hcy9uczBfMC54bWw6MTogZWxlbWVudCBmb286IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50ICdmb28nOiBUaGUgYXR0cmlidXRlICdpZCcgaXMgbm90IGFsbG93ZWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9uczBfMV8xLmVyciBiL3Jlc3VsdC9zY2hlbWFzL25zMF8xXzEuZXJyCmluZGV4IGY2MWMxOWIuLjI5ZWMyNzMgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL25zMF8xXzEuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL25zMF8xXzEuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9uczBfMS54bWw6MTogZWxlbWVudCBmb286IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBBdHRyaWJ1dGUgImlkIiBpcyBub3QgYWxsb3dlZC4KKy4vdGVzdC9zY2hlbWFzL25zMF8xLnhtbDoxOiBlbGVtZW50IGZvbzogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgJ246Zm9vJzogVGhlIGF0dHJpYnV0ZSAnaWQnIGlzIG5vdCBhbGxvd2VkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvcmVzdHJpY3QtQ1QtYXR0ci1yZWZfMF8wIGIvcmVzdWx0L3NjaGVtYXMvcmVzdHJpY3QtQ1QtYXR0ci1yZWZfMF8wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGJhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9yZXN1bHQvc2NoZW1hcy9yZXN0cmljdC1DVC1hdHRyLXJlZl8wXzAKQEAgLTAsMCArMSBAQAorLi90ZXN0L3NjaGVtYXMvcmVzdHJpY3QtQ1QtYXR0ci1yZWZfMC54bWwgdmFsaWRhdGVzCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9yZXN0cmljdC1DVC1hdHRyLXJlZl8wXzAuZXJyIGIvcmVzdWx0L3NjaGVtYXMvcmVzdHJpY3QtQ1QtYXR0ci1yZWZfMF8wLmVycgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVzdWx0L3NjaGVtYXMvcmVzdHJpY3QtQ1QtYXR0ci1yZWZfMF8wLmVycgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvc2NjLW5vLXhtbG5zXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9zY2Mtbm8teG1sbnNfMF8wLmVycgppbmRleCA1MzZiZGZlLi4wYmM0NTE5IDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9zY2Mtbm8teG1sbnNfMF8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9zY2Mtbm8teG1sbnNfMF8wLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvc2NjLW5vLXhtbG5zXzAueHNkOjc6IGVsZW1lbnQgYXR0cmlidXRlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBtdXN0IG5vdCBtYXRjaCAieG1sbnMiLgorLi90ZXN0L3NjaGVtYXMvc2NjLW5vLXhtbG5zXzAueHNkOjc6IGVsZW1lbnQgYXR0cmlidXRlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgJ2F0dHJpYnV0ZScsIGF0dHJpYnV0ZSAnbmFtZScgWydOQ05hbWUnXTogVGhlIHZhbHVlIG11c3Qgbm90IG1hdGNoICd4bWxucycuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9zY2Mtbm8teHNpXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9zY2Mtbm8teHNpXzBfMC5lcnIKaW5kZXggNTc2ZDE5NC4uOWNmYjc3YSAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvc2NjLW5vLXhzaV8wXzAuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL3NjYy1uby14c2lfMF8wLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvc2NjLW5vLXhzaV8wLnhzZDo3OiBlbGVtZW50IGF0dHJpYnV0ZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24sIG11c3Qgbm90IG1hdGNoICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKy4vdGVzdC9zY2hlbWFzL3NjYy1uby14c2lfMC54c2Q6NzogZWxlbWVudCBhdHRyaWJ1dGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogQXR0cmlidXRlIGRlY2wuICdiYXInOiBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBtdXN0IG5vdCBtYXRjaCAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTFfMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL3NyYy1hdHRyaWJ1dGUxXzBfMC5lcnIKaW5kZXggYzJiN2NmNy4uMDk5MGIyZSAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTFfMF8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9zcmMtYXR0cmlidXRlMV8wXzAuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9zcmMtYXR0cmlidXRlMV8wLnhzZDo5OiBlbGVtZW50IGF0dHJpYnV0ZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBBdHRyaWJ1dGUgZGVjbGFyYXRpb24gaGFzIGJvdGgsICJkZWZhdWx0IiBhbmQgImZpeGVkIgorLi90ZXN0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTFfMC54c2Q6OTogZWxlbWVudCBhdHRyaWJ1dGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogQXR0cmlidXRlIGRlY2wuICdiYXInOiBUaGUgYXR0cmlidXRlcyAnZGVmYXVsdCcgYW5kICdmaXhlZCcgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL3NyYy1hdHRyaWJ1dGUyXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9zcmMtYXR0cmlidXRlMl8wXzAuZXJyCmluZGV4IDRjOGJkNmMuLjAyNTM0ZjQgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL3NyYy1hdHRyaWJ1dGUyXzBfMC5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTJfMF8wLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTJfMC54c2Q6OTogZWxlbWVudCBhdHRyaWJ1dGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogQXR0cmlidXRlIGRlY2xhcmF0aW9uIGhhcyAiZGVmYXVsdCIgYnV0ICJ1c2UiIGlzIG5vdCAib3B0aW9uYWwiCisuL3Rlc3Qvc2NoZW1hcy9zcmMtYXR0cmlidXRlMl8wLnhzZDo5OiBlbGVtZW50IGF0dHJpYnV0ZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBBdHRyaWJ1dGUgZGVjbC4gJ2JhcicsIGF0dHJpYnV0ZSAndXNlJyBbKG9wdGlvbmFsIHwgcHJvaGliaXRlZCB8IHJlcXVpcmVkKV06IFRoZSB2YWx1ZSBtdXN0IGJlICdvcHRpb25hbCcgaWYgdGhlIGF0dHJpYnV0ZSAnZGVmYXVsdCcgaXMgcHJlc2VudCBhcyB3ZWxsLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTMtMV8wXzAuZXJyIGIvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTMtMV8wXzAuZXJyCmluZGV4IDI3YzQ4ODEuLjEwYTFkNTUgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL3NyYy1hdHRyaWJ1dGUzLTFfMF8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9zcmMtYXR0cmlidXRlMy0xXzBfMC5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL3NyYy1hdHRyaWJ1dGUzLTFfMC54c2Q6OTogZWxlbWVudCBhdHRyaWJ1dGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogQXR0cmlidXRlIGRlY2xhcmF0aW9uICJiYXIiIGhhcyBib3RoLCAibmFtZSIgYW5kICJyZWYiCisuL3Rlc3Qvc2NoZW1hcy9zcmMtYXR0cmlidXRlMy0xXzAueHNkOjk6IGVsZW1lbnQgYXR0cmlidXRlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEF0dHJpYnV0ZSByZWYuICdmb286YmFyJzogVGhlIGF0dHJpYnV0ZXMgJ3JlZicgYW5kICduYW1lJyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTMtMi1mb3JtXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9zcmMtYXR0cmlidXRlMy0yLWZvcm1fMF8wLmVycgppbmRleCBmZTIyNGYyLi4wNTYxNWRjIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9zcmMtYXR0cmlidXRlMy0yLWZvcm1fMF8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9zcmMtYXR0cmlidXRlMy0yLWZvcm1fMF8wLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTMtMi1mb3JtXzAueHNkOjEwOiBlbGVtZW50IGF0dHJpYnV0ZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBBdHRyaWJ1dGUgZGVjbGFyYXRpb24gYW5vbmF0dHIgMiBoYXMgInJlZiIsIHRodXMgImZvcm0iIG11c3QgYmUgYWJzZW50CisuL3Rlc3Qvc2NoZW1hcy9zcmMtYXR0cmlidXRlMy0yLWZvcm1fMC54c2Q6MTA6IGVsZW1lbnQgYXR0cmlidXRlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEF0dHJpYnV0ZSByZWYuICdmb286YmFyJzogVGhlIGF0dHJpYnV0ZSAnZm9ybScgaXMgbm90IGFsbG93ZWQuCmRpZmYgLS1naXQgYS9yZXN1bHQvc2NoZW1hcy9zcmMtYXR0cmlidXRlMy0yLXN0XzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9zcmMtYXR0cmlidXRlMy0yLXN0XzBfMC5lcnIKaW5kZXggZDg3Mzg4MS4uMTRkZjUwZSAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTMtMi1zdF8wXzAuZXJyCisrKyBiL3Jlc3VsdC9zY2hlbWFzL3NyYy1hdHRyaWJ1dGUzLTItc3RfMF8wLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTMtMi1zdF8wLnhzZDoxMTogZWxlbWVudCBzaW1wbGVUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBhbm9uYXR0ciAyIGhhcyBib3RoICgicmVmIiBvciAidHlwZSIpIGFuZCA8c2ltcGxlVHlwZT4KKy4vdGVzdC9zY2hlbWFzL3NyYy1hdHRyaWJ1dGUzLTItc3RfMC54c2Q6MTE6IGVsZW1lbnQgc2ltcGxlVHlwZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBBdHRyaWJ1dGUgcmVmLiAnZm9vOmJhcic6IFRoZSBjb250ZW50IGlzIG5vdCB2YWxpZC4gRXhwZWN0ZWQgaXMgKGFubm90YXRpb24/KS4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL3NyYy1hdHRyaWJ1dGUzLTItdHlwZV8wXzAuZXJyIGIvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTMtMi10eXBlXzBfMC5lcnIKaW5kZXggNmIzMjRmYy4uMTMxYmVjOSAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTMtMi10eXBlXzBfMC5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTMtMi10eXBlXzBfMC5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL3NyYy1hdHRyaWJ1dGUzLTItdHlwZV8wLnhzZDoxMDogZWxlbWVudCBhdHRyaWJ1dGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogQXR0cmlidXRlIGRlY2xhcmF0aW9uIGFub25hdHRyIDIgaGFzICJyZWYiLCB0aHVzICJ0eXBlIiBtdXN0IGJlIGFic2VudAorLi90ZXN0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTMtMi10eXBlXzAueHNkOjEwOiBlbGVtZW50IGF0dHJpYnV0ZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBBdHRyaWJ1dGUgcmVmLiAnZm9vOmJhcic6IFRoZSBhdHRyaWJ1dGUgJ3R5cGUnIGlzIG5vdCBhbGxvd2VkLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTRfMF8wLmVyciBiL3Jlc3VsdC9zY2hlbWFzL3NyYy1hdHRyaWJ1dGU0XzBfMC5lcnIKaW5kZXggM2FhYjQ1Yi4uMDMwNTYyNSAxMDA2NDQKLS0tIGEvcmVzdWx0L3NjaGVtYXMvc3JjLWF0dHJpYnV0ZTRfMF8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9zcmMtYXR0cmlidXRlNF8wXzAuZXJyCkBAIC0xICsxIEBACi0uL3Rlc3Qvc2NoZW1hcy9zcmMtYXR0cmlidXRlNF8wLnhzZDo4OiBlbGVtZW50IHNpbXBsZVR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogQXR0cmlidXRlIGRlY2xhcmF0aW9uIGJhciBoYXMgYm90aCAoInJlZiIgb3IgInR5cGUiKSBhbmQgPHNpbXBsZVR5cGU+CisuL3Rlc3Qvc2NoZW1hcy9zcmMtYXR0cmlidXRlNF8wLnhzZDo4OiBlbGVtZW50IHNpbXBsZVR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogQXR0cmlidXRlIGRlY2wuICdiYXInOiBUaGUgYXR0cmlidXRlICd0eXBlJyBhbmQgdGhlIDxzaW1wbGVUeXBlPiBjaGlsZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvc3JjLWVsZW1lbnQxXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9zcmMtZWxlbWVudDFfMF8wLmVycgppbmRleCBmZGNiYmM5Li43NThmMzY2IDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9zcmMtZWxlbWVudDFfMF8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9zcmMtZWxlbWVudDFfMF8wLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQxXzAueHNkOjc6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGZvbyBoYXMgYm90aCBkZWZhdWx0IGFuZCBmaXhlZAorLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQxXzAueHNkOjc6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2wuICdmb28nOiBUaGUgYXR0cmlidXRlcyAnZGVmYXVsdCcgYW5kICdmaXhlZCcgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0xXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9zcmMtZWxlbWVudDItMV8wXzAuZXJyCmluZGV4IGY5OWNiM2IuLmNiOTczNTMgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0xXzBfMC5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvc3JjLWVsZW1lbnQyLTFfMF8wLmVycgpAQCAtMSArMSBAQAotLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQyLTFfMC54c2Q6MTI6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2xhcmF0aW9uIGhhcyBib3RoLCAibmFtZSIgYW5kICJyZWYiCisuL3Rlc3Qvc2NoZW1hcy9zcmMtZWxlbWVudDItMV8wLnhzZDoxMjogZWxlbWVudCBlbGVtZW50OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgcmVmLiAnZm9vOmJhcic6IFRoZSBhdHRyaWJ1dGVzICdyZWYnIGFuZCAnbmFtZScgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9zcmMtZWxlbWVudDItMl8wXzAuZXJyCmluZGV4IDMyNTA0NzIuLmI2MjQxN2QgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzBfMC5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvc3JjLWVsZW1lbnQyLTJfMF8wLmVycgpAQCAtMSw4ICsxLDkgQEAKLS4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzAueHNkOjIzOiBlbGVtZW50IGNvbXBsZXhUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgZGVjbGFyYXRpb24gYW5vbmVsZW0gNjogb25seSBhbm5vdGF0aW9uIGlzIGFsbG93ZWQgYXMgY29udGVudCBpbiBhZGRpdGlvbiB0byByZWYKLS4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzAueHNkOjI5OiBlbGVtZW50IHNpbXBsZVR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCBkZWNsYXJhdGlvbiBhbm9uZWxlbSA3OiBvbmx5IGFubm90YXRpb24gaXMgYWxsb3dlZCBhcyBjb250ZW50IGluIGFkZGl0aW9uIHRvIHJlZgotLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQyLTJfMC54c2Q6MzY6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2xhcmF0aW9uIGFub25lbGVtIDg6IG9ubHkgbWluT2NjdXJzLCBtYXhPY2N1cnMgYW5kIGlkIGFyZSBhbGxvd2VkIGluIGFkZGl0aW9uIHRvIHJlZgotLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQyLTJfMC54c2Q6Mzc6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2xhcmF0aW9uIGFub25lbGVtIDk6IG9ubHkgbWluT2NjdXJzLCBtYXhPY2N1cnMgYW5kIGlkIGFyZSBhbGxvd2VkIGluIGFkZGl0aW9uIHRvIHJlZgotLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQyLTJfMC54c2Q6Mzg6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2xhcmF0aW9uIGFub25lbGVtIDEwOiBvbmx5IG1pbk9jY3VycywgbWF4T2NjdXJzIGFuZCBpZCBhcmUgYWxsb3dlZCBpbiBhZGRpdGlvbiB0byByZWYKLS4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzAueHNkOjM5OiBlbGVtZW50IGVsZW1lbnQ6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCBkZWNsYXJhdGlvbiBhbm9uZWxlbSAxMTogb25seSBtaW5PY2N1cnMsIG1heE9jY3VycyBhbmQgaWQgYXJlIGFsbG93ZWQgaW4gYWRkaXRpb24gdG8gcmVmCi0uL3Rlc3Qvc2NoZW1hcy9zcmMtZWxlbWVudDItMl8wLnhzZDo0MDogZWxlbWVudCBlbGVtZW50OiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgZGVjbGFyYXRpb24gYW5vbmVsZW0gMTI6IG9ubHkgbWluT2NjdXJzLCBtYXhPY2N1cnMgYW5kIGlkIGFyZSBhbGxvd2VkIGluIGFkZGl0aW9uIHRvIHJlZgotLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQyLTJfMC54c2Q6NDE6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2xhcmF0aW9uIGFub25lbGVtIDEzOiBvbmx5IG1pbk9jY3VycywgbWF4T2NjdXJzIGFuZCBpZCBhcmUgYWxsb3dlZCBpbiBhZGRpdGlvbiB0byByZWYKKy4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzAueHNkOjE4OiBlbGVtZW50IGVsZW1lbnQ6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCByZWYuICdmb286YmFyJywgYXR0cmlidXRlICdtYXhPY2N1cnMnOiBUaGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4KKy4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzAueHNkOjIzOiBlbGVtZW50IGNvbXBsZXhUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgcmVmLiAnZm9vOmJhcic6IFRoZSBjb250ZW50IGlzIG5vdCB2YWxpZC4gRXhwZWN0ZWQgaXMgKGFubm90YXRpb24/KS4KKy4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzAueHNkOjI5OiBlbGVtZW50IHNpbXBsZVR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCByZWYuICdmb286YmFyJzogVGhlIGNvbnRlbnQgaXMgbm90IHZhbGlkLiBFeHBlY3RlZCBpcyAoYW5ub3RhdGlvbj8pLgorLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQyLTJfMC54c2Q6MzY6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IHJlZi4gJ2ZvbzpiYXInLCBhdHRyaWJ1dGUgJ3R5cGUnOiBPbmx5IHRoZSBhdHRyaWJ1dGVzICdtaW5PY2N1cnMnLCAnbWF4T2NjdXJzJyBhbmQgJ2lkJyBhcmUgYWxsb3dlZCBpbiBhZGRpdGlvbiB0byAncmVmJy4KKy4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzAueHNkOjM3OiBlbGVtZW50IGVsZW1lbnQ6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCByZWYuICdmb286YmFyJywgYXR0cmlidXRlICduaWxsYWJsZSc6IE9ubHkgdGhlIGF0dHJpYnV0ZXMgJ21pbk9jY3VycycsICdtYXhPY2N1cnMnIGFuZCAnaWQnIGFyZSBhbGxvd2VkIGluIGFkZGl0aW9uIHRvICdyZWYnLgorLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQyLTJfMC54c2Q6Mzg6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IHJlZi4gJ2ZvbzpiYXInLCBhdHRyaWJ1dGUgJ2RlZmF1bHQnOiBPbmx5IHRoZSBhdHRyaWJ1dGVzICdtaW5PY2N1cnMnLCAnbWF4T2NjdXJzJyBhbmQgJ2lkJyBhcmUgYWxsb3dlZCBpbiBhZGRpdGlvbiB0byAncmVmJy4KKy4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzAueHNkOjM5OiBlbGVtZW50IGVsZW1lbnQ6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCByZWYuICdmb286YmFyJywgYXR0cmlidXRlICdmaXhlZCc6IE9ubHkgdGhlIGF0dHJpYnV0ZXMgJ21pbk9jY3VycycsICdtYXhPY2N1cnMnIGFuZCAnaWQnIGFyZSBhbGxvd2VkIGluIGFkZGl0aW9uIHRvICdyZWYnLgorLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQyLTJfMC54c2Q6NDA6IGVsZW1lbnQgZWxlbWVudDogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IHJlZi4gJ2ZvbzpiYXInLCBhdHRyaWJ1dGUgJ2Zvcm0nOiBPbmx5IHRoZSBhdHRyaWJ1dGVzICdtaW5PY2N1cnMnLCAnbWF4T2NjdXJzJyBhbmQgJ2lkJyBhcmUgYWxsb3dlZCBpbiBhZGRpdGlvbiB0byAncmVmJy4KKy4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50Mi0yXzAueHNkOjQxOiBlbGVtZW50IGVsZW1lbnQ6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCByZWYuICdmb286YmFyJywgYXR0cmlidXRlICdibG9jayc6IE9ubHkgdGhlIGF0dHJpYnV0ZXMgJ21pbk9jY3VycycsICdtYXhPY2N1cnMnIGFuZCAnaWQnIGFyZSBhbGxvd2VkIGluIGFkZGl0aW9uIHRvICdyZWYnLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvc3JjLWVsZW1lbnQzXzBfMC5lcnIgYi9yZXN1bHQvc2NoZW1hcy9zcmMtZWxlbWVudDNfMF8wLmVycgppbmRleCAwZTM4ZDE3Li5mODcwYTY0IDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy9zcmMtZWxlbWVudDNfMF8wLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy9zcmMtZWxlbWVudDNfMF8wLmVycgpAQCAtMSwyICsxLDIgQEAKLS4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50M18wLnhzZDo4OiBlbGVtZW50IGNvbXBsZXhUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgZGVjbGFyYXRpb24gZm9vIGhhcyBib3RoICJ0eXBlIiBhbmQgYSBsb2NhbCBjb21wbGV4IHR5cGUKLS4vdGVzdC9zY2hlbWFzL3NyYy1lbGVtZW50M18wLnhzZDoxNjogZWxlbWVudCBzaW1wbGVUeXBlOiBTY2hlbWFzIHBhcnNlciBlcnJvciA6IEVsZW1lbnQgZGVjbGFyYXRpb24gYmFyIGhhcyBib3RoICJ0eXBlIiBhbmQgYSBsb2NhbCBzaW1wbGUgdHlwZQorLi90ZXN0L3NjaGVtYXMvc3JjLWVsZW1lbnQzXzAueHNkOjg6IGVsZW1lbnQgY29tcGxleFR5cGU6IFNjaGVtYXMgcGFyc2VyIGVycm9yIDogRWxlbWVudCBkZWNsLiAnZm9vJzogVGhlIGF0dHJpYnV0ZSAndHlwZScgYW5kIHRoZSA8Y29tcGxleFR5cGU+IGNoaWxkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisuL3Rlc3Qvc2NoZW1hcy9zcmMtZWxlbWVudDNfMC54c2Q6MTY6IGVsZW1lbnQgc2ltcGxlVHlwZTogU2NoZW1hcyBwYXJzZXIgZXJyb3IgOiBFbGVtZW50IGRlY2wuICdiYXInOiBUaGUgYXR0cmlidXRlICd0eXBlJyBhbmQgdGhlIDxzaW1wbGVUeXBlPiBjaGlsZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgpkaWZmIC0tZ2l0IGEvcmVzdWx0L3NjaGVtYXMvdmR2LWZpcnN0NF8wXzEuZXJyIGIvcmVzdWx0L3NjaGVtYXMvdmR2LWZpcnN0NF8wXzEuZXJyCmluZGV4IDE1NWY5MDYuLjNlZGIxMzkgMTAwNjQ0Ci0tLSBhL3Jlc3VsdC9zY2hlbWFzL3Zkdi1maXJzdDRfMF8xLmVycgorKysgYi9yZXN1bHQvc2NoZW1hcy92ZHYtZmlyc3Q0XzBfMS5lcnIKQEAgLTEgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL3Zkdi1maXJzdDRfMS54bWw6MTQ6IGVsZW1lbnQgYm9ybjogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IFRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuCisuL3Rlc3Qvc2NoZW1hcy92ZHYtZmlyc3Q0XzEueG1sOjE0OiBlbGVtZW50IGJvcm46IFNjaGVtYXMgdmFsaWRpdHkgZXJyb3IgOiBFbGVtZW50ICdib3JuJyBbU1QgJ2RhdGUnXTogVGhlIGNoYXJhY3RlciBjb250ZW50IGlzIG5vdCB2YWxpZC4KZGlmZiAtLWdpdCBhL3Jlc3VsdC9zY2hlbWFzL3Zkdi1maXJzdDRfMF8yLmVyciBiL3Jlc3VsdC9zY2hlbWFzL3Zkdi1maXJzdDRfMF8yLmVycgppbmRleCA0MmExOTAwLi4zOTMwZTdlIDEwMDY0NAotLS0gYS9yZXN1bHQvc2NoZW1hcy92ZHYtZmlyc3Q0XzBfMi5lcnIKKysrIGIvcmVzdWx0L3NjaGVtYXMvdmR2LWZpcnN0NF8wXzIuZXJyCkBAIC0xLDIgKzEgQEAKLS4vdGVzdC9zY2hlbWFzL3Zkdi1maXJzdDRfMi54bWw6MjQ6IGVsZW1lbnQgYm9ybjogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IFRoZSB2YWx1ZSBmYWlsZWQgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgZmFjZXQgInBhdHRlcm4iLgotLi90ZXN0L3NjaGVtYXMvdmR2LWZpcnN0NF8yLnhtbDoyNDogZWxlbWVudCBib3JuOiBTY2hlbWFzIHZhbGlkaXR5IGVycm9yIDogVGhlIHZhbHVlIGlzIG5vdCB2YWxpZC4KKy4vdGVzdC9zY2hlbWFzL3Zkdi1maXJzdDRfMi54bWw6MjQ6IGVsZW1lbnQgYm9ybjogU2NoZW1hcyB2YWxpZGl0eSBlcnJvciA6IEVsZW1lbnQgJ2Jvcm4nIFtTVCAnZGF0ZScsIGZhY2V0ICdwYXR0ZXJuJ106IFRoZSB2YWx1ZSAnMjAwMC0wMS0yMFonIGlzIG5vdCBhY2NlcHRlZCBieSB0aGUgcGF0dGVybiAnW146Wl0qJy4KZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy9hbm5vdC1lcnJfMC54bWwgYi90ZXN0L3NjaGVtYXMvYW5ub3QtZXJyXzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTJiMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NjaGVtYXMvYW5ub3QtZXJyXzAueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8Zm9vIHhtbG5zPSJodHRwOi8vRk9PIiAKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9GT08gYW5ub3QtZXJyXzAueHNkIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL2Fubm90LWVycl8wLnhzZCBiL3Rlc3Qvc2NoZW1hcy9hbm5vdC1lcnJfMC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkZjRmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2NoZW1hcy9hbm5vdC1lcnJfMC54c2QKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL0ZPTyIKKwl4bWxuczpnb289Imh0dHA6Ly9HT08iCisJeG1sbnM6YnV0PSJodHRwOi8vQlVUIj4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iZm9vIiB4bWw6bGFuZz0iaGhoIj4KKwkJPHhzZDphbm5vdGF0aW9uIGlkPSI/IiBkZWF0aD0iaXMgYSBnb29kIGVudGVydGFpbmVyIiBidXQ6c3VjaD0iaXMgbGlmZSI+CisJCSAgICBJIHNob3VsZG4ndCBkbyB0aGlzIGhlcmUuLi4KKwkJCTx4c2Q6YXBwaW5mbyBpZD0iPyIgc291cmNlPSJzb21ld2hlcmUiIAorCQkJCWdvbzpmdW49ImJhZyIgZnVuPSJhbm90aGVyIGZ1bi1iYWciPgorCQkJCXdlZWVsbGwKKwkJCTwveHNkOmFwcGluZm8+CisJCQk8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9IioiIGlkPSI/IiBzb3VyY2U9ImFueXdoZXJlIiAKKwkJCQlnb286bW90aGVycz0ib2YgaW52ZW50aW9uIiBtb3RoZXJzPSJkb24ndCBkbyB5b3VyIGRpc2hlcyI+CisJCQkJaG1tbW1tbQorCQkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCS4uLmFuZCBoZXJlIGFzIHdlbGwgLSBtb3JlIHRoYW4gZXZlcgorCQk8L3hzZDphbm5vdGF0aW9uPgkKKwk8L3hzZDplbGVtZW50PgorCis8L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL2FueTFfMC54bWwgYi90ZXN0L3NjaGVtYXMvYW55MV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTI2NGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zY2hlbWFzL2FueTFfMC54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLSBUZXN0cyB4c2Q6YW55IHdpdGggIiMjYW55Ii4gLS0+Cis8Zm9vOmZvbyAKKwl4bWxuczpmb289Imh0dHA6Ly9GT08iIAorCXhtbG5zOmJhcj0iaHR0cDovL0JBUiIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9GT08gYW55MV8wLnhzZCI+CisKKwk8Zm9vOmFueXRoaW5nPgorCQk8Zm9vOmJvbyBib29BdHRyPSIxMjMiLz4KKwk8L2Zvbzphbnl0aGluZz4KKwk8YmFyOmFueXRoaW5nPgorCQk8Zm9vOmJvbyBib29BdHRyPSIyMTMiLz4KKwk8L2Jhcjphbnl0aGluZz4KKwk8YW55dGhpbmc+CisJCTxmb286Ym9vIGJvb0F0dHI9IjIxMyIvPgorCTwvYW55dGhpbmc+CisJCisKKzwvZm9vOmZvbz4KKwpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL2FueTFfMC54c2QgYi90ZXN0L3NjaGVtYXMvYW55MV8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDAwODdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zY2hlbWFzL2FueTFfMC54c2QKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tIFRlc3RzIHhzZDphbnkgd2l0aCAiIyNhbnkiLiAtLT4KKzx4c2Q6c2NoZW1hIAorCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vRk9PIgorCXhtbG5zOmZvbz0iaHR0cDovL0ZPTyI+CQkKKworCTx4c2Q6ZWxlbWVudCBuYW1lPSJib28iPgorCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYm9vQXR0ciIgdHlwZT0ieHNkOmludGVnZXIiIC8+CisJCTwveHNkOmNvbXBsZXhUeXBlPgorCTwveHNkOmVsZW1lbnQ+CisKKwk8eHNkOmVsZW1lbnQgbmFtZT0iZm9vIj4KKwkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCTx4c2Q6c2VxdWVuY2U+CisJCQkJPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIzIi8+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisJPC94c2Q6ZWxlbWVudD4KKworPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy9hbnkyXzAueG1sIGIvdGVzdC9zY2hlbWFzL2FueTJfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0OWEyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2NoZW1hcy9hbnkyXzAueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0gVGVzdHMgeHNkOmFueSB3aXRoIGEgc2V0IG9mIG5hbWVzcGFjZXMsIGljbHVkaW5nIAorCSIjI2xvY2FsIiBhbmQgIiMjdGFyZ2V0TmFtZXNwYWNlIi4gLS0+Cis8Zm9vOmZvbyAKKwl4bWxuczpmb289Imh0dHA6Ly9GT08iCisJeG1sbnM6YmFyPSJodHRwOi8vQkFSIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL0ZPTyBhbnkyXzAueHNkIj4KKwkKKwk8Zm9vOmFueXRoaW5nPgorCQk8Zm9vOmJvbyBib29BdHRyPSIxMjMiLz4JCQorCTwvZm9vOmFueXRoaW5nPgorCisJPGJhcjphbnl0aGluZz4KKwkJPGZvbzpib28gYm9vQXR0cj0iMTIzIi8+CQkKKwk8L2Jhcjphbnl0aGluZz4KKworCTxhbnl0aGluZz4KKwkJPGZvbzpib28gYm9vQXR0cj0iMTIzIi8+CQkKKwk8L2FueXRoaW5nPgorCQorCQorPC9mb286Zm9vPgorCmRpZmYgLS1naXQgYS90ZXN0L3NjaGVtYXMvYW55Ml8wLnhzZCBiL3Rlc3Qvc2NoZW1hcy9hbnkyXzAueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZjcyNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NjaGVtYXMvYW55Ml8wLnhzZApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0gVGVzdHMgeHNkOmFueSB3aXRoIGEgc2V0IG9mIG5hbWVzcGFjZXMsIGljbHVkaW5nIAorCSIjI2xvY2FsIiBhbmQgIiMjdGFyZ2V0TmFtZXNwYWNlIi4gLS0+Cis8eHNkOnNjaGVtYSAKKwl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL0ZPTyIKKwl4bWxuczpmb289Imh0dHA6Ly9GT08iPgkJCisKKwk8eHNkOmVsZW1lbnQgbmFtZT0iYm9vIj4KKwkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJvb0F0dHIiIHR5cGU9InhzZDppbnRlZ2VyIiAvPgorCQk8L3hzZDpjb21wbGV4VHlwZT4KKwk8L3hzZDplbGVtZW50PgorCisJPHhzZDplbGVtZW50IG5hbWU9ImZvbyI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6YW55IAorCQkJCQluYW1lc3BhY2U9IiMjdGFyZ2V0TmFtZXNwYWNlIGh0dHA6Ly9CQVIgIyNsb2NhbCIgCisJCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAKKwkJCQkJbWF4T2NjdXJzPSIzIi8+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisJPC94c2Q6ZWxlbWVudD4KKworPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy9hbnkzXzAueG1sIGIvdGVzdC9zY2hlbWFzL2FueTNfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4ZjkxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2NoZW1hcy9hbnkzXzAueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0gVGVzdHMgeHNkOmFueS4KKwlpbnZhbGlkOiA8YmFyLkEvPiBhbmQgPGZvbzpiYXIuQi8+CisJdmFsaWQ6IDxiYXI6YmFyLkMvPgorLS0+Cis8Zm9vOmZvbyAKKwl4bWxuczpmb289Imh0dHA6Ly9GT08iIAorCXhtbG5zOmJhcj0iaHR0cDovL0JBUiIKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9GT08gYW55M18wLnhzZCI+CisKKwk8YmFyLkEvPgkKKwk8Zm9vOmJhci5CLz4JCisJPGJhcjpiYXIuQy8+CisJCis8L2Zvbzpmb28+CisKZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy9hbnkzXzAueHNkIGIvdGVzdC9zY2hlbWFzL2FueTNfMC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjMjlmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2NoZW1hcy9hbnkzXzAueHNkCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzZDpzY2hlbWEgCisJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9GT08iCisJeG1sbnM6Zm9vPSJodHRwOi8vRk9PIj4JCQorCisJPHhzZDplbGVtZW50IG5hbWU9ImZvbyI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKwkJCQk8eHNkOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisJCQkJPHhzZDphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorCQkJPC94c2Q6c2VxdWVuY2U+CisJCTwveHNkOmNvbXBsZXhUeXBlPgorCTwveHNkOmVsZW1lbnQ+CisJCis8L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL2FueTRfMC54bWwgYi90ZXN0L3NjaGVtYXMvYW55NF8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjIwMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zY2hlbWFzL2FueTRfMC54bWwKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLSBUZXN0cyB4c2Q6YW55LgorCWludmFsaWQ6IDxiYXIuQS8+IGFuZCA8Zm9vOmJhci5CLz4KKwl2YWxpZDogPGJhcjpiYXIuQy8+CistLT4KKzxmb286Zm9vIAorCXhtbG5zOmZvbz0iaHR0cDovL0ZPTyIgCisJeG1sbnM6YmFyPSJodHRwOi8vQkFSIgorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL0ZPTyBhbnk0XzAueHNkIj4KKworCTxmb286YW55dGhpbmc+CisJCTxmb286Ym9vIGJvb0F0dHI9IjEyMyIvPgorCTwvZm9vOmFueXRoaW5nPgkKKwkKKzwvZm9vOmZvbz4KKwpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL2FueTRfMC54c2QgYi90ZXN0L3NjaGVtYXMvYW55NF8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTkzNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zY2hlbWFzL2FueTRfMC54c2QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8eHNkOnNjaGVtYSAKKwl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL0ZPTyIKKwl4bWxuczpmb289Imh0dHA6Ly9GT08iPgkJCisKKwk8eHNkOmVsZW1lbnQgbmFtZT0iYm9vIj4KKwkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJvb0F0dHIiIHR5cGU9InhzZDppbnRlZ2VyIiAvPgorCQk8L3hzZDpjb21wbGV4VHlwZT4KKwk8L3hzZDplbGVtZW50PgorCisJPHhzZDplbGVtZW50IG5hbWU9ImZvbyI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOmNob2ljZT4KKwkJCQk8eHNkOmFueSBuYW1lc3BhY2U9Imh0dHA6Ly9GT08iIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW55dGhpbmciIGZvcm09InF1YWxpZmllZCI+CisJCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImZvbzpib28iLz4KKwkJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCQk8L3hzZDplbGVtZW50PgorCQkJPC94c2Q6Y2hvaWNlPgorCQk8L3hzZDpjb21wbGV4VHlwZT4KKwk8L3hzZDplbGVtZW50PgorCQorPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy9idWcxNDEzMzNfMC54bWwgYi90ZXN0L3NjaGVtYXMvYnVnMTQxMzMzXzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNGFhNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NjaGVtYXMvYnVnMTQxMzMzXzAueG1sCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPGZvbyAKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCisgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJidWcxNDEzMzMueHNkIiBhdHRyQT0idmFsdWVBIj4KKworCTxiYXIgYXR0ckE9InZhbHVlQSIgYXR0ckI9InZhbHVlQiIvPgorCis8L2Zvbz4KKwpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL2J1ZzE0MTMzM18wLnhzZCBiL3Rlc3Qvc2NoZW1hcy9idWcxNDEzMzNfMC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4MWE3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2NoZW1hcy9idWcxNDEzMzNfMC54c2QKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgorCisJPHhzOmVsZW1lbnQgbmFtZT0iZm9vIiB0eXBlPSJiYXNlVHlwZSIvPgorCisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2VUeXBlIj4KKwkJPHhzOmFsbD4KKwkJCTx4czplbGVtZW50IG5hbWU9ImJhciIgdHlwZT0iZGVyaXZlZFR5cGUiIG1pbk9jY3Vycz0iMCIvPgorCQk8L3hzOmFsbD4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyQSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94czpjb21wbGV4VHlwZT4KKworCTx4czpjb21wbGV4VHlwZSBuYW1lPSJkZXJpdmVkVHlwZSI+CisJCTx4czpjb21wbGV4Q29udGVudD4KKwkJCTx4czpleHRlbnNpb24gYmFzZT0iYmFzZVR5cGUiPgorCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYXR0ckIiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQkJPC94czpleHRlbnNpb24+CisJCTwveHM6Y29tcGxleENvbnRlbnQ+CisJPC94czpjb21wbGV4VHlwZT4KKwkKKzwveHM6c2NoZW1hPgorCisKKworCmRpZmYgLS1naXQgYS90ZXN0L3NjaGVtYXMvYnVnMTQ1MjQ2XzAueG1sIGIvdGVzdC9zY2hlbWFzL2J1ZzE0NTI0Nl8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA1MGM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zY2hlbWFzL2J1ZzE0NTI0Nl8wLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLURPQ1RZUEUgZ2ltbCBTWVNURU0gImh0dHA6Ly9naXRrLnNvdXJjZWZvcmdlLm5ldC9naW1sLmR0ZCItLT4KKzwhLS0gJElkOiBnaXRrVGVtcGxhdGVfbWVzc2FnZS54bWwuaW4sdiAxLjExIDIwMDQvMDEvMDcgMTQ6MjE6MTcgZW5zb25pYyBFeHAgJAorICogQGZpbGUgICBnaXRrVGVtcGxhdGVfbWVzc2FnZS54bWwKKyAqIEBhdXRob3IgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICogQGRhdGUgICBUaHUgSmFuIDE3IDExOjIyOjM4IDIwMDIKKyAqIAorICogQGJyaWVmICBtZXNzYWdlIGRpYWxvZyB0ZW1wbGF0ZQorICogQGluZ3JvdXAgZ2l0a2NvcmUKKyAqCistLT4KKzxnaW1sIHhtbG5zPSJodHRwOi8vZ2l0ay5zb3VyY2Vmb3JnZS5uZXQvIiAKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9naXRrLnNvdXJjZWZvcmdlLm5ldC8gYnVnMTQ1MjQ2LnhzZCIJCisJeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiAKKwl4bWxuczppMThuPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjAiIAorCT4KKyAgPGRpYWxvZyBmb2N1cz0iY3RybCI+CisgICAgPG1ldGE+CisgICAgICA8ZGM6dGl0bGU+PGkxOG46dGV4dD5tZXNzYWdlPC9pMThuOnRleHQ+PC9kYzp0aXRsZT4KKyAgICA8L21ldGE+CisJICA8ZGlhbG9nd2lkZ2V0cz4KKyAgICAgCTxkaWFsb2d3aWRnZXQgaWQ9Ik9rYXkiLz4KKwkgIDwvZGlhbG9nd2lkZ2V0cz4KKyAgICA8d2lkZ2V0Z3JvdXA+CisgICAgICA8d2lkZ2V0IGlkPSJNZXNzYWdlIiB0eXBlPSJsYWJlbCIvPgorICAgIDwvd2lkZ2V0Z3JvdXA+CisgIDwvZGlhbG9nPgorPC9naW1sPgorCmRpZmYgLS1naXQgYS90ZXN0L3NjaGVtYXMvYnVnMTQ1MjQ2XzAueHNkIGIvdGVzdC9zY2hlbWFzL2J1ZzE0NTI0Nl8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2ZlOGM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zY2hlbWFzL2J1ZzE0NTI0Nl8wLnhzZApAQCAtMCwwICsxLDE3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiA/PgorPCEtLSAgCisgKiAkSWQ6IGdpbWwueHNkLHYgMS4zIDIwMDQvMDYvMjUgMDk6MDM6NTMgZW5zb25pYyBFeHAgJAorICogQGZpbGUgICBnaW1sLnhzZAorICogQGF1dGhvciBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKiBAZGF0ZSAgIFRodSBKdW4gMjQgMTc6Mjg6MjYgTUVTVCAyMDA0CisgKiAKKyAqIEBicmllZiAgZ2ltbCBkb2N1bWVudCBzY2hlbWEgZGVmaW5pdGlvbgorICogQGluZ3JvdXAgZ2l0a2NvcmUKKyAqCistLT4KKzx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZ2l0ay5zb3VyY2Vmb3JnZS5uZXQvIgorCQl4bWxucz0iaHR0cDovL2dpdGsuc291cmNlZm9yZ2UubmV0LyIKKwkJeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCQl4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCisJCXhtbG5zOmkxOG49Imh0dHA6Ly9hcGFjaGUub3JnL2NvY29vbi9pMThuLzIuMC8iPgorCTx4czphbm5vdGF0aW9uPgorCQk8eHM6ZG9jdW1lbnRhdGlvbj4KKwkJCVRoaXMgc2NoZW1hIGRlc2NyaWJlcyBnaW1sIGRpYWxvZyBzb3VyY2VzCisJCTwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgPC94czphbm5vdGF0aW9uPgorCisgIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKKwkJc2NoZW1hTG9jYXRpb249ImJ1ZzE0NTI0Ni54c2QuaW1wIgorCS8+CisgIDwhLS14czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vYXBhY2hlLm9yZy9jb2Nvb24vaTE4bi8yLjAvIgorCQlzY2hlbWFMb2NhdGlvbj0iZmlsZTovLy4vaTE4bi54c2QiCisJLy0tPgorIAorIDwhLS0gZm9yZWlnbiBuYW1lc3BhY2UKKwkgPHhzOmVsZW1lbnQgbmFtZT0idGl0bGUiPgorCQkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KKwkJCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCQkJCTwveHM6Y2hvaWNlPgorCQkJPC94czpjb21wbGV4VHlwZT4KKwkJPC94czplbGVtZW50PgorCQorCQk8eHM6ZWxlbWVudCBuYW1lPSJ0ZXh0Ij4KKwkJCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+PC94czpjb21wbGV4VHlwZT4KKwkJPC94czplbGVtZW50PgorIC0tPgorCQorCTx4czplbGVtZW50IG5hbWU9Im9wdGlvbiI+CisJCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+CisJCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPjwveHM6Y2hvaWNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwkKKwk8eHM6ZWxlbWVudCBuYW1lPSJvcHRpb25zIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3B0aW9uIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwkKKwk8eHM6ZWxlbWVudCBuYW1lPSJkaXNhYmxlZCI+CisJCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+PC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJCisJPHhzOmVsZW1lbnQgbmFtZT0icmVxdWlyZWQiPgorCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPjwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCQorCTx4czplbGVtZW50IG5hbWU9InZhbHVlIj4KKwkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj48L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwkKKwk8eHM6ZWxlbWVudCBuYW1lPSJsYWJlbCI+CisJCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+CisJCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj48L3hzOmNob2ljZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJCisJPHhzOmVsZW1lbnQgbmFtZT0id2lkZ2V0Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IHJlZj0ibWV0YSIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJsYWJlbCIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJkaXNhYmxlZCIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJ2YWx1ZSIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvcHRpb25zIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiBkZWZhdWx0PSJhY3Rpb24iPgorCQkJCTx4czpzaW1wbGVUeXBlPgorCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWN0aW9uIi8+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNoYXJhY3RlcmlucHV0Ii8+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNoYXJhY3RlcmlucHV0X251bWVyaWMiLz4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2hhcmFjdGVyaW5wdXRfYWxwaGFiZXRpYyIvPgorCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvcHRpb25jaG9pY2UiLz4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib3B0aW9uY2hvaWNlX2Jvb2xlYW4iLz4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib3B0aW9uY2hvaWNlX3NpbmdsZSIvPgorCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvcHRpb25jaG9pY2Vfc2luZ2xlX2NvbXBhY3QiLz4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGFiZWwiLz4KKwkJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCQk8L3hzOnNpbXBsZVR5cGU+CisJCQk8L3hzOmF0dHJpYnV0ZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaGFzRm9jdXMiIGRlZmF1bHQ9ImZhbHNlIj4KKwkJCQk8eHM6c2ltcGxlVHlwZT4KKwkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiLz4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiLz4KKwkJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCQk8L3hzOnNpbXBsZVR5cGU+CisJCQk8L3hzOmF0dHJpYnV0ZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJCisJPHhzOmVsZW1lbnQgbmFtZT0id2lkZ2V0Z3JvdXAiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJtZXRhIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9ImxhYmVsIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9IndpZGdldCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0id2lkZ2V0Z3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCQorCTx4czplbGVtZW50IG5hbWU9ImRpYWxvZ3dpZGdldCI+CisJCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwkKKwk8eHM6ZWxlbWVudCBuYW1lPSJkaWFsb2d3aWRnZXRzIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IHJlZj0iZGlhbG9nd2lkZ2V0IiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJCisJPHhzOmVsZW1lbnQgbmFtZT0ibWV0YSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCByZWY9ImRjOnRpdGxlIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwkKKwk8eHM6ZWxlbWVudCBuYW1lPSJkaWFsb2ciPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJtZXRhIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IHJlZj0iZGlhbG9nd2lkZ2V0cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9IndpZGdldGdyb3VwIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZm9jdXMiIGRlZmF1bHQ9Im1haW4iPgorCQkJCTx4czpzaW1wbGVUeXBlPgorCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFpbiIvPgorCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjdHJsIi8+CisJCQkJCTwveHM6cmVzdHJpY3Rpb24+CisJCQkJPC94czpzaW1wbGVUeXBlPgorCQkJPC94czphdHRyaWJ1dGU+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCQorCTx4czplbGVtZW50IG5hbWU9ImdpbWwiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJkaWFsb2ciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPCEtLXhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWxucyIgdHlwZT0ieHM6c3RyaW5nIiBmaXhlZD0iaHR0cDovL2dpdGsuc291cmNlZm9yZ2UubmV0LyIvLS0+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCis8L3hzOnNjaGVtYT4KKwpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzAueG1sIGIvdGVzdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDNmZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NjaGVtYXMvZWxlbWVudC1lcnJfMC54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxmb28geG1sbnM9Imh0dHA6Ly9GT08iIAorCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAorCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL0ZPTyBlbGVtZW50LWVycl8wLnhzZCIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy9lbGVtZW50LWVycl8wLnhzZCBiL3Rlc3Qvc2NoZW1hcy9lbGVtZW50LWVycl8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWM2OTZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zY2hlbWFzL2VsZW1lbnQtZXJyXzAueHNkCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9GT08iCisJeG1sbnM6Zm9vPSJodHRwOi8vRk9PIgorCXhtbG5zOmdvbz0iaHR0cDovL0dPTyI+CisJCisJPHhzZDplbGVtZW50IG5hbWU9ImJhciIgdHlwZT0ieHNkOnN0cmluZyIvPgorCTx4c2Q6ZWxlbWVudCB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvbyIgCisJCXJlZj0iZm9vOmJhciIgbWluT2NjdXJzPSIzIiBtYXhPY2N1cnM9IjIiIAorCQlhYnN0cmFjdD0idHJ1ZSIgYmxvY2s9ImZsdXRlIgorCQlmb3JtPSJxdWFsaWZpZWQiIGlkPSJiMTIiIG5pbGxhYmxlPSJ0cnVlIiAKKwkJc3Vic3RpdHV0aW9uR3JvdXA9ImZvbzpiYXIiIAorCQlkZWZhdWx0PSJKaW1pIiBmaXhlZD0iSGVuZHJpeCIgZmluYWw9ImZhbnRhc3kiPgorCisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImZvbzpiYXIiIG5hbWU9Im15b215IiBtaW5PY2N1cnM9IjMiIAorCQkJCQltYXhPY2N1cnM9IjIiIGFic3RyYWN0PSJ0cnVlIiBibG9jaz0iZmx1dGUiCisJCQkJCWZvcm09InF1YWxpZmllZCIgaWQ9ImIxMiIgbmlsbGFibGU9InRydWUiIAorCQkJCQlzdWJzdGl0dXRpb25Hcm91cD0iZm9vOmJhciIgdHlwZT0ieHNkOnN0cmluZyIgCisJCQkJCWRlZmF1bHQ9IkppbWkiIGZpeGVkPSJIZW5kcml4IiBmaW5hbD0iZmFudGFzeSI+CisJCQkJCTx4c2Q6Y29tcGxleFR5cGUvPgorCQkJCQk8eHNkOnNpbXBsZVR5cGUvPgorCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Im15b215IiBtYXhPY2N1cnM9IjAiCisJCQkJCWFic3RyYWN0PSJ0cnVlIiBibG9jaz0iZmx1dGUiCisJCQkJCWZvcm09InF1YWxpZmllZCIgaWQ9ImIxMiIgbmlsbGFibGU9InRydWUiIAorCQkJCQlzdWJzdGl0dXRpb25Hcm91cD0iZm9vOmJhciIgdHlwZT0ieHNkOnN0cmluZyIgCisJCQkJCWRlZmF1bHQ9IkppbWkiIGZpeGVkPSJIZW5kcml4IiBmaW5hbD0iZmFudGFzeSI+CisJCQkJCTx4c2Q6Y29tcGxleFR5cGUvPgorCQkJCQk8eHNkOnNpbXBsZVR5cGUvPgorCQkJCTwveHNkOmVsZW1lbnQ+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisKKwk8L3hzZDplbGVtZW50PgorCis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS90ZXN0L3NjaGVtYXMvZWxlbWVudC1taW5tYXgtZXJyXzAueG1sIGIvdGVzdC9zY2hlbWFzL2VsZW1lbnQtbWlubWF4LWVycl8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmM1ZWMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zY2hlbWFzL2VsZW1lbnQtbWlubWF4LWVycl8wLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPGZvbyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKKwl4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iZWxlbWVudC1taW5tYXgtZXJyXzAueHNkIj4KKwk8YmFyLz4KKzwvZm9vPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy9lbGVtZW50LW1pbm1heC1lcnJfMC54c2QgYi90ZXN0L3NjaGVtYXMvZWxlbWVudC1taW5tYXgtZXJyXzAueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzODRlN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NjaGVtYXMvZWxlbWVudC1taW5tYXgtZXJyXzAueHNkCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CisJPHhzZDplbGVtZW50IG5hbWU9ImZvbyI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJiYXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIwIi8+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisJPC94c2Q6ZWxlbWVudD4KKworPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy9mYWNldC11bmlvblNULWVycjFfMC54bWwgYi90ZXN0L3NjaGVtYXMvZmFjZXQtdW5pb25TVC1lcnIxXzAueG1sCmluZGV4IGFhOTZlMjAuLmI0N2RmNjEgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2NoZW1hcy9mYWNldC11bmlvblNULWVycjFfMC54bWwKKysrIGIvdGVzdC9zY2hlbWFzL2ZhY2V0LXVuaW9uU1QtZXJyMV8wLnhtbApAQCAtMSw0ICsxLDQgQEAKIDw/eG1sIHZlcnNpb249IjEuMCI/PgogPGZvbyB4bWxucz0iaHR0cDovL0ZPTyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vRk9PIGZhY2V0LXVuaW9uU1QtZXJyMV8wLnhzZCI+bGFyZ2U8L2Zvbz4KKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9GT08gZmFjZXQtdW5pb25TVC1lcnIxXzAueHNkIj50aW55PC9mb28+CiAKZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy9pbmNsdWRlMV8wLmluYyBiL3Rlc3Qvc2NoZW1hcy9pbmNsdWRlMV8wLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQ1YWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zY2hlbWFzL2luY2x1ZGUxXzAuaW5jCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgPgorCisJPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImJhclR5cGUiPgorCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorCQkJPHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIiAvPgorCQk8L3hzZDpyZXN0cmljdGlvbj4KKwk8L3hzZDpzaW1wbGVUeXBlPgorCisJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYmFyIiB0eXBlPSJiYXJUeXBlIiBmaXhlZD0ibyIvPgorCisJPHhzZDplbGVtZW50IG5hbWU9ImJhci5CIiB0eXBlPSJ4c2Q6YW55VVJJIiBibG9jaz0iI2FsbCIgbmlsbGFibGU9InRydWUiIGZpbmFsPSJyZXN0cmljdGlvbiBleHRlbnNpb24iLz4KKwkKKwk8eHNkOmVsZW1lbnQgbmFtZT0iYmFyIj4KKwkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCTx4c2Q6c2VxdWVuY2U+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9ImJhci5BIiBibG9jaz0icmVzdHJpY3Rpb24iIGZvcm09InF1YWxpZmllZCIgbmlsbGFibGU9InRydWUiIC8+CisJCQkJPHhzZDplbGVtZW50IHJlZj0iYmFyLkIiLz4KKwkJCTwveHNkOnNlcXVlbmNlPgorCQkJCisJCQk8eHNkOmF0dHJpYnV0ZSByZWY9ImJhciIgeG1sOmxhbmc9IkRFIj4KKwkJCQk8eHNkOmFubm90YXRpb24vPgorCQkJPC94c2Q6YXR0cmlidXRlPgorCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJ4c2Q6dG9rZW4iIC8+CisJCTwveHNkOmNvbXBsZXhUeXBlPgorCTwveHNkOmVsZW1lbnQ+CisKKzwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3NjaGVtYXMvaW5jbHVkZTFfMC54bWwgYi90ZXN0L3NjaGVtYXMvaW5jbHVkZTFfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmZWUwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2NoZW1hcy9pbmNsdWRlMV8wLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPGZvbzpmb28geG1sbnM6Zm9vPSJodHRwOi8vRk9PIiAKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9GT08gaW5jbHVkZTFfMC54c2QiIGZvbzpyZXE9Im9vIj4KKwk8Zm9vOmJhciBmb286YmFyPSJvIiAgdXJpPSJhc2QiPjxmb286YmFyLkEvPjxmb286YmFyLkI+YW55VVJJPC9mb286YmFyLkI+PC9mb286YmFyPgorCTxib28vPgorCQorPC9mb286Zm9vPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy9pbmNsdWRlMV8wLnhzZCBiL3Rlc3Qvc2NoZW1hcy9pbmNsdWRlMV8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTZkODM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zY2hlbWFzL2luY2x1ZGUxXzAueHNkCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9GT08iCisJeG1sbnM6Zm9vPSJodHRwOi8vRk9PIiB2ZXJzaW9uPSIiPgorCTx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iaW5jbHVkZTFfMC5pbmMiIC8+CisJPHhzZDplbGVtZW50IG5hbWU9ImZvbyI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImZvbzpiYXIiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYm9vIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCQk8L3hzZDpzZXF1ZW5jZT4JCisJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXEiIHVzZT0icmVxdWlyZWQiIGZvcm09InF1YWxpZmllZCIvPgkJCisJCTwveHNkOmNvbXBsZXhUeXBlPgorCTwveHNkOmVsZW1lbnQ+Cis8L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL2l0ZW1fMC54c2QgYi90ZXN0L3NjaGVtYXMvaXRlbV8wLnhzZAppbmRleCAzZDk1ZWYzLi4zMTVlMDZlIDEwMDY0NAotLS0gYS90ZXN0L3NjaGVtYXMvaXRlbV8wLnhzZAorKysgYi90ZXN0L3NjaGVtYXMvaXRlbV8wLnhzZApAQCAtNyw3ICs3LDcgQEAKICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iXGR7M30tW0EtWl17Mn0iLz4KICAgICA8L3hzZDpyZXN0cmljdGlvbj4KICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbSI+CiAgICAgPHhzZDpjb21wbGV4VHlwZT4KICAgICAgIDx4c2Q6c2VxdWVuY2U+CiAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9kdWN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL2l0ZW1fMS54c2QgYi90ZXN0L3NjaGVtYXMvaXRlbV8xLnhzZAppbmRleCBjZWExZjAxLi4zY2Y5NjZlIDEwMDY0NAotLS0gYS90ZXN0L3NjaGVtYXMvaXRlbV8xLnhzZAorKysgYi90ZXN0L3NjaGVtYXMvaXRlbV8xLnhzZApAQCAtNyw3ICs3LDcgQEAKICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iXGR7M30tW0EtWl17Mn0iLz4KICAgICA8L3hzZDpyZXN0cmljdGlvbj4KICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbSI+CiAgICAgPHhzZDpjb21wbGV4VHlwZT4KICAgICAgIDx4c2Q6c2VxdWVuY2U+CiAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9kdWN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL3Jlc3RyaWN0LUNULWF0dHItcmVmXzAueG1sIGIvdGVzdC9zY2hlbWFzL3Jlc3RyaWN0LUNULWF0dHItcmVmXzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjFhODMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NjaGVtYXMvcmVzdHJpY3QtQ1QtYXR0ci1yZWZfMC54bWwKQEAgLTAsMCArMSwzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxmb286Zm9vIHhtbG5zOmZvbz0iaHR0cDovL0ZPTyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vRk9PIHJlc3RyaWN0LUNULWF0dHItcmVmXzAueHNkIiBmb286aWQ9ImIwODM2MjE3NDYyIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9zY2hlbWFzL3Jlc3RyaWN0LUNULWF0dHItcmVmXzAueHNkIGIvdGVzdC9zY2hlbWFzL3Jlc3RyaWN0LUNULWF0dHItcmVmXzAueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OGI4MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NjaGVtYXMvcmVzdHJpY3QtQ1QtYXR0ci1yZWZfMC54c2QKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKKwlhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorCXhtbG5zOmZvbz0iaHR0cDovL0ZPTyIKKwl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9GT08iPgorCisJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorCisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlSURBdHRyIj4KKyAgICAJCTx4c2Q6YXR0cmlidXRlIHJlZj0iZm9vOmlkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisKKwk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZm9vSUQiPgorICAgIAkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6SUQiPgorICAgICAgCQkJPHhzZDpwYXR0ZXJuIHZhbHVlPSJiXGR7MTB9Ii8+CisgICAgCQk8L3hzZDpyZXN0cmljdGlvbj4KKyAgCTwveHNkOnNpbXBsZVR5cGU+CisKKwk8eHNkOmVsZW1lbnQgbmFtZT0iZm9vIj4KKyAgICAJCTx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAJCQk8eHNkOmNvbXBsZXhDb250ZW50PgorICAgICAgICAJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImZvbzp0eXBlSURBdHRyIj4gICAgICAgICAKKyAgICAgICAgICAJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9ImZvbzpmb29JRCIvPgorICAgICAgICAJCQk8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgIAkJCTwveHNkOmNvbXBsZXhDb250ZW50PgorICAgIAkJPC94c2Q6Y29tcGxleFR5cGU+CisgIAk8L3hzZDplbGVtZW50PgorCisKKzwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3NjaGVtYXMvdW5pb25fMF8wLnhtbCBiL3Rlc3Qvc2NoZW1hcy91bmlvbl8wXzAueG1sCmluZGV4IDc5MDc4ZjkuLjFhNDc3NjMgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2NoZW1hcy91bmlvbl8wXzAueG1sCisrKyBiL3Rlc3Qvc2NoZW1hcy91bmlvbl8wXzAueG1sCkBAIC0xLDYgKzEsNyBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTxmb28geG1sbnM9Imh0dHA6Ly9mb28iCi14bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiA+Cis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8Zm9vIHhtbG5zPSJodHRwOi8vZm9vIiAKKwl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKKwl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9mb28gdW5pb25fMF8wLnhzZCI+CiAgICAgICA8ZW0+RU1QMDA5MDwvZW0+CiAgICAgICA8ZW0+RU1QMDA5OTwvZW0+CiA8L2Zvbz4KZGlmZiAtLWdpdCBhL3Rlc3Qvc2NoZW1hcy91bmlvbl8wXzAueHNkIGIvdGVzdC9zY2hlbWFzL3VuaW9uXzBfMC54c2QKaW5kZXggYTZkZmFkMC4uMjNlOTNkMSAxMDA2NDQKLS0tIGEvdGVzdC9zY2hlbWFzL3VuaW9uXzBfMC54c2QKKysrIGIvdGVzdC9zY2hlbWFzL3VuaW9uXzBfMC54c2QKQEAgLTcsNyArNywxMCBAQAogICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9vIj4KICAgCSAgPHhzZDpjb21wbGV4VHlwZT4KICAgCSAgCTx4c2Q6c2VxdWVuY2U+ICAKLSAgCQkJPHhzZDplbGVtZW50IG5hbWU9ImVtIiB0eXBlPSJlbVR5cGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CSAgCQorICAJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZW0iIAorCQkJCXR5cGU9ImVtVHlwZSIgCisJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCisJCQkJZm9ybT0icXVhbGlmaWVkIi8+CSAgCQogICAJCTwveHNkOnNlcXVlbmNlPgogICAJICA8L3hzZDpjb21wbGV4VHlwZT4gICAgCiAgIDwveHNkOmVsZW1lbnQ+CmRpZmYgLS1naXQgYS90ZXN0L3NjaGVtYXMveHNkLXNpbXBsZVR5cGUtdmFyaWV0aWVzXzAueHNkIGIvdGVzdC9zY2hlbWFzL3hzZC1zaW1wbGVUeXBlLXZhcmlldGllc18wLnhzZAppbmRleCBlNGVkNmFjLi44YTc1MmUyIDEwMDY0NAotLS0gYS90ZXN0L3NjaGVtYXMveHNkLXNpbXBsZVR5cGUtdmFyaWV0aWVzXzAueHNkCisrKyBiL3Rlc3Qvc2NoZW1hcy94c2Qtc2ltcGxlVHlwZS12YXJpZXRpZXNfMC54c2QKQEAgLTIsNyArMiw5IEBACiAKIDwhLS0gVGhpcyB0ZXN0IGNoZWNrcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhcmlldGllcyBvZiB0aGUgeHNkOnNpbXBsZVR5cGUgZWxlbWVudC4gLS0+CiAgICAgCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vRk9PIiB4bWxuczpmb289Imh0dHA6Ly9GT08iPiAKKzxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKKwl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9GT08iIHhtbG5zOmZvbz0iaHR0cDovL0ZPTyIgCisJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAKIAogCTxlbGVtZW50IG5hbWU9ImZvbyI+CiAJCTxjb21wbGV4VHlwZT4KZGlmZiAtLWdpdCBhL3htbHJlZ2V4cC5jIGIveG1scmVnZXhwLmMKaW5kZXggMTJlY2Q4My4uMDQzNWQ2NyAxMDA2NDQKLS0tIGEveG1scmVnZXhwLmMKKysrIGIveG1scmVnZXhwLmMKQEAgLTM1LDggKzM1LDggQEAKICNkZWZpbmUgSU5UX01BWCAxMjM0NTY3ODkgLyogZWFzeSB0byBmbGFnIGFuZCBiaWcgZW5vdWdoIGZvciBvdXIgbmVlZHMgKi8KICNlbmRpZgogCi0vKiAjZGVmaW5lIERFQlVHX1JFR0VYUF9HUkFQSCAgKi8KLS8qICNkZWZpbmUgREVCVUdfUkVHRVhQX0VYRUMgKi8KKy8qICNkZWZpbmUgREVCVUdfUkVHRVhQX0dSQVBIICovCisvKiAjZGVmaW5lIERFQlVHX1JFR0VYUF9FWEVDICovIAogLyogI2RlZmluZSBERUJVR19QVVNIICovCiAvKiAjZGVmaW5lIERFQlVHX0NPTVBBQ1RJT04gKi8KIApAQCAtNDksNiArNDksNyBAQAogCiAjZGVmaW5lIENVUl9TQ0hBUihzLCBsKSB4bWxTdHJpbmdDdXJyZW50Q2hhcihOVUxMLCBzLCAmbCkKICNkZWZpbmUgTkVYVEwobCkgY3R4dC0+Y3VyICs9IGw7CisjZGVmaW5lIFhNTF9SRUdfU1RSSU5HX1NFUEFSQVRPUiAnfCcKIAogLyoqCiAgKiBUT0RPOgpAQCAtMjU3Nyw2ICsyNTc4LDQ3IEBACiAgICAgZXhlYy0+aW5wdXRTdGFja1tleGVjLT5pbnB1dFN0YWNrTnJdLmRhdGEgPSBOVUxMOwogfQogCisvKioKKyAqIHhtbFJlZ1N0ckVxdWFsV2lsZGNhcmQ6CisgKiBAZXhwU3RyOiAgdGhlIHN0cmluZyB0byBiZSBldmFsdWF0ZWQgCisgKiBAdmFsU3RyOiAgdGhlIHZhbGlkYXRpb24gc3RyaW5nCisgKgorICogQ2hlY2tzIGlmIGJvdGggc3RyaW5ncyBhcmUgZXF1YWwgb3IgaGF2ZSB0aGUgc2FtZSBjb250ZW50LiAiKiIKKyAqIGNhbiBiZSB1c2VkIGFzIGEgd2lsZGNhcmQgaW4gQHZhbFN0cjsgInwiIGlzIHVzZWQgYXMgYSBzZXBlcmF0b3Igb2YgCisgKiBzdWJzdHJpbmdzIGluIGJvdGggQGV4cFN0ciBhbmQgQHZhbFN0ci4KKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIGNvbXBhcmlzb24gaXMgc2F0aXNmaWVkIGFuZCB0aGUgbnVtYmVyIG9mIHN1YnN0cmluZ3MKKyAqIGlzIGVxdWFsLCAwIG90aGVyd2lzZS4KKyAqLworCitzdGF0aWMgaW50Cit4bWxSZWdTdHJFcXVhbFdpbGRjYXJkKGNvbnN0IHhtbENoYXIgKmV4cFN0ciwgY29uc3QgeG1sQ2hhciAqdmFsU3RyKSB7CisgICAgaWYgKGV4cFN0ciA9PSB2YWxTdHIpIHJldHVybigxKTsKKyAgICBpZiAoZXhwU3RyID09IE5VTEwpIHJldHVybigwKTsKKyAgICBpZiAodmFsU3RyID09IE5VTEwpIHJldHVybigwKTsKKyAgICBkbyB7CisJLyoKKwkqIEV2YWwgaWYgd2UgaGF2ZSBhIHdpbGRjYXJkIGZvciB0aGUgY3VycmVudCBpdGVtLgorCSovCisgICAgICAgIGlmICgqZXhwU3RyICE9ICp2YWxTdHIpIHsKKwkgICAgaWYgKCgqdmFsU3RyICE9IDApICYmICgqZXhwU3RyICE9IDApICYmICgqZXhwU3RyKysgPT0gJyonKSkgeworCQlkbyB7CisJCSAgICBpZiAoKnZhbFN0ciA9PSBYTUxfUkVHX1NUUklOR19TRVBBUkFUT1IpCisJCQlicmVhazsKKwkJICAgICp2YWxTdHIrKzsKKwkJfSB3aGlsZSAoKnZhbFN0ciAhPSAwKTsKKwkJY29udGludWU7CisJICAgIH0gZWxzZQorCQlyZXR1cm4oMCk7CisJfQorCSpleHBTdHIrKzsKKwkqdmFsU3RyKys7CisgICAgfSB3aGlsZSAoKnZhbFN0ciAhPSAwKTsKKyAgICBpZiAoKmV4cFN0ciAhPSAwKQorCXJldHVybiAoMCk7CisgICAgZWxzZQorCXJldHVybiAoMSk7Cit9CiAKIC8qKgogICogeG1sUmVnQ29tcGFjdFB1c2hTdHJpbmc6CkBAIC0yNjIxLDkgKzI2NjMsOSBAQAogICAgIGZvciAoaSA9IDA7aSA8IGNvbXAtPm5ic3RyaW5ncztpKyspIHsKIAl0YXJnZXQgPSBjb21wLT5jb21wYWN0W3N0YXRlICogKGNvbXAtPm5ic3RyaW5ncyArIDEpICsgaSArIDFdOwogCWlmICgodGFyZ2V0ID4gMCkgJiYgKHRhcmdldCA8PSBjb21wLT5uYnN0YXRlcykpIHsKLQkgICAgdGFyZ2V0LS07IC8qIHRvIGF2b2lkIDAgKi8KLQkgICAgaWYgKHhtbFN0ckVxdWFsKGNvbXAtPnN0cmluZ01hcFtpXSwgdmFsdWUpKSB7Ci0JCWV4ZWMtPmluZGV4ID0gdGFyZ2V0OworCSAgICB0YXJnZXQtLTsgLyogdG8gYXZvaWQgMCAqLyAgICAKKwkgICAgaWYgKHhtbFJlZ1N0ckVxdWFsV2lsZGNhcmQoY29tcC0+c3RyaW5nTWFwW2ldLCB2YWx1ZSkpIHsKKwkJZXhlYy0+aW5kZXggPSB0YXJnZXQ7CQkKIAkJaWYgKChleGVjLT5jYWxsYmFjayAhPSBOVUxMKSAmJiAoY29tcC0+dHJhbnNkYXRhICE9IE5VTEwpKSB7CiAJCSAgICBleGVjLT5jYWxsYmFjayhleGVjLT5kYXRhLCB2YWx1ZSwKIAkJCSAgY29tcC0+dHJhbnNkYXRhW3N0YXRlICogY29tcC0+bmJzdHJpbmdzICsgaV0sIGRhdGEpOwpAQCAtMjgwMiw3ICsyODQ0LDcgQEAKIAkJZXhlYy0+c3RhdHVzID0gLTI7CiAJCWJyZWFrOwogCSAgICB9IGVsc2UgaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkJcmV0ID0geG1sU3RyRXF1YWwodmFsdWUsIGF0b20tPnZhbHVlcCk7CisJCXJldCA9IHhtbFJlZ1N0ckVxdWFsV2lsZGNhcmQoYXRvbS0+dmFsdWVwLCB2YWx1ZSk7CiAJCWlmICgocmV0ID09IDEpICYmICh0cmFucy0+Y291bnRlciA+PSAwKSkgewogCQkgICAgeG1sUmVnQ291bnRlclB0ciBjb3VudGVyOwogCQkgICAgaW50IGNvdW50OwpAQCAtMjk5OSw3ICszMDQxLDcgQEAKIAlzdHIgPSBidWY7CiAgICAgfQogICAgIG1lbWNweSgmc3RyWzBdLCB2YWx1ZSwgbGVucCk7Ci0gICAgc3RyW2xlbnBdID0gJ3wnOworICAgIHN0cltsZW5wXSA9IFhNTF9SRUdfU1RSSU5HX1NFUEFSQVRPUjsKICAgICBtZW1jcHkoJnN0cltsZW5wICsgMV0sIHZhbHVlMiwgbGVubik7CiAgICAgc3RyW2xlbm4gKyBsZW5wICsgMV0gPSAwOwogCmRpZmYgLS1naXQgYS94bWxzY2hlbWFzLmMgYi94bWxzY2hlbWFzLmMKaW5kZXggNTljZmVlMC4uYzk1Y2FmMCAxMDA2NDQKLS0tIGEveG1sc2NoZW1hcy5jCisrKyBiL3htbHNjaGVtYXMuYwpAQCAtNDcsNiArNDcsOSBAQAogCiAvKiAjZGVmaW5lIERFQlVHX0FUVFJfVkFMSURBVElPTiAxICovCiAKKy8qICNkZWZpbmUgREVCVUdfVU5JT05fVkFMSURBVElPTiAxICovCisKKwogI2RlZmluZSBVTkJPVU5ERUQgKDEgPDwgMzApCiAjZGVmaW5lIFRPRE8gCQkJCQkJCQlcCiAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCQkJCVwKQEAgLTU1LDYgKzU4LDggQEAKIAogI2RlZmluZSBYTUxfU0NIRU1BU19ERUZBVUxUX05BTUVTUEFDRSAoY29uc3QgeG1sQ2hhciAqKSJ0aGUgZGVmYXVsdCBuYW1lc3BhY2UiCiAKKyNkZWZpbmUgWE1MX1NDSEVNQVNfTk9fTlMgKGNvbnN0IHhtbENoYXIgKikgIiMjIgorCiAvKgogICogVGhlIFhNTCBTY2hlbWFzIG5hbWVzcGFjZXMKICAqLwpAQCAtNjQsMTEgKzY5LDM0IEBACiBzdGF0aWMgY29uc3QgeG1sQ2hhciAqeG1sU2NoZW1hSW5zdGFuY2VOcyA9IChjb25zdCB4bWxDaGFyICopCiAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKIAorc3RhdGljIGNvbnN0IHhtbENoYXIgKnhtbFNjaGVtYUVsZW1EZXNFbGVtRGVjbCA9IChjb25zdCB4bWxDaGFyICopCisgICAgIkVsZW1lbnQgZGVjbC4iOworc3RhdGljIGNvbnN0IHhtbENoYXIgKnhtbFNjaGVtYUVsZW1EZXNFbGVtUmVmID0gKGNvbnN0IHhtbENoYXIgKikKKyAgICAiRWxlbWVudCByZWYuIjsKK3N0YXRpYyBjb25zdCB4bWxDaGFyICp4bWxTY2hlbWFFbGVtRGVzQXR0ckRlY2wgPSAoY29uc3QgeG1sQ2hhciAqKQorICAgICJBdHRyaWJ1dGUgZGVjbC4iOworc3RhdGljIGNvbnN0IHhtbENoYXIgKnhtbFNjaGVtYUVsZW1EZXNBdHRyUmVmID0gKGNvbnN0IHhtbENoYXIgKikKKyAgICAiQXR0cmlidXRlIHJlZi4iOworc3RhdGljIGNvbnN0IHhtbENoYXIgKnhtbFNjaGVtYUVsZW1EZXNTVCA9IChjb25zdCB4bWxDaGFyICopCisgICAgIlNUIjsKK3N0YXRpYyBjb25zdCB4bWxDaGFyICp4bWxTY2hlbWFFbGVtRGVzQ1QgPSAoY29uc3QgeG1sQ2hhciAqKQorICAgICJDVCI7CisKICNkZWZpbmUgSVNfU0NIRU1BKG5vZGUsIHR5cGUpCQkJCQkJXAogICAgKChub2RlICE9IE5VTEwpICYmIChub2RlLT5ucyAhPSBOVUxMKSAmJgkJCQlcCiAgICAgKHhtbFN0ckVxdWFsKG5vZGUtPm5hbWUsIChjb25zdCB4bWxDaGFyICopIHR5cGUpKSAmJgkJXAogICAgICh4bWxTdHJFcXVhbChub2RlLT5ucy0+aHJlZiwgeG1sU2NoZW1hTnMpKSkKIAorI2RlZmluZSBGUkVFX0FORF9OVUxMKHN0cikJCQkJCQlcCisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CQkJCQkJCVwKKwl4bWxGcmVlKHN0cik7CQkJCQkJCVwKKwlzdHIgPSBOVUxMOwkJCQkJCQlcCisgICAgfQorCisjZGVmaW5lIFhNTF9TQ0hFTUFTX1ZBTF9XVFNQX1BSRVNFUlZFIDAKKyNkZWZpbmUgWE1MX1NDSEVNQVNfVkFMX1dUU1BfUkVQTEFDRSAgMQorI2RlZmluZSBYTUxfU0NIRU1BU19WQUxfV1RTUF9DT0xMQVBTRSAyCisKICNkZWZpbmUgWE1MX1NDSEVNQVNfUEFSU0VfRVJST1IJCTEKIAogI2RlZmluZSBTQ0hFTUFTX1BBUlNFX09QVElPTlMgWE1MX1BBUlNFX05PRU5UCkBAIC0xNjAsNiArMTg4LDggQEAKICAgICAvKiB4bWxTY2hlbWFBdHRyU3RhdGVQdHIgYXR0ckJhc2U7ICovCiAgICAgLyogaW50IGF0dHJNYXg7ICovCiAgICAgeG1sU2NoZW1hQXR0clN0YXRlUHRyIGF0dHI7CisgICAgeG1sTm9kZVB0ciBzY29wZTsKKyAgICBpbnQgdmFsdWVXUzsKIH07CiAKIC8qCkBAIC0xODksMjIgKzIxOSwxMCBAQAogICogCQkJU29tZSBwcmVkZWNsYXJhdGlvbnMJCQkJKgogICogCQkJCQkJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAwIC8qIE5vdCBjdXJyZW50bHkgdXNlZC4gKi8KLXN0YXRpYyBpbnQgeG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVWYWx1ZSh4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIHZhbHVlKTsKLSNlbmRpZgogCiBzdGF0aWMgaW50IHhtbFNjaGVtYVBhcnNlSW5jbHVkZSh4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFQdHIgc2NoZW1hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBub2RlKTsKLSNpZiAwCi1zdGF0aWMgaW50Ci14bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVZhbHVlSW50ZXJuYWwoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZSwKLQkJCSAgICAgY29uc3QgeG1sQ2hhciAqIHZhbHVlLAotCQkJICAgICBpbnQgZmlyZUVycm9ycyk7Ci0jZW5kaWYgLyogTm90IGN1cnJlbnRseSB1c2VkLiAqLwogc3RhdGljIHZvaWQKIHhtbFNjaGVtYVR5cGVGaXh1cCh4bWxTY2hlbWFUeXBlUHRyIHR5cGVEZWNsLAogICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwgY29uc3QgeG1sQ2hhciAqIG5hbWUpOwpAQCAtMjE0LDcgKzIzMiw4IEBACiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZSh4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCwgCiAJCQkJIGNvbnN0IHhtbENoYXIgKnZhbHVlLAogCQkJCSBpbnQgZmlyZUVycm9ycywJCQkJIAotCQkJCSBpbnQgYXBwbHlGYWNldHMpOworCQkJCSBpbnQgYXBwbHlGYWNldHMsCisJCQkJIGludCBub3JtYWxpemUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJCQkJCSoKQEAgLTM5Miw2ICs0MTEsNDQgQEAKIAkJICAgIChjb25zdCBjaGFyICopIHN0cjMsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgIG1zZywgc3RyMSwgc3RyMiwgc3RyMyk7CiB9CisKKy8qKgorICogeG1sU2NoZW1hVkVyckV4dDoKKyAqIEBjdHh0OiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0CisgKiBAbm9kZTogdGhlIGNvbnRleHQgbm9kZQorICogQGVycm9yOiB0aGUgZXJyb3IgY29kZSAKKyAqIEBtc2c6IHRoZSBtZXNzYWdlCisgKiBAc3RyMTogIGV4dHJhIHBhcmFtZXRlciBmb3IgdGhlIG1lc3NhZ2UgZGlzcGxheQorICogQHN0cjI6ICBleHRyYSBwYXJhbWV0ZXIgZm9yIHRoZSBtZXNzYWdlIGRpc3BsYXkKKyAqIEBzdHIzOiAgZXh0cmEgcGFyYW1ldGVyIGZvciB0aGUgbWVzc2FnZSBkaXNwbGF5CisgKiBAc3RyNDogIGV4dHJhIHBhcmFtZXRlciBmb3IgdGhlIG1lc3NhZ2UgZGlzcGxheQorICogQHN0cjU6ICBleHRyYSBwYXJhbWV0ZXIgZm9yIHRoZSBtZXNzYWdlIGRpc3BsYXkKKyAqIAorICogSGFuZGxlIGEgdmFsaWRhdGlvbiBlcnJvcgorICovCitzdGF0aWMgdm9pZAoreG1sU2NoZW1hVkVyckV4dCh4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCwgeG1sTm9kZVB0ciBub2RlLCBpbnQgZXJyb3IsCisJCSBjb25zdCBjaGFyICptc2csIGNvbnN0IHhtbENoYXIgKiBzdHIxLCAKKwkJIGNvbnN0IHhtbENoYXIgKiBzdHIyLCBjb25zdCB4bWxDaGFyICogc3RyMywgCisJCSBjb25zdCB4bWxDaGFyICogc3RyNCwgY29uc3QgeG1sQ2hhciAqIHN0cjUpCit7CisgICAgeG1sU3RydWN0dXJlZEVycm9yRnVuYyBzY2hhbm5lbCA9IE5VTEw7CisgICAgeG1sR2VuZXJpY0Vycm9yRnVuYyBjaGFubmVsID0gTlVMTDsKKyAgICB2b2lkICpkYXRhID0gTlVMTDsKKworICAgIGlmIChjdHh0ICE9IE5VTEwpIHsKKyAgICAgICAgY3R4dC0+bmJlcnJvcnMrKzsKKwljdHh0LT5lcnIgPSBlcnJvcjsKKyAgICAgICAgY2hhbm5lbCA9IGN0eHQtPmVycm9yOworICAgICAgICBzY2hhbm5lbCA9IGN0eHQtPnNlcnJvcjsKKyAgICAgICAgZGF0YSA9IGN0eHQtPnVzZXJEYXRhOworICAgIH0KKyAgICAvKiByZWFqdXN0IHRvIGdsb2JhbCBlcnJvciBudW1iZXJzICovCisgICAgZXJyb3IgKz0gWE1MX1NDSEVNQVZfTk9ST09UIC0gWE1MX1NDSEVNQVNfRVJSX05PUk9PVDsKKyAgICBfX3htbFJhaXNlRXJyb3Ioc2NoYW5uZWwsIGNoYW5uZWwsIGRhdGEsIGN0eHQsIG5vZGUsIFhNTF9GUk9NX1NDSEVNQVNQLAorICAgICAgICAgICAgICAgICAgICBlcnJvciwgWE1MX0VSUl9FUlJPUiwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMCwgCisJCSAgICBtc2csIHN0cjEsIHN0cjIsIHN0cjMsIHN0cjQsIHN0cjUpOworfQogLyoqCiAgKiB4bWxTY2hlbWFWRXJyOgogICogQGN0eHQ6IHRoZSB2YWxpZGF0aW9uIGNvbnRleHQKQEAgLTQyNiw2ICs0ODMsMTAxMyBAQAogICAgICAgICAgICAgICAgICAgICBtc2csIHN0cjEsIHN0cjIpOwogfQogCisvKioKKyAqIHhtbFNjaGVtYUdldE9ueW1vdXNUeXBlTmFtZToKKyAqIEBhdHRyOiAgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi91c2UKKyAqCisgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGU7IGlmIHRoZSBhdHRyaWJ1dGUKKyAqIGlzIGEgcmVmZXJlbmNlLCB0aGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgdHlwZSB3aWxsIGJlIHJldHVybmVkLgorICovCitzdGF0aWMgY29uc3QgeG1sQ2hhciAqCit4bWxTY2hlbWFHZXRBdHRyTmFtZSh4bWxTY2hlbWFBdHRyaWJ1dGVQdHIgYXR0cikgCit7CisgICAgaWYgKGF0dHItPnJlZiAhPSBOVUxMKSAKKwlyZXR1cm4oYXR0ci0+cmVmKTsKKyAgICBlbHNlCisJcmV0dXJuKGF0dHItPm5hbWUpOwkKK30KKworLyoqCisgKiB4bWxTY2hlbWFHZXRPbnltb3VzVGFyZ2V0TnNVUkk6CisgKiBAdHlwZTogIHRoZSB0eXBlIChlbGVtZW50IG9yIGF0dHJpYnV0ZSkKKyAqCisgKiBSZXR1cm5zIHRoZSB0YXJnZXQgbmFtZXNwYWNlIFVSSSBvZiB0aGUgdHlwZTsgaWYgdGhlIHR5cGUgaXMgYSByZWZlcmVuY2UsCisgKiB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgcmVmZXJlbmNlZCB0eXBlIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBjb25zdCB4bWxDaGFyICoKK3htbFNjaGVtYUdldEF0dHJUYXJnZXROc1VSSSh4bWxTY2hlbWFBdHRyaWJ1dGVQdHIgYXR0cikKK3sgIAorICAgIGlmIChhdHRyLT5yZWYgIT0gTlVMTCkKKwlyZXR1cm4gKGF0dHItPnJlZk5zKTsKKyAgICBlbHNlCisJcmV0dXJuKGF0dHItPnRhcmdldE5hbWVzcGFjZSk7ICAKK30KKworLyoqCisgKiB4bWxTY2hlbWFGb3JtYXROc1VyaUxvY2FsOgorICogQGJ1ZjogdGhlIHN0cmluZyBidWZmZXIKKyAqIEB1cmk6ICB0aGUgbmFtZXNwYWNlIFVSSQorICogQGxvY2FsOiB0aGUgbG9jYWwgbmFtZQorICoKKyAqIFJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gVVJJIHVzZWQKKyAqIGZvciBlcnJvciByZXBvcnRzLgorICoKKyAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCBpZiBAbnMgaXMgTlVMTCwgYSBmb3JtYXR0ZWQKKyAqIHN0cmluZyBvdGhlcndpc2UuCisgKi8gIAorc3RhdGljIGNvbnN0IHhtbENoYXIqICAgCit4bWxTY2hlbWFGb3JtYXROc1VyaUxvY2FsKHhtbENoYXIgKipidWYsCisJCQkgICBjb25zdCB4bWxDaGFyICp1cmksIGNvbnN0IHhtbENoYXIgKmxvY2FsKQoreworICAgIGlmICgqYnVmICE9IE5VTEwpCisJeG1sRnJlZSgqYnVmKTsKKyAgICBpZiAodXJpID09IE5VTEwpIHsKKwkqYnVmID0geG1sU3RyZHVwKEJBRF9DQVNUICJ7JyIpOworCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgbG9jYWwpOworICAgIH0gZWxzZSB7CisJKmJ1ZiA9IHhtbFN0cmR1cChCQURfQ0FTVCAieyciKTsKKwkqYnVmID0geG1sU3RyY2F0KCpidWYsIHVyaSk7CisJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiJywgJyIpOworCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgbG9jYWwpOwkKKyAgICB9CisgICAgKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiJ30iKTsKKyAgICByZXR1cm4gKChjb25zdCB4bWxDaGFyICopICpidWYpOworfQorCisvKioKKyAqIHhtbFNjaGVtYUZvcm1hdE5zUHJlZml4TG9jYWw6CisgKiBAYnVmOiB0aGUgc3RyaW5nIGJ1ZmZlcgorICogQG5zOiAgdGhlIG5hbWVzcGFjZQorICogQGxvY2FsOiB0aGUgbG9jYWwgbmFtZQorICoKKyAqIFJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gVVJJIHVzZWQKKyAqIGZvciBlcnJvciByZXBvcnRzLgorICoKKyAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCBpZiBAbnMgaXMgTlVMTCwgYSBmb3JtYXR0ZWQKKyAqIHN0cmluZyBvdGhlcndpc2UuCisgKi8gIAorc3RhdGljIGNvbnN0IHhtbENoYXIqICAgCit4bWxTY2hlbWFGb3JtYXROc1ByZWZpeExvY2FsKHhtbENoYXIgKipidWYsCisJCQkgICAgICB4bWxOc1B0ciBucywgY29uc3QgeG1sQ2hhciAqbG9jYWwpCit7CisgICAgaWYgKCpidWYgIT0gTlVMTCkgeworCXhtbEZyZWUoKmJ1Zik7CisJKmJ1ZiA9IE5VTEw7CisgICAgfQorICAgIGlmICgobnMgPT0gTlVMTCkgfHwgKG5zLT5wcmVmaXggPT0gTlVMTCkpCisJcmV0dXJuKGxvY2FsKTsKKyAgICBlbHNlIHsKKwkqYnVmID0geG1sU3RyZHVwKG5zLT5wcmVmaXgpOworCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIjoiKTsKKwkqYnVmID0geG1sU3RyY2F0KCpidWYsIGxvY2FsKTsKKyAgICB9CisgICAgcmV0dXJuICgoY29uc3QgeG1sQ2hhciAqKSAqYnVmKTsKK30KKworLyoqCisgKiB4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0OgorICogQGJ1ZjogdGhlIHN0cmluZyBidWZmZXIKKyAqIEBpdGVtRGVzOiB0aGUgZGVzaWduYXRpb24gb2YgdGhlIGl0ZW0KKyAqIEBpdGVtTmFtZTogdGhlIG5hbWUgb2YgdGhlIGl0ZW0KKyAqIEBpdGVtOiB0aGUgaXRlbSBhcyBhbiBvYmplY3QgCisgKiBAaXRlbU5vZGU6IHRoZSBub2RlIG9mIHRoZSBpdGVtCisgKiBAbG9jYWw6IHRoZSBsb2NhbCBuYW1lCisgKiBAcGFyc2luZzogaWYgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgZHVyaW5nIHRoZSBwYXJzZQorICoKKyAqIFJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gaXRlbSB1c2VkCisgKiBmb3IgZXJyb3IgcmVwb3J0cy4gCisgKgorICogVGhlIGZvbGxvd2luZyBvcmRlciBpcyB1c2VkIHRvIGJ1aWxkIHRoZSByZXN1bHRpbmcgCisgKiBkZXNpZ25hdGlvbiBpZiB0aGUgYXJndW1lbnRzIGFyZSBub3QgTlVMTDoKKyAqIDFhLiBJZiBpdGVtRGVzIG5vdCBOVUxMIC0+IGl0ZW1EZXMKKyAqIDFiLiBJZiAoaXRlbURlcyBub3QgTlVMTCkgYW5kIChpdGVtTmFtZSBub3QgTlVMTCkKKyAqICAgICAtPiBpdGVtRGVzICsgaXRlbU5hbWUKKyAqIDIuIElmIHRoZSBwcmVjZWRpbmcgd2FzIE5VTEwgYW5kIChpdGVtIG5vdCBOVUxMKSAtPiBpdGVtCisgKiAzLiBJZiB0aGUgcHJlY2VkaW5nIHdhcyBOVUxMIGFuZCAoaXRlbU5vZGUgbm90IE5VTEwpIC0+IGl0ZW1Ob2RlCisgKiAKKyAqIElmIHRoZSBpdGVtTm9kZSBpcyBhbiBhdHRyaWJ1dGUgbm9kZSwgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorICogd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcmVzdWx0LgorICoKKyAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBzdHJpbmcgYW5kIHNldHMgQGJ1ZiB0byB0aGUgcmVzdWx0aW5nIHZhbHVlLgorICovICAKK3N0YXRpYyB4bWxDaGFyKiAgIAoreG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydCh4bWxDaGFyICoqYnVmLAkJICAgICAKKwkJICAgICBjb25zdCB4bWxDaGFyICppdGVtRGVzLAorCQkgICAgIHhtbFNjaGVtYVR5cGVQdHIgaXRlbSwKKwkJICAgICB4bWxOb2RlUHRyIGl0ZW1Ob2RlLAorCQkgICAgIGludCBwYXJzaW5nKQoreworICAgIHhtbENoYXIgKnN0ciA9IE5VTEw7CisKKyAgICBpZiAoKmJ1ZiAhPSBOVUxMKSB7CisJeG1sRnJlZSgqYnVmKTsKKwkqYnVmID0gTlVMTDsKKyAgICB9CisgICAgICAgICAgICAKKyAgICBpZiAoaXRlbURlcyAhPSBOVUxMKQorCSpidWYgPSB4bWxTdHJkdXAoaXRlbURlcyk7CisgICAgZWxzZSBpZiAoaXRlbSAhPSBOVUxMKSB7CisJaWYgKGl0ZW0tPnR5cGUgPT0gWE1MX1NDSEVNQV9UWVBFX0JBU0lDKSB7CisJICAgIGlmIChpdGVtLT5idWlsdEluVHlwZSA9PSBYTUxfU0NIRU1BU19BTllUWVBFKQorCQkqYnVmID0geG1sU3RyZHVwKEJBRF9DQVNUICInYW55VHlwZSciKTsKKwkgICAgZWxzZSBpZiAoaXRlbS0+YnVpbHRJblR5cGUgPT0gWE1MX1NDSEVNQVNfQU5ZU0lNUExFVFlQRSkKKwkJKmJ1ZiA9IHhtbFN0cmR1cChCQURfQ0FTVCAiJ2FueVNpbXBsZVR5cGUnIik7CisJICAgIGVsc2UgeworCQkvKiAqYnVmID0geG1sU3RyZHVwKEJBRF9DQVNUICJiaSAiKTsgKi8KKwkJLyogKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCB4bWxTY2hlbWFFbGVtRGVzU1QpOyAqLworCQkqYnVmID0geG1sU3RyZHVwKEJBRF9DQVNUICInIik7CisJCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgaXRlbS0+bmFtZSk7CisJCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIiciKTsKKwkgICAgfQorCX0gZWxzZSBpZiAoaXRlbS0+dHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfU0lNUExFKSB7CisJICAgIGlmIChpdGVtLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfR0xPQkFMKSB7CisJCSpidWYgPSB4bWxTdHJkdXAoeG1sU2NoZW1hRWxlbURlc1NUKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiICciKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBpdGVtLT5uYW1lKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiJyIpOworCSAgICB9IGVsc2UgeworCQkqYnVmID0geG1sU3RyZHVwKHhtbFNjaGVtYUVsZW1EZXNTVCk7CisJCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIiBsb2NhbCIpOworCSAgICB9CisJfSBlbHNlIGlmIChpdGVtLT50eXBlID09IFhNTF9TQ0hFTUFfVFlQRV9DT01QTEVYKSB7CisJICAgIGlmIChpdGVtLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfR0xPQkFMKSB7CisJCSpidWYgPSB4bWxTdHJkdXAoeG1sU2NoZW1hRWxlbURlc0NUKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiICciKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBpdGVtLT5uYW1lKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiJyIpOworCSAgICB9IGVsc2UgeworCQkqYnVmID0geG1sU3RyZHVwKHhtbFNjaGVtYUVsZW1EZXNDVCk7CisJCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIiBsb2NhbCIpOworCSAgICB9CisJfSBlbHNlIGlmIChpdGVtLT50eXBlID09IFhNTF9TQ0hFTUFfVFlQRV9BVFRSSUJVVEUpIHsKKwkgICAgeG1sU2NoZW1hQXR0cmlidXRlUHRyIGF0dHI7CisKKwkgICAgYXR0ciA9ICh4bWxTY2hlbWFBdHRyaWJ1dGVQdHIpIGl0ZW07CSAgICAKKwkgICAgaWYgKChhdHRyLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfR0xPQkFMKSB8fAorCQkoYXR0ci0+cmVmID09IE5VTEwpKSB7CisJCSpidWYgPSB4bWxTdHJkdXAoeG1sU2NoZW1hRWxlbURlc0F0dHJEZWNsKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiICciKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBhdHRyLT5uYW1lKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiJyIpOworCSAgICB9IGVsc2UgeworCQkqYnVmID0geG1sU3RyZHVwKHhtbFNjaGVtYUVsZW1EZXNBdHRyUmVmKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiICciKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBhdHRyLT5yZWZQcmVmaXgpOworCQkqYnVmID0geG1sU3RyY2F0KCpidWYsIEJBRF9DQVNUICI6Iik7CisJCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgYXR0ci0+cmVmKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiJyIpOworCSAgIH0JCQorCX0gZWxzZSBpZiAoaXRlbS0+dHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfRUxFTUVOVCkgeworCSAgICB4bWxTY2hlbWFFbGVtZW50UHRyIGVsZW07CisKKwkgICAgZWxlbSA9ICh4bWxTY2hlbWFFbGVtZW50UHRyKSBpdGVtOwkgICAgCisJICAgIGlmICgoZWxlbS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX0dMT0JBTCkgfHwgCisJCShlbGVtLT5yZWYgPT0gTlVMTCkpIHsKKwkJKmJ1ZiA9IHhtbFN0cmR1cCh4bWxTY2hlbWFFbGVtRGVzRWxlbURlY2wpOworCQkqYnVmID0geG1sU3RyY2F0KCpidWYsIEJBRF9DQVNUICIgJyIpOworCQkqYnVmID0geG1sU3RyY2F0KCpidWYsIGVsZW0tPm5hbWUpOworCQkqYnVmID0geG1sU3RyY2F0KCpidWYsIEJBRF9DQVNUICInIik7CisJICAgIH0gZWxzZSB7CisJCSpidWYgPSB4bWxTdHJkdXAoeG1sU2NoZW1hRWxlbURlc0VsZW1SZWYpOworCQkqYnVmID0geG1sU3RyY2F0KCpidWYsIEJBRF9DQVNUICIgJyIpOworCQkqYnVmID0geG1sU3RyY2F0KCpidWYsIGVsZW0tPnJlZlByZWZpeCk7CisJCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIjoiKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBlbGVtLT5yZWYpOworCQkqYnVmID0geG1sU3RyY2F0KCpidWYsIEJBRF9DQVNUICInIik7CisJICAgIH0JCQorCX0KKyAgICB9IGVsc2UgaWYgKGl0ZW1Ob2RlICE9IE5VTEwpIHsKKwl4bWxOb2RlUHRyIGVsZW07CisKKwlpZiAoaXRlbU5vZGUtPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKQorCSAgICBlbGVtID0gaXRlbU5vZGUtPnBhcmVudDsKKwllbHNlIAorCSAgICBlbGVtID0gaXRlbU5vZGU7CisJKmJ1ZiA9IHhtbFN0cmR1cChCQURfQ0FTVCAiRWxlbWVudCAnIik7CisJaWYgKHBhcnNpbmcpCisJICAgICpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgZWxlbS0+bmFtZSk7CisJZWxzZQorCSAgICAqYnVmID0geG1sU3RyY2F0KCpidWYsIAorCQl4bWxTY2hlbWFGb3JtYXROc1ByZWZpeExvY2FsKCZzdHIsIGVsZW0tPm5zLCBlbGVtLT5uYW1lKSk7CisJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiJyIpOworICAgIH0KKyAgICBpZiAoKGl0ZW1Ob2RlICE9IE5VTEwpICYmIChpdGVtTm9kZS0+dHlwZSA9PSBYTUxfQVRUUklCVVRFX05PREUpKSB7CisJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiLCBhdHRyaWJ1dGUgJyIpOworCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgeG1sU2NoZW1hRm9ybWF0TnNQcmVmaXhMb2NhbCgmc3RyLCAKKwkgICAgaXRlbU5vZGUtPm5zLCBpdGVtTm9kZS0+bmFtZSkpOworCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIiciKTsKKyAgICB9CisgICAgRlJFRV9BTkRfTlVMTChzdHIpOworICAgIAorICAgIHJldHVybiAoKmJ1Zik7Cit9CisKKy8qKgorICogeG1sU2NoZW1hUEZvcm1hdEl0ZW1EZXM6CisgKiBAYnVmOiB0aGUgc3RyaW5nIGJ1ZmZlcgorICogQGl0ZW06IHRoZSBpdGVtIGFzIGEgc2NoZW1hIG9iamVjdAorICogQGl0ZW1Ob2RlOiB0aGUgaXRlbSBhcyBhIG5vZGUKKyAqCisgKiBJZiB0aGUgcG9pbnRlciB0byBAYnVmIGlzIG5vdCBOVUxMIGFuZCBAYnV0IGhvbGRzIG5vIHZhbHVlLAorICogdGhlIHZhbHVlIGlzIHNldCB0byBhIGl0ZW0gZGVzaWduYXRpb24gdXNpbmcgCisgKiB4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0LiBUaGlzIG9uZSBhdm9pZHMgYWRkaW5nCisgKiBhbiBhdHRyaWJ1dGUgZGVzaWduYXRpb24gcG9zdGZpeC4KKyAqCisgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIGFsbCBlbnVtZXJhdGlvbiBlbGVtZW50cy4KKyAqLworc3RhdGljIHZvaWQKK3htbFNjaGVtYVBSZXF1ZXN0SXRlbURlcyh4bWxDaGFyICoqYnVmLAorCQkgICAgICAgeG1sU2NoZW1hVHlwZVB0ciBpdGVtLAorCQkgICAgICAgeG1sTm9kZVB0ciBpdGVtTm9kZSkKK3sKKyAgICBpZiAoKGJ1ZiA9PSAwKSB8fCAoKmJ1ZiAhPSBOVUxMKSkgCisJcmV0dXJuOworICAgIGlmIChpdGVtTm9kZS0+dHlwZSA9PSBYTUxfQVRUUklCVVRFX05PREUpCisJaXRlbU5vZGUgPSBpdGVtTm9kZS0+cGFyZW50OworICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoYnVmLCBOVUxMLCBpdGVtLCBpdGVtTm9kZSwgMSk7CQorfQorCisvKioKKyAqIHhtbFNjaGVtYUZvcm1hdEZhY2V0RW51bVNldDoKKyAqIEBidWY6IHRoZSBzdHJpbmcgYnVmZmVyCisgKiBAdHlwZTogdGhlIHR5cGUgaG9sZGluZyB0aGUgZW51bWVyYXRpb24gZmFjZXRzCisgKgorICogQnVpbGRzIGEgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgYWxsIGVudW1lcmF0aW9uIGVsZW1lbnRzLgorICoKKyAqIFJldHVybnMgYSBzdHJpbmcgb2YgYWxsIGVudW1lcmF0aW9uIGVsZW1lbnRzLgorICovCitzdGF0aWMgY29uc3QgeG1sQ2hhciAqCit4bWxTY2hlbWFGb3JtYXRGYWNldEVudW1TZXQoeG1sQ2hhciAqKmJ1ZiwgeG1sU2NoZW1hVHlwZVB0ciB0eXBlKQoreworICAgIHhtbFNjaGVtYUZhY2V0TGlua1B0ciBsaW5rOworCisgICAgaWYgKCpidWYgIT0gTlVMTCkKKwl4bWxGcmVlKCpidWYpOyAgICAKKyAgICAqYnVmID0gTlVMTDsKKyAgICBmb3IgKGxpbmsgPSB0eXBlLT5mYWNldFNldDsgbGluayAhPSBOVUxMOyBsaW5rID0gbGluay0+bmV4dCkgeworCWlmIChsaW5rLT5mYWNldC0+dHlwZSA9PSBYTUxfU0NIRU1BX0ZBQ0VUX0VOVU1FUkFUSU9OKSB7CisJICAgIGlmICgqYnVmID09IE5VTEwpIHsKKwkJKmJ1ZiA9IHhtbFN0cmR1cChCQURfQ0FTVCAiJyIpOworCQkqYnVmID0geG1sU3RyY2F0KCpidWYsIGxpbmstPmZhY2V0LT52YWx1ZSk7CisJCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgQkFEX0NBU1QgIiciKTsKKwkgICAgfSBlbHNlIHsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiLCAnIik7CisJCSpidWYgPSB4bWxTdHJjYXQoKmJ1ZiwgbGluay0+ZmFjZXQtPnZhbHVlKTsKKwkJKmJ1ZiA9IHhtbFN0cmNhdCgqYnVmLCBCQURfQ0FTVCAiJyIpOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gKChjb25zdCB4bWxDaGFyICopICpidWYpOworfQorCisvKioKKyAqIHhtbFNjaGVtYVZGYWNldEVycjoKKyAqIEBjdHh0OiAgdGhlIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKKyAqIEBlcnJvcjogdGhlIGVycm9yIGNvZGUKKyAqIEBub2RlOiB0aGUgbm9kZSB0byBiZSB2YWxpZGF0ZWQgIAorICogQHZhbHVlOiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUKKyAqIEB0eXBlOiB0aGUgdHlwZSBob2xkaW5nIHRoZSBmYWNldAorICogQGZhY2V0OiB0aGUgZmFjZXQKKyAqIEBtZXNzYWdlOiB0aGUgZXJyb3IgbWVzc2FnZSBvZiBOVUxMCisgKiBAc3RyMTogZXh0cmEgZGF0YQorICogQHN0cjI6IGV4dHJhIGRhdGEKKyAqIEBzdHIzOiBleHRyYSBkYXRhCisgKgorICogUmVwb3J0cyBhIGZhY2V0IHZhbGlkYXRpb24gZXJyb3IuCisgKiBUT0RPOiBTaG91bGQgdGhpcyByZXBvcnQgdGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQgYXMgd2VsbD8KKyAqLworc3RhdGljIHZvaWQKK3htbFNjaGVtYVZGYWNldEVycih4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCwgCisJCSAgIHhtbFBhcnNlckVycm9ycyBlcnJvciwKKwkJICAgeG1sTm9kZVB0ciBub2RlLAkJICAgCisJCSAgIGNvbnN0IHhtbENoYXIgKnZhbHVlLAorCQkgICB1bnNpZ25lZCBsb25nIGxlbmd0aCwKKwkJICAgeG1sU2NoZW1hVHlwZVB0ciB0eXBlLAorCQkgICB4bWxTY2hlbWFGYWNldFB0ciBmYWNldCwJCSAgIAorCQkgICBjb25zdCBjaGFyICptZXNzYWdlLAorCQkgICBjb25zdCB4bWxDaGFyICpzdHIxLAorCQkgICBjb25zdCB4bWxDaGFyICpzdHIyLAorCQkgICBjb25zdCB4bWxDaGFyICpzdHIzKQoreworICAgIHhtbENoYXIgKnN0ciA9IE5VTEwsICptc2cgPSBOVUxMOworICAgIHhtbFNjaGVtYVR5cGVUeXBlIGZhY2V0VHlwZTsKKworICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJm1zZywgTlVMTCwgTlVMTCwgbm9kZSwgMCk7CisgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIiBbIik7CisgICAgbXNnID0geG1sU3RyY2F0KG1zZywgeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydCgmc3RyLCBOVUxMLCB0eXBlLCBOVUxMLCAwKSk7CisgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIiwgZmFjZXQgJyIpOworICAgIGlmIChlcnJvciA9PSBYTUxfU0NIRU1BVl9DVkNfRU5VTUVSQVRJT05fVkFMSUQpIHsKKwlmYWNldFR5cGUgPSBYTUxfU0NIRU1BX0ZBQ0VUX0VOVU1FUkFUSU9OOworCS8qCisJKiBJZiBlbnVtZXJhdGlvbnMgYXJlIHZhbGlkYXRlZCwgb25lIG11c3Qgbm90IGV4cGVjdCB0aGUKKwkqIGZhY2V0IHRvIGJlIGdpdmVuLgorCSovCQorICAgIH0gZWxzZQkKKwlmYWNldFR5cGUgPSBmYWNldC0+dHlwZTsKKyAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCB4bWxTY2hlbWFGYWNldFR5cGVUb1N0cmluZyhmYWNldFR5cGUpKTsKKyAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiJ106ICIpOworICAgIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKwkvKgorCSogVXNlIGEgZGVmYXVsdCBtZXNzYWdlLgorCSovCisJaWYgKChmYWNldFR5cGUgPT0gWE1MX1NDSEVNQV9GQUNFVF9MRU5HVEgpIHx8CisJICAgIChmYWNldFR5cGUgPT0gWE1MX1NDSEVNQV9GQUNFVF9NSU5MRU5HVEgpIHx8CisJICAgIChmYWNldFR5cGUgPT0gWE1MX1NDSEVNQV9GQUNFVF9NQVhMRU5HVEgpKSB7CisKKwkgICAgY2hhciBsZW5bMjVdLCBhY3RMZW5bMjVdOworCisJICAgIC8qIEZJWE1FLCBUT0RPOiBXaGF0IGlzIHRoZSBtYXggZXhwZWN0ZWQgc3RyaW5nIGxlbmd0aCBvZiB0aGUKKwkgICAgKiB0aGlzIHZhbHVlPworCSAgICAqLworCSAgICBpZiAobm9kZS0+dHlwZSA9PSBYTUxfQVRUUklCVVRFX05PREUpCisJCW1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJUaGUgdmFsdWUgJyVzJyBoYXMgYSBsZW5ndGggb2YgJyVzJzsgIik7CisJICAgIGVsc2UKKwkJbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIlRoZSB2YWx1ZSBoYXMgYSBsZW5ndGggb2YgJyVzJzsgIik7CisKKwkgICAgc25wcmludGYobGVuLCAyNCwgIiVsdSIsIHhtbFNjaGVtYUdldEZhY2V0VmFsdWVBc1VMb25nKGZhY2V0KSk7CisJICAgIHNucHJpbnRmKGFjdExlbiwgMjQsICIlbHUiLCBsZW5ndGgpOworCisJICAgIGlmIChmYWNldFR5cGUgPT0gWE1MX1NDSEVNQV9GQUNFVF9MRU5HVEgpCisJCW1zZyA9IHhtbFN0cmNhdChtc2csIAorCQlCQURfQ0FTVCAidGhpcyBkaWZmZXJzIGZyb20gdGhlIGFsbG93ZWQgbGVuZ3RoIG9mICclcycuXG4iKTsgICAgIAorCSAgICBlbHNlIGlmIChmYWNldFR5cGUgPT0gWE1MX1NDSEVNQV9GQUNFVF9NQVhMRU5HVEgpCisJCW1zZyA9IHhtbFN0cmNhdChtc2csIAorCQlCQURfQ0FTVCAidGhpcyBleGNlZWRzIHRoZSBhbGxvd2VkIG1heGltdW0gbGVuZ3RoIG9mICclcycuXG4iKTsKKwkgICAgZWxzZSBpZiAoZmFjZXRUeXBlID09IFhNTF9TQ0hFTUFfRkFDRVRfTUlOTEVOR1RIKQorCQltc2cgPSB4bWxTdHJjYXQobXNnLCAKKwkJQkFEX0NBU1QgInRoaXMgdW5kZXJydW5zIHRoZSBhbGxvd2VkIG1pbmltdW0gbGVuZ3RoIG9mICclcycuXG4iKTsKKwkgICAgCisJICAgIGlmIChub2RlLT50eXBlID09IFhNTF9BVFRSSUJVVEVfTk9ERSkKKwkJeG1sU2NoZW1hVkVyckV4dChjdHh0LCBub2RlLCBlcnJvciwKKwkJICAgIChjb25zdCBjaGFyICopIG1zZywKKwkJICAgIHZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKSBhY3RMZW4sIChjb25zdCB4bWxDaGFyICopIGxlbiwKKwkJICAgIE5VTEwsIE5VTEwpOworCSAgICBlbHNlIAorCQl4bWxTY2hlbWFWRXJyKGN0eHQsIG5vZGUsIGVycm9yLCAgCisJCSAgICAoY29uc3QgY2hhciAqKSBtc2csCisJCSAgICAoY29uc3QgeG1sQ2hhciAqKSBhY3RMZW4sIChjb25zdCB4bWxDaGFyICopIGxlbik7CisJCisJfSBlbHNlIGlmIChmYWNldFR5cGUgPT0gWE1MX1NDSEVNQV9GQUNFVF9FTlVNRVJBVElPTikgeworCSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiVGhlIHZhbHVlICclcycgaXMgbm90IGFuIGVsZW1lbnQgIgorCQkib2YgdGhlIHNldCB7JXN9LlxuIik7CisJICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgZXJyb3IsIChjb25zdCBjaGFyICopIG1zZywgdmFsdWUsIAorCQl4bWxTY2hlbWFGb3JtYXRGYWNldEVudW1TZXQoJnN0ciwgdHlwZSkpOworCX0gZWxzZSBpZiAoZmFjZXRUeXBlID09IFhNTF9TQ0hFTUFfRkFDRVRfUEFUVEVSTikgeworCSAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiVGhlIHZhbHVlICclcycgaXMgbm90IGFjY2VwdGVkICIKKwkJImJ5IHRoZSBwYXR0ZXJuICclcycuXG4iKTsKKwkgICAgeG1sU2NoZW1hVkVycihjdHh0LCBub2RlLCBlcnJvciwgKGNvbnN0IGNoYXIgKikgbXNnLCB2YWx1ZSwgCisJCWZhY2V0LT52YWx1ZSk7CSAgICAgICAKKwl9IGVsc2UgaWYgKG5vZGUtPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKSB7CQkKKwkgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIlRoZSB2YWx1ZSAnJXMnIGlzIG5vdCBmYWNldC12YWxpZC5cbiIpOworCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIG5vZGUsIGVycm9yLCAoY29uc3QgY2hhciAqKSBtc2csIHZhbHVlLCBOVUxMKTsKKwl9IGVsc2UgewkgICAgCisJICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJUaGUgdmFsdWUgaXMgbm90IGZhY2V0LXZhbGlkLlxuIik7CisJICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgZXJyb3IsIChjb25zdCBjaGFyICopIG1zZywgTlVMTCwgTlVMTCk7CisJfQorICAgIH0gZWxzZSB7CisJbXNnID0geG1sU3RyY2F0KG1zZywgKGNvbnN0IHhtbENoYXIgKikgbWVzc2FnZSk7CisJbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIi5cbiIpOworCXhtbFNjaGVtYVZFcnIzKGN0eHQsIG5vZGUsIGVycm9yLCAoY29uc3QgY2hhciAqKSBtc2csIHN0cjEsIHN0cjIsIHN0cjMpOworICAgIH0gICAgICAgIAorICAgIEZSRUVfQU5EX05VTEwoc3RyKQorICAgIHhtbEZyZWUobXNnKTsKK30KKworLyoqCisgKiB4bWxTY2hlbWFWU2ltcGxlVHlwZUVycjoKKyAqIEBjdHh0OiAgdGhlIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKKyAqIEBlcnJvcjogdGhlIGVycm9yIGNvZGUKKyAqIEB0eXBlOiB0aGUgdHlwZSB1c2VkIGZvciB2YWxpZGF0aW9uCisgKiBAbm9kZTogdGhlIG5vZGUgY29udGFpbmluZyB0aGUgdmFsaWRhdGVkIHZhbHVlCisgKiBAdmFsdWU6IHRoZSB2YWxpZGF0ZWQgdmFsdWUKKyAqCisgKiBSZXBvcnRzIGEgc2ltcGxlIHR5cGUgdmFsaWRhdGlvbiBlcnJvci4KKyAqIFRPRE86IFNob3VsZCB0aGlzIHJlcG9ydCB0aGUgdmFsdWUgb2YgYW4gZWxlbWVudCBhcyB3ZWxsPworICovCitzdGF0aWMgdm9pZAoreG1sU2NoZW1hVlNpbXBsZVR5cGVFcnIoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQsIAorCQkJeG1sUGFyc2VyRXJyb3JzIGVycm9yLAkJCQorCQkJeG1sTm9kZVB0ciBub2RlLAorCQkJY29uc3QgeG1sQ2hhciAqdmFsdWUsCisJCQl4bWxTY2hlbWFUeXBlUHRyIHR5cGUpCit7CisgICAgeG1sQ2hhciAqc3RyID0gTlVMTCwgKm1zZyA9IE5VTEw7CisgICAgCisgICAgeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydCgmbXNnLCBOVUxMLCAgTlVMTCwgbm9kZSwgMCk7ICAgIAorICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICIgWyIpOworICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ciwgTlVMTCwgdHlwZSwgTlVMTCwgMCkpOworICAgIGlmIChub2RlLT50eXBlID09IFhNTF9BVFRSSUJVVEVfTk9ERSkgeworCW1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJdOiBUaGUgdmFsdWUgJyVzJyBpcyBub3QgdmFsaWQuXG4iKTsKKwl4bWxTY2hlbWFWRXJyKGN0eHQsIG5vZGUsIGVycm9yLCAoY29uc3QgY2hhciAqKSBtc2csIHZhbHVlLCBOVUxMKTsKKyAgICB9IGVsc2UgeworCW1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICJdOiBUaGUgY2hhcmFjdGVyIGNvbnRlbnQgaXMgbm90IHZhbGlkLlxuIik7CisJeG1sU2NoZW1hVkVycihjdHh0LCBub2RlLCBlcnJvciwgKGNvbnN0IGNoYXIgKikgbXNnLCBOVUxMLCBOVUxMKTsKKyAgICB9CisgICAgRlJFRV9BTkRfTlVMTChzdHIpCQorICAgIHhtbEZyZWUobXNnKTsKK30KKworLyoqCisgKiB4bWxTY2hlbWFQTWlzc2luZ0F0dHJFcnI6CisgKiBAY3R4dDogdGhlIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKKyAqIEBvd25lckRlczogdGhlIGRlc2lnbmF0aW9uIG9mICB0aGUgb3duZXIKKyAqIEBvd25lck5hbWU6IHRoZSBuYW1lIG9mIHRoZSBvd25lcgorICogQG93bmVySXRlbTogdGhlIG93bmVyIGFzIGEgc2NoZW1hIG9iamVjdAorICogQG93bmVyRWxlbTogdGhlIG93bmVyIGFzIGFuIGVsZW1lbnQgbm9kZQorICogQG5vZGU6IHRoZSBwYXJlbnQgZWxlbWVudCBub2RlIG9mIHRoZSBtaXNzaW5nIGF0dHJpYnV0ZSBub2RlCisgKiBAdHlwZTogdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBvZiB0aGUgYXR0cmlidXRlIG5vZGUKKyAqCisgKiBSZXBvcnRzIGFuIGlsbGVnYWwgYXR0cmlidXRlLgorICovCitzdGF0aWMgdm9pZAoreG1sU2NoZW1hUE1pc3NpbmdBdHRyRXJyKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwKKwkJCSB4bWxQYXJzZXJFcnJvcnMgZXJyb3IsCQkJIAorCQkJIHhtbENoYXIgKipvd25lckRlcywKKwkJCSB4bWxTY2hlbWFUeXBlUHRyIG93bmVySXRlbSwKKwkJCSB4bWxOb2RlUHRyIG93bmVyRWxlbSwKKwkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgICAgeG1sQ2hhciAqZGVzID0gTlVMTDsKKworICAgIGlmIChvd25lckRlcyA9PSBOVUxMKQorCXhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJmRlcywgTlVMTCwgb3duZXJJdGVtLCBvd25lckVsZW0sIDEpOworICAgIGVsc2UgaWYgKCpvd25lckRlcyA9PSBOVUxMKSB7CisJeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydChvd25lckRlcywgTlVMTCwgb3duZXJJdGVtLCBvd25lckVsZW0sIDEpOworCWRlcyA9ICpvd25lckRlczsKKyAgICB9IGVsc2UgCisJZGVzID0gKm93bmVyRGVzOyAgICAgIAorICAgIGlmIChtZXNzYWdlICE9IE5VTEwpCisJeG1sU2NoZW1hUEVycihjdHh0LCBvd25lckVsZW0sIGVycm9yLCAiJXM6ICVzLlxuIiwgQkFEX0NBU1QgZGVzLCBCQURfQ0FTVCBtZXNzYWdlKTsKKyAgICBlbHNlCQorCXhtbFNjaGVtYVBFcnIoY3R4dCwgb3duZXJFbGVtLCBlcnJvciwgCisJICAgICIlczogVGhlIGF0dHJpYnV0ZSAnJXMnIGlzIHJlcXVpcmVkIGJ1dCBtaXNzaW5nLlxuIiwgCisJICAgIEJBRF9DQVNUIGRlcywgQkFEX0NBU1QgbmFtZSk7CisgICAgaWYgKG93bmVyRGVzID09IE5VTEwpCisJRlJFRV9BTkRfTlVMTChkZXMpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCit4bWxTY2hlbWFDb21wVHlwZVRvU3RyaW5nKHhtbFNjaGVtYVR5cGVUeXBlIHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisJY2FzZSBYTUxfU0NIRU1BX1RZUEVfU0lNUExFOgorCSAgICByZXR1cm4oInNpbXBsZSB0eXBlIGRlZmluaXRpb24iKTsKKwljYXNlIFhNTF9TQ0hFTUFfVFlQRV9DT01QTEVYOgorCSAgICByZXR1cm4oImNvbXBsZXggdHlwZSBkZWZpbml0aW9uIik7CisJY2FzZSBYTUxfU0NIRU1BX1RZUEVfRUxFTUVOVDoKKwkgICAgcmV0dXJuKCJlbGVtZW50IGRlY2xhcmF0aW9uIik7CisJY2FzZSBYTUxfU0NIRU1BX1RZUEVfQVRUUklCVVRFOgorCSAgICByZXR1cm4oImF0dHJpYnV0ZSBkZWNsYXJhdGlvbiIpOworCWNhc2UgWE1MX1NDSEVNQV9UWVBFX0dST1VQOgorCSAgICByZXR1cm4oIm1vZGVsIGdyb3VwIGRlZmluaXRpb24iKTsKKwljYXNlIFhNTF9TQ0hFTUFfVFlQRV9BVFRSSUJVVEVHUk9VUDoKKwkgICAgcmV0dXJuKCJhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbiIpOworCWNhc2UgWE1MX1NDSEVNQV9UWVBFX05PVEFUSU9OOgorCSAgICByZXR1cm4oIm5vdGF0aW9uIGRlY2xhcmF0aW9uIik7CisJZGVmYXVsdDoKKwkgICAgcmV0dXJuKCJOb3QgYSBzY2hlbWEgY29tcG9uZW50Iik7CisgICAgfQorfQorLyoqCisgKiB4bWxTY2hlbWFQUmVzQ29tcEF0dHJFcnI6CisgKiBAY3R4dDogdGhlIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKKyAqIEBlcnJvcjogdGhlIGVycm9yIGNvZGUKKyAqIEBvd25lckRlczogdGhlIGRlc2lnbmF0aW9uIG9mICB0aGUgb3duZXIKKyAqIEBvd25lckl0ZW06IHRoZSBvd25lciBhcyBhIHNjaGVtYSBvYmplY3QKKyAqIEBvd25lckVsZW06IHRoZSBvd25lciBhcyBhbiBlbGVtZW50IG5vZGUKKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGhvbGRpbmcgdGhlIFFOYW1lIAorICogQHJlZk5hbWU6IHRoZSByZWZlcmVuY2VkIGxvY2FsIG5hbWUKKyAqIEByZWZVUkk6IHRoZSByZWZlcmVuY2VkIG5hbWVzcGFjZSBVUkkKKyAqIEBtZXNzYWdlOiBvcHRpb25hbCBtZXNzYWdlCisgKgorICogVXNlZCB0byByZXBvcnQgUU5hbWUgYXR0cmlidXRlIHZhbHVlcyB0aGF0IGZhaWxlZCB0byByZXNvbHZlCisgKiB0byBzY2hlbWEgY29tcG9uZW50cy4KKyAqLworc3RhdGljIHZvaWQKK3htbFNjaGVtYVBSZXNDb21wQXR0ckVycih4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsCisJCQkgeG1sUGFyc2VyRXJyb3JzIGVycm9yLAkJCSAKKwkJCSB4bWxDaGFyICoqb3duZXJEZXMsCisJCQkgeG1sU2NoZW1hVHlwZVB0ciBvd25lckl0ZW0sCisJCQkgeG1sTm9kZVB0ciBvd25lckVsZW0sCisJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBjb25zdCB4bWxDaGFyICpyZWZOYW1lLAorCQkJIGNvbnN0IHhtbENoYXIgKnJlZlVSSSwKKwkJCSB4bWxTY2hlbWFUeXBlVHlwZSByZWZUeXBlLAorCQkJIGNvbnN0IGNoYXIgKnJlZlR5cGVTdHIpCit7CisgICAgeG1sQ2hhciAqZGVzID0gTlVMTCwgKnN0ckEgPSBOVUxMOworCisgICAgaWYgKG93bmVyRGVzID09IE5VTEwpCisJeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydCgmZGVzLCBOVUxMLCBvd25lckl0ZW0sIG93bmVyRWxlbSwgMSk7CisgICAgZWxzZSBpZiAoKm93bmVyRGVzID09IE5VTEwpIHsKKwl4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KG93bmVyRGVzLCBOVUxMLCBvd25lckl0ZW0sIG93bmVyRWxlbSwgMSk7CisJZGVzID0gKm93bmVyRGVzOworICAgIH0gZWxzZQorCWRlcyA9ICpvd25lckRlczsKKyAgICAvKgorICAgIGlmIChtZXNzYWdlICE9IE5VTEwpCisJeG1sU2NoZW1hUEVyckV4dChjdHh0LCBvd25lckVsZW0sIGVycm9yLCBOVUxMLCBOVUxMLCBOVUxMLAorCSAgICAiJXMsIGF0dHJpYnV0ZSAnJXMnOiAlcy5cbiIsCisJICAgIEJBRF9DQVNUIGRlcywgbmFtZSwgbWVzc2FnZSwgTlVMTCwgTlVMTCk7CisgICAgZWxzZQkKKyAgICAqLworICAgIGlmIChyZWZUeXBlU3RyID09IE5VTEwpCisJcmVmVHlwZVN0ciA9IHhtbFNjaGVtYUNvbXBUeXBlVG9TdHJpbmcocmVmVHlwZSk7ICAgIAorCXhtbFNjaGVtYVBFcnJFeHQoY3R4dCwgb3duZXJFbGVtLCBlcnJvciwgCisJICAgIE5VTEwsIE5VTEwsIE5VTEwsCisJICAgICIlcywgYXR0cmlidXRlICclcyc6IFRoZSBRTmFtZSB2YWx1ZSAlcyBkb2VzIG5vdCByZXNvbHZlIHRvIGEobikgIgorCSAgICAiJXMuXG4iLCBCQURfQ0FTVCBkZXMsIEJBRF9DQVNUIG5hbWUsIAorCSAgICB4bWxTY2hlbWFGb3JtYXROc1VyaUxvY2FsKCZzdHJBLCByZWZVUkksIHJlZk5hbWUpLCAKKwkgICAgQkFEX0NBU1QgcmVmVHlwZVN0ciwgTlVMTCk7CisgICAgaWYgKG93bmVyRGVzID09IE5VTEwpCisJRlJFRV9BTkRfTlVMTChkZXMpCisgICAgRlJFRV9BTkRfTlVMTChzdHJBKQorfQorCitzdGF0aWMgdm9pZAoreG1sU2NoZW1hUEN1c3RvbUF0dHJFcnIoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LAorCQkgICAgeG1sUGFyc2VyRXJyb3JzIGVycm9yLAkKKwkJICAgIHhtbENoYXIgKipvd25lckRlcywKKwkJICAgIHhtbFNjaGVtYVR5cGVQdHIgb3duZXJJdGVtLAorCQkgICAgeG1sQXR0clB0ciBhdHRyLAorCQkgICAgY29uc3QgY2hhciAqbXNnKQoreworICAgIHhtbENoYXIgKmRlcyA9IE5VTEw7CisKKyAgICBpZiAob3duZXJEZXMgPT0gTlVMTCkKKwl4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZkZXMsIE5VTEwsIG93bmVySXRlbSwgYXR0ci0+cGFyZW50LCAxKTsKKyAgICBlbHNlIGlmICgqb3duZXJEZXMgPT0gTlVMTCkgeworCXhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQob3duZXJEZXMsIE5VTEwsIG93bmVySXRlbSwgYXR0ci0+cGFyZW50LCAxKTsKKwlkZXMgPSAqb3duZXJEZXM7CisgICAgfSBlbHNlIAorCWRlcyA9ICpvd25lckRlczsgICAgCisgICAgeG1sU2NoZW1hUEVyckV4dChjdHh0LCAoeG1sTm9kZVB0cikgYXR0ciwgZXJyb3IsIE5VTEwsIE5VTEwsIE5VTEwsCisJIiVzLCBhdHRyaWJ1dGUgJyVzJzogJXMuXG4iLCAKKwlCQURfQ0FTVCBkZXMsIGF0dHItPm5hbWUsIChjb25zdCB4bWxDaGFyICopIG1zZywgTlVMTCwgTlVMTCk7CisgICAgaWYgKG93bmVyRGVzID09IE5VTEwpCisJRlJFRV9BTkRfTlVMTChkZXMpOworfQorCisvKioKKyAqIHhtbFNjaGVtYVBJbGxlZ2FsQXR0ckVycjoKKyAqIEBjdHh0OiB0aGUgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dAorICogQGVycm9yOiB0aGUgZXJyb3IgY29kZQorICogQG93bmVyRGVzOiB0aGUgZGVzaWduYXRpb24gb2YgdGhlIG93bmVyCisgKiBAb3duZXJJdGVtOiB0aGUgb3duZXIgYXMgYSBzY2hlbWEgb2JqZWN0CisgKiBAYXR0cjogdGhlIGlsbGVnYWwgYXR0cmlidXRlIG5vZGUgCisgKgorICogUmVwb3J0cyBhbiBpbGxlZ2FsIGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIHZvaWQKK3htbFNjaGVtYVBJbGxlZ2FsQXR0ckVycih4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsCisJCQkgeG1sUGFyc2VyRXJyb3JzIGVycm9yLAkKKwkJCSB4bWxDaGFyICoqb3duZXJEZXMsCisJCQkgeG1sU2NoZW1hVHlwZVB0ciBvd25lckl0ZW0sCisJCQkgeG1sQXR0clB0ciBhdHRyKQoreworICAgIHhtbENoYXIgKmRlcyA9IE5VTEwsICpzdHJBID0gTlVMTDsKKworICAgIGlmIChvd25lckRlcyA9PSBOVUxMKQorCXhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJmRlcywgTlVMTCwgb3duZXJJdGVtLCBhdHRyLT5wYXJlbnQsIDEpOworICAgIGVsc2UgaWYgKCpvd25lckRlcyA9PSBOVUxMKSB7CisJeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydChvd25lckRlcywgTlVMTCwgb3duZXJJdGVtLCBhdHRyLT5wYXJlbnQsIDEpOworCWRlcyA9ICpvd25lckRlczsKKyAgICB9IGVsc2UgCisJZGVzID0gKm93bmVyRGVzOyAgICAKKyAgICB4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyLCBlcnJvciwgCisJIiVzOiBUaGUgYXR0cmlidXRlICclcycgaXMgbm90IGFsbG93ZWQuXG4iLCBCQURfQ0FTVCBkZXMsIAorCXhtbFNjaGVtYUZvcm1hdE5zUHJlZml4TG9jYWwoJnN0ckEsIGF0dHItPm5zLCBhdHRyLT5uYW1lKSk7CisgICAgaWYgKG93bmVyRGVzID09IE5VTEwpCisJRlJFRV9BTkRfTlVMTChkZXMpOworICAgIEZSRUVfQU5EX05VTEwoc3RyQSk7Cit9CisKK3N0YXRpYyB2b2lkCit4bWxTY2hlbWFQQXF1aXJlRGVzKHhtbENoYXIgKipkZXMsCisJCSAgICB4bWxDaGFyICoqaXRlbURlcywgCisJCSAgICB4bWxTY2hlbWFUeXBlUHRyIGl0ZW0sCisJCSAgICB4bWxOb2RlUHRyIGl0ZW1FbGVtKQoreworICAgIGlmIChpdGVtRGVzID09IE5VTEwpCisJeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydChkZXMsIE5VTEwsIGl0ZW0sIGl0ZW1FbGVtLCAxKTsKKyAgICBlbHNlIGlmICgqaXRlbURlcyA9PSBOVUxMKSB7CisJeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydChpdGVtRGVzLCBOVUxMLCBpdGVtLCBpdGVtRWxlbSwgMSk7CisJKmRlcyA9ICppdGVtRGVzOworICAgIH0gZWxzZSAKKwkqZGVzID0gKml0ZW1EZXM7ICAKK30KKworc3RhdGljIHZvaWQKK3htbFNjaGVtYVBDdXN0b21FcnJFeHQoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LAorCQkgICAgeG1sUGFyc2VyRXJyb3JzIGVycm9yLAkKKwkJICAgIHhtbENoYXIgKippdGVtRGVzLAorCQkgICAgeG1sU2NoZW1hVHlwZVB0ciBpdGVtLAorCQkgICAgeG1sTm9kZVB0ciBpdGVtRWxlbSwKKwkJICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisJCSAgICBjb25zdCB4bWxDaGFyICpzdHIxLAorCQkgICAgY29uc3QgeG1sQ2hhciAqc3RyMiwKKwkJICAgIGNvbnN0IHhtbENoYXIgKnN0cjMpCit7CisgICAgeG1sQ2hhciAqZGVzID0gTlVMTCwgKm1zZyA9IE5VTEw7CisKKyAgICB4bWxTY2hlbWFQQXF1aXJlRGVzKCZkZXMsIGl0ZW1EZXMsIGl0ZW0sIGl0ZW1FbGVtKTsgICAKKyAgICBtc2cgPSB4bWxTdHJkdXAoQkFEX0NBU1QgIiVzOiAiKTsKKyAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCAoY29uc3QgeG1sQ2hhciAqKSBtZXNzYWdlKTsKKyAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiLlxuIik7CisgICAgaWYgKChpdGVtRWxlbSA9PSBOVUxMKSAmJiAoaXRlbSAhPSBOVUxMKSkKKwlpdGVtRWxlbSA9IGl0ZW0tPm5vZGU7CisgICAgeG1sU2NoZW1hUEVyckV4dChjdHh0LCBpdGVtRWxlbSwgZXJyb3IsIE5VTEwsIE5VTEwsIE5VTEwsIAorCShjb25zdCBjaGFyICopIG1zZywgQkFEX0NBU1QgZGVzLCBzdHIxLCBzdHIyLCBzdHIzLCBOVUxMKTsKKyAgICBpZiAoaXRlbURlcyA9PSBOVUxMKQorCUZSRUVfQU5EX05VTEwoZGVzKTsKKyAgICBGUkVFX0FORF9OVUxMKG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkCit4bWxTY2hlbWFQQ3VzdG9tRXJyKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwKKwkJICAgIHhtbFBhcnNlckVycm9ycyBlcnJvciwJCisJCSAgICB4bWxDaGFyICoqaXRlbURlcywKKwkJICAgIHhtbFNjaGVtYVR5cGVQdHIgaXRlbSwKKwkJICAgIHhtbE5vZGVQdHIgaXRlbUVsZW0sCisJCSAgICBjb25zdCBjaGFyICptZXNzYWdlLAorCQkgICAgY29uc3QgeG1sQ2hhciAqc3RyMSkKK3sKKyAgICB4bWxTY2hlbWFQQ3VzdG9tRXJyRXh0KGN0eHQsIGVycm9yLCBpdGVtRGVzLCBpdGVtLCBpdGVtRWxlbSwgbWVzc2FnZSwKKwlzdHIxLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3htbFNjaGVtYVBBdHRyVXNlRXJyKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwKKwkJICAgIHhtbFBhcnNlckVycm9ycyBlcnJvciwJCisJCSAgICB4bWxDaGFyICoqaXRlbURlcywKKwkJICAgIHhtbFNjaGVtYVR5cGVQdHIgaXRlbSwKKwkJICAgIHhtbE5vZGVQdHIgaXRlbUVsZW0sCisJCSAgICBjb25zdCB4bWxTY2hlbWFBdHRyaWJ1dGVQdHIgYXR0ciwKKwkJICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisJCSAgICBjb25zdCB4bWxDaGFyICpzdHIxKQoreworICAgIHhtbENoYXIgKmRlcyA9IE5VTEwsICpzdHJBID0gTlVMTCwgKm1zZyA9IE5VTEw7CisKKyAgICB4bWxTY2hlbWFQQXF1aXJlRGVzKCZkZXMsIGl0ZW1EZXMsIGl0ZW0sIGl0ZW1FbGVtKTsKKyAgICB4bWxTY2hlbWFGb3JtYXROc1VyaUxvY2FsKCZzdHJBLCB4bWxTY2hlbWFHZXRBdHRyVGFyZ2V0TnNVUkkoYXR0ciksIAorCXhtbFNjaGVtYUdldEF0dHJOYW1lKGF0dHIpKTsKKyAgICBtc2cgPSB4bWxTdHJkdXAoQkFEX0NBU1QgIiVzLCBhdHRyLiB1c2UgJXM6ICIpOworICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIChjb25zdCB4bWxDaGFyICopIG1lc3NhZ2UpOworICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICIuXG4iKTsKKyAgICBpZiAoKGl0ZW1FbGVtID09IE5VTEwpICYmIChpdGVtICE9IE5VTEwpKQorCWl0ZW1FbGVtID0gaXRlbS0+bm9kZTsKKyAgICB4bWxTY2hlbWFQRXJyRXh0KGN0eHQsIGl0ZW1FbGVtLCBlcnJvciwgTlVMTCwgTlVMTCwgTlVMTCwgCisJKGNvbnN0IGNoYXIgKikgbXNnLCBCQURfQ0FTVCBkZXMsIEJBRF9DQVNUIHN0ckEsIHN0cjEsIE5VTEwsIE5VTEwpOworICAgIGlmIChpdGVtRGVzID09IE5VTEwpCisJRlJFRV9BTkRfTlVMTChkZXMpOworICAgIEZSRUVfQU5EX05VTEwoc3RyQSk7CisgICAgeG1sRnJlZShtc2cpOworfQorCisKKworc3RhdGljIHZvaWQKK3htbFNjaGVtYVBJbGxlZ2FsRmFjZXRBdG9taWNFcnIoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LAorCQkJICB4bWxQYXJzZXJFcnJvcnMgZXJyb3IsCQorCQkJICB4bWxDaGFyICoqaXRlbURlcywKKwkJCSAgeG1sU2NoZW1hVHlwZVB0ciBpdGVtLAorCQkJICB4bWxTY2hlbWFUeXBlUHRyIGJhc2VJdGVtLAorCQkJICB4bWxTY2hlbWFGYWNldFB0ciBmYWNldCkKK3sKKyAgICB4bWxDaGFyICpkZXMgPSBOVUxMLCAqc3RyVCA9IE5VTEw7CisKKyAgICB4bWxTY2hlbWFQQXF1aXJlRGVzKCZkZXMsIGl0ZW1EZXMsIGl0ZW0sIGl0ZW0tPm5vZGUpOworICAgIHhtbFNjaGVtYVBFcnJFeHQoY3R4dCwgaXRlbS0+bm9kZSwgZXJyb3IsIE5VTEwsIE5VTEwsIE5VTEwsCisJIiVzOiBUaGUgZmFjZXQgJyVzJyBpcyBub3QgYWxsb3dlZCBvbiB0eXBlcyBkZXJpdmVkIGZyb20gdGhlICIKKwkidHlwZSAlcy5cbiIsCisJQkFEX0NBU1QgZGVzLCBCQURfQ0FTVCB4bWxTY2hlbWFGYWNldFR5cGVUb1N0cmluZyhmYWNldC0+dHlwZSksCisJeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydCgmc3RyVCwgTlVMTCwgYmFzZUl0ZW0sIE5VTEwsIDEpLAorCU5VTEwsIE5VTEwpOworICAgIGlmIChpdGVtRGVzID09IE5VTEwpCisJRlJFRV9BTkRfTlVMTChkZXMpOworICAgIEZSRUVfQU5EX05VTEwoc3RyVCk7Cit9CisKK3N0YXRpYyB2b2lkCit4bWxTY2hlbWFQSWxsZWdhbEZhY2V0TGlzdFVuaW9uRXJyKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwKKwkJCSAgeG1sUGFyc2VyRXJyb3JzIGVycm9yLAkKKwkJCSAgeG1sQ2hhciAqKml0ZW1EZXMsCisJCQkgIHhtbFNjaGVtYVR5cGVQdHIgaXRlbSwKKwkJCSAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQpCit7CisgICAgeG1sQ2hhciAqZGVzID0gTlVMTCwgKnN0clQgPSBOVUxMOworCisgICAgeG1sU2NoZW1hUEFxdWlyZURlcygmZGVzLCBpdGVtRGVzLCBpdGVtLCBpdGVtLT5ub2RlKTsKKyAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIGl0ZW0tPm5vZGUsIGVycm9yLCAKKwkiJXM6IFRoZSBmYWNldCAnJXMnIGlzIG5vdCBhbGxvd2VkLlxuIiwgCisJQkFEX0NBU1QgZGVzLCBCQURfQ0FTVCB4bWxTY2hlbWFGYWNldFR5cGVUb1N0cmluZyhmYWNldC0+dHlwZSkpOworICAgIGlmIChpdGVtRGVzID09IE5VTEwpCisJRlJFRV9BTkRfTlVMTChkZXMpOworICAgIEZSRUVfQU5EX05VTEwoc3RyVCk7Cit9CisKKy8qKgorICogeG1sU2NoZW1hUE11dHVhbEV4Y2xBdHRyRXJyOgorICogQGN0eHQ6IHRoZSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0CisgKiBAZXJyb3I6IHRoZSBlcnJvciBjb2RlCisgKiBAZWxlbURlczogdGhlIGRlc2lnbmF0aW9uIG9mIHRoZSBwYXJlbnQgZWxlbWVudCBub2RlCisgKiBAYXR0cjogdGhlIGJhZCBhdHRyaWJ1dGUgbm9kZQorICogQHR5cGU6IHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBub2RlCisgKgorICogUmVwb3J0cyBhbiBpbGxlZ2FsIGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIHZvaWQKK3htbFNjaGVtYVBNdXR1YWxFeGNsQXR0ckVycih4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsCisJCQkgeG1sUGFyc2VyRXJyb3JzIGVycm9yLAorCQkJIHhtbENoYXIgKipvd25lckRlcywKKwkJCSB4bWxTY2hlbWFUeXBlUHRyIG93bmVySXRlbSwKKwkJCSB4bWxBdHRyUHRyIGF0dHIsCQkJIAorCQkJIGNvbnN0IGNoYXIgKm5hbWUxLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUyKQoreworICAgIHhtbENoYXIgKmRlcyA9IE5VTEw7CisKKyAgICBpZiAob3duZXJEZXMgPT0gTlVMTCkKKwl4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZkZXMsIE5VTEwsIG93bmVySXRlbSwgYXR0ci0+cGFyZW50LCAxKTsJCisgICAgZWxzZSBpZiAoKm93bmVyRGVzID09IE5VTEwpIHsKKwl4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KG93bmVyRGVzLCBOVUxMLCBvd25lckl0ZW0sIGF0dHItPnBhcmVudCwgMSk7CisJZGVzID0gKm93bmVyRGVzOworICAgIH0gZWxzZSAKKwlkZXMgPSAqb3duZXJEZXM7ICAKKyAgICB4bWxTY2hlbWFQRXJyRXh0KGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyLCBlcnJvciwgTlVMTCwgTlVMTCwgTlVMTCwKKwkiJXM6IFRoZSBhdHRyaWJ1dGVzICclcycgYW5kICclcycgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS5cbiIsIAorCUJBRF9DQVNUIGRlcywgQkFEX0NBU1QgbmFtZTEsIEJBRF9DQVNUIG5hbWUyLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAob3duZXJEZXMgPT0gTlVMTCkKKwlGUkVFX0FORF9OVUxMKGRlcykKK30KKworLyoqCisgKiB4bWxTY2hlbWFQU2ltcGxlVHlwZUVycjoKKyAqIEBjdHh0OiAgdGhlIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKKyAqIEBlcnJvcjogdGhlIGVycm9yIGNvZGUKKyAqIEBiaVR5cGU6IHRoZSBidWlsdCBpbiB0eXBlIHNwZWNpZmllcgorICogQG93bmVyRGVzOiB0aGUgZGVzaWduYXRpb24gb2YgdGhlIG93bmVyCisgKiBAb3duZXJJdGVtOiB0aGUgc2NoZW1hIG9iamVjdCBpZiBleGlzdGVudCAKKyAqIEBub2RlOiB0aGUgdmFsaWRhdGVkIG5vZGUKKyAqIEB2YWx1ZTogdGhlIHZhbGlkYXRlZCB2YWx1ZQorICoKKyAqIFJlcG9ydHMgYSBzaW1wbGUgdHlwZSB2YWxpZGF0aW9uIGVycm9yLgorICogVE9ETzogU2hvdWxkIHRoaXMgcmVwb3J0IHRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IGFzIHdlbGw/CisgKi8KK3N0YXRpYyB2b2lkCit4bWxTY2hlbWFQU2ltcGxlVHlwZUVycih4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsIAorCQkJeG1sUGFyc2VyRXJyb3JzIGVycm9yLAorCQkJeG1sQ2hhciAqKm93bmVyRGVzLAorCQkJeG1sU2NoZW1hVHlwZVB0ciBvd25lckl0ZW0sCisJCQl4bWxOb2RlUHRyIG5vZGUsCisJCQl4bWxTY2hlbWFWYWxUeXBlIGJpVHlwZSwKKwkJCWNvbnN0IGNoYXIgKnR5cGVEZXMsCisJCQljb25zdCB4bWxDaGFyICp2YWx1ZSwKKwkJCWNvbnN0IGNoYXIgKm1lc3NhZ2UsCisJCQljb25zdCB4bWxDaGFyICpzdHIxLAorCQkJY29uc3QgeG1sQ2hhciAqc3RyMikKK3sKKyAgICB4bWxDaGFyICpkZXMgPSBOVUxMLCAqc3RyQSA9IE5VTEwsICpzdHJUID0gTlVMTDsKKyAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGUgPSBOVUxMOworICAgIAorICAgIGlmIChvd25lckRlcyA9PSBOVUxMKQorCXhtbFNjaGVtYVBSZXF1ZXN0SXRlbURlcygmZGVzLCBvd25lckl0ZW0sIG5vZGUpOworICAgIGVsc2UgaWYgKCpvd25lckRlcyA9PSBOVUxMKSB7CisJeG1sU2NoZW1hUFJlcXVlc3RJdGVtRGVzKG93bmVyRGVzLCBvd25lckl0ZW0sIG5vZGUpOworCWRlcyA9ICpvd25lckRlczsKKyAgICB9IGVsc2UgCisJZGVzID0gKm93bmVyRGVzOyAgIAorICAgIGlmIChiaVR5cGUgIT0gWE1MX1NDSEVNQVNfVU5LTk9XTikgeworCXR5cGUgPSB4bWxTY2hlbWFHZXRCdWlsdEluVHlwZShiaVR5cGUpOworCWlmICh0eXBlID09IE5VTEwpIHsKKwkgICAgeG1sU2NoZW1hUEVycihjdHh0LCBub2RlLCBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCisJCSJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hUFNpbXBsZVR5cGVFcnIsIGNvdWxkIG5vdCAiCisJCSJhcXVpcmUgdGhlIGJ1aWx0LWluIHR5cGUuXG4iLAorCQlCQURfQ0FTVCBkZXMsIEJBRF9DQVNUIHR5cGVEZXMpOworCSAgICByZXR1cm47CisJfQorCXR5cGVEZXMgPSAoY29uc3QgY2hhciAqKSB4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHJULCBOVUxMLCB0eXBlLCBOVUxMLCAxKTsKKyAgICB9CisgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworCS8qCisJKiBVc2UgZGVmYXVsdCBtZXNzYWdlcy4KKwkqLworCWlmIChub2RlLT50eXBlID09IFhNTF9BVFRSSUJVVEVfTk9ERSkgeworCSAgICB4bWxTY2hlbWFQRXJyRXh0KGN0eHQsIG5vZGUsIGVycm9yLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiJXMsIGF0dHJpYnV0ZSAnJXMnIFslc106IFRoZSB2YWx1ZSAnJXMnIGlzIG5vdCAiCisJCSJ2YWxpZC5cbiIsIAorCQlCQURfQ0FTVCBkZXMsIHhtbFNjaGVtYUZvcm1hdE5zUHJlZml4TG9jYWwoJnN0ckEsIG5vZGUtPm5zLCAKKwkJbm9kZS0+bmFtZSksIEJBRF9DQVNUIHR5cGVEZXMsIHZhbHVlLCBOVUxMKTsKKwl9IGVsc2UgeworCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIGVycm9yLCAKKwkJIiVzIFslc106IFRoZSBjaGFyYWN0ZXIgY29udGVudCBpcyBub3QgdmFsaWQuXG4iLAorCQlCQURfQ0FTVCBkZXMsIEJBRF9DQVNUIHR5cGVEZXMpOworCX0KKyAgICB9IGVsc2UgeworCXhtbENoYXIgKm1zZzsKKworCW1zZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiJXMiKTsKKwlpZiAobm9kZS0+dHlwZSA9PSBYTUxfQVRUUklCVVRFX05PREUpCisJICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUICIsIGF0dHJpYnV0ZSAnJXMnIik7CisJbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIiBbJXNdOiAiKTsKKwltc2cgPSB4bWxTdHJjYXQobXNnLCAoY29uc3QgeG1sQ2hhciAqKSBtZXNzYWdlKTsKKwltc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiLlxuIik7CisJaWYgKG5vZGUtPnR5cGUgPT0gWE1MX0FUVFJJQlVURV9OT0RFKSB7CisJICAgIHhtbFNjaGVtYVBFcnJFeHQoY3R4dCwgbm9kZSwgZXJyb3IsIE5VTEwsIE5VTEwsIE5VTEwsCisJCShjb25zdCBjaGFyICopIG1zZywgCisJCUJBRF9DQVNUIGRlcywgeG1sU2NoZW1hRm9ybWF0TnNQcmVmaXhMb2NhbCgmc3RyQSwgCisJCW5vZGUtPm5zLCBub2RlLT5uYW1lKSwgQkFEX0NBU1QgdHlwZURlcywgc3RyMSwgc3RyMik7CisJfSBlbHNlIHsKKwkgICAgeG1sU2NoZW1hUEVyckV4dChjdHh0LCBub2RlLCBlcnJvciwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJKGNvbnN0IGNoYXIgKikgbXNnLCAKKwkJQkFEX0NBU1QgZGVzLCBCQURfQ0FTVCB0eXBlRGVzLCBzdHIxLCBzdHIyLCBOVUxMKTsKKwl9CisJeG1sRnJlZShtc2cpOworICAgIH0KKyAgICAvKiBDbGVhbnVwLiAqLworICAgIEZSRUVfQU5EX05VTEwoc3RyQSkKKyAgICBGUkVFX0FORF9OVUxMKHN0clQpCisgICAgaWYgKG93bmVyRGVzID09IE5VTEwpCisJRlJFRV9BTkRfTlVMTChkZXMpCit9CisKK3N0YXRpYyB2b2lkCit4bWxTY2hlbWFQQ29udGVudEVycih4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsIAorCQkgICAgIHhtbFBhcnNlckVycm9ycyBlcnJvciwKKwkJICAgICB4bWxDaGFyICoqb3duZXJEZXMsCisJCSAgICAgeG1sU2NoZW1hVHlwZVB0ciBvd25lckl0ZW0sCisJCSAgICAgeG1sTm9kZVB0ciBvd25lckVsZW0sCQkgICAgIAorCQkgICAgIHhtbE5vZGVQdHIgY2hpbGQsCisJCSAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwKKwkJICAgICBjb25zdCBjaGFyICpjb250ZW50KQoreworICAgIHhtbENoYXIgKmRlcyA9IE5VTEw7CisgICAgCisgICAgaWYgKG93bmVyRGVzID09IE5VTEwpCisJeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydCgmZGVzLCBOVUxMLCBvd25lckl0ZW0sIG93bmVyRWxlbSwgMSk7CisgICAgZWxzZSBpZiAoKm93bmVyRGVzID09IE5VTEwpIHsKKwl4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KG93bmVyRGVzLCBOVUxMLCBvd25lckl0ZW0sIG93bmVyRWxlbSwgMSk7CisJZGVzID0gKm93bmVyRGVzOworICAgIH0gZWxzZSAKKwlkZXMgPSAqb3duZXJEZXM7ICAgCisgICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKKwl4bWxTY2hlbWFQRXJyMihjdHh0LCBvd25lckVsZW0sIGNoaWxkLCBlcnJvciwgCisJICAgICIlczogJXMuXG4iLCAKKwkgICAgQkFEX0NBU1QgZGVzLCBCQURfQ0FTVCBtZXNzYWdlKTsKKyAgICBlbHNlIHsKKwlpZiAoY29udGVudCAhPSBOVUxMKSB7CisJICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG93bmVyRWxlbSwgY2hpbGQsIGVycm9yLCAKKwkJIiVzOiBUaGUgY29udGVudCBpcyBub3QgdmFsaWQuIEV4cGVjdGVkIGlzICVzLlxuIiwgCisJCUJBRF9DQVNUIGRlcywgQkFEX0NBU1QgY29udGVudCk7CisJfSBlbHNlIHsKKwkgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgb3duZXJFbGVtLCBjaGlsZCwgZXJyb3IsIAorCQkiJXM6IFRoZSBjb250ZW50IGlzIG5vdCB2YWxpZC5cbiIsIAorCQlCQURfQ0FTVCBkZXMsIE5VTEwpOworCX0KKyAgICB9CisgICAgaWYgKG93bmVyRGVzID09IE5VTEwpCisJRlJFRV9BTkRfTlVMTChkZXMpCit9ICAgCisKKy8qKgorICogeG1sU2NoZW1hVklsbGVnYWxBdHRyRXJyOgorICogQGN0eHQ6IHRoZSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0CisgKiBAYXR0cjogdGhlIGlsbGVnYWwgYXR0cmlidXRlIG5vZGUKKyAqCisgKiBSZXBvcnRzIGFuIGlsbGVnYWwgYXR0cmlidXRlLgorICovCitzdGF0aWMgdm9pZAoreG1sU2NoZW1hVklsbGVnYWxBdHRyRXJyKHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0LAorCQkJeG1sQXR0clB0ciBhdHRyKQoreworICAgIHhtbENoYXIgKnN0ckUgPSBOVUxMLCAqc3RyQSA9IE5VTEw7CisKKyAgICB4bWxTY2hlbWFWRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyLCAKKwlYTUxfU0NIRU1BU19FUlJfQVRUUlVOS05PV04sCisJIiVzOiBUaGUgYXR0cmlidXRlICclcycgaXMgbm90IGFsbG93ZWQuXG4iLAorCXhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ckUsIE5VTEwsIE5VTEwsIGF0dHItPnBhcmVudCwgMCksCisJeG1sU2NoZW1hRm9ybWF0TnNQcmVmaXhMb2NhbCgmc3RyQSwgYXR0ci0+bnMsIGF0dHItPm5hbWUpKTsKKyAgICBGUkVFX0FORF9OVUxMKHN0ckUpCisgICAgRlJFRV9BTkRfTlVMTChzdHJBKQorfQorCitzdGF0aWMgdm9pZAoreG1sU2NoZW1hVkN1c3RvbUVycih4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCwKKwkJICAgIHhtbFBhcnNlckVycm9ycyBlcnJvciwJCQkgICAgCisJCSAgICB4bWxOb2RlUHRyIG5vZGUsCisJCSAgICBjb25zdCBjaGFyICptZXNzYWdlLAorCQkgICAgY29uc3QgeG1sQ2hhciAqc3RyMSkKK3sKKyAgICB4bWxDaGFyICpkZXMgPSBOVUxMLCAqbXNnID0gTlVMTDsKKworICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJmRlcywgTlVMTCwgTlVMTCwgbm9kZSwgMCk7CisgICAgbXNnID0geG1sU3RyZHVwKEJBRF9DQVNUICIlczogIik7CisgICAgbXNnID0geG1sU3RyY2F0KG1zZywgKGNvbnN0IHhtbENoYXIgKikgbWVzc2FnZSk7CisgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIi5cbiIpOworICAgIHhtbFNjaGVtYVZFcnJFeHQoY3R4dCwgbm9kZSwgZXJyb3IsIChjb25zdCBjaGFyICopIG1zZywgCisJQkFEX0NBU1QgZGVzLCBzdHIxLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBGUkVFX0FORF9OVUxMKGRlcyk7CisgICAgRlJFRV9BTkRfTlVMTChtc2cpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCit4bWxTY2hlbWFXaWxkY2FyZFBDVG9TdHJpbmcoaW50IHBjKQoreworICAgIHN3aXRjaCAocGMpIHsKKwljYXNlIFhNTF9TQ0hFTUFTX0FOWV9TS0lQOgorCSAgICByZXR1cm4gKCJza2lwIik7CisJY2FzZSBYTUxfU0NIRU1BU19BTllfTEFYOgorCSAgICByZXR1cm4gKCJsYXgiKTsKKwljYXNlIFhNTF9TQ0hFTUFTX0FOWV9TVFJJQ1Q6CisJICAgIHJldHVybiAoInN0cmljdCIpOworCWRlZmF1bHQ6CisJICAgIHJldHVybiAoImludmFsaWQgcHJvY2VzcyBjb250ZW50cyIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3htbFNjaGVtYVZXaWxkY2FyZEVycih4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCwKKwkJICAgIHhtbFBhcnNlckVycm9ycyBlcnJvciwJCQkgICAgCisJCSAgICB4bWxOb2RlUHRyIG5vZGUsCisJCSAgICB4bWxTY2hlbWFXaWxkY2FyZFB0ciB3aWxkLAorCQkgICAgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgICB4bWxDaGFyICpkZXMgPSBOVUxMLCAqbXNnID0gTlVMTDsKKworICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJmRlcywgTlVMTCwgTlVMTCwgbm9kZSwgMCk7CisgICAgbXNnID0geG1sU3RyZHVwKEJBRF9DQVNUICIlcywgWyIpOworICAgIG1zZyA9IHhtbFN0cmNhdChtc2csIEJBRF9DQVNUIHhtbFNjaGVtYVdpbGRjYXJkUENUb1N0cmluZyh3aWxkLT5wcm9jZXNzQ29udGVudHMpKTsKKyAgICBtc2cgPSB4bWxTdHJjYXQobXNnLCBCQURfQ0FTVCAiIFdDXTogIik7CisgICAgbXNnID0geG1sU3RyY2F0KG1zZywgKGNvbnN0IHhtbENoYXIgKikgbWVzc2FnZSk7CisgICAgbXNnID0geG1sU3RyY2F0KG1zZywgQkFEX0NBU1QgIi5cbiIpOworICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgZXJyb3IsIChjb25zdCBjaGFyICopIG1zZywgQkFEX0NBU1QgZGVzLCBOVUxMKTsKKyAgICBGUkVFX0FORF9OVUxMKGRlcyk7CisgICAgRlJFRV9BTkRfTlVMTChtc2cpOworfQorCisvKioKKyAqIHhtbFNjaGVtYVZNaXNzaW5nQXR0ckVycjoKKyAqIEBjdHh0OiB0aGUgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dAorICogQG5vZGU6IHRoZSBwYXJlbnQgZWxlbWVudCBub2RlIG9mIHRoZSBtaXNzaW5nIGF0dHJpYnV0ZSBub2RlCisgKiBAdHlwZTogdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBvZiB0aGUgYXR0cmlidXRlIG5vZGUKKyAqCisgKiBSZXBvcnRzIGFuIGlsbGVnYWwgYXR0cmlidXRlLgorICovCitzdGF0aWMgdm9pZAoreG1sU2NoZW1hVk1pc3NpbmdBdHRyRXJyKHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0LAorCQkJIHhtbE5vZGVQdHIgZWxlbSwKKwkJCSB4bWxTY2hlbWFBdHRyaWJ1dGVQdHIgdHlwZSkKK3sKKyAgICBjb25zdCB4bWxDaGFyICpuYW1lLCAqdXJpOworICAgIHhtbENoYXIgKnN0ckUgPSBOVUxMLCAqc3RyQSA9IE5VTEw7CisKKyAgICBpZiAodHlwZS0+cmVmICE9IE5VTEwpIHsJCQkJCisJbmFtZSA9IHR5cGUtPnJlZjsKKwl1cmkgPSB0eXBlLT5yZWZOczsKKyAgICB9IGVsc2UgeworCW5hbWUgPSB0eXBlLT5uYW1lOworCXVyaSA9IHR5cGUtPnRhcmdldE5hbWVzcGFjZTsKKyAgICB9CQkJICAgIAorICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgZWxlbSwgCisJWE1MX1NDSEVNQVNfRVJSX01JU1NJTkcsCisJIiVzOiBUaGUgYXR0cmlidXRlICVzIGlzIHJlcXVpcmVkIGJ1dCBtaXNzaW5nLlxuIiwKKwl4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHJFLCBOVUxMLCBOVUxMLCBlbGVtLCAwKSwKKwl4bWxTY2hlbWFGb3JtYXROc1VyaUxvY2FsKCZzdHJBLCB1cmksIG5hbWUpKTsKKyAgICBGUkVFX0FORF9OVUxMKHN0ckUpCisgICAgRlJFRV9BTkRfTlVMTChzdHJBKQorfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJCQkJCQkqCiAgKiAJCQlBbGxvY2F0aW9uIGZ1bmN0aW9ucwkJCQkqCkBAIC01OTEsNiArMTY1NSw4IEBACiB7CiAgICAgaWYgKGF0dHIgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOworICAgIGlmIChhdHRyLT5hbm5vdCAhPSBOVUxMKSAKKwl4bWxTY2hlbWFGcmVlQW5ub3QoYXR0ci0+YW5ub3QpOwogICAgIHhtbEZyZWUoYXR0cik7CiB9CiAKQEAgLTYwNCw3ICsxNjcwLDcgQEAKIHhtbFNjaGVtYUZyZWVXaWxkY2FyZE5zU2V0KHhtbFNjaGVtYVdpbGRjYXJkTnNQdHIgc2V0KQogewogICAgIHhtbFNjaGVtYVdpbGRjYXJkTnNQdHIgbmV4dDsKLQorICAgIAogICAgIHdoaWxlIChzZXQgIT0gTlVMTCkgewogCW5leHQgPSBzZXQtPm5leHQ7CiAJeG1sRnJlZShzZXQpOwpAQCAtMTA4MSwxNiArMjE0Nyw1NSBAQAogICoJCQkJCQkJCQkqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKioKKyAqIHhtbFNjaGVtYUdldFByb3BOb2RlOgorICogQG5vZGU6IHRoZSBlbGVtZW50IG5vZGUgCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorICoKKyAqIFNlZWtzIGFuIGF0dHJpYnV0ZSB3aXRoIGEgbmFtZSBvZiBAbmFtZSBpbgorICogbm8gbmFtZXNwYWNlLgorICoKKyAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBvciBOVUxMIGlmIG5vdCBwcmVzZW50LiAKKyAqLwogc3RhdGljIHhtbEF0dHJQdHIKLXhtbFNjaGVtYUdldFByb3BOb2RlKHhtbE5vZGVQdHIgbm9kZSwgY29uc3QgeG1sQ2hhciAqbmFtZSkgCit4bWxTY2hlbWFHZXRQcm9wTm9kZSh4bWxOb2RlUHRyIG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpIAogewogICAgIHhtbEF0dHJQdHIgcHJvcDsKIAotICAgIGlmICgobm9kZSA9PSBOVUxMKSB8fCAobmFtZSA9PSBOVUxMKSkgcmV0dXJuKE5VTEwpOworICAgIGlmICgobm9kZSA9PSBOVUxMKSB8fCAobmFtZSA9PSBOVUxMKSkgCisJcmV0dXJuKE5VTEwpOwogICAgIHByb3AgPSBub2RlLT5wcm9wZXJ0aWVzOwogICAgIHdoaWxlIChwcm9wICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCh4bWxTdHJFcXVhbChwcm9wLT5uYW1lLCBuYW1lKSkgJiYJICAgIAotCSAgICAocHJvcC0+bnMgPT0gTlVMTCkpCisgICAgICAgIGlmICgocHJvcC0+bnMgPT0gTlVMTCkgJiYgeG1sU3RyRXF1YWwocHJvcC0+bmFtZSwgQkFEX0NBU1QgbmFtZSkpCSAgICAKKwkgICAgcmV0dXJuKHByb3ApOworCXByb3AgPSBwcm9wLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gKE5VTEwpOworfQorCisvKioKKyAqIHhtbFNjaGVtYUdldFByb3BOb2RlTnM6CisgKiBAbm9kZTogdGhlIGVsZW1lbnQgbm9kZSAKKyAqIEB1cmk6IHRoZSB1cmkKKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgKgorICogU2Vla3MgYW4gYXR0cmlidXRlIHdpdGggYSBsb2NhbCBuYW1lIG9mIEBuYW1lIGFuZAorICogYSBuYW1lc3BhY2UgVVJJIG9mIEB1cmkuCisgKgorICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG9yIE5VTEwgaWYgbm90IHByZXNlbnQuIAorICovCitzdGF0aWMgeG1sQXR0clB0cgoreG1sU2NoZW1hR2V0UHJvcE5vZGVOcyh4bWxOb2RlUHRyIG5vZGUsIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgY2hhciAqbmFtZSkgCit7CisgICAgeG1sQXR0clB0ciBwcm9wOworCisgICAgaWYgKChub2RlID09IE5VTEwpIHx8IChuYW1lID09IE5VTEwpKSAKKwlyZXR1cm4oTlVMTCk7CisgICAgcHJvcCA9IG5vZGUtPnByb3BlcnRpZXM7CisgICAgd2hpbGUgKHByb3AgIT0gTlVMTCkgeworCWlmICgocHJvcC0+bnMgIT0gTlVMTCkgJiYKKwkgICAgeG1sU3RyRXF1YWwocHJvcC0+bmFtZSwgQkFEX0NBU1QgbmFtZSkgJiYKKwkgICAgeG1sU3RyRXF1YWwocHJvcC0+bnMtPmhyZWYsIEJBRF9DQVNUIHVyaSkpCiAJICAgIHJldHVybihwcm9wKTsKIAlwcm9wID0gcHJvcC0+bmV4dDsKICAgICB9CkBAIC0xMjA2LDcgKzIzMTEsNyBAQAogICAgIG5zID0geG1sU2VhcmNoTnMobm9kZS0+ZG9jLCBub2RlLCBwcmVmaXgpOwogICAgIGlmIChucyA9PSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVBfUFJFRklYX1VOREVGSU5FRCwKLSAgICAgICAgICAgICAgICAgICAgICAiJXM6IHRoZSBRTmFtZSBwcmVmaXggJXMgaXMgdW5kZWZpbmVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICIlczogVGhlIFFOYW1lIHByZWZpeCAlcyBpcyB1bmRlZmluZWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+bmFtZSwgcHJlZml4KTsKIAlyZXR1cm4obmFtZSk7CiAgICAgfQpAQCAtMTUyMyw3ICsyNjI4LDcgQEAKICAqIEBzY2hlbWE6ICB0aGUgc2NoZW1hIGJlaW5nIGJ1aWx0CiAgKiBAbmFtZTogIHRoZSBpdGVtIG5hbWUKICAqCi0gKiBBZGQgYW4gWE1MIHNjaGVtYSBBdHRycmlidXRlIGRlY2xhcmF0aW9uCisgKiBBZGQgYW4gWE1MIHNjaGVtYSBhbm5vdGF0aW9uIGRlY2xhcmF0aW9uCiAgKiAqV0FSTklORyogdGhpcyBpbnRlcmZhY2UgaXMgaGlnaGx5IHN1YmplY3QgdG8gY2hhbmdlCiAgKgogICogUmV0dXJucyB0aGUgbmV3IHN0cnV0dXJlIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgpAQCAtMTU1Myw5ICsyNjU4LDEzIEBACiAgICAgdmFsID0geG1sSGFzaEFkZEVudHJ5MihzY2hlbWEtPm5vdGFEZWNsLCBuYW1lLCBzY2hlbWEtPnRhcmdldE5hbWVzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCk7CiAgICAgaWYgKHZhbCAhPSAwKSB7CisJLyoKKwkqIFRPRE86IFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgc2luY2UgYSB1bmlxdWUgbmFtZSB3aWxsIGJlIGNvbXB1dGVkLgorCSogSWYgaXQgZmFpbHMsIHRoZW4gYW4gb3RoZXIgaW50ZXJuYWwgZXJyb3IgbXVzdCBoYXZlIG9jY3VyZWQuCisJKi8KIAl4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBjdHh0LT5kb2MsCiAJCSAgICAgIFhNTF9TQ0hFTUFQX1JFREVGSU5FRF9OT1RBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAiTm90YXRpb24gJXMgYWxyZWFkeSBkZWZpbmVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICJBbm5vdGF0aW9uIGRlY2xhcmF0aW9uICclcycgaXMgYWxyZWFkeSBkZWNsYXJlZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgTlVMTCk7CiAgICAgICAgIHhtbEZyZWUocmV0KTsKICAgICAgICAgcmV0dXJuIChOVUxMKTsKQEAgLTE2MDgsMTAgKzI3MTcsMTQgQEAKICAgICB2YWwgPSB4bWxIYXNoQWRkRW50cnkzKHNjaGVtYS0+YXR0ckRlY2wsIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEtPnRhcmdldE5hbWVzcGFjZSwgY3R4dC0+Y29udGFpbmVyLCByZXQpOwogICAgIGlmICh2YWwgIT0gMCkgeworCS8qCisJKiBUT0RPOiBDaGFuZ2UgdGhpcyBzb21laG93LCBzaW5jZSB0aGlzIGNhbiBiZSBlaXRoZXIgYW4gYXR0cmlidXRlCisJKiBkZWNsYXJhdGlvbiBvciBhIHBhcnRpY2xlIHJlZmVyZW5jaW5nIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KKwkqLwogCXhtbFNjaGVtYVBFcnIoY3R4dCwgKHhtbE5vZGVQdHIpIGN0eHQtPmRvYywKLQkJICAgICAgWE1MX1NDSEVNQVBfUkVERUZJTkVEX0FUVFIsCi0gICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSAlcyBhbHJlYWR5IGRlZmluZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZSwgTlVMTCk7CisJICAgIFhNTF9TQ0hFTUFQX1JFREVGSU5FRF9BVFRSLAorCSAgICAiQXR0cmlidXRlIGRlY2xhcmF0aW9uICclcycgaXMgYWxyZWFkeSBkZWNsYXJlZC5cbiIsCisJICAgIG5hbWUsIE5VTEwpOwogICAgICAgICB4bWxGcmVlKHJldCk7CiAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgfQpAQCAtMTY1Nyw3ICsyNzcwLDcgQEAKICAgICBpZiAodmFsICE9IDApIHsKIAl4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBjdHh0LT5kb2MsCiAJCSAgICAgIFhNTF9TQ0hFTUFQX1JFREVGSU5FRF9BVFRSR1JPVVAsCi0gICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBncm91cCAlcyBhbHJlYWR5IGRlZmluZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBncm91cCAnJXMnIGlzIGFscmVhZHkgZGVmaW5lZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgTlVMTCk7CiAgICAgICAgIHhtbEZyZWUocmV0KTsKICAgICAgICAgcmV0dXJuIChOVUxMKTsKQEAgLTE3MDksMTkgKzI4MjIsMjEgQEAKICAgICB2YWwgPSB4bWxIYXNoQWRkRW50cnkzKHNjaGVtYS0+ZWxlbURlY2wsIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsIGN0eHQtPmNvbnRhaW5lciwgcmV0KTsKICAgICBpZiAodmFsICE9IDApIHsKKwkvKgogICAgICAgICBjaGFyIGJ1ZlsxMDBdOwogCiAgICAgICAgIHNucHJpbnRmKGJ1ZiwgOTksICJwcml2YXRpZWVsZW0gJWQiLCBjdHh0LT5jb3VudGVyKysgKyAxKTsKICAgICAgICAgdmFsID0geG1sSGFzaEFkZEVudHJ5MyhzY2hlbWEtPmVsZW1EZWNsLCBuYW1lLCAoeG1sQ2hhciAqKSBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLCByZXQpOwogICAgICAgICBpZiAodmFsICE9IDApIHsKLQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCAoeG1sTm9kZVB0cikgY3R4dC0+ZG9jLAotCQkJICBYTUxfU0NIRU1BUF9SRURFRklORURfRUxFTUVOVCwKLQkJCSAgIkVsZW1lbnQgJXMgYWxyZWFkeSBkZWZpbmVkXG4iLAotCQkJICBuYW1lLCBOVUxMKTsKKwkqLwkgICAgCisJeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAorCSAgICBYTUxfU0NIRU1BUF9SRURFRklORURfRUxFTUVOVCwKKwkgICAgKHhtbENoYXIgKiopICZ4bWxTY2hlbWFFbGVtRGVzRWxlbURlY2wsIE5VTEwsIE5VTEwsCisJICAgICJBIGdsb2JhbCBkZWNsYXJhdGlvbiBmb3IgJyVzJyBpcyBhbHJlYWR5IGV4aXN0ZW50IiwgbmFtZSk7CiAgICAgICAgICAgICB4bWxGcmVlKHJldCk7CiAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwotICAgICAgICB9CisgICAgICAgIAogICAgIH0KICAgICByZXR1cm4gKHJldCk7CiB9CkBAIC0xNzcyLDcgKzI4ODcsNyBAQAogICAgICAgICBpZiAoY3R4dC0+aW5jbHVkZXMgPT0gMCkgewogCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBjdHh0LT5kb2MsCiAJCQkgIFhNTF9TQ0hFTUFQX1JFREVGSU5FRF9UWVBFLAotCQkJICAiVHlwZSAlcyBhbHJlYWR5IGRlZmluZWRcbiIsCisJCQkgICJUeXBlICclcycgaXMgYWxyZWFkeSBkZWZpbmVkLlxuIiwKIAkJCSAgbmFtZSwgTlVMTCk7CiAJICAgIHhtbEZyZWUocmV0KTsKIAkgICAgcmV0dXJuIChOVUxMKTsKQEAgLTE3ODIsOSArMjg5NywxMCBAQAogCSAgICBwcmV2ID0geG1sSGFzaExvb2t1cDIoc2NoZW1hLT50eXBlRGVjbCwgbmFtZSwgbmFtZXNwYWNlKTsKIAkgICAgaWYgKHByZXYgPT0gTlVMTCkgewogCQl4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBjdHh0LT5kb2MsCi0JCQkgICAgICBYTUxfRVJSX0lOVEVSTkFMX0VSUk9SLAotCQkJICAgICAgIkludGVybmFsIGVycm9yIG9uIHR5cGUgJXMgZGVmaW5pdGlvblxuIiwKLQkJCSAgICAgIG5hbWUsIE5VTEwpOworCQkgICAgWE1MX0VSUl9JTlRFUk5BTF9FUlJPUiwKKwkJICAgICJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hQWRkVHlwZSwgb24gdHlwZSAiCisJCSAgICAiJyVzJy5cbiIsCisJCSAgICBuYW1lLCBOVUxMKTsKIAkJeG1sRnJlZShyZXQpOwogCQlyZXR1cm4gKE5VTEwpOwogCSAgICB9CkBAIC0xODM4LDcgKzI5NTQsNyBAQAogICAgIGlmICh2YWwgIT0gMCkgewogCXhtbFNjaGVtYVBFcnIoY3R4dCwgKHhtbE5vZGVQdHIpIGN0eHQtPmRvYywKIAkJICAgICAgWE1MX1NDSEVNQVBfUkVERUZJTkVEX0dST1VQLAotICAgICAgICAgICAgICAgICAgICAgICJHcm91cCAlcyBhbHJlYWR5IGRlZmluZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIkdyb3VwICclcycgaXMgYWxyZWFkeSBkZWZpbmVkLlxuIiwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBOVUxMKTsKICAgICAgICAgeG1sRnJlZShyZXQpOwogICAgICAgICByZXR1cm4gKE5VTEwpOwpAQCAtMTg3NiwxMCArMjk5Miw5IEBACiAvKioKICAqIHhtbFNjaGVtYUFkZFdpbGRjYXJkOgogICogQGN0eHQ6ICBhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKLSAqIEBzY2hlbWE6ICB0aGUgc2NoZW1hIGJlaW5nIGJ1aWx0Ci0gKiBAbmFtZTogIHRoZSBncm91cCBuYW1lCi0gKgotICogQWRkIGFuIFhNTCBzY2hlbWEgR3JvdXAgZGVmaW5pdGlvbgorICogQWRkcyBhIHdpbGRjYXJkLiBJdCBjb3JyZXNwb25kcyB0byBhIAorICogeHNkOmFueUF0dHJpYnV0ZSBhbmQgaXMgdXNlZCBhcyBzdG9yYWdlIGZvciBuYW1lc3BhY2UgCisgKiBjb25zdHJhaW50cyBvbiBhIHhzZDphbnkuCiAgKgogICogUmV0dXJucyB0aGUgbmV3IHN0cnV0dXJlIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgogICovCkBAIC0xOTUyLDggKzMwNjcsOSBAQAogICAgIG5zID0geG1sU2VhcmNoTnMobm9kZS0+ZG9jLCBub2RlLCBwcmVmaXgpOwogICAgIGlmIChucyA9PSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVBfUFJFRklYX1VOREVGSU5FRCwKLSAgICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIFwiJXNcIjogdGhlIFFOYW1lIHByZWZpeCBcIiVzXCIgaXMgdW5kZWZpbmVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB4bWxDaGFyICopIG5hbWUsIHByZWZpeCk7CisJICAgICJBdHRyaWJ1dGUgJyVzJzogVGhlIHByZWZpeCAnJXMnIG9mIHRoZSBRTmFtZSAiCisJICAgICInJXMnIGhhcyBubyBjb3JyZXNwb25kaW5nIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBpcyBzY29wZS5cbiIsCisJICAgIChjb25zdCB4bWxDaGFyICopIG5hbWUsIHByZWZpeCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKm5hbWVzcGFjZSA9IHhtbERpY3RMb29rdXAoY3R4dC0+ZGljdCwgbnMtPmhyZWYsIC0xKTsKICAgICB9CkBAIC0xOTYxLDYgKzMwNzcsMTY0IEBACiB9CiAKIC8qKgorICogeG1sU2NoZW1hUFZhbEF0dHJOb2RlUU5hbWVWYWx1ZToKKyAqIEBjdHh0OiAgYSBzY2hlbWEgcGFyc2VyIGNvbnRleHQKKyAqIEBzY2hlbWE6IHRoZSBzY2hlbWEgY29udGV4dAorICogQG93bmVyRGVzOiB0aGUgZGVzaWduYXRpb24gb2YgdGhlIHBhcmVudCBlbGVtZW50CisgKiBAb3duZXJJdGVtOiB0aGUgcGFyZW50IGFzIGEgc2NoZW1hIG9iamVjdAorICogQHZhbHVlOiAgdGhlIFFOYW1lIHZhbHVlIAorICogQGxvY2FsOiB0aGUgcmVzdWx0aW5nIGxvY2FsIHBhcnQgaWYgZm91bmQsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb3RoZXJ3aXNlCisgKiBAdXJpOiAgdGhlIHJlc3VsdGluZyBuYW1lc3BhY2UgVVJJIGlmIGZvdW5kCisgKgorICogRXh0cmFjdHMgdGhlIGxvY2FsIG5hbWUgYW5kIHRoZSBVUkkgb2YgYSBRTmFtZSB2YWx1ZSBhbmQgdmFsaWRhdGVzIGl0LgorICogVGhpcyBvbmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhdHRyaWJ1dGUgdmFsdWVzIHRoYXQKKyAqIHNob3VsZCByZXNvbHZlIHRvIHNjaGVtYSBjb21wb25lbnRzLgorICoKKyAqIFJldHVybnMgMCwgaW4gY2FzZSB0aGUgUU5hbWUgaXMgdmFsaWQsIGEgcG9zaXRpdmUgZXJyb3IgY29kZQorICogaWYgbm90IHZhbGlkIGFuZCAtMSBpZiBhbiBpbnRlcm5hbCBlcnJvciBvY2N1cnMuCisgKi8KK3N0YXRpYyBpbnQKK3htbFNjaGVtYVBWYWxBdHRyTm9kZVFOYW1lVmFsdWUoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LCAKKwkJCQkgICAgICAgeG1sU2NoZW1hUHRyIHNjaGVtYSwKKwkJCQkgICAgICAgeG1sQ2hhciAqKm93bmVyRGVzLAorCQkJCSAgICAgICB4bWxTY2hlbWFUeXBlUHRyIG93bmVySXRlbSwKKwkJCQkgICAgICAgeG1sQXR0clB0ciBhdHRyLAorCQkJCSAgICAgICBjb25zdCB4bWxDaGFyICp2YWx1ZSwKKwkJCQkgICAgICAgY29uc3QgeG1sQ2hhciAqKnVyaSwKKwkJCQkgICAgICAgY29uc3QgeG1sQ2hhciAqKnByZWZpeCwKKwkJCQkgICAgICAgY29uc3QgeG1sQ2hhciAqKmxvY2FsKQoreworICAgIGNvbnN0IHhtbENoYXIgKnByZWY7CisgICAgeG1sTnNQdHIgbnM7CisgICAgaW50IGxlbiwgcmV0OworICAgIAorICAgICp1cmkgPSBOVUxMOworICAgICpsb2NhbCA9IE5VTEw7CisgICAgaWYgKHByZWZpeCAhPSAwKQorCSpwcmVmaXggPSBOVUxMOworICAgIHJldCA9IHhtbFZhbGlkYXRlUU5hbWUodmFsdWUsIDEpOworICAgIGlmIChyZXQgPiAwKSB7CQkKKwl4bWxTY2hlbWFQU2ltcGxlVHlwZUVycihjdHh0LCAKKwkgICAgWE1MX1NDSEVNQVBfUzRTX0FUVFJfSU5WQUxJRF9WQUxVRSwgCisJICAgIG93bmVyRGVzLCBvd25lckl0ZW0sICh4bWxOb2RlUHRyKSBhdHRyLCAKKwkgICAgWE1MX1NDSEVNQVNfUU5BTUUsICJRTmFtZSIsIHZhbHVlLCAKKwkgICAgTlVMTCwgTlVMTCwgTlVMTCk7CQorCSpsb2NhbCA9IHZhbHVlOworCXJldHVybiAoY3R4dC0+ZXJyKTsgCisgICAgfSBlbHNlIGlmIChyZXQgPCAwKQorCXJldHVybiAoLTEpOworICAgCisgICAgaWYgKCFzdHJjaHIoKGNoYXIgKikgdmFsdWUsICc6JykpIHsJCisJbnMgPSB4bWxTZWFyY2hOcyhhdHRyLT5kb2MsIGF0dHItPnBhcmVudCwgMCk7CisJaWYgKG5zKQorCSAgICAqdXJpID0geG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCBucy0+aHJlZiwgLTEpOworCWVsc2UgaWYgKHNjaGVtYS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19JTkNMVURJTkdfQ09OVkVSVF9OUykgeworCSAgICAvKgorCSAgICAqIFRoaXMgb25lIHRha2VzIGNhcmUgb2YgaW5jbHVkZWQgc2NoZW1hcyB3aXRoIG5vCisJICAgICogdGFyZ2V0IG5hbWVzcGFjZS4KKwkgICAgKi8KKwkgICAgKnVyaSA9IHNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlOworCX0JCisJKmxvY2FsID0gdmFsdWU7CisJcmV0dXJuICgwKTsKKyAgICB9CisgICAgLyoKKyAgICAqIEF0IHRoaXMgcG9pbnQgeG1sU3BsaXRRTmFtZTMgaGFzIHRvIHJldHVybiBhIGxvY2FsIG5hbWUuCisgICAgKi8KKyAgICAqbG9jYWwgPSB4bWxTcGxpdFFOYW1lMyh2YWx1ZSwgJmxlbik7CisgICAgKmxvY2FsID0geG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCAqbG9jYWwsIC0xKTsKKyAgICBwcmVmID0geG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCB2YWx1ZSwgbGVuKTsKKyAgICBpZiAocHJlZml4ICE9IDApCisJKnByZWZpeCA9IHByZWY7CisgICAgbnMgPSB4bWxTZWFyY2hOcyhhdHRyLT5kb2MsIGF0dHItPnBhcmVudCwgcHJlZik7CisgICAgaWYgKG5zID09IE5VTEwpIHsKKwl4bWxTY2hlbWFQU2ltcGxlVHlwZUVycihjdHh0LCAKKwkgICAgWE1MX1NDSEVNQVBfUzRTX0FUVFJfSU5WQUxJRF9WQUxVRSwKKwkgICAgb3duZXJEZXMsIG93bmVySXRlbSwgKHhtbE5vZGVQdHIpIGF0dHIsIAorCSAgICBYTUxfU0NIRU1BU19RTkFNRSwgIlFOYW1lIiwgdmFsdWUsIAorCSAgICAiVGhlIHByZWZpeCAnJXMnIG9mIHRoZSB2YWx1ZSAnJXMnIGlzIG5vdCBkZWNsYXJlZC5cbiIsCisJICAgIHByZWYsIHZhbHVlKTsKKwlyZXR1cm4gKGN0eHQtPmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnVyaSA9IHhtbERpY3RMb29rdXAoY3R4dC0+ZGljdCwgbnMtPmhyZWYsIC0xKTsKKyAgICB9ICAgIAorICAgIHJldHVybiAoMCk7Cit9CisKKy8qKgorICogeG1sU2NoZW1hUFZhbEF0dHJOb2RlUU5hbWU6CisgKiBAY3R4dDogIGEgc2NoZW1hIHBhcnNlciBjb250ZXh0CisgKiBAc2NoZW1hOiB0aGUgc2NoZW1hIGNvbnRleHQKKyAqIEBvd25lckRlczogdGhlIGRlc2lnbmF0aW9uIG9mIHRoZSBvd25lciBlbGVtZW50CisgKiBAb3duZXJJdGVtOiB0aGUgb3duZXIgYXMgYSBzY2hlbWEgb2JqZWN0CisgKiBAYXR0cjogIHRoZSBhdHRyaWJ1dGUgbm9kZQorICogQGxvY2FsOiB0aGUgcmVzdWx0aW5nIGxvY2FsIHBhcnQgaWYgZm91bmQsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb3RoZXJ3aXNlCisgKiBAdXJpOiAgdGhlIHJlc3VsdGluZyBuYW1lc3BhY2UgVVJJIGlmIGZvdW5kCisgKgorICogRXh0cmFjdHMgYW5kIHZhbGlkYXRlcyB0aGUgUU5hbWUgb2YgYW4gYXR0cmlidXRlIHZhbHVlLgorICogVGhpcyBvbmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhdHRyaWJ1dGUgdmFsdWVzIHRoYXQKKyAqIHNob3VsZCByZXNvbHZlIHRvIHNjaGVtYSBjb21wb25lbnRzLgorICoKKyAqIFJldHVybnMgMCwgaW4gY2FzZSB0aGUgUU5hbWUgaXMgdmFsaWQsIGEgcG9zaXRpdmUgZXJyb3IgY29kZQorICogaWYgbm90IHZhbGlkIGFuZCAtMSBpZiBhbiBpbnRlcm5hbCBlcnJvciBvY2N1cnMuCisgKi8KK3N0YXRpYyBpbnQKK3htbFNjaGVtYVBWYWxBdHRyTm9kZVFOYW1lKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwgCisJCQkJICAgICAgIHhtbFNjaGVtYVB0ciBzY2hlbWEsCisJCQkJICAgICAgIHhtbENoYXIgKipvd25lckRlcywKKwkJCQkgICAgICAgeG1sU2NoZW1hVHlwZVB0ciBvd25lckl0ZW0sCisJCQkJICAgICAgIHhtbEF0dHJQdHIgYXR0ciwKKwkJCQkgICAgICAgY29uc3QgeG1sQ2hhciAqKnVyaSwKKwkJCQkgICAgICAgY29uc3QgeG1sQ2hhciAqKnByZWZpeCwKKwkJCQkgICAgICAgY29uc3QgeG1sQ2hhciAqKmxvY2FsKQoreworICAgIGNvbnN0IHhtbENoYXIgKnZhbHVlOworCisgICAgdmFsdWUgPSB4bWxTY2hlbWFHZXROb2RlQ29udGVudChjdHh0LCAoeG1sTm9kZVB0cikgYXR0cik7CisgICAgcmV0dXJuICh4bWxTY2hlbWFQVmFsQXR0ck5vZGVRTmFtZVZhbHVlKGN0eHQsIHNjaGVtYSwgCisJb3duZXJEZXMsIG93bmVySXRlbSwgYXR0ciwgdmFsdWUsIHVyaSwgcHJlZml4LCBsb2NhbCkpOworfQorCisvKioKKyAqIHhtbFNjaGVtYVBWYWxBdHRyUU5hbWU6CisgKiBAY3R4dDogIGEgc2NoZW1hIHBhcnNlciBjb250ZXh0CisgKiBAc2NoZW1hOiB0aGUgc2NoZW1hIGNvbnRleHQKKyAqIEBvd25lckRlczogdGhlIGRlc2lnbmF0aW9uIG9mIHRoZSBwYXJlbnQgZWxlbWVudAorICogQG93bmVySXRlbTogdGhlIG93bmVyIGFzIGEgc2NoZW1hIG9iamVjdAorICogQG93bmVyRWxlbTogIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgYXR0cmlidXRlCisgKiBAbmFtZTogIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAqIEBsb2NhbDogdGhlIHJlc3VsdGluZyBsb2NhbCBwYXJ0IGlmIGZvdW5kLCB0aGUgYXR0cmlidXRlIHZhbHVlIG90aGVyd2lzZQorICogQHVyaTogIHRoZSByZXN1bHRpbmcgbmFtZXNwYWNlIFVSSSBpZiBmb3VuZAorICoKKyAqIEV4dHJhY3RzIGFuZCB2YWxpZGF0ZXMgdGhlIFFOYW1lIG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZS4KKyAqCisgKiBSZXR1cm5zIDAsIGluIGNhc2UgdGhlIFFOYW1lIGlzIHZhbGlkLCBhIHBvc2l0aXZlIGVycm9yIGNvZGUKKyAqIGlmIG5vdCB2YWxpZCBhbmQgLTEgaWYgYW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJzLgorICovCitzdGF0aWMgaW50Cit4bWxTY2hlbWFQVmFsQXR0clFOYW1lKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwgCisJCQkJICAgeG1sU2NoZW1hUHRyIHNjaGVtYSwgCisJCQkJICAgeG1sQ2hhciAqKm93bmVyRGVzLAorCQkJCSAgIHhtbFNjaGVtYVR5cGVQdHIgb3duZXJJdGVtLAorCQkJCSAgIHhtbE5vZGVQdHIgb3duZXJFbGVtLAorCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgY29uc3QgeG1sQ2hhciAqKnVyaSwKKwkJCQkgICBjb25zdCB4bWxDaGFyICoqcHJlZml4LAorCQkJCSAgIGNvbnN0IHhtbENoYXIgKipsb2NhbCkKK3sKKyAgICB4bWxBdHRyUHRyIGF0dHI7CisKKyAgICBhdHRyID0geG1sU2NoZW1hR2V0UHJvcE5vZGUob3duZXJFbGVtLCBuYW1lKTsKKyAgICBpZiAoYXR0ciA9PSBOVUxMKSB7CisJKmxvY2FsID0gTlVMTDsKKwkqdXJpID0gTlVMTDsKKwlyZXR1cm4gKDApOyAgICAKKyAgICB9CisgICAgcmV0dXJuICh4bWxTY2hlbWFQVmFsQXR0ck5vZGVRTmFtZShjdHh0LCBzY2hlbWEsIAorCW93bmVyRGVzLCBvd25lckl0ZW0sIGF0dHIsIHVyaSwgcHJlZml4LCBsb2NhbCkpOworfQorCisvKioKICAqIHhtbEdldE1heE9jY3VyczoKICAqIEBjdHh0OiAgYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0CiAgKiBAbm9kZTogIGEgc3VidHJlZSBjb250YWluaW5nIFhNTCBTY2hlbWEgaW5mb3JtYXRpb25zCkBAIC0xOTk0LDcgKzMyNjgsOCBAQAogICAgICAgICBjdXIrKzsKICAgICBpZiAoKmN1ciAhPSAwKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVBfSU5WQUxJRF9NQVhPQ0NVUlMsCi0gICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdmFsdWUgZm9yIG1heE9jY3VyczogJXNcbiIsIHZhbCwgTlVMTCk7CisJICAgICJUaGUgdmFsdWUgJyVzJyBvZiB0aGUgYXR0cmlidXRlICdtYXhPY2N1cnMnIGlzIGludmFsaWQuXG4iLCAKKwkgICAgdmFsLCBOVUxMKTsKICAgICAgICAgcmV0dXJuICgxKTsKICAgICB9CiAgICAgcmV0dXJuIChyZXQpOwpAQCAtMjA0MywxMyArMzMxOCwxNiBAQAogICogQG5hbWU6ICB0aGUgYXR0cmlidXRlIG5hbWUKICAqIEBkZWY6ICB0aGUgZGVmYXVsdCB2YWx1ZQogICoKLSAqIEdldCBpcyBhIGJvbGVhbiBwcm9wZXJ0eSBpcyBzZXQKKyAqIEV2YWx1YXRlIGlmIGEgYm9vbGVhbiBwcm9wZXJ0eSBpcyBzZXQKICAqCiAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGlmIG5vdCBmb3VuZCwgMCBpZiBmb3VuZCB0byBiZSBmYWxzZSwKLSAqICAgICAgICAgMSBpZiBmb3VuZCB0byBiZSB0cnVlCisgKiAxIGlmIGZvdW5kIHRvIGJlIHRydWUKICAqLwogc3RhdGljIGludAoteG1sR2V0Qm9vbGVhblByb3AoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxOb2RlUHRyIG5vZGUsCit4bWxHZXRCb29sZWFuUHJvcCh4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsIAorCQkgIHhtbENoYXIgKipvd25lckRlcywKKwkJICB4bWxTY2hlbWFUeXBlUHRyIG93bmVySXRlbSwKKwkJICB4bWxOb2RlUHRyIG5vZGUsCiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgZGVmKQogewogICAgIGNvbnN0IHhtbENoYXIgKnZhbDsKQEAgLTIwNTcsMTUgKzMzMzUsMjUgQEAKICAgICB2YWwgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsIG5hbWUpOwogICAgIGlmICh2YWwgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIChkZWYpOwotCisgICAgLyogCisgICAgKiAzLjIuMi4xIExleGljYWwgcmVwcmVzZW50YXRpb24KKyAgICAqIEFuIGluc3RhbmNlIG9mIGEgZGF0YXR5cGUgdGhhdCBpcyBkZWZpbmVkIGFzILdib29sZWFutyAKKyAgICAqIGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgbGVnYWwgbGl0ZXJhbHMge3RydWUsIGZhbHNlLCAxLCAwfS4KKyAgICAqLwogICAgIGlmICh4bWxTdHJFcXVhbCh2YWwsIEJBRF9DQVNUICJ0cnVlIikpCiAgICAgICAgIGRlZiA9IDE7CiAgICAgZWxzZSBpZiAoeG1sU3RyRXF1YWwodmFsLCBCQURfQ0FTVCAiZmFsc2UiKSkKICAgICAgICAgZGVmID0gMDsKKyAgICBlbHNlIGlmICh4bWxTdHJFcXVhbCh2YWwsIEJBRF9DQVNUICIxIikpCisJZGVmID0gMTsKKyAgICBlbHNlIGlmICh4bWxTdHJFcXVhbCh2YWwsIEJBRF9DQVNUICIwIikpCisgICAgICAgIGRlZiA9IDA7ICAgIAogICAgIGVsc2UgewotICAgICAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIFhNTF9TQ0hFTUFQX0lOVkFMSURfQk9PTEVBTiwKLSAgICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlICVzOiB0aGUgdmFsdWUgJXMgaXMgbm90IGJvb2xlYW5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHhtbENoYXIgKikgbmFtZSwgdmFsKTsKKyAgICAgICAgeG1sU2NoZW1hUFNpbXBsZVR5cGVFcnIoY3R4dCwgCisJICAgIFhNTF9TQ0hFTUFQX0lOVkFMSURfQk9PTEVBTiwKKwkgICAgb3duZXJEZXMsIG93bmVySXRlbSwgbm9kZSwKKwkgICAgWE1MX1NDSEVNQVNfQk9PTEVBTiwgIigxIHwgMCB8IHRydWUgfCBmYWxzZSkiLCB2YWwsCisJICAgIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgIH0KICAgICByZXR1cm4gKGRlZik7CiB9CkBAIC0yMTE0LDEyICszNDAyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFQdHIgc2NoZW1hLCB4bWxOb2RlUHRyIG5vZGUpOwogCiAvKioKLSAqIHhtbFNjaGVtYVBhcnNlU2NoZW1hQXR0clZhbHVlOgorICogeG1sU2NoZW1hUFZhbEF0dHJOb2RlOgogICogCiAgKiBAY3R4dDogIGEgc2NoZW1hIHBhcnNlciBjb250ZXh0Ci0gKiBAYXR0cjogIHRoZSBzY2hlbWEgYXR0cmlidXRlIGJlaW5nIHZhbGlkYXRlZAotICogQHR5cGU6IHRoZSBidWlsdC1pbiB0eXBlIHRvIGJlIHZhbGlkYXRlZCBhZ2FpbnN0Ci0gKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQKKyAqIEBvd25lckRlczogdGhlIGRlc2lnbmF0aW9uIG9mIHRoZSBwYXJlbnQgZWxlbWVudAorICogQG93bmVySXRlbTogdGhlIHNjaGVtYSBvYmplY3Qgb3duZXIgaWYgZXhpc3RlbnQKKyAqIEBhdHRyOiAgdGhlIHNjaGVtYSBhdHRyaWJ1dGUgbm9kZSBiZWluZyB2YWxpZGF0ZWQKKyAqIEB2YWx1ZTogdGhlIHZhbHVlCisgKiBAdHlwZTogdGhlIGJ1aWx0LWluIHR5cGUgdG8gYmUgdmFsaWRhdGVkIGFnYWluc3QgCiAgKgogICogVmFsaWRhdGVzIGEgdmFsdWUgYWdhaW5zdCB0aGUgZ2l2ZW4gYnVpbHQtaW4gdHlwZS4KICAqIFRoaXMgb25lIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBmb3IgdmFsaWRhdGlvbgpAQCAtMjEyOSw4NSArMzQxOSwyMDIgQEAKICAqIG51bWJlciBvdGhlcndpc2UgYW5kIC0xIGluIGNhc2Ugb2YgYW4gaW50ZXJuYWwgb3IgQVBJIGVycm9yLgogICovCiBzdGF0aWMgaW50Ci14bWxTY2hlbWFQYXJzZVNjaGVtYUF0dHJWYWx1ZSh4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsCi0JCQkgIHhtbEF0dHJQdHIgYXR0ciwKLQkJCSAgeG1sU2NoZW1hVHlwZVB0ciB0eXBlKQoreG1sU2NoZW1hUFZhbEF0dHJOb2RlVmFsdWUoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LAorCQkJICAgeG1sQ2hhciAqKm93bmVyRGVzLAorCQkJICAgeG1sU2NoZW1hVHlwZVB0ciBvd25lckl0ZW0sCQkJICAgCisJCQkgICB4bWxBdHRyUHRyIGF0dHIsCisJCQkgICBjb25zdCB4bWxDaGFyICp2YWx1ZSwKKwkJCSAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZSkKIHsKLSAgICBjb25zdCB4bWxDaGFyICp2YWx1ZTsKLSAgICBpbnQgcmV0OyAgICAKICAgICAKKyAgICBpbnQgcmV0ID0gMDsgCisKKyAgICAvKgorICAgICogTk9URTogU2hvdWxkIHdlIG1vdmUgdGhpcyB0byB4bWxzY2hlbWF0eXBlcy5jPyBIbW0sIGJ1dCB0aGlzCisgICAgKiBvbmUgaXMgcmVhbGx5IG1lYW50IHRvIGJlIHVzZWQgaW50ZXJuYWxseSwgc28gYmV0dGVyIG5vdC4KKyAgICAqLyAgICAKICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHR5cGUgPT0gTlVMTCkgfHwgKGF0dHIgPT0gTlVMTCkpCisJcmV0dXJuICgtMSk7ICAgCisgICAgaWYgKHR5cGUtPnR5cGUgIT0gWE1MX1NDSEVNQV9UWVBFX0JBU0lDKSB7CisJeG1sU2NoZW1hUEVycihjdHh0LCAoeG1sTm9kZVB0cikgYXR0ciwgCisJICAgIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKKwkgICAgIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFQdmFsdWVBdHRyTm9kZSwgdGhlIGdpdmVuICIKKwkgICAgInR5cGUgJyVzJyBpcyBub3QgYSBidWlsdC1pbiB0eXBlLlxuIiwKKwkgICAgdHlwZS0+bmFtZSwgTlVMTCk7CiAJcmV0dXJuICgtMSk7Ci0gICAgdmFsdWUgPSB4bWxTY2hlbWFHZXROb2RlQ29udGVudChjdHh0LCAoeG1sTm9kZVB0cikgYXR0cik7CQorICAgIH0gICAgCiAgICAgc3dpdGNoICh0eXBlLT5idWlsdEluVHlwZSkgewogCWNhc2UgWE1MX1NDSEVNQVNfTkNOQU1FOgogCSAgICByZXQgPSB4bWxWYWxpZGF0ZU5DTmFtZSh2YWx1ZSwgMSk7CiAJICAgIGJyZWFrOwogCWNhc2UgWE1MX1NDSEVNQVNfUU5BTUU6Ci0JICAgIHJldCA9IHhtbFZhbGlkYXRlUU5hbWUodmFsdWUsIDEpOwotCSAgICBpZiAoKHJldCA9PSAwKSAmJiAoYXR0ciAhPSBOVUxMKSkgewotICAgICAgICAgICAgICAgIHhtbENoYXIgKmxvY2FsID0gTlVMTDsKLQkJeG1sQ2hhciAqcHJlZml4OwotCQkKLQkJbG9jYWwgPSB4bWxTcGxpdFFOYW1lMih2YWx1ZSwgJnByZWZpeCk7Ci0JCWlmIChwcmVmaXggIT0gTlVMTCkgewotCQkgICAgeG1sTnNQdHIgbnM7Ci0JCSAgICAKLQkJICAgIG5zID0geG1sU2VhcmNoTnMoYXR0ci0+ZG9jLCAoeG1sTm9kZVB0cikgYXR0ciwgcHJlZml4KTsKLQkJICAgIGlmIChucyA9PSBOVUxMKSB7Ci0JCQl4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyLCAKLQkJCSAgICBYTUxfU0NIRU1BUF9QUkVGSVhfVU5ERUZJTkVELAotCQkJICAgICJBdHRyaWJ1dGUgXCIlc1wiOiB0aGUgUU5hbWUgcHJlZml4ICIKLQkJCSAgICAiXCIlc1wiIGlzIHVuZGVmaW5lZC5cbiIsCi0JCQkgICAgYXR0ci0+bmFtZSwgcHJlZml4KTsKLQkJCXJldCA9IDE7Ci0JCSAgICB9Ci0JCX0KLQkJaWYgKGxvY2FsICE9IE5VTEwpCi0JCSAgICB4bWxGcmVlKGxvY2FsKTsKLQkJaWYgKHByZWZpeCAhPSBOVUxMKQotCQkgICAgeG1sRnJlZShwcmVmaXgpOworCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyLCAKKwkJWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAorCQkiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVB2YWx1ZUF0dHJOb2RlLCB1c2UgIgorCQkidGhlIGZ1bmN0aW9uIHhtbFNjaGVtYUV4dHJhY3RTY2hlbWFRTmFtZVByb3B2YWx1ZWlkYXRlZCAiCisJCSJmb3IgZXh0cmFjdGluZyBRTmFtZSB2YWx1ZXVlcyBpbnN0ZWFkLlxuIiwKKwkJTlVMTCwgTlVMTCk7CisJICAgIHJldHVybiAoLTEpOworCWNhc2UgWE1MX1NDSEVNQVNfQU5ZVVJJOgorCSAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworCQl4bWxVUklQdHIgdXJpID0geG1sUGFyc2VVUkkoKGNvbnN0IGNoYXIgKikgdmFsdWUpOworCQlpZiAodXJpID09IE5VTEwpCisJCSAgICByZXQgPSAxOworCQllbHNlCisJCSAgICB4bWxGcmVlVVJJKHVyaSk7CiAJICAgIH0KIAkgICAgYnJlYWs7CisJY2FzZSBYTUxfU0NIRU1BU19UT0tFTjogeworCSAgICBjb25zdCB4bWxDaGFyICpjdXIgPSB2YWx1ZTsKKworCQlpZiAoSVNfQkxBTktfQ0goKmN1cikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gMTsJCSAgICAgICAKKwkJfSBlbHNlIHdoaWxlICgqY3VyICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgqY3VyID09IDB4ZCkgfHwgKCpjdXIgPT0gMHhhKSB8fCAoKmN1ciA9PSAweDkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAxOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKmN1ciA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cisrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqY3VyID09IDApIHx8ICgqY3VyID09ICcgJykpIHsKKwkJCSAgICByZXQgPSAxOworCQkJICAgIGJyZWFrOworCQkJfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBYTUxfU0NIRU1BU19MQU5HVUFHRToKKwkgICAgaWYgKHhtbENoZWNrTGFuZ3VhZ2VJRCh2YWx1ZSkgIT0gMSkgCisJCXJldCA9IDE7CisJICAgIGJyZWFrOwogCWRlZmF1bHQ6IHsKIAkgICAgeG1sU2NoZW1hUEVycihjdHh0LCAoeG1sTm9kZVB0cikgYXR0ciwgCiAJCSAgICBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCi0JCSAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVBhcnNlU2NoZW1hQXR0clZhbHVlLCB2YWxpZGF0aW9uICIKLQkJICAgICJ1c2luZyB0aGlzIHR5cGUgaW4gbm90IGltcGxlbWVudGVkIHlldFwiJXNcIi5cbiIsCisJCSAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVB2YWx1ZUF0dHJOb2RlLCAiCisJCSAgICAidmFsdWVpZGF0aW9uIHVzaW5nIHRoZSB0eXBlICclcycgaXMgbm90IGltcGxlbWVudGVkICIKKwkJICAgICJ5ZXQuXG4iLAogCQkgICAgdHlwZS0+bmFtZSwgTlVMTCk7CiAJICAgIHJldHVybiAoLTEpOwogCX0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAocmV0ID4gMCkgeyAKLQlpZiAodHlwZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfTElTVCkgewotCSAgICB4bWxTY2hlbWFQRXJyRXh0KGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyLAkJCi0JCVhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMiwKLQkJTlVMTCwgTlVMTCwgTlVMTCwKLQkJIlRoZSBzY2hlbWEgYXR0cmlidXRlIFwiJXNcIiB3aXRoIHRoZSB2YWx1ZSBcIiVzXCIgaXMgbm90ICIKLQkJIm9mIGJ1aWx0LWluIGxpc3Qgc2ltcGxlIHR5cGUgXCIlc1wiLlxuIiwKLQkJYXR0ci0+bmFtZSwgdmFsdWUsIHR5cGUtPm5hbWUsIE5VTEwsIE5VTEwpOwotCX0gZWxzZSB7Ci0JICAgIGlmICh0eXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfQlVJTFRJTl9QUklNSVRJVkUpIHsKLQkJeG1sU2NoZW1hUEVyckV4dChjdHh0LCAoeG1sTm9kZVB0cikgYXR0ciwgCi0JCSAgICBYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzEsCi0JCSAgICBOVUxMLCBOVUxMLCBOVUxMLAotCQkgICAgIlRoZSBzY2hlbWEgYXR0cmlidXRlIFwiJXNcIiB3aXRoIHRoZSB2YWx1ZSBcIiVzXCIgaXMgbm90ICIKLQkJICAgICJvZiBidWlsdC1pbiBwcmltaXRpdmUgdHlwZSBcIiVzXCIuXG4iLAotCQkgICAgYXR0ci0+bmFtZSwgdmFsdWUsIHR5cGUtPm5hbWUsIE5VTEwsIE5VTEwpOwotCSAgICB9IGVsc2UgewotCQl4bWxTY2hlbWFQRXJyRXh0KGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyLCAKLQkJICAgIFhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMSwKLQkJICAgIE5VTEwsIE5VTEwsIE5VTEwsCi0JCSAgICAiVGhlIHNjaGVtYSBhdHRyaWJ1dGUgXCIlc1wiIHdpdGggdGhlIHZhbHVlIFwiJXNcIiBpcyBub3QgIgotCQkgICAgIm9mIGJ1aWx0LWluIGF0b21pYyBzaW1wbGUgdHlwZSBcIiVzXCIuXG4iLAotCQkgICAgYXR0ci0+bmFtZSwgdmFsdWUsIHR5cGUtPm5hbWUsIE5VTEwsIE5VTEwpOwotCSAgICB9Ci0JfQorICAgIH0gICAgICAgICAgICAgIAorICAgIC8qCisgICAgKiBUT0RPOiBTaG91bGQgd2UgdXNlIHRoZSBTNFMgZXJyb3IgY29kZXMgaW5zdGVhZD8KKyAgICAqLworICAgIGlmIChyZXQgPiAwKSB7IAkKKwlpZiAodHlwZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfTElTVCkgewkgICAKKwkgICAgeG1sU2NoZW1hUFNpbXBsZVR5cGVFcnIoY3R4dCwgCisJCVhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMiwgCisJCW93bmVyRGVzLCBvd25lckl0ZW0sICh4bWxOb2RlUHRyKSBhdHRyLCAKKwkJdHlwZS0+YnVpbHRJblR5cGUsIE5VTEwsIHZhbHVlLCAKKwkJTlVMTCwgTlVMTCwgTlVMTCk7CisJICAgIHJldHVybihYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzIpOworCX0gZWxzZSB7CSAgICAKKwkgICAgeG1sU2NoZW1hUFNpbXBsZVR5cGVFcnIoY3R4dCwgCisJCVhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMSwgCisJCW93bmVyRGVzLCBvd25lckl0ZW0sICh4bWxOb2RlUHRyKSBhdHRyLCAKKwkJdHlwZS0+YnVpbHRJblR5cGUsIE5VTEwsIHZhbHVlLCAKKwkJTlVMTCwgTlVMTCwgTlVMTCk7CisJICAgIHJldHVybihYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzEpOworCX0JCiAgICAgfSAgICAKICAgICByZXR1cm4gKHJldCk7CiB9CiAKIC8qKgorICogeG1sU2NoZW1hUFZhbEF0dHJOb2RlOgorICogCisgKiBAY3R4dDogIGEgc2NoZW1hIHBhcnNlciBjb250ZXh0CisgKiBAb3duZXJEZXM6IHRoZSBkZXNpZ25hdGlvbiBvZiB0aGUgcGFyZW50IGVsZW1lbnQKKyAqIEBvd25lckl0ZW06IHRoZSBzY2hlbWEgb2JqZWN0IG93bmVyIGlmIGV4aXN0ZW50CisgKiBAYXR0cjogIHRoZSBzY2hlbWEgYXR0cmlidXRlIG5vZGUgYmVpbmcgdmFsaWRhdGVkCisgKiBAdHlwZTogdGhlIGJ1aWx0LWluIHR5cGUgdG8gYmUgdmFsaWRhdGVkIGFnYWluc3QKKyAqIEB2YWx1ZTogdGhlIHJlc3VsdGluZyB2YWx1ZSBpZiBhbnkKKyAqCisgKiBFeHRyYWN0cyBhbmQgdmFsaWRhdGVzIGEgdmFsdWUgYWdhaW5zdCB0aGUgZ2l2ZW4gYnVpbHQtaW4gdHlwZS4KKyAqIFRoaXMgb25lIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBmb3IgdmFsaWRhdGlvbgorICogb2Ygc2NoZW1hIGF0dHJpYnV0ZSB2YWx1ZXMgZHVyaW5nIHBhcnNpbmcgb2YgdGhlIHNjaGVtYS4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIHZhbHVlIGlzIHZhbGlkLCBhIHBvc2l0aXZlIGVycm9yIGNvZGUKKyAqIG51bWJlciBvdGhlcndpc2UgYW5kIC0xIGluIGNhc2Ugb2YgYW4gaW50ZXJuYWwgb3IgQVBJIGVycm9yLgorICovCitzdGF0aWMgaW50Cit4bWxTY2hlbWFQVmFsQXR0ck5vZGUoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LAorCQkJICAgeG1sQ2hhciAqKm93bmVyRGVzLAorCQkJICAgeG1sU2NoZW1hVHlwZVB0ciBvd25lckl0ZW0sCQkJICAgCisJCQkgICB4bWxBdHRyUHRyIGF0dHIsCQkJICAgCisJCQkgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGUsCisJCQkgICBjb25zdCB4bWxDaGFyICoqdmFsdWUpCit7ICAgIAorICAgIGNvbnN0IHhtbENoYXIgKnZhbDsKKworICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAodHlwZSA9PSBOVUxMKSB8fCAoYXR0ciA9PSBOVUxMKSkKKwlyZXR1cm4gKC0xKTsgICAKKyAgICAgICAKKyAgICB2YWwgPSB4bWxTY2hlbWFHZXROb2RlQ29udGVudChjdHh0LCAoeG1sTm9kZVB0cikgYXR0cik7CisgICAgaWYgKHZhbHVlICE9IE5VTEwpCisJKnZhbHVlID0gdmFsOworCisgICAgcmV0dXJuICh4bWxTY2hlbWFQVmFsQXR0ck5vZGVWYWx1ZShjdHh0LCBvd25lckRlcywgb3duZXJJdGVtLCBhdHRyLAorCXZhbCwgdHlwZSkpOyAgICAKK30KKworLyoqCisgKiB4bWxTY2hlbWFQVmFsQXR0cjoKKyAqIAorICogQGN0eHQ6ICBhIHNjaGVtYSBwYXJzZXIgY29udGV4dAorICogQG5vZGU6IHRoZSBlbGVtZW50IG5vZGUgb2YgdGhlIGF0dHJpYnV0ZQorICogQG93bmVyRGVzOiB0aGUgZGVzaWduYXRpb24gb2YgdGhlIHBhcmVudCBlbGVtZW50CisgKiBAb3duZXJJdGVtOiB0aGUgc2NoZW1hIG9iamVjdCBvd25lciBpZiBleGlzdGVudAorICogQG93bmVyRWxlbTogdGhlIG93bmVyIGVsZW1lbnQgbm9kZQorICogQG5hbWU6ICB0aGUgbmFtZSBvZiB0aGUgc2NoZW1hIGF0dHJpYnV0ZSBub2RlCisgKiBAdHlwZTogdGhlIGJ1aWx0LWluIHR5cGUgdG8gYmUgdmFsaWRhdGVkIGFnYWluc3QKKyAqIEB2YWx1ZTogdGhlIHJlc3VsdGluZyB2YWx1ZSBpZiBhbnkKKyAqCisgKiBFeHRyYWN0cyBhbmQgdmFsaWRhdGVzIGEgdmFsdWUgYWdhaW5zdCB0aGUgZ2l2ZW4gYnVpbHQtaW4gdHlwZS4KKyAqIFRoaXMgb25lIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBmb3IgdmFsaWRhdGlvbgorICogb2Ygc2NoZW1hIGF0dHJpYnV0ZSB2YWx1ZXMgZHVyaW5nIHBhcnNpbmcgb2YgdGhlIHNjaGVtYS4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIHZhbHVlIGlzIHZhbGlkLCBhIHBvc2l0aXZlIGVycm9yIGNvZGUKKyAqIG51bWJlciBvdGhlcndpc2UgYW5kIC0xIGluIGNhc2Ugb2YgYW4gaW50ZXJuYWwgb3IgQVBJIGVycm9yLgorICovCitzdGF0aWMgaW50Cit4bWxTY2hlbWFQVmFsQXR0cih4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsCQkgICAgICAgCisJCSAgICAgICB4bWxDaGFyICoqb3duZXJEZXMsCisJCSAgICAgICB4bWxTY2hlbWFUeXBlUHRyIG93bmVySXRlbSwKKwkJICAgICAgIHhtbE5vZGVQdHIgb3duZXJFbGVtLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZSwKKwkJICAgICAgIGNvbnN0IHhtbENoYXIgKip2YWx1ZSkKK3sKKyAgICB4bWxBdHRyUHRyIGF0dHI7CisKKyAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHR5cGUgPT0gTlVMTCkpIHsKKwlpZiAodmFsdWUgIT0gTlVMTCkKKwkgICAgKnZhbHVlID0gTlVMTDsKKwlyZXR1cm4gKC0xKTsgICAKKyAgICB9CisgICAgaWYgKHR5cGUtPnR5cGUgIT0gWE1MX1NDSEVNQV9UWVBFX0JBU0lDKSB7CisJaWYgKHZhbHVlICE9IE5VTEwpCisJICAgICp2YWx1ZSA9IE5VTEw7CisJeG1sU2NoZW1hUEVycihjdHh0LCBvd25lckVsZW0sIAorCSAgICBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCisJICAgICJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hUFZhbEF0dHIsIHRoZSBnaXZlbiAiCisJICAgICJ0eXBlICclcycgaXMgbm90IGEgYnVpbHQtaW4gdHlwZS5cbiIsCisJICAgIHR5cGUtPm5hbWUsIE5VTEwpOworCXJldHVybiAoLTEpOworICAgIH0KKyAgICBhdHRyID0geG1sU2NoZW1hR2V0UHJvcE5vZGUob3duZXJFbGVtLCBuYW1lKTsKKyAgICBpZiAoYXR0ciA9PSBOVUxMKSB7CisJaWYgKHZhbHVlICE9IE5VTEwpCisJICAgICp2YWx1ZSA9IE5VTEw7CisJcmV0dXJuICgwKTsKKyAgICB9ICAgIAorICAgIHJldHVybiAoeG1sU2NoZW1hUFZhbEF0dHJOb2RlKGN0eHQsIG93bmVyRGVzLCBvd25lckl0ZW0sIGF0dHIsIAorCXR5cGUsIHZhbHVlKSk7Cit9CisvKioKICAqIHhtbFNjaGVtYVBhcnNlQXR0ckRlY2xzOgogICogQGN0eHQ6ICBhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKICAqIEBzY2hlbWE6ICB0aGUgc2NoZW1hIGJlaW5nIGJ1aWx0CkBAIC0yMjgwLDExICszNjg3LDEwOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgbm9kZSkKIHsKICAgICB4bWxTY2hlbWFBbm5vdFB0ciByZXQ7CisgICAgeG1sTm9kZVB0ciBjaGlsZCA9IE5VTEw7CisgICAgeG1sQXR0clB0ciBhdHRyOworICAgIGludCBiYXJrZWQgPSAwOwogCisgICAgLyoKKyAgICAqIElORk86IFM0UyBjb21wbGV0ZWQuCisgICAgKi8KKyAgICAvKgorICAgICogaWQgPSBJRAorICAgICoge2FueSBhdHRyaWJ1dGVzIHdpdGggbm9uLXNjaGVtYSBuYW1lc3BhY2UgLiAuIC59PgorICAgICogQ29udGVudDogKGFwcGluZm8gfCBkb2N1bWVudGF0aW9uKSoKKyAgICAqLwogICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoc2NoZW1hID09IE5VTEwpIHx8IChub2RlID09IE5VTEwpKQogICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgIHJldCA9IHhtbFNjaGVtYU5ld0Fubm90KGN0eHQsIG5vZGUpOworICAgIGF0dHIgPSBub2RlLT5wcm9wZXJ0aWVzOworICAgIHdoaWxlIChhdHRyICE9IE5VTEwpIHsKKwlpZiAoKChhdHRyLT5ucyA9PSBOVUxMKSAmJiAKKwkgICAgKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAiaWQiKSkpIHx8CisJICAgICgoYXR0ci0+bnMgIT0gTlVMTCkgJiYgCisJICAgIHhtbFN0ckVxdWFsKGF0dHItPm5zLT5ocmVmLCB4bWxTY2hlbWFOcykpKSB7CisJICAgIAorCSAgICB4bWxTY2hlbWFQSWxsZWdhbEF0dHJFcnIoY3R4dCwgCisJCVhNTF9TQ0hFTUFQX1M0U19BVFRSX05PVF9BTExPV0VELAorCQlOVUxMLCBOVUxMLCBhdHRyKTsKKwl9CisJYXR0ciA9IGF0dHItPm5leHQ7CisgICAgfQorICAgIC8qIFRPRE86IENoZWNrIGlkLiAqLyAgICAKKyAgICAKKyAgICAvKgorICAgICogQW5kIG5vdyBmb3IgdGhlIGNoaWxkcmVuLi4uCisgICAgKi8KKyAgICBjaGlsZCA9IG5vZGUtPmNoaWxkcmVuOworICAgIHdoaWxlIChjaGlsZCAhPSBOVUxMKSB7CisJaWYgKElTX1NDSEVNQShjaGlsZCwgImFwcGluZm8iKSkgeworCSAgICAvKiBUT0RPOiBtYWtlIGF2YWlsYWJsZSB0aGUgY29udGVudCBvZiAiYXBwaW5mbyIuICovCisJICAgIC8qIAorCSAgICAqIHNvdXJjZSA9IGFueVVSSQorCSAgICAqIHthbnkgYXR0cmlidXRlcyB3aXRoIG5vbi1zY2hlbWEgbmFtZXNwYWNlIC4gLiAufT4KKwkgICAgKiBDb250ZW50OiAoe2FueX0pKgorCSAgICAqLworCSAgICBhdHRyID0gY2hpbGQtPnByb3BlcnRpZXM7CisJICAgIHdoaWxlIChhdHRyICE9IE5VTEwpIHsKKwkJaWYgKCgoYXR0ci0+bnMgPT0gTlVMTCkgJiYgCisJCSAgICAgKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAic291cmNlIikpKSB8fAorCQkgICAgICgoYXR0ci0+bnMgIT0gTlVMTCkgJiYgCisJCSAgICAgIHhtbFN0ckVxdWFsKGF0dHItPm5zLT5ocmVmLCB4bWxTY2hlbWFOcykpKSB7CiAKKwkJICAgIHhtbFNjaGVtYVBJbGxlZ2FsQXR0ckVycihjdHh0LCAKKwkJCVhNTF9TQ0hFTUFQX1M0U19BVFRSX05PVF9BTExPV0VELAorCQkJTlVMTCwgTlVMTCwgYXR0cik7CisJCX0KKwkJYXR0ciA9IGF0dHItPm5leHQ7CisJICAgIH0KKwkgICAgeG1sU2NoZW1hUFZhbEF0dHIoY3R4dCwgTlVMTCwgTlVMTCwgY2hpbGQsICJzb3VyY2UiLCAKKwkJeG1sU2NoZW1hR2V0QnVpbHRJblR5cGUoWE1MX1NDSEVNQVNfQU5ZVVJJKSwgTlVMTCk7CSAgICAKKwkgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKKwl9IGVsc2UgaWYgKElTX1NDSEVNQShjaGlsZCwgImRvY3VtZW50YXRpb24iKSkgeworCSAgICAvKiBUT0RPOiBtYWtlIGF2YWlsYWJsZSB0aGUgY29udGVudCBvZiAiZG9jdW1lbnRhdGlvbiIuICovCisJICAgIC8qCisJICAgICogc291cmNlID0gYW55VVJJCisJICAgICoge2FueSBhdHRyaWJ1dGVzIHdpdGggbm9uLXNjaGVtYSBuYW1lc3BhY2UgLiAuIC59PgorCSAgICAqIENvbnRlbnQ6ICh7YW55fSkqCisJICAgICovCisJICAgIGF0dHIgPSBjaGlsZC0+cHJvcGVydGllczsKKwkgICAgd2hpbGUgKGF0dHIgIT0gTlVMTCkgeworCQlpZiAoYXR0ci0+bnMgPT0gTlVMTCkgeworCQkgICAgaWYgKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAic291cmNlIikpIHsKKwkJCXhtbFNjaGVtYVBJbGxlZ2FsQXR0ckVycihjdHh0LCAKKwkJCSAgICBYTUxfU0NIRU1BUF9TNFNfQVRUUl9OT1RfQUxMT1dFRCwKKwkJCSAgICBOVUxMLCBOVUxMLCBhdHRyKTsKKwkJICAgIH0KKwkJfSBlbHNlIHsKKwkJICAgIGlmICh4bWxTdHJFcXVhbChhdHRyLT5ucy0+aHJlZiwgeG1sU2NoZW1hTnMpIHx8CisJCQkoeG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgImxhbmciKSAmJgorCQkJKCF4bWxTdHJFcXVhbChhdHRyLT5ucy0+aHJlZiwgWE1MX1hNTF9OQU1FU1BBQ0UpKSkpIHsKKwkJCQorCQkJeG1sU2NoZW1hUElsbGVnYWxBdHRyRXJyKGN0eHQsIAorCQkJICAgIFhNTF9TQ0hFTUFQX1M0U19BVFRSX05PVF9BTExPV0VELAorCQkJICAgIE5VTEwsIE5VTEwsIGF0dHIpOworCQkgICAgfQorCQl9CisJCWF0dHIgPSBhdHRyLT5uZXh0OworCSAgICB9CisJICAgIC8qCisJICAgICogQXR0cmlidXRlICJ4bWw6bGFuZyIuCisJICAgICovCisJICAgIGF0dHIgPSB4bWxTY2hlbWFHZXRQcm9wTm9kZU5zKGNoaWxkLCAoY29uc3QgY2hhciAqKSBYTUxfWE1MX05BTUVTUEFDRSwgImxhbmciKTsKKwkgICAgaWYgKGF0dHIgIT0gTlVMTCkKKwkJeG1sU2NoZW1hUFZhbEF0dHJOb2RlKGN0eHQsIE5VTEwsIE5VTEwsIGF0dHIsCisJCXhtbFNjaGVtYUdldEJ1aWx0SW5UeXBlKFhNTF9TQ0hFTUFTX0xBTkdVQUdFKSwgTlVMTCk7CSAgICAKKwkgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKKwl9IGVsc2UgeworCSAgICBpZiAoIWJhcmtlZCkKKwkJeG1sU2NoZW1hUENvbnRlbnRFcnIoY3R4dCwgCisJCSAgICBYTUxfU0NIRU1BUF9TNFNfRUxFTV9OT1RfQUxMT1dFRCwgCisJCSAgICBOVUxMLCBOVUxMLCBub2RlLCBjaGlsZCwgTlVMTCwgIihhcHBpbmZvIHwgZG9jdW1lbnRhdGlvbikqIik7CisJICAgIGJhcmtlZCA9IDE7CisJICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CisJfQorICAgIH0KKyAgICAKICAgICByZXR1cm4gKHJldCk7CiB9CiAKQEAgLTIzODEsNiArMzg4NiwxMjggQEAKIH0KIAogLyoqCisgKiB4bWxTY2hlbWFQYXJzZVdpbGRjYXJkTnM6CisgKiBAY3R4dDogIGEgc2NoZW1hIHBhcnNlciBjb250ZXh0CisgKiBAd2lsZGM6ICB0aGUgd2lsZGNhcmQsIGFscmVhZHkgY3JlYXRlZAorICogQG5vZGU6ICBhIHN1YnRyZWUgY29udGFpbmluZyBYTUwgU2NoZW1hIGluZm9ybWF0aW9ucworICoKKyAqIFBhcnNlcyB0aGUgYXR0cmlidXRlICJwcm9jZXNzQ29udGVudHMiIGFuZCAibmFtZXNwYWNlIgorICogb2YgYSB4c2Q6YW55QXR0cmlidXRlIGFuZCB4c2Q6YW55LgorICogKldBUk5JTkcqIHRoaXMgaW50ZXJmYWNlIGlzIGhpZ2hseSBzdWJqZWN0IHRvIGNoYW5nZQorICoKKyAqIFJldHVybnMgMCBpZiBldmVyeXRoaW5nIGdvZXMgZmluZSwgYSBwb3NpdGl2ZSBlcnJvciBjb2RlCisgKiBpZiBzb21ldGhpbmcgaXMgbm90IHZhbGlkIGFuZCAtMSBpZiBhbiBpbnRlcm5hbCBlcnJvciBvY2N1cnMuCisgKi8KK3N0YXRpYyBpbnQKK3htbFNjaGVtYVBhcnNlV2lsZGNhcmROcyh4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsCisJCQkgeG1sU2NoZW1hUHRyIHNjaGVtYSwKKwkJCSB4bWxTY2hlbWFXaWxkY2FyZFB0ciB3aWxkYywKKwkJCSB4bWxOb2RlUHRyIG5vZGUpCit7CisgICAgY29uc3QgeG1sQ2hhciAqcGMsICpucywgKmRpY3Ruc0l0ZW07CisgICAgaW50IHJldCA9IDA7CisgICAgeG1sQ2hhciAqbnNJdGVtOworICAgIHhtbFNjaGVtYVdpbGRjYXJkTnNQdHIgdG1wLCBsYXN0TnMgPSBOVUxMOworICAgIHhtbEF0dHJQdHIgYXR0cjsKKyAgICAKKyAgICBwYyA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgInByb2Nlc3NDb250ZW50cyIpOworICAgIGlmICgocGMgPT0gTlVMTCkKKyAgICAgICAgfHwgKHhtbFN0ckVxdWFsKHBjLCAoY29uc3QgeG1sQ2hhciAqKSAic3RyaWN0IikpKSB7CisgICAgICAgIHdpbGRjLT5wcm9jZXNzQ29udGVudHMgPSBYTUxfU0NIRU1BU19BTllfU1RSSUNUOworICAgIH0gZWxzZSBpZiAoeG1sU3RyRXF1YWwocGMsIChjb25zdCB4bWxDaGFyICopICJza2lwIikpIHsKKyAgICAgICAgd2lsZGMtPnByb2Nlc3NDb250ZW50cyA9IFhNTF9TQ0hFTUFTX0FOWV9TS0lQOworICAgIH0gZWxzZSBpZiAoeG1sU3RyRXF1YWwocGMsIChjb25zdCB4bWxDaGFyICopICJsYXgiKSkgeworICAgICAgICB3aWxkYy0+cHJvY2Vzc0NvbnRlbnRzID0gWE1MX1NDSEVNQVNfQU5ZX0xBWDsKKyAgICB9IGVsc2UgeworICAgICAgICB4bWxTY2hlbWFQU2ltcGxlVHlwZUVycihjdHh0LCAKKwkgICAgWE1MX1NDSEVNQVBfVU5LTk9XTl9QUk9DRVNTQ09OVEVOVF9DSElMRCwKKwkgICAgTlVMTCwgTlVMTCwgbm9kZSwKKwkgICAgWE1MX1NDSEVNQVNfVU5LTk9XTiwgIihzdHJpY3QgfCBza2lwIHwgbGF4KSIsIHBjLCAKKwkgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHdpbGRjLT5wcm9jZXNzQ29udGVudHMgPSBYTUxfU0NIRU1BU19BTllfU1RSSUNUOworCXJldCA9IFhNTF9TQ0hFTUFQX1VOS05PV05fUFJPQ0VTU0NPTlRFTlRfQ0hJTEQ7CisgICAgfQorICAgIC8qCisgICAgICogQnVpbGQgdGhlIG5hbWVzcGFjZSBjb25zdHJhaW50cy4KKyAgICAgKi8KKyAgICBhdHRyID0geG1sU2NoZW1hR2V0UHJvcE5vZGUobm9kZSwgIm5hbWVzcGFjZSIpOworICAgIG5zID0geG1sU2NoZW1hR2V0Tm9kZUNvbnRlbnQoY3R4dCwgKHhtbE5vZGVQdHIpIGF0dHIpOworICAgIGlmICgobnMgPT0gTlVMTCkgfHwgKHhtbFN0ckVxdWFsKG5zLCBCQURfQ0FTVCAiIyNhbnkiKSkpCisJd2lsZGMtPmFueSA9IDE7CisgICAgZWxzZSBpZiAoeG1sU3RyRXF1YWwobnMsIEJBRF9DQVNUICIjI290aGVyIikpIHsKKwl3aWxkYy0+bmVnTnNTZXQgPSB4bWxTY2hlbWFOZXdXaWxkY2FyZE5zQ29uc3RyYWludChjdHh0KTsKKwlpZiAod2lsZGMtPm5lZ05zU2V0ID09IE5VTEwpIHsJICAgIAkgICAgCisJICAgIHJldHVybiAoLTEpOworCX0KKwl3aWxkYy0+bmVnTnNTZXQtPnZhbHVlID0gc2NoZW1hLT50YXJnZXROYW1lc3BhY2U7IAorICAgIH0gZWxzZSB7ICAgIAorCWNvbnN0IHhtbENoYXIgKmVuZCwgKmN1cjsKKworCWN1ciA9IG5zOworCWRvIHsKKwkgICAgd2hpbGUgKElTX0JMQU5LX0NIKCpjdXIpKQorCQljdXIrKzsKKwkgICAgZW5kID0gY3VyOworCSAgICB3aGlsZSAoKCplbmQgIT0gMCkgJiYgKCEoSVNfQkxBTktfQ0goKmVuZCkpKSkKKwkJZW5kKys7CisJICAgIGlmIChlbmQgPT0gY3VyKQorCQlicmVhazsKKwkgICAgbnNJdGVtID0geG1sU3RybmR1cChjdXIsIGVuZCAtIGN1cik7ICAgIAkgICAgCisJICAgIGlmICgoeG1sU3RyRXF1YWwobnNJdGVtLCBCQURfQ0FTVCAiIyNvdGhlciIpKSB8fAorCQkgICAgKHhtbFN0ckVxdWFsKG5zSXRlbSwgQkFEX0NBU1QgIiMjYW55IikpKSB7CisJCXhtbFNjaGVtYVBTaW1wbGVUeXBlRXJyKGN0eHQsIAorCQkgICAgWE1MX1NDSEVNQVBfV0lMRENBUkRfSU5WQUxJRF9OU19NRU1CRVIsCisJCSAgICBOVUxMLCBOVUxMLCAoeG1sTm9kZVB0cikgYXR0ciwKKwkJICAgIFhNTF9TQ0hFTUFTX1VOS05PV04sIAorCQkgICAgIigoIyNhbnkgfCAjI290aGVyKSB8IExpc3Qgb2YgKGFueVVSSSB8ICIKKwkJICAgICIoIyN0YXJnZXROYW1lc3BhY2UgfCAjI2xvY2FsKSkpIiwgCisJCSAgICBuc0l0ZW0sIE5VTEwsIE5VTEwsIE5VTEwpOworCQlyZXQgPSBYTUxfU0NIRU1BUF9XSUxEQ0FSRF9JTlZBTElEX05TX01FTUJFUjsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKHhtbFN0ckVxdWFsKG5zSXRlbSwgQkFEX0NBU1QgIiMjdGFyZ2V0TmFtZXNwYWNlIikpIHsKKwkJICAgIGRpY3Ruc0l0ZW0gPSBzY2hlbWEtPnRhcmdldE5hbWVzcGFjZTsKKwkJfSBlbHNlIGlmICh4bWxTdHJFcXVhbChuc0l0ZW0sIEJBRF9DQVNUICIjI2xvY2FsIikpIHsKKwkJICAgIGRpY3Ruc0l0ZW0gPSBOVUxMOworCQl9IGVsc2UgeworCQkgICAgLyoKKwkJICAgICogVmFsaWRhdGUgdGhlIGl0ZW0gKGFueVVSSSkuCisJCSAgICAqLworCQkgICAgeG1sU2NoZW1hUFZhbEF0dHJOb2RlVmFsdWUoY3R4dCwgTlVMTCwgTlVMTCwgYXR0ciwgCisJCQluc0l0ZW0sIHhtbFNjaGVtYUdldEJ1aWx0SW5UeXBlKFhNTF9TQ0hFTUFTX0FOWVVSSSkpOworCQkgICAgZGljdG5zSXRlbSA9IHhtbERpY3RMb29rdXAoY3R4dC0+ZGljdCwgbnNJdGVtLCAtMSk7CisJCX0KKwkJLyoKKwkJKiBBdm9pZCBkdWJsaWNhdGUgbmFtZXNwYWNlcy4KKwkJKi8KKwkJdG1wID0gd2lsZGMtPm5zU2V0OworCQl3aGlsZSAodG1wICE9IE5VTEwpIHsKKwkJICAgIGlmIChkaWN0bnNJdGVtID09IHRtcC0+dmFsdWUpCisJCQlicmVhazsKKwkJICAgIHRtcCA9IHRtcC0+bmV4dDsKKwkJfQorCQlpZiAodG1wID09IE5VTEwpIHsKKwkJICAgIHRtcCA9IHhtbFNjaGVtYU5ld1dpbGRjYXJkTnNDb25zdHJhaW50KGN0eHQpOworCQkgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisJCQl4bWxGcmVlKG5zSXRlbSk7CQkJCisJCQlyZXR1cm4gKC0xKTsKKwkJICAgIH0KKwkJICAgIHRtcC0+dmFsdWUgPSBkaWN0bnNJdGVtOworCQkgICAgdG1wLT5uZXh0ID0gTlVMTDsKKwkJICAgIGlmICh3aWxkYy0+bnNTZXQgPT0gTlVMTCkgCisJCQl3aWxkYy0+bnNTZXQgPSB0bXA7CisJCSAgICBlbHNlCisJCQlsYXN0TnMtPm5leHQgPSB0bXA7CisJCSAgICBsYXN0TnMgPSB0bXA7CisJCX0KKworCSAgICB9CQorCSAgICB4bWxGcmVlKG5zSXRlbSk7CisJICAgIGN1ciA9IGVuZDsKKwl9IHdoaWxlICgqY3VyICE9IDApOyAgICAKKyAgICB9CisgICAgcmV0dXJuIChyZXQpOworfQorLyoqCiAgKiB4bWxTY2hlbWFQYXJzZUFueToKICAqIEBjdHh0OiAgYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0CiAgKiBAc2NoZW1hOiAgdGhlIHNjaGVtYSBiZWluZyBidWlsdApAQCAtMjM5OCw2ICs0MDI1LDcgQEAKICAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7CiAgICAgeG1sTm9kZVB0ciBjaGlsZCA9IE5VTEw7CiAgICAgeG1sQ2hhciBuYW1lWzMwXTsKKyAgICB4bWxTY2hlbWFXaWxkY2FyZFB0ciB3aWxkYzsKIAogICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoc2NoZW1hID09IE5VTEwpIHx8IChub2RlID09IE5VTEwpKQogICAgICAgICByZXR1cm4gKE5VTEwpOwpAQCAtMjQwNywxMCArNDAzNSwxNiBAQAogICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgIHR5cGUtPm5vZGUgPSBub2RlOwogICAgIHR5cGUtPnR5cGUgPSBYTUxfU0NIRU1BX1RZUEVfQU5ZOwotICAgIGNoaWxkID0gbm9kZS0+Y2hpbGRyZW47CiAgICAgdHlwZS0+bWluT2NjdXJzID0geG1sR2V0TWluT2NjdXJzKGN0eHQsIG5vZGUpOwogICAgIHR5cGUtPm1heE9jY3VycyA9IHhtbEdldE1heE9jY3VycyhjdHh0LCBub2RlKTsKLQorICAgIHdpbGRjID0geG1sU2NoZW1hQWRkV2lsZGNhcmQoY3R4dCk7CisgICAgLyoKKyAgICAqIFRoaXMgaXMgbm90IG5pY2UsIHNpbmNlIGl0IGlzIHdvbid0IGJlIHVzZWQgYXMgYSBhdHRyaWJ1dGUgd2lsZGNhcmQsCisgICAgKiBidXQgYmV0dGVyIHRoYW4gYWRkaW5nIGEgZmllbGQgdG8gdGhlIHN0cnVjdHVyZS4KKyAgICAqLworICAgIHR5cGUtPmF0dHJpYnV0ZVdpbGRjYXJkID0gd2lsZGM7CisgICAgeG1sU2NoZW1hUGFyc2VXaWxkY2FyZE5zKGN0eHQsIHNjaGVtYSwgd2lsZGMsIG5vZGUpOworICAgIGNoaWxkID0gbm9kZS0+Y2hpbGRyZW47ICAgIAogICAgIGlmIChJU19TQ0hFTUEoY2hpbGQsICJhbm5vdGF0aW9uIikpIHsKICAgICAgICAgdHlwZS0+YW5ub3QgPSB4bWxTY2hlbWFQYXJzZUFubm90YXRpb24oY3R4dCwgc2NoZW1hLCBjaGlsZCk7CiAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CkBAIC0yNDg0LDEwICs0MTE4LDcgQEAKIHhtbFNjaGVtYVBhcnNlQW55QXR0cmlidXRlKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVB0ciBzY2hlbWEsIHhtbE5vZGVQdHIgbm9kZSkKIHsKLSAgICBjb25zdCB4bWxDaGFyICpwcm9jZXNzQ29udGVudHMsICpuc0NvbnN0cmFpbnQsICplbmQsICpjdXIsICpkaWN0TWVtYmVyOwotICAgIHhtbENoYXIgKm1lbWJlcjsKICAgICB4bWxTY2hlbWFXaWxkY2FyZFB0ciByZXQ7Ci0gICAgeG1sU2NoZW1hV2lsZGNhcmROc1B0ciB0bXAsIGxhc3ROcyA9IE5VTEw7CiAgICAgeG1sTm9kZVB0ciBjaGlsZCA9IE5VTEw7CiAKICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHNjaGVtYSA9PSBOVUxMKSB8fCAobm9kZSA9PSBOVUxMKSkKQEAgLTI0OTksMTAzICs0MTMwLDIxIEBACiAgICAgfQogICAgIHJldC0+dHlwZSA9IFhNTF9TQ0hFTUFfVFlQRV9BTllfQVRUUklCVVRFOwogICAgIHJldC0+aWQgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJpZCIpOwotICAgIHByb2Nlc3NDb250ZW50cyA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgInByb2Nlc3NDb250ZW50cyIpOwotICAgIGlmICgocHJvY2Vzc0NvbnRlbnRzID09IE5VTEwpCi0gICAgICAgIHx8ICh4bWxTdHJFcXVhbChwcm9jZXNzQ29udGVudHMsIChjb25zdCB4bWxDaGFyICopICJzdHJpY3QiKSkpIHsKLSAgICAgICAgcmV0LT5wcm9jZXNzQ29udGVudHMgPSBYTUxfU0NIRU1BU19BTllfU1RSSUNUOwotICAgIH0gZWxzZSBpZiAoeG1sU3RyRXF1YWwocHJvY2Vzc0NvbnRlbnRzLCAoY29uc3QgeG1sQ2hhciAqKSAic2tpcCIpKSB7Ci0gICAgICAgIHJldC0+cHJvY2Vzc0NvbnRlbnRzID0gWE1MX1NDSEVNQVNfQU5ZX1NLSVA7Ci0gICAgfSBlbHNlIGlmICh4bWxTdHJFcXVhbChwcm9jZXNzQ29udGVudHMsIChjb25zdCB4bWxDaGFyICopICJsYXgiKSkgewotICAgICAgICByZXQtPnByb2Nlc3NDb250ZW50cyA9IFhNTF9TQ0hFTUFTX0FOWV9MQVg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBub2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgWE1MX1NDSEVNQVBfVU5LTk9XTl9QUk9DRVNTQ09OVEVOVF9DSElMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgImFueUF0dHJpYnV0ZSBoYXMgdW5leHBlY3RlZCBjb250ZW50ICIKLQkJICAgICAgICJmb3IgcHJvY2Vzc0NvbnRlbnRzOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzLCBOVUxMKTsKLSAgICAgICAgcmV0LT5wcm9jZXNzQ29udGVudHMgPSBYTUxfU0NIRU1BU19BTllfU1RSSUNUOwotICAgIH0KLSAgICAvKgotICAgICAqIEJ1aWxkIHRoZSBuYW1lc3BhY2UgY29uc3RyYWludHMuCi0gICAgICovCi0gICAgbnNDb25zdHJhaW50ID0geG1sU2NoZW1hR2V0UHJvcChjdHh0LCBub2RlLCAibmFtZXNwYWNlIik7Ci0gICAgaWYgKChuc0NvbnN0cmFpbnQgPT0gTlVMTCkgfHwgKHhtbFN0ckVxdWFsKG5zQ29uc3RyYWludCwgQkFEX0NBU1QgIiMjYW55IikpKQotCXJldC0+YW55ID0gMTsKLSAgICBlbHNlIGlmICh4bWxTdHJFcXVhbChuc0NvbnN0cmFpbnQsIEJBRF9DQVNUICIjI290aGVyIikpIHsKLQlyZXQtPm5lZ05zU2V0ID0geG1sU2NoZW1hTmV3V2lsZGNhcmROc0NvbnN0cmFpbnQoY3R4dCk7Ci0JaWYgKHJldC0+bmVnTnNTZXQgPT0gTlVMTCkgewkgICAgCi0JICAgIHhtbFNjaGVtYUZyZWVXaWxkY2FyZChyZXQpOwotCSAgICByZXR1cm4gKE5VTEwpOwotCX0KLQlyZXQtPm5lZ05zU2V0LT52YWx1ZSA9IHNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlOyAKLSAgICB9IGVsc2UgeyAgICAKLQljdXIgPSBuc0NvbnN0cmFpbnQ7Ci0JZG8gewotCSAgICB3aGlsZSAoSVNfQkxBTktfQ0goKmN1cikpCi0JCWN1cisrOwotCSAgICBlbmQgPSBjdXI7Ci0JICAgIHdoaWxlICgoKmVuZCAhPSAwKSAmJiAoIShJU19CTEFOS19DSCgqZW5kKSkpKQotCQllbmQrKzsKLQkgICAgaWYgKGVuZCA9PSBjdXIpCi0JCWJyZWFrOwotCSAgICBtZW1iZXIgPSB4bWxTdHJuZHVwKGN1ciwgZW5kIC0gY3VyKTsgICAgCSAgICAKLQkgICAgaWYgKCh4bWxTdHJFcXVhbChtZW1iZXIsIEJBRF9DQVNUICIjI290aGVyIikpIHx8Ci0JCSAgICAoeG1sU3RyRXF1YWwobWVtYmVyLCBCQURfQ0FTVCAiIyNhbnkiKSkpIHsKLQkJeG1sU2NoZW1hUEVycihjdHh0LCByZXQtPm5vZGUsIFhNTF9TQ0hFTUFQX1dJTERDQVJEX0lOVkFMSURfTlNfTUVNQkVSLAotCQkgICAgIlRoZSBuYW1lc3BhY2UgY29uc3RyYWludCBvZiBhbiBhbnlBdHRyaWJ1dGUgIgotCQkgICAgImlzIGEgc2V0IGFuZCBtdXN0IG5vdCBjb250YWluIFwiJXNcIlxuIiwKLQkJICAgIG1lbWJlciwgTlVMTCk7CQkJICAgIAkJICAgIAotCSAgICB9IGVsc2UgewkJCi0JCS8qCi0JCSogVE9ETzogVmFsaWRhdGUgdGhlIHZhbHVlIChhbnlVUkkpLgotCQkqLwkJCi0JCWlmICh4bWxTdHJFcXVhbChtZW1iZXIsIEJBRF9DQVNUICIjI3RhcmdldE5hbWVzcGFjZSIpKSB7Ci0JCSAgICBkaWN0TWVtYmVyID0gc2NoZW1hLT50YXJnZXROYW1lc3BhY2U7Ci0JCX0gZWxzZSBpZiAoeG1sU3RyRXF1YWwobWVtYmVyLCBCQURfQ0FTVCAiIyNsb2NhbCIpKSB7Ci0JCSAgICBkaWN0TWVtYmVyID0gTlVMTDsKLQkJfSBlbHNlCi0JCSAgICBkaWN0TWVtYmVyID0geG1sRGljdExvb2t1cChjdHh0LT5kaWN0LCBtZW1iZXIsIC0xKTsKLQkJLyoKLQkJKiBBdm9pZCBkdWJsaWNhdGUgbmFtZXNwYWNlcy4KLQkJKi8KLQkJdG1wID0gcmV0LT5uc1NldDsKLQkJd2hpbGUgKHRtcCAhPSBOVUxMKSB7Ci0JCSAgICBpZiAoZGljdE1lbWJlciA9PSB0bXAtPnZhbHVlKQotCQkJYnJlYWs7Ci0JCSAgICB0bXAgPSB0bXAtPm5leHQ7Ci0JCX0KLQkJaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCSAgICB0bXAgPSB4bWxTY2hlbWFOZXdXaWxkY2FyZE5zQ29uc3RyYWludChjdHh0KTsKLQkJICAgIGlmICh0bXAgPT0gTlVMTCkgewotCQkJeG1sRnJlZShtZW1iZXIpOwotCQkJeG1sU2NoZW1hRnJlZVdpbGRjYXJkKHJldCk7Ci0JCQlyZXR1cm4gKE5VTEwpOwotCQkgICAgfQotCQkgICAgdG1wLT52YWx1ZSA9IGRpY3RNZW1iZXI7Ci0JCSAgICB0bXAtPm5leHQgPSBOVUxMOwotCQkgICAgaWYgKHJldC0+bnNTZXQgPT0gTlVMTCkgCi0JCQlyZXQtPm5zU2V0ID0gdG1wOwotCQkgICAgZWxzZQotCQkJbGFzdE5zLT5uZXh0ID0gdG1wOwotCQkgICAgbGFzdE5zID0gdG1wOwotCQl9Ci0KLQkgICAgfQkKLQkgICAgeG1sRnJlZShtZW1iZXIpOwotCSAgICBjdXIgPSBlbmQ7Ci0JfSB3aGlsZSAoKmN1ciAhPSAwKTsgICAgCi0gICAgfQotCisgICAgaWYgKHhtbFNjaGVtYVBhcnNlV2lsZGNhcmROcyhjdHh0LCBzY2hlbWEsIHJldCwgbm9kZSkgIT0gMCkgeworCXhtbFNjaGVtYUZyZWVXaWxkY2FyZChyZXQpOworCXJldHVybiAoTlVMTCk7CisgICAgfSAgICAKICAgICBjaGlsZCA9IG5vZGUtPmNoaWxkcmVuOwogICAgIGlmIChJU19TQ0hFTUEoY2hpbGQsICJhbm5vdGF0aW9uIikpIHsKICAgICAgICAgcmV0LT5hbm5vdCA9IHhtbFNjaGVtYVBhcnNlQW5ub3RhdGlvbihjdHh0LCBzY2hlbWEsIGNoaWxkKTsKICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICB9CiAgICAgaWYgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX1VOS05PV05fQU5ZQVRUUklCVVRFX0NISUxELAotICAgICAgICAgICAgICAgICAgICAgICAiYW55QXR0cmlidXRlIGhhcyB1bmV4cGVjdGVkIGNvbnRlbnRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworCS8qIFRPRE86IENoYW5nZSB0aGUgZXJyb3IgY29kZS4gKi8KKwl4bWxTY2hlbWFQQ29udGVudEVycihjdHh0LAorCQlYTUxfU0NIRU1BUF9VTktOT1dOX0FOWUFUVFJJQlVURV9DSElMRCwKKwkJTlVMTCwgTlVMTCwgbm9kZSwgY2hpbGQsIAorCQlOVUxMLCAiKGFubm90YXRpb24/KSIpOwogICAgIH0KIAogICAgIHJldHVybiAocmV0KTsKQEAgLTI2MTcsMTk4ICs0MTY2LDMxOCBAQAogeG1sU2NoZW1hUGFyc2VBdHRyaWJ1dGUoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxTY2hlbWFQdHIgc2NoZW1hLAogICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBub2RlLCBpbnQgdG9wTGV2ZWwpCiB7Ci0gICAgY29uc3QgeG1sQ2hhciAqbmFtZSwgKnJlZk5zID0gTlVMTCwgKnJlZiA9IE5VTEwsICphdHRyVmFsOworICAgIGNvbnN0IHhtbENoYXIgKm5hbWUsICphdHRyVmFsdWU7CisgICAgeG1sQ2hhciAqcmVwTmFtZSA9IE5VTEw7IC8qIFRoZSByZXBvcnRlZCBkZXNpZ25hdGlvbi4gKi8KICAgICB4bWxTY2hlbWFBdHRyaWJ1dGVQdHIgcmV0OwotICAgIHhtbE5vZGVQdHIgY2hpbGQgPSBOVUxMOwotICAgIGNoYXIgYnVmWzEwMF07Ci0gICAgaW50IGhhc1JlZlR5cGUgPSAwOworICAgIHhtbE5vZGVQdHIgY2hpbGQgPSBOVUxMOyAgICAKKyAgICB4bWxBdHRyUHRyIGF0dHIsIG5hbWVBdHRyOworICAgIGludCBpc1JlZiA9IDA7CiAKICAgICAvKgogICAgICAqIE5vdGUgdGhhdCB0aGUgdzNjIHNwZWMgYXNzdW1lcyB0aGUgc2NoZW1hIHRvIGJlIHZhbGlkYXRlZCB3aXRoIHNjaGVtYQogICAgICAqIGZvciBzY2hlbWFzIGJlZm9yZWhhbmQuCiAgICAgICoKICAgICAgKiAzLjIuMyBDb25zdHJhaW50cyBvbiBYTUwgUmVwcmVzZW50YXRpb25zIG9mIEF0dHJpYnV0ZSBEZWNsYXJhdGlvbnMKLSAgICAgKgotICAgICAqIFRPRE86IENvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mOiAKLSAgICAgKiAzLjIuNiBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IEF0dHJpYnV0ZSBEZWNsYXJhdGlvbiBQcm9wZXJ0aWVzCi0gICAgICogICAgICAgQ29ycmVjdCAKICAgICAgKi8KIAogICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoc2NoZW1hID09IE5VTEwpIHx8IChub2RlID09IE5VTEwpKQogICAgICAgICByZXR1cm4gKE5VTEwpOwotICAgIAotICAgIG5hbWUgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJuYW1lIik7Ci0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICByZWYgPSB4bWxHZXRRTmFtZVByb3AoY3R4dCwgbm9kZSwgInJlZiIsICZyZWZOcyk7Ci0JLyogMy4yLjMgOiAzLjEKLQkgKiBPbmUgb2YgcmVmIG9yIG5hbWUgbXVzdCBiZSBwcmVzZW50LCBidXQgbm90IGJvdGggCi0JICovCi0gICAgICAgIGlmIChyZWYgPT0gTlVMTCkgewkgICAgCi0gICAgICAgICAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIAotCQkJICBYTUxfU0NIRU1BUF9BVFRSX05PTkFNRV9OT1JFRiwKLQkJCSAgIkF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBoYXMgbm8gXCJuYW1lXCIgb3IgXCJyZWZcIlxuIiwKLQkJCSAgTlVMTCwgTlVMTCk7CisgICAgYXR0ciA9IHhtbFNjaGVtYUdldFByb3BOb2RlKG5vZGUsICJyZWYiKTsKKyAgICBuYW1lQXR0ciA9IHhtbFNjaGVtYUdldFByb3BOb2RlKG5vZGUsICJuYW1lIik7CisKKyAgICBpZiAoKGF0dHIgPT0gTlVMTCkgJiYgKG5hbWVBdHRyID09IE5VTEwpKSB7CisJLyogCisJKiAzLjIuMyA6IDMuMQorCSogT25lIG9mIHJlZiBvciBuYW1lIG11c3QgYmUgcHJlc2VudCwgYnV0IG5vdCBib3RoIAorCSovCisJeG1sU2NoZW1hUE1pc3NpbmdBdHRyRXJyKGN0eHQsIFhNTF9TQ0hFTUFQX1NSQ19BVFRSSUJVVEVfM18xLCAKKwkgICAgKHhtbENoYXIgKiopICZ4bWxTY2hlbWFFbGVtRGVzQXR0ckRlY2wsIE5VTEwsIG5vZGUsIE5VTEwsIAorCSAgICAiT25lIG9mIHRoZSBhdHRyaWJ1dGVzICdyZWYnIG9yICduYW1lJyBtdXN0IGJlIHByZXNlbnQiKTsKKwlyZXR1cm4gKE5VTEwpOworICAgIH0KKyAgICBpZiAoKHRvcExldmVsKSB8fCAoYXR0ciA9PSBOVUxMKSkgeworCWlmIChuYW1lQXR0ciA9PSBOVUxMKSB7CisJICAgIHhtbFNjaGVtYVBNaXNzaW5nQXR0ckVycihjdHh0LCBYTUxfU0NIRU1BUF9TNFNfQVRUUl9NSVNTSU5HLCAKKwkJKHhtbENoYXIgKiopICZ4bWxTY2hlbWFFbGVtRGVzQXR0ckRlY2wsIE5VTEwsIG5vZGUsIAorCQkibmFtZSIsIE5VTEwpOwogCSAgICByZXR1cm4gKE5VTEwpOwotICAgICAgICB9Ci0JaGFzUmVmVHlwZSA9IDE7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZiwgOTksICJhbm9uYXR0ciAlZCIsIGN0eHQtPmNvdW50ZXIrKyArIDEpOwotICAgICAgICBuYW1lID0gKGNvbnN0IHhtbENoYXIgKikgYnVmOworCX0JCisgICAgfSBlbHNlCisJaXNSZWYgPSAxOwkKKyAgICAKKyAgICBpZiAoaXNSZWYpIHsKKwljaGFyIGJ1ZlsxMDBdOyAKKwljb25zdCB4bWxDaGFyICpyZWZOcyA9IE5VTEwsICpyZWYgPSBOVUxMLCAqcmVmUHJlZml4ID0gTlVMTDsgCisKKwkvKgorCSogUGFyc2UgYXMgYXR0cmlidXRlIHJlZmVyZW5jZS4KKwkqLwkJCisJaWYgKHhtbFNjaGVtYVBWYWxBdHRyTm9kZVFOYW1lKGN0eHQsIHNjaGVtYSwgCisJICAgICh4bWxDaGFyICoqKSAmeG1sU2NoZW1hRWxlbURlc0F0dHJSZWYsIE5VTEwsIGF0dHIsICZyZWZOcywgCisJICAgICZyZWZQcmVmaXgsICZyZWYpICE9IDApIHsKKwkgICAgcmV0dXJuIChOVUxMKTsKKwl9CQorICAgICAgICBzbnByaW50ZihidWYsIDk5LCAiI2FSZWYgJWQiLCBjdHh0LT5jb3VudGVyKysgKyAxKTsKKyAgICAgICAgbmFtZSA9IChjb25zdCB4bWxDaGFyICopIGJ1ZjsJCiAJcmV0ID0geG1sU2NoZW1hQWRkQXR0cmlidXRlKGN0eHQsIHNjaGVtYSwgbmFtZSwgTlVMTCk7Ci0JaWYgKCF0b3BMZXZlbCkgewotCSAgICAvKiAzLjIuMyA6IDMuMgotCSAgICAgKiBJZiByZWYgaXMgcHJlc2VudCwgdGhlbiBhbGwgb2YgPHNpbXBsZVR5cGU+LAotCSAgICAgKiBmb3JtIGFuZCB0eXBlIG11c3QgYmUgYWJzZW50LiAKLQkgICAgICovCi0JICAgIGlmICh4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJmb3JtIikgIT0gTlVMTCkgewkJCi0JCXhtbFNjaGVtYVBFcnIoY3R4dCwgbm9kZSwgCi0JCSAgICAgICAgICAgICAgWE1MX1NDSEVNQVBfSU5WQUxJRF9BVFRSX0NPTUJJTkFUSU9OLAotCQkJICAgICAgIkF0dHJpYnV0ZSBkZWNsYXJhdGlvbiAlcyBoYXMgXCJyZWZcIiwgdGh1cyAiCi0JCQkgICAgICAiXCJmb3JtXCIgbXVzdCBiZSBhYnNlbnRcbiIsIG5hbWUsIE5VTEwpOwotCSAgICB9Ci0JICAgIGlmICh4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJ0eXBlIikgIT0gTlVMTCkgewotCQl4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIAotCQkgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX0lOVkFMSURfQVRUUl9DT01CSU5BVElPTiwKLQkJCSAgICAgICJBdHRyaWJ1dGUgZGVjbGFyYXRpb24gJXMgaGFzIFwicmVmXCIsIHRodXMgIgotCQkJICAgICAgIlwidHlwZVwiIG11c3QgYmUgYWJzZW50XG4iLCBuYW1lLCBOVUxMKTsKLQkgICAgfQorCWlmIChyZXQgPT0gTlVMTCkgeworCSAgICBpZiAocmVwTmFtZSAhPSBOVUxMKQorCQl4bWxGcmVlKHJlcE5hbWUpOworCSAgICByZXR1cm4gKE5VTEwpOwogCX0KKwlyZXQtPnR5cGUgPSBYTUxfU0NIRU1BX1RZUEVfQVRUUklCVVRFOworCXJldC0+bm9kZSA9IG5vZGU7CisJcmV0LT5yZWZOcyA9IHJlZk5zOworCXJldC0+cmVmUHJlZml4ID0gcmVmUHJlZml4OworCXJldC0+cmVmID0gcmVmOwkJCisJLyoKKwl4bWxTY2hlbWFGb3JtYXRUeXBlUmVwKCZyZXBOYW1lLCAoeG1sU2NoZW1hVHlwZVB0cikgcmV0LCBOVUxMLCBOVUxMKTsKKwkqLworCWlmIChuYW1lQXR0ciAhPSBOVUxMKQorCSAgICB4bWxTY2hlbWFQTXV0dWFsRXhjbEF0dHJFcnIoY3R4dCwgWE1MX1NDSEVNQVBfU1JDX0FUVFJJQlVURV8zXzEsIAorCQkmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgbmFtZUF0dHIsIAorCQkicmVmIiwgIm5hbWUiKTsKKwkvKgorCSogQ2hlY2sgZm9yIGlsbGVnYWwgYXR0cmlidXRlcy4KKwkqLworCWF0dHIgPSBub2RlLT5wcm9wZXJ0aWVzOworCXdoaWxlIChhdHRyICE9IE5VTEwpIHsKKwkgICAgaWYgKGF0dHItPm5zID09IE5VTEwpIHsKKwkJaWYgKHhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJ0eXBlIikgfHwKKwkJICAgIHhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJmb3JtIikpIHsKKwkJICAgIC8qIAorCQkgICAgKiAzLjIuMyA6IDMuMgorCQkgICAgKiBJZiByZWYgaXMgcHJlc2VudCwgdGhlbiBhbGwgb2YgPHNpbXBsZVR5cGU+LAorCQkgICAgKiBmb3JtIGFuZCB0eXBlIG11c3QgYmUgYWJzZW50LiAKKwkJICAgICovCisJCSAgICB4bWxTY2hlbWFQSWxsZWdhbEF0dHJFcnIoY3R4dCwgCisJCQlYTUxfU0NIRU1BUF9TUkNfQVRUUklCVVRFXzNfMiwgJnJlcE5hbWUsIAorCQkJKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgYXR0cik7CisJCX0gZWxzZSBpZiAoKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAicmVmIikpICYmCisJCSAgICAoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJ1c2UiKSkgJiYKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgImlkIikpICYmCisJCSAgICAoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJuYW1lIikpICYmIAorCQkgICAgKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAiZml4ZWQiKSkgJiYgCisJCSAgICAoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJkZWZhdWx0IikpKSB7CisJCSAgICB4bWxTY2hlbWFQSWxsZWdhbEF0dHJFcnIoY3R4dCwgCisJCQlYTUxfU0NIRU1BUF9TNFNfQVRUUl9OT1RfQUxMT1dFRCwgCisJCQkmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgYXR0cik7CQkgICAgCisJCX0KKwkgICAgfSBlbHNlIGlmICh4bWxTdHJFcXVhbChhdHRyLT5ucy0+aHJlZiwgeG1sU2NoZW1hTnMpKSB7CisJCXhtbFNjaGVtYVBJbGxlZ2FsQXR0ckVycihjdHh0LCAKKwkJICAgIFhNTF9TQ0hFTUFQX1M0U19BVFRSX05PVF9BTExPV0VELCAKKwkJICAgICZyZXBOYW1lLCAoeG1sU2NoZW1hVHlwZVB0cikgcmV0LCBhdHRyKTsJCQorCSAgICB9CisJICAgIGF0dHIgPSBhdHRyLT5uZXh0OworCX0JCiAgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3QgeG1sQ2hhciAqbnMgPSBOVUxMOwotCS8qIDMuMi4zIDogMy4xCi0JICogT25lIG9mIHJlZiBvciBuYW1lIG11c3QgYmUgcHJlc2VudCwgYnV0IG5vdCBib3RoIAotCSAqLwotCWlmICgoIXRvcExldmVsKSAmJiAoeG1sU2NoZW1hR2V0UHJvcChjdHh0LCBub2RlLCAicmVmIikgIT0gTlVMTCkpIHsJICAgIAotCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9JTlZBTElEX0FUVFJfQ09NQklOQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgZGVjbGFyYXRpb24gXCIlc1wiIGhhcyBib3RoLCBcIm5hbWVcIiBhbmQgIgotCQkJICAiXCJyZWZcIlxuIiwgbmFtZSwgTlVMTCk7CisJCisJLyoKKwkqIFBhcnNlIGFzIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KKwkqLwkJCQorCWlmICh4bWxTY2hlbWFQVmFsQXR0ck5vZGUoY3R4dCwgCisJICAgICh4bWxDaGFyICoqKSAmeG1sU2NoZW1hRWxlbURlc0F0dHJEZWNsLCBOVUxMLCBuYW1lQXR0ciwgCisJICAgIHhtbFNjaGVtYUdldEJ1aWx0SW5UeXBlKFhNTF9TQ0hFTUFTX05DTkFNRSksICZuYW1lKSAhPSAwKSB7CisJICAgIHJldHVybiAoTlVMTCk7CiAJfQotCi0gICAgICAgIC8qIGxvY2FsID0geG1sU2NoZW1hR2V0TmFtZXNwYWNlKGN0eHQsIHNjaGVtYSwgbm9kZSwgbmFtZSwgJm5zKTsgKi8KLQkvKiBFdmFsdWF0ZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSAqLworCS8qCisJeG1sU2NoZW1hRm9ybWF0VHlwZVJlcCgmcmVwTmFtZSwgTlVMTCwgeG1sU2NoZW1hRWxlbURlc0F0dHJEZWNsLCBuYW1lKTsKKwkqLworCS8qIAorCSogMy4yLjYgU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiB4bWxucyBOb3QgQWxsb3dlZCAKKwkqLworCWlmICh4bWxTdHJFcXVhbChuYW1lLCBCQURfQ0FTVCAieG1sbnMiKSkgeworCSAgICB4bWxTY2hlbWFQU2ltcGxlVHlwZUVycihjdHh0LCAKKwkJWE1MX1NDSEVNQVBfTk9fWE1MTlMsIAorCQkmcmVwTmFtZSwgTlVMTCwgKHhtbE5vZGVQdHIpIG5hbWVBdHRyLCAKKwkJWE1MX1NDSEVNQVNfTkNOQU1FLCAiTkNOYW1lIiwgTlVMTCwKKwkJIlRoZSB2YWx1ZSBtdXN0IG5vdCBtYXRjaCAneG1sbnMnIiwgCisJCU5VTEwsIE5VTEwpOwkgICAgCisJICAgIGlmIChyZXBOYW1lICE9IE5VTEwpCisJCXhtbEZyZWUocmVwTmFtZSk7CisJICAgIHJldHVybiAoTlVMTCk7CisJfQkgICAgCisJLyogCisJKiBFdmFsdWF0ZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSAKKwkqLwkKIAlpZiAoc2NoZW1hLT50YXJnZXROYW1lc3BhY2UgIT0gTlVMTCkgewogCSAgICBpZiAodG9wTGV2ZWwpIHsKIAkJbnMgPSBzY2hlbWEtPnRhcmdldE5hbWVzcGFjZTsKLQkgICAgfSBlbHNlIGlmICh4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJmb3JtIikgIT0gTlVMTCkgewotCQlpZiAoeG1sU3RyRXF1YWwoIHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgImZvcm0iKSwKLQkJCQkgQkFEX0NBU1QgInF1YWxpZmllZCIpKSB7Ci0JCSAgICBucyA9IHNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlOwotCQl9Ci0JICAgIH0gZWxzZSBpZiAoc2NoZW1hLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1FVQUxJRl9BVFRSKSB7Ci0JCW5zID0gc2NoZW1hLT50YXJnZXROYW1lc3BhY2U7CQkKLQkgICAgfQotCX0KKwkgICAgfSBlbHNlIHsKKwkJYXR0ciA9IHhtbFNjaGVtYUdldFByb3BOb2RlKG5vZGUsICJmb3JtIik7CisJCWlmIChhdHRyICE9IE5VTEwpIHsKKwkJICAgIGF0dHJWYWx1ZSA9IHhtbFNjaGVtYUdldE5vZGVDb250ZW50KGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyKTsKKwkJICAgIGlmICh4bWxTdHJFcXVhbChhdHRyVmFsdWUsIEJBRF9DQVNUICJxdWFsaWZpZWQiKSkgeworCQkJbnMgPSBzY2hlbWEtPnRhcmdldE5hbWVzcGFjZTsKKwkJICAgIH0gZWxzZSBpZiAoIXhtbFN0ckVxdWFsKGF0dHJWYWx1ZSwgQkFEX0NBU1QgInVucXVhbGlmaWVkIikpIHsKKwkJCXhtbFNjaGVtYVBTaW1wbGVUeXBlRXJyKGN0eHQsIAorCQkJICAgIFhNTF9TQ0hFTUFQX1M0U19BVFRSX0lOVkFMSURfVkFMVUUsIAorCQkJICAgICZyZXBOYW1lLCBOVUxMLCAoeG1sTm9kZVB0cikgYXR0ciwgCisJCQkgICAgWE1MX1NDSEVNQVNfVU5LTk9XTiwgIihxdWFsaWZpZWQgfCB1bnF1YWxpZmllZCkiLCAKKwkJCSAgICBhdHRyVmFsdWUsIE5VTEwsIE5VTEwsIE5VTEwpOwkJCQorCQkgICAgfQorCQl9IGVsc2UgaWYgKHNjaGVtYS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19RVUFMSUZfQVRUUikKKwkJICAgIG5zID0gc2NoZW1hLT50YXJnZXROYW1lc3BhY2U7CQkKKwkgICAgfSAKKwl9CQkJCQogCXJldCA9IHhtbFNjaGVtYUFkZEF0dHJpYnV0ZShjdHh0LCBzY2hlbWEsIG5hbWUsIG5zKTsKLQlpZiAocmV0ID09IE5VTEwpCisJaWYgKHJldCA9PSBOVUxMKSB7CisJICAgIGlmIChyZXBOYW1lICE9IE5VTEwpCisJCXhtbEZyZWUocmVwTmFtZSk7CiAJICAgIHJldHVybiAoTlVMTCk7Ci0JLyogMy4yLjYgU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiB4bWxucyBOb3QgQWxsb3dlZCAqLwotCWlmICh4bWxTdHJFcXVhbChuYW1lLCBCQURfQ0FTVCAieG1sbnMiKSkgewotCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIAotICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX0lOVkFMSURfQVRUUl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICJUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gbXVzdCBub3QgbWF0Y2ggIgotCQkgICAgICAiXCJ4bWxuc1wiLlxuIiwgTlVMTCwgTlVMTCk7Ci0JfQkKLQkKLQkvKiAzLjIuNiBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IHhzaTogTm90IEFsbG93ZWQgKi8JCi0JaWYgKHhtbFN0ckVxdWFsKHJldC0+dGFyZ2V0TmFtZXNwYWNlLCB4bWxTY2hlbWFJbnN0YW5jZU5zKSkgewotCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9JTlZBTElEX0FUVFJfTkFNRSwKLQkgICAgICAgICAgICAgICAgICAiVGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLCAiCi0JCQkgICJtdXN0IG5vdCBtYXRjaCBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvIgotCQkJICAiWE1MU2NoZW1hLWluc3RhbmNlXCIiLCBOVUxMLCBOVUxMKTsKLQl9CQotICAgIH0KLSAgICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICB9Ci0gICAgcmV0LT50eXBlID0gWE1MX1NDSEVNQV9UWVBFX0FUVFJJQlVURTsKLSAgICBpZiAodG9wTGV2ZWwpIAotICAgICAgICByZXQtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0FUVFJfR0xPQkFMOwotICAgIAotICAgIC8qIEhhbmRsZSB0aGUgInVzZSIgYXR0cmlidXRlLiAqLwotICAgIGF0dHJWYWwgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJ1c2UiKTsKLSAgICBpZiAoYXR0clZhbCAhPSBOVUxMKSB7Ci0JaWYgKHhtbFN0ckVxdWFsKGF0dHJWYWwsIEJBRF9DQVNUICJvcHRpb25hbCIpKQotCSAgICByZXQtPm9jY3VycyA9IFhNTF9TQ0hFTUFTX0FUVFJfVVNFX09QVElPTkFMOwotCWVsc2UgaWYgKHhtbFN0ckVxdWFsKGF0dHJWYWwsIEJBRF9DQVNUICJwcm9oaWJpdGVkIikpCi0JICAgIHJldC0+b2NjdXJzID0gWE1MX1NDSEVNQVNfQVRUUl9VU0VfUFJPSElCSVRFRDsKLQllbHNlIGlmICh4bWxTdHJFcXVhbChhdHRyVmFsLCBCQURfQ0FTVCAicmVxdWlyZWQiKSkKLQkgICAgcmV0LT5vY2N1cnMgPSBYTUxfU0NIRU1BU19BVFRSX1VTRV9SRVFVSVJFRDsKLQllbHNlCi0JICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgbm9kZSwKLQkJCSAgWE1MX1NDSEVNQVBfSU5WQUxJRF9BVFRSX1VTRSwKLQkJCSAgIkF0dHJpYnV0ZSBkZWNsYXJhdGlvbiAlcyBoYXMgYW4gaW52YWxpZCAiCi0JCQkgICJ2YWx1ZSBmb3IgXCJ1c2VcIlxuIiwgbmFtZSwgTlVMTCk7Ci0gICAgfSBlbHNlCi0JcmV0LT5vY2N1cnMgPSBYTUxfU0NIRU1BU19BVFRSX1VTRV9PUFRJT05BTDsKLQotICAgIAotICAgIGlmICh4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJkZWZhdWx0IikgIT0gTlVMTCkgewotCS8qIDMuMi4zIDogMQotCSAqIGRlZmF1bHQgYW5kIGZpeGVkIG11c3Qgbm90IGJvdGggYmUgcHJlc2VudC4gCi0JICovCi0JaWYgKHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgImZpeGVkIikgIT0gTlVMTCkgewotCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9JTlZBTElEX0FUVFJfQ09NQklOQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgZGVjbGFyYXRpb24gaGFzIGJvdGgsIFwiZGVmYXVsdFwiICIKLQkJCSAgImFuZCBcImZpeGVkXCJcbiIsIE5VTEwsIE5VTEwpOwogCX0KLQkvKiAzLjIuMyA6IDIKLQkgKiBJZiBkZWZhdWx0IGFuZCB1c2UgYXJlIGJvdGggcHJlc2VudCwgdXNlIG11c3QgaGF2ZQotCSAqIHRoZSBhY3R1YWwgdmFsdWUgb3B0aW9uYWwuCi0JICovCi0JaWYgKHJldC0+b2NjdXJzICE9IFhNTF9TQ0hFTUFTX0FUVFJfVVNFX09QVElPTkFMKSB7Ci0JICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgbm9kZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX0lOVkFMSURfQVRUUl9DT01CSU5BVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBoYXMgXCJkZWZhdWx0XCIgYnV0ICIKLQkJCSAgIlwidXNlXCIgaXMgbm90IFwib3B0aW9uYWxcIlxuIiwgTlVMTCwgTlVMTCk7Ci0JfQkKKwlyZXQtPnR5cGUgPSBYTUxfU0NIRU1BX1RZUEVfQVRUUklCVVRFOworCXJldC0+bm9kZSA9IG5vZGU7CQkJCQorCWlmICh0b3BMZXZlbCkKKwkgICAgcmV0LT5mbGFncyB8PSBYTUxfU0NIRU1BU19BVFRSX0dMT0JBTDsKKwkvKiAKKwkqIDMuMi42IFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogeHNpOiBOb3QgQWxsb3dlZCAKKwkqLwkKKwlpZiAoeG1sU3RyRXF1YWwocmV0LT50YXJnZXROYW1lc3BhY2UsIHhtbFNjaGVtYUluc3RhbmNlTnMpKSB7CisJICAgIHhtbFNjaGVtYVBDdXN0b21FcnIoY3R4dCwgCisJCVhNTF9TQ0hFTUFQX05PX1hTSSwKKwkJJnJlcE5hbWUsICh4bWxTY2hlbWFUeXBlUHRyKSByZXQsIG5vZGUsCisJCSJUaGUgdGFyZ2V0IG5hbWVzcGFjZSBtdXN0IG5vdCBtYXRjaCAnJXMnIiwgCisJCXhtbFNjaGVtYUluc3RhbmNlTnMpOwkgICAgICAgIAorCX0KKwkvKgorCSogQ2hlY2sgZm9yIGlsbGVnYWwgYXR0cmlidXRlcy4gCisJKi8JCisJYXR0ciA9IG5vZGUtPnByb3BlcnRpZXM7CisJd2hpbGUgKGF0dHIgIT0gTlVMTCkgeworCSAgICBpZiAoYXR0ci0+bnMgPT0gTlVMTCkgewkJCisJCWlmICgoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJpZCIpKSAmJiAKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgImRlZmF1bHQiKSkgJiYgCQkJCQorCQkgICAgKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAiZml4ZWQiKSkgJiYJCSAgICAKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgIm5hbWUiKSkgJiYKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgInR5cGUiKSkpIHsKKwkJICAgIGlmICgodG9wTGV2ZWwpIHx8CQkJCQkJICAgIAkJCisJCSAgICAgICAgKCgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgImZvcm0iKSkgJiYKKwkJCSAoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJ1c2UiKSkpKSB7CisJCQl4bWxTY2hlbWFQSWxsZWdhbEF0dHJFcnIoY3R4dCwgCisJCQkgICAgWE1MX1NDSEVNQVBfUzRTX0FUVFJfTk9UX0FMTE9XRUQsIAorCQkJICAgICZyZXBOYW1lLCAoeG1sU2NoZW1hVHlwZVB0cikgcmV0LCBhdHRyKTsJCisJCSAgICB9CisJCX0KKwkgICAgfSBlbHNlIGlmICh4bWxTdHJFcXVhbChhdHRyLT5ucy0+aHJlZiwgeG1sU2NoZW1hTnMpKSB7CisJCXhtbFNjaGVtYVBJbGxlZ2FsQXR0ckVycihjdHh0LCBYTUxfU0NIRU1BUF9TNFNfQVRUUl9OT1RfQUxMT1dFRCwgCisJCSAgICAmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgYXR0cik7CQorCSAgICB9CisJICAgIGF0dHIgPSBhdHRyLT5uZXh0OworCX0KKwl4bWxTY2hlbWFQVmFsQXR0clFOYW1lKGN0eHQsIHNjaGVtYSwgJnJlcE5hbWUsICh4bWxTY2hlbWFUeXBlUHRyKSByZXQsCisJICAgIG5vZGUsICJ0eXBlIiwgJnJldC0+dHlwZU5zLCBOVUxMLCAmcmV0LT50eXBlTmFtZSk7CiAgICAgfSAgICAKLQotICAgIHJldC0+cmVmID0gcmVmOwotICAgIHJldC0+cmVmTnMgPSByZWZOczsKLSAgICAvKiAKLSAgICAgKiBUaGUgc2V0dGluZyBvZiBYTUxfU0NIRU1BU19BVFRSX05TREVGQVVMVCBpcyBub3QgbmVlZGVkIGFueW1vcmUsCi0gICAgICogc2luY2UgdGhlIHRhcmdldCBuYW1lc3BhY2Ugd2FzIGFscmVhZHkgZXZhbHVhdGVkIGFuZCB0b29rCi0gICAgICogYXR0cmlidXRlRm9ybURlZmF1bHQgaW50byBhY2NvdW50LgotICAgICAqLworICAgIC8qIFRPRE86IENoZWNrIElELiAqLworICAgIHJldC0+aWQgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJpZCIpOyAgCiAgICAgLyoKLSAgICBpZiAoKHJldC0+dGFyZ2V0TmFtZXNwYWNlICE9IE5VTEwpICYmCi0gICAgICAgICgoc2NoZW1hLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1FVQUxJRl9BVFRSKSA9PSAwKSAmJgotCSh4bWxTdHJFcXVhbChyZXQtPnRhcmdldE5hbWVzcGFjZSwgc2NoZW1hLT50YXJnZXROYW1lc3BhY2UpKSkKLQlyZXQtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0FUVFJfTlNERUZBVUxUOworICAgICogQXR0cmlidXRlICJmaXhlZCIuCiAgICAgKi8KLSAgICByZXQtPnR5cGVOYW1lID0geG1sR2V0UU5hbWVQcm9wKGN0eHQsIG5vZGUsICJ0eXBlIiwgJihyZXQtPnR5cGVOcykpOwotICAgIGlmIChyZXQtPnR5cGVOYW1lICE9IE5VTEwpCi0JaGFzUmVmVHlwZSA9IDE7Ci0gICAgcmV0LT5ub2RlID0gbm9kZTsKKyAgICByZXQtPmRlZlZhbHVlID0geG1sU2NoZW1hR2V0UHJvcChjdHh0LCBub2RlLCAiZml4ZWQiKTsKKyAgICBpZiAocmV0LT5kZWZWYWx1ZSAhPSBOVUxMKQorCXJldC0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfQVRUUl9GSVhFRDsKKyAgICAvKiAKKyAgICAqIEF0dHJpYnV0ZSAiZGVmYXVsdCIuCisgICAgKi8KKyAgICBhdHRyID0geG1sU2NoZW1hR2V0UHJvcE5vZGUobm9kZSwgImRlZmF1bHQiKTsKKyAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CisJLyogCisJKiAzLjIuMyA6IDEKKwkqIGRlZmF1bHQgYW5kIGZpeGVkIG11c3Qgbm90IGJvdGggYmUgcHJlc2VudC4gCisJKi8KKwlpZiAocmV0LT5mbGFncyAmIFhNTF9TQ0hFTUFTX0FUVFJfRklYRUQpIHsKKwkgICAgeG1sU2NoZW1hUE11dHVhbEV4Y2xBdHRyRXJyKGN0eHQsIFhNTF9TQ0hFTUFQX1NSQ19BVFRSSUJVVEVfMSwKKwkJJnJlcE5hbWUsICh4bWxTY2hlbWFUeXBlUHRyKSByZXQsIGF0dHIsICJkZWZhdWx0IiwgImZpeGVkIik7CisJfSBlbHNlCisJICAgIHJldC0+ZGVmVmFsdWUgPSB4bWxTY2hlbWFHZXROb2RlQ29udGVudChjdHh0LCAoeG1sTm9kZVB0cikgYXR0cik7CQkKKyAgICB9ICAgIAorICAgIGlmICh0b3BMZXZlbCA9PSAwKSB7CisJLyogCisJKiBBdHRyaWJ1dGUgInVzZSIuIAorCSovCisJYXR0ciA9IHhtbFNjaGVtYUdldFByb3BOb2RlKG5vZGUsICJ1c2UiKTsKKwlpZiAoYXR0ciAhPSBOVUxMKSB7CisJICAgIGF0dHJWYWx1ZSA9IHhtbFNjaGVtYUdldE5vZGVDb250ZW50KGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyKTsKKwkgICAgaWYgKHhtbFN0ckVxdWFsKGF0dHJWYWx1ZSwgQkFEX0NBU1QgIm9wdGlvbmFsIikpCisJCXJldC0+b2NjdXJzID0gWE1MX1NDSEVNQVNfQVRUUl9VU0VfT1BUSU9OQUw7CisJICAgIGVsc2UgaWYgKHhtbFN0ckVxdWFsKGF0dHJWYWx1ZSwgQkFEX0NBU1QgInByb2hpYml0ZWQiKSkKKwkJcmV0LT5vY2N1cnMgPSBYTUxfU0NIRU1BU19BVFRSX1VTRV9QUk9ISUJJVEVEOworCSAgICBlbHNlIGlmICh4bWxTdHJFcXVhbChhdHRyVmFsdWUsIEJBRF9DQVNUICJyZXF1aXJlZCIpKQorCQlyZXQtPm9jY3VycyA9IFhNTF9TQ0hFTUFTX0FUVFJfVVNFX1JFUVVJUkVEOworCSAgICBlbHNlCisJCXhtbFNjaGVtYVBTaW1wbGVUeXBlRXJyKGN0eHQsIAorCQkgICAgWE1MX1NDSEVNQVBfSU5WQUxJRF9BVFRSX1VTRSwgCisJCSAgICAmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgKHhtbE5vZGVQdHIpIGF0dHIsIAorCQkgICAgWE1MX1NDSEVNQVNfVU5LTk9XTiwgIihvcHRpb25hbCB8IHByb2hpYml0ZWQgfCByZXF1aXJlZCkiLCAKKwkJICAgIGF0dHJWYWx1ZSwgTlVMTCwgTlVMTCwgTlVMTCk7CQkJCQorCX0gZWxzZQorCSAgICByZXQtPm9jY3VycyA9IFhNTF9TQ0hFTUFTX0FUVFJfVVNFX09QVElPTkFMOworCS8qIAorCSogMy4yLjMgOiAyCisJKiBJZiBkZWZhdWx0IGFuZCB1c2UgYXJlIGJvdGggcHJlc2VudCwgdXNlIG11c3QgaGF2ZQorCSogdGhlIGFjdHVhbCB2YWx1ZSBvcHRpb25hbC4KKwkqLworCWlmICgocmV0LT5vY2N1cnMgIT0gWE1MX1NDSEVNQVNfQVRUUl9VU0VfT1BUSU9OQUwpICYmIAorCSAgICAocmV0LT5kZWZWYWx1ZSAhPSBOVUxMKSAmJiAKKwkgICAgKChyZXQtPmZsYWdzICYgWE1MX1NDSEVNQVNfQVRUUl9GSVhFRCkgPT0gMCkpIHsKKwkgICAgeG1sU2NoZW1hUFNpbXBsZVR5cGVFcnIoY3R4dCwgCisJCVhNTF9TQ0hFTUFQX1NSQ19BVFRSSUJVVEVfMiwgCisJCSZyZXBOYW1lLCAoeG1sU2NoZW1hVHlwZVB0cikgcmV0LCAoeG1sTm9kZVB0cikgYXR0ciwgCisJCVhNTF9TQ0hFTUFTX1VOS05PV04sICIob3B0aW9uYWwgfCBwcm9oaWJpdGVkIHwgcmVxdWlyZWQpIiwgTlVMTCwgCisJCSJUaGUgdmFsdWUgbXVzdCBiZSAnb3B0aW9uYWwnIGlmIHRoZSBhdHRyaWJ1dGUgIgorCQkiJ2RlZmF1bHQnIGlzIHByZXNlbnQgYXMgd2VsbCIsIE5VTEwsIE5VTEwpOwkgICAgCisJfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIC8qCisgICAgKiBBbmQgbm93IGZvciB0aGUgY2hpbGRyZW4uLi4KKyAgICAqLwogICAgIGNoaWxkID0gbm9kZS0+Y2hpbGRyZW47CiAgICAgaWYgKElTX1NDSEVNQShjaGlsZCwgImFubm90YXRpb24iKSkgewogICAgICAgICByZXQtPmFubm90ID0geG1sU2NoZW1hUGFyc2VBbm5vdGF0aW9uKGN0eHQsIHNjaGVtYSwgY2hpbGQpOwogICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OworICAgIH0gICAgCisgICAgaWYgKGlzUmVmKSB7CisJaWYgKGNoaWxkICE9IE5VTEwpIHsJICAgIAorCSAgICBpZiAoSVNfU0NIRU1BKGNoaWxkLCAic2ltcGxlVHlwZSIpKQorCQkvKiAKKwkJKiAzLjIuMyA6IDMuMgorCQkqIElmIHJlZiBpcyBwcmVzZW50LCB0aGVuIGFsbCBvZiA8c2ltcGxlVHlwZT4sCisJCSogZm9ybSBhbmQgdHlwZSBtdXN0IGJlIGFic2VudC4gCisJCSovCisJCXhtbFNjaGVtYVBDb250ZW50RXJyKGN0eHQsIFhNTF9TQ0hFTUFQX1NSQ19BVFRSSUJVVEVfM18yLAorCQkgICAgJnJlcE5hbWUsICh4bWxTY2hlbWFUeXBlUHRyKSByZXQsIG5vZGUsIGNoaWxkLCBOVUxMLAorCQkgICAgIihhbm5vdGF0aW9uPykiKTsKKwkgICAgZWxzZSAKKwkJeG1sU2NoZW1hUENvbnRlbnRFcnIoY3R4dCwgWE1MX1NDSEVNQVBfUzRTX0VMRU1fTk9UX0FMTE9XRUQsCisJCSAgICAmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgbm9kZSwgY2hpbGQsIE5VTEwsCisJCSAgICAiKGFubm90YXRpb24/KSIpOyAgCisJfQorICAgIH0gZWxzZSB7CisJaWYgKElTX1NDSEVNQShjaGlsZCwgInNpbXBsZVR5cGUiKSkgeworCSAgICBpZiAocmV0LT50eXBlTmFtZSAhPSBOVUxMKSB7CisJCS8qIAorCQkqIDMuMi4zIDogNAorCQkqIHR5cGUgYW5kIDxzaW1wbGVUeXBlPiBtdXN0IG5vdCBib3RoIGJlIHByZXNlbnQuIAorCQkqLworCQl4bWxTY2hlbWFQQ29udGVudEVycihjdHh0LCBYTUxfU0NIRU1BUF9TUkNfQVRUUklCVVRFXzQsCisJCSAgICAmcmVwTmFtZSwgICh4bWxTY2hlbWFUeXBlUHRyKSByZXQsIG5vZGUsIGNoaWxkLAorCQkgICAgIlRoZSBhdHRyaWJ1dGUgJ3R5cGUnIGFuZCB0aGUgPHNpbXBsZVR5cGU+IGNoaWxkICIKKwkJICAgICJhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIiwgTlVMTCk7CisJICAgIH0gZWxzZQorCQlyZXQtPnN1YnR5cGVzID0geG1sU2NoZW1hUGFyc2VTaW1wbGVUeXBlKGN0eHQsIHNjaGVtYSwgY2hpbGQsIDApOworCSAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OworCX0KKwlpZiAoY2hpbGQgIT0gTlVMTCkKKwkgICAgeG1sU2NoZW1hUENvbnRlbnRFcnIoY3R4dCwgWE1MX1NDSEVNQVBfUzRTX0VMRU1fTk9UX0FMTE9XRUQsCisJCSZyZXBOYW1lLCAoeG1sU2NoZW1hVHlwZVB0cikgcmV0LCBub2RlLCBjaGlsZCwgTlVMTCwKKwkJIihhbm5vdGF0aW9uPywgc2ltcGxlVHlwZT8pIik7CiAgICAgfQotICAgIGlmIChJU19TQ0hFTUEoY2hpbGQsICJzaW1wbGVUeXBlIikpIHsKLQlpZiAoaGFzUmVmVHlwZSkgewotCSAgICAvKiAzLjIuMyA6IDQKLQkgICAgICogdHlwZSBhbmQgPHNpbXBsZVR5cGU+IG11c3Qgbm90IGJvdGggYmUgcHJlc2VudC4gCi0JICAgICAqCi0JICAgICAqIFRPRE86IFhNTF9TQ0hFTUFQX0lOVkFMSURfQVRUUl9DT01CSU5BVElPTiBzZWVtcyBub3QgdG8gYmUKLQkgICAgICogYSBwcm9wZXIgZXJyb3IgdHlwZSBoZXJlLiAKLQkgICAgICovCi0JICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLCAKLQkgICAgICAgICAgICAgICAgICAgWE1MX1NDSEVNQVBfSU5WQUxJRF9BVFRSX0NPTUJJTkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBkZWNsYXJhdGlvbiAlcyBoYXMgYm90aCAoXCJyZWZcIiBvciAiCi0JCQkgICAiXCJ0eXBlXCIpIGFuZCA8c2ltcGxlVHlwZT5cbiIsIG5hbWUsIE5VTEwpOwotCX0gZWxzZQotCSAgICByZXQtPnN1YnR5cGVzID0geG1sU2NoZW1hUGFyc2VTaW1wbGVUeXBlKGN0eHQsIHNjaGVtYSwgY2hpbGQsIDApOwotICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwotICAgIH0KLSAgICBpZiAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICB4bWxTY2hlbWFQRXJyMihjdHh0LCBub2RlLCBjaGlsZCwgWE1MX1NDSEVNQVBfVU5LTk9XTl9BVFRSX0NISUxELAotICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlICVzIGhhcyB1bmV4cGVjdGVkIGNvbnRlbnRcbiIsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLQorICAgIC8qCisgICAgKiBDbGVhbnVwLgorICAgICovCisgICAgaWYgKHJlcE5hbWUgIT0gTlVMTCkKKwl4bWxGcmVlKHJlcE5hbWUpOwogICAgIHJldHVybiAocmV0KTsKIH0KIApAQCAtMjg0Miw5ICs0NTExLDEwIEBACiAgICAgICAgIHJlZiA9IHhtbEdldFFOYW1lUHJvcChjdHh0LCBub2RlLCAicmVmIiwgJnJlZk5zKTsKICAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7CiAgICAgICAgICAgICB4bWxTY2hlbWFQRXJyMihjdHh0LCBub2RlLCBjaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX0FUVFJHUlBfTk9OQU1FX05PUkVGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZUdyb3VwIGhhcyBubyBuYW1lIG5vciByZWZcbiIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwkJWE1MX1NDSEVNQVBfQVRUUkdSUF9OT05BTUVfTk9SRUYsCisJCSJBdHRyaWJ1dGUgZ3JvdXAgb3IgcGFydGljbGU6IE9uZSBvZiB0aGUgYXR0cmlidXRlcyAnbmFtZScgIgorCQkib3IgJ3JlZicgbXVzdCBiZSBwcmVzZW50LlxuIiwgTlVMTCwKKwkJTlVMTCk7CiAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgICB9CiAgICAgICAgIHNucHJpbnRmKGJ1ZiwgOTksICJhbm9uYXR0cmdyb3VwICVkIiwgY3R4dC0+Y291bnRlcisrICsgMSk7CkBAIC0yODcwLDM4ICs0NTQwLDExIEBACiAgICAgICAgIHJldC0+YW5ub3QgPSB4bWxTY2hlbWFQYXJzZUFubm90YXRpb24oY3R4dCwgc2NoZW1hLCBjaGlsZCk7CiAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgfQotICAgIGNoaWxkID0geG1sU2NoZW1hUGFyc2VBdHRyRGVjbHMoY3R4dCwgc2NoZW1hLCBjaGlsZCwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCk7IAotICAgIC8qIFNlZW1zIHRoYXQgdGhpcyBjYW4gYmUgcmVtb3ZlZC4gKi8KLSAgICAvKgotICAgIHdoaWxlICgoSVNfU0NIRU1BKGNoaWxkLCAiYXR0cmlidXRlIikpIHx8Ci0gICAgICAgICAgIChJU19TQ0hFTUEoY2hpbGQsICJhdHRyaWJ1dGVHcm91cCIpKSkgewotICAgICAgICBhdHRyID0gTlVMTDsKLSAgICAgICAgaWYgKElTX1NDSEVNQShjaGlsZCwgImF0dHJpYnV0ZSIpKSB7Ci0gICAgICAgICAgICBhdHRyID0geG1sU2NoZW1hUGFyc2VBdHRyaWJ1dGUoY3R4dCwgc2NoZW1hLCBjaGlsZCwgMCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoSVNfU0NIRU1BKGNoaWxkLCAiYXR0cmlidXRlR3JvdXAiKSkgewotICAgICAgICAgICAgYXR0ciA9ICh4bWxTY2hlbWFBdHRyaWJ1dGVQdHIpCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hUGFyc2VBdHRyaWJ1dGVHcm91cChjdHh0LCBzY2hlbWEsIGNoaWxkLCAwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXR0ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobGFzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0LT5hdHRyaWJ1dGVzID0gYXR0cjsKLSAgICAgICAgICAgICAgICBsYXN0ID0gYXR0cjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGFzdC0+bmV4dCA9IGF0dHI7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IGF0dHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKElTX1NDSEVNQShjaGlsZCwgImFueUF0dHJpYnV0ZSIpKSB7Ci0gICAgICAgIFRPRE8KLQljaGlsZCA9IGNoaWxkLT5uZXh0OwotICAgIH0KLSAgICAqLworICAgIGNoaWxkID0geG1sU2NoZW1hUGFyc2VBdHRyRGVjbHMoY3R4dCwgc2NoZW1hLCBjaGlsZCwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCk7ICAgICAKICAgICBpZiAoY2hpbGQgIT0gTlVMTCkgewogICAgICAgICB4bWxTY2hlbWFQRXJyMihjdHh0LCBub2RlLCBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1NDSEVNQVBfVU5LTk9XTl9BVFRSR1JQX0NISUxELAotICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIGdyb3VwICVzIGhhcyB1bmV4cGVjdGVkIGNvbnRlbnRcbiIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgZ3JvdXAgJyVzJyBoYXMgdW5leHBlY3RlZCBjb250ZW50LlxuIiwgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgfQogICAgIGN0eHQtPmNvbnRhaW5lciA9IG9sZGNvbnRhaW5lcjsKQEAgLTI5MDksNiArNDU1MiwxMDcgQEAKIH0KIAogLyoqCisgKiB4bWxTY2hlbWFQVmFsQXR0ckJsb2NrRmluYWw6CisgKiBAdmFsdWU6ICB0aGUgdmFsdWUKKyAqIEBmbGFnczogdGhlIGZsYWdzIHRvIGJlIG1vZGlmaWVkCisgKiBAZmxhZ0FsbDogdGhlIHNwZWNpZmljIGZsYWcgZm9yICIjYWxsIgorICogQGZsYWdFeHRlbnNpb246IHRoZSBzcGVjaWZpYyBmbGFnIGZvciAiZXh0ZW5zaW9uIgorICogQGZsYWdSZXN0cmljdGlvbjogdGhlIHNwZWNpZmljIGZsYWcgZm9yICJyZXN0cmljdGlvbiIKKyAqIEBmbGFnU3Vic3RpdHV0aW9uOiB0aGUgc3BlY2lmaWMgZmxhZyBmb3IgInN1YnN0aXR1dGlvbiIKKyAqIEBmbGFnTGlzdDogdGhlIHNwZWNpZmljIGZsYWcgZm9yICJsaXN0IgorICogQGZsYWdVbmlvbjogdGhlIHNwZWNpZmljIGZsYWcgZm9yICJ1bmlvbiIKKyAqCisgKiBWYWxpZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgImZpbmFsIiBhbmQgImJsb2NrIi4gVGhlIHZhbHVlCisgKiBpcyBjb252ZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIGZsYWcgdmFsdWVzIGFuZCByZXR1cm5lZCBpbiBAZmxhZ3MuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSB2YWx1ZSBpcyB2YWxpZCwgMSBvdGhlcndpc2UuCisgKi8KKworc3RhdGljIGludAoreG1sU2NoZW1hUFZhbEF0dHJCbG9ja0ZpbmFsKGNvbnN0IHhtbENoYXIgKnZhbHVlLAorCQkJICAgIGludCAqZmxhZ3MsCQkJCisJCQkgICAgaW50IGZsYWdBbGwsCisJCQkgICAgaW50IGZsYWdFeHRlbnNpb24sCisJCQkgICAgaW50IGZsYWdSZXN0cmljdGlvbiwKKwkJCSAgICBpbnQgZmxhZ1N1YnN0aXR1dGlvbiwKKwkJCSAgICBpbnQgZmxhZ0xpc3QsCisJCQkgICAgaW50IGZsYWdVbmlvbikJCQkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIC8qCisgICAgKiBUT0RPOiBUaGlzIGRvZXMgbm90IGNoZWNrIGZvciBkdWJsaWNhdGUgZW50cmllcy4KKyAgICAqLworICAgIGlmICh4bWxTdHJFcXVhbCh2YWx1ZSwgQkFEX0NBU1QgIiNhbGwiKSkgeworCWlmIChmbGFnQWxsICE9IC0xKQorCSAgICAqZmxhZ3MgfD0gZmxhZ0FsbDsKKwllbHNlIHsKKwkgICAgaWYgKGZsYWdFeHRlbnNpb24gIT0gLTEpIAorCQkqZmxhZ3MgfD0gZmxhZ0V4dGVuc2lvbjsgCisJICAgIGlmIChmbGFnUmVzdHJpY3Rpb24gIT0gLTEpIAorCQkqZmxhZ3MgfD0gZmxhZ1Jlc3RyaWN0aW9uOworCSAgICBpZiAoZmxhZ1N1YnN0aXR1dGlvbiAhPSAtMSkgCisJCSpmbGFncyB8PSBmbGFnU3Vic3RpdHV0aW9uOworCSAgICBpZiAoZmxhZ0xpc3QgIT0gLTEpIAorCQkqZmxhZ3MgfD0gZmxhZ0xpc3Q7CisJICAgIGlmIChmbGFnVW5pb24gIT0gLTEpIAorCQkqZmxhZ3MgfD0gZmxhZ1VuaW9uOworCX0KKyAgICB9IGVsc2UgeworCWNvbnN0IHhtbENoYXIgKmVuZCwgKmN1ciA9IHZhbHVlOworCXhtbENoYXIgKml0ZW07CisJCisJZG8geworCSAgICB3aGlsZSAoSVNfQkxBTktfQ0goKmN1cikpCisJCWN1cisrOworCSAgICBlbmQgPSBjdXI7CisJICAgIHdoaWxlICgoKmVuZCAhPSAwKSAmJiAoIShJU19CTEFOS19DSCgqZW5kKSkpKQorCQllbmQrKzsKKwkgICAgaWYgKGVuZCA9PSBjdXIpCisJCWJyZWFrOworCSAgICBpdGVtID0geG1sU3RybmR1cChjdXIsIGVuZCAtIGN1cik7ICAgIAkgICAgCisJICAgIGlmICh4bWxTdHJFcXVhbChpdGVtLCBCQURfQ0FTVCAiZXh0ZW5zaW9uIikpIHsKKwkJaWYgKGZsYWdFeHRlbnNpb24gIT0gLTEpIHsKKwkJICAgIGlmICgoKmZsYWdzICYgZmxhZ0V4dGVuc2lvbikgPT0gMCkKKwkJCSpmbGFncyB8PSBmbGFnRXh0ZW5zaW9uOworCQl9IGVsc2UgCisJCSAgICByZXQgPSAxOworCSAgICB9IGVsc2UgaWYgKHhtbFN0ckVxdWFsKGl0ZW0sIEJBRF9DQVNUICJyZXN0cmljdGlvbiIpKSB7CisJCWlmIChmbGFnUmVzdHJpY3Rpb24gIT0gLTEpIHsKKwkJICAgIGlmICgoKmZsYWdzICYgZmxhZ1Jlc3RyaWN0aW9uKSA9PSAwKQorCQkJKmZsYWdzIHw9IGZsYWdSZXN0cmljdGlvbjsKKwkJfSBlbHNlIAorCQkgICAgcmV0ID0gMTsKKwkgICAgfSBlbHNlIGlmICh4bWxTdHJFcXVhbChpdGVtLCBCQURfQ0FTVCAic3Vic3RpdHV0aW9uIikpIHsKKwkJaWYgKGZsYWdTdWJzdGl0dXRpb24gIT0gLTEpIHsKKwkJICAgIGlmICgoKmZsYWdzICYgZmxhZ1N1YnN0aXR1dGlvbikgPT0gMCkKKwkJCSpmbGFncyB8PSBmbGFnU3Vic3RpdHV0aW9uOworCQl9IGVsc2UgCisJCSAgICByZXQgPSAxOworCSAgICB9IGVsc2UgaWYgKHhtbFN0ckVxdWFsKGl0ZW0sIEJBRF9DQVNUICJsaXN0IikpIHsKKwkJaWYgKGZsYWdMaXN0ICE9IC0xKSB7CisJCSAgICBpZiAoKCpmbGFncyAmIGZsYWdMaXN0KSA9PSAwKQorCQkJKmZsYWdzIHw9IGZsYWdMaXN0OworCQl9IGVsc2UgCisJCSAgICByZXQgPSAxOworCSAgICB9IGVsc2UgaWYgKHhtbFN0ckVxdWFsKGl0ZW0sIEJBRF9DQVNUICJ1bmlvbiIpKSB7CisJCWlmIChmbGFnVW5pb24gIT0gLTEpIHsKKwkJICAgIGlmICgoKmZsYWdzICYgZmxhZ1VuaW9uKSA9PSAwKQorCQkJKmZsYWdzIHw9IGZsYWdVbmlvbjsKKwkJfSBlbHNlIAorCQkgICAgcmV0ID0gMTsKKwkgICAgfSBlbHNlIAorCQlyZXQgPSAxOworCSAgICBpZiAoaXRlbSAhPSBOVUxMKQorCQl4bWxGcmVlKGl0ZW0pOworCSAgICBjdXIgPSBlbmQ7CisJfSB3aGlsZSAoKHJldCA9PSAwKSAmJiAoKmN1ciAhPSAwKSk7IAorICAgIH0gICAgCisgICAgCisgICAgcmV0dXJuIChyZXQpOworfQorCisvKioKICAqIHhtbFNjaGVtYVBhcnNlRWxlbWVudDoKICAqIEBjdHh0OiAgYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0CiAgKiBAc2NoZW1hOiAgdGhlIHNjaGVtYSBiZWluZyBidWlsdApAQCAtMjkyMywyMDYgKzQ2NjcsMzk5IEBACiB4bWxTY2hlbWFQYXJzZUVsZW1lbnQoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxTY2hlbWFQdHIgc2NoZW1hLAogICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgbm9kZSwgaW50IHRvcExldmVsKQogewotICAgIGNvbnN0IHhtbENoYXIgKm5hbWUsICpmaXhlZDsKLSAgICBjb25zdCB4bWxDaGFyICpyZWZOcyA9IE5VTEwsICpyZWYgPSBOVUxMOworICAgIGNvbnN0IHhtbENoYXIgKm5hbWUgPSBOVUxMOyAgICAKKyAgICBjb25zdCB4bWxDaGFyICphdHRyVmFsdWU7CisgICAgeG1sQ2hhciAqcmVwTmFtZSA9IE5VTEw7CiAgICAgeG1sU2NoZW1hRWxlbWVudFB0ciByZXQ7CiAgICAgeG1sTm9kZVB0ciBjaGlsZCA9IE5VTEw7Ci0gICAgY29uc3QgeG1sQ2hhciAqb2xkY29udGFpbmVyOwotICAgIGNoYXIgYnVmWzEwMF07Ci0gICAgeG1sQXR0clB0ciBhdHRyOworICAgIGNvbnN0IHhtbENoYXIgKm9sZGNvbnRhaW5lcjsgICAgCisgICAgeG1sQXR0clB0ciBhdHRyLCBuYW1lQXR0cjsKKyAgICBpbnQgbWluT2NjdXJzLCBtYXhPY2N1cnM7CisgICAgaW50IGlzUmVmID0gMDsKIAogICAgIC8qIDMuMy4zIENvbnN0cmFpbnRzIG9uIFhNTCBSZXByZXNlbnRhdGlvbnMgb2YgRWxlbWVudCBEZWNsYXJhdGlvbnMgKi8KICAgICAvKiBUT0RPOiBDb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiAzLjMuNiAqLwotCisgICAKICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHNjaGVtYSA9PSBOVUxMKSB8fCAobm9kZSA9PSBOVUxMKSkKICAgICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICBvbGRjb250YWluZXIgPSBjdHh0LT5jb250YWluZXI7Ci0gICAgbmFtZSA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgIm5hbWUiKTsKLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJlZiA9IHhtbEdldFFOYW1lUHJvcChjdHh0LCBub2RlLCAicmVmIiwgJnJlZk5zKTsKLQkvKiAzLjMuMyA6IDIuMQotCSAqIE9uZSBvZiByZWYgb3IgbmFtZSBtdXN0IGJlIHByZXNlbnQsIGJ1dCBub3QgYm90aCAKLQkgKi8KLSAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1NDSEVNQVBfRUxFTV9OT05BTUVfTk9SRUYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCBkZWNsYXJhdGlvbiBoYXMgbm8gbmFtZSBub3IgcmVmXG4iLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgICAgIH0JCi0gICAgICAgIAotICAgICAgICBzbnByaW50ZihidWYsIDk5LCAiYW5vbmVsZW0gJWQiLCBjdHh0LT5jb3VudGVyKysgKyAxKTsKLSAgICAgICAgbmFtZSA9IChjb25zdCB4bWxDaGFyICopIGJ1ZjsKLQlyZXQgPSB4bWxTY2hlbWFBZGRFbGVtZW50KGN0eHQsIHNjaGVtYSwgbmFtZSwgTlVMTCk7Ci0gICAgfSBlbHNlIHsKLQljb25zdCB4bWxDaGFyICpucyA9IE5VTEw7CiAKLQkvKiBFdmFsdWF0ZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSAqLworICAgIG9sZGNvbnRhaW5lciA9IGN0eHQtPmNvbnRhaW5lcjsKKyAgICAgCisgICAgbmFtZUF0dHIgPSB4bWxTY2hlbWFHZXRQcm9wTm9kZShub2RlLCAibmFtZSIpOworICAgIGF0dHIgPSB4bWxTY2hlbWFHZXRQcm9wTm9kZShub2RlLCAicmVmIik7ICAgCisgICAgaWYgKCh0b3BMZXZlbCkgfHwgKGF0dHIgPT0gTlVMTCkpIHsKKwlpZiAobmFtZUF0dHIgPT0gTlVMTCkgeworCSAgICB4bWxTY2hlbWFQTWlzc2luZ0F0dHJFcnIoY3R4dCwKKwkJWE1MX1NDSEVNQVBfUzRTX0FUVFJfTUlTU0lORywKKwkJKHhtbENoYXIgKiopICZ4bWxTY2hlbWFFbGVtRGVzRWxlbURlY2wsIE5VTEwsIG5vZGUsCisJCSJuYW1lIiwgTlVMTCk7CSAgICAKKwkgICAgcmV0dXJuIChOVUxMKTsKKwl9CisJbmFtZSA9IHhtbFNjaGVtYUdldE5vZGVDb250ZW50KGN0eHQsICh4bWxOb2RlUHRyKSBuYW1lQXR0cik7CQkKKyAgICB9IGVsc2UgeworCWlzUmVmID0gMTsKKwkKKyAgICB9CisgICAgLyogCisgICAgKiAuLi4gdW5sZXNzIG1pbk9jY3Vycz1tYXhPY2N1cnM9MCwgaW4gd2hpY2ggY2FzZSB0aGUgaXRlbSBjb3JyZXNwb25kcyAKKyAgICAqIHRvIG5vIGNvbXBvbmVudCBhdCBhbGwKKyAgICAqIFRPRE86IEl0IG1pZ2h0IGJlIGJldHRlciB0byB2YWxpZGF0ZSB0aGUgZWxlbWVudCwgZXZlbiBpZiBpdCB3b24ndCBiZSAKKyAgICAqIHVzZWQuCisgICAgKi8KKyAgICBtaW5PY2N1cnMgPSB4bWxHZXRNaW5PY2N1cnMoY3R4dCwgbm9kZSk7CisgICAgbWF4T2NjdXJzID0geG1sR2V0TWF4T2NjdXJzKGN0eHQsIG5vZGUpOworICAgIGlmICgobWluT2NjdXJzID09IDApICYmIChtYXhPY2N1cnMgPT0gMCkpCisJcmV0dXJuIChOVUxMKTsKKyAgICAvKgorICAgICogSWYgd2UgZ2V0IGEgInJlZiIgYXR0cmlidXRlIG9uIGEgbG9jYWwgPGVsZW1lbnQ+IHdlIHdpbGwgYXNzdW1lIGl0J3MKKyAgICAqIGEgcmVmZXJlbmNlIC0gZXZlbiBpZiB0aGVyZSdzIGEgIm5hbWUiIGF0dHJpYnV0ZTsgdGhpcyBzZWVtcyB0byBiZSBtb3JlIAorICAgICogcm9idXN0LgorICAgICovCisgICAgaWYgKGlzUmVmKSB7CisJY2hhciBidWZbMTAwXTsKKwljb25zdCB4bWxDaGFyICpyZWZOcyA9IE5VTEwsICpyZWYgPSBOVUxMLCAqcmVmUHJlZml4OworCisJLyoKKwkqIFBhcnNlIGFzIGEgcGFydGljbGUuCisJKi8KKwl4bWxTY2hlbWFQVmFsQXR0ck5vZGVRTmFtZShjdHh0LCBzY2hlbWEsCisJICAgICh4bWxDaGFyICoqKSAmeG1sU2NoZW1hRWxlbURlc0F0dHJSZWYsIAorCSAgICBOVUxMLCBhdHRyLCAmcmVmTnMsICZyZWZQcmVmaXgsICZyZWYpOwkJCQorCSAKKyAgICAgICAgc25wcmludGYoYnVmLCA5OSwgIiNlUmVmICVkIiwgY3R4dC0+Y291bnRlcisrICsgMSk7CisJbmFtZSA9IChjb25zdCB4bWxDaGFyICopIGJ1ZjsJCisJcmV0ID0geG1sU2NoZW1hQWRkRWxlbWVudChjdHh0LCBzY2hlbWEsIG5hbWUsIE5VTEwpOworCWlmIChyZXQgPT0gTlVMTCkgeworCSAgICBpZiAocmVwTmFtZSAhPSBOVUxMKQorCQl4bWxGcmVlKHJlcE5hbWUpOworCSAgICByZXR1cm4gKE5VTEwpOworCX0KKwlyZXQtPnR5cGUgPSBYTUxfU0NIRU1BX1RZUEVfRUxFTUVOVDsKKwlyZXQtPm5vZGUgPSBub2RlOyAgICAgCQkKKwlyZXQtPnJlZiA9IHJlZjsKKwlyZXQtPnJlZk5zID0gcmVmTnM7CisJcmV0LT5yZWZQcmVmaXggPSByZWZQcmVmaXg7CisJcmV0LT5mbGFncyB8PSBYTUxfU0NIRU1BU19FTEVNX1JFRjsKKwkvKiAKKwkqIENoZWNrIGZvciBpbGxlZ2FsIGF0dHJpYnV0ZXMuCisJKi8KKwkvKiAKKwkqIDMuMy4zIDogMi4xCisJKiBPbmUgb2YgcmVmIG9yIG5hbWUgbXVzdCBiZSBwcmVzZW50LCBidXQgbm90IGJvdGggCisJKi8KKwlpZiAobmFtZUF0dHIgIT0gTlVMTCkgeworCSAgICB4bWxTY2hlbWFQTXV0dWFsRXhjbEF0dHJFcnIoY3R4dCwgCisJCVhNTF9TQ0hFTUFQX1NSQ19FTEVNRU5UXzJfMSwKKwkJJnJlcE5hbWUsICh4bWxTY2hlbWFUeXBlUHRyKSByZXQsIG5hbWVBdHRyLAorCQkicmVmIiwgIm5hbWUiKTsKKwl9CisJLyogMy4zLjMgOiAyLjIgKi8gICAKKwlhdHRyID0gbm9kZS0+cHJvcGVydGllczsKKwl3aGlsZSAoYXR0ciAhPSBOVUxMKSB7CisJICAgIGlmIChhdHRyLT5ucyA9PSBOVUxMKSB7CisJCWlmICgoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJyZWYiKSkgJiYgCQkJCQorCQkgICAgKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAiaWQiKSkgJiYKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgIm1heE9jY3VycyIpKSAmJiAKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgIm1pbk9jY3VycyIpKSAmJgkKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgIm5hbWUiKSkpIHsKKwkJICAgIHhtbFNjaGVtYVBDdXN0b21BdHRyRXJyKGN0eHQsIAorCQkJWE1MX1NDSEVNQVBfU1JDX0VMRU1FTlRfMl8yLAorCQkJJnJlcE5hbWUsICh4bWxTY2hlbWFUeXBlUHRyKSByZXQsIGF0dHIsIAorCQkJIk9ubHkgdGhlIGF0dHJpYnV0ZXMgJ21pbk9jY3VycycsICdtYXhPY2N1cnMnIGFuZCAiCisJCQkiJ2lkJyBhcmUgYWxsb3dlZCBpbiBhZGRpdGlvbiB0byAncmVmJyIpOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfSBlbHNlIGlmICh4bWxTdHJFcXVhbChhdHRyLT5ucy0+aHJlZiwgeG1sU2NoZW1hTnMpKSB7CisJCXhtbFNjaGVtYVBJbGxlZ2FsQXR0ckVycihjdHh0LAorCQkgICAgWE1MX1NDSEVNQVBfUzRTX0FUVFJfTk9UX0FMTE9XRUQsCisJCSAgICAmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgYXR0cik7CisJICAgIH0KKwkgICAgYXR0ciA9IGF0dHItPm5leHQ7CisJfQkgICAgICAKKyAgICB9IGVsc2UgeworCWNvbnN0IHhtbENoYXIgKm5zID0gTlVMTCwgKmZpeGVkOworCisJLyoKKwkqIFBhcnNlIGFzIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24uCisJKi8KKwlpZiAoeG1sU2NoZW1hUFZhbEF0dHJOb2RlKGN0eHQsIAorCSAgICAoeG1sQ2hhciAqKikgJnhtbFNjaGVtYUVsZW1EZXNFbGVtRGVjbCwgTlVMTCwgbmFtZUF0dHIsIAorCSAgICB4bWxTY2hlbWFHZXRCdWlsdEluVHlwZShYTUxfU0NIRU1BU19OQ05BTUUpLCAmbmFtZSkgIT0gMCkKKwkgICAgcmV0dXJuIChOVUxMKTsKKwkvKiAKKwkqIEV2YWx1YXRlIHRoZSB0YXJnZXQgbmFtZXNwYWNlLgorCSovCiAJaWYgKHNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlICE9IE5VTEwpIHsKIAkgICAgaWYgKHRvcExldmVsKSB7CiAJCW5zID0gc2NoZW1hLT50YXJnZXROYW1lc3BhY2U7Ci0JICAgIH0gZWxzZSBpZiAoeG1sU2NoZW1hR2V0UHJvcChjdHh0LCBub2RlLCAiZm9ybSIpICE9IE5VTEwpIHsKLQkJaWYgKHhtbFN0ckVxdWFsKCB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJmb3JtIiksCi0JCQkJIEJBRF9DQVNUICJxdWFsaWZpZWQiKSkgeworCSAgICB9IGVsc2UgeworCQlhdHRyID0geG1sU2NoZW1hR2V0UHJvcE5vZGUobm9kZSwgImZvcm0iKTsKKwkJaWYgKGF0dHIgIT0gTlVMTCkgeworCQkgICAgYXR0clZhbHVlID0geG1sU2NoZW1hR2V0Tm9kZUNvbnRlbnQoY3R4dCwgKHhtbE5vZGVQdHIpIGF0dHIpOworCQkgICAgaWYgKHhtbFN0ckVxdWFsKGF0dHJWYWx1ZSwgQkFEX0NBU1QgInF1YWxpZmllZCIpKSB7CisJCQlucyA9IHNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlOworCQkgICAgfSBlbHNlIGlmICgheG1sU3RyRXF1YWwoYXR0clZhbHVlLCBCQURfQ0FTVCAidW5xdWFsaWZpZWQiKSkgeworCQkJeG1sU2NoZW1hUFNpbXBsZVR5cGVFcnIoY3R4dCwgCisJCQkgICAgWE1MX1NDSEVNQVBfUzRTX0FUVFJfSU5WQUxJRF9WQUxVRSwgCisJCQkgICAgKHhtbENoYXIgKiopICZ4bWxTY2hlbWFFbGVtRGVzRWxlbURlY2wsIE5VTEwsIAorCQkJICAgICh4bWxOb2RlUHRyKSBhdHRyLCAKKwkJCSAgICBYTUxfU0NIRU1BU19VTktOT1dOLCAiKHF1YWxpZmllZCB8IHVucXVhbGlmaWVkKSIsIAorCQkJICAgIGF0dHJWYWx1ZSwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCSAgICB9CisJCX0gZWxzZSBpZiAoc2NoZW1hLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1FVQUxJRl9FTEVNKQogCQkgICAgbnMgPSBzY2hlbWEtPnRhcmdldE5hbWVzcGFjZTsKLQkJfQotCSAgICB9IGVsc2UgaWYgKHNjaGVtYS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19RVUFMSUZfQVRUUikgewotCQlucyA9IHNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlOwogCSAgICB9Ci0JfQotCS8qbG9jYWwgPSB4bWxTY2hlbWFHZXROYW1lc3BhY2UoY3R4dCwgc2NoZW1hLCBub2RlLCBuYW1lLCAmbnMpOyAqLworCX0JCQkJCiAJcmV0ID0geG1sU2NoZW1hQWRkRWxlbWVudChjdHh0LCBzY2hlbWEsIG5hbWUsIG5zKTsKLQkvKiAzLjMuMyA6IDIuMQotCSAqIE9uZSBvZiByZWYgb3IgbmFtZSBtdXN0IGJlIHByZXNlbnQsIGJ1dCBub3QgYm90aCAKLQkgKi8KLQlpZiAoKCF0b3BMZXZlbCkgJiYgKHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgInJlZiIpICE9IE5VTEwpKSB7CSAgICAKLQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCBub2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1NDSEVNQVBfSU5WQUxJRF9BVFRSX0NPTUJJTkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCBkZWNsYXJhdGlvbiBoYXMgYm90aCwgXCJuYW1lXCIgYW5kICIKLQkJCSAgIlwicmVmXCJcbiIsIE5VTEwsIE5VTEwpOworCWlmIChyZXQgPT0gTlVMTCkgeworCSAgICBpZiAocmVwTmFtZSAhPSBOVUxMKQorCQl4bWxGcmVlKHJlcE5hbWUpOworCSAgICByZXR1cm4gKE5VTEwpOwogCX0KLSAgICB9Ci0gICAgaWYgKHJldCAhPSBOVUxMKQotCXJldC0+bm9kZSA9IG5vZGU7Ci0gICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgfQotICAgIHJldC0+dHlwZSA9IFhNTF9TQ0hFTUFfVFlQRV9FTEVNRU5UOwotICAgIHJldC0+cmVmID0gcmVmOwotICAgIHJldC0+cmVmTnMgPSByZWZOczsKLSAgICBpZiAocmVmICE9IE5VTEwpCi0gICAgICAgIHJldC0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfRUxFTV9SRUY7Ci0KLSAgICAvKiAzLjMuMyA6IDIuMiAqLyAgICAgCi0gICAgaWYgKCghdG9wTGV2ZWwpICYmIChyZWYgIT0gTlVMTCkpIHsKKwlyZXQtPnR5cGUgPSBYTUxfU0NIRU1BX1RZUEVfRUxFTUVOVDsKKwlyZXQtPm5vZGUgPSBub2RlOwkJCQkJCisJLyogCisJKiBDaGVjayBmb3IgaWxsZWdhbCBhdHRyaWJ1dGVzLgorCSovCiAJYXR0ciA9IG5vZGUtPnByb3BlcnRpZXM7CiAJd2hpbGUgKGF0dHIgIT0gTlVMTCkgewotCSAgICBpZiAoKGF0dHItPm5zID09IE5VTEwpICYmCi0JCSgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgInJlZiIpKSAmJiAKLQkJKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAiaWQiKSkgJiYKLQkJKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAibWF4T2NjdXJzIikpICYmIAotCQkoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJtaW5PY2N1cnMiKSkpIHsKKwkgICAgaWYgKGF0dHItPm5zID09IE5VTEwpIHsKKwkJaWYgKCgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgIm5hbWUiKSkgJiYKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgInR5cGUiKSkgJiYKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgImlkIikpICYmCQkKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgImRlZmF1bHQiKSkgJiYKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgImZpeGVkIikpICYmCQkKKwkJICAgICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgImJsb2NrIikpICYmCisJCSAgICAoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJuaWxsYWJsZSIpKSkgeworCQkgICAgaWYgKHRvcExldmVsID09IDApIHsgCisJCQlpZiAoeG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgInN1YnN0aXR1dGlvbkdyb3VwIikpIHsKKwkJCSAgICAvKgorCQkJICAgICogMy4zLjYgOiAzIElmIHRoZXJlIGlzIGEgbm9uLbdhYnNlbnS3IHtzdWJzdGl0dXRpb24gCisJCQkgICAgKiBncm91cCBhZmZpbGlhdGlvbn0sIHRoZW4ge3Njb3BlfSBtdXN0IGJlIGdsb2JhbC4KKwkJCSAgICAqIFRPRE86IFRoaXMgb25lIGlzIHJlZHVuZGFudCwgc2luY2UgdGhlIFM0UyBkb2VzIAorCQkJICAgICogcHJvaGliaXQgdGhpcyBhdHRyaWJ1dGUgb24gbG9jYWwgZGVjbGFyYXRpb25zIGFscmVhZHk7IAorCQkJICAgICogc28gd2h5IGFuIGV4cGxpY2l0IGVycm9yIGNvZGU/IFdlaXJkIHNwZWMuCisJCQkgICAgKi8KKwkJCSAgICB4bWxTY2hlbWFQSWxsZWdhbEF0dHJFcnIoY3R4dCwKKwkJCQlYTUxfU0NIRU1BUF9FX1BST1BTX0NPUlJFQ1RfMywKKwkJCQkmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgYXR0cik7IAkJCQkJCQorCQkJfSBlbHNlIGlmICgoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJtYXhPY2N1cnMiKSkgJiYKKwkJCSAgICAoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJtaW5PY2N1cnMiKSkgJiYKKwkJCSAgICAoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJmb3JtIikpKSB7CiAKLQkJeG1sU2NoZW1hUEVycihjdHh0LCBub2RlLCBYTUxfU0NIRU1BUF9JTlZBTElEX0FUVFJfQ09NQklOQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IGRlY2xhcmF0aW9uICVzOiBvbmx5IG1pbk9jY3VycywgbWF4T2NjdXJzICIKLQkJICAgICAgICJhbmQgaWQgYXJlIGFsbG93ZWQgaW4gYWRkaXRpb24gdG8gcmVmXG4iLAotCQkgICAgICAgcmV0LT5uYW1lLCBOVUxMKTsKKwkJCSAgICB4bWxTY2hlbWFQSWxsZWdhbEF0dHJFcnIoY3R4dCwKKwkJCSAgICBYTUxfU0NIRU1BUF9TNFNfQVRUUl9OT1RfQUxMT1dFRCwKKwkJCSAgICAmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgYXR0cik7CisJCQl9CisJCSAgICB9IGVsc2UgaWYgKCgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgImZpbmFsIikpICYmIAorCQkJKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAiYWJzdHJhY3QiKSkgJiYgCisJCQkoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJzdWJzdGl0dXRpb25Hcm91cCIpKSkgeworCisJCQl4bWxTY2hlbWFQSWxsZWdhbEF0dHJFcnIoY3R4dCwKKwkJCSAgICBYTUxfU0NIRU1BUF9TNFNfQVRUUl9OT1RfQUxMT1dFRCwKKwkJCSAgICAmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgYXR0cik7CQkgICAgCisJCSAgICB9CisJCX0KKwkgICAgfSBlbHNlIGlmICh4bWxTdHJFcXVhbChhdHRyLT5ucy0+aHJlZiwgeG1sU2NoZW1hTnMpKSB7CisJCQorCQl4bWxTY2hlbWFQSWxsZWdhbEF0dHJFcnIoY3R4dCwKKwkJICAgIFhNTF9TQ0hFTUFQX1M0U19BVFRSX05PVF9BTExPV0VELAorCQkgICAgJnJlcE5hbWUsICh4bWxTY2hlbWFUeXBlUHRyKSByZXQsIGF0dHIpOwogCSAgICB9CiAJICAgIGF0dHIgPSBhdHRyLT5uZXh0OwotCX0KLSAgICB9Ci0KLSAgICBpZiAodG9wTGV2ZWwpIHsKLSAgICAgICAgcmV0LT5mbGFncyB8PSBYTUxfU0NIRU1BU19FTEVNX0dMT0JBTDsKLSAgICAgICAgcmV0LT5mbGFncyB8PSBYTUxfU0NIRU1BU19FTEVNX1RPUExFVkVMOwotICAgIH0KLSAgICBpZiAoeG1sR2V0Qm9vbGVhblByb3AoY3R4dCwgbm9kZSwgIm5pbGxhYmxlIiwgMCkpCi0gICAgICAgIHJldC0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfRUxFTV9OSUxMQUJMRTsKLSAgICBpZiAoeG1sR2V0Qm9vbGVhblByb3AoY3R4dCwgbm9kZSwgImFic3RyYWN0IiwgMCkpCi0gICAgICAgIHJldC0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfRUxFTV9BQlNUUkFDVDsKLSAgICBjdHh0LT5jb250YWluZXIgPSBuYW1lOwotCi0gICAgcmV0LT5pZCA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgImlkIik7Ci0gICAgcmV0LT5uYW1lZFR5cGUgPQotICAgICAgICB4bWxHZXRRTmFtZVByb3AoY3R4dCwgbm9kZSwgInR5cGUiLCAmKHJldC0+bmFtZWRUeXBlTnMpKTsgCi0gICAgcmV0LT5zdWJzdEdyb3VwID0KLSAgICAgICAgeG1sR2V0UU5hbWVQcm9wKGN0eHQsIG5vZGUsICJzdWJzdGl0dXRpb25Hcm91cCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHJldC0+c3Vic3RHcm91cE5zKSk7Ci0gICAgaWYgKChyZXQtPnN1YnN0R3JvdXAgIT0gTlVMTCkgJiYgKCF0b3BMZXZlbCkpIHsKLQkvKiAzLjMuNiA6IDMgKi8KKwl9CQkKIAkvKgotCSAqIFRPRE86IFRoaXMgc2VlbXMgdG8gYmUgcmVkdW5kYW50LCBzaW5jZSB0aGUgc2NoZW1hIGZvciBzY2hlbWFzCi0JICogYWxyZWFkeSBwcm9oaWJpdHMgdGhlIHVzZSBvZiB0aGUgInN1YnN0aXR1dGlvbkdyb3VwIiBhdHRyaWJ1dGUKLQkgKiBpbiBsb2NhbCBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLQkgKi8KLSAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBub2RlLCBYTUxfU0NIRU1BUF9JTlZBTElEX0FUVFJfQ09NQklOQVRJT04sCi0JICAgICAgICAgICAgICAiRWxlbWVudCBkZWNsYXJhdGlvbiAlczogc3Vic3RpdHV0aW9uR3JvdXAgaXMgYWxsb3dlZCAiCi0JCSAgICAgICJvbiB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zIG9ubHlcbiIsIHJldC0+bmFtZSwgTlVMTCk7Ci0JCi0gICAgfQotICAgIGZpeGVkID0geG1sU2NoZW1hR2V0UHJvcChjdHh0LCBub2RlLCAiZml4ZWQiKTsKLSAgICByZXQtPm1pbk9jY3VycyA9IHhtbEdldE1pbk9jY3VycyhjdHh0LCBub2RlKTsKLSAgICByZXQtPm1heE9jY3VycyA9IHhtbEdldE1heE9jY3VycyhjdHh0LCBub2RlKTsKKwkqIEV4dHJhY3QvdmFsaWRhdGUgYXR0cmlidXRlcy4KKwkqLworCWlmICh0b3BMZXZlbCkgeworCSAgICAvKiAKKwkgICAgKiBQcm9jZXNzIHRvcCBhdHRyaWJ1dGVzIG9mIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9ucyBoZXJlLgorCSAgICAqLworCSAgICByZXQtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0VMRU1fR0xPQkFMOworCSAgICByZXQtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0VMRU1fVE9QTEVWRUw7CisJICAgIHhtbFNjaGVtYVBWYWxBdHRyUU5hbWUoY3R4dCwgc2NoZW1hLCAmcmVwTmFtZSwgCisJCSh4bWxTY2hlbWFUeXBlUHRyKSByZXQsIG5vZGUsICJzdWJzdGl0dXRpb25Hcm91cCIsIAorCQkmKHJldC0+c3Vic3RHcm91cE5zKSwgTlVMTCwgJihyZXQtPnN1YnN0R3JvdXApKTsKKwkgICAgaWYgKHhtbEdldEJvb2xlYW5Qcm9wKGN0eHQsICZyZXBOYW1lLCAoeG1sU2NoZW1hVHlwZVB0cikgcmV0LCAgCisJCW5vZGUsICJhYnN0cmFjdCIsIDApKQorCQlyZXQtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0VMRU1fQUJTVFJBQ1Q7IAorCSAgICAvKgorCSAgICAqIEF0dHJpYnV0ZSAiZmluYWwiLgorCSAgICAqLworCSAgICBhdHRyID0geG1sU2NoZW1hR2V0UHJvcE5vZGUobm9kZSwgImZpbmFsIik7CSAgICAKKwkgICAgaWYgKGF0dHIgPT0gTlVMTCkgeworCQlyZXQtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0VMRU1fRklOQUxfQUJTRU5UOworCSAgICB9IGVsc2UgeworCQlhdHRyVmFsdWUgPSB4bWxTY2hlbWFHZXROb2RlQ29udGVudChjdHh0LCAoeG1sTm9kZVB0cikgYXR0cik7CSAgICAKKwkJaWYgKHhtbFNjaGVtYVBWYWxBdHRyQmxvY2tGaW5hbChhdHRyVmFsdWUsICYocmV0LT5mbGFncyksIAorCQkgICAgLTEsCisJCSAgICBYTUxfU0NIRU1BU19FTEVNX0ZJTkFMX0VYVEVOU0lPTiwKKwkJICAgIFhNTF9TQ0hFTUFTX0VMRU1fRklOQUxfUkVTVFJJQ1RJT04sIC0xLCAtMSwgLTEpICE9IDApIHsKKwkJICAgIHhtbFNjaGVtYVBTaW1wbGVUeXBlRXJyKGN0eHQsIAorCQkJWE1MX1NDSEVNQVBfUzRTX0FUVFJfSU5WQUxJRF9WQUxVRSwKKwkJCSZyZXBOYW1lLCAoeG1sU2NoZW1hVHlwZVB0cikgcmV0LCAoeG1sTm9kZVB0cikgYXR0ciwgCisJCQlYTUxfU0NIRU1BU19VTktOT1dOLCAiKCNhbGwgfCBMaXN0IG9mIChleHRlbnNpb24gfCByZXN0cmljdGlvbikpIiwgCisJCQlhdHRyVmFsdWUsIE5VTEwsIE5VTEwsIE5VTEwpOworCQl9CisJICAgIH0KKwl9ICAgIAorCS8qCisJKiBBdHRyaWJ1dGUgImJsb2NrIi4KKwkqLworCWF0dHIgPSB4bWxTY2hlbWFHZXRQcm9wTm9kZShub2RlLCAiYmxvY2siKTsJCisJaWYgKGF0dHIgPT0gTlVMTCkgeworCSAgICByZXQtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0VMRU1fQkxPQ0tfQUJTRU5UOworCX0gZWxzZSB7CisJICAgIGF0dHJWYWx1ZSA9IHhtbFNjaGVtYUdldE5vZGVDb250ZW50KGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyKTsJICAgIAorCSAgICBpZiAoeG1sU2NoZW1hUFZhbEF0dHJCbG9ja0ZpbmFsKGF0dHJWYWx1ZSwgJihyZXQtPmZsYWdzKSwgCisJCS0xLAorCQlYTUxfU0NIRU1BU19FTEVNX0JMT0NLX0VYVEVOU0lPTiwKKwkJWE1MX1NDSEVNQVNfRUxFTV9CTE9DS19SRVNUUklDVElPTiwgCisJCVhNTF9TQ0hFTUFTX0VMRU1fQkxPQ0tfU1VCU1RJVFVUSU9OLCAtMSwgLTEpICE9IDApIHsKKwkJeG1sU2NoZW1hUFNpbXBsZVR5cGVFcnIoY3R4dCwKKwkJICAgIFhNTF9TQ0hFTUFQX1M0U19BVFRSX0lOVkFMSURfVkFMVUUsCisJCSAgICAmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgKHhtbE5vZGVQdHIpIGF0dHIsCisJCSAgICBYTUxfU0NIRU1BU19VTktOT1dOLCAiKCNhbGwgfCBMaXN0IG9mIChleHRlbnNpb24gfCAiCisJCSAgICAicmVzdHJpY3Rpb24gfCBzdWJzdGl0dXRpb24pKSIsIGF0dHJWYWx1ZSwgCisJCSAgICBOVUxMLCBOVUxMLCBOVUxMKTsJCQorCSAgICB9CisJfQorCWlmICh4bWxHZXRCb29sZWFuUHJvcChjdHh0LCAmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgCisJICAgIG5vZGUsICJuaWxsYWJsZSIsIDApKQorCSAgICByZXQtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0VMRU1fTklMTEFCTEU7CQogCi0gICAgcmV0LT52YWx1ZSA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgImRlZmF1bHQiKTsKLSAgICBpZiAoKHJldC0+dmFsdWUgIT0gTlVMTCkgJiYgKGZpeGVkICE9IE5VTEwpKSB7Ci0JLyogMy4zLjMgOiAxIAotCSAqIGRlZmF1bHQgYW5kIGZpeGVkIG11c3Qgbm90IGJvdGggYmUgcHJlc2VudC4gCi0JICovCi0gICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLCBYTUxfU0NIRU1BUF9FTEVNX0RFRkFVTFRfRklYRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50ICVzIGhhcyBib3RoIGRlZmF1bHQgYW5kIGZpeGVkXG4iLAotCQkgICAgICAgcmV0LT5uYW1lLCBOVUxMKTsKLSAgICB9IGVsc2UgaWYgKGZpeGVkICE9IE5VTEwpIHsKLSAgICAgICAgcmV0LT5mbGFncyB8PSBYTUxfU0NIRU1BU19FTEVNX0ZJWEVEOwotICAgICAgICByZXQtPnZhbHVlID0gZml4ZWQ7Ci0gICAgfQorCXhtbFNjaGVtYVBWYWxBdHRyUU5hbWUoY3R4dCwgc2NoZW1hLCAKKwkgICAgJnJlcE5hbWUsICh4bWxTY2hlbWFUeXBlUHRyKSByZXQsIG5vZGUsIAorCSAgICAidHlwZSIsICYocmV0LT5uYW1lZFR5cGVOcyksIE5VTEwsICYocmV0LT5uYW1lZFR5cGUpKTsKIAorCXJldC0+dmFsdWUgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJkZWZhdWx0Iik7ICAgIAorCWF0dHIgPSB4bWxTY2hlbWFHZXRQcm9wTm9kZShub2RlLCAiZml4ZWQiKTsJCisJaWYgKGF0dHIgIT0gTlVMTCkgeworCSAgICBmaXhlZCA9IHhtbFNjaGVtYUdldE5vZGVDb250ZW50KGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyKTsKKwkgICAgaWYgKHJldC0+dmFsdWUgIT0gTlVMTCkgeworCQkvKiAKKwkJKiAzLjMuMyA6IDEgCisJCSogZGVmYXVsdCBhbmQgZml4ZWQgbXVzdCBub3QgYm90aCBiZSBwcmVzZW50LiAKKwkJKi8KKwkJeG1sU2NoZW1hUE11dHVhbEV4Y2xBdHRyRXJyKGN0eHQsCisJCSAgICBYTUxfU0NIRU1BUF9TUkNfRUxFTUVOVF8xLAorCQkgICAgJnJlcE5hbWUsICh4bWxTY2hlbWFUeXBlUHRyKSByZXQsIGF0dHIsCisJCSAgICAiZGVmYXVsdCIsICJmaXhlZCIpOworCSAgICB9IGVsc2UgeworCQlyZXQtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0VMRU1fRklYRUQ7CisJCXJldC0+dmFsdWUgPSBmaXhlZDsKKwkgICAgfQorCX0JCisgICAgfSAgICAgCisgICAgLyoKKyAgICAqIEV4dHJhY3QvdmFsaWRhdGUgY29tbW9uIGF0dHJpYnV0ZXMuCisgICAgKi8gICAgCisgICAgLyogVE9ETzogQ2hlY2sgSUQ6ICovCisgICAgcmV0LT5pZCA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgImlkIik7CisgICAgcmV0LT5taW5PY2N1cnMgPSBtaW5PY2N1cnM7CisgICAgcmV0LT5tYXhPY2N1cnMgPSBtYXhPY2N1cnM7IAorICAgIGlmICgodG9wTGV2ZWwgIT0gMSkgJiYgKHJldC0+bWF4T2NjdXJzICE9IFVOQk9VTkRFRCkpIHsKKwkvKgorCSogVE9ETzogTWFieSB3ZSBzaG91bGQgYmV0dGVyIG5vdCBjcmVhdGUgdGhlIGVsZW1lbnQvcGFydGljbGUsIAorCSogaWYgbWluL21heCBpcyBpbnZhbGlkLCBzaW5jZSBpdCBjb3VsZCBjb25mdXNlIHRoZSBidWlsZCBvZiB0aGUgCisJKiBjb250ZW50IG1vZGVsLgorCSovCisJLyogCisJKiAzLjkuNiBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IFBhcnRpY2xlIENvcnJlY3QKKwkqCisJKi8KKwlpZiAobWF4T2NjdXJzIDwgMSkgeyAKKwkgICAgLyogCisJICAgICogMi4yIHttYXggb2NjdXJzfSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLgorCSAgICAqLworCSAgICB4bWxTY2hlbWFQQ3VzdG9tQXR0ckVycihjdHh0LAorCQlYTUxfU0NIRU1BUF9QX1BST1BTX0NPUlJFQ1RfMl8yLAorCQkmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgCisJCXhtbFNjaGVtYUdldFByb3BOb2RlKG5vZGUsICJtYXhPY2N1cnMiKSwKKwkJIlRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIik7CisJfSBlbHNlIGlmIChtaW5PY2N1cnMgPiBtYXhPY2N1cnMpIHsKKwkgICAgLyoKKwkgICAgKiAyLjEge21pbiBvY2N1cnN9IG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB7bWF4IG9jY3Vyc30uCisJICAgICovCisJICAgIHhtbFNjaGVtYVBDdXN0b21BdHRyRXJyKGN0eHQsCisJCVhNTF9TQ0hFTUFQX1BfUFJPUFNfQ09SUkVDVF8yXzEsIAorCQkmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgCisJCXhtbFNjaGVtYUdldFByb3BOb2RlKG5vZGUsICJtaW5PY2N1cnMiKSwKKwkJIlRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mICdtYXhPY2N1cnMnIik7CisJfQorICAgIH0JCisgICAgCisgICAgLyoKKyAgICAqIEFuZCBub3cgZm9yIHRoZSBjaGlsZHJlbi4uLgorICAgICovCisgICAgY3R4dC0+Y29udGFpbmVyID0gbmFtZTsKICAgICBjaGlsZCA9IG5vZGUtPmNoaWxkcmVuOwogICAgIGlmIChJU19TQ0hFTUEoY2hpbGQsICJhbm5vdGF0aW9uIikpIHsKLSAgICAgICAgcmV0LT5hbm5vdCA9IHhtbFNjaGVtYVBhcnNlQW5ub3RhdGlvbihjdHh0LCBzY2hlbWEsIGNoaWxkKTsKLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKKwlyZXQtPmFubm90ID0geG1sU2NoZW1hUGFyc2VBbm5vdGF0aW9uKGN0eHQsIHNjaGVtYSwgY2hpbGQpOworCWNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgfQotICAgIAotICAgIGlmIChyZWYgIT0gTlVMTCkgewotCS8qIDMuMy4zICgyLjIpICovIAotCXdoaWxlIChjaGlsZCAhPSBOVUxMKSB7Ci0JICAgIGlmICgoSVNfU0NIRU1BKGNoaWxkLCAiY29tcGxleFR5cGUiKSkgfHwKLQkJKElTX1NDSEVNQShjaGlsZCwgInNpbXBsZVR5cGUiKSkgfHwKLQkJKElTX1NDSEVNQShjaGlsZCwgInVuaXF1ZSIpKSB8fAotCSAgICAgICAgKElTX1NDSEVNQShjaGlsZCwgImtleSIpKSB8fCAKLQkJKElTX1NDSEVNQShjaGlsZCwgImtleXJlZiIpKSkgewotCi0JCXhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLCBYTUxfU0NIRU1BUF9SRUZfQU5EX0NPTlRFTlQsCi0JCSAgICAgICAgICAgICAgICJFbGVtZW50IGRlY2xhcmF0aW9uICVzOiBvbmx5IGFubm90YXRpb24gaXMgIgotCQkJICAgICAgICJhbGxvd2VkIGFzIGNvbnRlbnQgaW4gYWRkaXRpb24gdG8gcmVmXG4iLAotCQkJICAgICAgIHJldC0+bmFtZSwgTlVMTCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLCBYTUxfU0NIRU1BUF9VTktOT1dOX0VMRU1fQ0hJTEQsCi0JCSAgICAgICAgICAgImVsZW1lbnQgJXMgaGFzIHVuZXhwZWN0ZWQgY29udGVudFxuIiwgbmFtZSwgTlVMTCk7Ci0JICAgIH0KLQkgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKKyAgICBpZiAoaXNSZWYpIHsKKwlpZiAoY2hpbGQgIT0gTlVMTCkgeworCSAgICB4bWxTY2hlbWFQQ29udGVudEVycihjdHh0LAorCQlYTUxfU0NIRU1BUF9TUkNfRUxFTUVOVF8yXzIsCisJCSZyZXBOYW1lLCAoeG1sU2NoZW1hVHlwZVB0cikgcmV0LCBub2RlLCBjaGlsZCwgCisJCU5VTEwsICIoYW5ub3RhdGlvbj8pIik7CiAJfQotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlIHsJCQkKIAlpZiAoSVNfU0NIRU1BKGNoaWxkLCAiY29tcGxleFR5cGUiKSkgewotCSAgICAvKiAzLjMuMyA6IDMgCi0JICAgICAqIHR5cGUgYW5kIGVpdGhlciA8c2ltcGxlVHlwZT4gb3IgPGNvbXBsZXhUeXBlPiBhcmUgbXV0dWFsbHkKLQkgICAgICogZXhjbHVzaXZlIAotCSAgICAgKi8KKwkgICAgLyogCisJICAgICogMy4zLjMgOiAzIAorCSAgICAqICJ0eXBlIiBhbmQgZWl0aGVyIDxzaW1wbGVUeXBlPiBvciA8Y29tcGxleFR5cGU+IGFyZSBtdXR1YWxseQorCSAgICAqIGV4Y2x1c2l2ZSAKKwkgICAgKi8KIAkgICAgaWYgKHJldC0+bmFtZWRUeXBlICE9IE5VTEwpIHsKLQkJeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsCi0JCQkgICAgICAgWE1MX1NDSEVNQVBfSU5WQUxJRF9BVFRSX0lOTElORV9DT01CSU5BVElPTiwKLQkJICAgICAgICAgICAgICAgIkVsZW1lbnQgZGVjbGFyYXRpb24gJXMgaGFzIGJvdGggXCJ0eXBlXCIgIgotCQkJICAgICAgICJhbmQgYSBsb2NhbCBjb21wbGV4IHR5cGVcbiIsCi0JCQkgICAgICAgcmV0LT5uYW1lLCBOVUxMKTsKKwkJeG1sU2NoZW1hUENvbnRlbnRFcnIoY3R4dCwKKwkJICAgIFhNTF9TQ0hFTUFQX1NSQ19FTEVNRU5UXzMsCisJCSAgICAmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgbm9kZSwgY2hpbGQsIAorCQkgICAgIlRoZSBhdHRyaWJ1dGUgJ3R5cGUnIGFuZCB0aGUgPGNvbXBsZXhUeXBlPiBjaGlsZCBhcmUgIgorCQkgICAgIm11dHVhbGx5IGV4Y2x1c2l2ZSIsIE5VTEwpOwkJCiAJICAgIH0gZWxzZQogCQlyZXQtPnN1YnR5cGVzID0geG1sU2NoZW1hUGFyc2VDb21wbGV4VHlwZShjdHh0LCBzY2hlbWEsIGNoaWxkLCAwKTsKIAkgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKIAl9IGVsc2UgaWYgKElTX1NDSEVNQShjaGlsZCwgInNpbXBsZVR5cGUiKSkgewotCSAgICAvKiAzLjMuMyA6IDMgCi0JICAgICAqIHR5cGUgYW5kIGVpdGhlciA8c2ltcGxlVHlwZT4gb3IgPGNvbXBsZXhUeXBlPiBhcmUKLQkgICAgICogbXV0dWFsbHkgZXhjbHVzaXZlIAotCSAgICAgKi8KKwkgICAgLyogCisJICAgICogMy4zLjMgOiAzIAorCSAgICAqICJ0eXBlIiBhbmQgZWl0aGVyIDxzaW1wbGVUeXBlPiBvciA8Y29tcGxleFR5cGU+IGFyZQorCSAgICAqIG11dHVhbGx5IGV4Y2x1c2l2ZSAKKwkgICAgKi8KIAkgICAgaWYgKHJldC0+bmFtZWRUeXBlICE9IE5VTEwpIHsKLQkJeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsCi0JCQkgICAgICAgWE1MX1NDSEVNQVBfSU5WQUxJRF9BVFRSX0lOTElORV9DT01CSU5BVElPTiwKLQkJICAgICAgICAgICAgICAgIkVsZW1lbnQgZGVjbGFyYXRpb24gJXMgaGFzIGJvdGggXCJ0eXBlXCIgIgotCQkJICAgICAgICJhbmQgYSBsb2NhbCBzaW1wbGUgdHlwZVxuIiwKLQkJCSAgICAgICByZXQtPm5hbWUsIE5VTEwpOworCQl4bWxTY2hlbWFQQ29udGVudEVycihjdHh0LAorCQkgICAgWE1MX1NDSEVNQVBfU1JDX0VMRU1FTlRfMywKKwkJICAgICZyZXBOYW1lLCAoeG1sU2NoZW1hVHlwZVB0cikgcmV0LCBub2RlLCBjaGlsZCwgCisJCSAgICAiVGhlIGF0dHJpYnV0ZSAndHlwZScgYW5kIHRoZSA8c2ltcGxlVHlwZT4gY2hpbGQgYXJlICIKKwkJICAgICJtdXR1YWxseSBleGNsdXNpdmUiLCBOVUxMKTsJCQkJCiAJICAgIH0gZWxzZQogCQlyZXQtPnN1YnR5cGVzID0geG1sU2NoZW1hUGFyc2VTaW1wbGVUeXBlKGN0eHQsIHNjaGVtYSwgY2hpbGQsIDApOwogCSAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwotCX0KLSAgICAKKwl9CQogCXdoaWxlICgoSVNfU0NIRU1BKGNoaWxkLCAidW5pcXVlIikpIHx8Ci0JICAgICAgIChJU19TQ0hFTUEoY2hpbGQsICJrZXkiKSkgfHwgKElTX1NDSEVNQShjaGlsZCwgImtleXJlZiIpKSkgeworCSAgICAoSVNfU0NIRU1BKGNoaWxkLCAia2V5IikpIHx8IChJU19TQ0hFTUEoY2hpbGQsICJrZXlyZWYiKSkpIHsKIAkgICAgVE9ETyBjaGlsZCA9IGNoaWxkLT5uZXh0OwogCX0KIAlpZiAoY2hpbGQgIT0gTlVMTCkgewotCSAgICB4bWxTY2hlbWFQRXJyMihjdHh0LCBub2RlLCBjaGlsZCwgWE1MX1NDSEVNQVBfVU5LTk9XTl9FTEVNX0NISUxELAotCQkgICAgICAgICAgICJlbGVtZW50ICVzIGhhcyB1bmV4cGVjdGVkIGNvbnRlbnRcbiIsIG5hbWUsIE5VTEwpOwotCX0KLSAgICB9CisJICAgIHhtbFNjaGVtYVBDb250ZW50RXJyKGN0eHQsCisJCVhNTF9TQ0hFTUFQX1M0U19FTEVNX05PVF9BTExPV0VELAorCQkmcmVwTmFtZSwgKHhtbFNjaGVtYVR5cGVQdHIpIHJldCwgbm9kZSwgY2hpbGQsIAorCQlOVUxMLCAiKGFubm90YXRpb24/LCAoKHNpbXBsZVR5cGUgfCBjb21wbGV4VHlwZSk/LCAiCisJCSIodW5pcXVlIHwga2V5IHwga2V5cmVmKSopKSIpOworCX0JCQogCisgICAgfQogICAgIGN0eHQtPmNvbnRhaW5lciA9IG9sZGNvbnRhaW5lcjsKKyAgICAvKgorICAgICogQ2xlYW51cC4KKyAgICAqLworICAgIGlmIChyZXBOYW1lICE9IE5VTEwpCisJeG1sRnJlZShyZXBOYW1lKTsgICAgCisgICAgLyoKKyAgICAqIE5PVEU6IEVsZW1lbnQgRGVjbGFyYXRpb24gUmVwcmVzZW50YXRpb24gT0sgNC4gd2lsbCBiZSBjaGVja2VkIGF0IGEgCisgICAgKiBkaWZmZXJlbnQgbGF5ZXIuCisgICAgKi8KICAgICByZXR1cm4gKHJldCk7CiB9CiAKQEAgLTMxODEsNyArNTExOCw3IEBACiAgICAgfQogICAgIGlmIChjaGlsZCAhPSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLCBYTUxfU0NIRU1BUF9VTktOT1dOX1VOSU9OX0NISUxELAotICAgICAgICAgICAgICAgICAgICAgICAiVW5pb24gJXMgaGFzIHVuZXhwZWN0ZWQgY29udGVudFxuIiwgdHlwZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjx1bmlvbj4gaGFzIHVuZXhwZWN0ZWQgY29udGVudC5cbiIsIHR5cGUtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIH0KICAgICByZXR1cm4gKHR5cGUpOwpAQCAtMzIwNiw3ICs1MTQzLDYgQEAKICAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGUsIHN1YnR5cGU7CiAgICAgeG1sTm9kZVB0ciBjaGlsZCA9IE5VTEw7CiAgICAgeG1sQ2hhciBuYW1lWzMwXTsKLSAgICB4bWxBdHRyUHRyIGF0dHI7CiAKICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHNjaGVtYSA9PSBOVUxMKSB8fCAobm9kZSA9PSBOVUxMKSkKICAgICAgICAgcmV0dXJuIChOVUxMKTsKQEAgLTMyMjQsMTYgKzUxNjAsOCBAQAogICAgICAgICB0eXBlLT5hbm5vdCA9IHhtbFNjaGVtYVBhcnNlQW5ub3RhdGlvbihjdHh0LCBzY2hlbWEsIGNoaWxkKTsKICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICB9Ci0gICAgLyoKLSAgICAqIENoZWNrIHR5cGUgb2YgIml0ZW1UeXBlIi4gCi0gICAgKi8KLSAgICBhdHRyID0geG1sU2NoZW1hR2V0UHJvcE5vZGUobm9kZSwgQkFEX0NBU1QgIml0ZW1UeXBlIik7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotCXR5cGUtPmJhc2UgPSB4bWxHZXRRTmFtZVByb3AoY3R4dCwgbm9kZSwgIml0ZW1UeXBlIiwgJih0eXBlLT5iYXNlTnMpKTsKLQl4bWxTY2hlbWFQYXJzZVNjaGVtYUF0dHJWYWx1ZShjdHh0LCBhdHRyLCAKLQkgICAgeG1sU2NoZW1hR2V0QnVpbHRJblR5cGUoWE1MX1NDSEVNQVNfUU5BTUUpKTsKLQkKLSAgICB9ICAgIAorICAgIHhtbFNjaGVtYVBWYWxBdHRyUU5hbWUoY3R4dCwgc2NoZW1hLCBOVUxMLCBOVUxMLAorCW5vZGUsICJpdGVtVHlwZSIsICYodHlwZS0+YmFzZU5zKSwgTlVMTCwgJih0eXBlLT5iYXNlKSk7CQogICAgIHN1YnR5cGUgPSBOVUxMOwogICAgIGlmIChJU19TQ0hFTUEoY2hpbGQsICJzaW1wbGVUeXBlIikpIHsJCiAJc3VidHlwZSA9ICh4bWxTY2hlbWFUeXBlUHRyKQpAQCAtMzI0OCw3ICs1MTc2LDcgQEAKICAgICB9CiAgICAgaWYgKGNoaWxkICE9IE5VTEwpIHsKICAgICAgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsIFhNTF9TQ0hFTUFQX1VOS05PV05fTElTVF9DSElMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIkxpc3QgJXMgaGFzIHVuZXhwZWN0ZWQgY29udGVudFxuIiwgdHlwZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjxsaXN0PiBoYXMgdW5leHBlY3RlZCBjb250ZW50LlxuIiwgdHlwZS0+bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgfQogICAgIHJldHVybiAodHlwZSk7CkBAIC0zMjY0LDcgKzUxOTIsNyBAQAogICogKldBUk5JTkcqIHRoaXMgaW50ZXJmYWNlIGlzIGhpZ2hseSBzdWJqZWN0IHRvIGNoYW5nZQogICoKICAqIFJldHVybnMgLTEgaW4gY2FzZSBvZiBlcnJvciwgMCBpZiB0aGUgZGVjbGFyYXRpb24gaXMgaW1wcm9wZXIgYW5kCi0gKiAgICAgICAgIDEgaW4gY2FzZSBvZiBzdWNjZXNzLgorICogMSBpbiBjYXNlIG9mIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyB4bWxTY2hlbWFUeXBlUHRyCiB4bWxTY2hlbWFQYXJzZVNpbXBsZVR5cGUoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LCB4bWxTY2hlbWFQdHIgc2NoZW1hLApAQCAtMzI3Miw5NSArNTIwMCwxMjQgQEAKIHsKICAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGUsIHN1YnR5cGUsIGN0eHRUeXBlOwogICAgIHhtbE5vZGVQdHIgY2hpbGQgPSBOVUxMOwotICAgIGNvbnN0IHhtbENoYXIgKnByb3BWYWw7CisgICAgY29uc3QgeG1sQ2hhciAqYXR0clZhbHVlID0gTlVMTDsKKyAgICB4bWxDaGFyICpyZXBOYW1lID0gTlVMTDsKKyAgICB4bWxBdHRyUHRyIGF0dHI7CiAKICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHNjaGVtYSA9PSBOVUxMKSB8fCAobm9kZSA9PSBOVUxMKSkKICAgICAgICAgcmV0dXJuIChOVUxMKTsKIAotICAgIGN0eHRUeXBlID0gY3R4dC0+Y3R4dFR5cGU7Ci0gICAgcHJvcFZhbCA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgIm5hbWUiKTsKLSAgICBpZiAocHJvcFZhbCA9PSBOVUxMKSB7Ci0gICAgICAgIGNoYXIgYnVmWzEwMF07CisgICAgYXR0ciA9IHhtbFNjaGVtYUdldFByb3BOb2RlKG5vZGUsICJuYW1lIik7CiAKLSAgICAgICAgc25wcmludGYoYnVmLCA5OSwgInNpbXBsZVR5cGUgJWQiLCBjdHh0LT5jb3VudGVyKysgKyAxKTsKLQl0eXBlID0geG1sU2NoZW1hQWRkVHlwZShjdHh0LCBzY2hlbWEsIChjb25zdCB4bWxDaGFyICopYnVmLCBOVUxMKTsKLSAgICB9IGVsc2UgewkKLQlpZiAoIXRvcExldmVsKSB7Ci0JICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgbm9kZSwgCi0JCVhNTF9TQ0hFTUFQX1M0U19BVFRSX05PVF9BTExPV0VELAotCQkiVGhlIGF0dHJpYnV0ZSBcIm5hbWVcIiBpcyBub3QgYWxsb3dlZCBvbiBhIGxvY2FsICIKLQkJInNpbXBsZVR5cGUgZGVmaW5pdGlvblxuIiwKLQkJcHJvcFZhbCwgTlVMTCk7CisgICAgaWYgKHRvcExldmVsKSB7CisJaWYgKGF0dHIgPT0gTlVMTCkgeworCSAgICB4bWxTY2hlbWFQTWlzc2luZ0F0dHJFcnIoY3R4dCwgCisJCVhNTF9TQ0hFTUFQX1M0U19BVFRSX01JU1NJTkcsIAorCQkoeG1sQ2hhciAqKikgJnhtbFNjaGVtYUVsZW1EZXNBdHRyRGVjbCwgTlVMTCwgbm9kZSwKKwkJIm5hbWUiLCBOVUxMKTsKKwkgICAgcmV0dXJuIChOVUxMKTsKKwl9IGVsc2UgaWYgKHhtbFNjaGVtYVBWYWxBdHRyTm9kZShjdHh0LCAKKwkgICAgKHhtbENoYXIgKiopICZ4bWxTY2hlbWFFbGVtRGVzQXR0ckRlY2wsIE5VTEwsIGF0dHIsIAorCSAgICB4bWxTY2hlbWFHZXRCdWlsdEluVHlwZShYTUxfU0NIRU1BU19OQ05BTUUpLCAmYXR0clZhbHVlKSAhPSAwKSB7CiAJICAgIHJldHVybiAoTlVMTCk7CiAJfQorICAgIH0KKyAgICAgICAgICAgIAorICAgIGlmICh0b3BMZXZlbCA9PSAwKSB7CisgICAgICAgIGNoYXIgYnVmWzEwMF07CisKIAkvKgotCSogIm5hbWUiIGhhcyB0byBiZSBvZiB0eXBlIE5DTmFtZS4gCi0JKiBUT0RPOiBBY3R1YWxseSB0aGlzIHNob3VsZCBiZSB2YWxpZGF0ZWQgYnkgdGhlIHNjaGVtYSBmb3Igc2NoZW1hcy4KKwkqIFBhcnNlIGFzIGxvY2FsIHNpbXBsZSB0eXBlIGRlZmluaXRpb24uCiAJKi8KLQlpZiAoeG1sU2NoZW1hUGFyc2VTY2hlbWFBdHRyVmFsdWUoY3R4dCwKLQkgICAgeG1sU2NoZW1hR2V0UHJvcE5vZGUobm9kZSwgQkFEX0NBU1QgIm5hbWUiKSwKLQkgICAgeG1sU2NoZW1hR2V0QnVpbHRJblR5cGUoWE1MX1NDSEVNQVNfTkNOQU1FKSkgIT0gMCkKLQkgICAgcmV0dXJuIChOVUxMKTsJCi0JdHlwZSA9IHhtbFNjaGVtYUFkZFR5cGUoY3R4dCwgc2NoZW1hLCBwcm9wVmFsLCBzY2hlbWEtPnRhcmdldE5hbWVzcGFjZSk7Ci0gICAgfQotICAgIGlmICh0eXBlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgdHlwZS0+bm9kZSA9IG5vZGU7Ci0gICAgdHlwZS0+dHlwZSA9IFhNTF9TQ0hFTUFfVFlQRV9TSU1QTEU7Ci0gICAgaWYgKHRvcExldmVsKSAKLSAgICAgICAgdHlwZS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfVFlQRV9HTE9CQUw7Ci0gICAgdHlwZS0+aWQgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJpZCIpOwotICAgIHByb3BWYWwgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJmaW5hbCIpOwotICAgIGlmIChwcm9wVmFsID09IE5VTEwpIHsKLQl0eXBlLT5mbGFncyB8PSBYTUxfU0NIRU1BU19UWVBFX0ZJTkFMX0RFRkFVTFQ7Ci0gICAgfSBlbHNlIHsKLQlpZiAoeG1sU3RyRXF1YWwocHJvcFZhbCwgQkFEX0NBU1QgIiNhbGwiKSkgewotCSAgICB0eXBlLT5mbGFncyB8PSBYTUxfU0NIRU1BU19UWVBFX0ZJTkFMX1JFU1RSSUNUSU9OOyAKLQkgICAgdHlwZS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfVFlQRV9GSU5BTF9VTklPTjsgCi0JICAgIHR5cGUtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX1RZUEVfRklOQUxfTElTVDsgCi0JfSBlbHNlIHsKLQkgICAgY29uc3QgeG1sQ2hhciAqZW5kLCAqY3VyID0gcHJvcFZhbDsKLQkgICAgeG1sQ2hhciAqaXRlbTsKLQkgICAgCi0JICAgIGRvIHsKLQkJd2hpbGUgKElTX0JMQU5LX0NIKCpjdXIpKQotCQkgICAgY3VyKys7Ci0JCWVuZCA9IGN1cjsKLQkJd2hpbGUgKCgqZW5kICE9IDApICYmICghKElTX0JMQU5LX0NIKCplbmQpKSkpCi0JCSAgICBlbmQrKzsKLQkJaWYgKGVuZCA9PSBjdXIpCi0JCSAgICBicmVhazsKLQkJaXRlbSA9IHhtbFN0cm5kdXAoY3VyLCBlbmQgLSBjdXIpOyAgICAJICAgIAotCQlpZiAoeG1sU3RyRXF1YWwoaXRlbSwgQkFEX0NBU1QgInJlc3RyaWN0aW9uIikpIHsKLQkJICAgIGlmICgodHlwZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX0ZJTkFMX1JFU1RSSUNUSU9OKSA9PSAwKQotCQkJdHlwZS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfVFlQRV9GSU5BTF9SRVNUUklDVElPTjsgCi0JCX0gZWxzZSBpZiAoeG1sU3RyRXF1YWwoaXRlbSwgQkFEX0NBU1QgImxpc3QiKSkgewotCQkgICAgaWYgKCh0eXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfRklOQUxfTElTVCkgPT0gMCkKLQkJCXR5cGUtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX1RZUEVfRklOQUxfTElTVDsgCi0JCX0gZWxzZSBpZiAoeG1sU3RyRXF1YWwoaXRlbSwgQkFEX0NBU1QgInVuaW9uIikpIHsKLQkJICAgIGlmICgodHlwZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX0ZJTkFMX1VOSU9OKSA9PSAwKQotCQkJdHlwZS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfVFlQRV9GSU5BTF9VTklPTjsgCi0JCX0gZWxzZSB7Ci0JCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIAotCQkJWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAotCQkJIlRoZSBhdHRyaWJ1dGUgXCJmaW5hbFwiIG9mIHR5cGUgXCIlc1wiICIKLQkJCSJoYXMgYW4gaW52YWxpZCB2YWx1ZVxuIiwKLQkJCXR5cGUtPm5hbWUsIE5VTEwpOwkJCSAgICAJCSAgICAKKyAgICAgICAgc25wcmludGYoYnVmLCA5OSwgIiNzdCAlZCIsIGN0eHQtPmNvdW50ZXIrKyArIDEpOworCXR5cGUgPSB4bWxTY2hlbWFBZGRUeXBlKGN0eHQsIHNjaGVtYSwgKGNvbnN0IHhtbENoYXIgKilidWYsIE5VTEwpOworCWlmICh0eXBlID09IE5VTEwpCisJICAgIHJldHVybiAoTlVMTCk7CisJdHlwZS0+bm9kZSA9IG5vZGU7CisJdHlwZS0+dHlwZSA9IFhNTF9TQ0hFTUFfVFlQRV9TSU1QTEU7CisJLyoKKwkqIENoZWNrIGZvciBpbGxlZ2FsIGF0dHJpYnV0ZXMuCisJKi8KKwlhdHRyID0gbm9kZS0+cHJvcGVydGllczsKKwl3aGlsZSAoYXR0ciAhPSBOVUxMKSB7CisJICAgIGlmIChhdHRyLT5ucyA9PSBOVUxMKSB7CisJCWlmICgheG1sU3RyRXF1YWwoYXR0ci0+bmFtZSwgQkFEX0NBU1QgImlkIikpIHsKKwkJICAgIHhtbFNjaGVtYVBJbGxlZ2FsQXR0ckVycihjdHh0LCAKKwkJCVhNTF9TQ0hFTUFQX1M0U19BVFRSX05PVF9BTExPV0VELCAKKwkJCSZyZXBOYW1lLCB0eXBlLCBhdHRyKTsJCSAgICAKIAkJfQotCQlpZiAoaXRlbSAhPSBOVUxMKQotCQkgICAgeG1sRnJlZShpdGVtKTsKLQkJY3VyID0gZW5kOwotCSAgICB9IHdoaWxlICgqY3VyICE9IDApOyAKKwkgICAgfSBlbHNlIGlmICh4bWxTdHJFcXVhbChhdHRyLT5ucy0+aHJlZiwgeG1sU2NoZW1hTnMpKSB7CisJCSAgICB4bWxTY2hlbWFQSWxsZWdhbEF0dHJFcnIoY3R4dCwgCisJCQlYTUxfU0NIRU1BUF9TNFNfQVRUUl9OT1RfQUxMT1dFRCwgCisJCQkmcmVwTmFtZSwgdHlwZSwgYXR0cik7CQorCSAgICB9CisJICAgIGF0dHIgPSBhdHRyLT5uZXh0OwogCX0KLSAgICB9CisgICAgfSBlbHNlIHsJCQorCS8qCisJKiBQYXJzZSBhcyBnbG9iYWwgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbi4KKwkqLwkKKwl0eXBlID0geG1sU2NoZW1hQWRkVHlwZShjdHh0LCBzY2hlbWEsIGF0dHJWYWx1ZSwgc2NoZW1hLT50YXJnZXROYW1lc3BhY2UpOworCWlmICh0eXBlID09IE5VTEwpCisJICAgIHJldHVybiAoTlVMTCk7CisJdHlwZS0+bm9kZSA9IG5vZGU7CisJdHlwZS0+dHlwZSA9IFhNTF9TQ0hFTUFfVFlQRV9TSU1QTEU7CisJdHlwZS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfVFlQRV9HTE9CQUw7CisJLyoKKwkqIENoZWNrIGZvciBpbGxlZ2FsIGF0dHJpYnV0ZXMuCisJKi8KKwlhdHRyID0gbm9kZS0+cHJvcGVydGllczsKKwl3aGlsZSAoYXR0ciAhPSBOVUxMKSB7CisJICAgIGlmIChhdHRyLT5ucyA9PSBOVUxMKSB7CisJCWlmICgoIXhtbFN0ckVxdWFsKGF0dHItPm5hbWUsIEJBRF9DQVNUICJpZCIpKSAmJgorCQkgICAgKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAibmFtZSIpKSAmJgorCQkgICAgKCF4bWxTdHJFcXVhbChhdHRyLT5uYW1lLCBCQURfQ0FTVCAiZmluYWwiKSkpeworCQkgICAgeG1sU2NoZW1hUElsbGVnYWxBdHRyRXJyKGN0eHQsIAorCQkJWE1MX1NDSEVNQVBfUzRTX0FUVFJfTk9UX0FMTE9XRUQsIAorCQkJJnJlcE5hbWUsIHR5cGUsIGF0dHIpOwkKKwkJfQorCSAgICB9IGVsc2UgaWYgKHhtbFN0ckVxdWFsKGF0dHItPm5zLT5ocmVmLCB4bWxTY2hlbWFOcykpIHsKKwkJeG1sU2NoZW1hUElsbGVnYWxBdHRyRXJyKGN0eHQsIAorCQkgICAgWE1MX1NDSEVNQVBfUzRTX0FUVFJfTk9UX0FMTE9XRUQsIAorCQkgICAgJnJlcE5hbWUsIHR5cGUsIGF0dHIpOwkKKwkgICAgfQorCSAgICBhdHRyID0gYXR0ci0+bmV4dDsKKwl9CisJLyoKKwkqIEF0dHJpYnV0ZSAiZmluYWwiLgorCSovCisJYXR0ciA9IHhtbFNjaGVtYUdldFByb3BOb2RlKG5vZGUsICJmaW5hbCIpOwkKKwlpZiAoYXR0ciA9PSBOVUxMKSB7CisJICAgIHR5cGUtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX1RZUEVfRklOQUxfREVGQVVMVDsKKwl9IGVsc2UgeworCSAgICBhdHRyVmFsdWUgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJmaW5hbCIpOworCSAgICBpZiAoeG1sU2NoZW1hUFZhbEF0dHJCbG9ja0ZpbmFsKGF0dHJWYWx1ZSwgJih0eXBlLT5mbGFncyksIAorCQktMSwgLTEsIFhNTF9TQ0hFTUFTX1RZUEVfRklOQUxfUkVTVFJJQ1RJT04sIC0xLAkgICAgCisJCVhNTF9TQ0hFTUFTX1RZUEVfRklOQUxfTElTVCwKKwkJWE1MX1NDSEVNQVNfVFlQRV9GSU5BTF9VTklPTikgIT0gMCkgeworCisJCXhtbFNjaGVtYVBTaW1wbGVUeXBlRXJyKGN0eHQsIAorCQkgICAgWE1MX1NDSEVNQVBfUzRTX0FUVFJfSU5WQUxJRF9WQUxVRSwKKwkJICAgICZyZXBOYW1lLCB0eXBlLCAoeG1sTm9kZVB0cikgYXR0ciwgCisJCSAgICBYTUxfU0NIRU1BU19VTktOT1dOLCAiKCNhbGwgfCBMaXN0IG9mIChsaXN0IHwgdW5pb24gfCByZXN0cmljdGlvbikiLCAKKwkJICAgIGF0dHJWYWx1ZSwgTlVMTCwgTlVMTCwgTlVMTCk7CisJICAgIH0KKwl9CisgICAgfSAgICAKKyAgICAvKiBUT0RPOiBDaGVjayBpZC4gKi8gICAgCisgICAgdHlwZS0+aWQgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJpZCIpOworICAgIC8qCisgICAgKiBBbmQgbm93IGZvciB0aGUgY2hpbGRyZW4uLi4KKyAgICAqLworICAgIGN0eHRUeXBlID0gY3R4dC0+Y3R4dFR5cGU7CisgICAgY3R4dC0+Y3R4dFR5cGUgPSB0eXBlOworICAgIGN0eHQtPnBhcmVudEl0ZW0gPSB0eXBlOwogICAgIGNoaWxkID0gbm9kZS0+Y2hpbGRyZW47CiAgICAgaWYgKElTX1NDSEVNQShjaGlsZCwgImFubm90YXRpb24iKSkgewogICAgICAgICB0eXBlLT5hbm5vdCA9IHhtbFNjaGVtYVBhcnNlQW5ub3RhdGlvbihjdHh0LCBzY2hlbWEsIGNoaWxkKTsKICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICB9Ci0gICAgc3VidHlwZSA9IE5VTEw7Ci0gICAgY3R4dC0+Y3R4dFR5cGUgPSB0eXBlOyAKLSAgICBjdHh0LT5wYXJlbnRJdGVtID0gdHlwZTsKKyAgICBzdWJ0eXBlID0gTlVMTDsgICAgICAgICAKICAgICBpZiAoSVNfU0NIRU1BKGNoaWxkLCAicmVzdHJpY3Rpb24iKSkgewogICAgICAgICBzdWJ0eXBlID0gKHhtbFNjaGVtYVR5cGVQdHIpCiAgICAgICAgICAgICB4bWxTY2hlbWFQYXJzZVJlc3RyaWN0aW9uKGN0eHQsIHNjaGVtYSwgY2hpbGQpOwpAQCAtMzM3NCwyMyArNTMzMSwxNSBAQAogICAgICAgICAgICAgeG1sU2NoZW1hUGFyc2VVbmlvbihjdHh0LCBzY2hlbWEsIGNoaWxkKTsKICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICB9Ci0gICAgdHlwZS0+c3VidHlwZXMgPSBzdWJ0eXBlOwotICAgIGlmIChjaGlsZCAhPSBOVUxMKSB7Ci0gICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9TNFNfRUxFTV9OT1RfQUxMT1dFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIlNpbXBsZVR5cGUgXCIlc1wiIGhhcyB1bmV4cGVjdGVkIGNvbnRlbnRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPm5hbWUsIE5VTEwpOwotICAgIH0gZWxzZSB7Ci0JaWYgKHN1YnR5cGUgPT0gTlVMTCkgewotCSAgICB4bWxTY2hlbWFQRXJyMihjdHh0LCBub2RlLCBjaGlsZCwKLQkJWE1MX1NDSEVNQVBfUzRTX0VMRU1fTUlTU0lORywKLQkJIlNpbXBsZVR5cGUgXCIlc1wiIG11c3QgaGF2ZSBvbmUgb2YgPHJlc3RyaWN0aW9uPiBvciAiCi0JCSI8bGlzdD4gb3IgPHVuaW9uPiBhcyBhIGNoaWxkXG4iLAotCQl0eXBlLT5uYW1lLCBOVUxMKTsKLQl9CisgICAgdHlwZS0+c3VidHlwZXMgPSBzdWJ0eXBlOyAgICAKKyAgICBpZiAoKGNoaWxkICE9IE5VTEwpIHx8IChzdWJ0eXBlID09IE5VTEwpKSB7CisJeG1sU2NoZW1hUENvbnRlbnRFcnIoY3R4dCwgWE1MX1NDSEVNQVBfUzRTX0VMRU1fTk9UX0FMTE9XRUQsIAorCSAgICAmcmVwTmFtZSwgdHlwZSwgbm9kZSwgY2hpbGQsIE5VTEwsIAorCSAgICAiKGFubm90YXRpb24/LCAocmVzdHJpY3Rpb24gfCBsaXN0IHwgdW5pb24pKSIpOwogICAgIH0KLQogICAgIGN0eHQtPmN0eHRUeXBlID0gY3R4dFR5cGU7CisgICAgaWYgKHJlcE5hbWUgIT0gTlVMTCkKKwl4bWxGcmVlKHJlcE5hbWUpOwogCiAgICAgcmV0dXJuICh0eXBlKTsKIH0KQEAgLTM0MjcsOCArNTM3Niw5IEBACiAgICAgICAgIHJlZiA9IHhtbEdldFFOYW1lUHJvcChjdHh0LCBub2RlLCAicmVmIiwgJnJlZk5zKTsKICAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7CiAgICAgICAgICAgICB4bWxTY2hlbWFQRXJyMihjdHh0LCBub2RlLCBjaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX0dST1VQX05PTkFNRV9OT1JFRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJHcm91cCBoYXMgbm8gbmFtZSBub3IgcmVmXG4iLCBOVUxMLCBOVUxMKTsKKwkJWE1MX1NDSEVNQVBfR1JPVVBfTk9OQU1FX05PUkVGLAorCQkiR3JvdXAgZGVmaW5pdGlvbiBvciBwYXJ0aWNsZTogT25lIG9mIHRoZSBhdHRyaWJ1dGVzIFwibmFtZVwiICIKKwkJIm9yIFwicmVmXCIgbXVzdCBiZSBwcmVzZW50LlxuIiwgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgICB9CiAJaWYgKHJlZk5zID09IE5VTEwpCkBAIC0zNDcxLDcgKzU0MjEsNyBAQAogICAgICAgICB0eXBlLT5zdWJ0eXBlcyA9IHN1YnR5cGU7CiAgICAgaWYgKGNoaWxkICE9IE5VTEwpIHsKICAgICAgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsIFhNTF9TQ0hFTUFQX1VOS05PV05fR1JPVVBfQ0hJTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICJHcm91cCAlcyBoYXMgdW5leHBlY3RlZCBjb250ZW50XG4iLCB0eXBlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAiR3JvdXAgZGVmaW5pdGlvbiBcIiVzXCIgaGFzIHVuZXhwZWN0ZWQgY29udGVudC5cbiIsIHR5cGUtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIH0KIApAQCAtMzUxMiwxMSArNTQ2MiwxMyBAQAogICAgIHR5cGUtPm1pbk9jY3VycyA9IHhtbEdldE1pbk9jY3VycyhjdHh0LCBub2RlKTsKICAgICBpZiAodHlwZS0+bWluT2NjdXJzID4gMSkKICAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBub2RlLCBYTUxfU0NIRU1BUF9JTlZBTElEX01JTk9DQ1VSUywKLQkgICAgImludmFsaWQgdmFsdWUgZm9yIG1pbk9jY3VycyAobXVzdCBiZSAwIG9yIDEpXG4iLCBOVUxMLCBOVUxMKTsKKwkgICAgIjxhbGw+OiBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBcIm1pbk9jY3Vyc1wiIGlzIGludmFsaWQuICIKKwkgICAgIkVpdGhlciBcIjBcIiBvciBcIjFcIiBpcyBleHBlY3RlZC5cbiIsIE5VTEwsIE5VTEwpOwogICAgIHR5cGUtPm1heE9jY3VycyA9IHhtbEdldE1heE9jY3VycyhjdHh0LCBub2RlKTsKICAgICBpZiAodHlwZS0+bWF4T2NjdXJzID4gMSkKICAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBub2RlLCBYTUxfU0NIRU1BUF9JTlZBTElEX01BWE9DQ1VSUywKLQkgICAgImludmFsaWQgdmFsdWUgZm9yIG1heE9jY3VycyAobXVzdCBiZSAwIG9yIDEpXG4iLCBOVUxMLCBOVUxMKTsKKwkgICAgIjxhbGw+OiBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBcIm1heE9jY3Vyc1wiIGlzIGludmFsaWQuICIKKwkgICAgIkVpdGhlciBcIjBcIiBvciBcIjFcIiBpcyBleHBlY3RlZC5cbiIsIE5VTEwsIE5VTEwpOwogCiAgICAgY2hpbGQgPSBub2RlLT5jaGlsZHJlbjsKICAgICBpZiAoSVNfU0NIRU1BKGNoaWxkLCAiYW5ub3RhdGlvbiIpKSB7CkBAIC0zNTI5LDExICs1NDgxLDExIEBACiAgICAgICAgIGlmIChzdWJ0eXBlICE9IE5VTEwpIHsKIAkgICAgaWYgKHN1YnR5cGUtPm1pbk9jY3VycyA+IDEpCiAgICAgICAgICAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBjaGlsZCwgWE1MX1NDSEVNQVBfSU5WQUxJRF9NSU5PQ0NVUlMsCi0JICAgICAgICAgICAgICJpbnZhbGlkIHZhbHVlIGZvciBtaW5PY2N1cnMgKG11c3QgYmUgMCBvciAxKVxuIiwKKwkgICAgICAgICAgICAgImludmFsaWQgdmFsdWUgZm9yIG1pbk9jY3VycyAobXVzdCBiZSAwIG9yIDEpLlxuIiwKIAkJICAgICBOVUxMLCBOVUxMKTsKIAkgICAgaWYgKHN1YnR5cGUtPm1heE9jY3VycyA+IDEpCiAJICAgICAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIGNoaWxkLCBYTUxfU0NIRU1BUF9JTlZBTElEX01BWE9DQ1VSUywKLQkgICAgICAgICAgICAgImludmFsaWQgdmFsdWUgZm9yIG1heE9jY3VycyAobXVzdCBiZSAwIG9yIDEpXG4iLAorCSAgICAgICAgICAgICAiaW52YWxpZCB2YWx1ZSBmb3IgbWF4T2NjdXJzIChtdXN0IGJlIDAgb3IgMSkuXG4iLAogCQkgICAgIE5VTEwsIE5VTEwpOwogICAgICAgICAgICAgaWYgKGxhc3QgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHR5cGUtPnN1YnR5cGVzID0gc3VidHlwZTsKQEAgLTM1NDgsNyArNTUwMCw3IEBACiAgICAgfQogICAgIGlmIChjaGlsZCAhPSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLCBYTUxfU0NIRU1BUF9VTktOT1dOX0FMTF9DSElMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIkFsbCAlcyBoYXMgdW5leHBlY3RlZCBjb250ZW50XG4iLCB0eXBlLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAiPGFsbD4gaGFzIHVuZXhwZWN0ZWQgY29udGVudC5cbiIsIHR5cGUtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIH0KIApAQCAtMzYwNCwxMiArNTU1NiwxNCBAQAogICAgIGlmIChpbXBvcnQtPnNjaGVtYSA9PSBOVUxMKSB7CiAgICAgICAgIC8qIEZJWE1FIHVzZSBhbm90aGVyIGVycm9yIGVudW0gaGVyZSA/ICovCiAgICAgICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgTlVMTCwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAotCSAgICAgICAgICAgICAgImZhaWxlZCB0byBpbXBvcnQgc2NoZW1hIGF0IGxvY2F0aW9uICVzXG4iLAorCSAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbXBvcnQgc2NoZW1hIGZyb20gbG9jYXRpb24gXCIlc1wiLlxuIiwKIAkJICAgICAgc2NoZW1hTG9jYXRpb24sIE5VTEwpOwogCiAJeG1sU2NoZW1hRnJlZVBhcnNlckN0eHQobmV3Y3R4dCk7CisJLyogVGhlIHNjaGVtYUxvY2F0aW9uIGlzIGhlbGQgYnkgdGhlIGRpY3Rpb25hcnkuCiAJaWYgKGltcG9ydC0+c2NoZW1hTG9jYXRpb24gIT0gTlVMTCkKIAkgICAgeG1sRnJlZSgoeG1sQ2hhciAqKWltcG9ydC0+c2NoZW1hTG9jYXRpb24pOworCSovCiAJeG1sRnJlZShpbXBvcnQpOwogCXJldHVybiBOVUxMOwogICAgIH0KQEAgLTM2NTEsOSArNTYwNSwxMCBAQAogICAgICAgICBjaGVjayA9IHhtbFBhcnNlVVJJKChjb25zdCBjaGFyICopIG5hbWVzcGFjZSk7CiAgICAgICAgIGlmIChjaGVjayA9PSBOVUxMKSB7CiAgICAgICAgICAgICB4bWxTY2hlbWFQRXJyMihjdHh0LCBub2RlLCBjaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX0lNUE9SVF9OQU1FU1BBQ0VfTk9UX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBvcnQgbmFtZXNwYWNlIGF0dHJpYnV0ZSBpcyBub3QgYW4gVVJJOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSwgTlVMTCk7CisJCVhNTF9TQ0hFTUFQX0lNUE9SVF9OQU1FU1BBQ0VfTk9UX1VSSSwKKwkJIkVsZW1lbnQgPGltcG9ydD46IFRoZSB2YWx1ZSBcIiVzXCIgb2YgdGhlIGF0dHJpYnV0ZSBcIm5hbWVzcGFjZVwiIGlzICIKKwkJIm5vdCBhIHZhbGlkIFVSSS5cbiIsCisJCW5hbWVzcGFjZSwgTlVMTCk7CiAgICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHhtbEZyZWVVUkkoY2hlY2spOwpAQCAtMzY2Niw5ICs1NjIxLDEwIEBACiAgICAgICAgIGNoZWNrID0geG1sUGFyc2VVUkkoKGNvbnN0IGNoYXIgKikgc2NoZW1hTG9jYXRpb24pOwogICAgICAgICBpZiAoY2hlY2sgPT0gTlVMTCkgewogICAgICAgICAgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9JTVBPUlRfU0NIRU1BX05PVF9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wb3J0IHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBpcyBub3QgYW4gVVJJOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uLCBOVUxMKTsKKwkJWE1MX1NDSEVNQVBfSU1QT1JUX1NDSEVNQV9OT1RfVVJJLAorCQkiRWxlbWVudCA8aW1wb3J0PjogVGhlIHZhbHVlIFwiJXNcIiBvZiB0aGUgYXR0cmlidXRlIFwic2NoZW1hTG9jYXRpb25cIiBpcyAiCisJCSJub3QgYSB2YWxpZCBVUkkuXG4iLAorCQlzY2hlbWFMb2NhdGlvbiwgTlVMTCk7CiAgICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHhtbEZyZWVVUkkoY2hlY2spOwpAQCAtMzY5MCw3ICs1NjQ2LDcgQEAKICAgICAgICAgaWYgKHNjaGVtYS0+c2NoZW1hc0ltcG9ydHMgPT0gTlVMTCkgewogICAgICAgICAgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9GQUlMRURfQlVJTERfSU1QT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsOiBmYWlsZWQgdG8gYnVpbGQgaW1wb3J0IHRhYmxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsIGVycm9yOiBmYWlsZWQgdG8gYnVpbGQgaW1wb3J0IHRhYmxlLlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwogICAgICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgICAgIH0KQEAgLTM3MDcsMTAgKzU2NjMsMTAgQEAKICAgICAgICAgICAgIGlmIChwcmV2aW91cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKCF4bWxTdHJFcXVhbChzY2hlbWFMb2NhdGlvbiwgcHJldmlvdXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9JTVBPUlRfUkVERUZJTkVfTlNOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVkZWZpbmluZyBpbXBvcnQgZm9yIGRlZmF1bHQgbmFtZXNwYWNlICIKLQkJCQkgICAid2l0aCBhIGRpZmZlcmVudCBVUkk6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbiwgTlVMTCk7CisJCQlYTUxfU0NIRU1BUF9JTVBPUlRfUkVERUZJTkVfTlNOQU1FLAorCQkJIjxpbXBvcnQ+OiBSZWRlZmluaW5nIGltcG9ydCBmb3IgZGVmYXVsdCBuYW1lc3BhY2UgIgorCQkJIndpdGggYSBkaWZmZXJlbnQgVVJJOiBcIiVzXCIuXG4iLAorCQkJc2NoZW1hTG9jYXRpb24sIE5VTEwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAJICAgICAgICBpbXBvcnQgPSB4bWxTY2hlbWFJbXBvcnRTY2hlbWEoY3R4dCwgc2NoZW1hTG9jYXRpb24pOwpAQCAtMzczMywxMCArNTY4OSwxMCBAQAogICAgICAgICAgICAgaWYgKHByZXZpb3VzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoIXhtbFN0ckVxdWFsKHNjaGVtYUxvY2F0aW9uLCBwcmV2aW91cykpIHsKICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX0lNUE9SVF9SRURFRklORV9OU05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWRlZmluaW5nIGltcG9ydCBmb3IgbmFtZXNwYWNlICVzIHdpdGggIgotCQkJCSAgICJhIGRpZmZlcmVudCBVUkk6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsIHNjaGVtYUxvY2F0aW9uKTsKKwkJCVhNTF9TQ0hFTUFQX0lNUE9SVF9SRURFRklORV9OU05BTUUsCisJCQkiPGltcG9ydD46IFJlZGVmaW5pbmcgaW1wb3J0IGZvciBuYW1lc3BhY2UgXCIlc1wiIHdpdGggIgorCQkJImEgZGlmZmVyZW50IFVSSTogXCIlc1wiLlxuIiwKKwkJCW5hbWVzcGFjZSwgc2NoZW1hTG9jYXRpb24pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAJICAgICAgICBpbXBvcnQgPSB4bWxTY2hlbWFJbXBvcnRTY2hlbWEoY3R4dCwgc2NoZW1hTG9jYXRpb24pOwpAQCAtMzc0NSwyNyArNTcwMSwyNyBAQAogCQl9CiAJCWlmICgheG1sU3RyRXF1YWwoaW1wb3J0LT5zY2hlbWEtPnRhcmdldE5hbWVzcGFjZSwgbmFtZXNwYWNlKSkgewogCQkgICAgaWYgKG5hbWVzcGFjZSA9PSBOVUxMKSB7CisKIAkJCWlmIChpbXBvcnQtPnNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlICE9IE5VTEwpIHsKIAkJCSAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVBfU1JDX0lNUE9SVF8zXzIsCi0JCQkgICAgIlRoZXJlIGlzIG5vIG5hbWVzcGFjZSBhdHRyaWJ1dGUgb24gdGhlIDxpbXBvcnQ+ICIKLQkJCSAgICAiZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtLCBzbyB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgIgotCQkJICAgICJtdXN0IGhhdmUgbm8gdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZS5cbiIsIAotCQkJICAgIE5VTEwsIE5VTEwpOyAKKwkJCSAgICAgICAiPGltcG9ydD46IE5vIFwibmFtZXNwYWNlXCIgYXR0cmlidXRlIHdhcyAiIAorCQkJICAgICAgICJzcGVjaWZpZWQsIHRodXMgdGhlIGltcG9ydGVkIHNjaGVtYSBkb2N1bWVudCAiCisJCQkgICAgICAgIm11c3QgaGF2ZSBubyB0YXJnZXQgbmFtZXNwYWNlLlxuIiwgCisJCQkgICAgICAgTlVMTCwgTlVMTCk7IAogCQkJfQogCQkgICAgfSBlbHNlIHsKIAkJCWlmIChpbXBvcnQtPnNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlICE9IE5VTEwpIHsKIAkJCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIFhNTF9TQ0hFTUFQX1NSQ19JTVBPUlRfM18xLAotCQkJCSJUaGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBcIiVzXCIgb2YgYW4gPGltcG9ydD4gIgotCQkJCSJlbGVtZW50IGluZm9ybWF0aW9uIGl0ZW0gbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlICIKLQkJCQkidGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZSBcIiVzXCIgb2YgdGhlICIKLQkJCQkiaW1wb3J0ZWQgZG9jdW1lbnQuXG4iLCAKKwkJCQkiPGltcG9ydD46IFRoZSB2YWx1ZSBcIiVzXCIgb2YgdGhlIGF0dHJpYnV0ZSAiCisJCQkJIlwibmFtZXNwYWNlXCIgaXMgbm90IGlkZW50aWNhbCB0byB0aGUgIgorCQkJCSJ0YXJnZXQgbmFtZXNwYWNlIFwiJXNcIiBvZiB0aGUgIgorCQkJCSJpbXBvcnRlZCBzY2hlbWEgZG9jdW1lbnQuXG4iLCAKIAkJCQluYW1lc3BhY2UsIGltcG9ydC0+c2NoZW1hLT50YXJnZXROYW1lc3BhY2UpOwogCQkJfSBlbHNlIHsKIAkJCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIFhNTF9TQ0hFTUFQX1NSQ19JTVBPUlRfM18xLAotCQkJCSJUaGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBvbiB0aGUgPGltcG9ydD4gIgotCQkJCSJlbGVtZW50IGluZm9ybWF0aW9uIGl0ZW0sIHJlcXVpcmVzIHRoZSBpbXBvcnRlZCAiCi0JCQkJImRvY3VtZW50IHRvIGhhdmUgYSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlICIKLQkJCQkid2l0aCB0aGUgdmFsdWUgXCIlc1wiLlxuIiwgCisJCQkJIjxpbXBvcnQ+OiBUaGUgYXR0cmlidXRlIFwibmFtZXNwYWNlXCIsIHJlcXVpcmVzICIKKwkJCQkidGhlIGltcG9ydGVkIHNjaGVtYSBkb2N1bWVudCB0byBoYXZlIGEgdGFyZ2V0ICIKKwkJCQkibmFtZXNwYWNlIG9mIFwiJXNcIi5cbiIsCiAJCQkJbmFtZXNwYWNlLCBOVUxMKTsKIAkJCX0KIAkJICAgIH0KQEAgLTM3ODksNyArNTc0NSw3IEBACiAgICAgfQogICAgIGlmIChjaGlsZCAhPSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLCBYTUxfU0NIRU1BUF9VTktOT1dOX0lNUE9SVF9DSElMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIkltcG9ydCBoYXMgdW5leHBlY3RlZCBjb250ZW50XG4iLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIjxpbXBvcnQ+IGhhcyB1bmV4cGVjdGVkIGNvbnRlbnQuXG4iLCBOVUxMLCBOVUxMKTsKICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgfQogICAgIHJldHVybiAoMSk7CkBAIC0zOTM2LDcgKzU4OTIsNyBAQAogCX0gZWxzZSB7CiAJICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIE5VTEwsIGNoaWxkLAogCQkJICAgWE1MX1NDSEVNQVBfVU5LTk9XTl9TQ0hFTUFTX0NISUxELAotCQkJICAgIlNjaGVtYXM6IHVuZXhwZWN0ZWQgZWxlbWVudCAlcyBoZXJlIFxuIiwKKwkJCSAgICJVbmV4cGVjdGVkIGVsZW1lbnQgXCIlc1wiIGFzIGNoaWxkIG9mIDxzY2hlbWE+LlxuIiwKIAkJCSAgIGNoaWxkLT5uYW1lLCBOVUxMKTsKIAkgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKIAl9CkBAIC0zOTY5LDExICs1OTI1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBub2RlKQogewogICAgIHhtbE5vZGVQdHIgY2hpbGQgPSBOVUxMOwotICAgIGNvbnN0IHhtbENoYXIgKnNjaGVtYUxvY2F0aW9uOworICAgIGNvbnN0IHhtbENoYXIgKnNjaGVtYUxvY2F0aW9uLCAqdGFyZ2V0TmFtZXNwYWNlOwogICAgIHhtbFVSSVB0ciBjaGVjazsKICAgICB4bWxEb2NQdHIgZG9jOwogICAgIHhtbE5vZGVQdHIgcm9vdDsKICAgICB4bWxTY2hlbWFJbmNsdWRlUHRyIGluY2x1ZGU7CisgICAgaW50IHdhc0NvbnZlcnRpbmdOcyA9IDA7CiAKIAogICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoc2NoZW1hID09IE5VTEwpIHx8IChub2RlID09IE5VTEwpKQpAQCAtMzk5MCw5ICs1OTQ3LDEwIEBACiAgICAgICAgIGNoZWNrID0geG1sUGFyc2VVUkkoKGNvbnN0IGNoYXIgKikgc2NoZW1hTG9jYXRpb24pOwogICAgICAgICBpZiAoY2hlY2sgPT0gTlVMTCkgewogICAgICAgICAgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9JTkNMVURFX1NDSEVNQV9OT1RfVVJJLAotCQkgICAgICAgIkluY2x1ZGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGlzIG5vdCBhbiBVUkk6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb24sIE5VTEwpOworCQlYTUxfU0NIRU1BUF9JTkNMVURFX1NDSEVNQV9OT1RfVVJJLAorCQkiPGluY2x1ZGU+OiBUaGUgdmFsdWUgXCIlc1wiIG9mIHRoZSBhdHRyaWJ1dGUgIgorCQkiXCJzY2hlbWFMb2NhdGlvblwiIGlzIG5vdCBhIHZhbGlkIFVSSS5cbiIsCisJCXNjaGVtYUxvY2F0aW9uLCBOVUxMKTsKICAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgeG1sRnJlZVVSSShjaGVjayk7CkBAIC00MDEwLDkgKzU5NjgsOSBAQAogCX0KICAgICB9IGVsc2UgewogCXhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLAotCQkgICAgICAgWE1MX1NDSEVNQVBfSU5DTFVERV9TQ0hFTUFfTk9fVVJJLAotCQkgICAiSW5jbHVkZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgbWlzc2luZ1xuIiwKLQkJICAgICAgIE5VTEwsIE5VTEwpOworCSAgICBYTUxfU0NIRU1BUF9JTkNMVURFX1NDSEVNQV9OT19VUkksCisJICAgICI8aW5jbHVkZT46IFRoZSBhdHRyaWJ1dGUgXCJzY2hlbWFMb2NhdGlvblwiIGlzIG1pc3NpbmcuXG4iLAkgICAgCisJICAgIE5VTEwsIE5VTEwpOwogCXJldHVybiAoLTEpOwogICAgIH0KIApAQCAtNDAyNSw3ICs1OTgzLDcgQEAKICAgICB9CiAgICAgaWYgKGNoaWxkICE9IE5VTEwpIHsKICAgICAgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsIFhNTF9TQ0hFTUFQX1VOS05PV05fSU5DTFVERV9DSElMRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIkluY2x1ZGUgaGFzIHVuZXhwZWN0ZWQgY29udGVudFxuIiwgTlVMTCwgTlVMTCk7CisJICAgICI8aW5jbHVkZT4gaGFzIHVuZXhwZWN0ZWQgY29udGVudC5cbiIsIE5VTEwsIE5VTEwpOwogICAgICAgICByZXR1cm4gKC0xKTsKICAgICB9CiAKQEAgLTQwMzcsNyArNTk5NSw3IEBACiAgICAgaWYgKGRvYyA9PSBOVUxMKSB7CiAJeG1sU2NoZW1hUEVycihjdHh0LCBOVUxMLAogCQkgICAgICBYTUxfU0NIRU1BUF9GQUlMRURfTE9BRCwKLQkJICAgICAgInhtbFNjaGVtYVBhcnNlOiBjb3VsZCBub3QgbG9hZCAlc1xuIiwKKwkJICAgICAgIjxpbmNsdWRlPjogZmFpbGVkIHRvIGxvYWQgdGhlIGRvY3VtZW50IFwiJXNcIi5cbiIsCiAJCSAgICAgIGN0eHQtPlVSTCwgTlVMTCk7CiAJcmV0dXJuKC0xKTsKICAgICB9CkBAIC00MDQ4LDggKzYwMDYsOSBAQAogICAgIHJvb3QgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOwogICAgIGlmIChyb290ID09IE5VTEwpIHsKIAl4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBkb2MsCi0JCSAgICAgIFhNTF9TQ0hFTUFQX05PUk9PVCwKLQkJICAgICAgInNjaGVtYXMgJXMgaGFzIG5vIHJvb3QiLCBzY2hlbWFMb2NhdGlvbiwgTlVMTCk7CisJICAgIFhNTF9TQ0hFTUFQX05PUk9PVCwKKwkgICAgIjxpbmNsdWRlPjogVGhlIGluY2x1ZGVkIGRvY3VtZW50IFwiJXNcIiBoYXMgbm8gZG9jdW1lbnQgIgorCSAgICAiZWxlbWVudC5cbiIsIHNjaGVtYUxvY2F0aW9uLCBOVUxMKTsKIAl4bWxGcmVlRG9jKGRvYyk7CiAgICAgICAgIHJldHVybiAoLTEpOwogICAgIH0KQEAgLTQwNjQsMTIgKzYwMjMsNDUgQEAKICAgICAgKi8KICAgICBpZiAoIUlTX1NDSEVNQShyb290LCAic2NoZW1hIikpIHsKIAl4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBkb2MsCi0JCSAgICAgIFhNTF9TQ0hFTUFQX05PVF9TQ0hFTUEsCi0JCSAgICAgICJGaWxlICVzIGlzIG5vdCBhIHNjaGVtYSIsIHNjaGVtYUxvY2F0aW9uLCBOVUxMKTsKKwkgICAgWE1MX1NDSEVNQVBfTk9UX1NDSEVNQSwKKwkgICAgIjxpbmNsdWRlPjogVGhlIGRvY3VtZW50IFwiJXNcIiBpcyBub3QgYSBzY2hlbWEgZG9jdW1lbnQuXG4iLCAKKwkgICAgc2NoZW1hTG9jYXRpb24sIE5VTEwpOwogCXhtbEZyZWVEb2MoZG9jKTsKICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgfQotCisgICAgCisgICAgdGFyZ2V0TmFtZXNwYWNlID0geG1sU2NoZW1hR2V0UHJvcChjdHh0LCBub2RlLCAidGFyZ2V0TmFtZXNwYWNlIik7CisgICAgLyoKKyAgICAqIDIuMSBTSUkgaGFzIGEgdGFyZ2V0TmFtZXNwYWNlIFthdHRyaWJ1dGVdLCBhbmQgaXRzILdhY3R1YWwgCisgICAgKiB2YWx1ZbcgaXMgaWRlbnRpY2FsIHRvIHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUgdGFyZ2V0TmFtZXNwYWNlIAorICAgICogW2F0dHJpYnV0ZV0gb2YgU0lJkiAod2hpY2ggbXVzdCBoYXZlIHN1Y2ggYW4gW2F0dHJpYnV0ZV0pLgorICAgICovCisgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBOVUxMKSB7CisJaWYgKHNjaGVtYS0+dGFyZ2V0TmFtZXNwYWNlID09IE5VTEwpIHsKKwkgICAgeG1sU2NoZW1hUEVycihjdHh0LCAoeG1sTm9kZVB0cikgZG9jLAorCQlYTUxfU0NIRU1BUF9TUkNfSU5DTFVERSwKKwkJIjxpbmNsdWRlPjogVGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGluY2x1ZGVkIHNjaGVtYSAiCisJCSJcIiVzXCIgaGFzIHRvIGJlIGFic2VudCwgc2luY2UgdGhlIGluY2x1ZGluZyBzY2hlbWEgIgorCQkiaGFzIG5vIHRhcmdldCBuYW1lc3BhY2UuXG4iLCAKKwkJc2NoZW1hTG9jYXRpb24sIE5VTEwpOworCSAgICB4bWxGcmVlRG9jKGRvYyk7CisJICAgIHJldHVybiAoLTEpOworCX0gZWxzZSBpZiAoIXhtbFN0ckVxdWFsKHRhcmdldE5hbWVzcGFjZSwgc2NoZW1hLT50YXJnZXROYW1lc3BhY2UpKSB7CQorCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBkb2MsCisJCVhNTF9TQ0hFTUFQX1NSQ19JTkNMVURFLAorCQkiPGluY2x1ZGU+OiBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBcIiVzXCIgb2YgdGhlIGluY2x1ZGVkICIKKwkJInNjaGVtYSBcIiVzXCIgaXMgZGlmZmVyZW50IGZyb20gXCIlc1wiIG9mIHRoZSBpbmNsdWRpbmcgIgorCQkic2NoZW1hLlxuIiwgCisJCXNjaGVtYUxvY2F0aW9uLCBOVUxMKTsKKwkgICAgeG1sRnJlZURvYyhkb2MpOworCSAgICByZXR1cm4gKC0xKTsKKwl9CisgICAgfSBlbHNlIGlmIChzY2hlbWEtPnRhcmdldE5hbWVzcGFjZSAhPSBOVUxMKSB7ICAgICAJCisJaWYgKChzY2hlbWEtPmZsYWdzICYgWE1MX1NDSEVNQVNfSU5DTFVESU5HX0NPTlZFUlRfTlMpID09IDApIHsKKwkgICAgc2NoZW1hLT5mbGFncyB8PSBYTUxfU0NIRU1BU19JTkNMVURJTkdfQ09OVkVSVF9OUzsJICAgIAorCX0gZWxzZQorCSAgICB3YXNDb252ZXJ0aW5nTnMgPSAxOworICAgIH0KICAgICAvKgogICAgICAqIHJlZ2lzdGVyIHRoZSBpbmNsdWRlCiAgICAgICovCkBAIC00MDg2LDEzICs2MDc4LDIyIEBACiAgICAgaW5jbHVkZS0+bmV4dCA9IHNjaGVtYS0+aW5jbHVkZXM7CiAgICAgc2NoZW1hLT5pbmNsdWRlcyA9IGluY2x1ZGU7CiAKLQogICAgIC8qCiAgICAgICogcGFyc2UgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgaW5jbHVkZWQgZmlsZSBsaWtlIGlmIHRoZXkKICAgICAgKiB3ZXJlIGluIHRoZSBvcmlnaW5hbCBmaWxlLgotICAgICAqLworICAgICAqLyAgICAKKyAgICAvKgorICAgICogVE9ETyBGSVhNRSBVUkdFTlQ6IFRoZSB2YWxpZGF0aW9uIG9mIHRoZSA8c2NoZW1hPiBlbGVtZW50IGlzIG5vdCBkb25lIGhlcmUuCisgICAgKiBBZGRpdGlvbmFsbHkgdGhlIGRlZmF1bHQgdmFsdWVzIChlLmcuICJibG9ja0RlZmF1bHQiLCAiZWxlbWVudEZvcm1EZWZhdWx0IikKKyAgICAqIGFyZSBub3Qgc2V0LiBXZSBuZWVkIHRvIHN0b3JlIHRoZSBjdXJyZW50IHZhbHVlcyBoZXJlLCBzZXQgdGhlbSB0byB0aGUgCisgICAgKiB2YWx1ZXMgb2YgdGhlIGluY2x1ZGVkIHNjaGVtYSBhbmQgcmVjb3ZlciB0aGUgb2xkIG9uZXMgYWZ0ZXJ3YXJkcy4KKyAgICAqLwogICAgIHhtbFNjaGVtYVBhcnNlU2NoZW1hVG9wTGV2ZWwoY3R4dCwgc2NoZW1hLCByb290LT5jaGlsZHJlbik7Ci0KKyAgICAvKgorICAgICogUmVtb3ZlIHRoZSBjb252ZXJ0aW5nIGZsYWcuCisgICAgKi8KKyAgICBpZiAod2FzQ29udmVydGluZ05zID09IDApCisJc2NoZW1hLT5mbGFncyBePSBYTUxfU0NIRU1BU19JTkNMVURJTkdfQ09OVkVSVF9OUzsKICAgICByZXR1cm4gKDEpOwogfQogCkBAIC00MTY3LDggKzYxNjgsOCBAQAogICAgIH0KICAgICBpZiAoY2hpbGQgIT0gTlVMTCkgewogICAgICAgICB4bWxTY2hlbWFQRXJyMihjdHh0LCBub2RlLCBjaGlsZCwgWE1MX1NDSEVNQVBfVU5LTk9XTl9DSE9JQ0VfQ0hJTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICJDaG9pY2UgJXMgaGFzIHVuZXhwZWN0ZWQgY29udGVudFxuIiwgdHlwZS0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJICAgICI8Y2hvaWNlPiBoYXMgdW5leHBlY3RlZCBjb250ZW50LlxuIiwgCisJICAgIE5VTEwsIE5VTEwpOwogICAgIH0KIAogICAgIHJldHVybiAodHlwZSk7CkBAIC00MjQ2LDggKzYyNDcsOCBAQAogICAgIGlmIChjaGlsZCAhPSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLAogICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9VTktOT1dOX1NFUVVFTkNFX0NISUxELAotICAgICAgICAgICAgICAgICAgICAgICAiU2VxdWVuY2UgJXMgaGFzIHVuZXhwZWN0ZWQgY29udGVudFxuIiwgdHlwZS0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICI8c2VxdWVuY2U+IGhhcyB1bmV4cGVjdGVkIGNvbnRlbnQuXG4iLCAKKwkJICAgICAgIE5VTEwsIE5VTEwpOwogICAgIH0KIAogICAgIHJldHVybiAodHlwZSk7CkBAIC00MjkwLDcgKzYyOTEsNyBAQAogCShjdHh0LT5wYXJlbnRJdGVtLT50eXBlID09IFhNTF9TQ0hFTUFfVFlQRV9DT01QTEVYX0NPTlRFTlQpKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLAogCSAgICBYTUxfU0NIRU1BUF9SRVNUUklDVElPTl9OT05BTUVfTk9SRUYsCi0JICAgICJSZXN0cmljdGlvbiBcIiVzXCIgbXVzdCBoYXZlIGEgXCJiYXNlXCIgYXR0cmlidXRlLlxuIiwgCisJICAgICI8cmVzdHJpY3Rpb24+OiBUaGUgYXR0cmlidXRlIFwiYmFzZVwiIGlzIG1pc3NpbmcuXG4iLCAKIAkgICAgdHlwZS0+bmFtZSwgTlVMTCk7CiAgICAgfQogICAgIGN0eHQtPmNvbnRhaW5lciA9IG5hbWU7CkBAIC00MzQ3LDYgKzYzNDgsMTEgQEAKIAkvKgogCSogQWRkIHRoZSBmYWNldHMgdG8gdGhlIHBhcmVudCBzaW1wbGVUeXBlL2NvbXBsZXhUeXBlLgogCSovCisJLyoKKwkqIFRPRE86IERhdGF0eXBlczogNC4xLjMgQ29uc3RyYWludHMgb24gWE1MIFJlcHJlc2VudGF0aW9uIG9mIAorCSogU2ltcGxlIFR5cGUgRGVmaW5pdGlvbiBTY2hlbWEgUmVwcmVzZW50YXRpb24gQ29uc3RyYWludDogCisJKiAqU2luZ2xlIEZhY2V0IFZhbHVlKgorCSovCiAJd2hpbGUgKChJU19TQ0hFTUEoY2hpbGQsICJtaW5JbmNsdXNpdmUiKSkgfHwKIAkgICAgKElTX1NDSEVNQShjaGlsZCwgIm1pbkV4Y2x1c2l2ZSIpKSB8fAogCSAgICAoSVNfU0NIRU1BKGNoaWxkLCAibWF4SW5jbHVzaXZlIikpIHx8CkBAIC00NDAwLDcgKzY0MDYsNyBAQAogICAgIGlmIChjaGlsZCAhPSBOVUxMKSB7CiAJeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsCiAJICAgIFhNTF9TQ0hFTUFQX1VOS05PV05fUkVTVFJJQ1RJT05fQ0hJTEQsCi0JICAgICJSZXN0cmljdGlvbiBcIiVzXCIgaGFzIHVuZXhwZWN0ZWQgY29udGVudC5cbiIsCisJICAgICI8cmVzdHJpY3Rpb24+IGhhcyB1bmV4cGVjdGVkIGNvbnRlbnQuXG4iLAogCSAgICB0eXBlLT5uYW1lLCBOVUxMKTsKICAgICB9ICAgCiAgICAgY3R4dC0+Y29udGFpbmVyID0gb2xkY29udGFpbmVyOwpAQCAtNDQ0NCw3ICs2NDUwLDggQEAKICAgICB0eXBlLT5iYXNlID0geG1sR2V0UU5hbWVQcm9wKGN0eHQsIG5vZGUsICJiYXNlIiwgJih0eXBlLT5iYXNlTnMpKTsKICAgICBpZiAodHlwZS0+YmFzZSA9PSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLCBYTUxfU0NIRU1BUF9FWFRFTlNJT05fTk9fQkFTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIkV4dGVuc2lvbiAlcyBoYXMgbm8gYmFzZVxuIiwgdHlwZS0+bmFtZSwgTlVMTCk7CisJICAgICI8ZXh0ZW5zaW9uPjogVGhlIGF0dHJpYnV0ZSBcImJhc2VcIiBpcyBtaXNzaW5nLlxuIiwgCisJICAgIHR5cGUtPm5hbWUsIE5VTEwpOwogICAgIH0KICAgICBjaGlsZCA9IG5vZGUtPmNoaWxkcmVuOwogICAgIGlmIChJU19TQ0hFTUEoY2hpbGQsICJhbm5vdGF0aW9uIikpIHsKQEAgLTQ0NzEsOSArNjQ3OCw5IEBACiAgICAgY2hpbGQgPSB4bWxTY2hlbWFQYXJzZUF0dHJEZWNscyhjdHh0LCBzY2hlbWEsIGNoaWxkLCB0eXBlKTsKICAgICBpZiAoY2hpbGQgIT0gTlVMTCkgewogICAgICAgICB4bWxTY2hlbWFQRXJyMihjdHh0LCBub2RlLCBjaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgWE1MX1NDSEVNQVBfVU5LTk9XTl9FWFRFTlNJT05fQ0hJTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICJFeHRlbnNpb24gJXMgaGFzIHVuZXhwZWN0ZWQgY29udGVudFxuIiwgdHlwZS0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJICAgIFhNTF9TQ0hFTUFQX1VOS05PV05fRVhURU5TSU9OX0NISUxELAorCSAgICAiPGV4dGVuc2lvbj4gaGFzIHVuZXhwZWN0ZWQgY29udGVudC5cbiIsIHR5cGUtPm5hbWUsCisJICAgIE5VTEwpOwogICAgIH0KICAgICBjdHh0LT5jb250YWluZXIgPSBvbGRjb250YWluZXI7CiAgICAgcmV0dXJuICh0eXBlKTsKQEAgLTQ1MjgsOSArNjUzNSw5IEBACiAgICAgdHlwZS0+c3VidHlwZXMgPSBzdWJ0eXBlOwogICAgIGlmIChjaGlsZCAhPSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9VTktOT1dOX1NJTVBMRUNPTlRFTlRfQ0hJTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICJTaW1wbGVDb250ZW50ICVzIGhhcyB1bmV4cGVjdGVkIGNvbnRlbnRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPm5hbWUsIE5VTEwpOworCSAgICBYTUxfU0NIRU1BUF9VTktOT1dOX1NJTVBMRUNPTlRFTlRfQ0hJTEQsCisJICAgICI8c2ltcGxlQ29udGVudD4gaGFzIHVuZXhwZWN0ZWQgY29udGVudC5cbiIsCisJICAgIE5VTEwsIE5VTEwpOwogICAgIH0KICAgICByZXR1cm4gKHR5cGUpOwogfQpAQCAtNDU4NCw5ICs2NTkxLDkgQEAKICAgICB0eXBlLT5zdWJ0eXBlcyA9IHN1YnR5cGU7CiAgICAgaWYgKGNoaWxkICE9IE5VTEwpIHsKICAgICAgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX1VOS05PV05fQ09NUExFWENPTlRFTlRfQ0hJTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICJDb21wbGV4Q29udGVudCAlcyBoYXMgdW5leHBlY3RlZCBjb250ZW50XG4iLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT5uYW1lLCBOVUxMKTsKKwkgICAgWE1MX1NDSEVNQVBfVU5LTk9XTl9DT01QTEVYQ09OVEVOVF9DSElMRCwKKwkgICAgIjxjb21wbGV4Q29udGVudD4gaGFzIHVuZXhwZWN0ZWQgY29udGVudC5cbiIsCisJICAgIE5VTEwsIE5VTEwpOwogICAgIH0KICAgICByZXR1cm4gKHR5cGUpOwogfQpAQCAtNDYzMSw3ICs2NjM4LDcgQEAKICAgICBpZiAodHlwZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgfQotICAgIGlmICh4bWxHZXRCb29sZWFuUHJvcChjdHh0LCBub2RlLCAibWl4ZWQiLCAwKSkgCisgICAgaWYgKHhtbEdldEJvb2xlYW5Qcm9wKGN0eHQsIE5VTEwsIHR5cGUsIG5vZGUsICJtaXhlZCIsIDApKSAKIAl0eXBlLT5mbGFncyB8PSBYTUxfU0NIRU1BU19UWVBFX01JWEVEOyAgICAKIAogICAgIHR5cGUtPm5vZGUgPSBub2RlOwpAQCAtNDY4MSw5ICs2Njg4LDkgQEAKICAgICB9CiAgICAgaWYgKGNoaWxkICE9IE5VTEwpIHsKICAgICAgICAgeG1sU2NoZW1hUEVycjIoY3R4dCwgbm9kZSwgY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX1VOS05PV05fQ09NUExFWFRZUEVfQ0hJTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICJDb21wbGV4VHlwZSAlcyBoYXMgdW5leHBlY3RlZCBjb250ZW50XG4iLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT5uYW1lLCBOVUxMKTsKKwkgICAgWE1MX1NDSEVNQVBfVU5LTk9XTl9DT01QTEVYVFlQRV9DSElMRCwKKwkgICAgIkNvbXBsZXggdHlwZSBkZWZpbml0aW9uIFwiJXNcIiBoYXMgdW5leHBlY3RlZCBjb250ZW50LlxuIiwKKwkgICAgdHlwZS0+bmFtZSwgTlVMTCk7CiAgICAgfQogICAgIGlmICh0eXBlLT5hdHRyaWJ1dGVXaWxkY2FyZCAhPSBOVUxMKQogCXR5cGUtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX1RZUEVfT1dORURfQVRUUl9XSUxEQ0FSRDsKQEAgLTQ3MDcsOSArNjcxNCw5IEBACiB4bWxTY2hlbWFQYXJzZVNjaGVtYSh4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQsIHhtbE5vZGVQdHIgbm9kZSkKIHsKICAgICB4bWxTY2hlbWFQdHIgc2NoZW1hID0gTlVMTDsKLSAgICB4bWxOb2RlUHRyIGNoaWxkID0gTlVMTDsKICAgICBjb25zdCB4bWxDaGFyICp2YWw7CiAgICAgaW50IG5iZXJyb3JzOworICAgIHhtbEF0dHJQdHIgYXR0cjsKIAogICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAobm9kZSA9PSBOVUxMKSkKICAgICAgICAgcmV0dXJuIChOVUxMKTsKQEAgLTQ3MjAsMjMgKzY3MjcsMzMgQEAKICAgICAgICAgc2NoZW1hID0geG1sU2NoZW1hTmV3U2NoZW1hKGN0eHQpOwogICAgICAgICBpZiAoc2NoZW1hID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwotCXZhbCA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgInRhcmdldE5hbWVzcGFjZSIpOwotCWlmICh2YWwgIT0gTlVMTCkgeworCWF0dHIgPSB4bWxTY2hlbWFHZXRQcm9wTm9kZShub2RlLCAidGFyZ2V0TmFtZXNwYWNlIik7IAkJCisJaWYgKGF0dHIgIT0gTlVMTCkgeworCSAgICB4bWxTY2hlbWFQVmFsQXR0ck5vZGUoY3R4dCwgTlVMTCwgTlVMTCwgYXR0ciwgCisJCXhtbFNjaGVtYUdldEJ1aWx0SW5UeXBlKFhNTF9TQ0hFTUFTX0FOWVVSSSksICZ2YWwpOworCSAgICAvKgorCSAgICAqIFRPRE86IFNob3VsZCB3ZSBwcm9jZWVkIHdpdGggYW4gaW52YWxpZCB0YXJnZXQgbmFtZXNwYWNlPworCSAgICAqLwogCSAgICBzY2hlbWEtPnRhcmdldE5hbWVzcGFjZSA9IHhtbERpY3RMb29rdXAoY3R4dC0+ZGljdCwgdmFsLCAtMSk7CiAJfSBlbHNlIHsKIAkgICAgc2NoZW1hLT50YXJnZXROYW1lc3BhY2UgPSBOVUxMOwogCX0KKwkvKiBUT0RPOiBDaGVjayBpZC4gKi8KICAgICAgICAgc2NoZW1hLT5pZCA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgImlkIik7Ci0gICAgICAgIHNjaGVtYS0+dmVyc2lvbiA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgInZlcnNpb24iKTsKKwl4bWxTY2hlbWFQVmFsQXR0cihjdHh0LCBOVUxMLCBOVUxMLCBub2RlLCAidmVyc2lvbiIsIAorCSAgICB4bWxTY2hlbWFHZXRCdWlsdEluVHlwZShYTUxfU0NIRU1BU19UT0tFTiksICYoc2NoZW1hLT52ZXJzaW9uKSk7CisKICAgICAgICAgdmFsID0geG1sU2NoZW1hR2V0UHJvcChjdHh0LCBub2RlLCAiZWxlbWVudEZvcm1EZWZhdWx0Iik7CiAgICAgICAgIGlmICh2YWwgIT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKHhtbFN0ckVxdWFsKHZhbCwgQkFEX0NBU1QgInF1YWxpZmllZCIpKQogICAgICAgICAgICAgICAgIHNjaGVtYS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfUVVBTElGX0VMRU07CiAgICAgICAgICAgICBlbHNlIGlmICgheG1sU3RyRXF1YWwodmFsLCBCQURfQ0FTVCAidW5xdWFsaWZpZWQiKSkgewotICAgICAgICAgICAgICAgIHhtbFNjaGVtYVBFcnIyKGN0eHQsIG5vZGUsIGNoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX0VMRU1GT1JNREVGQVVMVF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSAlcyBmb3IgZWxlbWVudEZvcm1EZWZhdWx0XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgTlVMTCk7CisgICAgICAgICAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBub2RlLCAKKwkJICAgIFhNTF9TQ0hFTUFQX0VMRU1GT1JNREVGQVVMVF9WQUxVRSwKKwkJICAgICJFbGVtZW50IFwic2NoZW1hXCI6IFRoZSB2YWx1ZSBcIiVzXCIgb2YgdGhlIGF0dHJpYnV0ZSAiCisJCSAgICAiXCJlbGVtZW50Rm9ybURlZmF1bHRcIiBpcyBub3QgdmFsaWQuIEV4cGVjdGVkIGlzICIKKwkJICAgICIocXVhbGlmaWVkIHwgdW5xdWFsaWZpZWQpLlxuIiwKKwkJICAgIHZhbCwgTlVMTCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAJICAgIC8qIFJlbW92ZWQsIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBlbGVtZW50Rm9ybURlZmF1bHQKQEAgLTQ3NDksNTYgKzY3NjYsNDcgQEAKICAgICAgICAgICAgIGlmICh4bWxTdHJFcXVhbCh2YWwsIEJBRF9DQVNUICJxdWFsaWZpZWQiKSkKICAgICAgICAgICAgICAgICBzY2hlbWEtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX1FVQUxJRl9BVFRSOwogICAgICAgICAgICAgZWxzZSBpZiAoIXhtbFN0ckVxdWFsKHZhbCwgQkFEX0NBU1QgInVucXVhbGlmaWVkIikpIHsKLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFQRXJyMihjdHh0LCBub2RlLCBjaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9BVFRSRk9STURFRkFVTFRfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWUgJXMgZm9yIGF0dHJpYnV0ZUZvcm1EZWZhdWx0XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgTlVMTCk7CisgICAgICAgICAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBub2RlLCAKKwkJICAgIFhNTF9TQ0hFTUFQX0FUVFJGT1JNREVGQVVMVF9WQUxVRSwKKwkJICAgICJFbGVtZW50IFwic2NoZW1hXCI6IFRoZSB2YWx1ZSBcIiVzXCIgb2YgdGhlIGF0dHJpYnV0ZSAiCisJCSAgICAiXCJhdHRyaWJ1dGVGb3JtRGVmYXVsdFwiIGlzIG5vdCB2YWxpZC4gRXhwZWN0ZWQgaXMgIgorCQkgICAgIihxdWFsaWZpZWQgfCB1bnF1YWxpZmllZCkuXG4iLAorCQkgICAgdmFsLCBOVUxMKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSAKLQorCQogCXZhbCA9IHhtbFNjaGVtYUdldFByb3AoY3R4dCwgbm9kZSwgImZpbmFsRGVmYXVsdCIpOwogCWlmICh2YWwgIT0gTlVMTCkgewotCSAgICBpZiAoeG1sU3RyRXF1YWwodmFsLCBCQURfQ0FTVCAiI2FsbCIpKSB7Ci0JCXNjaGVtYS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfRklOQUxfREVGQVVMVF9FWFRFTlNJT047IAotCQlzY2hlbWEtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0ZJTkFMX0RFRkFVTFRfUkVTVFJJQ1RJT047IAotCQlzY2hlbWEtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0ZJTkFMX0RFRkFVTFRfTElTVDsgCi0JCXNjaGVtYS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfRklOQUxfREVGQVVMVF9VTklPTjsgCQkKLQkgICAgfSBlbHNlIHsKLQkJY29uc3QgeG1sQ2hhciAqZW5kLCAqY3VyID0gdmFsOwotCQl4bWxDaGFyICppdGVtOwotCQkKLQkJZG8gewotCQkgICAgd2hpbGUgKElTX0JMQU5LX0NIKCpjdXIpKQotCQkJY3VyKys7Ci0JCSAgICBlbmQgPSBjdXI7Ci0JCSAgICB3aGlsZSAoKCplbmQgIT0gMCkgJiYgKCEoSVNfQkxBTktfQ0goKmVuZCkpKSkKLQkJCWVuZCsrOwotCQkgICAgaWYgKGVuZCA9PSBjdXIpCi0JCQlicmVhazsKLQkJICAgIGl0ZW0gPSB4bWxTdHJuZHVwKGN1ciwgZW5kIC0gY3VyKTsgICAgCSAgICAKLQkJICAgIGlmICh4bWxTdHJFcXVhbChpdGVtLCBCQURfQ0FTVCAiZXh0ZW5zaW9uIikpIHsKLQkJCWlmICgoc2NoZW1hLT5mbGFncyAmIFhNTF9TQ0hFTUFTX0ZJTkFMX0RFRkFVTFRfRVhURU5TSU9OKSA9PSAwKQotCQkJICAgIHNjaGVtYS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfRklOQUxfREVGQVVMVF9FWFRFTlNJT047IAotCQkgICAgfSBlbHNlIGlmICh4bWxTdHJFcXVhbChpdGVtLCBCQURfQ0FTVCAicmVzdHJpY3Rpb24iKSkgewotCQkJaWYgKChzY2hlbWEtPmZsYWdzICYgWE1MX1NDSEVNQVNfRklOQUxfREVGQVVMVF9SRVNUUklDVElPTikgPT0gMCkKLQkJCSAgICBzY2hlbWEtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0ZJTkFMX0RFRkFVTFRfUkVTVFJJQ1RJT047IAotCQkgICAgfSBlbHNlIGlmICh4bWxTdHJFcXVhbChpdGVtLCBCQURfQ0FTVCAibGlzdCIpKSB7Ci0JCQlpZiAoKHNjaGVtYS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19GSU5BTF9ERUZBVUxUX0xJU1QpID09IDApCi0JCQkgICAgc2NoZW1hLT5mbGFncyB8PSBYTUxfU0NIRU1BU19GSU5BTF9ERUZBVUxUX0xJU1Q7IAotCQkgICAgfSBlbHNlIGlmICh4bWxTdHJFcXVhbChpdGVtLCBCQURfQ0FTVCAidW5pb24iKSkgewotCQkJaWYgKChzY2hlbWEtPmZsYWdzICYgWE1MX1NDSEVNQVNfRklOQUxfREVGQVVMVF9VTklPTikgPT0gMCkKLQkJCSAgICBzY2hlbWEtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0ZJTkFMX0RFRkFVTFRfVU5JT047IAotCQkgICAgfSBlbHNlIHsKLQkJCXhtbFNjaGVtYVBFcnIoY3R4dCwgbm9kZSwgCi0JCQkgICAgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAotCQkJICAgICJJbnZhbGlkIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIFwiZmluYWxEZWZhdWx0XCIuXG4iLAotCQkJICAgIE5VTEwsIE5VTEwpOwkJCSAgICAJCSAgICAKLQkJICAgIH0KLQkJICAgIGlmIChpdGVtICE9IE5VTEwpCi0JCQl4bWxGcmVlKGl0ZW0pOwotCQkgICAgY3VyID0gZW5kOwotCQl9IHdoaWxlICgqY3VyICE9IDApOyAKLQkgICAgfQorCSAgICBpZiAoeG1sU2NoZW1hUFZhbEF0dHJCbG9ja0ZpbmFsKHZhbCwgJihzY2hlbWEtPmZsYWdzKSwgLTEsCisJCVhNTF9TQ0hFTUFTX0ZJTkFMX0RFRkFVTFRfRVhURU5TSU9OLAorCQlYTUxfU0NIRU1BU19GSU5BTF9ERUZBVUxUX1JFU1RSSUNUSU9OLAorCQktMSwKKwkJWE1MX1NDSEVNQVNfRklOQUxfREVGQVVMVF9MSVNULAorCQlYTUxfU0NIRU1BU19GSU5BTF9ERUZBVUxUX1VOSU9OKSAhPSAwKSB7CisJCXhtbFNjaGVtYVBFcnIoY3R4dCwgbm9kZSwgCisJCSAgICBYTUxfU0NIRU1BUF9BVFRSRk9STURFRkFVTFRfVkFMVUUsCisJCSAgICAiRWxlbWVudCBcInNjaGVtYVwiOiBUaGUgdmFsdWUgXCIlc1wiIG9mIHRoZSBhdHRyaWJ1dGUgIgorCQkgICAgIlwiZmluYWxEZWZhdWx0XCIgaXMgbm90IHZhbGlkLiBFeHBlY3RlZCBpcyAiCisJCSAgICAiKCNhbGwgfCBMaXN0IG9mIChleHRlbnNpb24gfCByZXN0cmljdGlvbiB8IGxpc3QgfCAiCisJCSAgICAidW5pb24pKS5cbiIsCisJCSAgICB2YWwsIE5VTEwpOworCSAgICB9CSAgICAKKwl9CisKKwl2YWwgPSB4bWxTY2hlbWFHZXRQcm9wKGN0eHQsIG5vZGUsICJibG9ja0RlZmF1bHQiKTsKKwlpZiAodmFsICE9IE5VTEwpIHsKKwkgICAgaWYgKHhtbFNjaGVtYVBWYWxBdHRyQmxvY2tGaW5hbCh2YWwsICYoc2NoZW1hLT5mbGFncyksIC0xLAorCQlYTUxfU0NIRU1BU19CTE9DS19ERUZBVUxUX0VYVEVOU0lPTiwKKwkJWE1MX1NDSEVNQVNfQkxPQ0tfREVGQVVMVF9SRVNUUklDVElPTiwKKwkJWE1MX1NDSEVNQVNfQkxPQ0tfREVGQVVMVF9TVUJTVElUVVRJT04sIC0xLCAtMSkgIT0gMCkgeworCQl4bWxTY2hlbWFQRXJyKGN0eHQsIG5vZGUsIAorCQkgICAgWE1MX1NDSEVNQVBfQVRUUkZPUk1ERUZBVUxUX1ZBTFVFLAorCQkgICAgIkVsZW1lbnQgXCJzY2hlbWFcIjogVGhlIHZhbHVlIFwiJXNcIiBvZiB0aGUgYXR0cmlidXRlICIKKwkJICAgICJcImJsb2NrRGVmYXVsdFwiIGlzIG5vdCB2YWxpZC4gRXhwZWN0ZWQgaXMgIgorCQkgICAgIigjYWxsIHwgTGlzdCBvZiAoZXh0ZW5zaW9uIHwgcmVzdHJpY3Rpb24gfCAiCisJCSAgICAic3Vic3RpdHV0aW9uKSkuXG4iLAorCQkgICAgdmFsLCBOVUxMKTsKKwkgICAgfQkgICAgCiAJfQogCiAgICAgICAgIHhtbFNjaGVtYVBhcnNlU2NoZW1hVG9wTGV2ZWwoY3R4dCwgc2NoZW1hLCBub2RlLT5jaGlsZHJlbik7CkBAIC00ODEwLDExICs2ODE4LDExIEBACiAgICAgICAgIGlmICgoZG9jICE9IE5VTEwpICYmIChkb2MtPlVSTCAhPSBOVUxMKSkgewogCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBkb2MsCiAJCSAgICAgIFhNTF9TQ0hFTUFQX05PVF9TQ0hFTUEsCi0JCSAgICAgICJGaWxlICVzIGlzIG5vdCBhIHNjaGVtYXMiLCBkb2MtPlVSTCwgTlVMTCk7CisJCSAgICAgICJUaGUgZmlsZSBcIiVzXCIgaXMgbm90IGEgWE1MIHNjaGVtYS5cbiIsIGRvYy0+VVJMLCBOVUxMKTsKIAl9IGVsc2UgewogCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBkb2MsCiAJCSAgICAgIFhNTF9TQ0hFTUFQX05PVF9TQ0hFTUEsCi0JCSAgICAgICJGaWxlIGlzIG5vdCBhIHNjaGVtYXMiLCBOVUxMLCBOVUxMKTsKKwkJICAgICAgIlRoZSBmaWxlIGlzIG5vdCBhIFhNTCBzY2hlbWEuXG4iLCBOVUxMLCBOVUxMKTsKIAl9CiAJcmV0dXJuKE5VTEwpOwogICAgIH0KQEAgLTQ4NjQsNyArNjg3Miw3IEBACiAKICAgICByZXQgPSAoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cikgeG1sTWFsbG9jKHNpemVvZih4bWxTY2hlbWFQYXJzZXJDdHh0KSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgICAgIHhtbFNjaGVtYVBFcnJNZW1vcnkoTlVMTCwgImFsbG9jYXRpbmcgc2NoYW1hIHBhcnNlciBjb250ZXh0IiwKKyAgICAgICAgeG1sU2NoZW1hUEVyck1lbW9yeShOVUxMLCAiYWxsb2NhdGluZyBzY2hlbWEgcGFyc2VyIGNvbnRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgIH0KQEAgLTQ4OTUsNyArNjkwMyw3IEBACiAKICAgICByZXQgPSAoeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cikgeG1sTWFsbG9jKHNpemVvZih4bWxTY2hlbWFQYXJzZXJDdHh0KSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgICAgIHhtbFNjaGVtYVBFcnJNZW1vcnkoTlVMTCwgImFsbG9jYXRpbmcgc2NoYW1hIHBhcnNlciBjb250ZXh0IiwKKyAgICAgICAgeG1sU2NoZW1hUEVyck1lbW9yeShOVUxMLCAiYWxsb2NhdGluZyBzY2hlbWEgcGFyc2VyIGNvbnRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgIH0KQEAgLTQ5ODEsMTcgKzY5ODksMTEzIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3dpdGNoICh0eXBlLT50eXBlKSB7Ci0gICAgICAgIGNhc2UgWE1MX1NDSEVNQV9UWVBFX0FOWToKLSAgICAgICAgICAgIC8qIFRPRE8gOiBoYW5kbGUgdGhlIG5hbWVzcGFjZSB0b28gKi8KLSAgICAgICAgICAgIC8qIFRPRE8gOiBtYWtlIHRoYXQgYSBzcGVjaWZpYyB0cmFuc2l0aW9uIHR5cGUgKi8KLQkgICAgLyogRGFuaWVsIHNheXM6IHVzZSB4bWxBdXRvbWF0YU5ld1RyYW5zaXRpb24yICovCi0gICAgICAgICAgICBUT0RPIGN0eHQtPnN0YXRlID0KLSAgICAgICAgICAgICAgICB4bWxBdXRvbWF0YU5ld1RyYW5zaXRpb24oY3R4dC0+YW0sIGN0eHQtPnN0YXRlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQURfQ0FTVCAiKiIsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWE1MX1NDSEVNQV9UWVBFX0VMRU1FTlQ6ewotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnRQdHIgZWxlbSA9ICh4bWxTY2hlbWFFbGVtZW50UHRyKSB0eXBlOworCWNhc2UgWE1MX1NDSEVNQV9UWVBFX0FOWTogeyAgIAorCSAgICB4bWxBdXRvbWF0YVN0YXRlUHRyIHN0YXJ0LCBlbmQ7CisJICAgIHhtbFNjaGVtYVdpbGRjYXJkUHRyIHdpbGQ7CSAgICAKKwkgICAgeG1sU2NoZW1hV2lsZGNhcmROc1B0ciBuczsKIAorCSAgICB3aWxkID0gdHlwZS0+YXR0cmlidXRlV2lsZGNhcmQ7CisKKwkgICAgaWYgKHdpbGQgPT0gTlVMTCkgeworCQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKKwkJICAgICJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hQnVpbGRBQ29udGVudE1vZGVsLCAiCisJCSAgICAibm8gd2lsZGNhcmQgb24geHNkOmFueS5cbiIsIE5VTEwsIE5VTEwpOworCQlyZXR1cm47CisJICAgIH0JICAgICAKKwkgICAgCisJICAgIHN0YXJ0ID0gY3R4dC0+c3RhdGU7CisJICAgIGVuZCA9IHhtbEF1dG9tYXRhTmV3U3RhdGUoY3R4dC0+YW0pOworCSAgICAKKwkgICAgaWYgKHR5cGUtPm1heE9jY3VycyA9PSAxKSB7CQkKKwkJaWYgKHdpbGQtPmFueSA9PSAxKSB7CisJCSAgICAvKgorCQkgICAgKiBXZSBuZWVkIHRvIGFkZCBib3RoIHRyYW5zaXRpb25zOgorCQkgICAgKgorCQkgICAgKiAxLiB0aGUgeyIqIiwgIioifSBmb3IgZWxlbWVudHMgaW4gYSBuYW1lc3BhY2UuCisJCSAgICAqLwkJICAgIAorCQkgICAgY3R4dC0+c3RhdGUgPSAKKwkJCXhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbjIoY3R4dC0+YW0sCisJCQlzdGFydCwgTlVMTCwgQkFEX0NBU1QgIioiLCBCQURfQ0FTVCAiKiIsIHR5cGUpOworCQkgICAgeG1sQXV0b21hdGFOZXdFcHNpbG9uKGN0eHQtPmFtLCBjdHh0LT5zdGF0ZSwgZW5kKTsKKwkJICAgIC8qCisJCSAgICAqIDIuIHRoZSB7IioifSBmb3IgZWxlbWVudHMgaW4gbm8gbmFtZXNwYWNlLgorCQkgICAgKi8KKwkJICAgIGN0eHQtPnN0YXRlID0gCisJCQl4bWxBdXRvbWF0YU5ld1RyYW5zaXRpb24yKGN0eHQtPmFtLAorCQkJc3RhcnQsIE5VTEwsIEJBRF9DQVNUICIqIiwgTlVMTCwgdHlwZSk7CisJCSAgICB4bWxBdXRvbWF0YU5ld0Vwc2lsb24oY3R4dC0+YW0sIGN0eHQtPnN0YXRlLCBlbmQpOworCisJCX0gZWxzZSBpZiAod2lsZC0+bnNTZXQgIT0gTlVMTCkgeworCQkgICAgbnMgPSB3aWxkLT5uc1NldDsKKwkJICAgIGRvIHsKKwkJCWN0eHQtPnN0YXRlID0gc3RhcnQ7CisJCQljdHh0LT5zdGF0ZSA9IHhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbjIoY3R4dC0+YW0sCisJCQkgICAgY3R4dC0+c3RhdGUsIE5VTEwsIEJBRF9DQVNUICIqIiwgbnMtPnZhbHVlLCB0eXBlKTsKKwkJCXhtbEF1dG9tYXRhTmV3RXBzaWxvbihjdHh0LT5hbSwgY3R4dC0+c3RhdGUsIGVuZCk7CisJCQlucyA9IG5zLT5uZXh0OworCQkgICAgfSB3aGlsZSAobnMgIT0gTlVMTCk7CisKKwkJfSBlbHNlIGlmICh3aWxkLT5uZWdOc1NldCAhPSBOVUxMKSB7CisJCSAgICB4bWxBdXRvbWF0YVN0YXRlUHRyIGRlYWRFbmQ7CisKKwkJICAgIGRlYWRFbmQgPSB4bWxBdXRvbWF0YU5ld1N0YXRlKGN0eHQtPmFtKTsKKwkJICAgIGN0eHQtPnN0YXRlID0geG1sQXV0b21hdGFOZXdUcmFuc2l0aW9uMihjdHh0LT5hbSwKKwkJCXN0YXJ0LCBkZWFkRW5kLCBCQURfQ0FTVCAiKiIsIHdpbGQtPm5lZ05zU2V0LT52YWx1ZSwgdHlwZSk7CisJCSAgICBjdHh0LT5zdGF0ZSA9IHhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbjIoY3R4dC0+YW0sCisJCQlzdGFydCwgTlVMTCwgQkFEX0NBU1QgIioiLCBCQURfQ0FTVCAiKiIsIHR5cGUpOworCQkgICAgeG1sQXV0b21hdGFOZXdFcHNpbG9uKGN0eHQtPmFtLCBjdHh0LT5zdGF0ZSwgZW5kKTsKKwkJfQkJCisJICAgIH0gZWxzZSB7CisJCWludCBjb3VudGVyOworCQl4bWxBdXRvbWF0YVN0YXRlUHRyIGhvcDsKKwkJaW50IG1heE9jY3VycyA9IAorCQkgICAgdHlwZS0+bWF4T2NjdXJzID09IFVOQk9VTkRFRCA/IFVOQk9VTkRFRCA6IHR5cGUtPm1heE9jY3VycyAtIDE7CisJCWludCBtaW5PY2N1cnMgPQorCQkgICAgdHlwZS0+bWluT2NjdXJzIDwgMSA/IDAgOiB0eXBlLT5taW5PY2N1cnMgLSAxOworCQkKKwkJY291bnRlciA9IHhtbEF1dG9tYXRhTmV3Q291bnRlcihjdHh0LT5hbSwgbWluT2NjdXJzLCBtYXhPY2N1cnMpOworCQlob3AgPSB4bWxBdXRvbWF0YU5ld1N0YXRlKGN0eHQtPmFtKTsJCQorCQlpZiAod2lsZC0+YW55ID09IDEpIHsJCSAgICAKKwkJICAgIGN0eHQtPnN0YXRlID0KKwkJCXhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbjIoY3R4dC0+YW0sCisJCQlzdGFydCwgTlVMTCwgQkFEX0NBU1QgIioiLCBCQURfQ0FTVCAiKiIsIHR5cGUpOworCQkgICAgeG1sQXV0b21hdGFOZXdFcHNpbG9uKGN0eHQtPmFtLCBjdHh0LT5zdGF0ZSwgaG9wKTsKKwkJICAgIGN0eHQtPnN0YXRlID0gCisJCQl4bWxBdXRvbWF0YU5ld1RyYW5zaXRpb24yKGN0eHQtPmFtLAorCQkJc3RhcnQsIE5VTEwsIEJBRF9DQVNUICIqIiwgTlVMTCwgdHlwZSk7CisJCSAgICB4bWxBdXRvbWF0YU5ld0Vwc2lsb24oY3R4dC0+YW0sIGN0eHQtPnN0YXRlLCBob3ApOworCQl9IGVsc2UgaWYgKHdpbGQtPm5zU2V0ICE9IE5VTEwpIHsJCSAgICAKKwkJICAgIG5zID0gd2lsZC0+bnNTZXQ7CisJCSAgICBkbyB7CisJCQljdHh0LT5zdGF0ZSA9IAorCQkJICAgIHhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbjIoY3R4dC0+YW0sCisJCQkJc3RhcnQsIE5VTEwsIEJBRF9DQVNUICIqIiwgbnMtPnZhbHVlLCB0eXBlKTsKKwkJCXhtbEF1dG9tYXRhTmV3RXBzaWxvbihjdHh0LT5hbSwgY3R4dC0+c3RhdGUsIGhvcCk7CisJCQlucyA9IG5zLT5uZXh0OworCQkgICAgfSB3aGlsZSAobnMgIT0gTlVMTCk7CisKKwkJfSBlbHNlIGlmICh3aWxkLT5uZWdOc1NldCAhPSBOVUxMKSB7CisJCSAgICB4bWxBdXRvbWF0YVN0YXRlUHRyIGRlYWRFbmQ7CisKKwkJICAgIGRlYWRFbmQgPSB4bWxBdXRvbWF0YU5ld1N0YXRlKGN0eHQtPmFtKTsKKwkJICAgIGN0eHQtPnN0YXRlID0geG1sQXV0b21hdGFOZXdUcmFuc2l0aW9uMihjdHh0LT5hbSwKKwkJCXN0YXJ0LCBkZWFkRW5kLCBCQURfQ0FTVCAiKiIsIHdpbGQtPm5lZ05zU2V0LT52YWx1ZSwgdHlwZSk7CisJCSAgICBjdHh0LT5zdGF0ZSA9IHhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbjIoY3R4dC0+YW0sCisJCQlzdGFydCwgTlVMTCwgQkFEX0NBU1QgIioiLCBCQURfQ0FTVCAiKiIsIHR5cGUpOworCQkgICAgeG1sQXV0b21hdGFOZXdFcHNpbG9uKGN0eHQtPmFtLCBjdHh0LT5zdGF0ZSwgaG9wKTsKKwkJfQkKKwkJeG1sQXV0b21hdGFOZXdDb3VudGVkVHJhbnMoY3R4dC0+YW0sIGhvcCwgc3RhcnQsIGNvdW50ZXIpOworCQl4bWxBdXRvbWF0YU5ld0NvdW50ZXJUcmFucyhjdHh0LT5hbSwgaG9wLCBlbmQsIGNvdW50ZXIpOworCSAgICB9CisJICAgIGlmICh0eXBlLT5taW5PY2N1cnMgPT0gMCkgeworCQl4bWxBdXRvbWF0YU5ld0Vwc2lsb24oY3R4dC0+YW0sIHN0YXJ0LCBlbmQpOworCSAgICB9CSAgICAJICAgIAkJCQkgICAgICAgICAgICAKKwkgICAgY3R4dC0+c3RhdGUgPSBlbmQ7CisgICAgICAgICAgICBicmVhazsKKwl9CisgICAgICAgIGNhc2UgWE1MX1NDSEVNQV9UWVBFX0VMRU1FTlQ6eworICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnRQdHIgZWxlbSA9ICh4bWxTY2hlbWFFbGVtZW50UHRyKSB0eXBlOwkJCisJCQogICAgICAgICAgICAgICAgIC8qIFRPRE8gOiBoYW5kbGUgdGhlIG5hbWVzcGFjZSB0b28gKi8KICAgICAgICAgICAgICAgICB4bWxBdXRvbWF0YVN0YXRlUHRyIG9sZHN0YXRlID0gY3R4dC0+c3RhdGU7CiAKQEAgLTUwMTcsOSArNzEyMSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+c3RhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxBdXRvbWF0YU5ld1RyYW5zaXRpb24oY3R4dC0+YW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbjIoY3R4dC0+YW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LT5zdGF0ZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0tPm5hbWUsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS0+bmFtZSwgCisJCQkJCQkJIGVsZW0tPnRhcmdldE5hbWVzcGFjZSwKKwkJCQkJCQkgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBjdHh0LT5zdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEF1dG9tYXRhTmV3Q291bnRlZFRyYW5zKGN0eHQtPmFtLCB0bXAsIG9sZHN0YXRlLApAQCAtNTAzNyw5ICs3MTQzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LT5zdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbihjdHh0LT5hbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQXV0b21hdGFOZXdUcmFuc2l0aW9uMihjdHh0LT5hbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPnN0YXRlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS0+bmFtZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLT5uYW1lLCAKKwkJCQkJCQkgZWxlbS0+dGFyZ2V0TmFtZXNwYWNlLAorCQkJCQkJCSB0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEF1dG9tYXRhTmV3RXBzaWxvbihjdHh0LT5hbSwgY3R4dC0+c3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkc3RhdGUpOwpAQCAtNTA2NiwxMCArNzE3NCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0tPnJlZkRlY2wsIGN0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS0+cmVmRGVjbC0+bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdHh0LT5zdGF0ZSA9IHhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbihjdHh0LT5hbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPnN0YXRlID0geG1sQXV0b21hdGFOZXdUcmFuc2l0aW9uMihjdHh0LT5hbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPnN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0tPm5hbWUsCisJCQkJCQkJICAgICAgIGVsZW0tPnRhcmdldE5hbWVzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGN0eHQtPnN0YXRlOwpAQCAtNTA5MCwxMCArNzE5OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0tPnJlZkRlY2wsIGN0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS0+cmVmRGVjbC0+bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdHh0LT5zdGF0ZSA9IHhtbEF1dG9tYXRhTmV3VHJhbnNpdGlvbihjdHh0LT5hbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPnN0YXRlID0geG1sQXV0b21hdGFOZXdUcmFuc2l0aW9uMihjdHh0LT5hbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPnN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0tPm5hbWUsCisJCQkJCQkJICAgICAgIGVsZW0tPnRhcmdldE5hbWVzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLT5taW5PY2N1cnMgPT0gMCkgewpAQCAtNTI2NywxMCArNzM3Nyw3IEBACiAgICAgICAgIGNhc2UgWE1MX1NDSEVNQV9UWVBFX0FMTDp7CiAgICAgICAgICAgICAgICAgeG1sQXV0b21hdGFTdGF0ZVB0ciBzdGFydDsKICAgICAgICAgICAgICAgICB4bWxTY2hlbWFUeXBlUHRyIHN1YnR5cGVzOwotCQkvKiAKLQkJICogQ2hhbmdlZCwgc2luY2UgdHlwZSBpbiBub3QgYW4geG1sU2NoZW1hRWxlbWVudCBoZXJlLgotCQkgKi8KLSAgICAgICAgICAgICAgICAvKiB4bWxTY2hlbWFFbGVtZW50UHRyIGVsZW0gPSAoeG1sU2NoZW1hRWxlbWVudFB0cikgdHlwZTsgKi8KKwogCQl4bWxTY2hlbWFFbGVtZW50UHRyIGVsZW07CiAgICAgICAgICAgICAgICAgaW50IGxheDsKIApAQCAtNTMxNywxMCArNzQyNCwxMSBAQAogICAgICAgICAgICAgICAgIHhtbFNjaGVtYVR5cGVQdHIgc3VidHlwZXM7CiAKIAkJaWYgKHR5cGUtPnJlY3Vyc2UpIHsgCi0JCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsIAotCQkgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9VTktOT1dOX0JBU0VfVFlQRSwgCi0JCQkgICAgIlNjaGVtYXM6IGV4dGVuc2lvbiB0eXBlICVzIGlzIHJlY3Vyc2l2ZVxuIiwgCi0JCQkJICB0eXBlLT5uYW1lLCBOVUxMKTsgCisJCSAgICAvKiBUT0RPOiBDaGFuZ2UgdGhlIGVycm9yIGNvZGUuICovCisJCSAgICB4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCisJCQkgICAgWE1MX1NDSEVNQVBfVU5LTk9XTl9CQVNFX1RZUEUsCisJCQkgICAgTlVMTCwgdHlwZSwgdHlwZS0+bm9kZSwJCisJCQkgICAgIlRoaXMgaXRlbSBpcyBjaXJjdWxhciIsIE5VTEwpOwkJICAgICAKIAkJICAgIHJldHVybjsgCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHR5cGUtPnJlY3Vyc2UgPSAxOyAKQEAgLTUzNDEsMTAgKzc0NDksMTEgQEAKIAkJICAgIHJncm91cCA9IHhtbFNjaGVtYUdldEdyb3VwKGN0eHQtPnNjaGVtYSwgdHlwZS0+cmVmLAogCQkgICAgCQkJICAgdHlwZS0+cmVmTnMpOwogCQkgICAgaWYgKHJncm91cCA9PSBOVUxMKSB7Ci0JCSAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAotCQkJCSAgICAgIFhNTF9TQ0hFTUFQX1VOS05PV05fUkVGLAotCQkJCSJTY2hlbWFzOiBncm91cCAlcyByZWZlcmVuY2UgJXMgaXMgbm90IGZvdW5kIiwKLQkJCQluYW1lLCB0eXBlLT5yZWYpOworCQkJeG1sU2NoZW1hUFJlc0NvbXBBdHRyRXJyKGN0eHQsIAorCQkJICAgIFhNTF9TQ0hFTUFQX1NSQ19SRVNPTFZFLCAKKwkJCSAgICBOVUxMLCB0eXBlLCBOVUxMLAorCQkJICAgICJyZWYiLCB0eXBlLT5yZWYsIHR5cGUtPnJlZk5zLCAKKwkJCSAgICBYTUxfU0NIRU1BX1RZUEVfR1JPVVAsIE5VTEwpOwkJICAgICAgICAKIAkJCXJldHVybjsKIAkJICAgIH0KIAkJICAgIHhtbFNjaGVtYUJ1aWxkQUNvbnRlbnRNb2RlbChyZ3JvdXAsIGN0eHQsIG5hbWUpOwpAQCAtNTQwNywxMiArNzUxNiwxMyBAQAogICAgIHhtbEF1dG9tYXRhU2V0RmluYWxTdGF0ZShjdHh0LT5hbSwgY3R4dC0+c3RhdGUpOwogICAgIGVsZW0tPmNvbnRNb2RlbCA9IHhtbEF1dG9tYXRhQ29tcGlsZShjdHh0LT5hbSk7CiAgICAgaWYgKGVsZW0tPmNvbnRNb2RlbCA9PSBOVUxMKSB7Ci0gICAgICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgZWxlbS0+bm9kZSwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAotICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY29tcGlsZSAlcyBjb250ZW50IG1vZGVsXG4iLCBuYW1lLCBOVUxMKTsKKyAgICAgICAgeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LCBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsIAorCSAgICBOVUxMLCAoeG1sU2NoZW1hVHlwZVB0cikgZWxlbSwgTlVMTCwJICAgIAorCSAgICAiRmFpbGVkIHRvIGNvbXBpbGUgdGhlIGNvbnRlbnQgbW9kZWwiLCBOVUxMKTsKICAgICB9IGVsc2UgaWYgKHhtbFJlZ2V4cElzRGV0ZXJtaW5pc3QoZWxlbS0+Y29udE1vZGVsKSAhPSAxKSB7Ci0gICAgICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgZWxlbS0+bm9kZSwgWE1MX1NDSEVNQVNfRVJSX05PVERFVEVSTUlOSVNULAotICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50IG1vZGVsIG9mICVzIGlzIG5vdCBkZXRlcm1pbmlzdDpcbiIsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHhtbFNjaGVtYVBDdXN0b21FcnIoY3R4dCwgWE1MX1NDSEVNQVNfRVJSX05PVERFVEVSTUlOSVNULAorCSAgICBOVUxMLCAoeG1sU2NoZW1hVHlwZVB0cikgZWxlbSwgTlVMTCwKKwkgICAgIlRoZSBjb250ZW50IG1vZGVsIGlzIG5vdCBkZXRlcm1pbmlzdCIsIE5VTEwpOwogICAgIH0gZWxzZSB7CiAjaWZkZWYgREVCVUdfQ09OVEVOVF9SRUdFWFAKICAgICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCkBAIC01NDMwLDYyICs3NTQwLDg2IEBACiAgKiBAZWxlbTogIHRoZSBzY2hlbWEgZWxlbWVudCBjb250ZXh0CiAgKiBAY3R4dDogIHRoZSBzY2hlbWEgcGFyc2VyIGNvbnRleHQKICAqCi0gKiBGcmVlIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB0byB0aGUgc2NoZW1hIHBhcnNlciBjb250ZXh0CisgKiBSZXNvbHZlcyB0aGUgcmVmZXJlbmNlcyBvZiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uCisgKiBvciBwYXJ0aWNsZSwgd2hpY2ggaGFzIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gYXMgaXQncworICogdGVybS4gCiAgKi8KIHN0YXRpYyB2b2lkCiB4bWxTY2hlbWFSZWZGaXh1cENhbGxiYWNrKHhtbFNjaGVtYUVsZW1lbnRQdHIgZWxlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWUgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIGNvbnRleHQgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqIG5hbWVzcGFjZSBBVFRSSUJVVEVfVU5VU0VEKQogewotICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoZWxlbSA9PSBOVUxMKSkKKyAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKGVsZW0gPT0gTlVMTCkgfHwgCisJKChlbGVtICE9IE5VTEwpICYmIChlbGVtLT5mbGFncyAmIFhNTF9TQ0hFTUFTX0VMRU1fSU5URVJOQUxfUkVTT0xWRUQpKSkKICAgICAgICAgcmV0dXJuOwotCisgICAgZWxlbS0+ZmxhZ3MgfD0gWE1MX1NDSEVNQVNfRUxFTV9JTlRFUk5BTF9SRVNPTFZFRDsKICAgICBpZiAoZWxlbS0+cmVmICE9IE5VTEwpIHsKICAgICAgICAgeG1sU2NoZW1hRWxlbWVudFB0ciBlbGVtRGVjbDsKIAotICAgICAgICBpZiAoZWxlbS0+c3VidHlwZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBlbGVtLT5ub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU0NIRU1BUF9JTlZBTElEX1JFRl9BTkRfU1VCVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjaGVtYXM6IGVsZW1lbnQgJXMgaGFzIGJvdGggcmVmIGFuZCBzdWJ0eXBlXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCS8qCisJKiBUT0RPOiBFdmFsdWF0ZSwgd2hhdCBlcnJvcnMgY291bGQgb2NjdXIgaWYgdGhlIGRlY2xhcmF0aW9uIGlzIG5vdAorCSogZm91bmQuIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRoYXQgdGhlICJ0eXBlZml4dXAiIG1pZ2h0IGNyYXNoIGlmCisJKiBubyByZWYgZGVjbGFyYXRpb24gd2FzIGZvdW5kLgorCSovCiAgICAgICAgIGVsZW1EZWNsID0geG1sU2NoZW1hR2V0RWxlbShjdHh0LT5zY2hlbWEsIGVsZW0tPnJlZiwgZWxlbS0+cmVmTnMsIDApOwotCi0gICAgICAgIGlmIChlbGVtRGVjbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIGVsZW0tPm5vZGUsIAorICAgICAgICBpZiAoZWxlbURlY2wgPT0gTlVMTCkgewkgIAorCSAgICB4bWxTY2hlbWFQUmVzQ29tcEF0dHJFcnIoY3R4dCwKIAkJWE1MX1NDSEVNQVBfU1JDX1JFU09MVkUsCi0JCSJFbGVtZW50IFwiJXNcIjogdGhlIFFOYW1lIFwiJXNcIiBvZiB0aGUgYXR0cmlidXRlICIKLQkJIlwicmVmXCIgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHNjaGVtYSAiCi0JCSJjb21wb25lbnQuXG4iLAotCQluYW1lLCBlbGVtLT5yZWYpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVsZW0tPnJlZkRlY2wgPSBlbGVtRGVjbDsKLSAgICB9IGVsc2UgaWYgKGVsZW0tPm5hbWVkVHlwZSAhPSBOVUxMKSB7Ci0gICAgICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZURlY2w7Ci0KLSAgICAgICAgaWYgKGVsZW0tPnN1YnR5cGVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgZWxlbS0+bm9kZSwgWE1MX1NDSEVNQVBfVFlQRV9BTkRfU1VCVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjaGVtYXM6IGVsZW1lbnQgJXMgaGFzIGJvdGggdHlwZSBhbmQgc3VidHlwZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHlwZURlY2wgPSB4bWxTY2hlbWFHZXRUeXBlKGN0eHQtPnNjaGVtYSwgZWxlbS0+bmFtZWRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS0+bmFtZWRUeXBlTnMpOwotCi0gICAgICAgIGlmICh0eXBlRGVjbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIGVsZW0tPm5vZGUsIAotCQlYTUxfU0NIRU1BUF9TUkNfUkVTT0xWRSwKLQkJIkVsZW1lbnQgXCIlc1wiOiB0aGUgUU5hbWUgXCIlc1wiIG9mIHRoZSBhdHRyaWJ1dGUgIgotCQkiXCJ0eXBlXCIgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHNjaGVtYSAiCi0JCSJjb21wb25lbnQuXG4iLCBuYW1lLCBlbGVtLT5uYW1lZFR5cGUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVsZW0tPnN1YnR5cGVzID0gdHlwZURlY2w7Ci0gICAgfQorCQlOVUxMLCAoeG1sU2NoZW1hVHlwZVB0cikgZWxlbSwgZWxlbS0+bm9kZSwKKwkJInJlZiIsIGVsZW0tPnJlZiwgZWxlbS0+cmVmTnMsIAorCQlYTUxfU0NIRU1BX1RZUEVfRUxFTUVOVCwgTlVMTCk7CisgICAgICAgIH0gZWxzZQorCSAgICBlbGVtLT5yZWZEZWNsID0gZWxlbURlY2w7CQorICAgIH0gZWxzZSB7CQorCWlmICgoZWxlbS0+c3VidHlwZXMgPT0gTlVMTCkgJiYgKGVsZW0tPm5hbWVkVHlwZSAhPSBOVUxMKSkgeworCSAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7CisJICAgIAorCSAgICAvKiAodHlwZSBkZWZpbml0aW9uKSAuLi4gb3RoZXJ3aXNlIHRoZSB0eXBlIGRlZmluaXRpb24gt3Jlc29sdmVktyAKKwkgICAgKiB0byBieSB0aGUgt2FjdHVhbCB2YWx1Zbcgb2YgdGhlIHR5cGUgW2F0dHJpYnV0ZV0gLi4uCisJICAgICovCSAgICAJICAgIAorCSAgICB0eXBlID0geG1sU2NoZW1hR2V0VHlwZShjdHh0LT5zY2hlbWEsIGVsZW0tPm5hbWVkVHlwZSwKKwkJZWxlbS0+bmFtZWRUeXBlTnMpOwkgICAgCisJICAgIGlmICh0eXBlID09IE5VTEwpIHsJCisJCXhtbFNjaGVtYVBSZXNDb21wQXR0ckVycihjdHh0LAorCQkgICAgWE1MX1NDSEVNQVBfU1JDX1JFU09MVkUsCisJCSAgICBOVUxMLCAoeG1sU2NoZW1hVHlwZVB0cikgZWxlbSwgZWxlbS0+bm9kZSwKKwkJICAgICJ0eXBlIiwgZWxlbS0+bmFtZWRUeXBlLCBlbGVtLT5uYW1lZFR5cGVOcywKKwkJICAgIFhNTF9TQ0hFTUFfVFlQRV9CQVNJQywgInR5cGUgZGVmaW5pdGlvbiIpOworCSAgICB9IGVsc2UKKwkJZWxlbS0+c3VidHlwZXMgPSB0eXBlOworCX0KKwlpZiAoZWxlbS0+c3Vic3RHcm91cCAhPSBOVUxMKSB7CisJICAgIHhtbFNjaGVtYUVsZW1lbnRQdHIgc3Vic3RIZWFkOworCSAgICAKKwkgICAgLyoKKwkgICAgKiBGSVhNRSBUT0RPOiBEbyB3ZSBuZWVkIGEgbmV3IGZpZWxkIGluIF94bWxTY2hlbWFFbGVtZW50IGZvciAKKwkgICAgKiBzdWJzdGl0dXRpb25Hcm91cD8KKwkgICAgKi8KKwkgICAgc3Vic3RIZWFkID0geG1sU2NoZW1hR2V0RWxlbShjdHh0LT5zY2hlbWEsIGVsZW0tPnN1YnN0R3JvdXAsIAorCQllbGVtLT5zdWJzdEdyb3VwTnMsIDApOwkgICAgCisJICAgIGlmIChzdWJzdEhlYWQgPT0gTlVMTCkgeworCQl4bWxTY2hlbWFQUmVzQ29tcEF0dHJFcnIoY3R4dCwKKwkJICAgIFhNTF9TQ0hFTUFQX1NSQ19SRVNPTFZFLAorCQkgICAgTlVMTCwgKHhtbFNjaGVtYVR5cGVQdHIpIGVsZW0sIE5VTEwsCisJCSAgICAic3Vic3RpdHV0aW9uR3JvdXAiLCBlbGVtLT5zdWJzdEdyb3VwLCBlbGVtLT5zdWJzdEdyb3VwTnMsCisJCSAgICBYTUxfU0NIRU1BX1RZUEVfRUxFTUVOVCwgTlVMTCk7CisJICAgIH0gZWxzZSB7CisJCXhtbFNjaGVtYVJlZkZpeHVwQ2FsbGJhY2soc3Vic3RIZWFkLCBjdHh0LCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJLyoKKwkJKiAodHlwZSBkZWZpbml0aW9uKS4uLm90aGVyd2lzZSB0aGUge3R5cGUgZGVmaW5pdGlvbn0gb2YgdGhlIAorCQkqIGVsZW1lbnQgZGVjbGFyYXRpb24gt3Jlc29sdmVktyB0byBieSB0aGUgt2FjdHVhbCB2YWx1Zbcgb2YgCisJCSogdGhlIHN1YnN0aXR1dGlvbkdyb3VwIFthdHRyaWJ1dGVdLCBpZiBwcmVzZW50CisJCSovCisJCWlmIChlbGVtLT5zdWJ0eXBlcyA9PSBOVUxMKSAKKwkJICAgIGVsZW0tPnN1YnR5cGVzID0gc3Vic3RIZWFkLT5zdWJ0eXBlczsKKwkgICAgfQorCX0KKwlpZiAoKGVsZW0tPnN1YnR5cGVzID09IE5VTEwpICYmIChlbGVtLT5uYW1lZFR5cGUgPT0gTlVMTCkgJiYKKwkgICAgKGVsZW0tPnN1YnN0R3JvdXAgPT0gTlVMTCkpCisJICAgIGVsZW0tPnN1YnR5cGVzID0geG1sU2NoZW1hR2V0QnVpbHRJblR5cGUoWE1MX1NDSEVNQVNfQU5ZVFlQRSk7CisgICAgfSAgICAKIH0KIAogLyoqCkBAIC01NDk4LDMyICs3NjMyLDMyIEBACiBzdGF0aWMgdm9pZAogeG1sU2NoZW1hUGFyc2VMaXN0UmVmRml4dXAoeG1sU2NoZW1hVHlwZVB0ciB0eXBlLCB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQpCiB7ICAgIAotICAgIC8qCi0gICAgKiBzcmMtbGlzdC1pdGVtVHlwZS1vci1zaW1wbGVUeXBlCi0gICAgKiBFaXRoZXIgdGhlIGl0ZW1UeXBlIFthdHRyaWJ1dGVdIG9yIHRoZSA8c2ltcGxlVHlwZT4gW2NoaWxkXSBvZiAKLSAgICAqIHRoZSA8bGlzdD4gZWxlbWVudCBtdXN0IGJlIHByZXNlbnQsIGJ1dCBub3QgYm90aC4gCi0gICAgKi8KKyAgICAKICAgICBpZiAoKCh0eXBlLT5iYXNlID09IE5VTEwpICYmIAogCSAodHlwZS0+c3VidHlwZXMgPT0gTlVMTCkpIHx8CiAJKCh0eXBlLT5iYXNlICE9IE5VTEwpICYmCiAJICh0eXBlLT5zdWJ0eXBlcyAhPSBOVUxMKSkpIHsJCi0JLyogCi0JKiBzcmMtcmVzdHJpY3Rpb24tYmFzZS1vci1zaW1wbGVUeXBlCi0JKiBFaXRoZXIgdGhlIGJhc2UgW2F0dHJpYnV0ZV0gb3IgdGhlIHNpbXBsZVR5cGUgW2NoaWxkXSBvZiB0aGUgCi0JKiA8cmVzdHJpY3Rpb24+IGVsZW1lbnQgbXVzdCBiZSBwcmVzZW50LCBidXQgbm90IGJvdGguIAorCS8qCisJKiBzcmMtbGlzdC1pdGVtVHlwZS1vci1zaW1wbGVUeXBlCisJKiBFaXRoZXIgdGhlIGl0ZW1UeXBlIFthdHRyaWJ1dGVdIG9yIHRoZSA8c2ltcGxlVHlwZT4gW2NoaWxkXSBvZiAKKwkqIHRoZSA8bGlzdD4gZWxlbWVudCBtdXN0IGJlIHByZXNlbnQsIGJ1dCBub3QgYm90aC4gCiAJKi8KLQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsCisJLyoKKwkqIFRPRE86IE1vdmUgdGhpcyB0byB0aGUgcGFyc2UgZnVuY3Rpb24uCisJKi8KKwl4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCiAJICAgIFhNTF9TQ0hFTUFQX1NSQ19MSVNUX0lURU1UWVBFX09SX1NJTVBMRVRZUEUsCi0JICAgICJMaXN0IFwiJXNcIjogIgotCSAgICAiRWl0aGVyIHRoZSBcImJhc2VcIiBhdHRyaWJ1dGUgb3IgdGhlIDxzaW1wbGVUeXBlPiBjaGlsZCAiCi0JICAgICJtdXN0IGJlIHByZXNlbnQsIGJ1dCBub3QgYm90aC5cbiIsCi0JICAgIHR5cGUtPm5hbWUsIE5VTEwpOworCSAgICBOVUxMLCB0eXBlLCB0eXBlLT5ub2RlLCAKKwkgICAgIlRoZSBhdHRyaWJ1dGUgJ2l0ZW1UeXBlJyBhbmQgdGhlIDxzaW1wbGVUeXBlPiBjaGlsZCAiCisJICAgICJhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIiwgTlVMTCk7CQogICAgIH0gZWxzZSBpZiAodHlwZS0+YmFzZSE9IE5VTEwpIHsgICAgICAgIAkKICAgICAgICAgdHlwZS0+c3VidHlwZXMgPSB4bWxTY2hlbWFHZXRUeXBlKGN0eHQtPnNjaGVtYSwgdHlwZS0+YmFzZSwgdHlwZS0+YmFzZU5zKTsKICAgICAgICAgaWYgKHR5cGUtPnN1YnR5cGVzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwgWE1MX1NDSEVNQVBfVU5LTk9XTl9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiTGlzdCBcIiVzXCIgcmVmZXJlbmNlcyBhbiB1bmtub3duIGl0ZW0gdHlwZTogXCIlc1wiXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT5uYW1lLCB0eXBlLT5iYXNlKTsKKwkgICAgeG1sU2NoZW1hUFJlc0NvbXBBdHRyRXJyKGN0eHQsCSAgICAKKwkJWE1MX1NDSEVNQVBfU1JDX1JFU09MVkUsCisJCU5VTEwsIHR5cGUsIHR5cGUtPm5vZGUsCisJCSJpdGVtVHlwZSIsIHR5cGUtPmJhc2UsIHR5cGUtPmJhc2VOcywKKwkJWE1MX1NDSEVNQV9UWVBFX1NJTVBMRSwgTlVMTCk7CiAgICAgICAgIH0KICAgICB9ICAgICAgICAgICAgICAgCiAgICAgaWYgKCh0eXBlLT5zdWJ0eXBlcyAhPSBOVUxMKSAmJiAKQEAgLTU1NDMsMTIgKzc2NzcsOSBAQAogeG1sU2NoZW1hUGFyc2VVbmlvblJlZkNoZWNrKHhtbFNjaGVtYVR5cGVQdHIgdHlwZSwKICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQpCiB7Ci0gICAgY29uc3QgeG1sQ2hhciAqY3VyLCAqZW5kLCAqcHJlZml4LCAqbmNOYW1lLCAqbmFtZXNwYWNlOwotICAgIHhtbENoYXIgKnRtcDsKKyAgICAKICAgICB4bWxTY2hlbWFUeXBlTGlua1B0ciBsaW5rLCBsYXN0TGluayA9IE5VTEwsIHByZXZMaW5rLCBzdWJMaW5rLCBuZXdMaW5rOwogICAgIHhtbFNjaGVtYVR5cGVQdHIgbWVtYmVyVHlwZSwgY3R4dFR5cGU7Ci0gICAgeG1sTnNQdHIgbnM7Ci0gICAgaW50IGxlbjsKIAogICAgIC8qIDEgSWYgdGhlIDx1bmlvbj4gYWx0ZXJuYXRpdmUgaXMgY2hvc2VuLCB0aGVuIFtEZWZpbml0aW9uOl0gIAogICAgICogZGVmaW5lIHRoZSBleHBsaWNpdCBtZW1iZXJzIGFzIHRoZSB0eXBlIGRlZmluaXRpb25zILdyZXNvbHZlZLcgCkBAIC01NTczLDIxICs3NzA0LDIxIEBACiAgICAgKi8KICAgICBpZiAoKHR5cGUtPmJhc2UgPT0gTlVMTCkgJiYgCiAJKHR5cGUtPnN1YnR5cGVzID09IE5VTEwpKSB7Ci0JLyogCi0JKiBzcmMtcmVzdHJpY3Rpb24tYmFzZS1vci1zaW1wbGVUeXBlCi0JKiBFaXRoZXIgdGhlIGJhc2UgW2F0dHJpYnV0ZV0gb3IgdGhlIHNpbXBsZVR5cGUgW2NoaWxkXSBvZiB0aGUgCi0JKiA8cmVzdHJpY3Rpb24+IGVsZW1lbnQgbXVzdCBiZSBwcmVzZW50LCBidXQgbm90IGJvdGguIAotCSovCi0JeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAorCXhtbFNjaGVtYVBDdXN0b21FcnIoY3R4dCwgCiAJICAgIFhNTF9TQ0hFTUFQX1NSQ19VTklPTl9NRU1CRVJUWVBFU19PUl9TSU1QTEVUWVBFUywKLQkgICAgIlVuaW9uIFwiJXNcIjogIgotCSAgICAiRWl0aGVyIHRoZSBcIm1lbWJlclR5cGVzXCIgYXR0cmlidXRlIG11c3QgYmUgbm9uLWVtcHR5ICIKLQkgICAgIm9yIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIDxzaW1wbGVUeXBlPiBjaGlsZC5cbiIsCi0JICAgIHR5cGUtPm5hbWUsIE5VTEwpOworCSAgICBOVUxMLCBOVUxMLCB0eXBlLT5ub2RlLAkKKwkgICAgIkVpdGhlciB0aGUgYXR0cmlidXRlICdtZW1iZXJUeXBlcycgbXVzdCBiZSBub24tZW1wdHkgIgorCSAgICAib3IgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgPHNpbXBsZVR5cGU+IGNoaWxkIiwgTlVMTCk7CiAgICAgfSAKIAkKICAgICBjdHh0VHlwZSA9IGN0eHQtPmN0eHRUeXBlOwogICAgIGlmICh0eXBlLT5iYXNlICE9IE5VTEwpIHsKKwl4bWxBdHRyUHRyIGF0dHI7CisJY29uc3QgeG1sQ2hhciAqY3VyLCAqZW5kOworCXhtbENoYXIgKnRtcDsKKwljb25zdCB4bWxDaGFyICpsb2NhbE5hbWUsICp1cmk7CisKKwlhdHRyID0geG1sU2NoZW1hR2V0UHJvcE5vZGUodHlwZS0+bm9kZSwgIm1lbWJlclR5cGVzIik7CiAJY3VyID0gdHlwZS0+YmFzZTsKIAlkbyB7CiAJICAgIHdoaWxlIChJU19CTEFOS19DSCgqY3VyKSkKQEAgLTU1OTgsMzAgKzc3MjksMTQgQEAKIAkgICAgaWYgKGVuZCA9PSBjdXIpCiAJCWJyZWFrOwogCSAgICB0bXAgPSB4bWxTdHJuZHVwKGN1ciwgZW5kIC0gY3VyKTsKLQkgICAgbmNOYW1lID0geG1sU3BsaXRRTmFtZTModG1wLCAmbGVuKTsKLQkgICAgaWYgKG5jTmFtZSAhPSBOVUxMKSB7Ci0JCXByZWZpeCA9IHhtbERpY3RMb29rdXAoY3R4dC0+ZGljdCwgdG1wLCBsZW4pOwotCSAgICB9IGVsc2UgewotCQlwcmVmaXggPSBOVUxMOwotCQluY05hbWUgPSB0bXA7Ci0JICAgIH0KLQkgICAgbnMgPSB4bWxTZWFyY2hOcyh0eXBlLT5ub2RlLT5kb2MsIHR5cGUtPm5vZGUsIHByZWZpeCk7Ci0JICAgIGlmIChucyA9PSBOVUxMKSB7Ci0JCWlmIChwcmVmaXggIT0gTlVMTCkgewotCQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLCBYTUxfU0NIRU1BUF9QUkVGSVhfVU5ERUZJTkVELAotCQkJIlVuaW9uIFwiJXNcIjogdGhlIG5hbWVzcGFjZSBwcmVmaXggb2YgbWVtYmVyIHR5cGUgIgotCQkJIlwiJXNcIiBpcyB1bmRlZmluZWRcbiIsCi0JCQl0eXBlLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSB0bXApOwotCQl9Ci0JCW5hbWVzcGFjZSA9IE5VTEw7Ci0JICAgIH0gZWxzZSB7Ci0JCW5hbWVzcGFjZSA9IHhtbERpY3RMb29rdXAoY3R4dC0+ZGljdCwgbnMtPmhyZWYsIC0xKTsKLQkgICAgfSAgICAgICAgCi0JICAgIG1lbWJlclR5cGUgPSB4bWxTY2hlbWFHZXRUeXBlKGN0eHQtPnNjaGVtYSwgbmNOYW1lLCBuYW1lc3BhY2UpOworCSAgICB4bWxTY2hlbWFQVmFsQXR0ck5vZGVRTmFtZVZhbHVlKGN0eHQsIGN0eHQtPnNjaGVtYSwgTlVMTCwgCisJCU5VTEwsIGF0dHIsIEJBRF9DQVNUIHRtcCwgJnVyaSwgTlVMTCwgJmxvY2FsTmFtZSk7CSAgIAorCSAgICBtZW1iZXJUeXBlID0geG1sU2NoZW1hR2V0VHlwZShjdHh0LT5zY2hlbWEsIGxvY2FsTmFtZSwgdXJpKTsKIAkgICAgaWYgKG1lbWJlclR5cGUgPT0gTlVMTCkgewotCQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsIFhNTF9TQ0hFTUFQX1VOS05PV05fTUVNQkVSX1RZUEUsCi0JCSAgICAiVW5pb24gXCIlc1wiIHJlZmVyZW5jZXMgYW4gdW5rbm93biBtZW1iZXIgdHlwZSBcIiVzXCIuXG4iLAotCQkgICAgdHlwZS0+bmFtZSwgIChjb25zdCB4bWxDaGFyICopIHRtcCk7CisJCXhtbFNjaGVtYVBSZXNDb21wQXR0ckVycihjdHh0LAorCQkgICAgWE1MX1NDSEVNQVBfVU5LTk9XTl9NRU1CRVJfVFlQRSwKKwkJICAgIE5VTEwsIE5VTEwsIHR5cGUtPm5vZGUsICJtZW1iZXJUeXBlcyIsIGxvY2FsTmFtZSwgdXJpLAorCQkgICAgWE1MX1NDSEVNQV9UWVBFX1NJTVBMRSwgTlVMTCk7CiAJICAgIH0gZWxzZSB7CiAJCWlmIChtZW1iZXJUeXBlLT5jb250ZW50VHlwZSA9PSBYTUxfU0NIRU1BX0NPTlRFTlRfVU5LTk9XTikgCiAJCSAgICB4bWxTY2hlbWFUeXBlRml4dXAobWVtYmVyVHlwZSwgY3R4dCwgTlVMTCk7CSAgICAKQEAgLTU3MDMsNDggKzc4MTgsNiBAQAogfQogCiAvKioKLSAqIHhtbFNjaGVtYUdldE9ueW1vdXNUeXBlTmFtZToKLSAqIEBhdHRyOiAgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi91c2UKLSAqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGU7IGlmIHRoZSBhdHRyaWJ1dGUKLSAqIGlzIGEgcmVmZXJlbmNlLCB0aGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgdHlwZSB3aWxsIGJlIHJldHVybmVkLgotICovCi1zdGF0aWMgY29uc3QgeG1sQ2hhciAqCi14bWxTY2hlbWFHZXRPbnltb3VzQXR0ck5hbWUoeG1sU2NoZW1hQXR0cmlidXRlUHRyIGF0dHIpIAotewotICAgIGlmIChhdHRyLT5yZWYgIT0gTlVMTCkgCi0JcmV0dXJuKGF0dHItPnJlZik7Ci0gICAgZWxzZQotCXJldHVybihhdHRyLT5uYW1lKTsJCi19Ci0KLS8qKgotICogeG1sU2NoZW1hR2V0T255bW91c1RhcmdldE5zVVJJOgotICogQHR5cGU6ICB0aGUgdHlwZSAoZWxlbWVudCBvciBhdHRyaWJ1dGUpCi0gKgotICogUmV0dXJucyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBVUkkgb2YgdGhlIHR5cGU7IGlmIHRoZSB0eXBlIGlzIGEgcmVmZXJlbmNlLAotICogdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgdHlwZSB3aWxsIGJlIHJldHVybmVkLgotICovCi1zdGF0aWMgY29uc3QgeG1sQ2hhciAqCi14bWxTY2hlbWFHZXRPbnltb3VzVGFyZ2V0TnNVUkkoeG1sU2NoZW1hVHlwZVB0ciB0eXBlKQotewotICAgIGlmICh0eXBlLT50eXBlID09IFhNTF9TQ0hFTUFfVFlQRV9FTEVNRU5UKSB7Ci0JaWYgKHR5cGUtPnJlZiAhPSBOVUxMKQotCSAgICByZXR1cm4oKCh4bWxTY2hlbWFFbGVtZW50UHRyKSgoeG1sU2NoZW1hRWxlbWVudFB0cikgCi0JCXR5cGUpLT5zdWJ0eXBlcyktPnRhcmdldE5hbWVzcGFjZSk7Ci0JZWxzZQotCSAgICByZXR1cm4oKCh4bWxTY2hlbWFFbGVtZW50UHRyKSB0eXBlKS0+dGFyZ2V0TmFtZXNwYWNlKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPnR5cGUgPT0gWE1MX1NDSEVNQV9UWVBFX0FUVFJJQlVURSkgewotCWlmICh0eXBlLT5yZWYgIT0gTlVMTCkKLQkgICAgcmV0dXJuKCgoeG1sU2NoZW1hQXR0cmlidXRlUHRyKSgoeG1sU2NoZW1hQXR0cmlidXRlUHRyKSAKLQkJdHlwZSktPnN1YnR5cGVzKS0+dGFyZ2V0TmFtZXNwYWNlKTsKLQllbHNlCi0JICAgIHJldHVybigoKHhtbFNjaGVtYUF0dHJpYnV0ZVB0cikgdHlwZSktPnRhcmdldE5hbWVzcGFjZSk7Ci0gICAgfSBlbHNlIAotCXJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKgogICogeG1sU2NoZW1hSXNEZXJpdmVkRnJvbUJ1aWx0SW5UeXBlOgogICogQGN0eHQ6ICB0aGUgc2NoZW1hIHBhcnNlciBjb250ZXh0CiAgKiBAdHlwZTogIHRoZSB0eXBlIGRlZmluaXRpb24KQEAgLTYwODcsNyArODE2MCw3IEBACiAJICAgICovCiAJICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgY29tcGxldGVXaWxkLT5ub2RlLCAKIAkJWE1MX1NDSEVNQVBfVU5JT05fTk9UX0VYUFJFU1NJQkxFLAotCQkiVGhlIHVuaW9uIG9mIHRoZSB3aWxjYXJkIGlzIG5vdCBleHByZXNzaWJsZVxuIiwKKwkJIlRoZSB1bmlvbiBvZiB0aGUgd2lsY2FyZCBpcyBub3QgZXhwcmVzc2libGUuXG4iLAogCQlOVUxMLCBOVUxMKTsJCiAJICAgIHJldHVybihYTUxfU0NIRU1BUF9VTklPTl9OT1RfRVhQUkVTU0lCTEUpOwogCX0gZWxzZSBpZiAoKCFuc0ZvdW5kKSAmJiAoIWFic2VudEZvdW5kKSkgewpAQCAtNjMyNCw3ICs4Mzk3LDcgQEAKIAkoY3VyV2lsZC0+bmVnTnNTZXQtPnZhbHVlICE9IE5VTEwpKSB7CiAKIAl4bWxTY2hlbWFQRXJyKGN0eHQsIGNvbXBsZXRlV2lsZC0+bm9kZSwgWE1MX1NDSEVNQVBfSU5URVJTRUNUSU9OX05PVF9FWFBSRVNTSUJMRSwKLQkgICAgIlRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHdpbGNhcmQgaXMgbm90IGV4cHJlc3NpYmxlXG4iLAorCSAgICAiVGhlIGludGVyc2VjdGlvbiBvZiB0aGUgd2lsY2FyZCBpcyBub3QgZXhwcmVzc2libGUuXG4iLAogCSAgICBOVUxMLCBOVUxMKTsJCiAJcmV0dXJuKFhNTF9TQ0hFTUFQX0lOVEVSU0VDVElPTl9OT1RfRVhQUkVTU0lCTEUpOwogICAgIH0JCSAgICAKQEAgLTYzNTEsMTAgKzg0MjQsOCBAQAogICogc3Vic2V0IG9mIEB3aWxkQiwgMCBvdGhlcndpc2UuCiAgKi8KIHN0YXRpYyBpbnQKLXhtbFNjaGVtYUlzV2lsZGNhcmROc0NvbnN0cmFpbnRTdWJzZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBjdHh0IEFUVFJJQlVURV9VTlVTRUQsIAotCQkJICAgIHhtbFNjaGVtYVdpbGRjYXJkUHRyIHdpbGRBLAotCQkJICAgIHhtbFNjaGVtYVdpbGRjYXJkUHRyIHdpbGRCKQoreG1sU2NoZW1hSXNXaWxkY2FyZE5zQ29uc3RyYWludFN1YnNldCh4bWxTY2hlbWFXaWxkY2FyZFB0ciB3aWxkQSwKKwkJCQkgICAgICB4bWxTY2hlbWFXaWxkY2FyZFB0ciB3aWxkQikKIHsgICAgCiAKICAgICAvKgpAQCAtNjUyNSw2ICs4NTk2LDcgQEAKICAgICB4bWxTY2hlbWFBdHRyaWJ1dGVQdHIgYXR0cnM7CiAgICAgeG1sU2NoZW1hVHlwZVB0ciBhbnlUeXBlOwogICAgIGludCBiYXNlSXNBbnlUeXBlID0gMDsKKyAgICB4bWxDaGFyICpzdHIgPSBOVUxMOwogCiAgICAgYW55VHlwZSA9IHhtbFNjaGVtYUdldEJ1aWx0SW5UeXBlKFhNTF9TQ0hFTUFTX0FOWVRZUEUpOwogICAgIC8qIApAQCAtNjU0MiwyMCArODYxNCwxMSBAQAogICAgIGlmICh0eXBlLT5iYXNlVHlwZSA9PSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAogCQkgICAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYUJ1aWxkQXR0cmlidXRlVmFsaWRhdGlvbjogIgotCQkgICAgICAiY29tcGxleCB0eXBlIFwiJXNcIiBoYXMgbm8gYmFzZSB0eXBlLlxuIiwKKwkJICAgICAgImNvbXBsZXggdHlwZSAnJXMnIGhhcyBubyBiYXNlIHR5cGUuXG4iLAogCQkgICAgICB0eXBlLT5uYW1lLCBOVUxMKTsKICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgfQotCiAgICAgYmFzZVR5cGUgPSB0eXBlLT5iYXNlVHlwZTsKLSAgICBpZiAoYmFzZVR5cGUgPT0gTlVMTCkgewotCXhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAotCSAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYUJ1aWxkQXR0cmlidXRlVmFsaWRhdGlvbjogIgotCSAgICAidHlwZSBoYXMgbm8gYmFzZSB0eXBlLlxuIiwKLQkgICAgTlVMTCwgTlVMTCk7Ci0JcmV0dXJuICgtMSk7Ci0gICAgfQotCiAgICAgaWYgKGJhc2VUeXBlID09IGFueVR5cGUpCiAJYmFzZUlzQW55VHlwZSA9IDE7CiAgICAgLyoKQEAgLTY2NDQsMTkgKzg3MDcsMjUgQEAKIAkgICAgKiBEZXJpdmF0aW9uIFZhbGlkIChSZXN0cmljdGlvbiwgQ29tcGxleCkgCSAgICAKIAkgICAgKiA0LjEgVGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBhbHNvIGhhdmUgb25lLiAKIAkgICAgKi8KLQkgICAgaWYgKGJhc2VUeXBlLT5hdHRyaWJ1dGVXaWxkY2FyZCA9PSBOVUxMKSB7CSAgICAKLQkJeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLCBYTUxfU0NIRU1BUF9ERVJJVkFUSU9OX09LX1JFU1RSSUNUSU9OXzRfMSwKLQkJICAgICJUaGUgZGVyaXZlZCB0eXBlIFwiJXNcIiBoYXMgYW4gYXR0cmlidXRlIHdpbGRjYXJkLCAiCi0JCSAgICAiYnV0IHRoZSBiYXNlIHR5cGUgXCIlc1wiIGRvZXMgbm90IGhhdmUgb25lLlxuIiwKLQkJICAgIHR5cGUtPm5hbWUsIGJhc2VUeXBlLT5uYW1lKTsKKwkgICAgaWYgKGJhc2VUeXBlLT5hdHRyaWJ1dGVXaWxkY2FyZCA9PSBOVUxMKSB7CSAgCisJCXhtbFNjaGVtYVBDdXN0b21FcnIoY3R4dCwKKwkJICAgIFhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fNF8xLAorCQkgICAgTlVMTCwgdHlwZSwgTlVMTCwgCisJCSAgICAiVGhlIHR5cGUgaGFzIGFuIGF0dHJpYnV0ZSB3aWxkY2FyZCwgIgorCQkgICAgImJ1dCB0aGUgYmFzZSB0eXBlICVzIGRvZXMgbm90IGhhdmUgb25lIiwKKwkJICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ciwgTlVMTCwgYmFzZVR5cGUsIE5VTEwsIDEpKTsKKwkJRlJFRV9BTkRfTlVMTChzdHIpCiAJCXJldHVybiAoMSk7Ci0JICAgIH0gZWxzZSBpZiAoeG1sU2NoZW1hSXNXaWxkY2FyZE5zQ29uc3RyYWludFN1YnNldChjdHh0LCAKKwkgICAgfSBlbHNlIGlmICh4bWxTY2hlbWFJc1dpbGRjYXJkTnNDb25zdHJhaW50U3Vic2V0KAogCQl0eXBlLT5hdHRyaWJ1dGVXaWxkY2FyZCwgYmFzZVR5cGUtPmF0dHJpYnV0ZVdpbGRjYXJkKSA9PSAwKSB7CiAJCS8qIDQuMiAqLwotCQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsIFhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fNF8yLAotCQkgICAgIlRoZSB3aWxkY2FyZCBpbiB0aGUgZGVyaXZlZCB0eXBlIFwiJXNcIiBpcyBub3QgYSB2YWxpZCAiIAotCQkgICAgInN1YnNldCBvZiB0aGUgb25lIGluIHRoZSBiYXNlIHR5cGUgXCIlc1wiLlxuIiwKLQkJICAgIHR5cGUtPm5hbWUsIGJhc2VUeXBlLT5uYW1lKTsJICAgIAorCQl4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCisJCSAgICBYTUxfU0NIRU1BUF9ERVJJVkFUSU9OX09LX1JFU1RSSUNUSU9OXzRfMiwKKwkJICAgIE5VTEwsIHR5cGUsIE5VTEwsIAkJCisJCSAgICAiVGhlIGF0dHJpYnV0ZSB3aWxkY2FyZCBpcyBub3QgYSB2YWxpZCAiIAorCQkgICAgInN1YnNldCBvZiB0aGUgd2lsZGNhcmQgaW4gdGhlIGJhc2UgdHlwZSAlcyIsCisJCSAgICB4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHIsIE5VTEwsIGJhc2VUeXBlLCBOVUxMLCAxKSk7CisJCUZSRUVfQU5EX05VTEwoc3RyKQkgICAgCiAJCXJldHVybiAoMSk7CiAJICAgIH0KIAkgICAgLyogNC4zIFVubGVzcyB0aGUge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBpcyB0aGUgt3VyLXR5cGUgCkBAIC02NjY5LDExICs4NzM4LDEzIEBACiAJICAgIGlmICgodHlwZS0+YmFzZVR5cGUgIT0gYW55VHlwZSkgJiYgCiAJCSh0eXBlLT5hdHRyaWJ1dGVXaWxkY2FyZC0+cHJvY2Vzc0NvbnRlbnRzIDwgCiAJCWJhc2VUeXBlLT5hdHRyaWJ1dGVXaWxkY2FyZC0+cHJvY2Vzc0NvbnRlbnRzKSkgewotCQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsIFhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fNF8zLAotCQkgICAgIlRoZSBwcm9jZXNzIGNvbnRlbnRzIG9mIHRoZSB3aWxkY2FyZCBpbiB0aGUgIgotCQkgICAgImRlcml2ZWQgdHlwZSBcIiVzXCIgaXMgd2Vha2VyIHRoYW4gIiAKLQkJICAgICJ0aGF0IGluIHRoZSBiYXNlIHR5cGUgXCIlc1wiLlxuIiwKLQkJICAgIHR5cGUtPm5hbWUsIGJhc2VUeXBlLT5uYW1lKTsKKwkJeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAorCQkgICAgWE1MX1NDSEVNQVBfREVSSVZBVElPTl9PS19SRVNUUklDVElPTl80XzMsCisJCSAgICBOVUxMLCB0eXBlLCBOVUxMLCAJCQorCQkgICAgIlRoZSAncHJvY2VzcyBjb250ZW50cycgb2YgdGhlIGF0dHJpYnV0ZSB3aWxkY2FyZCBpcyB3ZWFrZXIgdGhhbiAiCisJCSAgICAidGhlIG9uZSBpbiB0aGUgYmFzZSB0eXBlICVzIiwKKwkJICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ciwgTlVMTCwgYmFzZVR5cGUsIE5VTEwsIDEpKTsKKwkJRlJFRV9BTkRfTlVMTChzdHIpCiAJCXJldHVybiAoMSk7CiAJICAgIH0KIAl9CkBAIC02Njg2LDEyICs4NzU3LDE1IEBACiAJaWYgKChiYXNlVHlwZS0+YXR0cmlidXRlV2lsZGNhcmQgIT0gTlVMTCkgJiYKIAkgICAgKGJhc2VUeXBlLT5hdHRyaWJ1dGVXaWxkY2FyZCAhPSB0eXBlLT5hdHRyaWJ1dGVXaWxkY2FyZCkpIHsKIAkgICAgLyogMS4zICovCi0JICAgIGlmICh4bWxTY2hlbWFJc1dpbGRjYXJkTnNDb25zdHJhaW50U3Vic2V0KGN0eHQsIAorCSAgICBpZiAoeG1sU2NoZW1hSXNXaWxkY2FyZE5zQ29uc3RyYWludFN1YnNldCgKIAkJYmFzZVR5cGUtPmF0dHJpYnV0ZVdpbGRjYXJkLCB0eXBlLT5hdHRyaWJ1dGVXaWxkY2FyZCkgPT0gMCkgewotCQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsIFhNTF9TQ0hFTUFQX0NPU19DVF9FWFRFTkRTXzFfMywKLQkJICAgICJUaGUgd2lsZGNhcmQgaW4gdGhlIGRlcml2ZWQgdHlwZSBcIiVzXCIgaXMgbm90IGEgdmFsaWQgIiAKLQkJICAgICJzdXBlcnNldCBvZiB0aGUgb25lIGluIHRoZSBiYXNlIHR5cGUgXCIlc1wiLlxuIiwKLQkJICAgIHR5cGUtPm5hbWUsIGJhc2VUeXBlLT5uYW1lKTsKKwkJeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAorCQkgICAgWE1MX1NDSEVNQVBfQ09TX0NUX0VYVEVORFNfMV8zLAorCQkgICAgTlVMTCwgdHlwZSwgTlVMTCwgCQkKKwkJICAgICJUaGUgYXR0cmlidXRlIHdpbGRjYXJkIGlzIG5vdCBhIHZhbGlkICIgCisJCSAgICAic3VwZXJzZXQgb2YgdGhlIG9uZSBpbiB0aGUgYmFzZSB0eXBlICVzIiwKKwkJICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ciwgTlVMTCwgYmFzZVR5cGUsIE5VTEwsIDEpKTsKKwkJRlJFRV9BTkRfTlVMTChzdHIpCQkKIAkJcmV0dXJuICgxKTsJCQogCSAgICB9CiAJfQkJCkBAIC02NzE3LDE0ICs4NzkxLDIwIEBACiAJd2hpbGUgKGN1ciAhPSBOVUxMKSB7CiAJICAgIHRtcCA9IGN1ci0+bmV4dDsKIAkgICAgd2hpbGUgKHRtcCAhPSBOVUxMKSB7CSAgICAKLQkJaWYgKCh4bWxTdHJFcXVhbCh4bWxTY2hlbWFHZXRPbnltb3VzQXR0ck5hbWUoY3VyLT5hdHRyKSwgCi0JCSAgICB4bWxTY2hlbWFHZXRPbnltb3VzQXR0ck5hbWUodG1wLT5hdHRyKSkpICYmCi0JCSAgICAoeG1sU3RyRXF1YWwoeG1sU2NoZW1hR2V0T255bW91c1RhcmdldE5zVVJJKCh4bWxTY2hlbWFUeXBlUHRyKSBjdXItPmF0dHIgKSwgCi0JCSAgICB4bWxTY2hlbWFHZXRPbnltb3VzVGFyZ2V0TnNVUkkoKHhtbFNjaGVtYVR5cGVQdHIpIHRtcC0+YXR0cikpKSkgewotCQkgICAgCi0JCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIGN1ci0+YXR0ci0+bm9kZSwgWE1MX1NDSEVNQVBfQ1RfUFJPUFNfQ09SUkVDVF80LAotCQkJImN0LXByb3BzLWNvcnJlY3QuNDogRHVwbGljYXRlIGF0dHJpYnV0ZSB1c2Ugd2l0aCB0aGUgbmFtZSBcIiVzXCIgc3BlY2lmaWVkXG4iLAotCQkJeG1sU2NoZW1hR2V0T255bW91c0F0dHJOYW1lKGN1ci0+YXR0ciksICBOVUxMKTsKKwkJaWYgKCh4bWxTdHJFcXVhbCh4bWxTY2hlbWFHZXRBdHRyTmFtZShjdXItPmF0dHIpLCAKKwkJICAgIHhtbFNjaGVtYUdldEF0dHJOYW1lKHRtcC0+YXR0cikpKSAmJgorCQkgICAgKHhtbFN0ckVxdWFsKHhtbFNjaGVtYUdldEF0dHJUYXJnZXROc1VSSShjdXItPmF0dHIgKSwgCisJCSAgICB4bWxTY2hlbWFHZXRBdHRyVGFyZ2V0TnNVUkkodG1wLT5hdHRyKSkpKSB7CisKKwkJICAgIHhtbFNjaGVtYVBBdHRyVXNlRXJyKGN0eHQsCisJCQlYTUxfU0NIRU1BUF9DVF9QUk9QU19DT1JSRUNUXzQsIAorCQkJTlVMTCwgdHlwZSwgTlVMTCwgY3VyLT5hdHRyLAkJCQorCQkJIkR1cGxpY2F0ZSBhdHRyaWJ1dGUgdXNlICVzIHNwZWNpZmllZCIsCisJCQl4bWxTY2hlbWFGb3JtYXROc1VyaUxvY2FsKCZzdHIsIAorCQkJICAgIHhtbFNjaGVtYUdldEF0dHJUYXJnZXROc1VSSSh0bXAtPmF0dHIpLCAKKwkJCSAgICB4bWxTY2hlbWFHZXRBdHRyTmFtZSh0bXAtPmF0dHIpKQorCQkgICAgKTsKKwkJICAgIEZSRUVfQU5EX05VTEwoc3RyKQkJICAgIAkJICAgIAogCQkgICAgYnJlYWs7CiAJCX0KIAkJdG1wID0gdG1wLT5uZXh0OwpAQCAtNjc0NiwzNSArODgyNiwzNiBAQAogCQlmb3VuZCA9IDA7CiAJCWJhc2UgPSB0eXBlLT5hdHRyaWJ1dGVVc2VzOwogCQl3aGlsZSAoYmFzZSAhPSBOVUxMKSB7Ci0JCSAgICBpZiAoKHhtbFN0ckVxdWFsKHhtbFNjaGVtYUdldE9ueW1vdXNBdHRyTmFtZShjdXItPmF0dHIpLCAKLQkJCXhtbFNjaGVtYUdldE9ueW1vdXNBdHRyTmFtZShiYXNlLT5hdHRyKSkpICYmCi0JCQkoeG1sU3RyRXF1YWwoeG1sU2NoZW1hR2V0T255bW91c1RhcmdldE5zVVJJKCh4bWxTY2hlbWFUeXBlUHRyKSBjdXItPmF0dHIpLCAKLQkJCXhtbFNjaGVtYUdldE9ueW1vdXNUYXJnZXROc1VSSSgoeG1sU2NoZW1hVHlwZVB0cikgYmFzZS0+YXR0cikpKSkgeworCQkgICAgaWYgKHhtbFN0ckVxdWFsKHhtbFNjaGVtYUdldEF0dHJOYW1lKGN1ci0+YXR0ciksIAorCQkJeG1sU2NoZW1hR2V0QXR0ck5hbWUoYmFzZS0+YXR0cikpICYmCisJCQl4bWxTdHJFcXVhbCh4bWxTY2hlbWFHZXRBdHRyVGFyZ2V0TnNVUkkoY3VyLT5hdHRyKSwgCisJCQl4bWxTY2hlbWFHZXRBdHRyVGFyZ2V0TnNVUkkoYmFzZS0+YXR0cikpKSB7CiAJCQkKLQkJCWZvdW5kID0gMTsJICAgIAorCQkJZm91bmQgPSAxOwogCQkJaWYgKChjdXItPmF0dHItPm9jY3VycyA9PSBYTUxfU0NIRU1BU19BVFRSX1VTRV9PUFRJT05BTCkgJiYKIAkJCSAgICAoYmFzZS0+YXR0ci0+b2NjdXJzID09IFhNTF9TQ0hFTUFTX0FUVFJfVVNFX1JFUVVJUkVEKSkgewogCQkJICAgIC8qCiAJCQkgICAgKiBkZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uIDIuMS4xCi0JCQkgICAgKi8JCQkKLQkJCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIGN1ci0+YXR0ci0+bm9kZSwgCisJCQkgICAgKi8JCisJCQkgICAgeG1sU2NoZW1hUEF0dHJVc2VFcnIoY3R4dCwKIAkJCQlYTUxfU0NIRU1BUF9ERVJJVkFUSU9OX09LX1JFU1RSSUNUSU9OXzJfMV8xLAotCQkJCSJkZXJpdmF0aW9uLW9rLXJlc3RyaWN0aW9uLjIuMS4xOiAiCi0JCQkJIlRoZSBcIm9wdGlvbmFsXCIgYXR0cmlidXRlICIKLQkJCQkidXNlIFwiJXNcIiBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIG1hdGNoaW5nICIKLQkJCQkiXCJyZXF1aXJlZFwiIGF0dHJpYnV0ZSB1c2Ugb2YgdGhlIGJhc2UgdHlwZVxuIiwKLQkJCQl4bWxTY2hlbWFHZXRPbnltb3VzQXR0ck5hbWUoY3VyLT5hdHRyKSwgTlVMTCk7CQkJCQkKKwkJCQlOVUxMLCB0eXBlLCBOVUxMLCBjdXItPmF0dHIsCisJCQkJIlRoZSAnb3B0aW9uYWwnIHVzZSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIG1hdGNoaW5nICIKKwkJCQkiJ3JlcXVpcmVkJyB1c2Ugb2YgdGhlIGJhc2UgdHlwZSIsIE5VTEwpOwkJCQkKIAkJCX0gZWxzZSBpZiAoKGN1ci0+YXR0ci0+b2NjdXJzID09IFhNTF9TQ0hFTUFTX0FUVFJfVVNFX1BST0hJQklURUQpICYmCiAJCQkgICAgKGJhc2UtPmF0dHItPm9jY3VycyA9PSBYTUxfU0NIRU1BU19BVFRSX1VTRV9SRVFVSVJFRCkpIHsKIAkJCSAgICAvKgogCQkJICAgICogZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbiAzIAogCQkJICAgICovCi0JCQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCBjdXItPmF0dHItPm5vZGUsIFhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fMywKLQkJCQkiZGVyaXZhdGlvbi1vay1yZXN0cmljdGlvbi4zOiAiCi0JCQkJIlRoZSBcInJlcXVpcmVkXCIgYXR0cmlidXRlIHVzZSBcIiVzXCIgb2YgdGhlIGJhc2UgdHlwZSAiCi0JCQkJImRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBhdHRyaWJ1dGUgdXNlIGluIHRoZSBkZXJpdmVkIHR5cGVcbiIsCQkKLQkJCQl4bWxTY2hlbWFHZXRPbnltb3VzQXR0ck5hbWUoY3VyLT5hdHRyKSwgTlVMTCk7Ci0JCQkgICAgCisJCQkgICAgeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAorCQkJCVhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fMywgCisJCQkJTlVMTCwgdHlwZSwgTlVMTCwgCQkKKwkJCQkiQSBtYXRjaGluZyBhdHRyaWJ1dGUgdXNlIGZvciB0aGUgJ3JlcXVpcmVkJyAiCisJCQkJImF0dHJpYnV0ZSB1c2UgJXMgb2YgdGhlIGJhc2UgdHlwZSBpcyBtaXNzaW5nIiwKKwkJCQl4bWxTY2hlbWFGb3JtYXROc1VyaUxvY2FsKCZzdHIsIAorCQkJCXhtbFNjaGVtYUdldEF0dHJUYXJnZXROc1VSSShiYXNlLT5hdHRyKSwgCisJCQkJeG1sU2NoZW1hR2V0QXR0ck5hbWUoYmFzZS0+YXR0cikpKTsJCisJCQkgICAgRlJFRV9BTkRfTlVMTChzdHIpCiAJCQl9IGVsc2UgewogCQkJICAgIC8qCiAJCQkgICAgKiBPdmVycmlkZSB0aGUgYXR0cmlidXRlIHVzZS4KQEAgLTY4MDEsMTEgKzg4ODIsMTIgQEAKIAkJCSAgICBmb3VuZCA9IDE7CiAKIAkJCWlmICghZm91bmQpIHsKLQkJCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIGN1ci0+YXR0ci0+bm9kZSwgWE1MX1NDSEVNQVBfREVSSVZBVElPTl9PS19SRVNUUklDVElPTl8yXzIsCi0JCQkJImRlcml2YXRpb24tb2stcmVzdHJpY3Rpb24uMi4yOiAiCi0JCQkJIlRoZSBhdHRyaWJ1dGUgdXNlIFwiJXNcIiBoYXMgbmVpdGhlciBhIG1hdGNoaW5nIGF0dHJpYnV0ZSB1c2UsICIKLQkJCQkibm9yIGEgbWF0Y2hpbmcgd2lsZGNhcmQgaW4gdGhlIGJhc2UgdHlwZVxuIiwJCQotCQkJCXhtbFNjaGVtYUdldE9ueW1vdXNBdHRyTmFtZShjdXItPmF0dHIpLCBOVUxMKTsKKwkJCSAgICB4bWxTY2hlbWFQQXR0clVzZUVycihjdHh0LAorCQkJCVhNTF9TQ0hFTUFQX0RFUklWQVRJT05fT0tfUkVTVFJJQ1RJT05fMl8yLCAKKwkJCQlOVUxMLCB0eXBlLCBOVUxMLCBjdXItPmF0dHIsCQkKKwkJCQkiTmVpdGhlciBhIG1hdGNoaW5nIGF0dHJpYnV0ZSB1c2UsICIKKwkJCQkibm9yIGEgbWF0Y2hpbmcgd2lsZGNhcmQgaW4gdGhlIGJhc2UgdHlwZSBkb2VzIGV4aXN0IiwKKwkJCQlOVUxMKTsKIAkJCX0gZWxzZSB7CiAJCQkgICAgLyogCiAJCQkgICAgKiBBZGQgdGhlIGF0dHJpYnV0ZSB1c2UuCkBAIC02ODcxLDE0ICs4OTUzLDE1IEBACiAJICAgIGlmICh0eXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfREVSSVZBVElPTl9NRVRIT0RfRVhURU5TSU9OKSB7CiAJCXRtcCA9IGN1ci0+bmV4dDsKIAkJd2hpbGUgKHRtcCAhPSBOVUxMKSB7CSAgICAKLQkJICAgIGlmICgoeG1sU3RyRXF1YWwoeG1sU2NoZW1hR2V0T255bW91c0F0dHJOYW1lKGN1ci0+YXR0ciksIAotCQkJeG1sU2NoZW1hR2V0T255bW91c0F0dHJOYW1lKHRtcC0+YXR0cikpKSAmJgotCQkJKHhtbFN0ckVxdWFsKHhtbFNjaGVtYUdldE9ueW1vdXNUYXJnZXROc1VSSSgoeG1sU2NoZW1hVHlwZVB0cikgY3VyLT5hdHRyICksIAotCQkJeG1sU2NoZW1hR2V0T255bW91c1RhcmdldE5zVVJJKCh4bWxTY2hlbWFUeXBlUHRyKSB0bXAtPmF0dHIpKSkpIHsKKwkJICAgIGlmICgoeG1sU3RyRXF1YWwoeG1sU2NoZW1hR2V0QXR0ck5hbWUoY3VyLT5hdHRyKSwgCisJCQl4bWxTY2hlbWFHZXRBdHRyTmFtZSh0bXAtPmF0dHIpKSkgJiYKKwkJCSh4bWxTdHJFcXVhbCh4bWxTY2hlbWFHZXRBdHRyVGFyZ2V0TnNVUkkoY3VyLT5hdHRyICksIAorCQkJeG1sU2NoZW1hR2V0QXR0clRhcmdldE5zVVJJKHRtcC0+YXR0cikpKSkgewogCi0JCQl4bWxTY2hlbWFQRXJyKGN0eHQsIGN1ci0+YXR0ci0+bm9kZSwgWE1MX1NDSEVNQVBfQ1RfUFJPUFNfQ09SUkVDVF80LAotCQkJICAgICJjdC1wcm9wcy1jb3JyZWN0LjQ6IER1cGxpY2F0ZSBhdHRyaWJ1dGUgdXNlIHdpdGggdGhlIG5hbWUgXCIlc1wiIHNwZWNpZmllZFxuIiwKLQkJCSAgICB4bWxTY2hlbWFHZXRPbnltb3VzQXR0ck5hbWUoY3VyLT5hdHRyKSwgIE5VTEwpOworCQkJeG1sU2NoZW1hUEF0dHJVc2VFcnIoY3R4dCwKKwkJCSAgICBYTUxfU0NIRU1BUF9DVF9QUk9QU19DT1JSRUNUXzQsIAorCQkJICAgIE5VTEwsIHR5cGUsIE5VTEwsIHRtcC0+YXR0ciwJCQorCQkJICAgICJEdXBsaWNhdGUgYXR0cmlidXRlIHVzZSBzcGVjaWZpZWQiLCBOVUxMKTsKIAkJCWJyZWFrOwogCQkgICAgfQogCQkgICAgdG1wID0gdG1wLT5uZXh0OwpAQCAtNjg5MSwxMSArODk3NCwxMyBAQAogCSAgICBpZiAoKGN1ci0+YXR0ci0+c3VidHlwZXMgIT0gTlVMTCkgJiYgCiAJCSh4bWxTY2hlbWFJc0Rlcml2ZWRGcm9tQnVpbHRJblR5cGUoY3R4dCwgKHhtbFNjaGVtYVR5cGVQdHIpIGN1ci0+YXR0ciwgWE1MX1NDSEVNQVNfSUQpKSkgewogCQlpZiAoaWQgIT0gTlVMTCkgewotCQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCBjdXItPmF0dHItPm5vZGUsIFhNTF9TQ0hFTUFQX0NUX1BST1BTX0NPUlJFQ1RfNSwgCi0JCQkiY3QtcHJvcHMtY29ycmVjdC41OiBUd28gYXR0cmlidXRlIGRlY2xhcmF0aW9ucywgIgotCQkJIlwiJXNcIiBhbmQgXCIlc1wiIGhhdmUgdHlwZXMgd2hpY2ggZGVyaXZlZCBmcm9tIElEXG4iLAotCQkJeG1sU2NoZW1hR2V0T255bW91c0F0dHJOYW1lKGlkLT5hdHRyKSwgCi0JCQl4bWxTY2hlbWFHZXRPbnltb3VzQXR0ck5hbWUoY3VyLT5hdHRyKSk7CisJCSAgICB4bWxTY2hlbWFQQXR0clVzZUVycihjdHh0LAorCQkJWE1MX1NDSEVNQVBfQ1RfUFJPUFNfQ09SUkVDVF81LCAKKwkJCU5VTEwsIHR5cGUsIE5VTEwsIGN1ci0+YXR0ciwKKwkJCSJUaGVyZSBtdXN0IG5vdCBleGlzdCBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB1c2UsICIKKwkJCSJkZWNsYXJlZCBvZiB0eXBlICdJRCcgb3IgZGVyaXZlZCBmcm9tIGl0IiwgCisJCQlOVUxMKTsKKwkJICAgIEZSRUVfQU5EX05VTEwoc3RyKQogCQl9IAogCQlpZCA9IGN1cjsKIAkgICAgfQpAQCAtNjkyNyw3ICs5MDEyLDcgQEAKIAkoYmFzZVR5cGUtPmNvbnRlbnRUeXBlID09IFhNTF9TQ0hFTUFfQ09OVEVOVF9VTktOT1dOKSkgewogCXhtbFNjaGVtYVBFcnIoY3R4dCwgYmFzZVR5cGUtPm5vZGUsIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKIAkgICAgIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFCdWlsZEF0dHJpYnV0ZVZhbGlkYXRpb246ICIKLQkgICAgImF0dHJpYnV0ZSB1c2VzIG5vdCBidWlsZGVkIG9uIGJhc2UgdHlwZSBcIiVzXCIuXG4iLAorCSAgICAiYXR0cmlidXRlIHVzZXMgbm90IGJ1aWxkZWQgb24gYmFzZSB0eXBlICclcycuXG4iLAogCSAgICBiYXNlVHlwZS0+bmFtZSwgTlVMTCk7CiAgICAgfSAgICAKICAgICByZXR1cm4gKDApOwpAQCAtNzEyOSw3ICs5MjE0LDkgQEAKIHsKICAgICB4bWxTY2hlbWFUeXBlUHRyIGJhc2VUeXBlID0gdHlwZS0+YmFzZVR5cGUsIGFueVNpbXBsZVR5cGUsCiAJYW55VHlwZTsKKyAgICB4bWxDaGFyICpzdHIgPSBOVUxMOwogCisgICAgLyogU1RBVEU6IGVycm9yIGZ1bmNzIGNvbnZlcnRlZC4gKi8KICAgICAvKgogICAgICogU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBTaW1wbGUgVHlwZSBEZWZpbml0aW9uIFByb3BlcnRpZXMgQ29ycmVjdAogICAgICoKQEAgLTcxNDgsMjkgKzkyMzUsMzIgQEAKICAgICAqIG90aGVyd2lzZSB0aGUgU2ltcGxlIFR5cGUgRGVmaW5pdGlvbiBmb3IgYW55U2ltcGxlVHlwZSAopzQuMS42KS4gCiAgICAgKi8KICAgICBpZiAoYmFzZVR5cGUgPT0gTlVMTCkgewotCXhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwl4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCiAJICAgIFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMSwKLQkgICAgIlNpbXBsZSB0eXBlIFwiJXNcIiBkb2VzIG5vdCBoYXZlIGEgYmFzZSB0eXBlLlxuIiwKLQkgICAgdHlwZS0+bmFtZSwgTlVMTCk7CisJICAgIE5VTEwsIHR5cGUsIE5VTEwsCQorCSAgICAiTm8gYmFzZSB0eXBlIGV4aXN0ZW50IiwgTlVMTCk7CiAJcmV0dXJuIChYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzEpOwogICAgIH0KICAgICBpZiAoKGJhc2VUeXBlLT50eXBlICE9IFhNTF9TQ0hFTUFfVFlQRV9TSU1QTEUpICYmCiAJKChiYXNlVHlwZS0+dHlwZSAhPSBYTUxfU0NIRU1BX1RZUEVfQkFTSUMpIHx8CiAJIChiYXNlVHlwZSA9PSBhbnlUeXBlKSkpIHsKLQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsCisJeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAogCSAgICBYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzEsCi0JICAgICJTaW1wbGUgdHlwZSBcIiVzXCI6IGl0cyBiYXNlIHR5cGUgXCIlc1wiIGlzIG5vdCBhIHNpbXBsZSAiCi0JICAgICJ0eXBlLlxuIiwKLQkgICAgdHlwZS0+bmFtZSwgYmFzZVR5cGUtPm5hbWUpOworCSAgICBOVUxMLCB0eXBlLCBOVUxMLAkKKwkgICAgIlRoZSBiYXNlIHR5cGUgJXMgaXMgbm90IGEgc2ltcGxlIHR5cGUiLCAKKwkgICAgeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydCgmc3RyLCBOVUxMLCBiYXNlVHlwZSwgTlVMTCwgMSkpOworCUZSRUVfQU5EX05VTEwoc3RyKQkKIAlyZXR1cm4gKFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMSk7CiAgICAgfQogICAgIGlmICgoYmFzZVR5cGUgIT0gYW55U2ltcGxlVHlwZSkgJiYKIAkodHlwZS0+c3VidHlwZXMtPnR5cGUgIT0gWE1MX1NDSEVNQV9UWVBFX1JFU1RSSUNUSU9OKSkgewotCXhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwl4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCiAJICAgIFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMSwKLQkgICAgIlNpbXBsZSB0eXBlIFwiJXNcIiAobm90IGRlcml2ZWQgYnkgcmVzdHJpY3Rpb24pIG11c3QgaGF2ZSIKLQkgICAgInRoZSBzaW1wbGUgdXItdHlwZSBkZWZpbml0aW9uIGFzIGJhc2UgdHlwZSwgbm90IFwiJXNcIi5cbiIsCi0JICAgIHR5cGUtPm5hbWUsIE5VTEwpOworCSAgICBOVUxMLCB0eXBlLCBOVUxMLAkKKwkgICAgIkEgdHlwZSwgZGVyaXZlZCBieSBsaXN0IG9yIHVuaW9uLCBtdXN0IGhhdmUiCisJICAgICJ0aGUgc2ltcGxlIHVyLXR5cGUgZGVmaW5pdGlvbiBhcyBiYXNlIHR5cGUsIG5vdCAlcyIsCisJICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ciwgTlVMTCwgYmFzZVR5cGUsIE5VTEwsIDEpKTsKKwlGUkVFX0FORF9OVUxMKHN0cikKIAlyZXR1cm4gKFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMSk7CiAgICAgfQogICAgIC8qIApAQCAtNzE3OSwxMyArOTI2OSwxMyBAQAogICAgIGlmICgoKHR5cGUtPmZsYWdzICYgWE1MX1NDSEVNQVNfVFlQRV9WQVJJRVRZX0FUT01JQykgPT0gMCkgJiYKIAkoKHR5cGUtPmZsYWdzICYgWE1MX1NDSEVNQVNfVFlQRV9WQVJJRVRZX1VOSU9OKSA9PSAwKSAmJgogCSgodHlwZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfTElTVCkgPT0gMCkpIHsKLQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsCisJeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAogCSAgICBYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzEsCi0JICAgICJTaW1wbGUgdHlwZSBcIiVzXCIgaGFzIGFuIGFic2VudCB2YXJpZXR5LlxuIiwKLQkgICAgdHlwZS0+bmFtZSwgTlVMTCk7CisJICAgIE5VTEwsIHR5cGUsIE5VTEwsCQorCSAgICAiVGhlIHZhcmlldHkgaXMgYWJzZW50IiwgTlVMTCk7CiAJcmV0dXJuIChYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzEpOwogICAgIH0KLSAgICAvKiBUT0RPOiBGaW5pc2ggdGhpcy4gKi8KKyAgICAvKiBUT0RPOiBGaW5pc2ggdGhpcy4gSG1tLCBpcyB0aGlzIGZpbmlzaGVkPyAqLwogCiAgICAgLyoKICAgICAqIDIgQWxsIHNpbXBsZSB0eXBlIGRlZmluaXRpb25zIG11c3QgYmUgZGVyaXZlZCB1bHRpbWF0ZWx5IGZyb20gdGhlILdzaW1wbGUgCkBAIC03MjAwLDExICs5MjkwLDEwIEBACiAJaWYgKGJhc2VUeXBlID09IGFueVNpbXBsZVR5cGUpCiAJICAgIGJyZWFrOwogCWVsc2UgaWYgKGJhc2VUeXBlID09IHR5cGUpIHsKLQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAotCQlYTUxfU0NIRU1BUF9TVF9QUk9QU19DT1JSRUNUXzIsCi0JCSJTaW1wbGUgdHlwZSBcIiVzXCIgaXMgbm90IGRlcml2ZWQgZnJvbSB0aGUgc2ltcGxlICIKLQkJInVyLXR5cGUgZGVmaW5pdGlvbiAoY2lyY3VsYXIgZGVmaW5pdGlvbnMgYXJlIGRpc2FsbG93ZWQpLlxuIiwKLQkJdHlwZS0+bmFtZSwgTlVMTCk7CisJICAgIHhtbFNjaGVtYVBDdXN0b21FcnIoY3R4dCwKKwkgICAgWE1MX1NDSEVNQVBfU1RfUFJPUFNfQ09SUkVDVF8yLAorCSAgICBOVUxMLCB0eXBlLCBOVUxMLAkKKwkgICAgIlRoZSBkZWZpbml0aW9uIGlzIGNpcmN1bGFyIiwgTlVMTCk7CiAJICAgIHJldHVybiAoWE1MX1NDSEVNQVBfU1RfUFJPUFNfQ09SUkVDVF8yKTsKIAl9CSAgIAogCWJhc2VUeXBlID0gYmFzZVR5cGUtPmJhc2VUeXBlOwpAQCAtNzIxNCwxMSArOTMwMywxMyBAQAogICAgICovCiAgICAgaWYgKHhtbFNjaGVtYVR5cGVGaW5hbENvbnRhaW5zKGN0eHQtPnNjaGVtYSwgYmFzZVR5cGUsIAogCVhNTF9TQ0hFTUFTX1RZUEVfRklOQUxfUkVTVFJJQ1RJT04pKSB7Ci0JeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAorCXhtbFNjaGVtYVBDdXN0b21FcnIoY3R4dCwKIAkgICAgWE1MX1NDSEVNQVBfU1RfUFJPUFNfQ09SUkVDVF8zLAotCSAgICAiU2ltcGxlIHR5cGUgXCIlc1wiOiB0aGUgXCJmaW5hbFwiIG9mIGl0cyBiYXNlIHR5cGUgIgotCSAgICAiXCIlc1wiIG11c3Qgbm90IGNvbnRhaW4gXCJyZXN0cmljdGlvblwiLlxuIiwKLQkgICAgdHlwZS0+bmFtZSwgYmFzZVR5cGUtPm5hbWUpOworCSAgICBOVUxMLCB0eXBlLCBOVUxMLAkKKwkgICAgIlRoZSAnZmluYWwnIG9mIGl0cyBiYXNlIHR5cGUgJXMgbXVzdCBub3QgY29udGFpbiAiCisJICAgICIncmVzdHJpY3Rpb24nIiwKKwkgICAgeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydCgmc3RyLCBOVUxMLCBiYXNlVHlwZSwgTlVMTCwgMSkpOworCUZSRUVfQU5EX05VTEwoc3RyKQkKIAlyZXR1cm4gKFhNTF9TQ0hFTUFQX1NUX1BST1BTX0NPUlJFQ1RfMyk7CiAgICAgfSAgICAKICAgICByZXR1cm4gKDApOwpAQCAtNzIzNywxNCArOTMyOCwxNyBAQAogICovCiBzdGF0aWMgaW50CiB4bWxTY2hlbWFDaGVja0NPU1NUUmVzdHJpY3RzKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwgCi0JCQkJCSAgICAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGUpCisJCQkgICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZSkKIHsgICAgCisgICAgeG1sQ2hhciAqc3RyID0gTlVMTDsKKworICAgIC8qIFNUQVRFOiBlcnJvciBmdW5jcyBjb252ZXJ0ZWQuICovCiAKICAgICBpZiAodHlwZS0+dHlwZSAhPSBYTUxfU0NIRU1BX1RZUEVfU0lNUExFKSB7CiAJeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAogCSAgICBYTUxfRVJSX0lOVEVSTkFMX0VSUk9SLAotCSAgICAieG1sU2NoZW1hQ2hlY2tEZXJpdmF0aW9uVmFsaWRTaW1wbGVSZXN0cmljdGlvbjogdGhlIGdpdmVuICIKLQkgICAgInR5cGUgXCIlc1wiIGlzIG5vdCBhIHVzZXItZGVyaXZlZCBzaW1wbGVUeXBlLlxuIiwKKwkgICAgInhtbFNjaGVtYUNoZWNrRGVyaXZhdGlvblZhbGlkU2ltcGxlUmVzdHJpY3Rpb246IFRoZSBnaXZlbiAiCisJICAgICJ0eXBlICclcycgaXMgbm90IGEgdXNlci1kZXJpdmVkIHNpbXBsZVR5cGUuXG4iLAogCSAgICB0eXBlLT5uYW1lLCBOVUxMKTsKIAlyZXR1cm4gKC0xKTsKICAgICB9CkBAIC03MjU2LDI0ICs5MzUwLDI2IEBACiAJKiB0eXBlIGRlZmluaXRpb24gb3IgYSBidWlsdC1pbiBwcmltaXRpdmUgZGF0YXR5cGUuCiAJKi8JCiAJaWYgKCh0eXBlLT5iYXNlVHlwZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfQVRPTUlDKSA9PSAwKSB7Ci0JICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwkgICAgeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAogCQlYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzFfMSwKLQkJIkF0b21pYyBzaW1wbGUgdHlwZSBcIiVzXCI6ICIKLQkJIml0cyBiYXNlIHR5cGUgXCIlc1wiIGlzIG5vdCBhbiBhdG9taWMgc2ltcGxlIHR5cGUuXG4iLAotCQl0eXBlLT5uYW1lLCBOVUxMKTsKKwkJTlVMTCwgdHlwZSwgTlVMTCwJCisJCSJUaGUgYmFzZSB0eXBlICVzIGlzIG5vdCBhbiBhdG9taWMgc2ltcGxlIHR5cGUiLAorCQl4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHIsIE5VTEwsIHR5cGUtPmJhc2VUeXBlLCBOVUxMLCAxKSk7CisJICAgIEZSRUVfQU5EX05VTEwoc3RyKQogCSAgICByZXR1cm4gKFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMV8xKTsKIAl9CiAJLyogMS4yIFRoZSB7ZmluYWx9IG9mIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3Qgbm90IGNvbnRhaW4gCiAJKiByZXN0cmljdGlvbi4KIAkqLwotCS8qIE9QVElNSVpFOiBUaGlzIGlzIGFscmVhZHkgZG9uZSBpbiB4bWxTY2hlbWFDaGVja1N0UHJvcHNDb3JyZWN0ICovCisJLyogT1BUSU1JWkUgVE9ETyA6IFRoaXMgaXMgYWxyZWFkeSBkb25lIGluIHhtbFNjaGVtYUNoZWNrU3RQcm9wc0NvcnJlY3QgKi8KIAlpZiAoeG1sU2NoZW1hVHlwZUZpbmFsQ29udGFpbnMoY3R4dC0+c2NoZW1hLCB0eXBlLT5iYXNlVHlwZSwgCiAJICAgIFhNTF9TQ0hFTUFTX1RZUEVfRklOQUxfUkVTVFJJQ1RJT04pKSB7Ci0JICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwkgICAgeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAogCQlYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzFfMiwKLQkJIkF0b21pYyBzaW1wbGUgdHlwZSBcIiVzXCI6IHRoZSBcImZpbmFsXCIgb2YgaXRzIGJhc2UgdHlwZSAiCi0JCSJcIiVzXCIgbXVzdCBub3QgY29udGFpbiBcInJlc3RyaWN0aW9uXCIuXG4iLAotCQl0eXBlLT5uYW1lLCB0eXBlLT5iYXNlVHlwZS0+bmFtZSk7CisJCU5VTEwsIHR5cGUsIE5VTEwsCQorCQkiVGhlIGZpbmFsIG9mIGl0cyBiYXNlIHR5cGUgJXMgbXVzdCBub3QgY29udGFpbiAncmVzdHJpY3Rpb24nIiwKKwkJeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydCgmc3RyLCBOVUxMLCB0eXBlLT5iYXNlVHlwZSwgTlVMTCwgMSkpOworCSAgICBGUkVFX0FORF9OVUxMKHN0cikKIAkgICAgcmV0dXJuIChYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzFfMik7CiAJfQogCQpAQCAtNzI5MSwzMCArOTM4NywyMiBAQAogCQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsCiAJCSAgICBYTUxfRVJSX0lOVEVSTkFMX0VSUk9SLAogCQkgICAgInhtbFNjaGVtYUNoZWNrRGVyaXZhdGlvblZhbGlkU2ltcGxlUmVzdHJpY3Rpb246IGZhaWxlZCAiCi0JCSAgICAidG8gZ2V0IHByaW1pdGl2ZSB0eXBlIG9mIHR5cGUgXCIlc1wiLlxuIiwKKwkJICAgICJ0byBnZXQgcHJpbWl0aXZlIHR5cGUgb2YgdHlwZSAnJXMnLlxuIiwKIAkJICAgIHR5cGUtPm5hbWUsIE5VTEwpOwogCQlyZXR1cm4gKC0xKTsKIAkgICAgfQkgICAgCiAJICAgIGZhY2V0ID0gdHlwZS0+ZmFjZXRzOwogCSAgICBkbyB7CiAJCWlmICh4bWxTY2hlbWFJc0J1aWx0SW5UeXBlRmFjZXQocHJpbWl0aXZlLCBmYWNldC0+dHlwZSkgPT0gMCkgewotCQkgICAgeG1sU2NoZW1hUEVyckV4dChjdHh0LCB0eXBlLT5ub2RlLAorCQkgICAgb2sgPSAwOworCQkgICAgeG1sU2NoZW1hUElsbGVnYWxGYWNldEF0b21pY0VycihjdHh0LAogCQkJWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18xXzNfMSwKLQkJCU5VTEwsIE5VTEwsIE5VTEwsCi0JCQkiQXRvbWljIHNpbXBsZSB0eXBlIFwiJXNcIjogdGhlIGZhY2V0IFwiJXNcIiAiCi0JCQkiaXMgbm90IGFsbG93ZWQgb24gcHJpbWl0aXZlIHR5cGUgXCIlc1wiLlxuIiwKLQkJCXR5cGUtPm5hbWUsIAotCQkJKGNvbnN0IHhtbENoYXIgKikKLQkJCXhtbFNjaGVtYUZhY2V0VHlwZVRvU3RyaW5nKGZhY2V0LT50eXBlKSwKLQkJCUJBRF9DQVNUIHByaW1pdGl2ZS0+bmFtZSwgTlVMTCwgTlVMTCk7Ci0JCSAgICAKLQkJICAgIG9rID0gMDsJCQkgICAgCisJCQlOVUxMLCB0eXBlLCBwcmltaXRpdmUsIGZhY2V0KTsJCSAgICAJCSAgICAJCSAgICAKIAkJfQogCQlmYWNldCA9IGZhY2V0LT5uZXh0OwogCSAgICB9IHdoaWxlIChmYWNldCAhPSBOVUxMKTsJICAgIAogCSAgICBpZiAob2sgPT0gMCkKLQkJcmV0dXJuIChYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzFfM18xKTsKLQkgICAgCisJCXJldHVybiAoWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18xXzNfMSk7CSAgICAKIAl9CiAJLyoKIAkqIFRPRE86IDEuMy4yIChmYWNldCBkZXJpdmF0aW9uKQpAQCAtNzMyNyw3ICs5NDE1LDcgQEAKIAkgICAgeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAogCQlYTUxfRVJSX0lOVEVSTkFMX0VSUk9SLAogCQkiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYUNoZWNrRGVyaXZhdGlvblZhbGlkU2ltcGxlUmVzdHJpY3Rpb246ICIKLQkJImZhaWxlZCB0byBldmFsdWF0ZSB0aGUgaXRlbSB0eXBlIG9mIHR5cGUgXCIlc1wiLlxuIiwKKwkJImZhaWxlZCB0byBldmFsdWF0ZSB0aGUgaXRlbSB0eXBlIG9mIHR5cGUgJyVzJy5cbiIsCiAJCXR5cGUtPm5hbWUsIE5VTEwpOwogCSAgICByZXR1cm4gKC0xKTsKIAl9CkBAIC03MzM4LDExICs5NDI2LDEyIEBACiAJKi8KIAlpZiAoKChpdGVtVHlwZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfQVRPTUlDKSA9PSAwKSAmJiAgCiAJICAgICgoaXRlbVR5cGUtPmZsYWdzICYgWE1MX1NDSEVNQVNfVFlQRV9WQVJJRVRZX1VOSU9OKSA9PSAwKSkgewkgICAgCi0JICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwkgICAgeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAogCQlYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzJfMSwKLQkJIkxpc3Qgc2ltcGxlIHR5cGUgXCIlc1wiOiBpdHMgaXRlbSB0eXBlIFwiJXNcIiAiCi0JCSJpcyBub3QgYW4gYXRvbWljIG9yIHVuaW9uIHNpbXBsZSB0eXBlLlxuIiwKLQkJdHlwZS0+bmFtZSwgaXRlbVR5cGUtPm5hbWUpOwkgICAgCisJCU5VTEwsIHR5cGUsIE5VTEwsCQorCQkiVGhlIGl0ZW0gdHlwZSAlcyBtdXN0IGhhdmUgYSB2YXJpZXR5IG9mIGF0b21pYyBvciB1bmlvbiIsCisJCXhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ciwgTlVMTCwgaXRlbVR5cGUsIE5VTEwsIDEpKTsKKwkgICAgRlJFRV9BTkRfTlVMTChzdHIpCSAgICAKIAkgICAgcmV0dXJuIChYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzJfMSk7CiAJfSBlbHNlIGlmIChpdGVtVHlwZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfVU5JT04pIHsKIAkgICAgeG1sU2NoZW1hVHlwZUxpbmtQdHIgbWVtYmVyOwpAQCAtNzM1MSwxMyArOTQ0MCwxMyBAQAogCSAgICB3aGlsZSAobWVtYmVyICE9IE5VTEwpIHsKIAkJaWYgKChtZW1iZXItPnR5cGUtPmZsYWdzICYgCiAJCSAgICBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfQVRPTUlDKSA9PSAwKSB7Ci0JCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsCisJCSAgICB4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCiAJCQlYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzJfMSwKLQkJCSJMaXN0IHNpbXBsZSB0eXBlIFwiJXNcIjogaXRzIGl0ZW0gdHlwZSAiIAotCQkJImlzIGEgdW5pb24gc2ltcGxlIHR5cGUsIGJ1dCB0aGUgbWVtYmVyIHR5cGUgIgotCQkJIlwiJXNcIiBvZiB0aGlzIGl0ZW0gdHlwZSBpcyBub3QgYW4gXCJhdG9taWNcIiAiCi0JCQkic2ltcGxlIHR5cGUuXG4iLAotCQkJdHlwZS0+bmFtZSwgbWVtYmVyLT50eXBlLT5uYW1lKTsKKwkJCU5VTEwsIHR5cGUsIE5VTEwsCQorCQkJIlRoZSBpdGVtIHR5cGUgaXMgYSB1bmlvbiB0eXBlLCBidXQgdGhlICIKKwkJCSJtZW1iZXIgdHlwZSAlcyBvZiB0aGlzIGl0ZW0gdHlwZSBpcyBub3QgYXRvbWljIiwKKwkJCXhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ciwgTlVMTCwgbWVtYmVyLT50eXBlLCBOVUxMLCAxKSk7CisJCSAgICBGUkVFX0FORF9OVUxMKHN0cikJCSAgICAKIAkJICAgIHJldHVybiAoWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzEpOwogCQl9CiAJCW1lbWJlciA9IG1lbWJlci0+bmV4dDsKQEAgLTczNzYsMTEgKzk0NjUsMTIgQEAKIAkgICAgKi8KIAkgICAgaWYgKHhtbFNjaGVtYVR5cGVGaW5hbENvbnRhaW5zKGN0eHQtPnNjaGVtYSwgCiAJCWl0ZW1UeXBlLCBYTUxfU0NIRU1BU19UWVBFX0ZJTkFMX0xJU1QpKSB7Ci0JCXhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwkJeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAogCQkgICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMV8xLAotCQkgICAgIkxpc3Qgc2ltcGxlIHR5cGUgXCIlc1wiOiB0aGUgXCJmaW5hbFwiIG9mIGl0cyBpdGVtIHR5cGUgIgotCQkgICAgIlwiJXNcIiBtdXN0IG5vdCBjb250YWluIFwibGlzdFwiLlxuIiwKLQkJICAgIHR5cGUtPm5hbWUsIGl0ZW1UeXBlLT5uYW1lKTsKKwkJICAgIE5VTEwsIHR5cGUsIE5VTEwsCQorCQkgICAgIlRoZSBmaW5hbCBvZiBpdHMgaXRlbSB0eXBlICVzIG11c3Qgbm90IGNvbnRhaW4gJ2xpc3QnIiwKKwkJICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ciwgTlVMTCwgaXRlbVR5cGUsIE5VTEwsIDEpKTsKKwkJRlJFRV9BTkRfTlVMTChzdHIpCQkJCiAJCXJldHVybiAoWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMV8xKTsKIAkgICAgfQogCSAgICAvKgpAQCAtNzM5MCwxMyArOTQ4MCwxMCBAQAogCSAgICBpZiAodHlwZS0+ZmFjZXRzICE9IE5VTEwpIHsKIAkJZmFjZXQgPSB0eXBlLT5mYWNldHM7CiAJCWRvIHsKLQkJICAgIGlmIChmYWNldC0+dHlwZSAhPSBYTUxfU0NIRU1BX0ZBQ0VUX1dISVRFU1BBQ0UpIHsJCSAKLQkJCXhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwkJICAgIGlmIChmYWNldC0+dHlwZSAhPSBYTUxfU0NIRU1BX0ZBQ0VUX1dISVRFU1BBQ0UpIHsKKwkJCXhtbFNjaGVtYVBJbGxlZ2FsRmFjZXRMaXN0VW5pb25FcnIoY3R4dCwKIAkJCSAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzJfM18xXzIsCi0JCQkgICAgIkxpc3Qgc2ltcGxlIHR5cGUgXCIlc1wiOiB0aGUgZmFjZXQgXCIlc1wiICIKLQkJCSAgICAiaXMgbm90IGFsbG93ZWQuXG4iLCAKLQkJCSAgICB0eXBlLT5uYW1lLAotCQkJICAgIEJBRF9DQVNUIHhtbFNjaGVtYUZhY2V0VHlwZVRvU3RyaW5nKGZhY2V0LT50eXBlKSk7CisJCQkgICAgTlVMTCwgdHlwZSwgZmFjZXQpOwogCQkJcmV0dXJuIChYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzJfM18xXzIpOwogCQkgICAgfQogCQkgICAgZmFjZXQgPSBmYWNldC0+bmV4dDsKQEAgLTc0MTgsMTEgKzk1MDUsMTIgQEAKIAkgICAgKiAyLjMuMi4xIFRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3QgaGF2ZSBhIHt2YXJpZXR5fSBvZiBsaXN0LgogCSAgICAqLwogCSAgICBpZiAoKHR5cGUtPmJhc2VUeXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfVkFSSUVUWV9MSVNUKSA9PSAwKSB7Ci0JCXhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwkJeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAogCQkgICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMl8xLAotCQkgICAgIkxpc3Qgc2ltcGxlIHR5cGUgXCIlc1wiOiBpdHMgYmFzZSB0eXBlIFwiJXNcIiBtdXN0ICIKLQkJICAgICJoYXZlIGEgdmFyaWV0eSBvZiBsaXN0LlxuIiwKLQkJICAgIHR5cGUtPm5hbWUsIHR5cGUtPmJhc2VUeXBlLT5uYW1lKTsKKwkJICAgIE5VTEwsIHR5cGUsIE5VTEwsCQorCQkgICAgIlRoZSBiYXNlIHR5cGUgJXMgbXVzdCBiZSBhIGxpc3QgdHlwZSIsCisJCSAgICB4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHIsIE5VTEwsIHR5cGUtPmJhc2VUeXBlLCBOVUxMLCAxKSk7CisJCUZSRUVfQU5EX05VTEwoc3RyKQkJCQkJCiAJCXJldHVybiAoWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMl8xKTsKIAkgICAgfQogCSAgICAvKgpAQCAtNzQzMSwxMSArOTUxOSwxMiBAQAogCSAgICAqLwogCSAgICBpZiAoeG1sU2NoZW1hVHlwZUZpbmFsQ29udGFpbnMoY3R4dC0+c2NoZW1hLCB0eXBlLT5iYXNlVHlwZSwKIAkJWE1MX1NDSEVNQVNfVFlQRV9GSU5BTF9SRVNUUklDVElPTikpIHsKLQkJeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAorCQl4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCiAJCSAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzJfM18yXzIsCi0JCSAgICAiTGlzdCBzaW1wbGUgdHlwZSBcIiVzXCI6IGl0cyBiYXNlIHR5cGUgXCIlc1wiIG11c3Qgbm90ICIKLQkJICAgICJoYXZlIGEgXCJmaW5hbFwiIGNvbnRhaW5pbmcgXCJyZXN0cmljdGlvblwiLlxuIiwKLQkJICAgIHR5cGUtPm5hbWUsIHR5cGUtPmJhc2VUeXBlLT5uYW1lKTsKKwkJICAgIE5VTEwsIHR5cGUsIE5VTEwsCQorCQkgICAgIlRoZSBmaW5hbCBvZiB0aGUgYmFzZSB0eXBlICVzIG11c3Qgbm90IGNvbnRhaW4gJ3Jlc3RyaWN0aW9uJyIsCisJCSAgICB4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHIsIE5VTEwsIHR5cGUtPmJhc2VUeXBlLCBOVUxMLCAxKSk7CisJCUZSRUVfQU5EX05VTEwoc3RyKQkJCQkKIAkJcmV0dXJuIChYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzJfM18yXzIpOwogCSAgICB9CiAJICAgIC8qCkBAIC03NDUxLDIyICs5NTQwLDI3IEBACiAJCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsCiAJCQlYTUxfRVJSX0lOVEVSTkFMX0VSUk9SLAogCQkJInhtbFNjaGVtYUNoZWNrRGVyaXZhdGlvblZhbGlkU2ltcGxlUmVzdHJpY3Rpb246ICIKLQkJCSJMaXN0IHNpbXBsZSB0eXBlIFwiJXNcIjogZmFpbGVkIHRvICIKLQkJCSJldmFsdWF0ZSB0aGUgaXRlbSB0eXBlIG9mIGl0cyBiYXNlIHR5cGUgXCIlc1wiLlxuIiwKKwkJCSJMaXN0IHNpbXBsZSB0eXBlICclcyc6IEZhaWxlZCB0byAiCisJCQkiZXZhbHVhdGUgdGhlIGl0ZW0gdHlwZSBvZiBpdHMgYmFzZSB0eXBlICclcycuXG4iLAogCQkJdHlwZS0+bmFtZSwgdHlwZS0+YmFzZVR5cGUtPm5hbWUpOwogCQkgICAgcmV0dXJuICgtMSk7CiAJCX0KIAkJaWYgKChpdGVtVHlwZSAhPSBiYXNlSXRlbVR5cGUpICYmCiAJCSAgICAoeG1sU2NoZW1hQ2hlY2tDT1NTVERlcml2ZWRPSyhjdHh0LT5zY2hlbWEsIGl0ZW1UeXBlLAogCQkgICAgYmFzZUl0ZW1UeXBlLCAwKSAhPSAwKSkgewotCQkgICAgeG1sU2NoZW1hUEVyckV4dChjdHh0LCB0eXBlLT5ub2RlLCAKLQkJCVhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8zXzJfMywgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCSJMaXN0IHNpbXBsZSB0eXBlIFwiJXNcIjogaXRzIGl0ZW0gdHlwZSBcIiVzXCIgaXMgbm90ICIKLQkJCSJ2YWxpZGx5IGRlcml2ZWQgZnJvbSB0aGUgaXRlbSB0eXBlIFwiJXNcIiBvZiB0aGUgIgotCQkJImJhc2UgdHlwZSBcIiVzXCIgYXMgZGVmaW5lZCBpbiBUeXBlIERlcml2YXRpb24gT0sgIgotCQkJIihTaW1wbGUpLlxuIiwKLQkJCXR5cGUtPm5hbWUsIGl0ZW1UeXBlLT5uYW1lLCBiYXNlSXRlbVR5cGUtPm5hbWUsCi0JCQl0eXBlLT5iYXNlVHlwZS0+bmFtZSwgTlVMTCk7CisJCSAgICB4bWxDaGFyICpzdHJCSVQgPSBOVUxMLCAqc3RyQlQgPSBOVUxMOworCQkgICAgeG1sU2NoZW1hUEN1c3RvbUVyckV4dChjdHh0LAorCQkJWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMl8zLAorCQkJTlVMTCwgdHlwZSwgTlVMTCwJCisJCQkiVGhlIGl0ZW0gdHlwZSAlcyBpcyBub3QgdmFsaWRseSBkZXJpdmVkIGZyb20gdGhlICIKKwkJCSJpdGVtIHR5cGUgJXMgb2YgdGhlIGJhc2UgdHlwZSAlcyIsCisJCQl4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHIsIE5VTEwsIGl0ZW1UeXBlLCBOVUxMLCAxKSwKKwkJCXhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ckJJVCwgTlVMTCwgYmFzZUl0ZW1UeXBlLCBOVUxMLCAxKSwKKwkJCXhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ckJULCBOVUxMLCB0eXBlLT5iYXNlVHlwZSwgTlVMTCwgMSkpOworCisJCSAgICBGUkVFX0FORF9OVUxMKHN0cikKKwkJICAgIEZSRUVfQU5EX05VTEwoc3RyQklUKQorCQkgICAgRlJFRV9BTkRfTlVMTChzdHJCVCkJCSAgICAKIAkJICAgIHJldHVybiAoWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18yXzNfMl8zKTsKIAkJfQogCSAgICB9CkBAIC03NDkzLDEyICs5NTg3LDkgQEAKIAkJCWNhc2UgWE1MX1NDSEVNQV9GQUNFVF9FTlVNRVJBVElPTjoKIAkJCSAgICBicmVhazsKIAkJCWRlZmF1bHQ6IHsKLQkJCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsCisJCQkgICAgeG1sU2NoZW1hUElsbGVnYWxGYWNldExpc3RVbmlvbkVycihjdHh0LAogCQkJCVhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfMl8zXzJfNCwKLQkJCQkiTGlzdCBzaW1wbGUgdHlwZSBcIiVzXCI6IHRoZSBmYWNldCBcIiVzXCIgIgotCQkJCSJpcyBub3QgYWxsb3dlZC5cbiIsCi0JCQkJdHlwZS0+bmFtZSwgCi0JCQkJQkFEX0NBU1QgeG1sU2NoZW1hRmFjZXRUeXBlVG9TdHJpbmcoZmFjZXQtPnR5cGUpKTsKKwkJCQlOVUxMLCB0eXBlLCBmYWNldCk7CiAJCQkgICAgLyoKIAkJCSAgICAqIFdlIGNvdWxkIHJldHVybiwgYnV0IGl0J3MgbmljZXIgdG8gcmVwb3J0IGFsbCAKIAkJCSAgICAqIGludmFsaWQgZmFjZXRzLgpAQCAtNzUzMywxMSArOTYyNCwxMiBAQAogCQlYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfQVRPTUlDKSA9PSAwKSAmJiAKIAkJKChtZW1iZXItPnR5cGUtPmZsYWdzICYgCiAJCVhNTF9TQ0hFTUFTX1RZUEVfVkFSSUVUWV9MSVNUKSA9PSAwKSkgewotCQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGUtPm5vZGUsCisJCXhtbFNjaGVtYVBDdXN0b21FcnIoY3R4dCwKIAkJICAgIFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfM18xLAotCQkgICAgIlVuaW9uIHNpbXBsZSB0eXBlIFwiJXNcIjogdGhlIG1lbWJlciB0eXBlICIgCi0JCSAgICAiXCIlc1wiIGlzIG5vdCBhbiBcImF0b21pY1wiIHNpbXBsZSB0eXBlLlxuIiwKLQkJICAgIHR5cGUtPm5hbWUsIG1lbWJlci0+dHlwZS0+bmFtZSk7CisJCSAgICBOVUxMLCB0eXBlLCBOVUxMLAorCQkgICAgIlRoZSBtZW1iZXIgdHlwZSAlcyBpcyBuZWl0aGVyIGFuIGF0b21pYywgbm9yIGEgbGlzdCB0eXBlIiwKKwkJICAgIHhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ciwgTlVMTCwgbWVtYmVyLT50eXBlLCBOVUxMLCAxKSk7CisJCUZSRUVfQU5EX05VTEwoc3RyKQogCQlyZXR1cm4gKFhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfM18xKTsKIAkgICAgfQogCSAgICBtZW1iZXIgPSBtZW1iZXItPm5leHQ7CkBAIC03NTU1LDExICs5NjQ3LDEyIEBACiAJICAgIHdoaWxlIChtZW1iZXIgIT0gTlVMTCkgewogCQlpZiAoeG1sU2NoZW1hVHlwZUZpbmFsQ29udGFpbnMoY3R4dC0+c2NoZW1hLCBtZW1iZXItPnR5cGUsIAogCQkgICAgWE1MX1NDSEVNQVNfVFlQRV9GSU5BTF9VTklPTikpIHsKLQkJICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwkJICAgIHhtbFNjaGVtYVBDdXN0b21FcnIoY3R4dCwKIAkJCVhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfM18zXzEsCi0JCQkiVW5pb24gc2ltcGxlIHR5cGUgXCIlc1wiOiB0aGUgXCJmaW5hbFwiIG9mIG1lbWJlciB0eXBlICIgCi0JCQkiXCIlc1wiIGNvbnRhaW5zIFwidW5pb25cIi5cbiIsCi0JCQl0eXBlLT5uYW1lLCBtZW1iZXItPnR5cGUtPm5hbWUpOworCQkJTlVMTCwgdHlwZSwgTlVMTCwKKwkJCSJUaGUgZmluYWwgb2YgbWVtYmVyIHR5cGUgJXMgY29udGFpbnMgJ3VuaW9uJyIsCisJCQl4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHIsIE5VTEwsIG1lbWJlci0+dHlwZSwgTlVMTCwgMSkpOworCQkgICAgRlJFRV9BTkRfTlVMTChzdHIpCQkgICAKIAkJICAgIHJldHVybiAoWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18zXzNfMSk7CiAJCX0KIAkJbWVtYmVyID0gbWVtYmVyLT5uZXh0OwpAQCAtNzU2OCwxMCArOTY2MSwxMCBAQAogCSAgICAqIDMuMy4xLjIgVGhlIHtmYWNldHN9IG11c3QgYmUgZW1wdHkuCiAJICAgICovCiAJICAgIGlmICh0eXBlLT5mYWNldFNldCAhPSBOVUxMKSB7Ci0JCXhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwkJeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LAogCQkgICAgWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18zXzNfMV8yLAotCQkgICAgIlVuaW9uIHNpbXBsZSB0eXBlIFwiJXNcIjogdGhlIGZhY2V0cyBtdXN0IGJlIGVtcHR5LlxuIiwKLQkJICAgIHR5cGUtPm5hbWUsIE5VTEwpOworCQkgICAgTlVMTCwgdHlwZSwgTlVMTCwgCisJCSAgICAiTm8gZmFjZXRzIGFsbG93ZWQiLCBOVUxMKTsKIAkJcmV0dXJuIChYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18xXzIpOwogCSAgICB9CiAJfSBlbHNlIHsKQEAgLTc1NzksMTEgKzk2NzIsMTIgQEAKIAkgICAgKiAzLjMuMi4xIFRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3QgaGF2ZSBhIHt2YXJpZXR5fSBvZiB1bmlvbi4KIAkgICAgKi8KIAkgICAgaWYgKCh0eXBlLT5iYXNlVHlwZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfVU5JT04pID09IDApIHsKLQkJeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAorCQl4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCiAJCSAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18yXzEsCi0JCSAgICAiVW5pb24gc2ltcGxlIHR5cGUgXCIlc1wiOiBpdHMgYmFzZSB0eXBlIFwiJXNcIiBoYXMgbm90IGEgIgotCQkgICAgInZhcmlldHkgb2YgdW5pb24uXG4iLAotCQkgICAgdHlwZS0+bmFtZSwgdHlwZS0+YmFzZVR5cGUtPm5hbWUpOworCQkgICAgTlVMTCwgdHlwZSwgTlVMTCwKKwkJICAgICJUaGUgYmFzZSB0eXBlICVzIGlzIG5vdCBhIHVuaW9uIHR5cGUiLAorCQkgICAgeG1sU2NoZW1hRm9ybWF0SXRlbUZvclJlcG9ydCgmc3RyLCBOVUxMLCB0eXBlLT5iYXNlVHlwZSwgTlVMTCwgMSkpOworCQlGUkVFX0FORF9OVUxMKHN0cikJCQkKIAkJcmV0dXJuIChYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18yXzEpOwogCSAgICB9CiAJICAgIC8qCkBAIC03NTkxLDExICs5Njg1LDEyIEBACiAJICAgICovCiAJICAgIGlmICh4bWxTY2hlbWFUeXBlRmluYWxDb250YWlucyhjdHh0LT5zY2hlbWEsIHR5cGUtPmJhc2VUeXBlLCAKIAkJWE1MX1NDSEVNQVNfVFlQRV9GSU5BTF9SRVNUUklDVElPTikpIHsKLQkJeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAorCQl4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCiAJCSAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18yXzIsCi0JCSAgICAiVW5pb24gc2ltcGxlIHR5cGUgXCIlc1wiOiB0aGUgXCJmaW5hbFwiIG9mIGl0cyBiYXNlICIKLQkJICAgICJ0eXBlIFwiJXNcIiBtdXN0IG5vdCBjb250YWluIFwicmVzdHJpY3Rpb25cIi5cbiIsCi0JCSAgICB0eXBlLT5uYW1lLCB0eXBlLT5iYXNlVHlwZS0+bmFtZSk7CisJCSAgICBOVUxMLCB0eXBlLCBOVUxMLAorCQkgICAgIlRoZSBmaW5hbCBvZiBpdHMgYmFzZSB0eXBlICVzIG11c3Qgbm90IGNvbnRhaW4gJ3Jlc3RyaWN0aW9uJyIsCisJCSAgICB4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHIsIE5VTEwsIHR5cGUtPmJhc2VUeXBlLCBOVUxMLCAxKSk7CisJCUZSRUVfQU5EX05VTEwoc3RyKQkJCiAJCXJldHVybiAoWE1MX1NDSEVNQVBfQ09TX1NUX1JFU1RSSUNUU18zXzNfMl8yKTsKIAkgICAgfQogCSAgICAvKgpAQCAtNzYyNiw3ICs5NzIxLDcgQEAKIAkJCSAgICBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCiAJCQkgICAgIkludGVybmFsIGVycm9yOiAiCiAJCQkgICAgInhtbFNjaGVtYUNoZWNrRGVyaXZhdGlvblZhbGlkU2ltcGxlUmVzdHJpY3Rpb24gIgotCQkJICAgICIoMy4zLjIuMyksIHVuaW9uIHNpbXBsZSB0eXBlIFwiJXNcIiwgdW5lcXVhbCBudW1iZXIgIgorCQkJICAgICIoMy4zLjIuMyksIHVuaW9uIHNpbXBsZSB0eXBlICclcycsIHVuZXF1YWwgbnVtYmVyICIKIAkJCSAgICAib2YgbWVtYmVyIHR5cGVzIGluIHRoZSBiYXNlIHR5cGVcbiIsCiAJCQkgICAgdHlwZS0+bmFtZSwgTlVMTCk7CiAJCSAgICB9CQkKQEAgLTc2MzYsMjQgKzk3MzEsMjYgQEAKIAkJCQlYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCiAJCQkJIkludGVybmFsIGVycm9yOiAiCiAJCQkJInhtbFNjaGVtYUNoZWNrRGVyaXZhdGlvblZhbGlkU2ltcGxlUmVzdHJpY3Rpb24gIgotCQkJCSIoMy4zLjIuMyksIHVuaW9uIHNpbXBsZSB0eXBlIFwiJXNcIiwgdW5lcXVhbCBudW1iZXIgIgotCQkJCSJvZiBtZW1iZXIgdHlwZXMgaW4gdGhlIGJhc2UgdHlwZVxuIiwKKwkJCQkiKDMuMy4yLjMpLCB1bmlvbiBzaW1wbGUgdHlwZSAnJXMnLCB1bmVxdWFsIG51bWJlciAiCisJCQkJIm9mIG1lbWJlciB0eXBlcyBpbiB0aGUgYmFzZSB0eXBlLlxuIiwKIAkJCQl0eXBlLT5uYW1lLCBOVUxMKTsKIAkJCX0KIAkJCWlmICgobWVtYmVyLT50eXBlICE9IGJhc2VNZW1iZXItPnR5cGUpICYmCiAJCQkgICAgKHhtbFNjaGVtYUNoZWNrQ09TU1REZXJpdmVkT0soY3R4dC0+c2NoZW1hLCAKIAkJCSAgICBtZW1iZXItPnR5cGUsIGJhc2VNZW1iZXItPnR5cGUsIDApICE9IDApKSB7Ci0JCQkgICAgeG1sU2NoZW1hUEVyckV4dChjdHh0LCB0eXBlLT5ub2RlLCAKLQkJCQlYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18yXzMsIE5VTEwsIAotCQkJCU5VTEwsIE5VTEwsCi0JCQkJIlVuaW9uIHNpbXBsZSB0eXBlIFwiJXNcIjogaXRzIG1lbWJlciB0eXBlICIKLQkJCQkiXCIlc1wiIGlzIG5vdCB2YWxpZGx5IGRlcml2ZWQgZnJvbSBpdHMgIgotCQkJCSJjb3JyZXNwb25kaW5nIG1lbWJlciB0eXBlIFwiJXNcIiBvZiB0aGUgYmFzZSAiCi0JCQkJInR5cGUgXCIlc1wiIGFzIGRlZmluZWQgaW4gVHlwZSBEZXJpdmF0aW9uIE9LICIKLQkJCQkiKFNpbXBsZSkuXG4iLAotCQkJCXR5cGUtPm5hbWUsIG1lbWJlci0+dHlwZS0+bmFtZSwgCi0JCQkJYmFzZU1lbWJlci0+dHlwZS0+bmFtZSwKLQkJCQl0eXBlLT5iYXNlVHlwZS0+bmFtZSwgTlVMTCk7CisJCQkgICAgeG1sQ2hhciAqc3RyQk1UID0gTlVMTCwgKnN0ckJUID0gTlVMTDsKKworCQkJICAgIHhtbFNjaGVtYVBDdXN0b21FcnJFeHQoY3R4dCwKKwkJCQlYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18yXzMsCisJCQkJTlVMTCwgdHlwZSwgTlVMTCwKKwkJCQkiVGhlIG1lbWJlciB0eXBlICVzIGlzIG5vdCB2YWxpZGx5IGRlcml2ZWQgZnJvbSBpdHMgIgorCQkJCSJjb3JyZXNwb25kaW5nIG1lbWJlciB0eXBlICVzIG9mIHRoZSBiYXNlIHR5cGUgJXMiLAorCQkJCXhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ciwgTlVMTCwgbWVtYmVyLT50eXBlLCBOVUxMLCAxKSwKKwkJCQl4bWxTY2hlbWFGb3JtYXRJdGVtRm9yUmVwb3J0KCZzdHJCTVQsIE5VTEwsIGJhc2VNZW1iZXItPnR5cGUsIE5VTEwsIDEpLAorCQkJCXhtbFNjaGVtYUZvcm1hdEl0ZW1Gb3JSZXBvcnQoJnN0ckJULCBOVUxMLCB0eXBlLT5iYXNlVHlwZSwgTlVMTCwgMSkpOworCQkJICAgIEZSRUVfQU5EX05VTEwoc3RyKQorCQkJICAgIEZSRUVfQU5EX05VTEwoc3RyQk1UKQorCQkJICAgIEZSRUVfQU5EX05VTEwoc3RyQlQpCiAJCQkgICAgcmV0dXJuIChYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18yXzMpOwogCQkJfQkJCiAJCQltZW1iZXIgPSBtZW1iZXItPm5leHQ7CkBAIC03NjczLDEyICs5NzcwLDkgQEAKIAkJZG8gewogCQkgICAgaWYgKChmYWNldC0+dHlwZSAhPSBYTUxfU0NIRU1BX0ZBQ0VUX1BBVFRFUk4pICYmCiAJCQkoZmFjZXQtPnR5cGUgIT0gWE1MX1NDSEVNQV9GQUNFVF9FTlVNRVJBVElPTikpIHsKLQkJCXhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKLQkJCSAgICBYTUxfU0NIRU1BUF9DT1NfU1RfUkVTVFJJQ1RTXzNfM18yXzQsCi0JCQkgICAgIlVuaW9uIHNpbXBsZSB0eXBlIFwiJXNcIjogdGhlIGZhY2V0IFwiJXNcIiAiCi0JCQkgICAgImlzIG5vdCBhbGxvd2VkLlxuIiwKLQkJCSAgICB0eXBlLT5uYW1lLCAKLQkJCSAgICBCQURfQ0FTVCB4bWxTY2hlbWFGYWNldFR5cGVUb1N0cmluZyhmYWNldC0+dHlwZSkpOworCQkJeG1sU2NoZW1hUElsbGVnYWxGYWNldExpc3RVbmlvbkVycihjdHh0LAorCQkJCVhNTF9TQ0hFTUFQX0NPU19TVF9SRVNUUklDVFNfM18zXzJfNCwKKwkJCQlOVUxMLCB0eXBlLCBmYWNldCk7CQkJCiAJCQlvayA9IDA7CQkJICAgIAogCQkgICAgfQkJICAgIAogCQkgICAgZmFjZXQgPSBmYWNldC0+bmV4dDsKQEAgLTc3MjEsNyArOTgxNSw3IEBACiAJeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAogCQlYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCiAJCSJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hQ2hlY2tTUkNTaW1wbGVUeXBlLCAiCi0JCSJubyBzdWJ0eXBlIG9uIHNpbXBsZSB0eXBlIFwiJXNcIi5cbiIsCisJCSJubyBzdWJ0eXBlIG9uIHNpbXBsZSB0eXBlICclcycuXG4iLAogCQl0eXBlLT5uYW1lLCBOVUxMKTsKIAlyZXR1cm4gKC0xKTsKICAgICB9CkBAIC03NzQwLDcgKzk4MzQsNyBAQAogCS8qCiAJeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAogCSAgICBYTUxfU0NIRU1BUF9TUkNfU0lNUExFX1RZUEVfMSwKLQkgICAgIlNpbXBsZSB0eXBlIFwiJXNcIiBkb2VzIG5vdCBzYXRpc2Z5IHRoZSBjb25zdHJhaW50cyAiCisJICAgICJTaW1wbGUgdHlwZSAnJXMnIGRvZXMgbm90IHNhdGlzZnkgdGhlIGNvbnN0cmFpbnRzICIKIAkgICAgIm9uIHNpbXBsZSB0eXBlIGRlZmluaXRpb25zLlxuIiwKIAkgICAgdHlwZS0+bmFtZSwgTlVMTCk7CiAJKi8KQEAgLTc3NTksMTMgKzk4NTMsMTEgQEAKIAkgICAgKCh0eXBlLT5zdWJ0eXBlcy0+YmFzZSAhPSBOVUxMKSAmJgogCSAgICAgKHR5cGUtPnN1YnR5cGVzLT5zdWJ0eXBlcyAhPSBOVUxMKSAmJgogCSAgICAgKHR5cGUtPnN1YnR5cGVzLT5zdWJ0eXBlcy0+dHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfU0lNUExFKSkpIHsKLQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAorCSAgICB4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsIAogCQlYTUxfU0NIRU1BUF9TUkNfU0lNUExFX1RZUEVfMiwKLQkJIlNpbXBsZSB0eXBlIFwiJXNcIjogIgotCQkiVGhlIDxyZXN0cmljdGlvbj4gYWx0ZXJuYXRpdmUgaXMgY2hvc2VuLCB0aHVzIGVpdGhlciB0aGUgIgotCQkiXCJiYXNlXCIgYXR0cmlidXRlIG9yIHRoZSA8c2ltcGxlVHlwZT4gY2hpbGQgIgotCQkibXVzdCBiZSBwcmVzZW50LCBidXQgbm90IGJvdGguXG4iLAotCQl0eXBlLT5uYW1lLCBOVUxMKTsKKwkJTlVMTCwgdHlwZSwgTlVMTCwKKwkJIkVpdGhlciB0aGUgYXR0cmlidXRlICdiYXNlJyBvciB0aGUgPHNpbXBsZVR5cGU+IGNoaWxkICIKKwkJIm11c3QgYmUgcHJlc2VudCBvbiB0aGUgPHJlc3RyaWN0aW9uPiBjaGlsZCAiLCBOVUxMKTsKIAkgICAgcmV0dXJuIChYTUxfU0NIRU1BUF9TUkNfU0lNUExFX1RZUEVfMik7CiAJfQogICAgIH0gZWxzZSBpZiAodHlwZS0+c3VidHlwZXMtPnR5cGUgPT0gWE1MX1NDSEVNQV9UWVBFX0xJU1QpIHsKQEAgLTc3NzksMTMgKzk4NzEsMTEgQEAKIAkgICAgICh0eXBlLT5iYXNlVHlwZSA9PSBOVUxMKSkgfHwJICAgICAgCiAJICAgICgodHlwZS0+c3VidHlwZXMtPmJhc2UgIT0gTlVMTCkgJiYKIAkgICAgICh0eXBlLT5zdWJ0eXBlcy0+YmFzZVR5cGUgIT0gTlVMTCkpKSB7Ci0JICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZS0+bm9kZSwKKwkgICAgeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LCAKIAkJWE1MX1NDSEVNQVBfU1JDX1NJTVBMRV9UWVBFXzMsCi0JCSJTaW1wbGUgdHlwZSBcIiVzXCI6ICIKLQkJIlRoZSA8bGlzdD4gYWx0ZXJuYXRpdmUgaXMgY2hvc2VuLCB0aHVzIGVpdGhlciB0aGUgIiAKLQkJIlwiaXRlbVR5cGVcIiBhdHRyaWJ1dGUgb3IgdGhlIDxzaW1wbGVUeXBlPiBjaGlsZCAiCi0JCSJtdXN0IGJlIHByZXNlbnQsIGJ1dCBub3QgYm90aC5cbiIsCi0JCXR5cGUtPm5hbWUsIE5VTEwpOworCQlOVUxMLCB0eXBlLCBOVUxMLAorCQkiRWl0aGVyIHRoZSBhdHRyaWJ1dGUgJ2l0ZW1UeXBlJyBvciB0aGUgPHNpbXBsZVR5cGU+IGNoaWxkICIKKwkJIm11c3QgYmUgcHJlc2VudCBvbiB0aGUgPGxpc3Q+IGNoaWxkICIsIE5VTEwpOwkgICAgCiAJICAgIHJldHVybiAoWE1MX1NDSEVNQVBfU1JDX1NJTVBMRV9UWVBFXzMpOwogCX0KICAgICAKQEAgLTc4MTAsMTUgKzk5MDAsMTQgQEAKIAkJaWYgKGFuY2VzdG9yID09IGFueVNpbXBsZVR5cGUpCiAJCSAgICBicmVhazsKIAkJZWxzZSBpZiAoYW5jZXN0b3IgPT0gdHlwZSkgewotCQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlLT5ub2RlLAorCQkgICAgeG1sU2NoZW1hUEN1c3RvbUVycihjdHh0LCAKIAkJCVhNTF9TQ0hFTUFQX1NSQ19TSU1QTEVfVFlQRV80LAotCQkJIlNpbXBsZSB0eXBlIFwiJXNcIiBpcyBub3QgZGVyaXZlZCBmcm9tIHRoZSBzaW1wbGUgIgotCQkJInVyLXR5cGUgZGVmaW5pdGlvbiAoY2lyY3VsYXIgZGVmaW5pdGlvbnMgYXJlIGRpc2FsbG93ZWQpLlxuIiwKLQkJCXR5cGUtPm5hbWUsIE5VTEwpOworCQkJTlVMTCwgdHlwZSwgTlVMTCwKKwkJCSJUaGUgZGVmaW5pdGlvbiBpcyBjaXJjdWxhciIsIE5VTEwpOwogCQkgICAgcmV0dXJuIChYTUxfU0NIRU1BUF9TUkNfU0lNUExFX1RZUEVfNCk7CiAJCX0gZWxzZSBpZiAoYW5jZXN0b3ItPmZsYWdzICYgWE1MX1NDSEVNQVNfVFlQRV9WQVJJRVRZX0xJU1QpIHsKIAkJICAgIC8qCi0JCSAgICAqIFRPRE86IEFsdGhvdWdoIGEgbGlzdCBzaW1wbGUgdHlwZSBtdXN0IG5vdCBoYXZlIGEgdW5pb24gU1QKKwkJICAgICogVE9ETywgRklYTUU6IEFsdGhvdWdoIGEgbGlzdCBzaW1wbGUgdHlwZSBtdXN0IG5vdCBoYXZlIGEgdW5pb24gU1QKIAkJICAgICogdHlwZSBhcyBpdGVtIHR5cGUsIHdoaWNoIGluIHR1cm4gaGFzIGEgbGlzdCBTVCBhcyBtZW1iZXIgCiAJCSAgICAqIHR5cGUsIHdlIHdpbGwgYXNzdW1lIHRoaXMgaGVyZSBhcyB3ZWxsLCBzaW5jZSB0aGlzIGNoZWNrIAogCQkgICAgKiB3YXMgbm90IHlldCBwZXJmb3JtZWQuCkBAIC03ODI5LDcgKzk5MTgsNiBAQAogCSAgICB9ICAgCiAJICAgIG1lbWJlciA9IG1lbWJlci0+bmV4dDsKIAl9Ci0KICAgICB9CiAKICAgICByZXR1cm4gKDApOwpAQCAtNzg5NSwxMiArOTk4MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUdldFR5cGUoY3R4dC0+c2NoZW1hLCB0eXBlRGVjbC0+YmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVEZWNsLT5iYXNlTnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2UgPT0gTlVMTCkgewotCQkJICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZURlY2wtPm5vZGUsCi0JCQkJWE1MX1NDSEVNQVBfU1JDX1JFU09MVkUsCi0JCQkJIlJlc3RyaWN0aW9uIFwiJXNcIjogdGhlIFFOYW1lIFwiJXNcIiBvZiB0aGUgIgotCQkJCSJhdHRyaWJ1dGUgXCJiYXNlXCIgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHNjaGVtYSAiCi0JCQkJImNvbXBvbmVudC5cbiIsCi0JCQkJbmFtZSwgdHlwZURlY2wtPmJhc2UpOworCQkJICAgIHhtbFNjaGVtYVBSZXNDb21wQXR0ckVycihjdHh0LCAKKwkJCQlYTUxfU0NIRU1BUF9TUkNfUkVTT0xWRSwgCisJCQkJTlVMTCwgdHlwZURlY2wsIHR5cGVEZWNsLT5ub2RlLAorCQkJCSJiYXNlIiwgdHlwZURlY2wtPmJhc2UsIHR5cGVEZWNsLT5iYXNlTnMsCisJCQkJWE1MX1NDSEVNQV9UWVBFX0JBU0lDLCAidHlwZSBkZWZpbml0aW9uIik7CQkJICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiYXNlLT5jb250ZW50VHlwZSA9PSAKIAkJCSAgICBYTUxfU0NIRU1BX0NPTlRFTlRfVU5LTk9XTikgewogCQkJICAgIC8qIApAQCAtNzk3MiwxMSArMTAwNTksMTIgQEAKIAkJCSAgICAqIHNyYy1yZXN0cmljdGlvbi1iYXNlLW9yLXNpbXBsZVR5cGUKIAkJCSAgICAqIEVpdGhlciB0aGUgYmFzZSBbYXR0cmlidXRlXSBvciB0aGUgc2ltcGxlVHlwZSBbY2hpbGRdIG9mIHRoZSAKIAkJCSAgICAqIDxyZXN0cmljdGlvbj4gZWxlbWVudCBtdXN0IGJlIHByZXNlbnQsIGJ1dCBub3QgYm90aC4gCisJCQkgICAgKiBUT0RPOiBNb3ZlIHRoaXMgdG8gdGhlIHBhcnNlIGZ1bmN0aW9uLgogCQkJICAgICovCiAJCQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlRGVjbC0+bm9kZSwKIAkJCQlYTUxfU0NIRU1BUF9TUkNfUkVTVFJJQ1RJT05fQkFTRV9PUl9TSU1QTEVUWVBFLAkJCi0JCQkJIlJlc3RyaWN0aW9uIFwiJXNcIjogIgotCQkJCSJFaXRoZXIgdGhlIFwiYmFzZVwiIGF0dHJpYnV0ZSBvciB0aGUgPHNpbXBsZVR5cGU+IGNoaWxkICIKKwkJCQkiPHJlc3RyaWN0aW9uPjogIgorCQkJCSJFaXRoZXIgdGhlICdiYXNlJyBhdHRyaWJ1dGUgb3IgdGhlIDxzaW1wbGVUeXBlPiBjaGlsZCAiCiAJCQkJIm11c3QgYmUgcHJlc2VudCwgYnV0IG5vdCBib3RoLlxuIiwKIAkJCQl0eXBlRGVjbC0+bmFtZSwgTlVMTCk7CiAJCQl9CkBAIC03OTk0LDEwICsxMDA4MiwxMCBAQAogCQkJWE1MX1NDSEVNQVNfVFlQRV9ERVJJVkFUSU9OX01FVEhPRF9FWFRFTlNJT047CiAJCSAgICBpZiAodHlwZURlY2wtPnJlY3Vyc2UpIHsKIAkJCS8qIFRPRE86IFRoZSB3b3JkICJyZWN1cnNpdmUiIHNob3VsZCBiZSBjaGFuZ2VkIHRvICJjaXJjdWxhciIgaGVyZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZURlY2wtPm5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TQ0hFTUFQX1VOS05PV05fQkFTRV9UWVBFLAotCQkJCSAgIlNjaGVtYXM6IGV4dGVuc2lvbiB0eXBlICVzIGlzIHJlY3Vyc2l2ZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgTlVMTCk7CisJCQl4bWxTY2hlbWFQQ3VzdG9tRXJyKGN0eHQsCisJCQkgICAgWE1MX1NDSEVNQVBfVU5LTk9XTl9CQVNFX1RZUEUsCisJCQkgICAgTlVMTCwgdHlwZURlY2wsIHR5cGVEZWNsLT5ub2RlLAkKKwkJCSAgICAiVGhpcyBpdGVtIGlzIGNpcmN1bGFyIiwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAJCSAgICB9CiAJCSAgICBpZiAodHlwZURlY2wtPmJhc2UgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtODAwNSwxMiArMTAwOTMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFHZXRUeXBlKGN0eHQtPnNjaGVtYSwgdHlwZURlY2wtPmJhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlRGVjbC0+YmFzZU5zKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlID09IE5VTEwpIHsKLQkJCSAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGVEZWNsLT5ub2RlLAotCQkJCVhNTF9TQ0hFTUFQX1NSQ19SRVNPTFZFLAotCQkJCSJFeHRlbnNpb24gXCIlc1wiOiB0aGUgUU5hbWUgXCIlc1wiIG9mIHRoZSAiCi0JCQkJImF0dHJpYnV0ZSBcImJhc2VcIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgc2NoZW1hICIKLQkJCQkiY29tcG9uZW50LlxuIiwKLQkJCQluYW1lLCB0eXBlRGVjbC0+YmFzZSk7CisJCQkgICAgeG1sU2NoZW1hUFJlc0NvbXBBdHRyRXJyKGN0eHQsIAorCQkJCVhNTF9TQ0hFTUFQX1NSQ19SRVNPTFZFLCAKKwkJCQlOVUxMLCB0eXBlRGVjbCwgdHlwZURlY2wtPm5vZGUsCisJCQkJImJhc2UiLCB0eXBlRGVjbC0+YmFzZSwgdHlwZURlY2wtPmJhc2VOcywKKwkJCQlYTUxfU0NIRU1BX1RZUEVfQkFTSUMsICJ0eXBlIGRlZmluaXRpb24iKTsJCQkJICAgCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJhc2UtPmNvbnRlbnRUeXBlID09IAogCQkJICAgIFhNTF9TQ0hFTUFfQ09OVEVOVF9VTktOT1dOKSB7CiAJCQkgICAgdHlwZURlY2wtPnJlY3Vyc2UgPSAxOwpAQCAtODQwNSw3ICsxMDQ5Miw3IEBACiAJCQl4bWxTY2hlbWFQRXJyKGN0eHQsIHR5cGVEZWNsLT5ub2RlLAogCQkJICAgIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKIAkJCSAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYUNoZWNrRmFjZXQsICIKLQkJCSAgICAidGhlIHR5cGUgXCIlc1wiIGhhcyBubyBiYXNlIHR5cGUuXG4iLAorCQkJICAgICJ0aGUgdHlwZSAnJXMnIGhhcyBubyBiYXNlIHR5cGUuXG4iLAogCQkJICAgIHR5cGVEZWNsLT5uYW1lLCBOVUxMKTsKIAkJCXJldHVybiAoLTEpOwogCQkgICAgfQkJCkBAIC04NDIzLDggKzEwNTEwLDggQEAKIAkJCXR5cGVEZWNsLT5uYW1lLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CQogCQl9Ci0JCXZjdHh0LT50eXBlID0gYmFzZTsKLQkJcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVUeXBlVmFsdWUodmN0eHQsIGZhY2V0LT52YWx1ZSwgMCwgMSk7CisJCXZjdHh0LT50eXBlID0gYmFzZTsJCQorCQlyZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZSh2Y3R4dCwgZmFjZXQtPnZhbHVlLCAwLCAxLCAxKTsKIAkJZmFjZXQtPnZhbCA9IHZjdHh0LT52YWx1ZTsKIAkJdmN0eHQtPnZhbHVlID0gTlVMTDsJCQogICAgICAgICAgICAgICAgIGlmIChyZXQgPiAwKSB7CkBAIC04NDMzLDggKzEwNTIwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVBFcnJFeHQoY3R4dCwgZmFjZXQtPm5vZGUsCiAJCQkgICAgWE1MX1NDSEVNQVBfSU5WQUxJRF9GQUNFVCwgCiAJCQkgICAgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCSAgICAiVHlwZSBcIiVzXCI6IHRoZSB2YWx1ZSBcIiVzXCIgb2YgdGhlICIKLQkJCSAgICAiZmFjZXQgXCIlc1wiIGlzIGludmFsaWQuXG4iLAorCQkJICAgICJUeXBlIGRlZmluaXRpb24gJyVzJzogVGhlIHZhbHVlICclcycgb2YgdGhlICIKKwkJCSAgICAiZmFjZXQgJyVzJyBpcyBub3QgdmFsaWQuXG4iLAogCQkJICAgIG5hbWUsIGZhY2V0LT52YWx1ZSwgCiAJCQkgICAgQkFEX0NBU1QgeG1sU2NoZW1hRmFjZXRUeXBlVG9TdHJpbmcoZmFjZXQtPnR5cGUpLCAKIAkJCSAgICBOVUxMLCBOVUxMKTsKQEAgLTg0NDUsOCArMTA1MzIsOCBAQAogCQkJWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAogCQkJTlVMTCwgTlVMTCwgTlVMTCwKIAkJCSJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hQ2hlY2tGYWNldCwgIgotCQkJImZhaWxlZCB0byB2YWxpZGF0ZSB0aGUgdmFsdWUgXCIlc1wiIG5hbWUgb2YgdGhlICIKLQkJCSJmYWNldCBcIiVzXCIgYWdhaW5zdCB0aGUgYmFzZSB0eXBlIFwiJXNcIi5cbiIsCisJCQkiZmFpbGVkIHRvIHZhbGlkYXRlIHRoZSB2YWx1ZSAnJXMnIG5hbWUgb2YgdGhlICIKKwkJCSJmYWNldCAnJXMnIGFnYWluc3QgdGhlIGJhc2UgdHlwZSAnJXMnLlxuIiwKIAkJCWZhY2V0LT52YWx1ZSwgCiAJCQlCQURfQ0FTVCB4bWxTY2hlbWFGYWNldFR5cGVUb1N0cmluZyhmYWNldC0+dHlwZSksCiAJCQliYXNlLT5uYW1lLCBOVUxMLCBOVUxMKTsgCkBAIC04NDU1LDYxICsxMDU0MiwxMyBAQAogCQl4bWxTY2hlbWFGcmVlVmFsaWRDdHh0KHZjdHh0KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLQkvKgotCSogUmVtb3ZlZCwgc2luY2UgYWRkZWQgdG8gdGhlIGNhc2UgYWJvdmUuCi0JKgotICAgICAgICBjYXNlIFhNTF9TQ0hFTUFfRkFDRVRfRU5VTUVSQVRJT046ewotICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKiBPa2F5IHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgICogYXQgdGhhdCBwb2ludC4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciB2Y3R4dDsKLSAgICAgICAgICAgICAgICBpbnQgdG1wOwotCQl4bWxTY2hlbWFUeXBlUHRyIGJhc2U7Ci0KLQkJKiA0LjMuNS41IENvbnN0cmFpbnRzIG9uIGVudW1lcmF0aW9uIFNjaGVtYSBDb21wb25lbnRzCi0JCSogU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBlbnVtZXJhdGlvbiB2YWxpZCByZXN0cmljdGlvbgotCQkqIEl0IGlzIGFuILdlcnJvcrcgaWYgYW55IG1lbWJlciBvZiB7dmFsdWV9IGlzIG5vdCBpbiB0aGUgCi0JCSogt3ZhbHVlIHNwYWNltyBvZiB7YmFzZSB0eXBlIGRlZmluaXRpb259LiAKLQkJKgotICAgICAgICAgICAgICAgIHZjdHh0ID0geG1sU2NoZW1hTmV3VmFsaWRDdHh0KE5VTEwpOwotICAgICAgICAgICAgICAgIGlmICh2Y3R4dCA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJYmFzZSA9IHR5cGVEZWNsLT5iYXNlVHlwZTsKLQkJaWYgKGJhc2UgPT0gTlVMTCkgewotCQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCB0eXBlRGVjbC0+bm9kZSwKLQkJCVhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKLQkJCSJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hQ2hlY2tGYWNldCwgIgotCQkJInRoZSB0eXBlIFwiJXNcIiBoYXMgbm8gYmFzZSB0eXBlLlxuIiwKLQkJCXR5cGVEZWNsLT5uYW1lLCBOVUxMKTsKLQkJICAgIHJldHVybiAoLTEpOwotCQl9Ci0JCXZjdHh0LT50eXBlID0gYmFzZTsKLQkJdG1wID0geG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVUeXBlVmFsdWUodmN0eHQsIGZhY2V0LT52YWx1ZSwgMCwgMSk7Ci0gICAgICAgICAgICAgICAgKiB0bXAgPSB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVZhbHVlKHZjdHh0LCB0eXBlRGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0LT52YWx1ZSk7Ci0JCSoKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN0eHQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBmYWNldC0+bm9kZSwKLQkJCSAgICBYTUxfU0NIRU1BUF9JTlZBTElEX0VOVU0sCi0JCQkgICAgIlR5cGUgXCIlc1wiOiB0aGUgdmFsdWUgXCIlc1wiIG9mIHRoZSAiCi0JCQkgICAgImZhY2V0IFwiZW51bWVyYXRpb25cIiBpcyBpbnZhbGlkLlxuIiwKLQkJCSAgICBuYW1lLCBmYWNldC0+dmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFGcmVlVmFsaWRDdHh0KHZjdHh0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQkqLwogICAgICAgICBjYXNlIFhNTF9TQ0hFTUFfRkFDRVRfUEFUVEVSTjoKICAgICAgICAgICAgIGZhY2V0LT5yZWdleHAgPSB4bWxSZWdleHBDb21waWxlKGZhY2V0LT52YWx1ZSk7CiAgICAgICAgICAgICBpZiAoZmFjZXQtPnJlZ2V4cCA9PSBOVUxMKSB7CiAJCXhtbFNjaGVtYVBFcnIoY3R4dCwgdHlwZURlY2wtPm5vZGUsCiAJCSAgICBYTUxfU0NIRU1BUF9SRUdFWFBfSU5WQUxJRCwKLQkJICAgICJUeXBlIFwiJXNcIjogdGhlIHZhbHVlIFwiJXNcIiBvZiB0aGUgIgotCQkgICAgImZhY2V0IFwicGF0dGVyblwiIGlzIGludmFsaWQuXG4iLAorCQkgICAgIlR5cGUgZGVmaW5pdGlvbiAnJXMnOiBUaGUgdmFsdWUgJyVzJyBvZiB0aGUgIgorCQkgICAgImZhY2V0ICdwYXR0ZXJuJyBpcyBub3QgdmFsaWQuXG4iLAogCQkgICAgbmFtZSwgZmFjZXQtPnZhbHVlKTsKICAgICAgICAgICAgICAgICByZXQgPSAtMTsKICAgICAgICAgICAgIH0KQEAgLTg1MzEsOCArMTA1NzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hUEVyckV4dChjdHh0LCBmYWNldC0+bm9kZSwKIAkJCSAgICBYTUxfU0NIRU1BUF9JTlZBTElEX0ZBQ0VUX1ZBTFVFLAogCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkgICAgIlR5cGUgXCIlc1wiOiB0aGUgdmFsdWUgXCIlc1wiIG9mIHRoZSAiCi0JCQkgICAgImZhY2V0IFwiJXNcIiBpcyBpbnZhbGlkLlxuIiwKKwkJCSAgICAiVHlwZSBkZWZpbml0aW9uICclcyc6IFRoZSB2YWx1ZSAnJXMnIG9mIHRoZSAiCisJCQkgICAgImZhY2V0ICclcycgaXMgbm90IHZhbGlkLlxuIiwKIAkJCSAgICBuYW1lLCBmYWNldC0+dmFsdWUsIAogCQkJICAgIEJBRF9DQVNUIHhtbFNjaGVtYUZhY2V0VHlwZVRvU3RyaW5nKGZhY2V0LT50eXBlKSwKIAkJCSAgICBOVUxMLCBOVUxMKTsKQEAgLTg1NTIsOCArMTA1OTEsOCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoY3R4dCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIGZhY2V0LT5ub2RlLAogCQkJICAgIFhNTF9TQ0hFTUFQX0lOVkFMSURfV0hJVEVfU1BBQ0UsCi0JCQkgICAgIlR5cGUgXCIlc1wiOiB0aGUgdmFsdWUgXCIlc1wiIG9mIHRoZSAiCi0JCQkgICAgImZhY2V0IFwid2hpdGVTcGFjZVwiIGlzIGludmFsaWQuXG4iLAorCQkJICAgICJUeXBlIGRlZmluaXRpb24gJyVzJzogVGhlIHZhbHVlICclcycgb2YgdGhlICIKKwkJCSAgICAiZmFjZXQgJ3doaXRlU3BhY2UnIGlzIG5vdCB2YWxpZC5cbiIsCiAJCQkgICAgbmFtZSwgZmFjZXQtPnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKQEAgLTg2MTEsMzEgKzEwNjUwLDIwIEBACiAgICAgaWYgKGF0dHJncnAtPnJlZiAhPSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwUHRyIHJlZjsKIAotICAgICAgICByZWYgPSB4bWxTY2hlbWFHZXRBdHRyaWJ1dGVHcm91cChjdHh0LT5zY2hlbWEsIGF0dHJncnAtPnJlZiwgYXR0cmdycC0+cmVmTnMpOworICAgICAgICByZWYgPSB4bWxTY2hlbWFHZXRBdHRyaWJ1dGVHcm91cChjdHh0LT5zY2hlbWEsIGF0dHJncnAtPnJlZiwgCisJICAgIGF0dHJncnAtPnJlZk5zKTsKICAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB4bWxTY2hlbWFQRXJyKGN0eHQsIGF0dHJncnAtPm5vZGUsCisJICAgIHhtbFNjaGVtYVBSZXNDb21wQXR0ckVycihjdHh0LCAKIAkJWE1MX1NDSEVNQVBfU1JDX1JFU09MVkUsCi0JCSJBdHRyaWJ1dGUgZ3JvdXAgXCIlc1wiOiB0aGUgUU5hbWUgXCIlc1wiIG9mIHRoZSBhdHRyaWJ1dGUgIgotCQkiXCJyZWZcIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgc2NoZW1hICIKLQkJImNvbXBvbmVudC5cbiIsCi0JCW5hbWUsIGF0dHJncnAtPnJlZik7CisJCU5VTEwsICh4bWxTY2hlbWFUeXBlUHRyKSBhdHRyZ3JwLCBhdHRyZ3JwLT5ub2RlLAorCQkicmVmIiwgYXR0cmdycC0+cmVmLCBhdHRyZ3JwLT5yZWZOcywgCisJCVhNTF9TQ0hFTUFfVFlQRV9BVFRSSUJVVEVHUk9VUCwgTlVMTCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgeG1sU2NoZW1hQXR0ckdycEZpeHVwKHJlZiwgY3R4dCwgTlVMTCk7CiAgICAgICAgIGF0dHJncnAtPmF0dHJpYnV0ZXMgPSByZWYtPmF0dHJpYnV0ZXM7CiAJYXR0cmdycC0+YXR0cmlidXRlV2lsZGNhcmQgPSByZWYtPmF0dHJpYnV0ZVdpbGRjYXJkOwogICAgIH0KLSAgICAvKiAKLSAgICAqIFJlbW92ZWQsIHNpbmNlIGEgZ2xvYmFsIGF0dHJpYnV0ZSBncm91cCBkb2VzIG5vdCBuZWVkIHRvIGhvbGQgYW55Ci0gICAgKiBhdHRyaWJ1dGVzIG9yIHdpbGRjYXJkIAotICAgICovCi0gICAgLyoKLSAgICBlbHNlIHsKLSAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBhdHRyZ3JwLT5ub2RlLCBYTUxfU0NIRU1BUF9OT0FUVFJfTk9SRUYsCi0gICAgICAgICAgICAgICAgICAgICAgIlNjaGVtYXM6IGF0dHJpYnV0ZSBncm91cCAlcyBoYXMgbm8gYXR0cmlidXRlcyBub3IgcmVmZXJlbmNlXG4iLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIE5VTEwpOwotICAgIH0KLSAgICAqLwogfQogCiAvKioKQEAgLTg2NTAsMTIgKzEwNjc4LDE4IEBACiB4bWxTY2hlbWFBdHRyRml4dXAoeG1sU2NoZW1hQXR0cmlidXRlUHRyIGF0dHJEZWNsLAogICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dCwgY29uc3QgeG1sQ2hhciAqIG5hbWUpCiB7CisgICAgLyogCisgICAgKiBUT0RPOiBJZiBpbmNsdWRpbmcgdGhpcyBpcyBkb25lIHR3aWNlICghKSBmb3IgZXZlcnkgYXR0cmlidXRlLgorICAgICovCiAgICAgLyoKICAgICAqIFRoZSBzaW1wbGUgdHlwZSBkZWZpbml0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDxzaW1wbGVUeXBlPiBlbGVtZW50IAogICAgICogaW5mb3JtYXRpb24gaXRlbSBpbiB0aGUgW2NoaWxkcmVuXSwgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHRoZSBzaW1wbGUgCiAgICAgKiB0eXBlIGRlZmluaXRpb24gt3Jlc29sdmVktyB0byBieSB0aGUgt2FjdHVhbCB2YWx1Zbcgb2YgdGhlIHR5cGUgCiAgICAgKiBbYXR0cmlidXRlXSwgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHRoZSC3c2ltcGxlIHVyLXR5cGUgZGVmaW5pdGlvbrcuCiAgICAgKi8KKyAgICBpZiAoYXR0ckRlY2wtPmZsYWdzICYgWE1MX1NDSEVNQVNfQVRUUl9JTlRFUk5BTF9SRVNPTFZFRCkKKwlyZXR1cm47CisgICAgYXR0ckRlY2wtPmZsYWdzIHw9IFhNTF9TQ0hFTUFTX0FUVFJfSU5URVJOQUxfUkVTT0xWRUQ7CiAgICAgaWYgKG5hbWUgPT0gTlVMTCkKICAgICAgICAgbmFtZSA9IGF0dHJEZWNsLT5uYW1lOwogICAgIGlmIChhdHRyRGVjbC0+c3VidHlwZXMgIT0gTlVMTCkKQEAgLTg2NjYsMjUgKzEwNzAwLDI4IEBACiAJdHlwZSA9IHhtbFNjaGVtYUdldFR5cGUoY3R4dC0+c2NoZW1hLCBhdHRyRGVjbC0+dHlwZU5hbWUsCiAJICAgIGF0dHJEZWNsLT50eXBlTnMpOwogCWlmICh0eXBlID09IE5VTEwpIHsKLQkgICAgeG1sU2NoZW1hUEVycihjdHh0LCBhdHRyRGVjbC0+bm9kZSwgCisJICAgIHhtbFNjaGVtYVBSZXNDb21wQXR0ckVycihjdHh0LAogCQlYTUxfU0NIRU1BUF9TUkNfUkVTT0xWRSwKLQkJIkF0dHJpYnV0ZSBcIiVzXCI6IHRoZSBRTmFtZSBcIiVzXCIgb2YgdGhlIGF0dHJpYnV0ZSAiCi0JCSJcInR5cGVcIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgc2NoZW1hICIKLQkJImNvbXBvbmVudC5cbiIsCi0JCW5hbWUsIGF0dHJEZWNsLT50eXBlTmFtZSk7CisJCU5VTEwsICh4bWxTY2hlbWFUeXBlUHRyKSBhdHRyRGVjbCwgYXR0ckRlY2wtPm5vZGUsCisJCSJ0eXBlIiwgYXR0ckRlY2wtPnR5cGVOYW1lLCBhdHRyRGVjbC0+dHlwZU5zLCAKKwkJWE1MX1NDSEVNQV9UWVBFX0JBU0lDLCAidHlwZSBkZWZpbml0aW9uIik7CiAJfQogICAgICAgICBhdHRyRGVjbC0+c3VidHlwZXMgPSB0eXBlOwogICAgIH0gZWxzZSBpZiAoYXR0ckRlY2wtPnJlZiAhPSBOVUxMKSB7CiAgICAgICAgIHhtbFNjaGVtYUF0dHJpYnV0ZVB0ciByZWY7CiAKKwkvKgorCSogVE9ETzogRXZhbHVhdGUsIHdoYXQgZXJyb3JzIGNvdWxkIG9jY3VyIGlmIHRoZSBkZWNsYXJhdGlvbiBpcyBub3QKKwkqIGZvdW5kLiBJdCBtaWdodCBiZSBwb3NzaWJsZSB0aGF0IHRoZSAidHlwZWZpeHVwIiBtaWdodCBjcmFzaCBpZgorCSogbm8gcmVmIGRlY2xhcmF0aW9uIHdhcyBmb3VuZC4KKwkqLwogCXJlZiA9IHhtbFNjaGVtYUdldEF0dHJpYnV0ZShjdHh0LT5zY2hlbWEsIGF0dHJEZWNsLT5yZWYsIGF0dHJEZWNsLT5yZWZOcyk7CiAgICAgICAgIGlmIChyZWYgPT0gTlVMTCkgewotICAgICAgICAgICAgeG1sU2NoZW1hUEVycihjdHh0LCBhdHRyRGVjbC0+bm9kZSwgCi0JCVhNTF9TQ0hFTUFQX1NSQ19SRVNPTFZFLAotCQkiQXR0cmlidXRlIFwiJXNcIjogdGhlIFFOYW1lIFwiJXNcIiBvZiB0aGUgYXR0cmlidXRlICIKLQkJIlwicmVmXCIgZG9lcyBub3QgcmVzb2x2ZSB0byBhIHNjaGVtYSAiCi0JCSJjb21wb25lbnQuXG4iLAkJCi0JCW5hbWUsIGF0dHJEZWNsLT5yZWYpOworCSAgICB4bWxTY2hlbWFQUmVzQ29tcEF0dHJFcnIoY3R4dCwKKwkgICAgCVhNTF9TQ0hFTUFQX1NSQ19SRVNPTFZFLAorCQlOVUxMLCAoeG1sU2NoZW1hVHlwZVB0cikgYXR0ckRlY2wsIGF0dHJEZWNsLT5ub2RlLAorCQkicmVmIiwgYXR0ckRlY2wtPnJlZiwgYXR0ckRlY2wtPnJlZk5zLCAKKwkJWE1MX1NDSEVNQV9UWVBFX0FUVFJJQlVURSwgTlVMTCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgeG1sU2NoZW1hQXR0ckZpeHVwKHJlZiwgY3R4dCwgTlVMTCk7CkBAIC04NzMzLDcgKzEwNzcwLDcgQEAKICAgICAgICAgaWYgKGRvYyA9PSBOVUxMKSB7CiAJICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgTlVMTCwKIAkJCSAgWE1MX1NDSEVNQVBfRkFJTEVEX0xPQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWxTY2hlbWFQYXJzZTogY291bGQgbm90IGxvYWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWxTY2hlbWFQYXJzZTogY291bGQgbm90IGxvYWQgJyVzJy5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPlVSTCwgTlVMTCk7CiAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgICB9CkBAIC04NzQzLDcgKzEwNzgwLDcgQEAKICAgICAgICAgaWYgKGRvYyA9PSBOVUxMKSB7CiAJICAgIHhtbFNjaGVtYVBFcnIoY3R4dCwgTlVMTCwKIAkJCSAgWE1MX1NDSEVNQVBfRkFJTEVEX1BBUlNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAieG1sU2NoZW1hUGFyc2U6IGNvdWxkIG5vdCBwYXJzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInhtbFNjaGVtYVBhcnNlOiBjb3VsZCBub3QgcGFyc2UuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CiAgICAgICAgIH0KQEAgLTg3NTUsNyArMTA3OTIsNyBAQAogICAgIH0gZWxzZSB7CiAJeG1sU2NoZW1hUEVycihjdHh0LCBOVUxMLAogCQkgICAgICBYTUxfU0NIRU1BUF9OT1RISU5HX1RPX1BBUlNFLAotCQkgICAgICAieG1sU2NoZW1hUGFyc2U6IGNvdWxkIG5vdCBwYXJzZVxuIiwKKwkJICAgICAgInhtbFNjaGVtYVBhcnNlOiBjb3VsZCBub3QgcGFyc2UuXG4iLAogCQkgICAgICBOVUxMLCBOVUxMKTsKICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICB9CkBAIC04NzY3LDcgKzEwODA0LDcgQEAKICAgICBpZiAocm9vdCA9PSBOVUxMKSB7CiAJeG1sU2NoZW1hUEVycihjdHh0LCAoeG1sTm9kZVB0cikgZG9jLAogCQkgICAgICBYTUxfU0NIRU1BUF9OT1JPT1QsCi0JCSAgICAgICJzY2hlbWFzIGhhcyBubyByb290IiwgTlVMTCwgTlVMTCk7CisJCSAgICAgICJUaGUgc2NoZW1hIGhhcyBubyBkb2N1bWVudCBlbGVtZW50LlxuIiwgTlVMTCwgTlVMTCk7CiAJaWYgKCFwcmVzZXJ2ZSkgewogCSAgICB4bWxGcmVlRG9jKGRvYyk7CiAJfQpAQCAtODc5MSwxNCArMTA4MjgsOSBAQAogICAgIH0KICAgICByZXQtPmRvYyA9IGRvYzsKICAgICByZXQtPnByZXNlcnZlID0gcHJlc2VydmU7Ci0KLSAgICAvKgotICAgICAqIFRoZW4gZml4IGFsbCB0aGUgcmVmZXJlbmNlcy4KLSAgICAgKi8KICAgICBjdHh0LT5zY2hlbWEgPSByZXQ7Ci0gICAgeG1sSGFzaFNjYW5GdWxsKHJldC0+ZWxlbURlY2wsCi0gICAgICAgICAgICAgICAgICAgICh4bWxIYXNoU2Nhbm5lckZ1bGwpIHhtbFNjaGVtYVJlZkZpeHVwQ2FsbGJhY2ssIGN0eHQpOwotCisgICAgY3R4dC0+Y3R4dFR5cGUgPSBOVUxMOworICAgIGN0eHQtPnBhcmVudEl0ZW0gPSBOVUxMOwogICAgIC8qCiAgICAgICogVGhlbiBmaXh1cCBhbGwgYXR0cmlidXRlcyBkZWNsYXJhdGlvbnMKICAgICAgKi8KQEAgLTg4MTIsMTAgKzEwODQ0LDE0IEBACiAKICAgICAvKgogICAgICAqIFRoZW4gZml4dXAgYWxsIHR5cGVzIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBjdHh0LT5jdHh0VHlwZSA9IE5VTEw7Ci0gICAgY3R4dC0+cGFyZW50SXRlbSA9IE5VTEw7Ci0gICAgeG1sSGFzaFNjYW4ocmV0LT50eXBlRGVjbCwgKHhtbEhhc2hTY2FubmVyKSB4bWxTY2hlbWFUeXBlRml4dXAsIGN0eHQpOworICAgICAqLyAgICAKKyAgICB4bWxIYXNoU2NhbihyZXQtPnR5cGVEZWNsLCAoeG1sSGFzaFNjYW5uZXIpIHhtbFNjaGVtYVR5cGVGaXh1cCwgY3R4dCk7ICAgIAorCisgICAgLyoKKyAgICAgKiBUaGVuIGZpeCByZWZlcmVuY2VzIG9mIGVsZW1lbnQgZGVjbGFyYXRpb247IGFwcGx5IGNvbnN0cmFpbnRzLgorICAgICAqLyAgICAKKyAgICB4bWxIYXNoU2NhbkZ1bGwocmV0LT5lbGVtRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgKHhtbEhhc2hTY2FubmVyRnVsbCkgeG1sU2NoZW1hUmVmRml4dXBDYWxsYmFjaywgY3R4dCk7CiAKICAgICAvKgogICAgICAqIFRoZW4gYnVpbGQgdGhlIGNvbnRlbnQgbW9kZWwgZm9yIGFsbCBlbGVtZW50cwpAQCAtODgyOSw2ICsxMDg2NSw3IEBACiAgICAgeG1sSGFzaFNjYW4ocmV0LT50eXBlRGVjbCwgKHhtbEhhc2hTY2FubmVyKSB4bWxTY2hlbWFDaGVja0RlZmF1bHRzLAogICAgICAgICAgICAgICAgIGN0eHQpOwogCisKICAgICBpZiAoY3R4dC0+bmJlcnJvcnMgIT0gMCkgewogICAgICAgICB4bWxTY2hlbWFGcmVlKHJldCk7CiAgICAgICAgIHJldCA9IE5VTEw7CkBAIC04OTAwLDEwICsxMDkzNywxMDYgQEAKICAgICByZXR1cm4gKCJJbnRlcm5hbCBFcnJvciIpOwogfQogCitzdGF0aWMgeG1sQ2hhciAqCit4bWxTY2hlbWFXaGl0ZVNwYWNlUmVwbGFjZShjb25zdCB4bWxDaGFyICp2YWx1ZSkgeworICAgIGNvbnN0IHhtbENoYXIgKmN1ciA9IHZhbHVlOyAgICAKKyAgICB4bWxDaGFyICpyZXQgPSBOVUxMLCAqbWN1cjsgCisKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgCisJcmV0dXJuKE5VTEwpOworICAgIAorICAgIHdoaWxlICgoKmN1ciAhPSAwKSAmJiAKKwkoKCgqY3VyKSAhPSAweGQpICYmICgoKmN1cikgIT0gMHg5KSAmJiAoKCpjdXIpICE9IDB4YSkpKSB7CisJY3VyKys7CisgICAgfQorICAgIGlmICgqY3VyID09IDApCisJcmV0dXJuIChOVUxMKTsKKyAgICByZXQgPSB4bWxTdHJkdXAodmFsdWUpOworICAgIC8qIFRPRE8gRklYTUU6IEkgZ3Vlc3MgZ2NjIHdpbGwgYmFyayBhdCB0aGlzLiAqLworICAgIG1jdXIgPSAoeG1sQ2hhciAqKSAgKHJldCArIChjdXIgLSB2YWx1ZSkpOworICAgIGRvIHsKKwlpZiAoICgoKm1jdXIpID09IDB4ZCkgfHwgKCgqbWN1cikgPT0gMHg5KSB8fCAoKCptY3VyKSA9PSAweGEpICkKKwkgICAgKm1jdXIgPSAnICc7CisJbWN1cisrOworICAgIH0gd2hpbGUgKCptY3VyICE9IDApOwkgICAgCisgICAgcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBpbnQKK3htbFNjaGVtYUdldFdoaXRlU3BhY2VGYWNldFZhbHVlKHhtbFNjaGVtYVR5cGVQdHIgdHlwZSkKK3sKKyAgICB4bWxTY2hlbWFUeXBlUHRyIGFuYzsKKworICAgIC8qIAorICAgICogVGhlIG5vcm1hbGl6YXRpb24gdHlwZSBjYW4gYmUgY2hhbmdlZCBvbmx5IGZvciB0eXBlcyB3aGljaCBhcmUgZGVyaXZlZCAKKyAgICAqIGZyb20geHNkOnN0cmluZy4KKyAgICAqLworICAgIGlmICh0eXBlLT50eXBlID09IFhNTF9TQ0hFTUFfVFlQRV9CQVNJQykgeworCWlmICgodHlwZS0+YnVpbHRJblR5cGUgPT0gWE1MX1NDSEVNQVNfU1RSSU5HKSAmJgorICAgICAgICAgICAgKHR5cGUtPmJ1aWx0SW5UeXBlID09IFhNTF9TQ0hFTUFTX05PUk1TVFJJTkcpKQorCisJICAgIHJldHVybihYTUxfU0NIRU1BU19WQUxfV1RTUF9QUkVTRVJWRSk7CisJZWxzZSB7CisJICAgIC8qCisJICAgICogRm9yIGFsbCC3YXRvbWljtyBkYXRhdHlwZXMgb3RoZXIgdGhhbiBzdHJpbmcgKGFuZCB0eXBlcyC3ZGVyaXZlZLcgCisJICAgICogYnkgt3Jlc3RyaWN0aW9utyBmcm9tIGl0KSB0aGUgdmFsdWUgb2Ygd2hpdGVTcGFjZSBpcyBmaXhlZCB0byAKKwkgICAgKiBjb2xsYXBzZQorCSAgICAqLworCSAgICByZXR1cm4oWE1MX1NDSEVNQVNfVkFMX1dUU1BfQ09MTEFQU0UpOworCX0JCSAgIAkgICAgCisgICAgfSBlbHNlIGlmICh0eXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfVkFSSUVUWV9MSVNUKSB7CisJLyoKKwkqIEZvciBsaXN0IHR5cGVzIHRoZSBmYWNldCAid2hpdGVTcGFjZSIgaXMgZml4ZWQgdG8gImNvbGxhcHNlIi4gCisJKi8KKwlyZXR1cm4gKFhNTF9TQ0hFTUFTX1ZBTF9XVFNQX0NPTExBUFNFKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmZsYWdzICYgWE1MX1NDSEVNQVNfVFlQRV9WQVJJRVRZX1VOSU9OKSB7CisJcmV0dXJuICgtMSk7CisgICAgfSBlbHNlIGlmICh0eXBlLT5mYWNldFNldCAhPSBOVUxMKSB7CisJeG1sU2NoZW1hVHlwZVB0ciBhbnlTVDsKKwl4bWxTY2hlbWFGYWNldExpbmtQdHIgbGluOworCisJLyoKKwkqIEF0b21pYyB0eXBlcy4KKwkqLworCWFueVNUID0geG1sU2NoZW1hR2V0QnVpbHRJblR5cGUoWE1MX1NDSEVNQVNfQU5ZU0lNUExFVFlQRSk7CisJYW5jID0gdHlwZS0+YmFzZVR5cGU7CisJZG8geworCSAgICAvKgorCSAgICAqIEZvciBhbGwgt2F0b21pY7cgZGF0YXR5cGVzIG90aGVyIHRoYW4gc3RyaW5nIChhbmQgdHlwZXMgt2Rlcml2ZWS3IAorCSAgICAqIGJ5ILdyZXN0cmljdGlvbrcgZnJvbSBpdCkgdGhlIHZhbHVlIG9mIHdoaXRlU3BhY2UgaXMgZml4ZWQgdG8gCisJICAgICogY29sbGFwc2UKKwkgICAgKi8KKwkgICAgaWYgKChhbmMtPnR5cGUgPT0gWE1MX1NDSEVNQV9UWVBFX0JBU0lDKSAmJgorCQkoYW5jLT5idWlsdEluVHlwZSA9PSBYTUxfU0NIRU1BU19TVFJJTkcpKSB7CisJCQorCQlsaW4gPSB0eXBlLT5mYWNldFNldDsKKwkJZG8geworCQkgICAgaWYgKGxpbi0+ZmFjZXQtPnR5cGUgPT0gWE1MX1NDSEVNQV9GQUNFVF9XSElURVNQQUNFKSB7CisJCQlpZiAobGluLT5mYWNldC0+d2hpdGVzcGFjZSA9PSAKKwkJCSAgICBYTUxfU0NIRU1BU19GQUNFVF9DT0xMQVBTRSkgeworCQkJICAgIHJldHVybihYTUxfU0NIRU1BU19WQUxfV1RTUF9DT0xMQVBTRSk7ICAKKwkJCX0gZWxzZSBpZiAobGluLT5mYWNldC0+d2hpdGVzcGFjZSA9PSAKKwkJCSAgICBYTUxfU0NIRU1BU19GQUNFVF9SRVBMQUNFKSB7IAorCQkJICAgIHJldHVybihYTUxfU0NIRU1BU19WQUxfV1RTUF9SRVBMQUNFKTsKKwkJCX0gZWxzZQorCQkJICAgIHJldHVybihYTUxfU0NIRU1BU19WQUxfV1RTUF9QUkVTRVJWRSk7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGxpbiA9IGxpbi0+bmV4dDsKKwkJfSB3aGlsZSAobGluICE9IE5VTEwpOwkKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYW5jID0gYW5jLT5iYXNlVHlwZTsKKwl9IHdoaWxlIChhbmMgIT0gYW55U1QpOworCXJldHVybiAoWE1MX1NDSEVNQVNfVkFMX1dUU1BfQ09MTEFQU0UpOwkKKyAgICB9ICAKKyAgICByZXR1cm4gKC0xKTsKK30KKwogLyoqCiAgKiB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0c0ludGVybmFsOgogICogQGN0eHQ6ICBhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKLSAqIEBiYXNlOiAgdGhlIGJhc2UgdHlwZQorICogQHR5cGU6ICB0aGUgdHlwZSBob2xkaW5nIHRoZSBmYWNldHMKICAqIEBmYWNldHM6ICB0aGUgbGlzdCBvZiBmYWNldHMgdG8gY2hlY2sKICAqIEB2YWx1ZTogIHRoZSBsZXhpY2FsIHJlcHIgb2YgdGhlIHZhbHVlIHRvIHZhbGlkYXRlCiAgKiBAdmFsOiAgdGhlIHByZWNvbXB1dGVkIHZhbHVlCkBAIC04OTE3LDQ2ICsxMTA1MCwxNTIgQEAKICAqLwogc3RhdGljIGludAogeG1sU2NoZW1hVmFsaWRhdGVGYWNldHNJbnRlcm5hbCh4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVR5cGVQdHIgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUZhY2V0TGlua1B0ciBmYWNldHMsCi0JCQljb25zdCB4bWxDaGFyICogdmFsdWUsIGludCBmaXJlRXJyb3JzKQorCQkJCXhtbFNjaGVtYVR5cGVQdHIgdHlwZSwKKwkJCQljb25zdCB4bWxDaGFyICogdmFsdWUsCisJCQkJdW5zaWduZWQgbG9uZyBsZW5ndGgsCisJCQkJaW50IGZpcmVFcnJvcnMpCiB7CiAgICAgaW50IHJldCA9IDA7Ci0gICAgaW50IHRtcCA9IDA7Ci0gICAgeG1sU2NoZW1hVHlwZVR5cGUgdHlwZTsKLSAgICB4bWxTY2hlbWFGYWNldExpbmtQdHIgZmFjZXRMaW5rID0gZmFjZXRzOworICAgIHhtbFNjaGVtYVR5cGVQdHIgIGJpVHlwZTsgLyogVGhlIGJ1aWxkLWluIHR5cGUuICovCisgICAgeG1sU2NoZW1hVHlwZVB0ciB0bXBUeXBlOworICAgIHhtbFNjaGVtYUZhY2V0TGlua1B0ciBmYWNldExpbms7CisgICAgaW50IHJldEZhY2V0LCBoYXNGYWNldDsKKyAgICB4bWxTY2hlbWFGYWNldFB0ciBmYWNldDsKKyAgICB1bnNpZ25lZCBsb25nIGxlbiA9IDA7CiAKLSAgICB3aGlsZSAoZmFjZXRMaW5rICE9IE5VTEwpIHsKLSAgICAgICAgdHlwZSA9IGZhY2V0TGluay0+ZmFjZXQtPnR5cGU7Ci0gICAgICAgIGlmICh0eXBlID09IFhNTF9TQ0hFTUFfRkFDRVRfRU5VTUVSQVRJT04pIHsKLSAgICAgICAgICAgIHRtcCA9IDE7Ci0KLSAgICAgICAgICAgIHdoaWxlIChmYWNldExpbmsgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHRtcCA9Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVZhbGlkYXRlRmFjZXQoYmFzZSwgZmFjZXRMaW5rLT5mYWNldCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC0+dmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmFjZXRMaW5rID0gZmFjZXRMaW5rLT5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHRtcCA9IHhtbFNjaGVtYVZhbGlkYXRlRmFjZXQoYmFzZSwgZmFjZXRMaW5rLT5mYWNldCwgdmFsdWUsIAotCSAgICBjdHh0LT52YWx1ZSk7Ci0KLSAgICAgICAgaWYgKHRtcCAhPSAwKSB7Ci0gICAgICAgICAgICByZXQgPSB0bXA7Ci0gICAgICAgICAgICBpZiAoZmlyZUVycm9ycykgewkJCi0JCXhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCB0bXAsCQkgICAgCi0JCSAgICAiVGhlIHZhbHVlIGZhaWxlZCB0byB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBmYWNldCBcIiVzXCIuXG4iLAotCQkgICAgKGNvbnN0IHhtbENoYXIgKikgeG1sU2NoZW1hRmFjZXRUeXBlVG9TdHJpbmcodHlwZSksIAotCQkgICAgTlVMTCk7CQkKLQorI2lmZGVmIERFQlVHX1VOSU9OX1ZBTElEQVRJT04KKyAgICBwcmludGYoIkZhY2V0cyBvZiB0eXBlOiAnJXMnXG4iLCAoY29uc3QgY2hhciAqKSB0eXBlLT5uYW1lKTsKKyAgICBwcmludGYoIiAgZmlyZUVycm9yczogJWRcbiIsIGZpcmVFcnJvcnMpOworI2VuZGlmCisgICAgICAgIAorICAgIC8qCisgICAgKiBOT1RFOiBEbyBub3QganVtcCBhd2F5LCBpZiB0aGUgZmFjZXRTZXQgb2YgdGhlIGdpdmVuIHR5cGUgaXMKKyAgICAqIGVtcHR5OiB1bnRpbCBub3csICJwYXR0ZXJuIiBmYWNldHMgb2YgdGhlICpiYXNlIHR5cGVzKiBuZWVkIHRvCisgICAgKiBiZSBjaGVja2VkIGFzIHdlbGwuCisgICAgKi8KKyAgICBiaVR5cGUgPSB0eXBlLT5iYXNlVHlwZTsKKyAgICB3aGlsZSAoKGJpVHlwZSAhPSBOVUxMKSAmJiAoYmlUeXBlLT50eXBlICE9IFhNTF9TQ0hFTUFfVFlQRV9CQVNJQykpCisJYmlUeXBlID0gYmlUeXBlLT5iYXNlVHlwZTsKKyAgICBpZiAoYmlUeXBlID09IE5VTEwpIHsKKwl4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAkJICAgIAorCSAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlRmFjZXRzSW50ZXJuYWwsICIKKwkgICAgInRoZSBiYXNlIHR5cGUgYXhpcyBvZiB0aGUgZ2l2ZW4gdHlwZSAnJXMnIGRvZXMgbm90IHJlc29sdmUgdG8gIgorCSAgICAiYSBidWlsdC1pbiB0eXBlLlxuIiwKKwkgICAgdHlwZS0+bmFtZSwgTlVMTCk7CQorCXJldHVybiAoLTEpOworICAgIH0gICAgCisgICAgCisgICAgaWYgKHR5cGUtPmZhY2V0U2V0ICE9IE5VTEwpIHsKKwlmYWNldExpbmsgPSB0eXBlLT5mYWNldFNldDsKKwl3aGlsZSAoZmFjZXRMaW5rICE9IE5VTEwpIHsKKwkgICAgZmFjZXQgPSBmYWNldExpbmstPmZhY2V0OworCSAgICAvKgorCSAgICAqIFNraXAgdGhlIHBhdHRlcm4gIndoaXRlU3BhY2UiOiBpdCBpcyB1c2VkIHRvIAorCSAgICAqIGZvcm1hdCB0aGUgY2hhcmFjdGVyIGNvbnRlbnQgYmVmb3JlaGFuZC4KKwkgICAgKi8JICAgIAorCSAgICBzd2l0Y2ggKGZhY2V0LT50eXBlKSB7CisJCWNhc2UgWE1MX1NDSEVNQV9GQUNFVF9XSElURVNQQUNFOgorCQljYXNlIFhNTF9TQ0hFTUFfRkFDRVRfUEFUVEVSTjoKKwkJY2FzZSBYTUxfU0NIRU1BX0ZBQ0VUX0VOVU1FUkFUSU9OOgorCQkgICAgYnJlYWs7CisJCWNhc2UgWE1MX1NDSEVNQV9GQUNFVF9MRU5HVEg6CisJCWNhc2UgWE1MX1NDSEVNQV9GQUNFVF9NSU5MRU5HVEg6CisJCWNhc2UgWE1MX1NDSEVNQV9GQUNFVF9NQVhMRU5HVEg6IAorCQkgICAgaWYgKHR5cGUtPmZsYWdzICYgWE1MX1NDSEVNQVNfVFlQRV9WQVJJRVRZX0xJU1QpIHsKKwkJCXJldCA9IHhtbFNjaGVtYVZhbGlkYXRlTGlzdFNpbXBsZVR5cGVGYWNldChmYWNldCwKKwkJCSAgICB2YWx1ZSwgbGVuZ3RoLCAwKTsKKwkJCWxlbiA9IGxlbmd0aDsKKwkJICAgIH0gZWxzZQorCQkJcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVMZW5ndGhGYWNldChiaVR5cGUsIGZhY2V0LAorCQkJICAgIHZhbHVlLCBjdHh0LT52YWx1ZSwgJmxlbik7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIHJldCA9IHhtbFNjaGVtYVZhbGlkYXRlRmFjZXQoYmlUeXBlLCBmYWNldCwgdmFsdWUsIAorCQkJY3R4dC0+dmFsdWUpOwogCSAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhY2V0TGluayAhPSBOVUxMKQotICAgICAgICAgICAgZmFjZXRMaW5rID0gZmFjZXRMaW5rLT5uZXh0OworCSAgICBpZiAocmV0IDwgMCkgeworCQl4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAorCQkgICAgIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0c0ludGVybmFsLCAiCisJCSAgICAidmFsaWRhdGluZyBmYWNldCBvZiB0eXBlICclcycuXG4iLAorCQkgICAgdHlwZS0+bmFtZSwgTlVMTCk7CisJCWJyZWFrOworCSAgICB9IGVsc2UgaWYgKChyZXQgPiAwKSAmJiAoZmlyZUVycm9ycykpIHsKKwkJeG1sU2NoZW1hVkZhY2V0RXJyKGN0eHQsIHJldCwgY3R4dC0+Y3VyLCB2YWx1ZSwgbGVuLAorCQkgICAgdHlwZSwgZmFjZXQsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCSAgICB9CisKKwkgICAgZmFjZXRMaW5rID0gZmFjZXRMaW5rLT5uZXh0OworCX0KKwlpZiAocmV0ID49IDApIHsKKwkgICAgLyoKKwkgICAgKiBQcm9jZXNzIGVudW1lcmF0aW9ucy4KKwkgICAgKi8KKwkgICAgcmV0RmFjZXQgPSAwOworCSAgICBmYWNldExpbmsgPSB0eXBlLT5mYWNldFNldDsKKwkgICAgd2hpbGUgKGZhY2V0TGluayAhPSBOVUxMKSB7CisJCWlmIChmYWNldExpbmstPmZhY2V0LT50eXBlID09IFhNTF9TQ0hFTUFfRkFDRVRfRU5VTUVSQVRJT04pIHsKKwkJICAgIHJldEZhY2V0ID0geG1sU2NoZW1hVmFsaWRhdGVGYWNldChiaVR5cGUsIGZhY2V0TGluay0+ZmFjZXQsIAorCQkJdmFsdWUsIGN0eHQtPnZhbHVlKTsJCQorCQkgICAgaWYgKHJldEZhY2V0IDw9IDApCisJCQlicmVhazsKKwkJfQorCQlmYWNldExpbmsgPSBmYWNldExpbmstPm5leHQ7CisJICAgIH0KKwkgICAgaWYgKHJldEZhY2V0ID4gMCkgeworCQlyZXQgPSBYTUxfU0NIRU1BVl9DVkNfRU5VTUVSQVRJT05fVkFMSUQ7CisJCWlmIChmaXJlRXJyb3JzKQorCQkgICAgeG1sU2NoZW1hVkZhY2V0RXJyKGN0eHQsIHJldCwgY3R4dC0+Y3VyLAorCQkJdmFsdWUsIDAsIHR5cGUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCSAgICB9IGVsc2UgaWYgKHJldEZhY2V0IDwgMCkgeworCQl4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAorCQkgICAgIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0c0ludGVybmFsLCAiCisJCSAgICAidmFsaWRhdGluZyBmYWNldCBvZiB0eXBlICclcycuXG4iLAorCQkgICAgQkFEX0NBU1QgImVudW1lcmF0aW9uIiwgTlVMTCk7CisJCSAgICByZXQgPSAtMTsJCQorCSAgICB9CQkKKwl9CiAgICAgfQorICAgIGlmIChyZXQgPj0gMCkgeworCS8qCisJKiBQcm9jZXNzIHBhdHRlcnMuIFBhdHRlcm4gZmFjZXRzIGFyZSBPUmVkIGF0IHR5cGUgbGV2ZWwgCisJKiBhbmQgQU5EZWQgaWYgZGVyaXZlZC4gV2FsayB0aGUgYmFzZSB0eXBlIGF4aXMuCisJKi8KKwloYXNGYWNldCA9IDA7CisJdG1wVHlwZSA9IHR5cGU7CisJZmFjZXQgPSBOVUxMOworCWRvIHsKKwkgICAgcmV0RmFjZXQgPSAwOworCSAgICBmb3IgKGZhY2V0TGluayA9IHRtcFR5cGUtPmZhY2V0U2V0OyBmYWNldExpbmsgIT0gTlVMTDsgCisJICAgIGZhY2V0TGluayA9IGZhY2V0TGluay0+bmV4dCkgeworCQlpZiAoZmFjZXRMaW5rLT5mYWNldC0+dHlwZSAhPSBYTUxfU0NIRU1BX0ZBQ0VUX1BBVFRFUk4pCisJCSAgICBjb250aW51ZTsKKwkJcmV0RmFjZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0KGJpVHlwZSwgZmFjZXRMaW5rLT5mYWNldCwgCisJCSAgICB2YWx1ZSwgY3R4dC0+dmFsdWUpOworCQlpZiAocmV0RmFjZXQgPD0gMCkKKwkJICAgIGJyZWFrOworCQllbHNlCisJCSAgICAvKiBTYXZlIHRoZSBsYXN0IG5vbi12YWxpZGF0aW5nIGZhY2V0LiAqLworCQkgICAgZmFjZXQgPSBmYWNldExpbmstPmZhY2V0OworCSAgICB9CisJICAgIGlmIChyZXRGYWNldCAhPSAwKQorCQlicmVhazsJCSAgICAKKwkgICAgdG1wVHlwZSA9IHRtcFR5cGUtPmJhc2VUeXBlOworCX0gd2hpbGUgKCh0bXBUeXBlICE9IE5VTEwpICYmICh0bXBUeXBlLT50eXBlICE9IFhNTF9TQ0hFTUFfVFlQRV9CQVNJQykpOworCWlmIChyZXRGYWNldCA8IDApIHsKKwkgICAgeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKKwkJIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZSwgIgorCQkidmFsaWRhdGluZyAncGF0dGVybicgZmFjZXRzIG9mIHR5cGUgJyVzJy5cbiIsCisJCXRtcFR5cGUtPm5hbWUsIE5VTEwpOworCSAgICByZXQgPSAtMTsKKwl9IGVsc2UgaWYgKHJldEZhY2V0ID4gMCkgeworCSAgICByZXQgPSBYTUxfU0NIRU1BVl9DVkNfUEFUVEVSTl9WQUxJRDsKKwkgICAgaWYgKGZpcmVFcnJvcnMpIHsKKwkJeG1sU2NoZW1hVkZhY2V0RXJyKGN0eHQsIHJldCwgY3R4dC0+Y3VyLCB2YWx1ZSwgMCwgdHlwZSwgZmFjZXQsIAorCQkgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJICAgIH0KKwl9CisgICAgfQkgICAgCisgICAKICAgICByZXR1cm4gKHJldCk7CiB9CiAKQEAgLTg5NjUsMjExICsxMTIwNCw3IEBACiAgKiAJCQlTaW1wbGUgdHlwZSB2YWxpZGF0aW9uCQkJCSoKICAqIAkJCQkJCQkJCSoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgMCAvKiBOb3QgY3VycmVudGx5IHVzZWQuICovCi0vKioKLSAqIHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVmFsdWVVbmlvbjoKLSAqIEBjdHh0OiAgYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0Ci0gKiBAdHlwZTogIHRoZSB0eXBlIGRlY2xhcmF0aW9uCi0gKiBAdmFsdWU6ICB0aGUgdmFsdWUgdG8gdmFsaWRhdGUKLSAqCi0gKiBWYWxpZGF0ZXMgYSB2YWx1ZSBhZ2FpbnN0IGEgdW5pb24uCi0gKgotICogUmV0dXJucyAwIGlmIHRoZSB2YWx1ZSBpcyB2YWxpZCwgYSBwb3NpdGl2ZSBlcnJvciBjb2RlCi0gKiAgICAgbnVtYmVyIG90aGVyd2lzZSBhbmQgLTEgaW4gY2FzZSBvZiBpbnRlcm5hbCBvciBBUEkgZXJyb3IuCi0gKi8KLXN0YXRpYyBpbnQKLXhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVmFsdWVVbmlvbih4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hVHlwZVB0ciB0eXBlLCBjb25zdCB4bWxDaGFyICogdmFsdWUpCi17Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgY29uc3QgeG1sQ2hhciAqY3VyLCAqZW5kLCAqcHJlZml4LCAqbmNOYW1lOwotICAgIHhtbENoYXIgKnRtcDsKLSAgICB4bWxTY2hlbWFUeXBlUHRyIHN1YnR5cGU7Ci0gICAgeG1sTnNQdHIgbnM7Ci0gICAgaW50IGxlbjsKLSAgIAogCi0gICAgLyogUHJvY2VzcyByZWZlcmVuY2VkIG1lbWJlclR5cGVzLiAqLwotICAgIGN1ciA9IHR5cGUtPnJlZjsKLSAgICBkbyB7Ci0gICAgICAgIHdoaWxlIChJU19CTEFOS19DSCgqY3VyKSkKLSAgICAgICAgICAgIGN1cisrOwotICAgICAgICBlbmQgPSBjdXI7Ci0gICAgICAgIHdoaWxlICgoKmVuZCAhPSAwKSAmJiAoIShJU19CTEFOS19DSCgqZW5kKSkpKQotICAgICAgICAgICAgZW5kKys7Ci0gICAgICAgIGlmIChlbmQgPT0gY3VyKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRtcCA9IHhtbFN0cm5kdXAoY3VyLCBlbmQgLSBjdXIpOwotICAgICAgICAgbmNOYW1lID0geG1sU3BsaXRRTmFtZTModG1wLCAmbGVuKTsKLSAgICAgICAgaWYgKG5jTmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBwcmVmaXggPSB4bWxTdHJuZHVwKHRtcCwgbGVuKTsKLSAgICAgICAgICAgIC8qIHByZWZpeCA9IHhtbERpY3RMb29rdXAoY3R4dC0+ZG9jLT5kaWN0LCB0bXAsIGxlbik7ICovCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmVmaXggPSBOVUxMOwotICAgICAgICAgICAgbmNOYW1lID0gdG1wOwotICAgICAgICB9Ci0gICAgICAgIC8qIFdlIHdvbid0IGRvIGFkZGl0aW9uYWwgY2hlY2tzIGhlcmUsCi0JICogc2luY2UgdGhleSBoYXZlIGJlZW4gcGVyZm9ybWVkIGR1cmluZyBwYXJzaW5nLiAqLwotICAgICAgICBucyA9IHhtbFNlYXJjaE5zKHR5cGUtPm5vZGUtPmRvYywgdHlwZS0+bm9kZSwgcHJlZml4KTsKLSAgICAgICAgLyogbmFtZXNwYWNlID0geG1sRGljdExvb2t1cChjdHh0LT5kb2MtPmRpY3QsIG5zLT5ocmVmLCAtMSk7ICovCi0gICAgICAgIHN1YnR5cGUgPSB4bWxTY2hlbWFHZXRUeXBlKGN0eHQtPnNjaGVtYSwgbmNOYW1lLCBucy0+aHJlZik7Ci0JaWYgKHRtcCAhPSBOVUxMKQotCSAgICB4bWxGcmVlKHRtcCk7Ci0JaWYgKHByZWZpeCAhPSBOVUxMKQotCSAgICB4bWxGcmVlKCh2b2lkICopcHJlZml4KTsKLSAgICAgICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVWYWx1ZUludGVybmFsKGN0eHQsIHN1YnR5cGUsIHZhbHVlLCAwKTsKLSAgICAgICAgaWYgKChyZXQgPT0gMCkgfHwgKHJldCA9PSAtMSkpIHsKLSAgICAgICAgICAgIHJldHVybiAocmV0KTsKLSAgICAgICAgfQotICAgICAgICBjdXIgPSBlbmQ7Ci0gICAgfSB3aGlsZSAoKmN1ciAhPSAwKTsKLQotICAgIGlmICh0eXBlLT5zdWJ0eXBlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHN1YnR5cGUgPSB0eXBlLT5zdWJ0eXBlczsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVWYWx1ZUludGVybmFsKGN0eHQsIHN1YnR5cGUsIHZhbHVlLCAwKTsKLSAgICAgICAgICAgIGlmICgocmV0ID09IDApIHx8IChyZXQgPT0gLTEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VidHlwZSA9IHN1YnR5cGUtPm5leHQ7Ci0gICAgICAgIH0gd2hpbGUgKHN1YnR5cGUgIT0gTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiAocmV0KTsKLX0KLQotLyoqCi0gKiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVZhbHVlOgotICogQGN0eHQ6ICBhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQKLSAqIEB0eXBlOiAgdGhlIHR5cGUgZGVjbGFyYXRpb24KLSAqIEB2YWx1ZTogIHRoZSB2YWx1ZSB0byB2YWxpZGF0ZQotICoKLSAqIFZhbGlkYXRlIGEgdmFsdWUgYWdhaW5zdCBhIHNpbXBsZSB0eXBlCi0gKgotICogUmV0dXJucyAwIGlmIHRoZSB2YWx1ZSBpcyB2YWxpZCwgYSBwb3NpdGl2ZSBlcnJvciBjb2RlCi0gKiAgICAgbnVtYmVyIG90aGVyd2lzZSBhbmQgLTEgaW4gY2FzZSBvZiBpbnRlcm5hbCBvciBBUEkgZXJyb3IuCi0gKi8KLXN0YXRpYyBpbnQKLXhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVmFsdWUoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZSwgY29uc3QgeG1sQ2hhciAqIHZhbHVlKQotewotICByZXR1cm4gKHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVmFsdWVJbnRlcm5hbChjdHh0LCB0eXBlLCB2YWx1ZSwgMSkpOwotfQotCi0vKioKLSAqIHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVmFsdWU6Ci0gKiBAY3R4dDogIGEgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dAotICogQHR5cGU6ICB0aGUgdHlwZSBkZWNsYXJhdGlvbgotICogQHZhbHVlOiAgdGhlIHZhbHVlIHRvIHZhbGlkYXRlCi0gKiBAZmlyZUVycm9yczogIGlmIDAsIG9ubHkgaW50ZXJuYWwgZXJyb3JzIHdpbGwgYmUgZmlyZWQ7Ci0gKgkJIG90aGVyd2lzZSBhbGwgZXJyb3JzIHdpbGwgYmUgZmlyZWQuCi0gKgotICogVmFsaWRhdGUgYSB2YWx1ZSBhZ2FpbnN0IGEgc2ltcGxlIHR5cGUKLSAqCi0gKiBSZXR1cm5zIDAgaWYgdGhlIHZhbHVlIGlzIHZhbGlkLCBhIHBvc2l0aXZlIGVycm9yIGNvZGUKLSAqICAgICBudW1iZXIgb3RoZXJ3aXNlIGFuZCAtMSBpbiBjYXNlIG9mIGludGVybmFsIG9yIEFQSSBlcnJvci4KLSAqLwotc3RhdGljIGludAoteG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVWYWx1ZUludGVybmFsKHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGUsCi0JCQkgICAgIGNvbnN0IHhtbENoYXIgKiB2YWx1ZSwKLQkJCSAgICAgaW50IGZpcmVFcnJvcnMpCi17Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICAvKgotICAgICAqIEZpcnN0IG5vcm1hbGl6ZSB0aGUgdmFsdWUgYWNjb3JkaW5nbHkgdG8gU2NoZW1hIERhdGF0eXBlCi0gICAgICogNC4zLjYgd2hpdGVTcGFjZSBkZWZpbml0aW9uIG9mIHRoZSB3aGl0ZVNwYWNlIGZhY2V0IG9mIHR5cGUKLSAgICAgKgotICAgICAqIFRoZW4gY2hlY2sgdGhlIG5vcm1hbGl6ZWQgdmFsdWUgYWdhaW5zdCB0aGUgbGV4aWNhbCBzcGFjZSBvZiB0aGUKLSAgICAgKiB0eXBlLgotICAgICAqLwotICAgIGlmICh0eXBlLT50eXBlID09IFhNTF9TQ0hFTUFfVFlQRV9CQVNJQykgewotICAgICAgICBpZiAoY3R4dC0+dmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgeG1sU2NoZW1hRnJlZVZhbHVlKGN0eHQtPnZhbHVlKTsKLSAgICAgICAgICAgIGN0eHQtPnZhbHVlID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXQgPSB4bWxTY2hlbWFWYWxQcmVkZWZUeXBlTm9kZSh0eXBlLCB2YWx1ZSwgJihjdHh0LT52YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQtPmN1cik7Ci0gICAgICAgIGlmICgoZmlyZUVycm9ycykgJiYgKHJldCAhPSAwKSkgewotICAgICAgICAgICAgeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIFhNTF9TQ0hFTUFTX0VSUl9WQUxVRSwKLQkgICAgCQkgICJGYWlsZWQgdG8gdmFsaWRhdGUgYmFzaWMgdHlwZSAlc1xuIiwKLQkJCSAgdHlwZS0+bmFtZSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPnR5cGUgPT0gWE1MX1NDSEVNQV9UWVBFX1JFU1RSSUNUSU9OKSB7Ci0gICAgICAgIHhtbFNjaGVtYVR5cGVQdHIgYmFzZTsKLQotICAgICAgICBiYXNlID0gdHlwZS0+YmFzZVR5cGU7Ci0gICAgICAgIGlmIChiYXNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJldCA9IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVmFsdWVJbnRlcm5hbChjdHh0LCBiYXNlLAotCSAgICAJCQl2YWx1ZSwgZmlyZUVycm9ycyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS0+c3VidHlwZXMgIT0gTlVMTCkgewotCSAgICBUT0RPCi0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBEbyBub3QgdmFsaWRhdGUgZmFjZXRzIG9yIGF0dHJpYnV0ZXMgd2hlbiB3b3JraW5nIG9uCi0JICogYnVpbGRpbmcgdGhlIFNjaGVtYXMKLSAgICAgICAgICovCi0gICAgICAgIGlmIChjdHh0LT5zY2hlbWEgIT0gTlVMTCkgewotCSAgICB4bWxTY2hlbWFGYWNldExpbmtQdHIgZmFjZXRMaW5rOwotCi0gICAgICAgICAgICBpZiAoKHJldCA9PSAwKSAmJiAodHlwZS0+ZmFjZXRTZXQgIT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBmYWNldExpbmsgPSB0eXBlLT5mYWNldFNldDsKLSAgICAgICAgICAgICAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0c0ludGVybmFsKGN0eHQsIGJhc2UsIGZhY2V0TGluaywKLQkJCQl2YWx1ZSwgZmlyZUVycm9ycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPnR5cGUgPT0gWE1MX1NDSEVNQV9UWVBFX1NJTVBMRSkgewotICAgICAgICB4bWxTY2hlbWFUeXBlUHRyIGJhc2U7Ci0KLSAgICAgICAgYmFzZSA9IHR5cGUtPnN1YnR5cGVzOwotICAgICAgICBpZiAoYmFzZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVZhbHVlSW50ZXJuYWwoY3R4dCwgYmFzZSwKLQkgICAgCQkJdmFsdWUsIGZpcmVFcnJvcnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICBUT0RPfQotICAgIH0gZWxzZSBpZiAodHlwZS0+dHlwZSA9PSBYTUxfU0NIRU1BX1RZUEVfTElTVCkgewotICAgICAgICB4bWxTY2hlbWFUeXBlUHRyIGJhc2U7Ci0gICAgICAgIGNvbnN0IHhtbENoYXIgKmN1ciwgKmVuZDsKLQl4bWxDaGFyICp0bXA7Ci0gICAgICAgIGludCByZXQyOwotCi0gICAgICAgIGJhc2UgPSB0eXBlLT5zdWJ0eXBlczsKLSAgICAgICAgaWYgKGJhc2UgPT0gTlVMTCkgewotCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIHR5cGUtPm5vZGUsIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKLQkJCSJJbnRlcm5hbDogTGlzdCB0eXBlICVzIGhhcyBubyBiYXNlIHR5cGVcbiIsCi0JCQl0eXBlLT5uYW1lLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiAoLTEpOwotICAgICAgICB9Ci0gICAgICAgIGN1ciA9IHZhbHVlOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB3aGlsZSAoSVNfQkxBTktfQ0goKmN1cikpCi0gICAgICAgICAgICAgICAgY3VyKys7Ci0gICAgICAgICAgICBlbmQgPSBjdXI7Ci0gICAgICAgICAgICB3aGlsZSAoKCplbmQgIT0gMCkgJiYgKCEoSVNfQkxBTktfQ0goKmVuZCkpKSkKLSAgICAgICAgICAgICAgICBlbmQrKzsKLSAgICAgICAgICAgIGlmIChlbmQgPT0gY3VyKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgdG1wID0geG1sU3RybmR1cChjdXIsIGVuZCAtIGN1cik7Ci0gICAgICAgICAgICByZXQyID0geG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVWYWx1ZUludGVybmFsKGN0eHQsIGJhc2UsCi0JICAgIAkJCXRtcCwgZmlyZUVycm9ycyk7Ci0JICAgIHhtbEZyZWUodG1wKTsKLSAgICAgICAgICAgIGlmIChyZXQyICE9IDApCi0gICAgICAgICAgICAgICAgcmV0ID0gMTsKLSAgICAgICAgICAgIGN1ciA9IGVuZDsKLSAgICAgICAgfSB3aGlsZSAoKmN1ciAhPSAwKTsKLSAgICB9ICBlbHNlIGlmICh0eXBlLT50eXBlID09IFhNTF9TQ0hFTUFfVFlQRV9VTklPTikgewotICAgICAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVZhbHVlVW5pb24oY3R4dCwgdHlwZSwgdmFsdWUpOwotICAgICAgICBpZiAoKGZpcmVFcnJvcnMpICYmIChyZXQgIT0gMCkpIHsKLSAgICAgICAgICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCBYTUxfU0NIRU1BU19FUlJfVkFMVUUsCi0JICAgIAkJICAiRmFpbGVkIHRvIHZhbGlkYXRlIHR5cGUgJXNcbiIsIHR5cGUtPm5hbWUsIE5VTEwpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVE9ETwotICAgIH0KLSAgICByZXR1cm4gKHJldCk7Ci19Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCQkJCQkJKgpAQCAtOTIyOCwxMiArMTEyNjMsMTIgQEAKICAgICAgICAgICAgIGF0dHJzID0gYXR0cnMtPm5leHQ7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICAgICAgdG1wID0gKHhtbFNjaGVtYUF0dHJTdGF0ZVB0cikKLQkgICAgICAgeG1sTWFsbG9jKHNpemVvZih4bWxTY2hlbWFBdHRyU3RhdGUpKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHhtbFNjaGVtYVZFcnJNZW1vcnkoY3R4dCwgInJlZ2lzdGVyaW5nIGF0dHJpYnV0ZXMiLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKLSAgICAgICAgICAgIH0KKwl0bXAgPSAoeG1sU2NoZW1hQXR0clN0YXRlUHRyKQorCSAgICB4bWxNYWxsb2Moc2l6ZW9mKHhtbFNjaGVtYUF0dHJTdGF0ZSkpOworCWlmICh0bXAgPT0gTlVMTCkgeworCSAgICB4bWxTY2hlbWFWRXJyTWVtb3J5KGN0eHQsICJyZWdpc3RlcmluZyBhdHRyaWJ1dGVzIiwgTlVMTCk7CisJICAgIHJldHVybiAoLTEpOworCX0KIAl0bXAtPmF0dHIgPSBhdHRyczsKIAl0bXAtPnN0YXRlID0gWE1MX1NDSEVNQVNfQVRUUl9VTktOT1dOOwogCXRtcC0+bmV4dCA9IE5VTEw7CkBAIC05MjQ4LDEyNyArMTEyODMsNiBAQAogfQogCiAvKioKLSAqIHhtbFNjaGVtYUNoZWNrQXR0cmlidXRlczoKLSAqIEBjdHh0OiAgYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0Ci0gKiBAbm9kZTogIHRoZSBub2RlIGNhcnJ5aW5nIGl0LgotICoKLSAqIENoZWNrIHRoYXQgdGhlIHJlZ2lzdGVyZWQgc2V0IG9mIGF0dHJpYnV0ZXMgb24gdGhlIGN1cnJlbnQgbm9kZQotICogaGFzIGJlZW4gcHJvcGVybHkgdmFsaWRhdGVkLgotICoKLSAqIFJldHVybnMgMCBpZiB2YWxpZGl0eSBjb25zdHJhaW50cyBhcmUgbWV0LCAxIG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGludAoteG1sU2NoZW1hQ2hlY2tBdHRyaWJ1dGVzKHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0LCB4bWxOb2RlUHRyIG5vZGUpCi17Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgeG1sU2NoZW1hQXR0clN0YXRlUHRyIGN1cjsgICAgCi0KLSAgICBjdXIgPSBjdHh0LT5hdHRyOwotICAgIHdoaWxlICgoY3VyICE9IE5VTEwpICYmIChjdXIgIT0gY3R4dC0+YXR0clRvcC0+bmV4dCkpIHsKLQlpZiAoY3VyLT5zdGF0ZSAhPSBYTUxfU0NIRU1BU19BVFRSX0NIRUNLRUQpIHsJICAgIAkgICAgCi0gICAgICAgICAgICByZXQgPSAxOwotCSAgICBpZiAoY3VyLT5zdGF0ZSA9PSBYTUxfU0NIRU1BU19BVFRSX1VOS05PV04pCi0gICAgICAgICAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIG5vZGUsIFhNTF9TQ0hFTUFTX0VSUl9BVFRSVU5LTk9XTiwKLQkgICAgCQkgICJBdHRyaWJ1dGUgXCIlc1wiIGlzIG5vdCBhbGxvd2VkLlxuIiwKLQkJICAgIGN1ci0+YXR0ci0+bmFtZSwgTlVMTCk7Ci0JICAgIGVsc2UgaWYgKGN1ci0+c3RhdGUgPT0gWE1MX1NDSEVNQVNfQVRUUl9QUk9ISUJJVEVEKQotCQkvKgotCQkqIFRPRE86IFRoaXMgd29uJ3QgZXZlciBiZSB0b3VjaGVkIHNvIHJlbW92ZSBpdC4KLQkJKi8KLQkJeG1sU2NoZW1hVkVycihjdHh0LCBub2RlLCBYTUxfU0NIRU1BU19FUlJfQVRUUlVOS05PV04sCi0JCSAgICAiQXR0cmlidXRlIFwiJXNcIiBpcyBwcm9oaWJpdGVkLlxuIiwKLQkJICAgIGN1ci0+YXR0ci0+bmFtZSwgTlVMTCk7Ci0JICAgIGVsc2UgaWYgKGN1ci0+c3RhdGUgPT0gWE1MX1NDSEVNQVNfQVRUUl9JTlZBTElEX1ZBTFVFKSB7Ci0JCXhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVNfRVJSX0FUVFJJTlZBTElELAotCQkgICAgIkF0dHJpYnV0ZSBcIiVzXCI6IHRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4iLAotCQkgICAgY3VyLT5hdHRyLT5uYW1lLCBub2RlLT5uYW1lKTsKLQkgICAgfSBlbHNlIGlmIChjdXItPnN0YXRlID09IFhNTF9TQ0hFTUFTX0FUVFJfTUlTU0lORykgewotCQlpZiAoY3VyLT5kZWNsLT5yZWYgIT0gTlVMTCkKLQkJICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVNfRVJSX01JU1NJTkcsCi0JCQkiQXR0cmlidXRlIFwiJXNcIiBpcyByZXF1aXJlZCBidXQgbWlzc2luZy5cbiIsIAotCQkJY3VyLT5kZWNsLT5yZWYsIE5VTEwpOwotCQllbHNlCi0JCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIG5vZGUsIFhNTF9TQ0hFTUFTX0VSUl9NSVNTSU5HLAotCQkJIkF0dHJpYnV0ZSBcIiVzXCIgaXMgcmVxdWlyZWQgYnV0IG1pc3NpbmcuXG4iLCAKLQkJCWN1ci0+ZGVjbC0+bmFtZSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0JY3VyID0gY3VyLT5uZXh0OwotICAgIH0KLQotICAgIHJldHVybiAocmV0KTsKLX0KLQotI2lmIDAJCS8qIE5vdCBjdXJyZW50bHkgdXNlZCAtIHJlbW92ZSBpZiBldmVyIG5lZWRlZCAqLwotLyoqCi0gKiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZUNvbnRlbnQ6Ci0gKiBAY3R4dDogIGEgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dAotICogQGVsZW06ICBhbiBlbGVtZW50Ci0gKiBAdHlwZTogIHRoZSB0eXBlIGRlY2xhcmF0aW9uCi0gKgotICogVmFsaWRhdGUgdGhlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCBleHBlY3RlZCB0byBiZSBhIHNpbXBsZSB0eXBlCi0gKgotICogUmV0dXJucyAwIGlmIHRoZSBlbGVtZW50IGlzIHNjaGVtYXMgdmFsaWQsIGEgcG9zaXRpdmUgZXJyb3IgY29kZQotICogICAgIG51bWJlciBvdGhlcndpc2UgYW5kIC0xIGluIGNhc2Ugb2YgaW50ZXJuYWwgb3IgQVBJIGVycm9yLgotICovCi1zdGF0aWMgaW50Ci14bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZUNvbnRlbnQoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBub2RlIEFUVFJJQlVURV9VTlVTRUQpCi17Ci0gICAgeG1sTm9kZVB0ciBjaGlsZDsKLSAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGUsIGJhc2U7Ci0gICAgeG1sQ2hhciAqdmFsdWU7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBjaGlsZCA9IGN0eHQtPm5vZGU7Ci0gICAgdHlwZSA9IGN0eHQtPnR5cGU7Ci0KLSAgICAvKgotICAgICAqIFZhbGlkYXRpb24gUnVsZTogRWxlbWVudCBMb2NhbGx5IFZhbGlkIChUeXBlKTogMy4xLjMKLSAgICAgKi8KLSAgICB2YWx1ZSA9IHhtbE5vZGVHZXRDb250ZW50KGNoaWxkKTsKLSAgICAvKiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVZhbHVlKGN0eHQsIHR5cGUsIHZhbHVlKTsgKi8KLSAgICBzd2l0Y2ggKHR5cGUtPnR5cGUpIHsKLSAgICAgICAgY2FzZSBYTUxfU0NIRU1BX1RZUEVfUkVTVFJJQ1RJT046ewotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUZhY2V0UHRyIGZhY2V0OwotCi0gICAgICAgICAgICAgICAgYmFzZSA9IHR5cGUtPmJhc2VUeXBlOwotICAgICAgICAgICAgICAgIGlmIChiYXNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVWYWx1ZShjdHh0LCBiYXNlLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUT0RPfQotICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBmYWNldCA9IHR5cGUtPmZhY2V0czsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVZhbGlkYXRlRmFjZXRzKGN0eHQsIGJhc2UsIGZhY2V0LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCQkvKiAKLQkJICogVGhpcyBzaG91bGQgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlcyBldmVuCi0JCSAqIHdoZW4gdmFsaWRhdGlvbiBvZiB0aGUgdmFsdWUgZmFpbGVkLgotCQkgKi8KLQkJLyoKLQkJaWYgKHR5cGUtPmF0dHJpYnV0ZXMgIT0gTlVMTCkgewotCQkgICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVBdHRyaWJ1dGVzKGN0eHQsIG5vZGUsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS0+YXR0cmlidXRlcyk7Ci0JCX0KLQkJKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBYTUxfU0NIRU1BX1RZUEVfRVhURU5TSU9OOnsKLQkgICAgICAgIFRPRE8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLQkgICAgVE9ETwotICAgIH0KLSAgICBpZiAodmFsdWUgIT0gTlVMTCkKLSAgICAgICAgeG1sRnJlZSh2YWx1ZSk7Ci0KLSAgICByZXR1cm4gKHJldCk7Ci19Ci0jZW5kaWYKLQotLyoqCiAgKiB4bWxTY2hlbWFWYWxpZGF0ZUNoZWNrTm9kZUxpc3QKICAqIEBub2RlbGlzdDogdGhlIGxpc3Qgb2Ygbm9kZXMKICAqCkBAIC05NDE5LDYzICsxMTMzMywxMSBAQAogI2VuZGlmCiAgICAgY3R4dC0+dHlwZSA9IHR5cGU7CiAgICAgY3R4dC0+bm9kZSA9IG5vZGU7Ci0gICAgeG1sU2NoZW1hVmFsaWRhdGVDb250ZW50KGN0eHQsIG5vZGUpOworICAgIHhtbFNjaGVtYVZhbGlkYXRlQ29udGVudChjdHh0LCBub2RlKTsgICAgCiAgICAgY3R4dC0+dHlwZSA9IG9sZHR5cGU7CiAgICAgY3R4dC0+bm9kZSA9IG9sZG5vZGU7CiB9CiAKLQotI2lmIDAKLQotLyoqCi0gKiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVJlc3RyaWN0aW9uVHlwZToKLSAqIEBjdHh0OiAgYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0Ci0gKiBAbm9kZTogIHRoZSB0b3Agbm9kZS4KLSAqCi0gKiBWYWxpZGF0ZSB0aGUgY29udGVudCBvZiBhIHJlc3RyaWN0aW9uIHR5cGUuCi0gKgotICogUmV0dXJucyAwIGlmIHRoZSBlbGVtZW50IGlzIHNjaGVtYXMgdmFsaWQsIGEgcG9zaXRpdmUgZXJyb3IgY29kZQotICogICAgIG51bWJlciBvdGhlcndpc2UgYW5kIC0xIGluIGNhc2Ugb2YgaW50ZXJuYWwgb3IgQVBJIGVycm9yLgotICovCi1zdGF0aWMgaW50Ci14bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVJlc3RyaWN0aW9uVHlwZSh4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgbm9kZSkKLXsKLSAgICB4bWxOb2RlUHRyIGNoaWxkOwotICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZTsKLSAgICBpbnQgcmV0OwotCi0gICAgY2hpbGQgPSBjdHh0LT5ub2RlOwotICAgIHR5cGUgPSBjdHh0LT50eXBlOwotCi0gICAgaWYgKChjdHh0ID09IE5VTEwpIHx8ICh0eXBlID09IE5VTEwpKSB7Ci0gICAgICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAotCQkgICAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlUmVzdHJpY3Rpb25UeXBlICVzXG4iLAotCQkgICAgICBub2RlLT5uYW1lLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuICgtMSk7Ci0gICAgfQotICAgIC8qCi0gICAgICogT25seSB0ZXh0IGFuZCB0ZXh0IGJhc2VkIGVudGl0aWVzIHJlZmVyZW5jZXMgc2hhbGwgYmUgZm91bmQgdGhlcmUKLSAgICAgKi8KLSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZUNoZWNrTm9kZUxpc3QoY2hpbGQpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAotCQkgICAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlUmVzdHJpY3Rpb25UeXBlICVzIGNvbnRlbnRcbiIsCi0JCSAgICAgIG5vZGUtPm5hbWUsIE5VTEwpOwotICAgICAgICByZXR1cm4gKC0xKTsKLSAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVNfRVJSX05PVFNJTVBMRSwKLQkJICAgICAgIkVsZW1lbnQgJXMgY29udGVudCBpcyBub3QgYSBzaW1wbGUgdHlwZVxuIiwKLQkJICAgICAgbm9kZS0+bmFtZSwgTlVMTCk7Ci0gICAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLSAgICBjdHh0LT50eXBlID0gdHlwZS0+c3VidHlwZXM7Ci0gICAgeG1sU2NoZW1hVmFsaWRhdGVDb250ZW50KGN0eHQsIG5vZGUpOwotICAgIGN0eHQtPnR5cGUgPSB0eXBlOwotICAgIHJldHVybiAocmV0KTsKLX0KLSNlbmRpZgotCiAjaWYgMCAvKiBOb3QgdXNlZCBhbnkgbW9yZSAqLwogLyoqCiAgKiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGU6CkBAIC05NTY1LDE0ICsxMTQyNyw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGJhc2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVZhbHVlKGN0eHQsIGJhc2UsIHZhbHVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFRPRE99CQkgCi0gICAgICAgICAgICAgICAgCi0JCS8qIFJlbW92ZWQgZHVlIHRvIGNoYW5nZXMgb2YgYXR0cmlidXRlIHZhbGlkYXRpb246Ci0JCWlmICgocmV0ID09IDApICYmICh2YXJpZXR5LT5hdHRyaWJ1dGVzICE9IE5VTEwpKSB7Ci0JCSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZUF0dHJpYnV0ZXMoY3R4dCwgbm9kZSwKLQkJICAgIAkJdmFyaWV0eS0+YXR0cmlidXRlcyk7Ci0JCX0KLQkJKi8KKyAgICAgICAgICAgICAgICBUT0RPfQkJICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBYTUxfU0NIRU1BX1RZUEVfTElTVDoKQEAgLTk2MDMsMzcgKzExNDU4LDUyIEBACiB9CiAjZW5kaWYKIAorCisKIC8qKgogICogeG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVUeXBlVmFsdWU6CiAgKiBAY3R4dDogIGEgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dAogICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkCiAgKiBAZmlyZUVycm9yczogc2hhbGwgZXJyb3JzIGJlIHJlcG9ydGVkPwogICogQGFwcGx5RmFjZXRzOiBzaGFsbCBmYWNldHMgYmUgYXBwbGllZD8KKyAqIEBub3JtYWxpemU6IHNoYWxsIHRoZSB2YWx1ZSBiZSBub3JtYWxpemVkPwogICoKICAqIFZhbGlkYXRlcyBhIHZhbHVlIGJ5IHRoZSBnaXZlbiB0eXBlICh1c2VyIGRlcml2ZWQgb3IgYnVpbHQtaW4pLgogICoKICAqIFJldHVybnMgMCBpZiB0aGUgdmFsdWUgaXMgdmFsaWQsIGEgcG9zaXRpdmUgZXJyb3IgY29kZQogICogbnVtYmVyIG90aGVyd2lzZSBhbmQgLTEgaW4gY2FzZSBvZiBhbiBpbnRlcm5hbCBvciBBUEkgZXJyb3IuCi0gKiBOb3RlIG9uIHJlcG9ydGVkIGVycm9yczogQWx0aG91Z2ggaXQgbWlnaHQgYmUgbmljZSB0byByZXBvcnQKLSAqIHRoZSBuYW1lIG9mIHRoZSBzaW1wbGUvY29tcGxleCB0eXBlLCB1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb250ZW50Ci0gKiBvZiBhIG5vZGUsIGl0IGlzIHF1aXRlIHVubmVjZXNzYXJ5OiBmb3IgZ2xvYmFsIGRlZmluZWQgdHlwZXMKLSAqIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50IGlzIGVxdWFsIHRvIHRoZSBOQ05hbWUgb2YgdGhlIHR5cGUsCi0gKiBmb3IgbG9jYWwgZGVmaW5lZCB0eXBlcyBpdCBtYWtlcyBubyBzZW5zZSB0byBvdXRwdXQgdGhlIGludGVybmFsCi0gKiBjb21wdXRlZCBuYW1lIG9mIHRoZSB0eXBlLiBUT0RPOiBJbnN0ZWFkLCBvbmUgc2hvdWxkIGF0dGFjaCB0aGUgCi0gKiBzdHJ1Y3Qgb2YgdGhlIHR5cGUgaW52b2x2ZWQgdG8gdGhlIGVycm9yIGhhbmRsZXIgLSB0aGlzIGFsbG93cwotICogdGhlIHJlcG9ydCBvZiBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBieSB0aGUgdXNlci4KLSAqIFRPRE86IENvcnJlY3QgY2hhcmFjdGVyIG5vcm1hbGl6YXRpb24gb2YgdW5pb24gc2ltcGxlIHR5cGVzLgogICovCiBzdGF0aWMgaW50CiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZSh4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCwgCiAJCQkJIGNvbnN0IHhtbENoYXIgKnZhbHVlLAogCQkJCSBpbnQgZmlyZUVycm9ycywJCQkJIAotCQkJCSBpbnQgYXBwbHlGYWNldHMpCisJCQkJIGludCBhcHBseUZhY2V0cywKKwkJCQkgaW50IG5vcm1hbGl6ZSkKIHsKICAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7Ci0gICAgaW50IHJldCA9IDA7ICAgIAotICAgIHR5cGUgPSBjdHh0LT50eXBlOyAgICAgCi0gICAgCisgICAgaW50IHJldCA9IDA7ICAKKyAgICB4bWxDaGFyICpub3JtVmFsdWUgPSBOVUxMOworICAgIGludCB3dHNwOyAgICAgICAKKyAKKyAgICB0eXBlID0gY3R4dC0+dHlwZTsKKyAgICB3dHNwID0gY3R4dC0+dmFsdWVXUzsKKyAgICAvKgorICAgICogTm9ybWFsaXplIHRoZSB2YWx1ZS4KKyAgICAqLworICAgIGlmIChub3JtYWxpemUgJiYgCisJKGN0eHQtPnZhbHVlV1MgIT0gWE1MX1NDSEVNQVNfVkFMX1dUU1BfQ09MTEFQU0UpKSB7CisJaW50IG5vcm0gPSB4bWxTY2hlbWFHZXRXaGl0ZVNwYWNlRmFjZXRWYWx1ZSh0eXBlKTsKKwkKKwlpZiAoKG5vcm0gIT0gLTEpICYmIChub3JtID4gY3R4dC0+dmFsdWVXUykpIHsKKwkgICAgaWYgKG5vcm0gPT0gWE1MX1NDSEVNQVNfVkFMX1dUU1BfQ09MTEFQU0UpCisJCW5vcm1WYWx1ZSA9IHhtbFNjaGVtYUNvbGxhcHNlU3RyaW5nKHZhbHVlKTsKKwkgICAgZWxzZQorCQlub3JtVmFsdWUgPSB4bWxTY2hlbWFXaGl0ZVNwYWNlUmVwbGFjZSh2YWx1ZSk7CisJICAgIGN0eHQtPnZhbHVlV1MgPSBub3JtOworCSAgICBpZiAobm9ybVZhbHVlICE9IE5VTEwpCisJCXZhbHVlID0gKGNvbnN0IHhtbENoYXIgKikgbm9ybVZhbHVlOworCX0JCQorICAgIH0gICAgCiAgICAgaWYgKHR5cGUtPnR5cGUgPT0gWE1MX1NDSEVNQV9UWVBFX0JBU0lDKSB7CiAJeG1sTm9kZVB0ciBjaGlsZDsKIApAQCAtOTY0NCwxMTMgKzExNTE0LDExNSBAQAogCWNoaWxkID0gY3R4dC0+bm9kZTsKIAl3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewogCSAgICBzd2l0Y2ggKGNoaWxkLT50eXBlKSB7Ci0JICAgIGNhc2UgWE1MX1RFWFRfTk9ERToKLQkgICAgY2FzZSBYTUxfQ0RBVEFfU0VDVElPTl9OT0RFOgotCSAgICBjYXNlIFhNTF9QSV9OT0RFOgotCSAgICBjYXNlIFhNTF9DT01NRU5UX05PREU6Ci0JICAgIGNhc2UgWE1MX1hJTkNMVURFX1NUQVJUOgotCSAgICBjYXNlIFhNTF9YSU5DTFVERV9FTkQ6Ci0JCWJyZWFrOwotCSAgICBjYXNlIFhNTF9FTlRJVFlfUkVGX05PREU6Ci0JICAgIGNhc2UgWE1MX0VOVElUWV9OT0RFOgotCQlUT0RPIGJyZWFrOwotCSAgICBjYXNlIFhNTF9FTEVNRU5UX05PREU6Ci0JCXhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCBYTUxfU0NIRU1BU19FUlJfSU5WQUxJREVMRU0sCi0JCSAgICAiRWxlbWVudCBcIiVzXCI6IGNoaWxkIFwiJXNcIiBzaG91bGQgbm90IGJlIHByZXNlbnQuXG4iLAotCQkgICAgY3R4dC0+Y3VyLT5uYW1lLCBjaGlsZC0+bmFtZSk7Ci0JCXJldHVybiAoY3R4dC0+ZXJyKTsKLQkgICAgY2FzZSBYTUxfQVRUUklCVVRFX05PREU6Ci0JICAgIGNhc2UgWE1MX0RPQ1VNRU5UX05PREU6Ci0JICAgIGNhc2UgWE1MX0RPQ1VNRU5UX1RZUEVfTk9ERToKLQkgICAgY2FzZSBYTUxfRE9DVU1FTlRfRlJBR19OT0RFOgotCSAgICBjYXNlIFhNTF9OT1RBVElPTl9OT0RFOgotCSAgICBjYXNlIFhNTF9IVE1MX0RPQ1VNRU5UX05PREU6Ci0JICAgIGNhc2UgWE1MX0RURF9OT0RFOgotCSAgICBjYXNlIFhNTF9FTEVNRU5UX0RFQ0w6Ci0JICAgIGNhc2UgWE1MX0FUVFJJQlVURV9ERUNMOgotCSAgICBjYXNlIFhNTF9FTlRJVFlfREVDTDoKLQkgICAgY2FzZSBYTUxfTkFNRVNQQUNFX0RFQ0w6CisJCWNhc2UgWE1MX1RFWFRfTk9ERToKKwkJY2FzZSBYTUxfQ0RBVEFfU0VDVElPTl9OT0RFOgorCQljYXNlIFhNTF9QSV9OT0RFOgorCQljYXNlIFhNTF9DT01NRU5UX05PREU6CisJCWNhc2UgWE1MX1hJTkNMVURFX1NUQVJUOgorCQljYXNlIFhNTF9YSU5DTFVERV9FTkQ6CisJCSAgICBicmVhazsKKwkJY2FzZSBYTUxfRU5USVRZX1JFRl9OT0RFOgorCQljYXNlIFhNTF9FTlRJVFlfTk9ERToKKwkJICAgIFRPRE8gYnJlYWs7CisJCWNhc2UgWE1MX0VMRU1FTlRfTk9ERTogeworCQkgICAgeG1sQ2hhciAqc3RyRSA9IE5VTEw7CisJCSAgICAKKwkJICAgIHhtbFNjaGVtYVZFcnJFeHQoY3R4dCwgY3R4dC0+Y3VyLCAKKwkJCVhNTF9TQ0hFTUFTX0VSUl9JTlZBTElERUxFTSwKKwkJCSJFbGVtZW50ICclcyc6IFRoZSBjaGlsZCAnJXMnIHNob3VsZCAiCisJCQkibm90IGJlIHByZXNlbnQuXG4iLAorCQkJeG1sU2NoZW1hRm9ybWF0TnNQcmVmaXhMb2NhbCgmc3RyRSwgCisJCQljdHh0LT5jdXItPnBhcmVudC0+bnMsIGN0eHQtPmN1ci0+cGFyZW50LT5uYW1lKSwJCQkKKwkJCWNoaWxkLT5uYW1lLCBOVUxMLCBOVUxMLCBOVUxMKTsJCQorCQkgICAgRlJFRV9BTkRfTlVMTChzdHJFKTsKKwkJICAgIHJldHVybiAoY3R4dC0+ZXJyKTsKKwkJCQkgICAgICAgfQorCQljYXNlIFhNTF9BVFRSSUJVVEVfTk9ERToKKwkJY2FzZSBYTUxfRE9DVU1FTlRfTk9ERToKKwkJY2FzZSBYTUxfRE9DVU1FTlRfVFlQRV9OT0RFOgorCQljYXNlIFhNTF9ET0NVTUVOVF9GUkFHX05PREU6CisJCWNhc2UgWE1MX05PVEFUSU9OX05PREU6CisJCWNhc2UgWE1MX0hUTUxfRE9DVU1FTlRfTk9ERToKKwkJY2FzZSBYTUxfRFREX05PREU6CisJCWNhc2UgWE1MX0VMRU1FTlRfREVDTDoKKwkJY2FzZSBYTUxfQVRUUklCVVRFX0RFQ0w6CisJCWNhc2UgWE1MX0VOVElUWV9ERUNMOgorCQljYXNlIFhNTF9OQU1FU1BBQ0VfREVDTDoKICNpZmRlZiBMSUJYTUxfRE9DQl9FTkFCTEVECi0JICAgIGNhc2UgWE1MX0RPQ0JfRE9DVU1FTlRfTk9ERToKLSNlbmRpZgotCQl4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgWE1MX1NDSEVNQVNfRVJSX0lOVkFMSURFTEVNLAotCQkgICAgIkVsZW1lbnQgXCIlc1wiOiBub2RlIHR5cGUgb2Ygbm9kZSB1bmV4cGVjdGVkIGhlcmUuXG4iLAotCQkgICAgY3R4dC0+Y3VyLT5uYW1lLCBOVUxMKTsKLQkJcmV0dXJuIChjdHh0LT5lcnIpOworCQljYXNlIFhNTF9ET0NCX0RPQ1VNRU5UX05PREU6IAorI2VuZGlmCQkKKwkJeworCQkgICAgeG1sQ2hhciAqc3RyRSA9IE5VTEwsICpzdHJBID0gTlVMTDsKKwkJICAgIAorCQkgICAgaWYgKGN0eHQtPmN1ci0+dHlwZSA9PSBYTUxfQVRUUklCVVRFX05PREUpIHsKKwkJCXhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCBYTUxfU0NIRU1BU19FUlJfSU5WQUxJREVMRU0sCisJCQkgICAgIkVsZW1lbnQgJyVzJywgYXR0cmlidXRlICclcyc6IFRoZSB0eXBlIG9mIG5vZGUgaXMgIgorCQkJICAgICJ1bmV4cGVjdGVkIGhlcmUuXG4iLAorCQkJICAgIHhtbFNjaGVtYUZvcm1hdE5zUHJlZml4TG9jYWwoJnN0ckUsIGN0eHQtPmN1ci0+cGFyZW50LT5ucywgCisJCQkgICAgY3R4dC0+Y3VyLT5wYXJlbnQtPm5hbWUpLAorCQkJICAgIHhtbFNjaGVtYUZvcm1hdE5zUHJlZml4TG9jYWwoJnN0ckEsIGN0eHQtPmN1ci0+bnMsIAorCQkJICAgIGN0eHQtPmN1ci0+bmFtZSkpOworCQkgICAgfSBlbHNlIHsKKwkJCXhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCBYTUxfU0NIRU1BU19FUlJfSU5WQUxJREVMRU0sCisJCQkgICAgIkVsZW1lbnQgJyVzJzogVGhlIHR5cGUgb2Ygbm9kZSBpcyB1bmV4cGVjdGVkIGhlcmUuXG4iLAorCQkJICAgIHhtbFNjaGVtYUZvcm1hdE5zUHJlZml4TG9jYWwoJnN0ckUsIGN0eHQtPmN1ci0+bnMsIAorCQkJICAgIGN0eHQtPmN1ci0+bmFtZSksIE5VTEwpOworCQkgICAgfQorCQkgICAgRlJFRV9BTkRfTlVMTChzdHJFKTsKKwkJICAgIEZSRUVfQU5EX05VTEwoc3RyQSk7CisJCSAgICByZXR1cm4gKGN0eHQtPmVycik7CisJCX0KIAkgICAgfQogCSAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwotCX0KLQlyZXQgPSB4bWxTY2hlbWFWYWxQcmVkZWZUeXBlTm9kZSh0eXBlLCB2YWx1ZSwgJihjdHh0LT52YWx1ZSksCi0JICAgIGN0eHQtPmN1cik7Ci0JaWYgKHJldCA+IDApIHsKKwkgICAgCisJfQkKKwlyZXQgPSB4bWxTY2hlbWFWYWxQcmVkZWZUeXBlTm9kZU5vTm9ybSh0eXBlLCB2YWx1ZSwgJihjdHh0LT52YWx1ZSksIGN0eHQtPmN1cik7CisJaWYgKHJldCA+IDApIHsJICAgIAogCSAgICBpZiAodHlwZS0+ZmxhZ3MgJiBYTUxfU0NIRU1BU19UWVBFX1ZBUklFVFlfTElTVCkgCiAJCXJldCA9IFhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMjsKIAkgICAgZWxzZQogCQlyZXQgPSBYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzE7CSAgICAKLQkgICAgaWYgKGZpcmVFcnJvcnMpIHsKLQkJaWYgKGN0eHQtPmN1ci0+dHlwZSA9PSBYTUxfQVRUUklCVVRFX05PREUpCi0JCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgCi0JCSAgICBYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzEsCi0JCSAgICAiVGhlIHZhbHVlIG9mIGF0dHJpYnV0ZSBcIiVzXCIgaXMgbm90IHZhbGlkLlxuIiwKLQkJICAgIGN0eHQtPmN1ci0+bmFtZSwgTlVMTCk7Ci0JCWVsc2UgCi0JCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgCi0JCSAgICBYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzEsCi0JCSAgICAiVGhlIHZhbHVlIGlzIG5vdCB2YWxpZC5cbiIsCi0JCSAgICBOVUxMLCBOVUxMKTsKLQkgICAgfQkgICAgCisJICAgIGlmIChmaXJlRXJyb3JzKQorCQl4bWxTY2hlbWFWU2ltcGxlVHlwZUVycihjdHh0LCByZXQsIGN0eHQtPmN1ciwgdmFsdWUsIHR5cGUpOwogCX0gZWxzZSBpZiAocmV0IDwgMCkgewogCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAogCQkiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlLCAiCi0JCSJ2YWxpZGF0aW5nIGJ1aWx0LWluIHR5cGUgXCIlc1wiXG4iLAotCQl0eXBlLT5uYW1lLCBOVUxMKTsKKwkJInZhbGlkYXRpbmcgYnVpbHQtaW4gdHlwZSAnJXMnXG4iLCB0eXBlLT5uYW1lLCBOVUxMKTsKIAl9CiAgICAgfSBlbHNlIGlmICh0eXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfVkFSSUVUWV9BVE9NSUMpIHsgICAgICAgIAogCS8qIDEuMi4xIGlmIHt2YXJpZXR5fSBpcyC3YXRvbWljtyB0aGVuIHRoZSBzdHJpbmcgbXVzdCC3bWF0Y2i3IAogCSogYSBsaXRlcmFsIGluIHRoZSC3bGV4aWNhbCBzcGFjZbcgb2Yge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSAKIAkqLwkKIAljdHh0LT50eXBlID0gdHlwZS0+YmFzZVR5cGU7Ci0JcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVUeXBlVmFsdWUoY3R4dCwgdmFsdWUsIDAsIDApOworCXJldCA9IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlKGN0eHQsIHZhbHVlLCAwLCAwLCAwKTsKKwljdHh0LT50eXBlID0gdHlwZTsKIAlpZiAocmV0IDwgMCkgewogCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAogCQkiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlLCAiCi0JCSJ2YWxpZGF0aW5nIGF0b21pYyBzaW1wbGUgdHlwZSBcIiVzXCJcbiIsCisJCSJ2YWxpZGF0aW5nIGF0b21pYyBzaW1wbGUgdHlwZSAnJXMnXG4iLAogCQl0eXBlLT5uYW1lLCBOVUxMKTsKLQl9IGVsc2UgaWYgKHJldCA+IDApIHsKKwl9IGVsc2UgaWYgKHJldCA+IDApIHsJICAgIAogCSAgICByZXQgPSBYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzE7Ci0JICAgIGlmIChmaXJlRXJyb3JzKSB7Ci0JCXhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCAKLQkJICAgIFhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMSwKLQkJICAgICJUaGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuIiwKLQkJICAgIE5VTEwsIE5VTEwpOwotCSAgICB9CQkKLQkgICAgCi0JfSBlbHNlIGlmICgoYXBwbHlGYWNldHMpICYmICAKLQkgICAgKHR5cGUtPmZhY2V0U2V0ICE9IE5VTEwpKSB7Ci0JICAgIHhtbFNjaGVtYVR5cGVQdHIgYnVpbHRJbjsKLQorCSAgICBpZiAoZmlyZUVycm9ycykKKwkJeG1sU2NoZW1hVlNpbXBsZVR5cGVFcnIoY3R4dCwgcmV0LCBjdHh0LT5jdXIsIHZhbHVlLCB0eXBlKTsJCisJfSBlbHNlIGlmICgoYXBwbHlGYWNldHMpICYmICh0eXBlLT5mYWNldFNldCAhPSBOVUxMKSkgewogCSAgICAvKiAKLQkgICAgKiBDaGVjayBmYWNldHMuIEJlIHN1cmUgdG8gcGFzcyB0aGUgYnVpbHQtaW4gdHlwZSB0bwotCSAgICAqIHhtbFNjaGVtYVZhbGlkYXRlRmFjZXRzSW50ZXJuYWwuCisJICAgICogQ2hlY2sgZmFjZXRzLgogCSAgICAqLwkgICAgCSAgICAJICAgIAotCSAgICBidWlsdEluID0gdHlwZS0+YmFzZVR5cGU7Ci0JICAgIHdoaWxlIChidWlsdEluLT50eXBlICE9IFhNTF9TQ0hFTUFfVFlQRV9CQVNJQykKLQkJYnVpbHRJbiA9IGJ1aWx0SW4tPmJhc2VUeXBlOwotCSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0c0ludGVybmFsKGN0eHQsIGJ1aWx0SW4sIAotCQl0eXBlLT5mYWNldFNldCwgdmFsdWUsIGZpcmVFcnJvcnMpOworCSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0c0ludGVybmFsKGN0eHQsIHR5cGUsIAorCQl2YWx1ZSwgMCwgZmlyZUVycm9ycyk7CiAJICAgIGlmIChyZXQgPCAwKSB7CiAJCXhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCiAJCSAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlLCAiCi0JCSAgICAidmFsaWRhdGluZyBmYWNldHMgb2YgYXRvbWljIHNpbXBsZSB0eXBlIFwiJXNcIlxuIiwKKwkJICAgICJ2YWxpZGF0aW5nIGZhY2V0cyBvZiBhdG9taWMgc2ltcGxlIHR5cGUgJyVzJ1xuIiwKIAkJICAgIHR5cGUtPm5hbWUsIE5VTEwpOwogCSAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKIAkJcmV0ID0gWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8xOwotCQlpZiAoZmlyZUVycm9ycykgewotCQkgICAgeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIAotCQkJWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8xLAotCQkJIlRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4iLAotCQkJTlVMTCwgTlVMTCk7Ci0JCX0KKwkJLyoKKwkJIERpc2FibGVkLCBzaW5jZSB0aGUgZmFjZXQgdmFsaWRhdGlvbiBhbHJlYWR5IHJlcG9ydHMgZXJyb3JzLgorCQlpZiAoZmlyZUVycm9ycykgCisJCSAgICB4bWxTY2hlbWFWU2ltcGxlVHlwZUVycihjdHh0LCByZXQsIGN0eHQtPmN1ciwgdmFsdWUsIHR5cGUpOworCQkqLwogCSAgICB9CQogCX0KICAgICB9IGVsc2UgaWYgKHR5cGUtPmZsYWdzICYgWE1MX1NDSEVNQVNfVFlQRV9WQVJJRVRZX0xJU1QpIHsKQEAgLTk3NTgsMTQgKzExNjMwLDE0IEBACiAJeG1sU2NoZW1hVHlwZVB0ciB0bXBUeXBlOwogCWNvbnN0IHhtbENoYXIgKmN1ciwgKmVuZDsKIAl4bWxDaGFyICp0bXA7Ci0JaW50IGxlbiA9IDA7CisJdW5zaWduZWQgbG9uZyBsZW4gPSAwOwogCiAJLyogMS4yLjIgaWYge3ZhcmlldHl9IGlzILdsaXN0tyB0aGVuIHRoZSBzdHJpbmcgbXVzdCBiZSBhIHNlcXVlbmNlIAogCSogb2Ygd2hpdGUgc3BhY2Ugc2VwYXJhdGVkIHRva2VucywgZWFjaCBvZiB3aGljaCC3bWF0Y2i3ZXMgYSBsaXRlcmFsIAogCSogaW4gdGhlILdsZXhpY2FsIHNwYWNltyBvZiB7aXRlbSB0eXBlIGRlZmluaXRpb259IAogCSovCiAJCi0JdG1wVHlwZSA9IHhtbFNjaGVtYUdldExpc3RTaW1wbGVUeXBlSXRlbVR5cGUodHlwZSk7CQkKKwl0bXBUeXBlID0geG1sU2NoZW1hR2V0TGlzdFNpbXBsZVR5cGVJdGVtVHlwZSh0eXBlKTsJCiAJY3VyID0gdmFsdWU7CiAJZG8gewogCSAgICB3aGlsZSAoSVNfQkxBTktfQ0goKmN1cikpCkBAIC05Nzc4LDE5ICsxMTY1MCwyMSBAQAogCSAgICB0bXAgPSB4bWxTdHJuZHVwKGN1ciwgZW5kIC0gY3VyKTsKIAkgICAgbGVuKys7CiAJICAgIGN0eHQtPnR5cGUgPSB0bXBUeXBlOwotCSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZShjdHh0LCB0bXAsIDAsIDEpOworCSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZShjdHh0LCB0bXAsIDAsIDEsIDApOworCSAgICBjdHh0LT50eXBlID0gdHlwZTsKIAkgICAgeG1sRnJlZSh0bXApOwotCSAgICBpZiAocmV0ID4gMCkgeworCSAgICBpZiAocmV0IDwgMCkgeworCQl4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAorCQkgICAgIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZSwgIgorCQkgICAgInZhbGlkYXRpbmcgYW4gaXRlbSBvZiBsaXN0IHNpbXBsZSB0eXBlICclcydcbiIsCisJCSAgICB0eXBlLT5uYW1lLCBOVUxMKTsJCisJCWJyZWFrOworCSAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKIAkJcmV0ID0gWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8yOwotCQlpZiAoZmlyZUVycm9ycykgewotCQkgICAgeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIAotCQkJWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8yLAotCQkJIlRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4iLAotCQkJTlVMTCwgTlVMTCk7Ci0JCX0JCQorCQlpZiAoZmlyZUVycm9ycykKKwkJICAgIHhtbFNjaGVtYVZTaW1wbGVUeXBlRXJyKGN0eHQsIHJldCwgY3R4dC0+Y3VyLCB2YWx1ZSwgdHlwZSk7CiAJCWJyZWFrOwotCSAgICB9IGVsc2UgaWYgKHJldCA8IDApCi0JCWJyZWFrOworCSAgICB9CQogCSAgICBjdXIgPSBlbmQ7CiAJfSB3aGlsZSAoKmN1ciAhPSAwKTsKIAkvKiAKQEAgLTk3OTksMTMyICsxMTY3MywyNSBAQAogCWlmIChyZXQgPCAwKSB7CiAJICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCiAJCSJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVUeXBlVmFsdWUsICIKLQkJInZhbGlkYXRpbmcgbGlzdCBzaW1wbGUgdHlwZSBcIiVzXCJcbiIsCisJCSJ2YWxpZGF0aW5nIGxpc3Qgc2ltcGxlIHR5cGUgJyVzJ1xuIiwKIAkJdHlwZS0+bmFtZSwgTlVMTCk7Ci0JfSBlbHNlIGlmICgocmV0ID09IDApICYmIChhcHBseUZhY2V0cykgJiYgCi0JICAgICh0eXBlLT5mYWNldFNldCAhPSBOVUxMKSkgewotCSAgICBpbnQgb2tGYWNldCA9IDAsIGhhc0ZhY2V0ID0gMDsKLQkgICAgdW5zaWduZWQgbG9uZyBleHBMZW47Ci0JICAgIHhtbFNjaGVtYUZhY2V0UHRyIGZhY2V0OwotCSAgICB4bWxTY2hlbWFGYWNldExpbmtQdHIgZmFjZXRMaW5rOwotCSAgICB4bWxDaGFyICpjb2xsYXBzZWRWYWx1ZSA9IE5VTEw7Ci0KLQkgICAgLyoKLQkgICAgKiBUaGUgdmFsdWUgb2Ygt3doaXRlU3BhY2W3IGlzIGZpeGVkIHRvIHRoZSB2YWx1ZSBjb2xsYXBzZS4gCi0JICAgICovCi0JICAgIGNvbGxhcHNlZFZhbHVlID0geG1sU2NoZW1hQ29sbGFwc2VTdHJpbmcoKGNvbnN0IHhtbENoYXIgKikgdmFsdWUpOwotCSAgICBpZiAoY29sbGFwc2VkVmFsdWUgIT0gTlVMTCkJCQotCQl2YWx1ZSA9IChjb25zdCB4bWxDaGFyICopIGNvbGxhcHNlZFZhbHVlOwkJCi0JICAgIGZhY2V0TGluayA9IHR5cGUtPmZhY2V0U2V0OwotCSAgICBkbyB7Ci0JCWZhY2V0ID0gZmFjZXRMaW5rLT5mYWNldDsKLQkJLyogCi0JCSogTGlzdCB0eXBlcyBuZWVkIGEgc3BlY2lhbCBmYWNldCB0cmVhdG1lbnQuIAotCQkqIFNraXAgd2hpdGVTcGFjZSwgc2luY2UgaXQgaXMgZml4ZWQgdG8gImNvbGxhcHNlIi4KLQkJKi8KLQkJaWYgKChmYWNldC0+dHlwZSAhPSBYTUxfU0NIRU1BX0ZBQ0VUX1dISVRFU1BBQ0UpICYmIAotCQkgICAgKGZhY2V0LT50eXBlICE9IFhNTF9TQ0hFTUFfRkFDRVRfUEFUVEVSTikpIHsKLQkJICAgIHJldCA9IHhtbFNjaGVtYVZhbGlkYXRlTGlzdFNpbXBsZVR5cGVGYWNldChmYWNldCwgdmFsdWUsIAotCQkJbGVuLCAmZXhwTGVuKTsKLQkJICAgIGlmIChmYWNldC0+dHlwZSA9PSBYTUxfU0NIRU1BX0ZBQ0VUX0VOVU1FUkFUSU9OKSB7Ci0JCQloYXNGYWNldCA9IDE7Ci0JCQlpZiAocmV0ID09IDApCi0JCQkgICAgb2tGYWNldCA9IDE7CQkgICAgCi0JCSAgICB9IGVsc2UgaWYgKChyZXQgPiAwKSAmJiAoZmlyZUVycm9ycykpIHsJCQkKLQkJCWNoYXIgbFsyNV0sIGZsWzI1XTsJCQkKLQkJCS8qIEZJWE1FOiBXaGF0IGlzIHRoZSBtYXggZXhwZWN0ZWQgc3RyaW5nIGxlbmd0aCBvZiB0aGUKLQkJCSogbGVuZ3RoIHZhbHVlPwotCQkJKi8KLQkJCXNucHJpbnRmKGwsIDI0LCAiJWQiLCBsZW4pOwotCQkJc25wcmludGYoZmwsIDI0LCAiJWx1IiwgZXhwTGVuKTsKLQkJCWlmIChyZXQgPT0gWE1MX1NDSEVNQVZfQ1ZDX0xFTkdUSF9WQUxJRCkgewotCQkJICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCByZXQsCi0JCQkJIlRoZSB2YWx1ZSB3aXRoIGxlbmd0aCBcIiVzXCIgaXMgbm90ICIKLQkJCQkiZmFjZXQtdmFsaWQgd2l0aCByZXNwZWN0IHRvIGxlbmd0aCA9IFwiJXNcIi5cbiIsCi0JCQkJKGNvbnN0IHhtbENoYXIgKilsLCAoY29uc3QgeG1sQ2hhciAqKWZsKTsKLQkJCX0gZWxzZSBpZiAocmV0ID09IFhNTF9TQ0hFTUFWX0NWQ19NSU5MRU5HVEhfVkFMSUQpIHsKLQkJCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgcmV0LAotCQkJCSJUaGUgdmFsdWUgd2l0aCBsZW5ndGggXCIlc1wiIGlzIG5vdCAiCi0JCQkJImZhY2V0LXZhbGlkIHdpdGggcmVzcGVjdCB0byBtaW5MZW5ndGggPSBcIiVzXCIuXG4iLAotCQkJCShjb25zdCB4bWxDaGFyICopbCwgKGNvbnN0IHhtbENoYXIgKilmbCk7Ci0JCQl9IGVsc2UgaWYgKHJldCA9PSBYTUxfU0NIRU1BVl9DVkNfTUFYTEVOR1RIX1ZBTElEKSB7Ci0JCQkgICAgeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIHJldCwKLQkJCQkiVGhlIHZhbHVlIHdpdGggbGVuZ3RoIFwiJXNcIiBpcyBub3QgIgotCQkJCSJmYWNldC12YWxpZCB3aXRoIHJlc3BlY3QgdG8gbWF4TGVuZ3RoID0gXCIlc1wiLlxuIiwKLQkJCQkoY29uc3QgeG1sQ2hhciAqKWwsIChjb25zdCB4bWxDaGFyICopZmwpOwotCQkJfSBlbHNlIHsKLQkJCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgcmV0LAotCQkJCSJUaGUgdmFsdWUgaXMgbm90IHZhbGlkIHdpdGggcmVzcGVjdCAiCi0JCQkJInRvIHRoZSBmYWNldCBcIiVzXCIuXG4iLAotCQkJCShjb25zdCB4bWxDaGFyICopCi0JCQkJeG1sU2NoZW1hRmFjZXRUeXBlVG9TdHJpbmcoZmFjZXQtPnR5cGUpLCAKLQkJCQlOVUxMKTsKLQkJCX0JCQkKLQkJICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgewotCQkJeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKLQkJCSAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlLCAiCi0JCQkgICAgInZhbGlkYXRpbmcgZmFjZXRzIG9mIGxpc3Qgc2ltcGxlIHR5cGUgXCIlc1wiXG4iLAotCQkJICAgIHR5cGUtPm5hbWUsIE5VTEwpOwkKLQkJCWJyZWFrOwotCQkgICAgfQotCQl9Ci0JCWZhY2V0TGluayA9IGZhY2V0TGluay0+bmV4dDsJCQotCSAgICB9IHdoaWxlIChmYWNldExpbmsgIT0gTlVMTCk7Ci0JICAgIGlmIChyZXQgPj0gMCkgewotCQlpZiAoKGhhc0ZhY2V0KSAmJiAob2tGYWNldCA9PSAwKSkgewotCQkgICAgcmV0ID0gWE1MX1NDSEVNQVZfQ1ZDX0VOVU1FUkFUSU9OX1ZBTElEOwotCQkgICAgaWYgKGZpcmVFcnJvcnMpIHsKLQkJICAgIC8qCi0JCSAgICAqIFRPRE86IFRyeSB0byBjcmVhdGUgYSByZXBvcnQgdGhhdCBvdXRwdXRzIGFsbCB0aGUgZW51bWVyYXRpb24KLQkJICAgICogdmFsdWVzIGluIHVzZS4KLQkJCSovCi0JCQl4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgWE1MX1NDSEVNQVZfQ1ZDX0VOVU1FUkFUSU9OX1ZBTElELAotCQkJICAgICJUaGUgdmFsdWUgaXMgbm90IHZhbGlkIHdpdGggcmVzcGVjdCAiCi0JCQkgICAgInRvIHRoZSBcImVudW1lcmF0aW9uXCIgZmFjZXQocykuXG4iLAotCQkJICAgIE5VTEwsIE5VTEwpOwotCQkgICAgfQotCQkgICAgCi0JCX0KKwl9IGVsc2UgaWYgKChyZXQgPT0gMCkgJiYgKGFwcGx5RmFjZXRzKSkgeworCSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0c0ludGVybmFsKGN0eHQsIHR5cGUsIAorCQl2YWx1ZSwgbGVuLCBmaXJlRXJyb3JzKTsKKwkgICAgaWYgKHJldCA8IDApIHsKKwkJeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKKwkJICAgICJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVUeXBlVmFsdWUsICIKKwkJICAgICJ2YWxpZGF0aW5nIGZhY2V0cyBvZiBsaXN0IHNpbXBsZSB0eXBlICclcydcbiIsCisJCSAgICB0eXBlLT5uYW1lLCBOVUxMKTsKKwkgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisJCXJldCA9IFhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMjsKIAkJLyoKLQkJKiBQYXR0ZXJuIGZhY2V0cyBhcmUgT1JlZCBhdCB0eXBlIGxldmVsIGFuZCBBTkRlZAotCQkqIGlmIGRlcml2ZWQuIFdhbGsgdGhlIGJhc2UgYXhpcy4KKwkJIERpc2FibGVkLCBzaW5jZSB0aGUgZmFjZXQgdmFsaWRhdGlvbiBhbHJlYWR5IHJlcG9ydHMgZXJyb3JzLgorCQlpZiAoZmlyZUVycm9ycykgCisJCSAgICB4bWxTY2hlbWFWU2ltcGxlVHlwZUVycihjdHh0LCByZXQsIGN0eHQtPmN1ciwgdmFsdWUsIHR5cGUpOwogCQkqLwotCQloYXNGYWNldCA9IDA7Ci0JCXRtcFR5cGUgPSB0eXBlOwotCQlkbyB7CQkgICAgCi0JCSAgICBva0ZhY2V0ID0gMDsKLQkJICAgIGZvciAoZmFjZXRMaW5rID0gdG1wVHlwZS0+ZmFjZXRTZXQ7IGZhY2V0TGluayAhPSBOVUxMOyAKLQkJICAgIGZhY2V0TGluayA9IGZhY2V0TGluay0+bmV4dCkgewkJICAgIAotCQkJaWYgKGZhY2V0TGluay0+ZmFjZXQtPnR5cGUgIT0gWE1MX1NDSEVNQV9GQUNFVF9QQVRURVJOKQotCQkJICAgIGNvbnRpbnVlOwkJCQotCQkJb2tGYWNldCA9IHhtbFNjaGVtYVZhbGlkYXRlTGlzdFNpbXBsZVR5cGVGYWNldCgKLQkJCSAgICBmYWNldExpbmstPmZhY2V0LCB2YWx1ZSwgbGVuLCAmZXhwTGVuKTsJCSAgICAKLQkJCWlmIChva0ZhY2V0IDw9IDApCi0JCQkgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICBpZiAob2tGYWNldCAhPSAwKQotCQkJYnJlYWs7CQkgICAgCi0JCSAgICB0bXBUeXBlID0gdG1wVHlwZS0+YmFzZVR5cGU7Ci0JCX0gd2hpbGUgKCh0bXBUeXBlICE9IE5VTEwpICYmICh0bXBUeXBlLT50eXBlICE9IFhNTF9TQ0hFTUFfVFlQRV9CQVNJQykpOwotCQlpZiAob2tGYWNldCA8IDApIHsKLQkJICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCi0JCQkiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlLCAiCi0JCQkidmFsaWRhdGluZyBcInBhdHRlcm5cIiBmYWNldHMgb2YgdHlwZSBcIiVzXCJcbiIsCi0JCQl0eXBlLT5uYW1lLCBOVUxMKTsKLQkJfSBlbHNlIGlmIChva0ZhY2V0ID4gMCkgewotCQkgICAgcmV0ID0gWE1MX1NDSEVNQVZfQ1ZDX1BBVFRFUk5fVkFMSUQ7Ci0JCSAgICBpZiAoZmlyZUVycm9ycykgewotCQkJeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIFhNTF9TQ0hFTUFWX0NWQ19FTlVNRVJBVElPTl9WQUxJRCwKLQkJCSAgICAiVGhlIHZhbHVlIGlzIG5vdCB2YWxpZCB3aXRoIHJlc3BlY3QgIgotCQkJICAgICJ0byB0aGUgXCJwYXR0ZXJuXCIgZmFjZXQocykgb2YgdHlwZSAiCi0JCQkgICAgIlwiJXNcIi5cbiIsCi0JCQkgICAgdG1wVHlwZS0+bmFtZSwgTlVMTCk7Ci0JCSAgICB9CQkgICAgCi0JCX0KLQkgICAgfQotCi0JICAgIGlmIChjb2xsYXBzZWRWYWx1ZSAhPSBOVUxMKSAKLQkJeG1sRnJlZShjb2xsYXBzZWRWYWx1ZSk7CisJICAgIH0JIAkgICAKKwkgICAKIAl9CiAgICAgfSBlbHNlIGlmICh0eXBlLT5mbGFncyAmIFhNTF9TQ0hFTUFTX1RZUEVfVkFSSUVUWV9VTklPTikgewogCXhtbFNjaGVtYVR5cGVMaW5rUHRyIG1lbWJlckxpbms7CkBAIC05OTQ1LDY5ICsxMTcxMiw4NSBAQAogCSogbGl0ZXJhbCBpbiB0aGUgt2xleGljYWwgc3BhY2W3IG9mIGF0IGxlYXN0IG9uZSBtZW1iZXIgb2YgCiAJKiB7bWVtYmVyIHR5cGUgZGVmaW5pdGlvbnN9IAogCSovCisjaWZkZWYgREVCVUdfVU5JT05fVkFMSURBVElPTgorCXByaW50ZigiVW5pb24gU1QgICAgIDogJyVzJ1xuIiwgKGNvbnN0IGNoYXIgKikgdHlwZS0+bmFtZSk7CisJcHJpbnRmKCIgIGZpcmVFcnJvcnMgOiAlZFxuIiwgZmlyZUVycm9ycyk7CisJcHJpbnRmKCIgIGFwcGx5RmFjZXRzOiAlZFxuIiwgYXBwbHlGYWNldHMpOworI2VuZGlmCiAJbWVtYmVyTGluayA9IHhtbFNjaGVtYUdldFVuaW9uU2ltcGxlVHlwZU1lbWJlclR5cGVzKHR5cGUpOwogCWlmIChtZW1iZXJMaW5rID09IE5VTEwpIHsKIAkgICAgeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKIAkJIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZSwgIgotCQkidW5pb24gc2ltcGxlIHR5cGUgXCIlc1wiIGhhcyBubyBtZW1iZXIgdHlwZXNcbiIsCisJCSJ1bmlvbiBzaW1wbGUgdHlwZSAnJXMnIGhhcyBubyBtZW1iZXIgdHlwZXNcbiIsCiAJCXR5cGUtPm5hbWUsIE5VTEwpOwogCSAgICByZXQgPSAtMTsKIAl9IAogCWlmIChyZXQgPT0gMCkgewogCSAgICB3aGlsZSAobWVtYmVyTGluayAhPSBOVUxMKSB7CiAJCWN0eHQtPnR5cGUgPSBtZW1iZXJMaW5rLT50eXBlOwotCQlyZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZShjdHh0LCB2YWx1ZSwgMCwgMSk7CisJCXJldCA9IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlKGN0eHQsIHZhbHVlLCAwLCAxLCAxKTsKIAkJaWYgKChyZXQgPD0gMCkgfHwgKHJldCA9PSAwKSkKIAkJICAgIGJyZWFrOwkgICAgCiAJCW1lbWJlckxpbmsgPSBtZW1iZXJMaW5rLT5uZXh0OwogCSAgICB9ICAgICAKLQkgICAgaWYgKHJldCA+IDApIHsKLQkJcmV0ID0gWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8zOwotCQlpZiAoZmlyZUVycm9ycykgewotCQkgICAgeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIAotCQkJWE1MX1NDSEVNQVZfQ1ZDX0RBVEFUWVBFX1ZBTElEXzFfMl8zLAotCQkJIlRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4iLAotCQkJTlVMTCwgTlVMTCk7Ci0JCX0JCQkgICAgCi0JICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgewotCQl4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAotCQkgICAgIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZSwgIgotCQkgICAgInZhbGlkYXRpbmcgbWVtYmVycyBvZiB1bmlvbiBzaW1wbGUgdHlwZSBcIiVzXCJcbiIsCi0JCSAgICB0eXBlLT5uYW1lLCBOVUxMKTsKLQkgICAgfQotCX0KLQkvKgotCSogQXBwbHkgZmFjZXRzIChwYXR0ZXJuLCBlbnVtZXJhdGlvbikuCi0JKi8KLQlpZiAoKHJldCA9PSAwKSAmJiAoYXBwbHlGYWNldHMpICYmIAotCSAgICAodHlwZS0+ZmFjZXRTZXQgIT0gTlVMTCkpIHsKLQkgICAgeG1sU2NoZW1hVHlwZVB0ciBhbnlTaW1wbGVUeXBlOwotCSAgICAvKiAKLQkgICAgKiBDaGVjayBmYWNldHMuIEJlIHN1cmUgdG8gcGFzcyB0aGUgYnVpbHQtaW4gdHlwZSAodGhlCi0JICAgICogc2ltcGxlIHVyLXR5cGUgaW4gdGhpcyBjYXNlKSB0byB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0c0ludGVybmFsLgotCSAgICAqLwkgICAgCSAgICAJICAgIAotCSAgICBhbnlTaW1wbGVUeXBlID0gdHlwZS0+YmFzZVR5cGU7Ci0JICAgIHdoaWxlIChhbnlTaW1wbGVUeXBlLT50eXBlICE9IFhNTF9TQ0hFTUFfVFlQRV9CQVNJQykKLQkJYW55U2ltcGxlVHlwZSA9IGFueVNpbXBsZVR5cGUtPmJhc2VUeXBlOwotCSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0c0ludGVybmFsKGN0eHQsIGFueVNpbXBsZVR5cGUsIAotCQl0eXBlLT5mYWNldFNldCwgdmFsdWUsIGZpcmVFcnJvcnMpOworCSAgICBjdHh0LT50eXBlID0gdHlwZTsKIAkgICAgaWYgKHJldCA8IDApIHsKIAkJeG1sU2NoZW1hVkVycihjdHh0LCBjdHh0LT5jdXIsIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKIAkJICAgICJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVUeXBlVmFsdWUsICIKLQkJICAgICJ2YWxpZGF0aW5nIGZhY2V0cyBvZiB1bmlvbiBzaW1wbGUgdHlwZSBcIiVzXCJcbiIsCisJCSAgICAidmFsaWRhdGluZyBtZW1iZXJzIG9mIHVuaW9uIHNpbXBsZSB0eXBlICclcydcbiIsCiAJCSAgICB0eXBlLT5uYW1lLCBOVUxMKTsKIAkgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CiAJCXJldCA9IFhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMzsKLQkJaWYgKGZpcmVFcnJvcnMpIHsKLQkJICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCAKLQkJCVhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMSwKLQkJCSJUaGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuIiwKLQkJCU5VTEwsIE5VTEwpOwotCQl9CisJCWlmIChmaXJlRXJyb3JzKQorCQkgICAgeG1sU2NoZW1hVlNpbXBsZVR5cGVFcnIoY3R4dCwgcmV0LCBjdHh0LT5jdXIsIHZhbHVlLCB0eXBlKTsKKwkgICAgfQorCX0KKwkvKgorCSogQXBwbHkgZmFjZXRzIChwYXR0ZXJuLCBlbnVtZXJhdGlvbikuCQorCSovCisJaWYgKChyZXQgPT0gMCkgJiYgKGFwcGx5RmFjZXRzKSAmJiAodHlwZS0+ZmFjZXRTZXQgIT0gTlVMTCkpIHsKKwkgICAgaW50IG13czsKKwkgICAgLyoKKwkgICAgKiBUaGUgbm9ybWFsaXphdGlvbiBiZWhhdmlvciBvZiC3dW5pb263IHR5cGVzIGlzIGNvbnRyb2xsZWQgYnkgCisJICAgICogdGhlIHZhbHVlIG9mIHdoaXRlU3BhY2Ugb24gdGhhdCBvbmUgb2YgdGhlILdtZW1iZXJUeXBlc7cgCisJICAgICogYWdhaW5zdCB3aGljaCB0aGUgt3VuaW9utyBpcyBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkLiAKKwkgICAgKi8JCSAgICAKKwkgICAgaWYgKG5vcm1WYWx1ZSAhPSBOVUxMKSB7CisJCXhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCisJCSAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlLCAiCisJCSAgICAidGhlIHZhbHVlIHdhcyBhbHJlYWR5IG5vcm1hbGl6ZWQgZm9yIHRoZSB1bmlvbiBzaW1wbGUgIgorCQkgICAgInR5cGUgJyVzJy5cbiIsIHR5cGUtPm5hbWUsIE5VTEwpOworCSAgICB9CisJICAgIG13cyA9IHhtbFNjaGVtYUdldFdoaXRlU3BhY2VGYWNldFZhbHVlKG1lbWJlckxpbmstPnR5cGUpOworCSAgICBpZiAobXdzID4gY3R4dC0+dmFsdWVXUykgeworCQlpZiAobXdzID09IFhNTF9TQ0hFTUFTX1ZBTF9XVFNQX0NPTExBUFNFKQorCQkgICAgbm9ybVZhbHVlID0geG1sU2NoZW1hQ29sbGFwc2VTdHJpbmcodmFsdWUpOworCQllbHNlCisJCSAgICBub3JtVmFsdWUgPSB4bWxTY2hlbWFXaGl0ZVNwYWNlUmVwbGFjZSh2YWx1ZSk7CisJCWlmIChub3JtVmFsdWUgIT0gTlVMTCkKKwkJICAgIHZhbHVlID0gKGNvbnN0IHhtbENoYXIgKikgbm9ybVZhbHVlOworCSAgICB9CisKKwkgICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVGYWNldHNJbnRlcm5hbChjdHh0LCB0eXBlLCAKKwkJdmFsdWUsIDAsIGZpcmVFcnJvcnMpOworCSAgICBpZiAocmV0IDwgMCkgeworCQl4bWxTY2hlbWFWRXJyKGN0eHQsIGN0eHQtPmN1ciwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAorCQkgICAgIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZSwgIgorCQkgICAgInZhbGlkYXRpbmcgZmFjZXRzIG9mIHVuaW9uIHNpbXBsZSB0eXBlICclcydcbiIsCisJCSAgICB0eXBlLT5uYW1lLCBOVUxMKTsKKwkgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisJCXJldCA9IFhNTF9TQ0hFTUFWX0NWQ19EQVRBVFlQRV9WQUxJRF8xXzJfMzsKKwkJLyoKKwkJaWYgKGZpcmVFcnJvcnMpCisJCSAgICB4bWxTY2hlbWFWU2ltcGxlVHlwZUVycihjdHh0LCByZXQsIGN0eHQtPmN1ciwgdmFsdWUsIHR5cGUpOworCQkqLwogCSAgICB9CQogCX0KLSAgICB9ICAgIAorICAgIH0gICAgICAgICAgIAogICAgIGN0eHQtPnR5cGUgPSB0eXBlOworICAgIGN0eHQtPnZhbHVlV1MgPSB3dHNwOworICAgIGlmIChub3JtVmFsdWUgIT0gTlVMTCkKKwl4bWxGcmVlKG5vcm1WYWx1ZSk7CiAgICAgcmV0dXJuIChyZXQpOwogfQogCkBAIC0xMDA1NSw3ICsxMTgzOCw3IEBACiAJKiBpbmZvcm1hdGlvbiBpdGVtIFtjaGlsZHJlbl0uCiAJKi8KICAgICAgICAgeG1sU2NoZW1hVkVycihjdHh0LCBub2RlLCBYTUxfU0NIRU1BVl9DVkNfVFlQRV8zXzFfMiwKLQkJICAgICAgIkVsZW1lbnQgXCIlc1wiIG11c3QgaGF2ZSBubyBlbGVtZW50IGNoaWxkcmVuLlxuIiwKKwkJICAgICAgIkVsZW1lbnQgJyVzJyBtdXN0IGhhdmUgbm8gZWxlbWVudCBjaGlsZHJlbi5cbiIsCiAJCSAgICAgIG5vZGUtPm5hbWUsIE5VTEwpOwogICAgICAgICByZXR1cm4gKC0xKTsKICAgICB9CkBAIC0xMDA3Myw3ICsxMTg1Niw3IEBACiAgICAgICAgICAgICAgIChhdHRyLT5uYW1lLCBCQURfQ0FTVCAibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIpKSkpIHsKICAgICAgICAgICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgCiAJCVhNTF9TQ0hFTUFWX0NWQ19UWVBFXzNfMV8xLAotCQkiVGhlIGF0dHJpYnV0ZXMgb2YgZWxlbWVudCBcIiVzXCIgbXVzdCBiZSBlbXB0eSwgZXhjZXB0aW5nICIKKwkJIlRoZSBhdHRyaWJ1dGVzIG9mIGVsZW1lbnQgJyVzJyBtdXN0IGJlIGVtcHR5LCBleGNlcHRpbmcgIgogCQkidGhvc2Ugd2hvc2UgbmFtZXNwYWNlIG5hbWUgaXMgaWRlbnRpY2FsIHRvICIKIAkJImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIGFuZCB3aG9zZSBsb2NhbCAiCiAJCSJuYW1lIGlzIG9uZSBvZiB0eXBlLCBuaWwsIHNjaGVtYUxvY2F0aW9uIG9yICIKQEAgLTEwMDg0LDcgKzExODY3LDcgQEAKIAlhdHRyID0gYXR0ci0+bmV4dDsKICAgICB9CiAgICAgdmFsdWUgPSB4bWxOb2RlR2V0Q29udGVudChjaGlsZCk7Ci0gICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVUeXBlVmFsdWUoY3R4dCwgdmFsdWUsIDEsIDEpOworICAgIHJldCA9IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlKGN0eHQsIHZhbHVlLCAxLCAxLCAxKTsKICAgICBpZiAodmFsdWUgIT0gTlVMTCkKICAgICAgICAgeG1sRnJlZSh2YWx1ZSk7CiAKQEAgLTEwMTA3LDcgKzExODkwLDYgQEAKIHhtbFNjaGVtYVZhbGlkYXRlRWxlbWVudFR5cGUoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQsIHhtbE5vZGVQdHIgbm9kZSkKIHsKICAgICB4bWxOb2RlUHRyIGNoaWxkOwotICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZTsKICAgICB4bWxSZWdFeGVjQ3R4dFB0ciBvbGRyZWdleHA7ICAgICAgICAvKiBjb250IG1vZGVsIG9mIHRoZSBwYXJlbnQgKi8KICAgICB4bWxTY2hlbWFFbGVtZW50UHRyIGRlY2w7CiAgICAgaW50IHJldDsKQEAgLTEwMTI2LDE5ICsxMTkwOCwxOSBAQAogICAgIG9sZHJlZ2V4cCA9IGN0eHQtPnJlZ2V4cDsKIAogICAgIGNoaWxkID0gY3R4dC0+bm9kZTsKLSAgICB0eXBlID0gY3R4dC0+dHlwZTsKKyAgICBkZWNsID0gKHhtbFNjaGVtYUVsZW1lbnRQdHIpIGN0eHQtPnR5cGU7CiAKLSAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHR5cGUgPT0gTlVMTCkpIHsKKyAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKGRlY2wgPT0gTlVMTCkpIHsKICAgICAgICAgeG1sU2NoZW1hVkVycihjdHh0LCBub2RlLCBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCiAJCSAgICAgICJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hVmFsaWRhdGVFbGVtZW50VHlwZVxuIiwKIAkJICAgICAgbm9kZS0+bmFtZSwgTlVMTCk7CiAgICAgICAgIHJldHVybiAoLTEpOwogICAgIH0KICAgICBpZiAoY2hpbGQgPT0gTlVMTCkgewotICAgICAgICBpZiAodHlwZS0+bWluT2NjdXJzID4gMCkgeworICAgICAgICBpZiAoZGVjbC0+bWluT2NjdXJzID4gMCkgewogICAgICAgICAgICAgeG1sU2NoZW1hVkVycihjdHh0LCBub2RlLCBYTUxfU0NIRU1BU19FUlJfTUlTU0lORywKIAkgICAgCQkgICJFbGVtZW50ICVzOiBtaXNzaW5nIGNoaWxkICVzXG4iLAotCQkJICBub2RlLT5uYW1lLCB0eXBlLT5uYW1lKTsKKwkJCSAgbm9kZS0+bmFtZSwgZGVjbC0+bmFtZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIChjdHh0LT5lcnIpOwogICAgIH0KQEAgLTEwMTQ2LDI3ICsxMTkyOCwzNyBAQAogICAgIC8qCiAgICAgICogVmVyaWZ5IHRoZSBlbGVtZW50IG1hdGNoZXMKICAgICAgKi8KLSAgICBpZiAoIXhtbFN0ckVxdWFsKGNoaWxkLT5uYW1lLCB0eXBlLT5uYW1lKSkgeworICAgIGlmICgheG1sU3RyRXF1YWwoY2hpbGQtPm5hbWUsIGRlY2wtPm5hbWUpKSB7CiAgICAgICAgIHhtbFNjaGVtYVZFcnIzKGN0eHQsIG5vZGUsIFhNTF9TQ0hFTUFTX0VSUl9XUk9OR0VMRU0sCiAJCSAgICAgICAiRWxlbWVudCAlczogbWlzc2luZyBjaGlsZCAlcyBmb3VuZCAlc1xuIiwKLQkJICAgICAgIG5vZGUtPm5hbWUsIHR5cGUtPm5hbWUsIGNoaWxkLT5uYW1lKTsKKwkJICAgICAgIG5vZGUtPm5hbWUsIGRlY2wtPm5hbWUsIGNoaWxkLT5uYW1lKTsKICAgICAgICAgcmV0dXJuIChjdHh0LT5lcnIpOwogICAgIH0KICAgICAvKgogICAgICAqIFZlcmlmeSB0aGUgYXR0cmlidXRlcwogICAgICAqLwotICAgIAorICAgIC8qCisgICAgKiBUT0RPOiBUaGlzICJhdHRyVG9wIiB0aGluZyBpcyBub3QgbmVlZGVkIGFueSBtb3JlLgorICAgICovICAgIAogICAgIGF0dHJzID0gY3R4dC0+YXR0cjsgICAgCi0gICAgYXR0clRvcCA9IGN0eHQtPmF0dHJUb3A7Ci0gICAgCi0gICAgeG1sU2NoZW1hUmVnaXN0ZXJBdHRyaWJ1dGVzKGN0eHQsIGNoaWxkLT5wcm9wZXJ0aWVzKTsgICAgICAgICAgICAKKyAgICBhdHRyVG9wID0gY3R4dC0+YXR0clRvcDsgICAgCisgICAgeG1sU2NoZW1hUmVnaXN0ZXJBdHRyaWJ1dGVzKGN0eHQsIGNoaWxkLT5wcm9wZXJ0aWVzKTsgICAgIAorICAgIHhtbFNjaGVtYVZhbGlkYXRlQXR0cmlidXRlcyhjdHh0LCBjaGlsZCwgZGVjbC0+c3VidHlwZXMpOworICAgIGlmIChjdHh0LT5hdHRyICE9IE5VTEwpCisJeG1sU2NoZW1hRnJlZUF0dHJpYnV0ZVN0YXRlcyhjdHh0LT5hdHRyKTsKKyAgICBjdHh0LT5hdHRyID0gYXR0cnM7ICAgIAorICAgIGN0eHQtPmF0dHJUb3AgPSBhdHRyVG9wOwogCiAgICAgLyoKICAgICAgKiBWZXJpZnkgdGhlIGVsZW1lbnQgY29udGVudCByZWN1cnNpdmVseQotICAgICAqLwotICAgIGRlY2wgPSAoeG1sU2NoZW1hRWxlbWVudFB0cikgdHlwZTsKKyAgICAgKi8gICAKICAgICBvbGRyZWdleHAgPSBjdHh0LT5yZWdleHA7Ci0gICAgaWYgKGRlY2wtPmNvbnRNb2RlbCAhPSBOVUxMKSB7CisgICAgLyoKKyAgICAqIEZJWE1FIFRPRE86IFRoaXMgb25lIGNyZWF0ZXMgYSByZWdleHAgZXZlbiBpZiBubyBjb250ZW50CisgICAgKiBtb2RlbCB3YXMgZGVmaW5lZC4gU29tZWhvdyAtPmNvbnRNb2RlbCBpcyBhbHdheXMgbm90IE5VTEwKKyAgICAqIGZvciBjb21wbGV4IHR5cGVzLCBldmVuIGlmIHRoZXkgYXJlIGVtcHR5LgorICAgICovICAgIAorICAgIGlmIChkZWNsLT5jb250TW9kZWwgIT0gTlVMTCkgewkKICAgICAgICAgY3R4dC0+cmVnZXhwID0geG1sUmVnTmV3RXhlY0N0eHQoZGVjbC0+Y29udE1vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeG1sUmVnRXhlY0NhbGxiYWNrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hVmFsaWRhdGVDYWxsYmFjaywgY3R4dCk7CkBAIC0xMDE3NCw4ICsxMTk2Niw3IEBACiAgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCAiPT09PT4gJXNcbiIsIG5vZGUtPm5hbWUpOwogI2VuZGlmCiAgICAgfQotICAgIHhtbFNjaGVtYVZhbGlkYXRlVHlwZShjdHh0LCBjaGlsZCwgKHhtbFNjaGVtYUVsZW1lbnRQdHIpIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnN1YnR5cGVzKTsKKyAgICB4bWxTY2hlbWFWYWxpZGF0ZVR5cGUoY3R4dCwgY2hpbGQsIGRlY2wsIGRlY2wtPnN1YnR5cGVzKTsKIAogICAgIGlmIChkZWNsLT5jb250TW9kZWwgIT0gTlVMTCkgewogICAgICAgICByZXQgPSB4bWxSZWdFeGVjUHVzaFN0cmluZyhjdHh0LT5yZWdleHAsIE5VTEwsIE5VTEwpOwpAQCAtMTAxODQsMTMgKzExOTc1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiPT09PT4gJXMgOiAlZFxuIiwgbm9kZS0+bmFtZSwgcmV0KTsKICNlbmRpZgogICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVNfRVJSX0VMRU1DT05ULAotCSAgICAJCSAgIkVsZW1lbnQgJXMgY29udGVudCBjaGVjayBmYWlsZWRcbiIsCi0JCQkgIG5vZGUtPm5hbWUsIE5VTEwpOworICAgICAgICAgICAgeG1sU2NoZW1hVkN1c3RvbUVycihjdHh0LCBYTUxfU0NIRU1BU19FUlJfRUxFTUNPTlQsCisJCW5vZGUsICJUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZCIsIE5VTEwpOwogICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVNfRVJSX0VMRU1DT05ULAotCSAgICAJCSAgIkVsZW1lbnQgJXMgY29udGVudCBjaGVjayBmYWlsdXJlXG4iLAotCQkJICBub2RlLT5uYW1lLCBOVUxMKTsKKwkgICAgeG1sU2NoZW1hVkN1c3RvbUVycihjdHh0LCBYTUxfU0NIRU1BU19FUlJfRUxFTUNPTlQsCisJCW5vZGUsICJUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZCIsIE5VTEwpOwogI2lmZGVmIERFQlVHX0NPTlRFTlQKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LApAQCAtMTAyMDEsMTcgKzExOTkwLDkgQEAKICAgICAgICAgfQogICAgICAgICB4bWxSZWdGcmVlRXhlY0N0eHQoY3R4dC0+cmVnZXhwKTsKICAgICB9Ci0gICAgLyoKLSAgICAgKiBWZXJpZnkgdGhhdCBhbGwgYXR0cmlidXRlcyB3ZXJlIFNjaGVtYXMtdmFsaWRhdGVkCi0gICAgICovCi0gICAgeG1sU2NoZW1hQ2hlY2tBdHRyaWJ1dGVzKGN0eHQsIG5vZGUpOwotICAgIGlmIChjdHh0LT5hdHRyICE9IE5VTEwpCi0JeG1sU2NoZW1hRnJlZUF0dHJpYnV0ZVN0YXRlcyhjdHh0LT5hdHRyKTsKLSAgICBjdHh0LT5hdHRyID0gYXR0cnM7ICAgIAotICAgIGN0eHQtPmF0dHJUb3AgPSBhdHRyVG9wOwogICAgIGN0eHQtPnJlZ2V4cCA9IG9sZHJlZ2V4cDsKICAgICBjdHh0LT5ub2RlID0gY2hpbGQ7Ci0gICAgY3R4dC0+dHlwZSA9IHR5cGU7CisgICAgY3R4dC0+dHlwZSA9ICh4bWxTY2hlbWFUeXBlUHRyKSBkZWNsOwogICAgIHJldHVybiAoY3R4dC0+ZXJyKTsKIH0KIApAQCAtMTAzMTYsNiArMTIwOTcsOTAgQEAKICNlbmRpZgogCiAvKioKKyAqIHhtbFNjaGVtYVZhbGlkYXRlQW55SW50ZXJuYWw6CisgKiBAY3R4dDogIGEgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dAorICogQG5vZGU6ICB0aGUgdG9wIG5vZGUuCisgKgorICogUmVwcmVzZW50cyB0aGUgcmVjdXJzaXZlIHBvcnRpb24gb2YgeG1sU2NoZW1hVmFsaWRhdGVBbnkuIE5vdAorICogaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBvdGhlciBmdW5jdGlvbnMuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBlbGVtZW50IGlzIHZhbGlkLCBhIHBvc2l0aXZlIGVycm9yIGNvZGUKKyAqIG51bWJlciBvdGhlcndpc2UgYW5kIC0xIGluIGNhc2Ugb2YgYW4gaW50ZXJuYWwgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK3htbFNjaGVtYVZhbGlkYXRlQW55SW50ZXJuYWwoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQsIAorCQkJICAgICB4bWxTY2hlbWFXaWxkY2FyZFB0ciB3aWxkLCAKKwkJCSAgICAgeG1sTm9kZVB0ciBub2RlKQoreyAgICAgICAgCisgICAgY29uc3QgeG1sQ2hhciAqdXJpOworICAgIGludCByZXQgPSAwOworICAgIHhtbE5vZGVQdHIgY2hpbGQ7CisgICAgCisgICAgaWYgKHdpbGQtPnByb2Nlc3NDb250ZW50cyAhPSBYTUxfU0NIRU1BU19BTllfU0tJUCkgeworCXhtbFNjaGVtYUVsZW1lbnRQdHIgZGVjbCA9IE5VTEw7CisKKwlpZiAobm9kZS0+bnMgIT0gTlVMTCkKKwkgICAgZGVjbCA9IHhtbEhhc2hMb29rdXAzKGN0eHQtPnNjaGVtYS0+ZWxlbURlY2wsCisJICAgIG5vZGUtPm5hbWUsIG5vZGUtPm5zLT5ocmVmLCBOVUxMKTsKKwllbHNlIAorCSAgICBkZWNsID0geG1sSGFzaExvb2t1cDMoY3R4dC0+c2NoZW1hLT5lbGVtRGVjbCwgbm9kZS0+bmFtZSwgTlVMTCwgTlVMTCk7CisJaWYgKGRlY2wgIT0gTlVMTCkgewkJICAgIAorCSAgICBjdHh0LT5ub2RlID0gbm9kZTsJCisJICAgIGN0eHQtPnR5cGUgPSAoeG1sU2NoZW1hVHlwZVB0cikgZGVjbDsKKwkgICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVFbGVtZW50VHlwZShjdHh0LCBub2RlLT5wYXJlbnQpOworCSAgICBpZiAocmV0IDwgMCkgewkJCisJCXhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAorCQkgICAgIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFWYWxpZGF0ZUFueUludGVybmFsLCAiCisJCSAgICAidmFsaWRhdGluZyBhbiBlbGVtZW50IGluIHRoZSBjb250ZXh0IG9mIGEgd2lsZGNhcmQuIiwKKwkJICAgIE5VTEwsIE5VTEwpOworCSAgICB9IGVsc2UgaWYgKHJldCA+IDApCisJCXJldHVybiAocmV0KTsKKwl9IGVsc2UgaWYgKHdpbGQtPnByb2Nlc3NDb250ZW50cyA9PSBYTUxfU0NIRU1BU19BTllfU1RSSUNUKSB7CisJICAgIC8qIFRPRE86IENoYW5nZSB0byBwcm9wZXIgZXJyb3IgY29kZS4gKi8KKwkgICAgeG1sU2NoZW1hVldpbGRjYXJkRXJyKGN0eHQsIFhNTF9TQ0hFTUFTX0VSUl9VTkRFQ0xBUkVERUxFTSwKKwkJbm9kZSwgd2lsZCwgIk5vIG1hdGNoaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24gZm91bmQuIik7CisJICAgIHJldHVybiAoY3R4dC0+ZXJyKTsKKwl9CisgICAgfQorICAgIGlmIChub2RlLT5jaGlsZHJlbiAhPSBOVUxMKSB7CSAgIAorCWNoaWxkID0gbm9kZS0+Y2hpbGRyZW47CisJZG8geworCSAgICBpZiAoY2hpbGQtPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkgeworCQlpZiAoY2hpbGQtPm5zICE9IE5VTEwpCisJCSAgICB1cmkgPSBjaGlsZC0+bnMtPmhyZWY7CisJCWVsc2UKKwkJICAgIHVyaSA9IE5VTEw7CisJCWlmICh4bWxTY2hlbWFNYXRjaGVzV2lsZGNhcmROcyh3aWxkLCB1cmkpID09IDApIHsKKwkJICAgIHhtbFNjaGVtYVZXaWxkY2FyZEVycihjdHh0LCBYTUxfU0NIRU1BU19FUlJfRUxFTUNPTlQsCisJCQljaGlsZCwgd2lsZCwgCisJCQkiVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudCBpcyBub3QgYWxsb3dlZC4iKTsKKwkJICAgIHJldHVybiAoY3R4dC0+ZXJyKTsgIAorCQl9CisJCXJldCA9IHhtbFNjaGVtYVZhbGlkYXRlQW55SW50ZXJuYWwoY3R4dCwgd2lsZCwgY2hpbGQpOworCQlpZiAocmV0ICE9IDApCisJCSAgICByZXR1cm4gKHJldCk7CQkKKwkgICAgfQorCSAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OworCX0gd2hpbGUgIChjaGlsZCAhPSBOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuICgwKTsKK30KKworLyoqCisgKiB4bWxTY2hlbWFWYWxpZGF0ZUFueToKKyAqIEBjdHh0OiAgYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0CisgKgorICogUmV0dXJucyAwIGlmIHRoZSBlbGVtZW50IGlzIHZhbGlkLCBhIHBvc2l0aXZlIGVycm9yIGNvZGUKKyAqIG51bWJlciBvdGhlcndpc2UgYW5kIC0xIGluIGNhc2Ugb2YgYW4gaW50ZXJuYWwgb3IgQVBJIGVycm9yLgorICovCitzdGF0aWMgaW50Cit4bWxTY2hlbWFWYWxpZGF0ZUFueSh4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dCkKK3sgICAgICAgCisgICAgcmV0dXJuKHhtbFNjaGVtYVZhbGlkYXRlQW55SW50ZXJuYWwoY3R4dCwgCisJICAgIGN0eHQtPnR5cGUtPmF0dHJpYnV0ZVdpbGRjYXJkLCBjdHh0LT5jdXIpKTsgICAgCit9CisKKy8qKgogICogeG1sU2NoZW1hVmFsaWRhdGVDb21wbGV4VHlwZToKICAqIEBjdHh0OiAgYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0CiAgKiBAbm9kZTogIHRoZSB0b3Agbm9kZS4KQEAgLTEwMzQxLDYgKzEyMjA2LDcgQEAKICAgICB4bWxOb2RlUHRyIGNoaWxkOwogICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZTsKICAgICBpbnQgcmV0ID0gMDsKKyAgICBjb25zdCB4bWxDaGFyICpuc1VyaTsKIAogICAgIGNoaWxkID0gY3R4dC0+bm9kZTsKICAgICB0eXBlID0gY3R4dC0+dHlwZTsKQEAgLTEwMzgzLDkgKzEyMjQ5LDEzIEBACiAgICAgICAgIGNhc2UgWE1MX1NDSEVNQV9DT05URU5UX01JWEVEOiAgICAgICAgICAgICAgCiAJICAgIHdoaWxlIChjaGlsZCAhPSBOVUxMKSB7CQkKIAkJaWYgKGNoaWxkLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpIHsKLQkJICAgIHJldCA9IHhtbFJlZ0V4ZWNQdXNoU3RyaW5nKGN0eHQtPnJlZ2V4cCwKLQkJCWNoaWxkLT5uYW1lLCBjaGlsZCk7Ci0jaWZkZWYgREVCVUdfQVVUT01BVEEKKwkJICAgIGlmIChjaGlsZC0+bnMgIT0gTlVMTCkKKwkJCW5zVXJpID0gY2hpbGQtPm5zLT5ocmVmOworCQkgICAgZWxzZQorCQkJbnNVcmkgPSBOVUxMOworCQkgICAgcmV0ID0geG1sUmVnRXhlY1B1c2hTdHJpbmcyKGN0eHQtPnJlZ2V4cCwKKwkJCWNoaWxkLT5uYW1lLCBuc1VyaSwgY2hpbGQpOwkKKyNpZmRlZiBERUJVR19BVVRPTUFUQQkJICAgIAogCQkgICAgaWYgKHJldCA8IDApCiAJCQl4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKIAkJCSIgIC0tPiAlcyBFcnJvclxuIiwgY2hpbGQtPm5hbWUpOwpAQCAtMTA0NDMsOCArMTIzMTMsOCBAQAogCQkgIChiYXNlLT50eXBlICE9IFhNTF9TQ0hFTUFfVFlQRV9CQVNJQykpKSkgewogCQl4bWxTY2hlbWFWRXJyKGN0eHQsIG5vZGUsIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKIAkJICAgICJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hVmFsaWRhdGVDb21wbGV4VHlwZSwgIgotCQkgICAgIkVsZW1lbnQgXCIlc1wiOiB0aGUgYmFzZSB0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nICIKLQkJICAgICJjb21wbGV4IHR5cGUgXCIlc1wiIGlzIG5vdCBhIHVzZXIgZGVyaXZlZCBvciBhICIKKwkJICAgICJFbGVtZW50ICclcyc6IFRoZSBiYXNlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgIgorCQkgICAgImNvbXBsZXggdHlwZSAnJXMnIGlzIG5vdCBhIHVzZXIgZGVyaXZlZCBvciBhICIKIAkJICAgICJidWlsdC1pbiBzaW1wbGUgdHlwZS5cbiIsCiAJCSAgICBub2RlLT5uYW1lLCB0eXBlLT5uYW1lKTsKIAkJcmV0dXJuICgtMSk7CkBAIC0xMDQ3OCw3ICsxMjM0OCw3IEBACiAJCWVsc2UKIAkJICAgIHZhbHVlID0geG1sTm9kZUdldENvbnRlbnQobm9kZSk7IAogCQljdHh0LT50eXBlID0gYmFzZTsKLQkJcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVUeXBlVmFsdWUoY3R4dCwgdmFsdWUsIDEsIDEpOworCQlyZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZShjdHh0LCB2YWx1ZSwgMSwgMSwgMSk7CiAJCWN0eHQtPnR5cGUgPSB0eXBlOwkgICAgCiAJCWlmIChyZXQgPiAwKSB7CiAJCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIG5vZGUsIFhNTF9TQ0hFTUFWX0NWQ19DT01QTEVYX1RZUEVfMl8yLApAQCAtMTA0ODksOCArMTIzNTksOCBAQAogCQl9IGVsc2UgaWYgKHJldCA8IDApIHsKIAkJICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgbm9kZSwgWE1MX1NDSEVNQVNfRVJSX0lOVEVSTkFMLAogCQkJIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFWYWxpZGF0ZUNvbXBsZXhUeXBlLCAiCi0JCQkiRWxlbWVudCBcIiVzXCI6IGVycm9yIHdoaWxlIHZhbGlkYXRpbmcgY2hhcmFjdGVyICIKLQkJCSJjb250ZW50IGFnYWluc3QgY29tcGxleCB0eXBlIFwiJXNcIi5cbiIsCisJCQkiRWxlbWVudCAnJXMnOiBFcnJvciB3aGlsZSB2YWxpZGF0aW5nIGNoYXJhY3RlciAiCisJCQkiY29udGVudCBhZ2FpbnN0IGNvbXBsZXggdHlwZSAnJXMnLlxuIiwKIAkJCW5vZGUtPm5hbWUsIHR5cGUtPm5hbWUpOwogCQkgICAgcmV0dXJuICgtMSk7CiAJCX0KQEAgLTEwNTA0LDIwICsxMjM3NCw5IEBACiAJCSogYXJlIHVzZWQsIG9yIGlmIHRoZSBmYWNldHMsIGRlZmluZWQgYnkgdGhpcyBjb21wbGV4IHR5cGUsCiAJCSogYXJlIHRvIGJlIHVzZWQgb25seS4gVGhpcyBoZXJlIGFwcGxpZXMgYm90aCBmYWNldCBzZXRzLgogCQkqLwkgICAgCi0JCXdoaWxlIChiYXNlLT50eXBlICE9IFhNTF9TQ0hFTUFfVFlQRV9CQVNJQykKLQkJICAgIGJhc2UgPSBiYXNlLT5iYXNlVHlwZTsKLQkJaWYgKGJhc2UgPT0gTlVMTCkgewotCQkgICAgeG1sU2NoZW1hVkVycihjdHh0LCBub2RlLCBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCi0JCQkiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlQ29tcGxleFR5cGUsICIKLQkJCSJFbGVtZW50IFwiJXNcIjogZXJyb3Igd2hpbGUgdmFsaWRhdGluZyBjaGFyYWN0ZXIgIgotCQkJImNvbnRlbnQgYWdhaW5zdCBjb21wbGV4IHR5cGUgXCIlc1wiOyBmYWlsZWQgdG8gIgotCQkJImNvbXB1dGUgdGhlIGJ1aWx0LWluIHNpbXBsZSB0eXBlIGZvciBmYWNldCAiCi0JCQkidmFsaWRhdGlvbi5cbiIsCi0JCQlub2RlLT5uYW1lLCB0eXBlLT5uYW1lKTsKLQkJICAgIHJldHVybiAoLTEpOwotCQl9Ci0JCXJldCA9IHhtbFNjaGVtYVZhbGlkYXRlRmFjZXRzSW50ZXJuYWwoY3R4dCwgYmFzZSwgCi0JCSAgICB0eXBlLT5mYWNldFNldCwgdmFsdWUsIDEpOworCisJCXJldCA9IHhtbFNjaGVtYVZhbGlkYXRlRmFjZXRzSW50ZXJuYWwoY3R4dCwgdHlwZSwgCisJCSAgICB2YWx1ZSwgMCwgMSk7CiAJCWlmIChyZXQgPiAwKSB7CiAJCSAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIG5vZGUsIFhNTF9TQ0hFTUFWX0NWQ19DT01QTEVYX1RZUEVfMl8yLAogCQkJIlRoZSBjaGFyYWN0ZXIgdmFsdWUgIgpAQCAtMTA1MjcsOCArMTIzODYsOCBAQAogCQl9IGVsc2UgaWYgKHJldCA8IDApIHsKIAkJICAgIHhtbFNjaGVtYVZFcnIoY3R4dCwgY3R4dC0+Y3VyLCBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCiAJCQkiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVZhbGlkYXRlQ29tcGxleFR5cGUsICIKLQkJCSJFbGVtZW50IFwiJXNcIjogZXJyb3Igd2hpbGUgdmFsaWRhdGluZyBjaGFyYWN0ZXIgIgotCQkJImNvbnRlbnQgYWdhaW5zdCBjb21wbGV4IHR5cGUgXCIlc1wiOyBmYWlsZWQgdG8gIgorCQkJIkVsZW1lbnQgJyVzJzogRXJyb3Igd2hpbGUgdmFsaWRhdGluZyBjaGFyYWN0ZXIgIgorCQkJImNvbnRlbnQgYWdhaW5zdCBjb21wbGV4IHR5cGUgJyVzJzsgZmFpbGVkIHRvICIKIAkJCSJhcHBseSBmYWNldHMuXG4iLAogCQkJdHlwZS0+bmFtZSwgTlVMTCk7CiAJCX0KQEAgLTEwNTM4LDM0ICsxMjM5NywxMSBAQAogCSAgICAvKiBUT0RPOiBmYWNldHMgKi8KIAkgICAgYnJlYWs7CiAJfQotCS8qCi0gICAgICAgIGNhc2UgWE1MX1NDSEVNQV9DT05URU5UX1NJTVBMRTp7CQkgCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUtPnN1YnR5cGVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3R4dC0+dHlwZSA9IHR5cGUtPnN1YnR5cGVzOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFWYWxpZGF0ZUNvbXBsZXhUeXBlKGN0eHQsIG5vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodHlwZS0+YmFzZVR5cGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBjdHh0LT50eXBlID0gdHlwZS0+YmFzZVR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVZhbGlkYXRlQ29tcGxleFR5cGUoY3R4dCwgbm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotCQkqIFJlbW92ZWQgZHVlIHRvIGNoYW5nZXMgb2YgYXR0cmlidXRlIHZhbGlkYXRpb246Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUtPmF0dHJpYnV0ZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFWYWxpZGF0ZUF0dHJpYnV0ZXMoY3R4dCwgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPmF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgIH0KLQkJKgotICAgICAgICAgICAgICAgIGN0eHQtPnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCX0KLQkqLwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVE9ETyB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmltcGxlbWVudGVkIGNvbnRlbnQgdHlwZSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPmNvbnRlbnRUeXBlKTsKICAgICB9Ci0gICAgaWYgKHR5cGUtPnR5cGUgPT0gWE1MX1NDSEVNQV9UWVBFX0NPTVBMRVgpIHsKLQl4bWxTY2hlbWFWYWxpZGF0ZUF0dHJpYnV0ZXMoY3R4dCwgbm9kZSwgdHlwZSk7Ci0gICAgfQogICAgIGN0eHQtPmN1ciA9IG5vZGU7CiAgICAgcmV0dXJuIChjdHh0LT5lcnIpOwogfQpAQCAtMTA1ODQsMjAgKzEyNDIwLDE2IEBACiBzdGF0aWMgaW50CiB4bWxTY2hlbWFWYWxpZGF0ZUNvbnRlbnQoeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQsIHhtbE5vZGVQdHIgbm9kZSkKIHsKLSAgICB4bWxOb2RlUHRyIGNoaWxkOwogICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZTsKIAotICAgIGNoaWxkID0gY3R4dC0+bm9kZTsKICAgICB0eXBlID0gY3R4dC0+dHlwZTsKICAgICBjdHh0LT5jdXIgPSBub2RlOwogCi0gICAgY3R4dC0+Y3VyID0gbm9kZTsKLQogICAgIHN3aXRjaCAodHlwZS0+dHlwZSkgewogICAgICAgICBjYXNlIFhNTF9TQ0hFTUFfVFlQRV9BTlk6Ci0gICAgICAgICAgICAvKiBBbnkgdHlwZSB3aWxsIGRvIGl0LCBmaW5lICovCi0gICAgICAgICAgICBUT0RPICAgICAgICAgICAgICAgIC8qIGhhbmRsZSByZWN1cnNpdml0eSAqLwotICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICB4bWxTY2hlbWFWYWxpZGF0ZUFueShjdHh0KTsKKwkgICAgY3R4dC0+dHlwZSA9IHR5cGU7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBYTUxfU0NIRU1BX1RZUEVfQ09NUExFWDoKICAgICAgICAgICAgIHhtbFNjaGVtYVZhbGlkYXRlQ29tcGxleFR5cGUoY3R4dCwgbm9kZSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTEwNzc3LDYgKzEyNjA5LDE1IEBACiAgKgogICogVmFsaWRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gZWxlbWVudC4KICAqCisgKiAxLiBFeGlzdGVudCwgaW52YWxpZCBhdHRyaWJ1dGVzIGFyZSByZXBvcnRlZCBpbiB0aGUgZm9ybSAKKyAqICAgICJwcmVmaXg6bG9jYWxOYW1lIi4gCisgKiAgICBSZWFzb246IHJlYWRhYmlsaXR5IC0gaXQgaXMgZWFzaWVyIHRvIGZpbmQgdGhlIGFjdHVhbCBYTUwgCisgKiAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgYXR0cmlidXRlcyBRTmFtZS4KKyAqIDIuIE1pc3NpbmcgYXR0cmlidXRlcyBhcmUgcmVwb3J0ZWQgaW4gdGhlIGZvcm0gCisgKiAgICB7IlVSSSIsICJsb2NhbE5hbWUifS4KKyAqICAgIFRoaXMgaXMgbmVjZXNzYXJ5LCBzaW5jZSB0aGUgdGhlIHByZWZpeCBuZWVkIG5vdCB0byBiZSBkZWNsYXJlZAorICogICAgYXQgYWxsLCBhbmQgdGh1cyBpcyBub3QgY29tcHV0YWJsZS4KKyAqCiAgKiBSZXR1cm5zIDAgaWYgdGhlIGVsZW1lbnQgaXMgc2NoZW1hcyB2YWxpZCwgYSBwb3NpdGl2ZSBlcnJvciBjb2RlCiAgKiAgICAgbnVtYmVyIG90aGVyd2lzZSBhbmQgLTEgaW4gY2FzZSBvZiBpbnRlcm5hbCBvciBBUEkgZXJyb3IuCiAgKi8KQEAgLTEwNzk0LDE5ICsxMjYzNSwxNyBAQAogI2lmZGVmIERFQlVHX0FUVFJfVkFMSURBVElPTgogICAgIGludCByZWR1bmRhbnQgPSAwOwogI2VuZGlmCi0gICAgaWYgKHR5cGUtPnR5cGUgIT0gWE1MX1NDSEVNQV9UWVBFX0NPTVBMRVgpIHsKLQl4bWxTY2hlbWFWRXJyKGN0eHQsIGVsZW0sIFhNTF9TQ0hFTUFTX0VSUl9JTlRFUk5BTCwKLQkJCSAgICAgICJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hVmFsaWRhdGVBdHRyaWJ1dGVzOiAiCi0JCQkgICAgICAiZ2l2ZW4gdHlwZSBcIiVzXCJpcyBub3QgYSBjb21wbGV4VHlwZVxuIiwKLQkJCSAgICAgIHR5cGUtPm5hbWUsIE5VTEwpOwotCXJldHVybigtMSk7Ci0gICAgfSAgICAKIAotICAgIGlmICgodHlwZS0+YXR0cmlidXRlVXNlcyA9PSBOVUxMKSAmJiAodHlwZS0+YXR0cmlidXRlV2lsZGNhcmQgPT0gTlVMTCkpCi0gICAgICAgIHJldHVybiAoMCk7Ci0KKyAgICAvKiAKKyAgICAqIE5PVEU6IFRoaXMgb25lIHVzZXMgYXR0ci0+c3VidHlwZXMgdG8gZ2V0IHRoZSB0eXBlIGRlY2wuIC0gcmVnYXJkbGVzcworICAgICogaWYgd2UgaGF2ZSBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIG9yIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KKyAgICAqLyAgICAKKyAgICAvKgorICAgICogQWxsb3cgYWxsIGF0dHJpYnV0ZXMgaWYgdGhlIHR5cGUgaXMgYW55VHlwZS4KKyAgICAqLworICAgIGlmICh0eXBlID09IHhtbFNjaGVtYUdldEJ1aWx0SW5UeXBlKFhNTF9TQ0hFTUFTX0FOWVRZUEUpKQorCXJldHVybiAoMCk7CiAgICAgYXR0clVzZSA9IHR5cGUtPmF0dHJpYnV0ZVVzZXM7Ci0KICAgICB3aGlsZSAoYXR0clVzZSAhPSBOVUxMKSB7CiAgICAgICAgIGZvdW5kID0gMDsgICAgCiAJYXR0ckRlY2wgPSBhdHRyVXNlLT5hdHRyOwpAQCAtMTA4NzksMTkgKzEyNzE4LDE0IEBACiAgICAgICAgICAgICBpZiAoYXR0ckRlY2wtPnN1YnR5cGVzID09IE5VTEwpIHsKIAkJY3VyU3RhdGUtPnN0YXRlID0gWE1MX1NDSEVNQVNfQVRUUl9UWVBFX05PVF9SRVNPTFZFRDsKIAkJY3VyU3RhdGUtPmRlY2wgPSBhdHRyRGVjbDsKLQkJLyogCi0JCSAqIFRoaXMgY291bGQgYmUgcHV0IGludG8gInhtbFNjaGVtYUNoZWNrQXR0cmlidXRlcyIgYXMgd2VsbCwgYnV0Ci0JCSAqIHNpbmNlIGl0IHJlcG9ydHMgYW4gaW50ZXJuYWwgZXJyb3IsIGl0IGJldHRlciBzdGF5cyBoZXJlIHRvIGVhc2UKLQkJICogZGVidWdnaW5nLgotCQkgKi8KICAgICAgICAgICAgICAgICB4bWxTY2hlbWFWRXJyKGN0eHQsICh4bWxOb2RlUHRyKSBhdHRyLCBYTUxfU0NIRU1BU19FUlJfSU5URVJOQUwsCiAJCQkgICAgICAiSW50ZXJuYWwgZXJyb3I6IGF0dHJpYnV0ZSAlcyB0eXBlIG5vdCByZXNvbHZlZFxuIiwKIAkJCSAgICAgIGF0dHItPm5hbWUsIE5VTEwpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdmFsdWUgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhlbGVtLT5kb2MsIGF0dHItPmNoaWxkcmVuLCAxKTsKLQkgICAgY3R4dC0+dHlwZSA9IGF0dHJEZWNsLT5zdWJ0eXBlczsKLSAgICAgICAgICAgIHJldCA9IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlKGN0eHQsIHZhbHVlLCAwLCAxKTsKKwkgICAgY3R4dC0+dHlwZSA9IGF0dHJEZWNsLT5zdWJ0eXBlczsJICAgIAorICAgICAgICAgICAgcmV0ID0geG1sU2NoZW1hVmFsaWRhdGVTaW1wbGVUeXBlVmFsdWUoY3R4dCwgdmFsdWUsIDEsIDEsIDEpOwogCSAgICBjdHh0LT50eXBlID0gdHlwZTsKICAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgCiAJCWN1clN0YXRlLT5zdGF0ZSA9IFhNTF9TQ0hFTUFTX0FUVFJfSU5WQUxJRF9WQUxVRTsgICAJCQkJCkBAIC0xMDk0Miw3ICsxMjc3Niw3IEBACiAJICAgIGN0eHQtPmF0dHJUb3AtPm5leHQgPSByZXFBdHRyU3RhdGVzOwogCX0KIAljdHh0LT5hdHRyVG9wID0gcmVxQXR0clN0YXRlc1RvcDsKLSAgICAgICAgICAgIH0KKyAgICB9CiAgICAgLyoKICAgICAqIFByb2Nlc3Mgd2lsZGNhcmRzLgogICAgICovCkBAIC0xMTAwMyw4ICsxMjgzNywxMCBAQAogCQkJICAgIGF0dHItPm5hbWUsIG5zVVJJKTsJCQogCQkJaWYgKGF0dHJEZWNsICE9IE5VTEwpIHsKIAkJCSAgICB2YWx1ZSA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGVsZW0tPmRvYywgYXR0ci0+Y2hpbGRyZW4sIDEpOworCQkJICAgIGN0eHQtPmN1ciA9ICh4bWxOb2RlUHRyKSBhdHRyOworCQkJICAgIGN0eHQtPm5vZGUgPSBhdHRyLT5jaGlsZHJlbjsKIAkJCSAgICBjdHh0LT50eXBlID0gYXR0ckRlY2wtPnN1YnR5cGVzOwotCQkJICAgIHJldCA9IHhtbFNjaGVtYVZhbGlkYXRlU2ltcGxlVHlwZVZhbHVlKGN0eHQsIHZhbHVlLCAxLCAxKTsKKwkJCSAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZVNpbXBsZVR5cGVWYWx1ZShjdHh0LCB2YWx1ZSwgMSwgMSwgMSk7CiAJCQkgICAgY3R4dC0+dHlwZSA9IHR5cGU7CiAJCQkgICAgaWYgKHJldCAhPSAwKSAKIAkJCQljdXJTdGF0ZS0+c3RhdGUgPSBYTUxfU0NIRU1BU19BVFRSX0lOVkFMSURfVkFMVUU7ICAgCQkJCQpAQCAtMTEwMjYsNiArMTI4NjIsMjQgQEAKIAkgICAgY3VyU3RhdGUgPSBjdXJTdGF0ZS0+bmV4dDsKICAgICAgICAgfQogICAgIH0KKyAgICAvKgorICAgICogUmVwb3J0IG1pc3NpbmcgYW5kIGlsbGVnYWwgYXR0cmlidXRlcy4KKyAgICAqLworICAgIGlmIChjdHh0LT5hdHRyICE9IE5VTEwpIHsKKwljdXJTdGF0ZSA9IGN0eHQtPmF0dHI7CisJd2hpbGUgKChjdXJTdGF0ZSAhPSBOVUxMKSAmJiAoY3VyU3RhdGUgIT0gY3R4dC0+YXR0clRvcC0+bmV4dCkpIHsKKwkgICAgaWYgKGN1clN0YXRlLT5zdGF0ZSAhPSBYTUxfU0NIRU1BU19BVFRSX0NIRUNLRUQpIHsKKwkJYXR0ciA9IGN1clN0YXRlLT5hdHRyOworCQlpZiAoY3VyU3RhdGUtPnN0YXRlID09IFhNTF9TQ0hFTUFTX0FUVFJfTUlTU0lORykKKwkJICAgIHhtbFNjaGVtYVZNaXNzaW5nQXR0ckVycihjdHh0LCBlbGVtLCBjdXJTdGF0ZS0+ZGVjbCk7CQkgICAgCisJCWVsc2UgaWYgKChjdXJTdGF0ZS0+c3RhdGUgPT0gWE1MX1NDSEVNQVNfQVRUUl9VTktOT1dOKSB8fAorCQkgICAgLyogVE9ETzogInByb2hpYml0ZWQiIHdvbid0IGV2ZXIgYmUgdG91Y2hlZCEuICovCisJCSAgICAoY3VyU3RhdGUtPnN0YXRlID09IFhNTF9TQ0hFTUFTX0FUVFJfUFJPSElCSVRFRCkpCisJCSAgICB4bWxTY2hlbWFWSWxsZWdhbEF0dHJFcnIoY3R4dCwgYXR0cik7CisJICAgIH0JCisJICAgIGN1clN0YXRlID0gY3VyU3RhdGUtPm5leHQ7CisJfSAgCisgICAgfQogI2lmZGVmIERFQlVHX0FUVFJfVkFMSURBVElPTgogICAgIGlmIChyZWR1bmRhbnQpCiAJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCkBAIC0xMTA1OSw3ICsxMjkxMywxMCBAQAogICAgICAgICBlbGVtRGVjbCA9IHhtbEhhc2hMb29rdXAzKGN0eHQtPnNjaGVtYS0+ZWxlbURlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS0+bmFtZSwgTlVMTCwgTlVMTCk7CiAgICAgfQotICAgIC8qIFRoaXMgb25lIGlzIGNhbGxlZCBieSB4bWxTY2hlbWFWYWxpZGF0ZURvY3VtZW50IG9ubHkuICovCisgICAgLyogCisgICAgKiBUaGlzIG9uZSBpcyBjYWxsZWQgYnkgeG1sU2NoZW1hVmFsaWRhdGVEb2N1bWVudCBhbmQgCisgICAgKiB4bWxTY2hlbWFWYWxpZGF0ZUFueUluZXJuYWwuIAorICAgICovCiAKICAgICAvKgogICAgICAqIDMuMy40IDogMQpAQCAtMTEwODAsNiArMTI5MzcsMTEgQEAKICAgICBhdHRycyA9IGN0eHQtPmF0dHI7CiAgICAgYXR0clRvcCA9IGN0eHQtPmF0dHJUb3A7CiAgICAgeG1sU2NoZW1hUmVnaXN0ZXJBdHRyaWJ1dGVzKGN0eHQsIGVsZW0tPnByb3BlcnRpZXMpOworICAgIHhtbFNjaGVtYVZhbGlkYXRlQXR0cmlidXRlcyhjdHh0LCBlbGVtLCBlbGVtRGVjbC0+c3VidHlwZXMpOworICAgIGlmIChjdHh0LT5hdHRyICE9IE5VTEwpCisJeG1sU2NoZW1hRnJlZUF0dHJpYnV0ZVN0YXRlcyhjdHh0LT5hdHRyKTsKKyAgICBjdHh0LT5hdHRyID0gYXR0cnM7CisgICAgY3R4dC0+YXR0clRvcCA9IGF0dHJUb3A7CiAgICAgLyoKICAgICAgKiBWZXJpZnkgdGhlIGVsZW1lbnQgY29udGVudCByZWN1cnNpdmVseQogICAgICAqLwpAQCAtMTEwOTgsMTYgKzEyOTYwLDE0IEBACiAgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgIj09PT0+ICVzIDogJWRcbiIsIGVsZW0tPm5hbWUsIHJldCk7CiAjZW5kaWYKLSAgICAgICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgICAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIGVsZW0sIFhNTF9TQ0hFTUFTX0VSUl9FTEVNQ09OVCwKLQkgICAgCQkgICJFbGVtZW50ICVzIGNvbnRlbnQgY2hlY2sgZmFpbGVkXG4iLAotCQkJICBlbGVtLT5uYW1lLCBOVUxMKTsKKwlpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIHhtbFNjaGVtYVZDdXN0b21FcnIoY3R4dCwgWE1MX1NDSEVNQVNfRVJSX0VMRU1DT05ULAorCQllbGVtLCAiVGhlIGVsZW1lbnQgY29udGVudCBpcyBub3QgdmFsaWQiLCBOVUxMKTsKICAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICB4bWxTY2hlbWFWRXJyKGN0eHQsIGVsZW0sIFhNTF9TQ0hFTUFTX0VSUl9FTEVNQ09OVCwKLQkgICAgCQkgICJFbGVtZW50ICVzIGNvbnRlbnQgY2hlY2sgZmFpbGVkXG4iLAotCQkJICBlbGVtLT5uYW1lLCBOVUxMKTsKKwkgICAgeG1sU2NoZW1hVkN1c3RvbUVycihjdHh0LCBYTUxfU0NIRU1BU19FUlJfRUxFTUNPTlQsCisJCWVsZW0sICJUaGUgZWxlbWVudCBjb250ZW50IGlzIG5vdCB2YWxpZCIsIE5VTEwpOwogI2lmZGVmIERFQlVHX0NPTlRFTlQKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWxlbWVudCAlcyBjb250ZW50IGNoZWNrIHN1Y2NlZWRlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLT5uYW1lKTsKQEAgLTExMTE2LDE1ICsxMjk3Niw2IEBACiAgICAgICAgIH0KICAgICAgICAgeG1sUmVnRnJlZUV4ZWNDdHh0KGN0eHQtPnJlZ2V4cCk7CiAgICAgfQotICAgIC8qCi0gICAgICogVmVyaWZ5IHRoYXQgYWxsIGF0dHJpYnV0ZXMgd2VyZSBTY2hlbWFzLXZhbGlkYXRlZAotICAgICAqLwotICAgIHhtbFNjaGVtYUNoZWNrQXR0cmlidXRlcyhjdHh0LCBlbGVtKTsKLSAgICBpZiAoY3R4dC0+YXR0ciAhPSBOVUxMKQotCXhtbFNjaGVtYUZyZWVBdHRyaWJ1dGVTdGF0ZXMoY3R4dC0+YXR0cik7Ci0gICAgY3R4dC0+YXR0ciA9IGF0dHJzOwotICAgIGN0eHQtPmF0dHJUb3AgPSBhdHRyVG9wOwotCiAgICAgcmV0dXJuIChjdHh0LT5lcnIpOwogfQogCkBAIC0xMTIxOCwyOSArMTMwNjksOSBAQAogICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgIH0KICAgICBtZW1zZXQocmV0LCAwLCBzaXplb2YoeG1sU2NoZW1hVmFsaWRDdHh0KSk7Ci0gICAgcmV0LT5zY2hlbWEgPSBzY2hlbWE7Ci0gICAgLyogCi0gICAgICogUmVtb3ZlZCBkdWUgdG8gY2hhbmdlcyBvZiB0aGUgYXR0cmlidXRlIHN0YXRlIGxpc3QuCi0gICAgKi8KLSAgICAvKiByZXQtPmF0dHJOciA9IDA7ICovCi0gICAgLyogcmV0LT5hdHRyTWF4ID0gMTA7ICovCi0gICAgLyogcmV0LT5hdHRyQmFzZSA9IE5VTEw7ICovCisgICAgcmV0LT5zY2hlbWEgPSBzY2hlbWE7ICAgIAogICAgIHJldC0+YXR0clRvcCA9IE5VTEw7CiAgICAgcmV0LT5hdHRyID0gTlVMTDsKLSAgICAvKiAKLSAgICAgKiBSZW1vdmVkIGR1ZSB0byBjaGFuZ2VzIG9mIHRoZSBhdHRyaWJ1dGUgc3RhdGUgbGlzdC4KLSAgICAgKgotICAgIHJldC0+YXR0ciA9ICh4bWxTY2hlbWFBdHRyU3RhdGVQdHIpIHhtbE1hbGxvYyhyZXQtPmF0dHJNYXggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHhtbFNjaGVtYUF0dHJTdGF0ZSkpOwotICAgIGlmIChyZXQtPmF0dHIgPT0gTlVMTCkgewotICAgICAgICB4bWxTY2hlbWFWRXJyTWVtb3J5KE5VTEwsICJhbGxvY2F0aW5nIHZhbGlkYXRpb24gY29udGV4dCIsIE5VTEwpOwotICAgICAgICBmcmVlKHJldCk7Ci0gICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgfQotICAgIG1lbXNldChyZXQtPmF0dHIsIDAsIHJldC0+YXR0ck1heCAqIHNpemVvZih4bWxTY2hlbWFBdHRyU3RhdGUpKTsKLSAgICAqLwotCiAgICAgcmV0dXJuIChyZXQpOwogfQogCmRpZmYgLS1naXQgYS94bWxzY2hlbWFzdHlwZXMuYyBiL3htbHNjaGVtYXN0eXBlcy5jCmluZGV4IGQ1MDNjOWEuLmYwNzUxOGIgMTAwNjQ0Ci0tLSBhL3htbHNjaGVtYXN0eXBlcy5jCisrKyBiL3htbHNjaGVtYXN0eXBlcy5jCkBAIC00NTYsNyArNDU2LDcgQEAKIH0KIAogLyoqCi0gKiB4bWxTY2hlbWFJc0J1aWx0SW5UeXBlRmFjZXQ6CisgKiB4bWxTY2hlbWFHZXRCdWlsdEluVHlwZToKICAqIEB0eXBlOiB0aGUgYnVpbHQtaW4gdHlwZQogICogQGZhY2V0VHlwZTogIHRoZSBmYWNldCB0eXBlCiAgKgpAQCAtNzM4LDEwICs3MzgsOCBAQAogICogeG1sU2NoZW1hR2V0QnVpbHRJbkxpc3RTaW1wbGVUeXBlSXRlbVR5cGU6CiAgKiBAdHlwZTogdGhlIGJ1aWx0LWluIHNpbXBsZSB0eXBlLgogICoKLSAqIExvb2t1cCBhIHR5cGUgaW4gdGhlIGJ1aWx0LWluIHR5cGUgZGF0YWJhc2UgaGllcmFyY2h5IG9mIFhNTCBTY2hlbWEKLSAqIFBhcnQgMjpEYXRhdHlwZXMuCi0gKgotICogUmV0dXJucyB0aGUgdHlwZSBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCisgKiBSZXR1cm5zIHRoZSBpdGVtIHR5cGUgb2YgQHR5cGUgYXMgZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gZGF0YXR5cGUKKyAqIGhpZXJhcmNoeSBvZiBYTUwgU2NoZW1hIFBhcnQgMjogRGF0YXR5cGVzLCBvciBOVUxMIGluIGNhc2Ugb2YgYW4gZXJyb3IuCiAgKi8KIHhtbFNjaGVtYVR5cGVQdHIKIHhtbFNjaGVtYUdldEJ1aWx0SW5MaXN0U2ltcGxlVHlwZUl0ZW1UeXBlKHhtbFNjaGVtYVR5cGVQdHIgdHlwZSkKQEAgLTE3NDcsNyArMTc0NSw4IEBACiAKICAgICBzd2l0Y2ggKHR5cGUtPmJ1aWx0SW5UeXBlKSB7CiAgICAgICAgIGNhc2UgWE1MX1NDSEVNQVNfVU5LTk9XTjoKLSAgICAgICAgICAgIGlmICh0eXBlID09IHhtbFNjaGVtYVR5cGVBbnlTaW1wbGVUeXBlRGVmKQorICAgICAgICAgICAgaWYgKCh0eXBlID09IHhtbFNjaGVtYVR5cGVBbnlTaW1wbGVUeXBlRGVmKSB8fAorCQkodHlwZSA9PSB4bWxTY2hlbWFUeXBlQW55VHlwZURlZikpCiAgICAgICAgICAgICAgICAgZ290byByZXR1cm4wOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgY2FzZSBYTUxfU0NIRU1BU19TVFJJTkc6CkBAIC0yNjk5LDYgKzI2OTgsMjYgQEAKIH0KIAogLyoqCisgKiB4bWxTY2hlbWFWYWxQcmVkZWZUeXBlTm9kZU5vTm9ybToKKyAqIEB0eXBlOiB0aGUgcHJlZGVmaW5lZCB0eXBlCisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBjaGVjaworICogQHZhbDogIHRoZSByZXR1cm4gY29tcHV0ZWQgdmFsdWUKKyAqIEBub2RlOiAgdGhlIG5vZGUgY29udGFpbmluZyB0aGUgdmFsdWUKKyAqCisgKiBDaGVjayB0aGF0IGEgdmFsdWUgY29uZm9ybXMgdG8gdGhlIGxleGljYWwgc3BhY2Ugb2YgdGhlIHByZWRlZmluZWQgdHlwZS4KKyAqIGlmIHRydWUgYSB2YWx1ZSBpcyBjb21wdXRlZCBhbmQgcmV0dXJuZWQgaW4gQHZhbC4KKyAqIFRoaXMgb25lIGRvZXMgYXBwbHkgYW55IG5vcm1hbGl6YXRpb24gdG8gdGhlIHZhbHVlLgorICoKKyAqIFJldHVybnMgMCBpZiB0aGlzIHZhbGlkYXRlcywgYSBwb3NpdGl2ZSBlcnJvciBjb2RlIG51bWJlciBvdGhlcndpc2UKKyAqICAgICAgICAgYW5kIC0xIGluIGNhc2Ugb2YgaW50ZXJuYWwgb3IgQVBJIGVycm9yLgorICovCitpbnQKK3htbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlTm9Ob3JtKHhtbFNjaGVtYVR5cGVQdHIgdHlwZSwgY29uc3QgeG1sQ2hhciAqdmFsdWUsCisJCQkJIHhtbFNjaGVtYVZhbFB0ciAqdmFsLCB4bWxOb2RlUHRyIG5vZGUpIHsKKyAgICByZXR1cm4oeG1sU2NoZW1hVmFsQXRvbWljVHlwZSh0eXBlLCB2YWx1ZSwgdmFsLCBub2RlLCAxKSk7Cit9CisKKy8qKgogICogeG1sU2NoZW1hVmFsaWRhdGVQcmVkZWZpbmVkVHlwZToKICAqIEB0eXBlOiB0aGUgcHJlZGVmaW5lZCB0eXBlCiAgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBjaGVjawpAQCAtMzcyMiw2ICszNzQxLDE1IEBACiAgICAgcmV0dXJuKHJldCk7CiB9CiAKK3Vuc2lnbmVkIGxvbmcKK3htbFNjaGVtYUdldEZhY2V0VmFsdWVBc1VMb25nKHhtbFNjaGVtYUZhY2V0UHRyIGZhY2V0KQoreworICAgIC8qCisgICAgKiBUT0RPOiBDaGVjayBpZiB0aGlzIGlzIGEgZGVjaW1hbC4KKyAgICAqLworICAgIHJldHVybiAoKHVuc2lnbmVkIGxvbmcpIGZhY2V0LT52YWwtPnZhbHVlLmRlY2ltYWwubG8pOworfQorCiAvKioKICAqIHhtbFNjaGVtYVZhbGlkYXRlTGlzdFNpbXBsZVR5cGVGYWNldDoKICAqIEBmYWNldDogIHRoZSBmYWNldCB0byBjaGVjawpAQCAtMzc0NiwxNyArMzc3NCwyMCBAQAogICAgICovCiAgICAgaWYgKGZhY2V0LT50eXBlID09IFhNTF9TQ0hFTUFfRkFDRVRfTEVOR1RIKSB7CiAJaWYgKGFjdHVhbExlbiAhPSBmYWNldC0+dmFsLT52YWx1ZS5kZWNpbWFsLmxvKSB7Ci0JICAgICpleHBlY3RlZExlbiA9IGZhY2V0LT52YWwtPnZhbHVlLmRlY2ltYWwubG87CisJICAgIGlmIChleHBlY3RlZExlbiAhPSAwKQorCQkqZXhwZWN0ZWRMZW4gPSBmYWNldC0+dmFsLT52YWx1ZS5kZWNpbWFsLmxvOwogCSAgICByZXR1cm4gKFhNTF9TQ0hFTUFWX0NWQ19MRU5HVEhfVkFMSUQpOwogCX0JCiAgICAgfSBlbHNlIGlmIChmYWNldC0+dHlwZSA9PSBYTUxfU0NIRU1BX0ZBQ0VUX01JTkxFTkdUSCkgewogCWlmIChhY3R1YWxMZW4gPCBmYWNldC0+dmFsLT52YWx1ZS5kZWNpbWFsLmxvKSB7Ci0JICAgICAqZXhwZWN0ZWRMZW4gPSBmYWNldC0+dmFsLT52YWx1ZS5kZWNpbWFsLmxvOworCSAgICBpZiAoZXhwZWN0ZWRMZW4gIT0gMCkKKwkJKmV4cGVjdGVkTGVuID0gZmFjZXQtPnZhbC0+dmFsdWUuZGVjaW1hbC5sbzsKIAkgICAgcmV0dXJuIChYTUxfU0NIRU1BVl9DVkNfTUlOTEVOR1RIX1ZBTElEKTsKIAl9CiAgICAgfSBlbHNlIGlmIChmYWNldC0+dHlwZSA9PSBYTUxfU0NIRU1BX0ZBQ0VUX01BWExFTkdUSCkgewogCWlmIChhY3R1YWxMZW4gPiBmYWNldC0+dmFsLT52YWx1ZS5kZWNpbWFsLmxvKSB7Ci0JICAgICAqZXhwZWN0ZWRMZW4gPSBmYWNldC0+dmFsLT52YWx1ZS5kZWNpbWFsLmxvOworCSAgICBpZiAoZXhwZWN0ZWRMZW4gIT0gMCkKKwkJKmV4cGVjdGVkTGVuID0gZmFjZXQtPnZhbC0+dmFsdWUuZGVjaW1hbC5sbzsKIAkgICAgcmV0dXJuIChYTUxfU0NIRU1BVl9DVkNfTUFYTEVOR1RIX1ZBTElEKTsKIAl9CiAgICAgfSBlbHNlCkBAIC0zNzcxLDYgKzM4MDIsODQgQEAKIAogLyoqCiAgKiB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0OgorICogQHR5cGU6ICB0aGUgYnVpbHQtaW4gdHlwZQorICogQGZhY2V0OiAgdGhlIGZhY2V0IHRvIGNoZWNrCisgKiBAdmFsdWU6ICB0aGUgbGV4aWNhbCByZXByLiBvZiB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkCisgKiBAdmFsOiAgdGhlIHByZWNvbXB1dGVkIHZhbHVlCisgKiBAbGVuZ3RoOiB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgdmFsdWUKKyAqCisgKiBDaGVja2EgYSB2YWx1ZSBhZ2FpbnN0IGEgImxlbmd0aCIsICJtaW5MZW5ndGgiIGFuZCAibWF4TGVuZ3RoIiAKKyAqIGZhY2V0OyBzZXRzIEBsZW5ndGggdG8gdGhlIGNvbXB1dGVkIGxlbmd0aCBvZiBAdmFsdWUuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSB2YWx1ZSBpcyB2YWxpZCwgYSBwb3NpdGl2ZSBlcnJvciBjb2RlCisgKiBvdGhlcndpc2UgYW5kIC0xIGluIGNhc2Ugb2YgYW4gaW50ZXJuYWwgb3IgQVBJIGVycm9yLgorICovCitpbnQKK3htbFNjaGVtYVZhbGlkYXRlTGVuZ3RoRmFjZXQoeG1sU2NoZW1hVHlwZVB0ciB0eXBlLCAKKwkJCSAgICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQsCisJCQkgICAgIGNvbnN0IHhtbENoYXIgKnZhbHVlLAorCQkJICAgICB4bWxTY2hlbWFWYWxQdHIgdmFsLAorCQkJICAgICB1bnNpZ25lZCBsb25nICpsZW5ndGgpICAKK3sKKyAgICB1bnNpZ25lZCBpbnQgbGVuID0gMDsKKworICAgICpsZW5ndGggPSAwOworICAgIGlmICgoZmFjZXQtPnR5cGUgIT0gWE1MX1NDSEVNQV9GQUNFVF9MRU5HVEgpICYmCisJKGZhY2V0LT50eXBlICE9IFhNTF9TQ0hFTUFfRkFDRVRfTUFYTEVOR1RIKSAmJgorCShmYWNldC0+dHlwZSAhPSBYTUxfU0NIRU1BX0ZBQ0VUX01JTkxFTkdUSCkpCisJcmV0dXJuICgtMSk7CisJCisgICAgaWYgKChmYWNldC0+dmFsID09IE5VTEwpIHx8CisJKChmYWNldC0+dmFsLT50eXBlICE9IFhNTF9TQ0hFTUFTX0RFQ0lNQUwpICYmCisJIChmYWNldC0+dmFsLT50eXBlICE9IFhNTF9TQ0hFTUFTX05OSU5URUdFUikpIHx8CisJKGZhY2V0LT52YWwtPnZhbHVlLmRlY2ltYWwuZnJhYyAhPSAwKSkgeworCXJldHVybigtMSk7CisgICAgfQorICAgIGlmICgodmFsICE9IE5VTEwpICYmICh2YWwtPnR5cGUgPT0gWE1MX1NDSEVNQVNfSEVYQklOQVJZKSkKKwlsZW4gPSB2YWwtPnZhbHVlLmhleC50b3RhbDsKKyAgICBlbHNlIGlmICgodmFsICE9IE5VTEwpICYmICh2YWwtPnR5cGUgPT0gWE1MX1NDSEVNQVNfQkFTRTY0QklOQVJZKSkKKwlsZW4gPSB2YWwtPnZhbHVlLmJhc2U2NC50b3RhbDsKKyAgICBlbHNlIHsKKwlzd2l0Y2ggKHR5cGUtPmJ1aWx0SW5UeXBlKSB7CisJICAgIGNhc2UgWE1MX1NDSEVNQVNfSURSRUY6CisJICAgIGNhc2UgWE1MX1NDSEVNQVNfTk9STVNUUklORzoKKwkgICAgY2FzZSBYTUxfU0NIRU1BU19UT0tFTjoKKwkgICAgY2FzZSBYTUxfU0NIRU1BU19MQU5HVUFHRToKKwkgICAgY2FzZSBYTUxfU0NIRU1BU19OTVRPS0VOOgorCSAgICBjYXNlIFhNTF9TQ0hFTUFTX05BTUU6CisJICAgIGNhc2UgWE1MX1NDSEVNQVNfTkNOQU1FOgorCSAgICBjYXNlIFhNTF9TQ0hFTUFTX0lEOgorCQlsZW4gPSB4bWxTY2hlbWFOb3JtTGVuKHZhbHVlKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgWE1MX1NDSEVNQVNfU1RSSU5HOgorCSAgICAvKgorCSAgICAqIEZJWE1FOiBXaGF0IGV4YWN0bHkgdG8gZG8gd2l0aCBhbnlVUkk/CisJICAgICovCisJICAgIGNhc2UgWE1MX1NDSEVNQVNfQU5ZVVJJOgorCQlpZiAodmFsdWUgIT0gTlVMTCkKKwkJICAgIGxlbiA9IHhtbFVURjhTdHJsZW4odmFsdWUpOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJVE9ETworCX0KKyAgICB9CisgICAgKmxlbmd0aCA9ICh1bnNpZ25lZCBsb25nKSBsZW47CisgICAgaWYgKGZhY2V0LT50eXBlID09IFhNTF9TQ0hFTUFfRkFDRVRfTEVOR1RIKSB7CisJaWYgKGxlbiAhPSBmYWNldC0+dmFsLT52YWx1ZS5kZWNpbWFsLmxvKQorCSAgICByZXR1cm4oWE1MX1NDSEVNQVZfQ1ZDX0xFTkdUSF9WQUxJRCk7CisgICAgfSBlbHNlIGlmIChmYWNldC0+dHlwZSA9PSBYTUxfU0NIRU1BX0ZBQ0VUX01JTkxFTkdUSCkgeworCWlmIChsZW4gPCBmYWNldC0+dmFsLT52YWx1ZS5kZWNpbWFsLmxvKQorCSAgICByZXR1cm4oWE1MX1NDSEVNQVZfQ1ZDX01JTkxFTkdUSF9WQUxJRCk7CisgICAgfSBlbHNlIHsKKwlpZiAobGVuID4gZmFjZXQtPnZhbC0+dmFsdWUuZGVjaW1hbC5sbykKKwkgICAgcmV0dXJuKFhNTF9TQ0hFTUFWX0NWQ19NQVhMRU5HVEhfVkFMSUQpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKDApOworfQorCisvKioKKyAqIHhtbFNjaGVtYVZhbGlkYXRlRmFjZXQ6CiAgKiBAYmFzZTogIHRoZSBiYXNlIHR5cGUKICAqIEBmYWNldDogIHRoZSBmYWNldCB0byBjaGVjawogICogQHZhbHVlOiAgdGhlIGxleGljYWwgcmVwciBvZiB0aGUgdmFsdWUgdG8gdmFsaWRhdGUK