ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggY2Y3YjQ4ZS4uODUzNjNhOCAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTMgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NjA3Mjggb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NjA4MDUgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk2MDcyODogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBNYW55IGZpeGVkIHRvIHRoZSBwYWxldHRlIG1hbmFnZW1lbnQuCi0JLSBET1MgcmVhbC1tb2RlIG1lbW9yeSBlbXVsYXRpb24uCitXSEFUJ1MgTkVXIHdpdGggV2luZS05NjA4MDU6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gTW9yZSBtZXRhZmlsZSBmZWF0dXJlcy4KKwktIFNvbWUgbW9yZSBXaW4zMiBjb2RlLgogCS0gTG90cyBvZiBidWcgZml4ZXMuCiAKIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KQEAgLTE2LDEwICsxNiwxMCBAQAogdGhlIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGF0IHRoZSBmdHAgc2l0ZXMuICBUaGUgc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZQogZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKIAotICAgIHN1bnNpdGUudW5jLmVkdTovcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjA3MjgudGFyLmd6Ci0gICAgdHN4LTExLm1pdC5lZHU6L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTYwNzI4LnRhci5negotICAgIGZ0cC5pbmZvbWFnaWMuY29tOi9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTYwNzI4LnRhci5negotICAgIGFyaXMuY29tOi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MDcyOC50YXIuZ3oKKyAgICBzdW5zaXRlLnVuYy5lZHU6L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTYwODA1LnRhci5negorICAgIHRzeC0xMS5taXQuZWR1Oi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MDgwNS50YXIuZ3oKKyAgICBmdHAuaW5mb21hZ2ljLmNvbTovcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MDgwNS50YXIuZ3oKKyAgICBhcmlzLmNvbTovcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjA4MDUudGFyLmd6CiAKIEl0IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIGFueSBzaXRlIHRoYXQgbWlycm9ycyB0c3gtMTEgb3Igc3Vuc2l0ZS4KIApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IDQzYTNjOGYuLjdjZTBhOTYgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSwxMjYgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N1biBBdWcgIDQgMTg6MTg6NDggMTk5NiAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CisKKwkqIFtjb250cm9scy9zY3JvbGwuY10KKwlBdHRlbXB0ZWQgdG8gaW1wbGVtZW50IHVuZG9jdW1lbnRlZCBzY3JvbGwtYmFyIG1lc3NhZ2VzLgorCisJKiBbdG9vbHMvYnVpbGQuY10gW2luY2x1ZGUvY2FsbGJhY2suaF0gW3dpbmRvd3Mvd2lucHJvYy5jXQorCUNhbGxUbzE2XyogZnVuY3Rpb25zIG5vdyBnZXQgRFMgZnJvbSB0aGUgcHJldmlvdXMgMTYtYml0IHN0YWNrZnJhbWUuCisKKwkqIFtpZjE2MzIvdGh1bmsuY10gW2luY2x1ZGUvY2FsbGJhY2suaF0KKwlBZGRlZCB0aHVua3MgdG8gaW1wbGVtZW50IGNhbGxiYWNrcyBmb3IgdGhlIGVtdWxhdG9yLiBOb3cgYWxsIHRoZQorCUVudW0qIGZ1bmN0aW9ucyBhbHdheXMgdGFrZSBhIHJlYWwgZnVuY3Rpb24gcG9pbnRlciBldmVuIGluIHRoZQorCWVtdWxhdG9yLgorCQorCSogW2xvYWRlci9idWlsdGluLmNdCisJUmVtb3ZlZCBiaW5hcnkgc2VhcmNoIGluIEJVSUxUSU5fR2V0RW50cnlQb2ludDMyKCksIGFzIGl0IGRpZG4ndAorIAl3b3JrIHdpdGggTlVMTCBlbnRyeSBwb2ludHMuIFVzaW5nIGxpbmVhciBzZWFyY2ggbm93LgorCisJKiBbbG9hZGVyL21vZHVsZS5jXQorCUltcGxlbWVudGVkIElzU2hhcmVkU2VsZWN0b3IoKS4KKworCSogW2xvYWRlci90YXNrLmNdCisJQ2hhbmdlZCBTd2l0Y2hTdGFja1RvL0JhY2sgdG8gdXNlIHRoZSBpbnN0YW5jZSBkYXRhIHRvIHN0b3JlIHRoZQorCXByZXZpb3VzIHN0YWNrIGluc3RlYWQgb2YgdGhlIFREQi4gQWxzbyBjb3B5IHRoZSBsb2NhbCB2YXJpYWJsZXMKKwlvbnRvIHRoZSBuZXcgc3RhY2suCisJQWRkZWQgR2V0RXhlVmVyc2lvbigpIGFuZCBTZXRUYWNrU2lnbmFsUHJvYygpLgorCUltcGxlbWVudGVkIFNldFNpZ0hhbmRsZXIoKS4KKworU2F0IEF1ZyAgMyAyMjoxOTowMCAxOTk2ICBUaG9tYXMgU2FuZGZvcmQgPHQuZC5nLnNhbmRmb3JkQHByZHMtZ3JuLmRlbW9uLmNvLnVrPgorCisJKiBbY29udHJvbHMvbWVudS5jXQorCSJGaXhlZCIgcHJvYmxlbSBpbiBkZWxldGluZyBtZW51cyB3aGVyZSB3aW4zMiBjb3VsZCBnZXQgaW50byBhbgorCWVuZGxlc3MgbG9vcCB3aGVuIGl0IGNyYXNoZWQuIEkgdGhpbmsgSSd2ZSBmaXhlZCB0aGUgc3ltcHRvbXMsIG5vdAorCXRoZSBvcmlnaW5hbCBwcm9ibGVtIHNvIGl0IG1pZ2h0IGJlIHdvcnRoIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbi4KKworCSogW2RlYnVnZ2VyL3JlZ2lzdGVycy5jXQorCUFkZGVkIG1pc3NpbmcgI2lmZGVmcyBvbiBGU19SRUcgYW5kIEdTX1JFRywgbmVlZGVkIGZvciBGcmVlQlNEIHRvCisJY29tcGlsZSB3aW5lIHByb3Blcmx5LgorCisJKiBbZmlsZXMvZG9zX2ZzLmNdCisJTWFkZSBET1NGU19IYXNoIGFuZCBET1NGU19NYXRjaCBub24tc3RhdGljIHNvIHRoZXkgY2FuIGJlIGNhbGxlZAorCWZyb20gd2luMzIvZmluZGZpbGUuYyAocS52LikuCisKKwkqIFtpZjE2MzIvZ2RpMzIuc3BlY10KKwlBZGRlZCBTZXRNYXBNb2RlIChjYWxsIGV4aXN0aW5nIGZ1bmN0aW9uKQorCisJKiBbaWYxNjMyL2tlcm5lbDMyLnNwZWNdCisJQWRkZWQgRmluZEZpcnN0RmlsZUEgYW5kIFNldEZpbGVBdHRyaWJ1dGVzQS4KKworCSogW2lmMTYzMi91c2VyMzIuc3BlY10KKwlBZGRlZCBCcmluZ1dpbmRvd1RvVG9wLCBDcmVhdGVQb3B1cE1lbnUsIEdldEtleVN0YXRlLCBHZXRQYXJlbnQsCisJSXNEbGdCdXR0b25DaGVja2VkIChjYWxsIGV4aXN0aW5nIGZ1bmN0aW9ucykgYW5kIElzRGlhbG9nTWVzc2FnZUEsCisJVW5ob29rV2luZG93c0hvb2tFeC4KKworCSogW3dpbjMyL2ZpbGUuY10KKwlBZGRlZCBzdHViIGZ1bmN0aW9uIFNldEZpbGVBdHRyaWJ1dGVzMzJBLiBJdCdzIGEgc3R1YiBiZWNhdXNlIEkKKwljYW4ndCByZWFsbHkgd29yayBvdXQgd2hhdCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBkbyB3aXRoIG1vc3QKKwlhdHRyaWJ1dGVzIGluIGEgVW5peCBlbnZpcm9ubWVudC4gQW55b25lIGNhcmUgdG8gZXhwYW5kIGl0PworCisJKiBbd2luMzIvZmluZGZpbGUuY10KKwlOZXcgZmlsZS4gSW5pdGlhbCBzdGFiIGF0IEZpbmRGaXJzdEZpbGUuIFRoaXMgZG9lc24ndCB3b3JrIGFzCisJc3BlY2lmaWVkIHlldCwgdGhvdWdoIGEgbG90IG9mIHRoZSBncm91bmR3b3JrIGlzIHRoZXJlLiBJIGhhdmVuJ3QKKwl0aW1lIHRvIHdvcmsgb24gdGhpcyBmb3IgdGhlIG5leHQgbW9udGgsIHNvIGlmIGFueW9uZSB3YW50cyB0byBwaWNrCisJaXQgdXAgYW5kIHJ1biB3aXRoIGl0IHBsZWFzZSBkby4KKworCSogW3dpbjMyL21lbW9yeS5jXQorCVJlbW92ZWQgbWFsbG9jLmggZnJvbSBpbmNsdWRlcyAoY292ZXJlZCBieSBzdGRsaWIuaCBpbmNsdWRlLCBhbmQKKwlnZXRzIHJpZCBvZiBhIHdhcm5pbmcgaW4gRnJlZUJTRCkuCisKKwkqIFt3aW4zMi9uZXdmbnMuY10KKwlVbmhvb2tXaW5kb3dzSG9va0V4MzJBIHN0dWIgYWRkZWQuCisKKwkqIFt3aW4zMi91c2VyMzIuY10KKwlBZGRlZCBpbXBsZW1lbnRhdGlvbiBvZiBJc0RpYWxvZ01lc3NhZ2UzMkEuCisKKwkqIFt3aW5kb3dzL2RpYWxvZy5jXQorCUlzRGxnQnV0dG9uQ2hlY2tlZCBub3cgY2FsbHMgU2VuZERsZ0l0ZW1NZXNzYWdlMzJBIGluc3RlYWQgb2YKKwlTZW5kRGxnSXRlbU1lc3NhZ2UxNi4KKworU2F0IEF1ZyAgMyAxODowMDowMCAxOTk2IEFsZXggS29yb2JrYSA8YWxleEBwaG0zMC5waGFybS5zdW55c2IuZWR1PgorCisJKiBbd2luZG93cy9ncmFwaGljcy5jXQorCVJlbW92ZWQgcmVjdGFuZ2xlIGNoZWNraW5nIChjb25mbGljdGVkIHdpdGggbm9uc3RhbmRhcmQKKwltYXBwaW5nIG1vZGVzKS4gCisKKwkqIFt3aW5kb3dzL2RpYWxvZy5jXQorCUFkZGVkIGNoZWNrIGZvciBjaGlsZC1zdHlsZSBkaWFsb2dzIHRvIERTX0FCU0FMSUdOCisJY29vcmRpbmF0ZSBjb252ZXJzaW9uLgorCisJKiBbb2JqZWN0cy9jb2xvci5jXQorCUNsZWFuZWQgdXAgbWlzYy4gYml0cworCitUaHUgQXVnICAxIDEwOjUxOjQ1IDE5OTYgIEFuZHJldyBMZXd5Y2t5IDxwbGV3eWNreUBvaXNlLnV0b3JvbnRvLmNhPgorCisJKiBbd2luZG93cy9mb2N1cy5jXSBbd2luZG93cy9ldmVudC5jXSBbd2luZG93cy93aW4uY10KKwkgIFt3aW5kb3dzL2RlZmRsZy5jXQorCUZpeGVzIHRvIGZvY3VzaW5nIGFuZCBhY3RpdmF0aW9uLgorCisJKiBbd2luZG93cy9kZWZkbGcuY10KKwlQcm9wZXJseSg/KSBoYW5kbGUgRE1fR0VUREVGSUQuCisKKwkqIFtjb250cm9scy9jb21iby5jXQorCUhhbmRsZSBDQl9GSU5EU1RSSU5HRVhBQ1QsIENCX1NFVEVESVRTRUwsIENCX0dFVEVESVRTRUwuCisJQ0JDaGVja1NpemU6IEFkanVzdCBlZGl0IHBvc2l0aW9uLgorCitUdWUgSnVsIDMwIDA5OjQ2OjM2IDE5OTYgIE1hcmN1cyBNZWlzc25lciA8bXNtZWlzc25AY2lwLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCisJKiBbZmlsZXMvZmlsZS5jXSBbaW5jbHVkZS9maWxlLmhdIFtsb2FkZXIvbW9kdWxlLmNdIFtsb2FkZXIvbmVfaW1hZ2UuY10KKwlQYXNzIEhGSUxFcyBpbnN0ZWFkIG9mIHVuaXgtZmRzIHRvIHNlbGYtbG9hZGVyIGNvZGUuCisKK01vbiBKdWwgMjkgMjE6NDg6MjUgMTk5NiAgQWxicmVjaHQgS2xlaW5lICA8a2xlaW5lQGFrLnNheC5kZT4KKworCSogW2luY2x1ZGUvbWV0YWZpbGUuaF0gW29iamVjdHMvbWV0YWZpbGUuY10gW29iamVjdHMvdGV4dC5jXQorCUltcGxlbWVudGVkIGhhbmRsaW5nIG9mIHNvbWUgbmV3IG1ldGFmaWxlIHJlY29yZHMgKE1FVEFfLi4uKQorCWluIFBsYXlNZXRhRmlsZVJlY29yZCgpLCByZXdyaXRlIG9mICdjYXNlIE1FVEFfRVhUVEVYVE9VVCcuCisJQWRkZWQgZnVuY3Rpb25zIGxpa2UgTUZfU3RyZXRjaEJsdCgpIGZvciB1c2FnZSBpbiBtZXRhZmlsZXMuCisJTWlub3IgYnVnZml4IGluIENvcHlNZXRhZmlsZSgpLgorCisJKiBbb2JqZWN0cy9iaXRtYXAuY11bb2JqZWN0cy9kaWIuY10KKwlBZGRlZCBjaGVjayBmb3IgbWV0YWZpbGUtREMgaW4gQml0bWFwIGFuZCBESUIgZnVuY3Rpb25zOgorCUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoKSBldGMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFN1biBKdWwgMjggMTc6NTc6MTkgMTk5NiAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CiAKIAkqIFtsb2FkZXIvdGFzay5jXSBbaW5jbHVkZS90YXNrLmhdCmRpZmYgLS1naXQgYS9jb250cm9scy9jb21iby5jIGIvY29udHJvbHMvY29tYm8uYwppbmRleCA0OTkwNjU0Li5kNzU2M2E5IDEwMDY0NAotLS0gYS9jb250cm9scy9jb21iby5jCisrKyBiL2NvbnRyb2xzL2NvbWJvLmMKQEAgLTE1LDEwICsxNSwxMCBAQAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKKyNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJjb21iby5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZ3JhcGhpY3MuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibGlzdGJveC5oIgpAQCAtNDY5LDYgKzQ2OSwxNSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkZpbmRTdHJpbmdFeGFjdAorICovCitzdGF0aWMgTFJFU1VMVCBDQkZpbmRTdHJpbmdFeGFjdChIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKKyAgcmV0dXJuIExpc3RCb3hGaW5kU3RyaW5nRXhhY3QobHBobCwgd1BhcmFtLCAoU0VHUFRSKWxQYXJhbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENCR2V0Q291bnQKICAqLwogc3RhdGljIExSRVNVTFQgQ0JHZXRDb3VudChIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCkBAIC02MjEsNyArNjMwLDcgQEAKICAgTFBIRUFEQ09NQk8gIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIExQSEVBRExJU1QgICBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwogICBMT05HICAgICAgICAgY3N0eWxlID0gR2V0V2luZG93TG9uZzMyQShod25kLEdXTF9TVFlMRSk7Ci0gIFJFQ1QxNiAgICAgICBjUmVjdCx3UmVjdDsKKyAgUkVDVDE2ICAgICAgIGNSZWN0LCB3UmVjdDsKIAogICBpZiAobHBoYy0+aFduZExCb3ggPT0gMCkgcmV0dXJuIEZBTFNFOwogCkBAIC02MzIsOSArNjQxLDkgQEAKIAkgIkNCQ2hlY2tTaXplOiBod25kICUwNHggUmVjdCAlZCwlZC0lZCwlZCAgd1JlY3QgJWQsJWQtJWQsJWRcbiIsIAogCQlod25kLGNSZWN0LmxlZnQsY1JlY3QudG9wLGNSZWN0LnJpZ2h0LGNSZWN0LmJvdHRvbSwKIAkJd1JlY3QubGVmdCx3UmVjdC50b3Asd1JlY3QucmlnaHQsd1JlY3QuYm90dG9tKTsKLSAgaWYgKChjc3R5bGUgJiAzKSA9PSBDQlNfU0lNUExFICApIHJldHVybiBUUlVFIDsKKyAgaWYgKChjc3R5bGUgJiAzKSA9PSBDQlNfU0lNUExFKSByZXR1cm4gVFJVRTsKIAotICBpZiAoKGNSZWN0LmJvdHRvbSAtIGNSZWN0LnRvcCkgPiAKKyAgaWYgKChjUmVjdC5ib3R0b20gLSBjUmVjdC50b3ApID4KICAgICAgIChscGhsLT5TdGRJdGVtSGVpZ2h0ICsgMipTWVNNRVRSSUNTX0NZQk9SREVSKSkgewogICAgIFNldFdpbmRvd1Bvcyhod25kLCAwLCAwLCAwLCAKIAkJIGNSZWN0LnJpZ2h0LWNSZWN0LmxlZnQsCkBAIC02NTEsNyArNjYwLDcgQEAKICAgfQogCiAgIGlmIChjUmVjdC5yaWdodCA8IGxwaGMtPlJlY3RCdXR0b24ubGVmdCkgewotICAgIC8qIGlmIHRoZSBidXR0b24gaXMgb3V0c2lkZSB0aGUgd2luZG93LCBtb3ZlIGl0IGluICovCisgICAgLyogaWYgdGhlIGJ1dHRvbiBpcyBvdXRzaWRlIHRoZSB3aW5kb3cgbW92ZSBpdCBpbiAqLwogICAgIGlmICgod1JlY3QucmlnaHQgLSB3UmVjdC5sZWZ0IC0gMipTWVNNRVRSSUNTX0NYQk9SREVSKSA9PSAoY1JlY3QucmlnaHQgLSBjUmVjdC5sZWZ0KSkgewogICAgICAgbHBoYy0+UmVjdEJ1dHRvbi5yaWdodCA9IGNSZWN0LnJpZ2h0OwogICAgICAgbHBoYy0+UmVjdEJ1dHRvbi5sZWZ0ID0gY1JlY3QucmlnaHQgLSAyKlNZU01FVFJJQ1NfQ1hCT1JERVIgLSA0IApAQCAtNjYyLDggKzY3MSwxMyBAQAogICAgIC8qIG90aGVyd2lzZSB3ZSBuZWVkIHRvIG1ha2UgdGhlIGNsaWVudCBpbmNsdWRlIHRoZSBidXR0b24gKi8KICAgICBlbHNlCiAgICAgICBTZXRXaW5kb3dQb3MoaHduZCwgMCwgMCwgMCwgbHBoYy0+UmVjdEJ1dHRvbi5yaWdodCwKLQkJICAgbHBobC0+U3RkSXRlbUhlaWdodCsyKlNZU01FVFJJQ1NfQ1lCT1JERVIsIAotCQkgICBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PUkVEUkFXIHwgU1dQX05PQUNUSVZBVEUgKTsKKwkJICAgbHBobC0+U3RkSXRlbUhlaWdodCsyKlNZU01FVFJJQ1NfQ1lCT1JERVIsCisJCSAgIFNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9SRURSQVcgfCBTV1BfTk9BQ1RJVkFURSk7CisKKyAgICAgIGlmICgobHBoYy0+ZHdTdHlsZSAmIDMpICE9IENCU19EUk9QRE9XTkxJU1QpCisgICAgICAgIFNldFdpbmRvd1BvcyhscGhjLT5oV25kRWRpdCwgMCwgMCwgMCwgbHBoYy0+UmVjdEJ1dHRvbi5sZWZ0LAorCQkgICAgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQsCisJCSAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSICk7CiAgIH0KIAogICBDQkxDaGVja1NpemUoaHduZCk7CkBAIC03MjgsNiArNzQyLDM0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JHZXRFZGl0U2VsCisgKiBMb29rIG91dCEgVW5kZXIgV2luMzIsIHRoZSBwYXJhbWV0ZXIgcGFja2luZyBpcyB2ZXJ5IGRpZmZlcmVudC4KKyAqLworc3RhdGljIExSRVNVTFQgQ0JHZXRFZGl0U2VsKEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCisgICAgaWYgKChscGhjLT5kd1N0eWxlICYgMykgPT0gQ0JTX0RST1BET1dOTElTVCkKKyAgICAgIHJldHVybiBDQl9FUlI7CS8qIGVyciwgZG9jdW1lbnRlZCBmb3IgQ0JTZXRFZGl0U2VsICovCisgICAgcmV0dXJuIFNlbmRNZXNzYWdlMTYobHBoYy0+aFduZEVkaXQsIEVNX0dFVFNFTCwgMCwgMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JTZXRFZGl0U2VsCisgKiBMb29rIG91dCEgVW5kZXIgV2luMzIsIHRoZSBwYXJhbWV0ZXIgcGFja2luZyBpcyB2ZXJ5IGRpZmZlcmVudC4KKyAqLworc3RhdGljIExSRVNVTFQgQ0JTZXRFZGl0U2VsKEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCisgICAgaWYgKChscGhjLT5kd1N0eWxlICYgMykgPT0gQ0JTX0RST1BET1dOTElTVCkKKyAgICAgIHJldHVybiBDQl9FUlI7CisgICAgcmV0dXJuIFNlbmRNZXNzYWdlMTYobHBoYy0+aFduZEVkaXQsIEVNX1NFVFNFTCwgMCwgbFBhcmFtKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb21ib1duZFByb2MKICAqLwogTFJFU1VMVCBDb21ib0JveFduZFByb2MoSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCkBAIC03NjQsNiArODA2LDkgQEAKICAgICAgY2FzZSBDQl9TRVRDVVJTRUw6IHJldHVybiBDQlNldEN1clNlbChod25kLCB3UGFyYW0sIGxQYXJhbSk7CiAgICAgIGNhc2UgQ0JfU0VUSVRFTUhFSUdIVDogcmV0dXJuIENCU2V0SXRlbUhlaWdodChod25kLCB3UGFyYW0sIGxQYXJhbSk7CiAgICAgIGNhc2UgQ0JfU0hPV0RST1BET1dOOiByZXR1cm4gQ0JTaG93RHJvcERvd24oaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIENCX0dFVEVESVRTRUw6IHJldHVybiBDQkdldEVkaXRTZWwoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIENCX1NFVEVESVRTRUw6IHJldHVybiBDQlNldEVkaXRTZWwoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICBjYXNlIENCX0ZJTkRTVFJJTkdFWEFDVDogcmV0dXJuIENCRmluZFN0cmluZ0V4YWN0KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKICAgICB9CiAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MxNihod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CiB9CmRpZmYgLS1naXQgYS9jb250cm9scy9tZW51LmMgYi9jb250cm9scy9tZW51LmMKaW5kZXggZTM4YTRjZC4uYTgzZGI1MSAxMDA2NDQKLS0tIGEvY29udHJvbHMvbWVudS5jCisrKyBiL2NvbnRyb2xzL21lbnUuYwpAQCAtMTg1OSw3ICsxODU5LDcgQEAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7CiAgICAgaWYgKCEobHBwb3AgPSAoTFBQT1BVUE1FTlUpVVNFUl9IRUFQX0xJTl9BRERSKChITUVOVSl3bmRQdHItPndJRG1lbnUpKSkKICAgICAgIHJldHVybiAwOwotICAgIGhkYyA9IEdldERDKCBod25kICk7CisgICAgaGRjID0gR2V0RENFeCggaHduZCwgMCwgRENYX0NBQ0hFIHwgRENYX1dJTkRPVyApOwogICAgIFNldFJlY3QxNigmcmVjdEJhciwgb3JnWCwgb3JnWSwgb3JnWCttZW51YmFyV2lkdGgsIG9yZ1krU1lTTUVUUklDU19DWU1FTlUpOwogICAgIE1FTlVfTWVudUJhckNhbGNTaXplKCBoZGMsICZyZWN0QmFyLCBscHBvcCwgaHduZCApOwogICAgIFJlbGVhc2VEQyggaHduZCwgaGRjICk7CkBAIC0yMzUzLDcgKzIzNTMsNyBAQAogICAgIGxwcG9wID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpOwogICAgIGlmICghbHBwb3AgfHwgKGxwcG9wLT53TWFnaWMgIT0gTUVOVV9NQUdJQykpIHJldHVybiBGQUxTRTsKICAgICBscHBvcC0+d01hZ2ljID0gMDsgIC8qIE1hcmsgaXQgYXMgZGVzdHJveWVkICovCi0gICAgaWYgKChscHBvcC0+d0ZsYWdzICYgTUZfUE9QVVApICYmIGxwcG9wLT5oV25kICYmIGxwcG9wLT5oV25kICE9IHBUb3BQV25kLT5od25kU2VsZiApCisgICAgaWYgKChscHBvcC0+d0ZsYWdzICYgTUZfUE9QVVApICYmIGxwcG9wLT5oV25kICYmICghcFRvcFBXbmQgfHwgKGxwcG9wLT5oV25kICE9IHBUb3BQV25kLT5od25kU2VsZikpKQogICAgICAgICBEZXN0cm95V2luZG93KCBscHBvcC0+aFduZCApOwogCiAgICAgaWYgKGxwcG9wLT5pdGVtcykKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Njcm9sbC5jIGIvY29udHJvbHMvc2Nyb2xsLmMKaW5kZXggNjQ5YzgxZi4uYzU0NDIxYyAxMDA2NDQKLS0tIGEvY29udHJvbHMvc2Nyb2xsLmMKKysrIGIvY29udHJvbHMvc2Nyb2xsLmMKQEAgLTc5NywxMiArNzk3LDIzIEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIDB4NDAwOiAvKiBTQl9TRVRTQ1JPTExQT1MgKi8KLSAgICBjYXNlIDB4NDAxOiAvKiBTQl9HRVRTQ1JPTExQT1MgKi8KLSAgICBjYXNlIDB4NDAyOiAvKiBTQl9HRVRTQ1JPTExSQU5HRSAqLwotICAgIGNhc2UgMHg0MDM6IC8qIFNCX0VOQUJMRSAqLwotICAgIGNhc2UgMHg0MDQ6IC8qIFNCX1JFRFJBVyAqLworICAgIGNhc2UgU0JNX1NFVFNDUk9MTFBPUzoKKyAgICAgICAgcmV0dXJuIFNldFNjcm9sbFBvcyggaHduZCwgU0JfQ1RMLCB3UGFyYW0sIChCT09MKWxQYXJhbSApOworCisgICAgY2FzZSBTQk1fR0VUU0NST0xMUE9TOgorICAgICAgICByZXR1cm4gR2V0U2Nyb2xsUG9zKCBod25kLCBTQl9DVEwgKTsKKworICAgIGNhc2UgU0JNX1NFVFNDUk9MTFJBTkdFOgorICAgICAgICBTZXRTY3JvbGxSYW5nZSggaHduZCwgU0JfQ1RMLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICB3UGFyYW0gIC8qIEZJWE1FOiBJcyB0aGlzIGNvcnJlY3Q/ICovICk7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBTQk1fRU5BQkxFOgorICAgICAgICByZXR1cm4gRW5hYmxlU2Nyb2xsQmFyKCBod25kLCBTQl9DVEwsIHdQYXJhbSApOyAvKiBGSVhNRTogbFBhcmFtPyAqLworCisgICAgY2FzZSAweDQwMzogLyogU0JNX1JFRFJBVyAqLwogICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsIlNjcm9sbEJhclduZFByb2M6IHVuZG9jdW1lbnRlZCBtZXNzYWdlICUwNHgsIHBsZWFzZSByZXBvcnRcbiIsIG1lc3NhZ2UgKTsKKyAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYzE2KCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvcmVnaXN0ZXJzLmMgYi9kZWJ1Z2dlci9yZWdpc3RlcnMuYwppbmRleCA2NmIzOGYzLi40NTQ1ZDc4IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9yZWdpc3RlcnMuYworKysgYi9kZWJ1Z2dlci9yZWdpc3RlcnMuYwpAQCAtNDYsMTQgKzQ2LDE0IEBACiAgICAgICAgIGNhc2UgUkVHX0ZTOiAgRlNfcmVnKERFQlVHX2NvbnRleHQpICA9IHZhbDsgYnJlYWs7CiAjZWxzZQogICAgICAgICBjYXNlIFJFR19GUzoKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlJlZ2lzdGVyICVmcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtXG4gIik7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJSZWdpc3RlciAlZnMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbVxuIiApOwogICAgICAgICAgICAgYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBHU19yZWcKICAgICAgICAgY2FzZSBSRUdfR1M6ICBHU19yZWcoREVCVUdfY29udGV4dCkgID0gdmFsOyBicmVhazsKICNlbHNlCiAgICAgICAgIGNhc2UgUkVHX0dTOgotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiUmVnaXN0ZXIgJWdzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW1cbiAiKTsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlJlZ2lzdGVyICVncyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtXG4iICk7CiAgICAgICAgICAgICBicmVhazsKICNlbmRpZgogICAgIH0KQEAgLTk3LDE0ICs5NywxNCBAQAogICAgICAgICBjYXNlIFJFR19GUzogIHJldHVybiBGU19yZWcoREVCVUdfY29udGV4dCk7CiAjZWxzZQogICAgICAgICBjYXNlIFJFR19GUzoKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlJlZ2lzdGVyICVmcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtXG4gIik7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJSZWdpc3RlciAlZnMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbVxuIiApOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAjZW5kaWYKICNpZmRlZiBHU19yZWcKICAgICAgICAgY2FzZSBSRUdfR1M6ICByZXR1cm4gR1NfcmVnKERFQlVHX2NvbnRleHQpOwogI2Vsc2UKICAgICAgICAgY2FzZSBSRUdfR1M6Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJSZWdpc3RlciAlZ3Mgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbVxuICIpOworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiUmVnaXN0ZXIgJWdzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW1cbiIgKTsKICAgICAgICAgICAgIHJldHVybiAwOwogI2VuZGlmCiAgICAgfQpAQCAtMTgyLDEwICsxODIsMTQgQEAKICAgICAgICAgQ0hFQ0tfU0VHKCBEU19yZWcoREVCVUdfY29udGV4dCksICJEUyIgKTsKICAgICBpZiAoRVNfcmVnKERFQlVHX2NvbnRleHQpICE9IFdJTkVfREFUQV9TRUxFQ1RPUikKICAgICAgICAgQ0hFQ0tfU0VHKCBFU19yZWcoREVCVUdfY29udGV4dCksICJFUyIgKTsKKyNpZmRlZiBGU19yZWcKICAgICBpZiAoRlNfcmVnKERFQlVHX2NvbnRleHQpICE9IFdJTkVfREFUQV9TRUxFQ1RPUikKICAgICAgICAgQ0hFQ0tfU0VHKCBGU19yZWcoREVCVUdfY29udGV4dCksICJGUyIgKTsKKyNlbmRpZgorI2lmZGVmIEdTX3JlZwogICAgIGlmIChHU19yZWcoREVCVUdfY29udGV4dCkgIT0gV0lORV9EQVRBX1NFTEVDVE9SKQogICAgICAgICBDSEVDS19TRUcoIEdTX3JlZyhERUJVR19jb250ZXh0KSwgIkdTIiApOworI2VuZGlmCiAKICAgICAvKiBDaGVjayB0aGF0IENTIGFuZCBTUyBhcmUgbm90IE5VTEwgKi8KIApkaWZmIC0tZ2l0IGEvZmlsZXMvZG9zX2ZzLmMgYi9maWxlcy9kb3NfZnMuYwppbmRleCBlMjA4NmVjLi5lMGExZTE3IDEwMDY0NAotLS0gYS9maWxlcy9kb3NfZnMuYworKysgYi9maWxlcy9kb3NfZnMuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAgKgogICogQ2hlY2sgYSBET1MgZmlsZSBuYW1lIGFnYWluc3QgYSBtYXNrIChib3RoIGluIEZDQiBmb3JtYXQpLgogICovCi1zdGF0aWMgaW50IERPU0ZTX01hdGNoKCBjb25zdCBjaGFyICptYXNrLCBjb25zdCBjaGFyICpuYW1lICkKK2ludCBET1NGU19NYXRjaCggY29uc3QgY2hhciAqbWFzaywgY29uc3QgY2hhciAqbmFtZSApCiB7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMTE7IGkgPiAwOyBpLS0sIG1hc2srKywgbmFtZSsrKQpAQCAtMjgwLDcgKzI4MCw3IEBACiAgKiBoYXNoZWQgdmVyc2lvbiB0aGF0IGZpdHMgaW4gOC4zIGZvcm1hdC4KICAqIEZpbGUgbmFtZSBjYW4gYmUgdGVybWluYXRlZCBieSAnXDAnLCAnXFwnIG9yICcvJy4KICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKkRPU0ZTX0hhc2goIGNvbnN0IGNoYXIgKm5hbWUsIGludCBkaXJfZm9ybWF0ICkKK2NvbnN0IGNoYXIgKkRPU0ZTX0hhc2goIGNvbnN0IGNoYXIgKm5hbWUsIGludCBkaXJfZm9ybWF0ICkKIHsKICAgICBzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX2NoYXJzW10gPSBJTlZBTElEX0RPU19DSEFSUyAifi4iOwogICAgIHN0YXRpYyBjb25zdCBjaGFyIGhhc2hfY2hhcnNbMzJdID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1IjsKZGlmZiAtLWdpdCBhL2ZpbGVzL2ZpbGUuYyBiL2ZpbGVzL2ZpbGUuYwppbmRleCAyZWEwMmUzLi45NDBlYmUxIDEwMDY0NAotLS0gYS9maWxlcy9maWxlLmMKKysrIGIvZmlsZXMvZmlsZS5jCkBAIC0yODMsNiArMjgzLDI5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRklMRV9EdXBVbml4SGFuZGxlCisgKgorICogRHVwbGljYXRlIGEgVW5peCBoYW5kbGUgaW50byBhIHRhc2sgaGFuZGxlLgorICovCitIRklMRSBGSUxFX0R1cFVuaXhIYW5kbGUoIGludCBmZCApCit7CisgICAgSEZJTEUgaGFuZGxlOworICAgIERPU19GSUxFICpmaWxlOworCisgICAgaWYgKCEoZmlsZSA9IEZJTEVfQWxsb2MoKSkpIHJldHVybiBIRklMRV9FUlJPUjsKKyAgICBpZiAoKGZpbGUtPnVuaXhfaGFuZGxlID0gZHVwKGZkKSkgPT0gLTEpCisgICAgeworICAgICAgICBGSUxFX1NldERvc0Vycm9yKCk7CisgICAgICAgIEZJTEVfQ2xvc2UoIGZpbGUgKTsKKyAgICAgICAgcmV0dXJuIEhGSUxFX0VSUk9SOworICAgIH0KKyAgICBpZiAoKGhhbmRsZSA9IEZJTEVfQWxsb2NUYXNrSGFuZGxlKCBmaWxlICkpID09IEhGSUxFX0VSUk9SKQorICAgICAgICBGSUxFX0Nsb3NlKCBmaWxlICk7CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBGSUxFX09wZW5Vbml4RmlsZQogICovCiBzdGF0aWMgRE9TX0ZJTEUgKkZJTEVfT3BlblVuaXhGaWxlKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSApCmRpZmYgLS1naXQgYS9pZjE2MzIvTWFrZWZpbGUuaW4gYi9pZjE2MzIvTWFrZWZpbGUuaW4KaW5kZXggMzc3NDQzNC4uNWViNzExMCAxMDA2NDQKLS0tIGEvaWYxNjMyL01ha2VmaWxlLmluCisrKyBiL2lmMTYzMi9NYWtlZmlsZS5pbgpAQCAtNTEsNyArNTEsOCBAQAogCiBDX1NSQ1MgPSBcCiAJZHVtbXkuYyBcCi0JcmVsYXkuYworCXJlbGF5LmMgXAorCXRodW5rLmMKIAogQVNNX1NSQ1MgPSBcCiAJJChTUEVDX0ZJTEVTKSBcCmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpLnNwZWMgYi9pZjE2MzIvZ2RpLnNwZWMKaW5kZXggMjRiMTNiOC4uYjdlODA0ZSAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaS5zcGVjCisrKyBiL2lmMTYzMi9nZGkuc3BlYwpAQCAtNzcsOCArNzcsOCBAQAogNjcgIHBhc2NhbDE2IERQdG9MUCh3b3JkIHB0ciBzX3dvcmQpIERQdG9MUDE2CiA2OCAgcGFzY2FsMTYgRGVsZXRlREMod29yZCkgRGVsZXRlREMKIDY5ICBwYXNjYWwxNiBEZWxldGVPYmplY3Qod29yZCkgRGVsZXRlT2JqZWN0Ci03MCAgcGFzY2FsMTYgRW51bUZvbnRzKHdvcmQgcHRyIHNlZ3B0ciBsb25nKSBFbnVtRm9udHMKLTcxICBwYXNjYWwxNiBFbnVtT2JqZWN0cyh3b3JkIHdvcmQgc2VncHRyIGxvbmcpIEVudW1PYmplY3RzCis3MCAgcGFzY2FsMTYgRW51bUZvbnRzKHdvcmQgcHRyIHNlZ3B0ciBsb25nKSBUSFVOS19FbnVtRm9udHMxNgorNzEgIHBhc2NhbDE2IEVudW1PYmplY3RzKHdvcmQgd29yZCBzZWdwdHIgbG9uZykgVEhVTktfRW51bU9iamVjdHMxNgogNzIgIHBhc2NhbDE2IEVxdWFsUmduKHdvcmQgd29yZCkgRXF1YWxSZ24KIDczICBwYXNjYWwxNiBFeGNsdWRlVmlzUmVjdCh3b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCkgRXhjbHVkZVZpc1JlY3QKIDc0ICBwYXNjYWwgR2V0Qml0bWFwQml0cyh3b3JkIGxvbmcgcHRyKSBHZXRCaXRtYXBCaXRzCkBAIC0xMDgsNyArMTA4LDcgQEAKIDk4ICBwYXNjYWwxNiBJbnRlcnNlY3RWaXNSZWN0KHdvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkKQogICAgICAgICAgICAgIEludGVyc2VjdFZpc1JlY3QKIDk5ICBwYXNjYWwxNiBMUHRvRFAod29yZCBwdHIgc193b3JkKSBMUHRvRFAxNgotMTAwIHBhc2NhbDE2IExpbmVEREEoc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNlZ3B0ciBsb25nKSBMaW5lRERBCisxMDAgcGFzY2FsMTYgTGluZUREQShzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgc2VncHRyIGxvbmcpIFRIVU5LX0xpbmVEREExNgogMTAxIHBhc2NhbDE2IE9mZnNldFJnbih3b3JkIHNfd29yZCBzX3dvcmQpIE9mZnNldFJnbgogMTAyIHBhc2NhbDE2IE9mZnNldFZpc1Jnbih3b3JkIHNfd29yZCBzX3dvcmQpIE9mZnNldFZpc1JnbgogMTAzIHBhc2NhbDE2IFB0VmlzaWJsZSh3b3JkIHNfd29yZCBzX3dvcmQpIFB0VmlzaWJsZQpAQCAtMTUwLDcgKzE1MCw3IEBACiAxNzAgc3R1YiBTZXREQ1N0YXR1cwogMTcyIHBhc2NhbDE2IFNldFJlY3RSZ24od29yZCBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQpIFNldFJlY3RSZ24KIDE3MyBwYXNjYWwxNiBHZXRDbGlwUmduKHdvcmQpIEdldENsaXBSZ24KLTE3NSBwYXNjYWwxNiBFbnVtTWV0YUZpbGUod29yZCB3b3JkIHNlZ3B0ciBsb25nKSBFbnVtTWV0YUZpbGUKKzE3NSBwYXNjYWwxNiBFbnVtTWV0YUZpbGUod29yZCB3b3JkIHNlZ3B0ciBsb25nKSBUSFVOS19FbnVtTWV0YUZpbGUxNgogMTc2IHBhc2NhbDE2IFBsYXlNZXRhRmlsZVJlY29yZCh3b3JkIHB0ciBwdHIgd29yZCkgUGxheU1ldGFGaWxlUmVjb3JkCiAxNzkgcGFzY2FsMTYgR2V0RENTdGF0ZSh3b3JkKSBHZXREQ1N0YXRlCiAxODAgcGFzY2FsMTYgU2V0RENTdGF0ZSh3b3JkIHdvcmQpIFNldERDU3RhdGUKQEAgLTIyNyw3ICsyMjcsNyBAQAogMzE1IHN0dWIgRW5naW5lUmVhbGl6ZUZvbnRFeHQKIDMxNiBzdHViIEVuZ2luZUdldENoYXJXaWR0aFN0cgogMzE3IHN0dWIgRW5naW5lR2V0R2x5cGhCbXBFeHQKLTMzMCBwYXNjYWwxNiBFbnVtRm9udEZhbWlsaWVzKHdvcmQgcHRyIHNlZ3B0ciBsb25nKSBFbnVtRm9udEZhbWlsaWVzCiszMzAgcGFzY2FsMTYgRW51bUZvbnRGYW1pbGllcyh3b3JkIHB0ciBzZWdwdHIgbG9uZykgVEhVTktfRW51bUZvbnRGYW1pbGllczE2CiAzMzIgcGFzY2FsMTYgR2V0S2VybmluZ1BhaXJzKHdvcmQgd29yZCBwdHIpIEdldEtlcm5pbmdQYWlycwogMzQ1IHBhc2NhbDE2IEdldFRleHRBbGlnbih3b3JkKSBHZXRUZXh0QWxpZ24KIDM0NiBwYXNjYWwxNiBTZXRUZXh0QWxpZ24od29yZCB3b3JkKSBTZXRUZXh0QWxpZ24KZGlmZiAtLWdpdCBhL2lmMTYzMi9nZGkzMi5zcGVjIGIvaWYxNjMyL2dkaTMyLnNwZWMKaW5kZXggZGNhOGQxYi4uOTc2NTQ1OSAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaTMyLnNwZWMKKysrIGIvaWYxNjMyL2dkaTMyLnNwZWMKQEAgLTI1Miw3ICsyNTIsNyBAQAogMDI0NSBzdHViIEludGVyc2VjdENsaXBSZWN0CiAwMjQ2IHN0dWIgSW52ZXJ0UmduCiAwMjQ3IHN0ZGNhbGwgTFB0b0RQKGxvbmcgcHRyIGxvbmcpIExQdG9EUDMyCi0wMjQ4IHN0dWIgTGluZUREQQorMDI0OCBzdGRjYWxsIExpbmVEREEobG9uZyBsb25nIGxvbmcgbG9uZyBwdHIgbG9uZykgVEhVTktfTGluZUREQTMyCiAwMjQ5IHN0ZGNhbGwgTGluZVRvKGxvbmcgbG9uZyBsb25nKSBMaW5lVG8KIDAyNTAgc3R1YiBMb2FkSW1hZ2VDb2xvck1hdGNoZXJBCiAwMjUxIHN0dWIgTG9hZEltYWdlQ29sb3JNYXRjaGVyVwpAQCAtMzI2LDcgKzMyNiw3IEBACiAwMzE4IHN0dWIgU2V0SUNNTW9kZQogMDMxOSBzdHViIFNldElDTVByb2ZpbGVBCiAwMzIwIHN0dWIgU2V0SUNNUHJvZmlsZVcKLTAzMjEgc3R1YiBTZXRNYXBNb2RlCiswMzIxIHN0ZGNhbGwgU2V0TWFwTW9kZShsb25nIGxvbmcpIFNldE1hcE1vZGUKIDAzMjIgc3R1YiBTZXRNYXBwZXJGbGFncwogMDMyMyBzdHViIFNldE1ldGFGaWxlQml0c0V4CiAwMzI0IHN0dWIgU2V0TWV0YVJnbgpkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbC5zcGVjIGIvaWYxNjMyL2tlcm5lbC5zcGVjCmluZGV4IGVjZTM5ODg0Li5lN2JmMTc3IDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbC5zcGVjCkBAIC0zOCw3ICszOCw3IEBACiAzNSAgcGFzY2FsMTYgR2V0VGFza1F1ZXVlKHdvcmQpIEdldFRhc2tRdWV1ZQogMzYgIHBhc2NhbCAgIEdldEN1cnJlbnRUYXNrKCkgV0lOMTZfR2V0Q3VycmVudFRhc2sKIDM3ICBwYXNjYWwgR2V0Q3VycmVudFBEQigpIEdldEN1cnJlbnRQREIKLTM4ICBzdHViIFNldFRhc2tTaWduYWxQcm9jCiszOCAgcGFzY2FsICAgU2V0VGFza1NpZ25hbFByb2Mod29yZCBzZWdwdHIpIFNldFRhc2tTaWduYWxQcm9jCiA0MSAgcmV0dXJuIEVuYWJsZURvcyAwIDAKIDQyICByZXR1cm4gRGlzYWJsZURvcyAwIDAKIDQ1ICBwYXNjYWwxNiBMb2FkTW9kdWxlKHB0ciBwdHIpIExvYWRNb2R1bGUKQEAgLTk0LDE0ICs5NCwxNCBAQAogOTUgIHBhc2NhbDE2IExvYWRMaWJyYXJ5KHB0cikgTG9hZExpYnJhcnkKIDk2ICBwYXNjYWwxNiBGcmVlTGlicmFyeSh3b3JkKSBGcmVlTGlicmFyeQogOTcgIHBhc2NhbDE2IEdldFRlbXBGaWxlTmFtZShieXRlIHB0ciB3b3JkIHB0cikgR2V0VGVtcEZpbGVOYW1lMTYKLTk4ICBzdHViIEdldExhc3REaXNrQ2hhbmdlCis5OCAgcmV0dXJuIEdldExhc3REaXNrQ2hhbmdlIDAgMAogOTkgIHN0dWIgR2V0TFBFcnJNb2RlCiAxMDAgc3R1YiBWYWxpZGF0ZUNvZGVTZWdtZW50cwogMTAxIHN0dWIgTm9Ib29rRG9zQ2FsbAogMTAyIHJlZ2lzdGVyIERPUzNDYWxsKCkgRE9TM0NhbGwKIDEwMyByZWdpc3RlciBOZXRCSU9TQ2FsbCgpIE5ldEJJT1NDYWxsCiAxMDQgc3R1YiBHZXRDb2RlSW5mbwotMTA1IHN0dWIgR2V0RXhlVmVyc2lvbgorMTA1IHBhc2NhbDE2IEdldEV4ZVZlcnNpb24oKSBHZXRFeGVWZXJzaW9uCiAxMDYgcGFzY2FsIFNldFN3YXBBcmVhU2l6ZSh3b3JkKSBTZXRTd2FwQXJlYVNpemUKIDEwNyBwYXNjYWwxNiBTZXRFcnJvck1vZGUod29yZCkgU2V0RXJyb3JNb2RlCiAxMDggcGFzY2FsMTYgU3dpdGNoU3RhY2tUbyh3b3JkIHdvcmQgd29yZCkgU3dpdGNoU3RhY2tUbwpAQCAtMTYyLDcgKzE2Miw3IEBACiAxNjIgcGFzY2FsMTYgTG9jYWxIZWFwU2l6ZSgpIExvY2FsSGVhcFNpemUKIDE2MyBwYXNjYWwxNiBHbG9iYWxMUlVPbGRlc3Qod29yZCkgR2xvYmFsTFJVT2xkZXN0CiAxNjQgcGFzY2FsMTYgR2xvYmFsTFJVTmV3ZXN0KHdvcmQpIEdsb2JhbExSVU5ld2VzdAotMTY1IHN0dWIgQTIwUHJvYworMTY1IHJldHVybiBBMjBQcm9jIDIgMAogMTY2IHBhc2NhbDE2IFdpbkV4ZWMocHRyIHdvcmQpIFdpbkV4ZWMKIDE2NyBwYXNjYWwxNiBHZXRFeHBXaW5WZXIod29yZCkgR2V0RXhwV2luVmVyCiAxNjggcGFzY2FsMTYgRGlyZWN0UmVzQWxsb2Mod29yZCB3b3JkIHdvcmQpIERpcmVjdFJlc0FsbG9jCkBAIC0yNTIsNyArMjUyLDcgQEAKIDM0MiBzdHViIF9fR1AKIDM0MyBzdHViIFJlZ2lzdGVyV2luT2xkQXBIb29rCiAzNDQgc3R1YiBHZXRXaW5PbGRBcEhvb2tzCi0zNDUgc3R1YiBJc1NoYXJlZFNlbGVjdG9yCiszNDUgcGFzY2FsMTYgSXNTaGFyZWRTZWxlY3Rvcih3b3JkKSBJc1NoYXJlZFNlbGVjdG9yCiAzNDYgcGFzY2FsMTYgSXNCYWRIdWdlUmVhZFB0cihzZWdwdHIgbG9uZykgSXNCYWRIdWdlUmVhZFB0cgogMzQ3IHBhc2NhbDE2IElzQmFkSHVnZVdyaXRlUHRyKHNlZ3B0ciBsb25nKSBJc0JhZEh1Z2VXcml0ZVB0cgogMzQ4IHBhc2NhbDE2IGhtZW1jcHkocHRyIHB0ciBsb25nKSBobWVtY3B5CmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsMzIuc3BlYyBiL2lmMTYzMi9rZXJuZWwzMi5zcGVjCmluZGV4IDcxODMzZTQuLjBiOWJkM2EgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXJuZWwzMi5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwzMi5zcGVjCkBAIC0xMjUsNyArMTI1LDcgQEAKIDAxMjAgc3R1YiBGaW5kQ2xvc2VDaGFuZ2VOb3RpZmljYXRpb24KIDAxMjEgc3R1YiBGaW5kRmlyc3RDaGFuZ2VOb3RpZmljYXRpb25BCiAwMTIyIHN0dWIgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uVwotMDEyMyBzdHViIEZpbmRGaXJzdEZpbGVBCiswMTIzIHN0ZGNhbGwgRmluZEZpcnN0RmlsZUEocHRyIHB0cikgRmluZEZpcnN0RmlsZTMyQQogMDEyNCBzdHViIEZpbmRGaXJzdEZpbGVXCiAwMTI1IHN0dWIgRmluZE5leHRDaGFuZ2VOb3RpZmljYXRpb24KIDAxMjYgc3R1YiBGaW5kTmV4dEZpbGVBCkBAIC00OTIsNyArNDkyLDcgQEAKIDA0ODcgCXN0ZGNhbGwJU2V0RXZlbnQobG9uZykgU2V0RXZlbnQKIDA0ODggc3R1YiBTZXRGaWxlQXBpc1RvQU5TSQogMDQ4OSBzdHViIFNldEZpbGVBcGlzVG9PRU0KLTA0OTAgc3R1YiBTZXRGaWxlQXR0cmlidXRlc0EKKzA0OTAgc3RkY2FsbCBTZXRGaWxlQXR0cmlidXRlc0EocHRyIGxvbmcpIFNldEZpbGVBdHRyaWJ1dGVzMzJBCiAwNDkxIHN0dWIgU2V0RmlsZUF0dHJpYnV0ZXNXCiAwNDkyICAgIHN0ZGNhbGwgU2V0RmlsZVBvaW50ZXIobG9uZyBsb25nIHB0ciBsb25nKSBTZXRGaWxlUG9pbnRlcgogMDQ5MyBzdHViIFNldEZpbGVUaW1lCmRpZmYgLS1naXQgYS9pZjE2MzIvdGh1bmsuYyBiL2lmMTYzMi90aHVuay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjIzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pZjE2MzIvdGh1bmsuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIEVtdWxhdG9yIHRodW5rcworICoKKyAqIENvcHlyaWdodCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJoZWFwLmgiCisKK3R5cGVkZWYgdm9pZCAoKlJFTEFZKSgpOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJZVEUgICAgICAgcG9wbF9lYXg7ICAgICAgICAgICAvKiAweDU4ICBwb3BsICAlZWF4IChyZXR1cm4gYWRkcmVzcykgKi8KKyAgICBCWVRFICAgICAgIHB1c2hsX2Z1bmM7ICAgICAgICAgLyogMHg2OCAgcHVzaGwgJHByb2MgKi8KKyAgICBGQVJQUk9DMzIgIHByb2MgV0lORV9QQUNLRUQ7CisgICAgQllURSAgICAgICBwdXNobF9lYXg7ICAgICAgICAgIC8qIDB4NTAgIHB1c2hsICVlYXggKi8KKyAgICBCWVRFICAgICAgIGptcDsgICAgICAgICAgICAgICAgLyogMHhlOSAgam1wICAgcmVsYXkgKHJlbGF0aXZlIGp1bXApKi8KKyAgICBSRUxBWSAgICAgIHJlbGF5IFdJTkVfUEFDS0VEOworfSBUSFVOSzsKKworI2RlZmluZSBERUNMX1RIVU5LKG5hbWUscHJvYyxyZWxheSkgXAorICAgIFRIVU5LIG5hbWUgPSB7IDB4NTgsIDB4NjgsIChGQVJQUk9DMzIpKHByb2MpLCAweDUwLCAweGU5LCBcCisgICAgICAgICAgICAgICAgICAgIChSRUxBWSkoKGNoYXIgKikocmVsYXkpIC0gKGNoYXIgKikoJihuYW1lKSArIDEpKSB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfQWxsb2MKKyAqLworc3RhdGljIFRIVU5LICpUSFVOS19BbGxvYyggRkFSUFJPQzMyIGZ1bmMsIFJFTEFZIHJlbGF5ICkKK3sKKyAgICBUSFVOSyAqdGh1bmsgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZigqdGh1bmspICk7CisgICAgaWYgKHRodW5rKQorICAgIHsKKyAgICAgICAgdGh1bmstPnBvcGxfZWF4ICAgPSAweDU4OworICAgICAgICB0aHVuay0+cHVzaGxfZnVuYyA9IDB4Njg7CisgICAgICAgIHRodW5rLT5wcm9jICAgICAgID0gZnVuYzsKKyAgICAgICAgdGh1bmstPnB1c2hsX2VheCAgPSAweDUwOworICAgICAgICB0aHVuay0+am1wICAgICAgICA9IDB4ZTk7CisgICAgICAgIHRodW5rLT5yZWxheSAgICAgID0gcmVsYXk7CisgICAgfQorICAgIHJldHVybiB0aHVuazsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFVOS19GcmVlCisgKi8KK3N0YXRpYyB2b2lkIFRIVU5LX0ZyZWUoIFRIVU5LICp0aHVuayApCit7CisgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIHRodW5rICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfRW51bU9iamVjdHMxNiAgIChHREkuNzEpCisgKi8KK0lOVDE2IFRIVU5LX0VudW1PYmplY3RzMTYoIEhEQzE2IGhkYywgSU5UMTYgbk9ialR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHT0JKRU5VTVBST0MxNiBmdW5jLCBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMTZfd29yZF9sbCApOworICAgIHJldHVybiBFbnVtT2JqZWN0cyggaGRjLCBuT2JqVHlwZSwgKEdPQkpFTlVNUFJPQzE2KSZ0aHVuaywgbFBhcmFtICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFVOS19FbnVtRm9udHMxNiAgIChHREkuNzApCisgKi8KK0lOVDE2IFRIVU5LX0VudW1Gb250czE2KCBIREMxNiBoZGMsIExQQ1NUUiBscEZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZPTlRFTlVNUFJPQzE2IGZ1bmMsIExQQVJBTSBsUGFyYW0gKQoreworICAgIERFQ0xfVEhVTksoIHRodW5rLCBmdW5jLCBDYWxsVG8xNl93b3JkX2xsd2wgKTsKKyAgICByZXR1cm4gRW51bUZvbnRzKCBoZGMsIGxwRmFjZU5hbWUsIChGT05URU5VTVBST0MxNikmdGh1bmssIGxQYXJhbSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFVOS19FbnVtTWV0YUZpbGUxNiAgIChHREkuMTc1KQorICovCitCT09MMTYgVEhVTktfRW51bU1ldGFGaWxlMTYoIEhEQzE2IGhkYywgSE1FVEFGSUxFMTYgaG1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkVOVU1QUk9DMTYgZnVuYywgTFBBUkFNIGxQYXJhbSApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzE2X3dvcmRfd2xsd2wgKTsKKyAgICByZXR1cm4gRW51bU1ldGFGaWxlKCBoZGMsIGhtZiwgKE1GRU5VTVBST0MxNikmdGh1bmssIGxQYXJhbSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfRW51bUZvbnRGYW1pbGllczE2ICAgKEdESS4zMzApCisgKi8KK0lOVDE2IFRIVU5LX0VudW1Gb250RmFtaWxpZXMxNiggSERDMTYgaGRjLCBMUENTVFIgbHBzekZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9OVEVOVU1QUk9DMTYgZnVuYywgTFBBUkFNIGxQYXJhbSApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzE2X3dvcmRfbGx3bCApOworICAgIHJldHVybiBFbnVtRm9udEZhbWlsaWVzKCBoZGMsIGxwc3pGYW1pbHksIChGT05URU5VTVBST0MxNikmdGh1bmssIGxQYXJhbSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfTGluZUREQTE2ICAgKEdESS4xMDApCisgKi8KK3ZvaWQgVEhVTktfTGluZUREQTE2KCBJTlQxNiBuWFN0YXJ0LCBJTlQxNiBuWVN0YXJ0LCBJTlQxNiBuWEVuZCwgSU5UMTYgbllFbmQsCisgICAgICAgICAgICAgICAgICAgICAgTElORUREQVBST0MxNiBmdW5jLCBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMTZfd29yZF93d2wgKTsKKyAgICBMaW5lRERBMTYoIG5YU3RhcnQsIG5ZU3RhcnQsIG5YRW5kLCBuWUVuZCwgKExJTkVEREFQUk9DMTYpJnRodW5rLCBsUGFyYW0gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0xpbmVEREEzMiAgIChHREkzMi4yNDgpCisgKi8KK0JPT0wzMiBUSFVOS19MaW5lRERBMzIoIElOVDMyIG5YU3RhcnQsIElOVDMyIG5ZU3RhcnQsIElOVDMyIG5YRW5kLCBJTlQzMiBuWUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExJTkVEREFQUk9DMzIgZnVuYywgTFBBUkFNIGxQYXJhbSApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzMyXzMgKTsKKyAgICByZXR1cm4gTGluZUREQTMyKCBuWFN0YXJ0LCBuWVN0YXJ0LCBuWEVuZCwgbllFbmQsCisgICAgICAgICAgICAgICAgICAgICAgKExJTkVEREFQUk9DMzIpJnRodW5rLCBsUGFyYW0gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1XaW5kb3dzMTYgICAoVVNFUi41NCkKKyAqLworQk9PTDE2IFRIVU5LX0VudW1XaW5kb3dzMTYoIFdOREVOVU1QUk9DMTYgZnVuYywgTFBBUkFNIGxQYXJhbSApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzE2X3dvcmRfd2wgKTsKKyAgICByZXR1cm4gRW51bVdpbmRvd3MxNiggKFdOREVOVU1QUk9DMTYpJnRodW5rLCBsUGFyYW0gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1XaW5kb3dzMzIgICAoVVNFUjMyLjE5MikKKyAqLworQk9PTDMyIFRIVU5LX0VudW1XaW5kb3dzMzIoIFdOREVOVU1QUk9DMzIgZnVuYywgTFBBUkFNIGxQYXJhbSApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzMyXzIgKTsKKyAgICByZXR1cm4gRW51bVdpbmRvd3MzMiggKFdOREVOVU1QUk9DMzIpJnRodW5rLCBsUGFyYW0gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1DaGlsZFdpbmRvd3MxNiAgIChVU0VSLjU1KQorICovCitCT09MMTYgVEhVTktfRW51bUNoaWxkV2luZG93czE2KCBIV05EMTYgcGFyZW50LCBXTkRFTlVNUFJPQzE2IGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMTZfd29yZF93bCApOworICAgIHJldHVybiBFbnVtQ2hpbGRXaW5kb3dzMTYoIHBhcmVudCwgKFdOREVOVU1QUk9DMTYpJnRodW5rLCBsUGFyYW0gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1DaGlsZFdpbmRvd3MzMiAgIChVU0VSMzIuMTc3KQorICovCitCT09MMzIgVEhVTktfRW51bUNoaWxkV2luZG93czMyKCBIV05EMzIgcGFyZW50LCBXTkRFTlVNUFJPQzMyIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMzJfMiApOworICAgIHJldHVybiBFbnVtQ2hpbGRXaW5kb3dzMzIoIHBhcmVudCwgKFdOREVOVU1QUk9DMzIpJnRodW5rLCBsUGFyYW0gKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1UYXNrV2luZG93czE2ICAgKFVTRVIuMjI1KQorICovCitCT09MMTYgVEhVTktfRW51bVRhc2tXaW5kb3dzMTYoIEhUQVNLMTYgaFRhc2ssIFdOREVOVU1QUk9DMTYgZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzE2X3dvcmRfd2wgKTsKKyAgICByZXR1cm4gRW51bVRhc2tXaW5kb3dzMTYoIGhUYXNrLCAoV05ERU5VTVBST0MxNikmdGh1bmssIGxQYXJhbSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfRW51bVRocmVhZFdpbmRvd3MgICAoVVNFUjMyLjE4OSkKKyAqLworQk9PTDMyIFRIVU5LX0VudW1UaHJlYWRXaW5kb3dzKCBEV09SRCBpZCwgV05ERU5VTVBST0MzMiBmdW5jLCBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMzJfMiApOworICAgIHJldHVybiBFbnVtVGhyZWFkV2luZG93cyggaWQsIChXTkRFTlVNUFJPQzMyKSZ0aHVuaywgbFBhcmFtICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfRW51bVByb3BzMTYgICAoVVNFUi4yNykKKyAqLworSU5UMTYgVEhVTktfRW51bVByb3BzMTYoIEhXTkQxNiBod25kLCBQUk9QRU5VTVBST0MxNiBmdW5jICkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMTZfd29yZF93bHcgKTsKKyAgICByZXR1cm4gRW51bVByb3BzMTYoIGh3bmQsIChQUk9QRU5VTVBST0MxNikmdGh1bmsgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFVOS19FbnVtUHJvcHMzMkEgICAoVVNFUjMyLjE4NSkKKyAqLworSU5UMzIgVEhVTktfRW51bVByb3BzMzJBKCBIV05EMzIgaHduZCwgUFJPUEVOVU1QUk9DMzJBIGZ1bmMgKQoreworICAgIERFQ0xfVEhVTksoIHRodW5rLCBmdW5jLCBDYWxsVG8zMl8zICk7CisgICAgcmV0dXJuIEVudW1Qcm9wczMyQSggaHduZCwgKFBST1BFTlVNUFJPQzMyQSkmdGh1bmsgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFVOS19FbnVtUHJvcHMzMlcgICAoVVNFUjMyLjE4OCkKKyAqLworSU5UMzIgVEhVTktfRW51bVByb3BzMzJXKCBIV05EMzIgaHduZCwgUFJPUEVOVU1QUk9DMzJXIGZ1bmMgKQoreworICAgIERFQ0xfVEhVTksoIHRodW5rLCBmdW5jLCBDYWxsVG8zMl8zICk7CisgICAgcmV0dXJuIEVudW1Qcm9wczMyVyggaHduZCwgKFBST1BFTlVNUFJPQzMyVykmdGh1bmsgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFVOS19FbnVtUHJvcHNFeDMyQSAgIChVU0VSMzIuMTg2KQorICovCitJTlQzMiBUSFVOS19FbnVtUHJvcHNFeDMyQSggSFdORDMyIGh3bmQsIFBST1BFTlVNUFJPQ0VYMzJBIGZ1bmMsIExQQVJBTSBsUGFyYW0pCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzMyXzQgKTsKKyAgICByZXR1cm4gRW51bVByb3BzRXgzMkEoIGh3bmQsIChQUk9QRU5VTVBST0NFWDMyQSkmdGh1bmssIGxQYXJhbSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1Qcm9wc0V4MzJXICAgKFVTRVIzMi4xODcpCisgKi8KK0lOVDMyIFRIVU5LX0VudW1Qcm9wc0V4MzJXKCBIV05EMzIgaHduZCwgUFJPUEVOVU1QUk9DRVgzMlcgZnVuYywgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMzJfNCApOworICAgIHJldHVybiBFbnVtUHJvcHNFeDMyVyggaHduZCwgKFBST1BFTlVNUFJPQ0VYMzJXKSZ0aHVuaywgbFBhcmFtICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfR3JheVN0cmluZzE2ICAgKFVTRVIuMTg1KQorICovCitCT09MMTYgVEhVTktfR3JheVN0cmluZzE2KCBIREMxNiBoZGMsIEhCUlVTSDE2IGhiciwgR1JBWVNUUklOR1BST0MxNiBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSwgSU5UMTYgY2NoLCBJTlQxNiB4LCBJTlQxNiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgY3gsIElOVDE2IGN5ICkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMTZfd29yZF93bHcgKTsKKyAgICBpZiAoIWZ1bmMpCisgICAgICAgIHJldHVybiBHcmF5U3RyaW5nKCBoZGMsIGhiciwgTlVMTCwgbFBhcmFtLCBjY2gsIHgsIHksIGN4LCBjeSApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEdyYXlTdHJpbmcoIGhkYywgaGJyLCAoR1JBWVNUUklOR1BST0MxNikmdGh1bmssIGxQYXJhbSwgY2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgY3gsIGN5ICk7Cit9CisKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyLnNwZWMgYi9pZjE2MzIvdXNlci5zcGVjCmluZGV4IDVlMTA2NzUuLjEwYWY0ZDggMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIuc3BlYwpAQCAtMjYsNyArMjYsNyBAQAogMjQgIHBhc2NhbDE2IFJlbW92ZVByb3Aod29yZCBwdHIpIFJlbW92ZVByb3AxNgogMjUgIHBhc2NhbDE2IEdldFByb3Aod29yZCBwdHIpIEdldFByb3AxNgogMjYgIHBhc2NhbDE2IFNldFByb3Aod29yZCBwdHIgd29yZCkgU2V0UHJvcDE2Ci0yNyAgcGFzY2FsMTYgRW51bVByb3BzKHdvcmQgc2VncHRyKSBFbnVtUHJvcHMxNgorMjcgIHBhc2NhbDE2IEVudW1Qcm9wcyh3b3JkIHNlZ3B0cikgVEhVTktfRW51bVByb3BzMTYKIDI4ICBwYXNjYWwxNiBDbGllbnRUb1NjcmVlbih3b3JkIHB0cikgQ2xpZW50VG9TY3JlZW4xNgogMjkgIHBhc2NhbDE2IFNjcmVlblRvQ2xpZW50KHdvcmQgcHRyKSBTY3JlZW5Ub0NsaWVudDE2CiAzMCAgcGFzY2FsMTYgV2luZG93RnJvbVBvaW50KGxvbmcpIFdpbmRvd0Zyb21Qb2ludDE2CkBAIC01NCw4ICs1NCw4IEBACiAjNTEgQkVBUjUxCiA1MiAgcGFzY2FsMTYgQW55UG9wdXAoKSBBbnlQb3B1cAogNTMgIHBhc2NhbDE2IERlc3Ryb3lXaW5kb3cod29yZCkgRGVzdHJveVdpbmRvdwotNTQgIHBhc2NhbDE2IEVudW1XaW5kb3dzKHNlZ3B0ciBsb25nKSBFbnVtV2luZG93czE2Ci01NSAgcGFzY2FsMTYgRW51bUNoaWxkV2luZG93cyh3b3JkIHNlZ3B0ciBsb25nKSBFbnVtQ2hpbGRXaW5kb3dzMTYKKzU0ICBwYXNjYWwxNiBFbnVtV2luZG93cyhzZWdwdHIgbG9uZykgVEhVTktfRW51bVdpbmRvd3MxNgorNTUgIHBhc2NhbDE2IEVudW1DaGlsZFdpbmRvd3Mod29yZCBzZWdwdHIgbG9uZykgVEhVTktfRW51bUNoaWxkV2luZG93czE2CiA1NiAgcGFzY2FsMTYgTW92ZVdpbmRvdyh3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgTW92ZVdpbmRvdwogNTcgIHBhc2NhbDE2IFJlZ2lzdGVyQ2xhc3MocHRyKSBSZWdpc3RlckNsYXNzMTYKIDU4ICBwYXNjYWwxNiBHZXRDbGFzc05hbWUod29yZCBwdHIgd29yZCkgR2V0Q2xhc3NOYW1lMTYKQEAgLTExNyw3ICsxMTcsNyBAQAogMTE1IHBhc2NhbDE2IFJlcGx5TWVzc2FnZShsb25nKSBSZXBseU1lc3NhZ2UKIDExNiBwYXNjYWwxNiBQb3N0QXBwTWVzc2FnZSh3b3JkIHdvcmQgd29yZCBsb25nKSBQb3N0QXBwTWVzc2FnZQogMTE4IHBhc2NhbDE2IFJlZ2lzdGVyV2luZG93TWVzc2FnZShzZWdwdHIpIFJlZ2lzdGVyV2luZG93TWVzc2FnZTE2Ci0xMTcgc3R1YiBXaW5kb3dGcm9tREMKKzExNyBwYXNjYWwxNiBXaW5kb3dGcm9tREMod29yZCkgV2luZG93RnJvbURDCiAxMTkgcGFzY2FsICAgR2V0TWVzc2FnZVBvcygpIEdldE1lc3NhZ2VQb3MKIDEyMCBwYXNjYWwgICBHZXRNZXNzYWdlVGltZSgpIEdldE1lc3NhZ2VUaW1lCiAxMjEgcGFzY2FsICAgU2V0V2luZG93c0hvb2soc193b3JkIHNlZ3B0cikgU2V0V2luZG93c0hvb2sKQEAgLTE4NCw3ICsxODQsNyBAQAogMTgyIHBhc2NhbDE2IEtpbGxTeXN0ZW1UaW1lcih3b3JkIHdvcmQpIEtpbGxTeXN0ZW1UaW1lcjE2CiAxODMgcGFzY2FsMTYgR2V0Q2FyZXRQb3MocHRyKSBHZXRDYXJldFBvczE2CiAxODQgc3R1YiBRdWVyeVNlbmRNZXNzYWdlCi0xODUgcGFzY2FsMTYgR3JheVN0cmluZyh3b3JkIHdvcmQgc2VncHRyIHNlZ3B0ciBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkKSBHcmF5U3RyaW5nCisxODUgcGFzY2FsMTYgR3JheVN0cmluZyh3b3JkIHdvcmQgc2VncHRyIHNlZ3B0ciBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkKSBUSFVOS19HcmF5U3RyaW5nMTYKIDE4NiBwYXNjYWwxNiBTd2FwTW91c2VCdXR0b24od29yZCkgU3dhcE1vdXNlQnV0dG9uCiAxODcgcGFzY2FsMTYgRW5kTWVudSgpIEVuZE1lbnUKIDE4OCBwYXNjYWwxNiBTZXRTeXNNb2RhbFdpbmRvdyh3b3JkKSBTZXRTeXNNb2RhbFdpbmRvdzE2CkBAIC0yMjUsNyArMjI1LDcgQEAKIDIyMiBwYXNjYWwxNiBHZXRLZXlib2FyZFN0YXRlKHB0cikgR2V0S2V5Ym9hcmRTdGF0ZQogMjIzIHBhc2NhbDE2IFNldEtleWJvYXJkU3RhdGUocHRyKSBTZXRLZXlib2FyZFN0YXRlCiAyMjQgcGFzY2FsMTYgR2V0V2luZG93VGFzayh3b3JkKSBHZXRXaW5kb3dUYXNrMTYKLTIyNSBwYXNjYWwxNiBFbnVtVGFza1dpbmRvd3Mod29yZCBzZWdwdHIgbG9uZykgRW51bVRhc2tXaW5kb3dzMTYKKzIyNSBwYXNjYWwxNiBFbnVtVGFza1dpbmRvd3Mod29yZCBzZWdwdHIgbG9uZykgVEhVTktfRW51bVRhc2tXaW5kb3dzMTYKIDIyNiBzdHViIExvY2tJbnB1dAogMjI3IHBhc2NhbDE2IEdldE5leHREbGdHcm91cEl0ZW0od29yZCB3b3JkIHdvcmQpIEdldE5leHREbGdHcm91cEl0ZW0KIDIyOCBwYXNjYWwxNiBHZXROZXh0RGxnVGFiSXRlbSh3b3JkIHdvcmQgd29yZCkgR2V0TmV4dERsZ1RhYkl0ZW0KZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyMzIuc3BlYyBiL2lmMTYzMi91c2VyMzIuc3BlYwppbmRleCBkNmRhNTU1Li5hMjc3ZTE2IDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlcjMyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIzMi5zcGVjCkBAIC0xMiw3ICsxMiw3IEBACiAwMDA3IHN0dWIgQXR0YWNoVGhyZWFkSW5wdXQKIDAwMDggc3R1YiBCZWdpbkRlZmVyV2luZG93UG9zCiAwMDA5IHN0ZGNhbGwgQmVnaW5QYWludChsb25nIHB0cikgQmVnaW5QYWludDMyCi0wMDEwIHN0dWIgQnJpbmdXaW5kb3dUb1RvcAorMDAxMCBzdGRjYWxsIEJyaW5nV2luZG93VG9Ub3AobG9uZykgQnJpbmdXaW5kb3dUb1RvcAogMDAxMSBzdHViIEJyb2FkY2FzdFN5c3RlbU1lc3NhZ2UKIDAwMTIgc3R1YiBDYWxjQ2hpbGRTY3JvbGwKIDAwMTMgc3R1YiBDYWxsTXNnRmlsdGVyCkBAIC04Myw3ICs4Myw3IEBACiAwMDc4IHN0dWIgQ3JlYXRlTURJV2luZG93QQogMDA3OSBzdHViIENyZWF0ZU1ESVdpbmRvd1cKIDAwODAgc3R1YiBDcmVhdGVNZW51Ci0wMDgxIHN0dWIgQ3JlYXRlUG9wdXBNZW51CiswMDgxIHN0ZGNhbGwgQ3JlYXRlUG9wdXBNZW51KCkgQ3JlYXRlUG9wdXBNZW51CiAwMDgyIHN0ZGNhbGwgQ3JlYXRlV2luZG93RXhBKGxvbmcgcHRyIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgCiAJCQkJbG9uZyBsb25nIGxvbmcgcHRyKSBDcmVhdGVXaW5kb3dFeDMyQQogMDA4MyBzdGRjYWxsIENyZWF0ZVdpbmRvd0V4Vyhsb25nIHB0ciBwdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIApAQCAtMTgxLDcgKzE4MSw3IEBACiAwMTc0IHN0dWIgRW5kTWVudQogMDE3NSBzdGRjYWxsIEVuZFBhaW50KGxvbmcgcHRyKSBFbmRQYWludDMyCiAwMTc2IHN0dWIgRW5kVGFzawotMDE3NyBzdGRjYWxsIEVudW1DaGlsZFdpbmRvd3MobG9uZyBwdHIgbG9uZykgRW51bUNoaWxkV2luZG93czMyCiswMTc3IHN0ZGNhbGwgRW51bUNoaWxkV2luZG93cyhsb25nIHB0ciBsb25nKSBUSFVOS19FbnVtQ2hpbGRXaW5kb3dzMzIKIDAxNzggc3R1YiBFbnVtQ2xpcGJvYXJkRm9ybWF0cwogMDE3OSBzdHViIEVudW1EZXNrdG9wc0EKIDAxODAgc3R1YiBFbnVtRGVza3RvcHNXCkBAIC0xODksMTQgKzE4OSwxNCBAQAogMDE4MiBzdHViIEVudW1EaXNwbGF5RGV2aWNlTW9kZXNXCiAwMTgzIHN0dWIgRW51bURpc3BsYXlEZXZpY2VzQQogMDE4NCBzdHViIEVudW1EaXNwbGF5RGV2aWNlc1cKLTAxODUgc3RkY2FsbCBFbnVtUHJvcHNBKGxvbmcgcHRyKSBFbnVtUHJvcHMzMkEKLTAxODYgc3RkY2FsbCBFbnVtUHJvcHNFeEEobG9uZyBwdHIgbG9uZykgRW51bVByb3BzRXgzMkEKLTAxODcgc3RkY2FsbCBFbnVtUHJvcHNFeFcobG9uZyBwdHIgbG9uZykgRW51bVByb3BzRXgzMlcKLTAxODggc3RkY2FsbCBFbnVtUHJvcHNXKGxvbmcgcHRyKSBFbnVtUHJvcHMzMlcKLTAxODkgc3RkY2FsbCBFbnVtVGhyZWFkV2luZG93cyhsb25nIHB0ciBsb25nKSBFbnVtVGhyZWFkV2luZG93cworMDE4NSBzdGRjYWxsIEVudW1Qcm9wc0EobG9uZyBwdHIpIFRIVU5LX0VudW1Qcm9wczMyQQorMDE4NiBzdGRjYWxsIEVudW1Qcm9wc0V4QShsb25nIHB0ciBsb25nKSBUSFVOS19FbnVtUHJvcHNFeDMyQQorMDE4NyBzdGRjYWxsIEVudW1Qcm9wc0V4Vyhsb25nIHB0ciBsb25nKSBUSFVOS19FbnVtUHJvcHNFeDMyVworMDE4OCBzdGRjYWxsIEVudW1Qcm9wc1cobG9uZyBwdHIpIFRIVU5LX0VudW1Qcm9wczMyVworMDE4OSBzdGRjYWxsIEVudW1UaHJlYWRXaW5kb3dzKGxvbmcgcHRyIGxvbmcpIFRIVU5LX0VudW1UaHJlYWRXaW5kb3dzCiAwMTkwIHN0dWIgRW51bVdpbmRvd1N0YXRpb25zQQogMDE5MSBzdHViIEVudW1XaW5kb3dTdGF0aW9uc1cKLTAxOTIgc3RkY2FsbCBFbnVtV2luZG93cyhwdHIgbG9uZykgRW51bVdpbmRvd3MzMgorMDE5MiBzdGRjYWxsIEVudW1XaW5kb3dzKHB0ciBsb25nKSBUSFVOS19FbnVtV2luZG93czMyCiAwMTkzIHN0ZGNhbGwgRXF1YWxSZWN0KHB0ciBwdHIpIEVxdWFsUmVjdDMyCiAwMTk0IHN0ZGNhbGwgRXhjbHVkZVVwZGF0ZVJnbihsb25nIGxvbmcpIEV4Y2x1ZGVVcGRhdGVSZ24KIDAxOTUgc3R1YiBFeGl0V2luZG93c0V4CkBAIC0yNTIsNyArMjUyLDcgQEAKIDAyNDUgc3R1YiBHZXRLQkNvZGVQYWdlCiAwMjQ2IHN0dWIgR2V0S2V5TmFtZVRleHRBCiAwMjQ3IHN0dWIgR2V0S2V5TmFtZVRleHRXCi0wMjQ4IHN0dWIgR2V0S2V5U3RhdGUKKzAyNDggc3RkY2FsbCBHZXRLZXlTdGF0ZShsb25nKSBHZXRLZXlTdGF0ZQogMDI0OSBzdHViIEdldEtleWJvYXJkTGF5b3V0CiAwMjUwIHN0dWIgR2V0S2V5Ym9hcmRMYXlvdXRMaXN0CiAwMjUxIHN0dWIgR2V0S2V5Ym9hcmRMYXlvdXROYW1lQQpAQCAtMjgxLDcgKzI4MSw3IEBACiAwMjc0IHN0dWIgR2V0TmV4dERsZ0dyb3VwSXRlbQogMDI3NSBzdHViIEdldE5leHREbGdUYWJJdGVtCiAwMjc2IHN0dWIgR2V0T3BlbkNsaXBib2FyZFdpbmRvdwotMDI3NyBzdHViIEdldFBhcmVudAorMDI3NyBzdGRjYWxsIEdldFBhcmVudChsb25nKSBHZXRQYXJlbnQKIDAyNzggc3R1YiBHZXRQcmlvcml0eUNsaXBib2FyZEZvcm1hdAogMDI3OSBzdHViIEdldFByb2Nlc3NXaW5kb3dTdGF0aW9uCiAwMjgwIHN0ZGNhbGwgR2V0UHJvcEEobG9uZyBwdHIpIEdldFByb3AzMkEKQEAgLTM0NSw5ICszNDUsOSBAQAogMDMzOCBzdHViIElzQ2hpbGQKIDAzMzkgc3RkY2FsbCBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShsb25nKSBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZQogMDM0MCBzdHViIElzRGlhbG9nTWVzc2FnZQotMDM0MSBzdHViIElzRGlhbG9nTWVzc2FnZUEKKzAzNDEgc3RkY2FsbCBJc0RpYWxvZ01lc3NhZ2VBKGxvbmcgcHRyKSBJc0RpYWxvZ01lc3NhZ2UzMkEKIDAzNDIgc3R1YiBJc0RpYWxvZ01lc3NhZ2VXCi0wMzQzIHN0dWIgSXNEbGdCdXR0b25DaGVja2VkCiswMzQzIHN0ZGNhbGwgSXNEbGdCdXR0b25DaGVja2VkKGxvbmcgbG9uZykgSXNEbGdCdXR0b25DaGVja2VkCiAwMzQ0IHN0ZGNhbGwgSXNJY29uaWMobG9uZykgSXNJY29uaWMKIDAzNDUgc3R1YiBJc01lbnUKIDAzNDYgc3RkY2FsbCBJc1JlY3RFbXB0eShwdHIpIElzUmVjdEVtcHR5MzIKQEAgLTU2MSw3ICs1NjEsNyBAQAogMDU1NCBzdHViIFRyYW5zbGF0ZU1ESVN5c0FjY2VsCiAwNTU1IHN0ZGNhbGwgVHJhbnNsYXRlTWVzc2FnZShwdHIpIFVTRVIzMl9UcmFuc2xhdGVNZXNzYWdlCiAwNTU2IHN0dWIgVW5ob29rV2luZG93c0hvb2sKLTA1NTcgc3R1YiBVbmhvb2tXaW5kb3dzSG9va0V4CiswNTU3IHN0ZGNhbGwgVW5ob29rV2luZG93c0hvb2tFeChsb25nKSBVbmhvb2tXaW5kb3dzSG9va0V4MzIKIDA1NTggc3RkY2FsbCBVbmlvblJlY3QocHRyIHB0ciBwdHIpIFVuaW9uUmVjdDMyCiAwNTU5IHN0dWIgVW5sb2FkS2V5Ym9hcmRMYXlvdXQKIDA1NjAgc3R1YiBVbmxvY2tXaW5kb3dTdGF0aW9uCkBAIC01ODQsNyArNTg0LDcgQEAKIDA1Nzcgc3R1YiBXYWl0TWVzc2FnZQogMDU3OCBzdGRjYWxsIFdpbkhlbHBBKGxvbmcgcHRyIGxvbmcgbG9uZykJV0lOMzJfV2luSGVscEEKIDA1Nzkgc3R1YiBXaW5IZWxwVwotMDU4MCBzdHViIFdpbmRvd0Zyb21EQworMDU4MCBzdGRjYWxsIFdpbmRvd0Zyb21EQyhsb25nKSBXaW5kb3dGcm9tREMKIDA1ODEgc3RkY2FsbCBXaW5kb3dGcm9tUG9pbnQobG9uZyBsb25nKSBXaW5kb3dGcm9tUG9pbnQzMgogMDU4MiBzdHViIGtleWJkX2V2ZW50CiAwNTgzIHN0dWIgbW91c2VfZXZlbnQKZGlmZiAtLWdpdCBhL2lmMTYzMi93cHJvY3Muc3BlYyBiL2lmMTYzMi93cHJvY3Muc3BlYwppbmRleCAxZjdiMjMzLi4zZjMzYmJjIDEwMDY0NAotLS0gYS9pZjE2MzIvd3Byb2NzLnNwZWMKKysrIGIvaWYxNjMyL3dwcm9jcy5zcGVjCkBAIC0yNSw4ICsyNSw2IEBACiAyNyBwYXNjYWwgRW50cnlBZGRyUHJvYyh3b3JkIHdvcmQpIE1PRFVMRV9HZXRFbnRyeVBvaW50CiAyOCBwYXNjYWwgTXlBbGxvYyh3b3JkIHdvcmQgd29yZCkgTU9EVUxFX0FsbG9jYXRlU2VnbWVudAogMzAgcGFzY2FsIEZvcm1hdENoYXJEbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIEZvcm1hdENoYXJEbGdQcm9jCi0zMSBwYXNjYWwxNiBGb250U3R5bGVFbnVtUHJvYyhwdHIgcHRyIHdvcmQgbG9uZykgICBGb250U3R5bGVFbnVtUHJvYwotMzIgcGFzY2FsMTYgRm9udEZhbWlseUVudW1Qcm9jKHB0ciBwdHIgd29yZCBsb25nKSAgRm9udEZhbWlseUVudW1Qcm9jCiAgCiAjIEludGVycnVwdCB2ZWN0b3JzIDAtMjU1IGFyZSBvcmRpbmFscyAxMDAtMzU1CiAjIFRoZSAnd29yZCcgcGFyYW1ldGVyIGFyZSB0aGUgZmxhZ3MgcHVzaGVkIG9uIHRoZSBzdGFjayBieSB0aGUgaW50ZXJydXB0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbGxiYWNrLmggYi9pbmNsdWRlL2NhbGxiYWNrLmgKaW5kZXggZDQyMGY3Ni4uMDMzOWE4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYWxsYmFjay5oCisrKyBiL2luY2x1ZGUvY2FsbGJhY2suaApAQCAtNCwxMyArNCwxMCBAQAogICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2lmbmRlZiBXSU5FX0NBTExCQUNLX0gKLSNkZWZpbmUgV0lORV9DQUxMQkFDS19ICisjaWZuZGVmIF9fV0lORV9DQUxMQkFDS19ICisjZGVmaW5lIF9fV0lORV9DQUxMQkFDS19ICiAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKKyNpbmNsdWRlICJ3aW50eXBlcy5oIgogCiBleHRlcm4KIGludCBDYWxsVG8zMl9MYXJnZVN0YWNrKCBpbnQgKCpmdW5jKSgpLCBpbnQgbmJhcmdzLCAuLi4gKTsKQEAgLTE5LDI3ICsxNiwyNyBAQAogLyogTGlzdCBvZiB0aGUgMTYtYml0IGNhbGxiYWNrIGZ1bmN0aW9ucy4gVGhpcyBsaXN0IGlzIHVzZWQgICovCiAvKiBieSB0aGUgYnVpbGQgcHJvZ3JhbSB0byBnZW5lcmF0ZSB0aGUgZmlsZSBpZjE2MzIvY2FsbHRvMTYuUyAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVuYyAgICAgZHMgICAgcGFyYW1ldGVycyAqLwotZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF8gICAgICggRkFSUFJPQzE2LCBXT1JEICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVuYyAgICAgcGFyYW1ldGVycyAqLworZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF8gICAgICggRkFSUFJPQzE2ICk7CiAKICNpZm5kZWYgV0lORUxJQgogCi1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3cgICAgKEZBUlBST0MxNiwgV09SRCwgV09SRCk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3d3ICAgKEZBUlBST0MxNiwgV09SRCwgV09SRCwgV09SRCk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3dsICAgKEZBUlBST0MxNiwgV09SRCwgV09SRCwgTE9ORyk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX2xsICAgKEZBUlBST0MxNiwgV09SRCwgTE9ORywgTE9ORyk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3d3dyAgKEZBUlBST0MxNiwgV09SRCwgV09SRCwgV09SRCwgV09SRCk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3d3bCAgKEZBUlBST0MxNiwgV09SRCwgV09SRCwgV09SRCwgTE9ORyk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3dsdyAgKEZBUlBST0MxNiwgV09SRCwgV09SRCwgTE9ORywgV09SRCk7Ci1leHRlcm4gTE9ORyBDYWxsVG8xNl9sb25nX3d3bCAgKEZBUlBST0MxNiwgV09SRCwgV09SRCwgV09SRCwgTE9ORyk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX2xsd2wgKEZBUlBST0MxNiwgV09SRCwgTE9ORywgTE9ORywgV09SRCwgTE9ORyk7Ci1leHRlcm4gTE9ORyBDYWxsVG8xNl9sb25nX3d3d2wgKEZBUlBST0MxNiwgV09SRCwgV09SRCwgV09SRCwgV09SRCwgTE9ORyk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX2x3d3cgKEZBUlBST0MxNiwgV09SRCwgTE9ORywgV09SRCwgV09SRCwgV09SRCk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3d3bGwgKEZBUlBST0MxNiwgV09SRCwgV09SRCwgV09SRCwgTE9ORywgTE9ORyk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3dsbHdsKEZBUlBST0MxNiwgV09SRCwgV09SRCwgTE9ORywgTE9ORywgV09SRCwgTE9ORyk7Ci1leHRlcm4gTE9ORyBDYWxsVG8xNl9sb25nX2x3d2xsKEZBUlBST0MxNiwgV09SRCwgTE9ORywgV09SRCwgV09SRCwgTE9ORywgTE9ORyk7Ci1leHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3d3bGxsKEZBUlBST0MxNiwgV09SRCwgV09SRCwgV09SRCwgTE9ORywgTE9ORywgTE9ORyk7Ci1leHRlcm4gTE9ORyBDYWxsVG8xNl9sb25nX2xsbGxsbGx3bHd3d2woIEZBUlBST0MxNiwgV09SRCwgTE9ORywgTE9ORywgTE9ORywKK2V4dGVybiBXT1JEIENhbGxUbzE2X3dvcmRfdyAgICAoIEZBUlBST0MxNiwgV09SRCApOworZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF93dyAgICggRkFSUFJPQzE2LCBXT1JELCBXT1JEICk7CitleHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3dsICAgKCBGQVJQUk9DMTYsIFdPUkQsIExPTkcgKTsKK2V4dGVybiBXT1JEIENhbGxUbzE2X3dvcmRfbGwgICAoIEZBUlBST0MxNiwgTE9ORywgTE9ORyApOworZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF93d3cgICggRkFSUFJPQzE2LCBXT1JELCBXT1JELCBXT1JEICk7CitleHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3d3bCAgKCBGQVJQUk9DMTYsIFdPUkQsIFdPUkQsIExPTkcgKTsKK2V4dGVybiBXT1JEIENhbGxUbzE2X3dvcmRfd2x3ICAoIEZBUlBST0MxNiwgV09SRCwgTE9ORywgV09SRCApOworZXh0ZXJuIExPTkcgQ2FsbFRvMTZfbG9uZ193d2wgICggRkFSUFJPQzE2LCBXT1JELCBXT1JELCBMT05HICk7CitleHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX2xsd2wgKCBGQVJQUk9DMTYsIExPTkcsIExPTkcsIFdPUkQsIExPTkcgKTsKK2V4dGVybiBMT05HIENhbGxUbzE2X2xvbmdfd3d3bCAoIEZBUlBST0MxNiwgV09SRCwgV09SRCwgV09SRCwgTE9ORyApOworZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF9sd3d3ICggRkFSUFJPQzE2LCBMT05HLCBXT1JELCBXT1JELCBXT1JEICk7CitleHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3d3bGwgKCBGQVJQUk9DMTYsIFdPUkQsIFdPUkQsIExPTkcsIExPTkcgKTsKK2V4dGVybiBXT1JEIENhbGxUbzE2X3dvcmRfd2xsd2woIEZBUlBST0MxNiwgV09SRCwgTE9ORywgTE9ORywgV09SRCwgTE9ORyApOworZXh0ZXJuIExPTkcgQ2FsbFRvMTZfbG9uZ19sd3dsbCggRkFSUFJPQzE2LCBMT05HLCBXT1JELCBXT1JELCBMT05HLCBMT05HICk7CitleHRlcm4gV09SRCBDYWxsVG8xNl93b3JkX3d3bGxsKCBGQVJQUk9DMTYsIFdPUkQsIFdPUkQsIExPTkcsIExPTkcsIExPTkcgKTsKK2V4dGVybiBMT05HIENhbGxUbzE2X2xvbmdfbGxsbGxsbHdsd3d3bCggRkFSUFJPQzE2LCBMT05HLCBMT05HLCBMT05HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLCBMT05HLCBMT05HLCBMT05HLCBXT1JELCBMT05HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JELCBXT1JELCBXT1JELCBMT05HICk7CiAKQEAgLTQ3LDQ2ICs0NCwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgYngsIFdPUkQgY3gsIFdPUkQgZHgsIFdPUkQgc2ksIFdPUkQgZGkgKTsKIAogI2RlZmluZSBDYWxsRENIb29rUHJvYyggZnVuYywgaGRjLCBjb2RlLCBkYXRhLCBscGFyYW0pIFwKLSAgICBDYWxsVG8xNl93b3JkX3d3bGwoIGZ1bmMsIENVUlJFTlRfRFMsIGhkYywgY29kZSwgZGF0YSwgbHBhcmFtICkKKyAgICBDYWxsVG8xNl93b3JkX3d3bGwoIGZ1bmMsIGhkYywgY29kZSwgZGF0YSwgbHBhcmFtICkKICNkZWZpbmUgQ2FsbERyaXZlclByb2MoIGZ1bmMsIGR3SWQsIG1zZywgaGRydnIsIGxwYXJhbTEsIGxwYXJhbTIgKSBcCi0gICAgQ2FsbFRvMTZfbG9uZ19sd3dsbCggZnVuYywgQ1VSUkVOVF9EUywgZHdJZCwgbXNnLCBoZHJ2ciwgbHBhcmFtMSwgbHBhcmFtMiApCi0jZGVmaW5lIENhbGxFbnVtQ2hpbGRQcm9jKCBmdW5jLCBod25kLCBsUGFyYW0gKSBcCi0gICAgQ2FsbFRvMTZfd29yZF93bCggZnVuYywgQ1VSUkVOVF9EUywgaHduZCwgbFBhcmFtICkKLSNkZWZpbmUgQ2FsbEVudW1Gb250RmFtUHJvYyggZnVuYywgbHBmb250LCBscG1ldHJpYywgdHlwZSwgbFBhcmFtICkgXAotICAgIENhbGxUbzE2X3dvcmRfbGx3bCggZnVuYywgQ1VSUkVOVF9EUywgbHBmb250LCBscG1ldHJpYywgdHlwZSwgbFBhcmFtICkKLSNkZWZpbmUgQ2FsbEVudW1Gb250c1Byb2MoIGZ1bmMsIGxwZm9udCwgbHBtZXRyaWMsIHR5cGUsIGxQYXJhbSApIFwKLSAgICBDYWxsVG8xNl93b3JkX2xsd2woIGZ1bmMsIENVUlJFTlRfRFMsIGxwZm9udCwgbHBtZXRyaWMsIHR5cGUsIGxQYXJhbSApCi0jZGVmaW5lIENhbGxFbnVtTWV0YWZpbGVQcm9jKCBmdW5jLCBoZGMsIGxwdGFibGUsIGxwcmVjb3JkLCBvYmpzLCBsUGFyYW0gKSBcCi0gICAgQ2FsbFRvMTZfd29yZF93bGx3bChmdW5jLCBDVVJSRU5UX0RTLCBoZGMsIGxwdGFibGUsIGxwcmVjb3JkLCBvYmpzLCBsUGFyYW0pCi0jZGVmaW5lIENhbGxFbnVtT2JqZWN0c1Byb2MoIGZ1bmMsIGxwb2JqLCBsUGFyYW0gKSBcCi0gICAgQ2FsbFRvMTZfd29yZF9sbCggZnVuYywgQ1VSUkVOVF9EUywgbHBvYmosIGxQYXJhbSApCi0jZGVmaW5lIENhbGxFbnVtUHJvcFByb2MxNiggZnVuYywgaHduZCwgbHBzdHIsIGhhbmRsZSApIFwKLSAgICBDYWxsVG8xNl93b3JkX3dsdyggKEZBUlBST0MxNikoZnVuYyksIENVUlJFTlRfRFMsIGh3bmQsIGxwc3RyLCBoYW5kbGUgKQotI2RlZmluZSBDYWxsRW51bVRhc2tXbmRQcm9jKCBmdW5jLCBod25kLCBsUGFyYW0gKSBcCi0gICAgQ2FsbFRvMTZfd29yZF93bCggZnVuYywgQ1VSUkVOVF9EUywgaHduZCwgbFBhcmFtICkKLSNkZWZpbmUgQ2FsbEVudW1XaW5kb3dzUHJvYzE2KCBmdW5jLCBod25kLCBsUGFyYW0gKSBcCi0gICAgQ2FsbFRvMTZfd29yZF93bCggZnVuYywgQ1VSUkVOVF9EUywgaHduZCwgbFBhcmFtICkKLSNkZWZpbmUgQ2FsbExpbmVEREFQcm9jKCBmdW5jLCB4UG9zLCB5UG9zLCBsUGFyYW0gKSBcCi0gICAgQ2FsbFRvMTZfd29yZF93d2woIGZ1bmMsIENVUlJFTlRfRFMsIHhQb3MsIHlQb3MsIGxQYXJhbSApCi0jZGVmaW5lIENhbGxHcmF5U3RyaW5nUHJvYyggZnVuYywgaGRjLCBsUGFyYW0sIGNjaCApIFwKLSAgICBDYWxsVG8xNl93b3JkX3dsdyggZnVuYywgQ1VSUkVOVF9EUywgaGRjLCBsUGFyYW0sIGNjaCApCisgICAgQ2FsbFRvMTZfbG9uZ19sd3dsbCggZnVuYywgZHdJZCwgbXNnLCBoZHJ2ciwgbHBhcmFtMSwgbHBhcmFtMiApCiAjZGVmaW5lIENhbGxIb29rUHJvYyggZnVuYywgY29kZSwgd1BhcmFtLCBsUGFyYW0gKSBcCi0gICAgQ2FsbFRvMTZfbG9uZ193d2woIGZ1bmMsIENVUlJFTlRfRFMsIGNvZGUsIHdQYXJhbSwgbFBhcmFtICkKKyAgICBDYWxsVG8xNl9sb25nX3d3bCggZnVuYywgY29kZSwgd1BhcmFtLCBsUGFyYW0gKQogI2RlZmluZSBDYWxsVGltZUZ1bmNQcm9jKCBmdW5jLCBpZCwgbXNnLCBkd1VzZXIsIGR3MSwgZHcyICkgXAotICAgIENhbGxUbzE2X3dvcmRfd3dsbGwoIGZ1bmMsIENVUlJFTlRfRFMsIGlkLCBtc2csIGR3VXNlciwgZHcxLCBkdzIgKQorICAgIENhbGxUbzE2X3dvcmRfd3dsbGwoIGZ1bmMsIGlkLCBtc2csIGR3VXNlciwgZHcxLCBkdzIgKQogI2RlZmluZSBDYWxsV2luZG93c0V4aXRQcm9jKCBmdW5jLCBuRXhpdFR5cGUgKSBcCi0gICAgQ2FsbFRvMTZfd29yZF93KCBmdW5jLCBDVVJSRU5UX0RTLCBuRXhpdFR5cGUgKQotI2RlZmluZSBDYWxsV25kUHJvYzE2KCBmdW5jLCBkcywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApIFwKLSAgICBDYWxsVG8xNl9sb25nX3d3d2woIChGQVJQUk9DMTYpKGZ1bmMpLCBkcywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApCisgICAgQ2FsbFRvMTZfd29yZF93KCBmdW5jLCBuRXhpdFR5cGUgKQorI2RlZmluZSBDYWxsV25kUHJvYzE2KCBmdW5jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICkgXAorICAgIENhbGxUbzE2X2xvbmdfd3d3bCggKEZBUlBST0MxNikoZnVuYyksIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKQogI2RlZmluZSBDYWxsV29yZEJyZWFrUHJvYyggZnVuYywgbHBjaCwgaWNoQ3VycmVudCwgY2NoLCBjb2RlICkgXAotICAgIENhbGxUbzE2X3dvcmRfbHd3dyggZnVuYywgQ1VSUkVOVF9EUywgbHBjaCwgaWNoQ3VycmVudCwgY2NoLCBjb2RlICkKLSNkZWZpbmUgQ2FsbFduZFByb2NOQ0NSRUFURTE2KCBmdW5jLCBkcywgZXhTdHlsZSwgY2xzTmFtZSwgd2luTmFtZSwgc3R5bGUsIFwKKyAgICBDYWxsVG8xNl93b3JkX2x3d3coIGZ1bmMsIGxwY2gsIGljaEN1cnJlbnQsIGNjaCwgY29kZSApCisjZGVmaW5lIENhbGxXbmRQcm9jTkNDUkVBVEUxNiggZnVuYywgZXhTdHlsZSwgY2xzTmFtZSwgd2luTmFtZSwgc3R5bGUsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCBjeCwgY3ksIGhwYXJlbnQsIGhtZW51LCBpbnN0YW5jZSwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApIFwKLSAgICBDYWxsVG8xNl9sb25nX2xsbGxsbGx3bHd3d2woIChGQVJQUk9DMTYpKGZ1bmMpLCBkcywgZXhTdHlsZSwgY2xzTmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luTmFtZSwgc3R5bGUsIE1BS0VMT05HKHkseCksIE1BS0VMT05HKGN5LGN4KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoaG1lbnUsaHBhcmVudCksIGluc3RhbmNlLCBwYXJhbXMsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKQorICAgIENhbGxUbzE2X2xvbmdfbGxsbGxsbHdsd3d3bCggKEZBUlBST0MxNikoZnVuYyksIGV4U3R5bGUsIGNsc05hbWUsIHdpbk5hbWUsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUsIE1BS0VMT05HKHkseCksIE1BS0VMT05HKGN5LGN4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoaG1lbnUsaHBhcmVudCksIGluc3RhbmNlLCBwYXJhbXMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKQogCiAvKiBMaXN0IG9mIHRoZSAzMi1iaXQgY2FsbGJhY2sgZnVuY3Rpb25zLiBUaGlzIGxpc3QgaXMgdXNlZCAgKi8KIC8qIGJ5IHRoZSBidWlsZCBwcm9ncmFtIHRvIGdlbmVyYXRlIHRoZSBmaWxlIGlmMTYzMi9jYWxsdG8zMi5TICovCkBAIC0xMDAsMTIgKzc3LDYgQEAKICAgICBDYWxsVG8zMl8wKCBmdW5jICkKICNkZWZpbmUgQ2FsbERMTEVudHJ5UHJvYzMyKCBmdW5jLCBobW9kdWxlLCBhLCBiICkgXAogICAgIENhbGxUbzMyXzMoIGZ1bmMsIGhtb2R1bGUsIGEsIGIgKQotI2RlZmluZSBDYWxsRW51bVByb3BQcm9jMzIoIGZ1bmMsIGh3bmQsIGxwc3RyLCBoYW5kbGUgKSBcCi0gICAgQ2FsbFRvMzJfMyggKEZBUlBST0MzMikoZnVuYyksIGh3bmQsIChEV09SRCkobHBzdHIpLCBoYW5kbGUgKQotI2RlZmluZSBDYWxsRW51bVByb3BQcm9jRXgzMiggZnVuYywgaHduZCwgbHBzdHIsIGhhbmRsZSwgZGF0YSApIFwKLSAgICBDYWxsVG8zMl80KCAoRkFSUFJPQzMyKShmdW5jKSwgaHduZCwgKERXT1JEKShscHN0ciksIGhhbmRsZSwgZGF0YSApCi0jZGVmaW5lIENhbGxFbnVtV2luZG93c1Byb2MzMiggZnVuYywgaHduZCwgbFBhcmFtICkgXAotICAgIENhbGxUbzMyXzIoIGZ1bmMsIGh3bmQsIGxQYXJhbSApCiAjZGVmaW5lIENhbGxXbmRQcm9jMzIoIGZ1bmMsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKSBcCiAgICAgQ2FsbFRvMzJfNCggZnVuYywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApCiAKQEAgLTExNiwzOSArODcsMTMgQEAKICAgICAoKmZ1bmMpKCBoZGMsIGNvZGUsIGRhdGEsIGxwYXJhbSApCiAjZGVmaW5lIENhbGxEcml2ZXJQcm9jKCBmdW5jLCBkd0lkLCBtc2csIGhkcnZyLCBscGFyYW0xLCBscGFyYW0yICkgXAogICAgICgqZnVuYykoIGR3SWQsIG1zZywgaGRydnIsIGxwYXJhbTEsIGxwYXJhbTIgKQotI2RlZmluZSBDYWxsRW51bUNoaWxkUHJvYyggZnVuYywgaHduZCwgbFBhcmFtICkgXAotICAgICgqZnVuYykoIGh3bmQsIGxQYXJhbSApCi0jZGVmaW5lIENhbGxFbnVtRm9udEZhbVByb2MoIGZ1bmMsIGxwZm9udCwgbHBtZXRyaWMsIHR5cGUsIGxQYXJhbSApIFwKLSAgICAoKmZ1bmMpKCBscGZvbnQsIGxwbWV0cmljLCB0eXBlLCBsUGFyYW0gKQotI2RlZmluZSBDYWxsRW51bUZvbnRzUHJvYyggZnVuYywgbHBmb250LCBscG1ldHJpYywgdHlwZSwgbFBhcmFtICkgXAotICAgICgqZnVuYykoIGxwZm9udCwgbHBtZXRyaWMsIHR5cGUsIGxQYXJhbSApCi0jZGVmaW5lIENhbGxFbnVtTWV0YWZpbGVQcm9jKCBmdW5jLCBoZGMsIGxwdGFibGUsIGxwcmVjb3JkLCBvYmpzLCBsUGFyYW0gKSBcCi0gICAgKCpmdW5jKSggaGRjLCBscHRhYmxlLCBscHJlY29yZCwgb2JqcywgbFBhcmFtKQotI2RlZmluZSBDYWxsRW51bU9iamVjdHNQcm9jKCBmdW5jLCBscG9iaiwgbFBhcmFtICkgXAotICAgICgqZnVuYykoIGxwb2JqLCBsUGFyYW0gKQotI2RlZmluZSBDYWxsRW51bVByb3BQcm9jMTYoIGZ1bmMsIGh3bmQsIGxwc3RyLCBoYW5kbGUgKSBcCi0gICAgKCpmdW5jKSggaHduZCwgbHBzdHIsIGhhbmRsZSApCi0jZGVmaW5lIENhbGxFbnVtUHJvcFByb2MzMiggZnVuYywgaHduZCwgbHBzdHIsIGhhbmRsZSApIFwKLSAgICAoKmZ1bmMpKCBod25kLCBscHN0ciwgaGFuZGxlICkKLSNkZWZpbmUgQ2FsbEVudW1Qcm9wUHJvY0V4MzIoIGZ1bmMsIGh3bmQsIGxwc3RyLCBoYW5kbGUsIGRhdGEgKSBcCi0gICAgKCpmdW5jKSggaHduZCwgbHBzdHIsIGhhbmRsZSwgZGF0YSApCi0jZGVmaW5lIENhbGxFbnVtVGFza1duZFByb2MoIGZ1bmMsIGh3bmQsIGxQYXJhbSApIFwKLSAgICAoKmZ1bmMpKCBod25kLCBsUGFyYW0gKQotI2RlZmluZSBDYWxsRW51bVdpbmRvd3NQcm9jMTYoIGZ1bmMsIGh3bmQsIGxQYXJhbSApIFwKLSAgICAoKmZ1bmMpKCBod25kLCBsUGFyYW0gKQotI2RlZmluZSBDYWxsRW51bVdpbmRvd3NQcm9jMzIoIGZ1bmMsIGh3bmQsIGxQYXJhbSApIFwKLSAgICAoKmZ1bmMpKCBod25kLCBsUGFyYW0gKQotI2RlZmluZSBDYWxsTGluZUREQVByb2MoIGZ1bmMsIHhQb3MsIHlQb3MsIGxQYXJhbSApIFwKLSAgICAoKmZ1bmMpKCB4UG9zLCB5UG9zLCBsUGFyYW0gKQotI2RlZmluZSBDYWxsR3JheVN0cmluZ1Byb2MoIGZ1bmMsIGhkYywgbFBhcmFtLCBjY2ggKSBcCi0gICAgKCpmdW5jKSggaGRjLCBsUGFyYW0sIGNjaCApCiAjZGVmaW5lIENhbGxIb29rUHJvYyggZnVuYywgY29kZSwgd1BhcmFtLCBsUGFyYW0gKSBcCiAgICAgKCpmdW5jKSggY29kZSwgd1BhcmFtLCBsUGFyYW0gKQogI2RlZmluZSBDYWxsVGltZUZ1bmNQcm9jKCBmdW5jLCBpZCwgbXNnLCBkd1VzZXIsIGR3MSwgZHcyICkgXAogICAgICgqZnVuYykoIGlkLCBtc2csIGR3VXNlciwgZHcxLCBkdzIgKQogI2RlZmluZSBDYWxsV2luZG93c0V4aXRQcm9jKCBmdW5jLCBuRXhpdFR5cGUgKSBcCiAgICAgKCpmdW5jKSggbkV4aXRUeXBlICkKLSNkZWZpbmUgQ2FsbFduZFByb2MxNiggZnVuYywgZHMsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKSBcCisjZGVmaW5lIENhbGxXbmRQcm9jMTYoIGZ1bmMsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKSBcCiAgICAgKCpmdW5jKSggaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApCiAjZGVmaW5lIENhbGxXbmRQcm9jMzIoIGZ1bmMsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKSBcCiAgICAgKCpmdW5jKSggaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApCkBAIC0xNTgsNCArMTAzLDQgQEAKICNlbmRpZiAgLyogV0lORUxJQiAqLwogCiAKLSNlbmRpZiAvKiBXSU5FX0NBTExCQUNLX0ggKi8KKyNlbmRpZiAvKiBfX1dJTkVfQ0FMTEJBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21iby5oIGIvaW5jbHVkZS9jb21iby5oCmluZGV4IDBlMTc3ZjYuLjk3MzI1MzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tYm8uaAorKysgYi9pbmNsdWRlL2NvbWJvLmgKQEAgLTQsNiArNCw3IEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgeworICBXTkQqCSAgd25kU2VsZjsKICAgRFdPUkQgICBkd1N0eWxlOwogICBEV09SRCAgIGR3U3RhdGU7CiAgIEhXTkQgICAgaFduZEVkaXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZpbGUuaCBiL2luY2x1ZGUvZmlsZS5oCmluZGV4IDYzNGNhNzYuLmYxNTMzZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZmlsZS5oCisrKyBiL2luY2x1ZGUvZmlsZS5oCkBAIC0xMSw2ICsxMSw3IEBACiAKIGV4dGVybiB2b2lkIEZJTEVfU2V0RG9zRXJyb3Iodm9pZCk7CiBleHRlcm4gdm9pZCBGSUxFX0Nsb3NlQWxsRmlsZXMoIEhBTkRMRSBoUERCICk7CitleHRlcm4gSEZJTEUgRklMRV9EdXBVbml4SGFuZGxlKCBpbnQgZmQgKTsKIGV4dGVybiBpbnQgRklMRV9TdGF0KCBMUENTVFIgdW5peE5hbWUsIEJZVEUgKnBhdHRyLCBEV09SRCAqcHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgV09SRCAqcGRhdGUsIFdPUkQgKnB0aW1lICk7CiBleHRlcm4gaW50IEZJTEVfR2V0RGF0ZVRpbWUoIEhGSUxFIGhGaWxlLCBXT1JEICpwZGF0ZSwgV09SRCAqcHRpbWUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hvb2suaCBiL2luY2x1ZGUvaG9vay5oCmluZGV4IDRkY2QzNzUuLjBmNDk5ODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaG9vay5oCisrKyBiL2luY2x1ZGUvaG9vay5oCkBAIC05LDcgKzksNiBAQAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImxkdC5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAKICNwcmFnbWEgcGFjaygxKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21ldGFmaWxlLmggYi9pbmNsdWRlL21ldGFmaWxlLmgKaW5kZXggMGQyYzMwNi4uMDZmNGU2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZXRhZmlsZS5oCisrKyBiL2luY2x1ZGUvbWV0YWZpbGUuaApAQCAtMTQsNyArMTQsNyBAQAogI2RlZmluZSBNRVRBX0VPRiAweDAwMDAKIAogSE1FVEFGSUxFIE1GX1dyaXRlUmVjb3JkKEhNRVRBRklMRSBobWYsIE1FVEFSRUNPUkQgKm1yLCBXT1JEIHJsZW4pOwotaW50IE1GX0FkZEhhbmRsZShIQU5ETEVUQUJMRSAqaHQsIFdPUkQgaHRsZW4sIEhBTkRMRSBob2JqKTsKK2ludCBNRl9BZGRIYW5kbGUoSEFORExFVEFCTEUxNiAqaHQsIFdPUkQgaHRsZW4sIEhBTkRMRSBob2JqKTsKIGludCBNRl9BZGRIYW5kbGVJbnRlcm5hbChIQU5ETEUgaG9iaik7CiBCT09MIE1GX01ldGFQYXJhbTAoREMgKmRjLCBzaG9ydCBmdW5jKTsKIEJPT0wgTUZfTWV0YVBhcmFtMShEQyAqZGMsIHNob3J0IGZ1bmMsIHNob3J0IHBhcmFtMSk7CkBAIC0zMSw2ICszMSw4IEBACiBCT09MIE1GX0NyZWF0ZVBlbkluZGlyZWN0KERDICpkYywgSFBFTjE2IGhQZW4sIExPR1BFTjE2ICpsb2dwZW4pOwogQk9PTCBNRl9DcmVhdGVGb250SW5kaXJlY3QoREMgKmRjLCBIRk9OVCBoRm9udCwgTE9HRk9OVDE2ICpsb2dmb250KTsKIEJPT0wgTUZfVGV4dE91dChEQyAqZGMsIHNob3J0IHgsIHNob3J0IHksIExQQ1NUUiBzdHIsIHNob3J0IGNvdW50KTsKK0JPT0wgTUZfRXh0VGV4dE91dChEQyAqZGMsIHNob3J0IHgsIHNob3J0IHksIFVJTlQxNiBmbGFncywgY29uc3QgUkVDVDE2ICpyZWN0LAorICAgICAgICAgICAgICAgICAgIExQQ1NUUiBzdHIsIHNob3J0IGNvdW50LCBjb25zdCBJTlQxNiAqbHBEeCk7CiBCT09MIE1GX01ldGFQb2x5KERDICpkYywgc2hvcnQgZnVuYywgTFBQT0lOVDE2IHB0LCBzaG9ydCBjb3VudCk7CiBCT09MIE1GX0JpdEJsdChEQyAqZGNEZXN0LCBzaG9ydCB4RGVzdCwgc2hvcnQgeURlc3QsIHNob3J0IHdpZHRoLAogCSAgICAgICBzaG9ydCBoZWlnaHQsIEhEQyBoZGNTcmMsIHNob3J0IHhTcmMsIHNob3J0IHlTcmMsIERXT1JEIHJvcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Rhc2suaCBiL2luY2x1ZGUvdGFzay5oCmluZGV4IGY3YzkyYTUuLmY3MWNlODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGFzay5oCisrKyBiL2luY2x1ZGUvdGFzay5oCkBAIC03MCw4ICs3MCw4IEBACiAgICAgSFFVRVVFMTYgIGhRdWV1ZTsgICAgICAgICAgICAgICAgICAgICAvKiAyMCBTZWxlY3RvciBvZiB0YXNrIHF1ZXVlICovCiAgICAgSFRBU0sxNiAgIGhQYXJlbnQ7ICAgICAgICAgICAgICAgICAgICAvKiAyMiBTZWxlY3RvciBvZiBUREIgb2YgcGFyZW50ICovCiAgICAgV09SRCAgICAgIHNpZ25hbF9mbGFnczsgICAgICAgICAgICAgICAvKiAyNCBGbGFncyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KLSAgICBEV09SRCAgICAgc2lnaGFuZGxlciBXSU5FX1BBQ0tFRDsgICAgIC8qIDI2IFNpZ25hbCBoYW5kbGVyICovCi0gICAgRFdPUkQgICAgIHVzZXJoYW5kbGVyIFdJTkVfUEFDS0VEOyAgICAvKiAyYSBVU0VSIHNpZ25hbCBoYW5kbGVyICovCisgICAgRkFSUFJPQzE2IHNpZ2hhbmRsZXIgV0lORV9QQUNLRUQ7ICAgICAvKiAyNiBTaWduYWwgaGFuZGxlciAqLworICAgIEZBUlBST0MxNiB1c2VyaGFuZGxlciBXSU5FX1BBQ0tFRDsgICAgLyogMmEgVVNFUiBzaWduYWwgaGFuZGxlciAqLwogICAgIERXT1JEICAgICBkaXNjYXJkaGFuZGxlciBXSU5FX1BBQ0tFRDsgLyogMmUgSGFuZGxlciBmb3IgR2xvYmFsRGlzY2FyZCgpICovCiAgICAgRFdPUkQgICAgIGludDAgV0lORV9QQUNLRUQ7ICAgICAgICAgICAvKiAzMiBpbnQgMCAoZGl2aWRlIGJ5IDApIGhhbmRsZXIgKi8KICAgICBEV09SRCAgICAgaW50MiBXSU5FX1BBQ0tFRDsgICAgICAgICAgIC8qIDM2IGludCAyIChOTUkpIGhhbmRsZXIgKi8KQEAgLTgxLDkgKzgxLDcgQEAKICAgICBEV09SRCAgICAgaW50M2UgV0lORV9QQUNLRUQ7ICAgICAgICAgIC8qIDQ2IGludCAzZSAoODB4ODcgZW11KSBoYW5kbGVyICovCiAgICAgRFdPUkQgICAgIGludDc1IFdJTkVfUEFDS0VEOyAgICAgICAgICAvKiA0YSBpbnQgNzUgKDgweDg3IGVycm9yKSBoYW5kbGVyICovCiAgICAgRFdPUkQgICAgIGNvbXBhdF9mbGFncyBXSU5FX1BBQ0tFRDsgICAvKiA0ZSBDb21wYXRpYmlsaXR5IGZsYWdzICovCi0gICAgQllURSAgICAgIHVudXNlZDRbMTBdOyAgICAgICAgICAgICAgICAvKiA1MiAqLwotICAgIFdPUkQgICAgICBzd2l0Y2hTdGFja1NTOyAgICAgICAgICAgICAgLyogNWMgU2F2ZWQgJXNzIGZvciBTd2l0Y2hTdGFja1RvICovCi0gICAgV09SRCAgICAgIHN3aXRjaFN0YWNrU1A7ICAgICAgICAgICAgICAvKiA1ZSBTYXZlZCAlc3AgZm9yIFN3aXRjaFN0YWNrVG8gKi8KKyAgICBCWVRFICAgICAgdW51c2VkNFsxNF07ICAgICAgICAgICAgICAgIC8qIDUyICovCiAgICAgSEFORExFMTYgIGhQREI7ICAgICAgICAgICAgICAgICAgICAgICAvKiA2MCBTZWxlY3RvciBvZiBQREIgKGkuZS4gUFNQKSAqLwogICAgIFNFR1BUUiAgICBkdGEgV0lORV9QQUNLRUQ7ICAgICAgICAgICAgLyogNjIgQ3VycmVudCBEVEEgKi8KICAgICBCWVRFICAgICAgY3VyZHJpdmU7ICAgICAgICAgICAgICAgICAgIC8qIDY2IEN1cnJlbnQgZHJpdmUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luYmFzZS5oIGIvaW5jbHVkZS93aW5iYXNlLmgKaW5kZXggZjIyMWZhMi4uMTU4M2YzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5iYXNlLmgKKysrIGIvaW5jbHVkZS93aW5iYXNlLmgKQEAgLTEzMyw2ICsxMzMsMzUgQEAKIAogREVDTF9XSU5FTElCX1RZUEVfQVcoT1NWRVJTSU9OSU5GTyk7CiAKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgRFdPUkQgICAgIEZpbGVBdHRyaWJ1dGVzOworICAgIEZJTEVUSU1FICBDcmVhdGlvblRpbWU7CisgICAgRklMRVRJTUUgIExhc3RBY2Nlc3NUaW1lOworICAgIEZJTEVUSU1FICBMYXN0V3JpdGVUaW1lOworICAgIERXT1JEICAgICBGaWxlU2l6ZUhpZ2g7CisgICAgRFdPUkQgICAgIEZpbGVTaXplTG93OworICAgIERXT1JEICAgICByZXNlcnZlZFsyXTsKKyAgICBDSEFSICAgICAgRmlsZU5hbWVbMjYwXTsKKyAgICBDSEFSICAgICAgQWx0ZXJuYXRlTmFtZVsxNF07Cit9IFdJTjMyX0ZJTkRfREFUQTMyQSwgKkxQV0lOMzJfRklORF9EQVRBMzJBOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIERXT1JEICAgICBGaWxlQXR0cmlidXRlczsKKyAgICBGSUxFVElNRSAgQ3JlYXRpb25UaW1lOworICAgIEZJTEVUSU1FICBMYXN0QWNjZXNzVGltZTsKKyAgICBGSUxFVElNRSAgTGFzdFdyaXRlVGltZTsKKyAgICBEV09SRCAgICAgRmlsZVNpemVIaWdoOworICAgIERXT1JEICAgICBGaWxlU2l6ZUxvdzsKKyAgICBEV09SRCAgICAgcmVzZXJ2ZWRbMl07CisgICAgV0NIQVIgICAgIEZpbGVOYW1lWzI2MF07CisgICAgV0NIQVIgICAgIEFsdGVybmF0ZU5hbWVbMTRdOworfSBXSU4zMl9GSU5EX0RBVEEzMlcsICpMUFdJTjMyX0ZJTkRfREFUQTMyVzsKKworREVDTF9XSU5FTElCX1RZUEVfQVcoV0lOMzJfRklORF9EQVRBKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQV0lOMzJfRklORF9EQVRBKTsKKwogI2RlZmluZSBWRVJfUExBVEZPUk1fV0lOMzJzICAgICAgICAgICAgIDAKICNkZWZpbmUgVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1MgICAgICAxCiAjZGVmaW5lIFZFUl9QTEFURk9STV9XSU4zMl9OVCAgICAgICAgICAgMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5kb3dzLmggYi9pbmNsdWRlL3dpbmRvd3MuaAppbmRleCA3NjczNjNhLi4yZTZmYTlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmRvd3MuaAorKysgYi9pbmNsdWRlL3dpbmRvd3MuaApAQCAtMTA1Myw2ICsxMDUzLDExIEBACiBERUNMX1dJTkVMSUJfVFlQRV9BVyhURVhUTUVUUklDKTsKIERFQ0xfV0lORUxJQl9UWVBFX0FXKExQVEVYVE1FVFJJQyk7CiAKK3R5cGVkZWYgSU5UMTYgKCpGT05URU5VTVBST0MxNikoU0VHUFRSLFNFR1BUUixVSU5UMTYsTFBBUkFNKTsKK3R5cGVkZWYgSU5UMzIgKCpGT05URU5VTVBST0MzMkEpKGNvbnN0IExPR0ZPTlQzMkEqLGNvbnN0IFRFWFRNRVRSSUMzMkEqLFVJTlQzMixMUEFSQU0pOwordHlwZWRlZiBJTlQzMiAoKkZPTlRFTlVNUFJPQzMyVykoY29uc3QgTE9HRk9OVDMyVyosY29uc3QgVEVYVE1FVFJJQzMyVyosVUlOVDMyLExQQVJBTSk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhGT05URU5VTVBST0MpOworCiAgIC8qIHRtUGl0Y2hBbmRGYW1pbHkgdmFsdWVzICovCiAjZGVmaW5lIFRNUEZfRklYRURfUElUQ0ggICAgMQogI2RlZmluZSBUTVBGX1ZFQ1RPUgkgICAgMgpAQCAtMjUwOCw2ICsyNTEzLDEzIEBACiAjZGVmaW5lIEVTQl9ESVNBQkxFX0xUVVAgICAgRVNCX0RJU0FCTEVfTEVGVAogI2RlZmluZSBFU0JfRElTQUJMRV9SVEROICAgIEVTQl9ESVNBQkxFX1JJR0hUCiAKKy8qIFNjcm9sbGJhciBtZXNzYWdlcyAodW5kb2N1bWVudGVkKSAqLworI2RlZmluZSBTQk1fU0VUU0NST0xMUE9TICAgICAgKFdNX1VTRVIrMCkKKyNkZWZpbmUgU0JNX0dFVFNDUk9MTFBPUyAgICAgIChXTV9VU0VSKzEpCisjZGVmaW5lIFNCTV9TRVRTQ1JPTExSQU5HRSAgICAoV01fVVNFUisyKQorI2RlZmluZSBTQk1fUkVEUkFXICAgICAgICAgICAgKFdNX1VTRVIrMykKKyNkZWZpbmUgU0JNX0VOQUJMRSAgICAgICAgICAgIChXTV9VU0VSKzQpCisKIC8qIExpc3Rib3ggc3R5bGVzICovCiAjZGVmaW5lIExCU19OT1RJRlkgICAgICAgICAgICAweDAwMDFMCiAjZGVmaW5lIExCU19TT1JUICAgICAgICAgICAgICAweDAwMDJMCkBAIC0zMDAwLDEyICszMDEyLDE5IEBACiB0eXBlZGVmIE1FVEFSRUNPUkQgKkxQTUVUQVJFQ09SRDsKIAogLyogSGFuZGxlIHRhYmxlIHN0cnVjdHVyZSAqLworCiB0eXBlZGVmIHN0cnVjdAogewotICAgIEhBTkRMRTE2ICAgb2JqZWN0SGFuZGxlWzFdOwotfSBIQU5ETEVUQUJMRTsKLXR5cGVkZWYgSEFORExFVEFCTEUgKlBIQU5ETEVUQUJMRTsKLXR5cGVkZWYgSEFORExFVEFCTEUgKkxQSEFORExFVEFCTEU7CisgICAgSEdESU9CSjE2IG9iamVjdEhhbmRsZVsxXTsKK30gSEFORExFVEFCTEUxNiwgKkxQSEFORExFVEFCTEUxNjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBIR0RJT0JKMzIgb2JqZWN0SGFuZGxlWzFdOworfSBIQU5ETEVUQUJMRTMyLCAqTFBIQU5ETEVUQUJMRTMyOworCitERUNMX1dJTkVMSUJfVFlQRShIQU5ETEVUQUJMRSk7CitERUNMX1dJTkVMSUJfVFlQRShMUEhBTkRMRVRBQkxFKTsKIAogLyogQ2xpcGJvYXJkIG1ldGFmaWxlIHBpY3R1cmUgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdApAQCAtMzA5Niw2ICszMTE1LDEwIEBACiAjZGVmaW5lIE1FVEFfQ1JFQVRFQklUTUFQICAgICAgICAgICAgMHgwNkZFCiAjZGVmaW5lIE1FVEFfQ1JFQVRFUkVHSU9OICAgICAgICAgICAgMHgwNkZGCiAKK3R5cGVkZWYgSU5UMTYgKCpNRkVOVU1QUk9DMTYpKEhEQzE2LEhBTkRMRVRBQkxFMTYqLE1FVEFSRUNPUkQqLElOVDE2LExQQVJBTSk7Cit0eXBlZGVmIElOVDMyICgqTUZFTlVNUFJPQzMyKShIREMzMixIQU5ETEVUQUJMRTMyKixNRVRBUkVDT1JEKixJTlQzMixMUEFSQU0pOworREVDTF9XSU5FTElCX1RZUEUoTUZFTlVNUFJPQyk7CisKIC8qIERlYnVnZ2luZyBzdXBwb3J0IChERUJVRyBTWVNURU0gT05MWSkgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0zMjgxLDggKzMzMDQsMTAgQEAKIFVJTlQxNiAgICAgR2V0Q29tbUV2ZW50TWFzayhJTlQxNixVSU5UMTYpOwogSFRBU0sxNiAgICBHZXRDdXJyZW50VGFzayh2b2lkKTsKIEhNT0RVTEUxNiAgR2V0RXhlUHRyKEhBTkRMRTE2KTsKK1dPUkQgICAgICAgR2V0RXhlVmVyc2lvbih2b2lkKTsKIEhJTlNUQU5DRTE2IEdldFRhc2tEUyh2b2lkKTsKIEhRVUVVRTE2ICAgR2V0VGFza1F1ZXVlKEhUQVNLMTYpOworQk9PTDE2ICAgICBJc1NoYXJlZFNlbGVjdG9yKEhBTkRMRTE2KTsKIEJPT0wxNiAgICAgTG9jYWxJbml0KEhBTkRMRTE2LFdPUkQsV09SRCk7CiBEV09SRCAgICAgIE9mZnNldFZpZXdwb3J0T3JnKEhEQzE2LElOVDE2LElOVDE2KTsKIERXT1JEICAgICAgT2Zmc2V0V2luZG93T3JnKEhEQzE2LElOVDE2LElOVDE2KTsKQEAgLTMyOTQsNiArMzMxOSw3IEBACiBEV09SRCAgICAgIFNldEJpdG1hcERpbWVuc2lvbihIQklUTUFQMTYsSU5UMTYsSU5UMTYpOwogRFdPUkQgICAgICBTZXRCcnVzaE9yZyhIREMxNixJTlQxNixJTlQxNik7CiBVSU5UMTYqICAgIFNldENvbW1FdmVudE1hc2soSU5UMTYsVUlOVDE2KTsKK0ZBUlBST0MxNiAgU2V0VGFza1NpZ25hbFByb2MoSFRBU0sxNixGQVJQUk9DMTYpOwogRFdPUkQgICAgICBTZXRWaWV3cG9ydEV4dChIREMxNixJTlQxNixJTlQxNik7CiBEV09SRCAgICAgIFNldFZpZXdwb3J0T3JnKEhEQzE2LElOVDE2LElOVDE2KTsKIERXT1JEICAgICAgU2V0V2luZG93RXh0KEhEQzE2LElOVDE2LElOVDE2KTsKQEAgLTM0MDMsNiArMzQyOSw3IEBACiBWT0lEICAgICAgIFNldFJlY3RSZ24oSFJHTjMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyKTsKIFdPUkQgICAgICAgU2V0V2luZG93V29yZChIV05EMzIsSU5UMzIsV09SRCk7CiBCT09MMTYgICAgIFNob3dDYXJldChIV05EMzIpOworSFdORDE2ICAgICBXaW5kb3dGcm9tREMoSERDMzIpOwogSEZJTEUgICAgICBfbGNsb3NlKEhGSUxFKTsKIEhGSUxFICAgICAgX2xjcmVhdChMUENTVFIsSU5UMzIpOwogSEZJTEUgICAgICBfbG9wZW4oTFBDU1RSLElOVDMyKTsKQEAgLTM5MTQsNiArMzk0MSw5IEBACiBJTlQxNiAgICAgIExaUmVhZDE2KEhGSUxFLFNFR1BUUixVSU5UMTYpOyAKIElOVDMyICAgICAgTFpSZWFkMzIoSEZJTEUsTFBWT0lELFVJTlQzMik7IAogI2RlZmluZSAgICBMWlJlYWQgV0lORUxJQl9OQU1FKExaUmVhZCkKK1ZPSUQgICAgICAgTGluZUREQTE2KElOVDE2LElOVDE2LElOVDE2LElOVDE2LExJTkVEREFQUk9DMTYsTFBBUkFNKTsKK0JPT0wzMiAgICAgTGluZUREQTMyKElOVDMyLElOVDMyLElOVDMyLElOVDMyLExJTkVEREFQUk9DMzIsTFBBUkFNKTsKKyNkZWZpbmUgICAgTGluZUREQSBXSU5FTElCX05BTUUoTGluZUREQSkKIEhBQ0NFTDE2ICAgTG9hZEFjY2VsZXJhdG9yczE2KEhJTlNUQU5DRTE2LFNFR1BUUik7CiBIQUNDRUwzMiAgIExvYWRBY2NlbGVyYXRvcnMzMkEoSElOU1RBTkNFMzIsTFBDU1RSKTsKIEhBQ0NFTDMyICAgTG9hZEFjY2VsZXJhdG9yczMyVyhISU5TVEFOQ0UzMixMUENXU1RSKTsKQEAgLTQzNTksMTcgKzQzODksOSBAQAogI2lmZGVmIFdJTkVMSUIKIHR5cGVkZWYgTE9ORyAoKkRSSVZFUlBST0MpKERXT1JELCBIRFJWUiwgVUlOVCwgTFBBUkFNLCBMUEFSQU0pOwogdHlwZWRlZiBpbnQgKCpFRElUV09SREJSRUFLUFJPQykoTFBTVFIgbHBjaCwgaW50IGljaEN1cnJlbnQsIGludCBjY2gsaW50IGNvZGUpOwotLyp0eXBlZGVmIGludCAoKkZPTlRFTlVNUFJPQykoY29uc3QgTE9HRk9OVCosY29uc3QgVEVYVE1FVFJJQyosRFdPUkQsTFBBUkFNKTsqLwotdHlwZWRlZiBpbnQgKCpGT05URU5VTVBST0MpKGNvbnN0IHZvaWQqLGNvbnN0IHZvaWQqLERXT1JELExQQVJBTSk7Ci10eXBlZGVmIGludCAoKkdPQkpFTlVNUFJPQykoTFBWT0lELExQQVJBTSk7Ci0vKnR5cGVkZWYgaW50ICgqTUZFTlVNUFJPQykoSERDLEhBTkRMRVRBQkxFKixNRVRBUkVDT1JEKixpbnQsTFBBUkFNKTsqLwotdHlwZWRlZiBpbnQgKCpNRkVOVU1QUk9DKShIREMsdm9pZCosdm9pZCosaW50LExQQVJBTSk7CiAjZWxzZQogdHlwZWRlZiBTRUdQVFIgRFJJVkVSUFJPQzsKIHR5cGVkZWYgU0VHUFRSIEVESVRXT1JEQlJFQUtQUk9DOwotdHlwZWRlZiBTRUdQVFIgRk9OVEVOVU1QUk9DOwotdHlwZWRlZiBTRUdQVFIgR09CSkVOVU1QUk9DOwotdHlwZWRlZiBTRUdQVFIgTUZFTlVNUFJPQzsKICNlbmRpZgogCiBBVE9NICAgICAgIEFkZEF0b20oU0VHUFRSKTsKQEAgLTQ0NTUsMTAgKzQ0NzcsMTAgQEAKIEJPT0wgICAgICAgRW5hYmxlV2luZG93KEhXTkQsQk9PTCk7CiBCT09MICAgICAgIEVuZERlZmVyV2luZG93UG9zKEhEV1AxNik7CiBVSU5UICAgICAgIEVudW1DbGlwYm9hcmRGb3JtYXRzKFVJTlQpOwotSU5UICAgICAgICBFbnVtRm9udEZhbWlsaWVzKEhEQyxMUENTVFIsRk9OVEVOVU1QUk9DLExQQVJBTSk7Ci1JTlQgICAgICAgIEVudW1Gb250cyhIREMsTFBDU1RSLEZPTlRFTlVNUFJPQyxMUEFSQU0pOwotQk9PTCAgICAgICBFbnVtTWV0YUZpbGUoSERDLEhNRVRBRklMRSxNRkVOVU1QUk9DLExQQVJBTSk7Ci1JTlQgICAgICAgIEVudW1PYmplY3RzKEhEQyxJTlQsR09CSkVOVU1QUk9DLExQQVJBTSk7CitJTlQgICAgICAgIEVudW1Gb250RmFtaWxpZXMoSERDLExQQ1NUUixGT05URU5VTVBST0MxNixMUEFSQU0pOworSU5UICAgICAgICBFbnVtRm9udHMoSERDLExQQ1NUUixGT05URU5VTVBST0MxNixMUEFSQU0pOworQk9PTCAgICAgICBFbnVtTWV0YUZpbGUoSERDLEhNRVRBRklMRSxNRkVOVU1QUk9DMTYsTFBBUkFNKTsKK0lOVCAgICAgICAgRW51bU9iamVjdHMoSERDLElOVCxHT0JKRU5VTVBST0MxNixMUEFSQU0pOwogSU5UICAgICAgICBFc2NhcGUoSERDLElOVCxJTlQsTFBDU1RSLExQVk9JRCk7CiBpbnQgICAgICAgIEV4Y2x1ZGVDbGlwUmVjdChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQpOwogaW50ICAgICAgICBFeGNsdWRlVmlzUmVjdChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQpOwpAQCAtNDYxMCw3ICs0NjMyLDcgQEAKIEJPT0wxNiAgICAgR2xvYmFsVW5XaXJlKEhHTE9CQUwxNik7CiB2b2lkICAgICAgIEdsb2JhbFVuZml4KEhHTE9CQUwxNik7CiBTRUdQVFIgICAgIEdsb2JhbFdpcmUoSEdMT0JBTDE2KTsKLUJPT0wgICAgICAgR3JheVN0cmluZyhIREMsSEJSVVNILEZBUlBST0MxNixMUEFSQU0sSU5ULElOVCxJTlQsSU5ULElOVCk7CitCT09MICAgICAgIEdyYXlTdHJpbmcoSERDLEhCUlVTSCxHUkFZU1RSSU5HUFJPQzE2LExQQVJBTSxJTlQsSU5ULElOVCxJTlQsSU5UKTsKIEJPT0wgICAgICAgSGlsaXRlTWVudUl0ZW0oSFdORCxITUVOVSxVSU5ULFVJTlQpOwogQk9PTCAgICAgICBJblNlbmRNZXNzYWdlKHZvaWQpOwogV09SRCAgICAgICBJbml0QXRvbVRhYmxlKFdPUkQpOwpAQCAtNDYzOCw3ICs0NjYwLDYgQEAKIEJPT0wgICAgICAgSXNXaW5kb3dWaXNpYmxlKEhXTkQpOwogQk9PTCAgICAgICBJc1pvb21lZChIV05EKTsKIHZvaWQgICAgICAgTGltaXRFbXNQYWdlcyhEV09SRCk7Ci12b2lkICAgICAgIExpbmVEREEoc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQsRkFSUFJPQzE2LGxvbmcpOwogQk9PTCAgICAgICBMaW5lVG8oSERDLHNob3J0LHNob3J0KTsKIEhBTkRMRSAgICAgTG9hZExpYnJhcnkoTFBDU1RSKTsKIEhBTkRMRSAgICAgTG9hZE1vZHVsZShMUENTVFIsTFBWT0lEKTsKQEAgLTQ2NjEsNyArNDY4Miw3IEBACiBCT09MICAgICAgIFBhdEJsdChIREMsc2hvcnQsc2hvcnQsc2hvcnQsc2hvcnQsRFdPUkQpOwogQk9PTCAgICAgICBQaWUoSERDLElOVCxJTlQsSU5ULElOVCxJTlQsSU5ULElOVCxJTlQpOwogQk9PTCAgICAgICBQbGF5TWV0YUZpbGUoSERDLEhBTkRMRSk7Ci12b2lkICAgICAgIFBsYXlNZXRhRmlsZVJlY29yZChIREMsTFBIQU5ETEVUQUJMRSxMUE1FVEFSRUNPUkQsV09SRCk7Cit2b2lkICAgICAgIFBsYXlNZXRhRmlsZVJlY29yZChIREMsTFBIQU5ETEVUQUJMRTE2LExQTUVUQVJFQ09SRCxXT1JEKTsKIEJPT0wgICAgICAgUG9zdEFwcE1lc3NhZ2UoSEFORExFLFdPUkQsV09SRCxMT05HKTsKIHZvaWQgICAgICAgUG9zdEV2ZW50KEhUQVNLKTsKIEJPT0wgICAgICAgUG9zdE1lc3NhZ2UoSFdORCxXT1JELFdPUkQsTE9ORyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnR5cGVzLmggYi9pbmNsdWRlL3dpbnR5cGVzLmgKaW5kZXggMzg5YTlmZS4uNTM0NTUxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW50eXBlcy5oCisrKyBiL2luY2x1ZGUvd2ludHlwZXMuaApAQCAtMTY4LDkgKzE2OCwxOCBAQAogdHlwZWRlZiBMUkVTVUxUICgqRkFSUFJPQzE2KSgpOwogdHlwZWRlZiBMUkVTVUxUICgqRkFSUFJPQzMyKSgpOwogREVDTF9XSU5FTElCX1RZUEUoRkFSUFJPQyk7Cit0eXBlZGVmIElOVDE2ICAgKCpHT0JKRU5VTVBST0MxNikoU0VHUFRSLExQQVJBTSk7Cit0eXBlZGVmIElOVDMyICAgKCpHT0JKRU5VTVBST0MzMikoTFBWT0lELExQQVJBTSk7CitERUNMX1dJTkVMSUJfVFlQRShHT0JKRU5VTVBST0MpOwordHlwZWRlZiBCT09MMTYgICgqR1JBWVNUUklOR1BST0MxNikoSERDMTYsTFBBUkFNLElOVDE2KTsKK3R5cGVkZWYgQk9PTDMyICAoKkdSQVlTVFJJTkdQUk9DMzIpKEhEQzMyLExQQVJBTSxJTlQzMik7CitERUNMX1dJTkVMSUJfVFlQRShHUkFZU1RSSU5HUFJPQyk7CiB0eXBlZGVmIExSRVNVTFQgKCpIT09LUFJPQzE2KShJTlQxNixXUEFSQU0xNixMUEFSQU0pOwogdHlwZWRlZiBMUkVTVUxUICgqSE9PS1BST0MzMikoSU5UMzIsV1BBUkFNMzIsTFBBUkFNKTsKIERFQ0xfV0lORUxJQl9UWVBFKEhPT0tQUk9DKTsKK3R5cGVkZWYgVk9JRCAgICAoKkxJTkVEREFQUk9DMTYpKElOVDE2LElOVDE2LExQQVJBTSk7Cit0eXBlZGVmIFZPSUQgICAgKCpMSU5FRERBUFJPQzMyKShJTlQzMixJTlQzMixMUEFSQU0pOworREVDTF9XSU5FTElCX1RZUEUoTElORUREQVBST0MpOwogdHlwZWRlZiBCT09MMTYgICgqUFJPUEVOVU1QUk9DMTYpKEhXTkQxNixTRUdQVFIsSEFORExFMTYpOwogdHlwZWRlZiBCT09MMzIgICgqUFJPUEVOVU1QUk9DMzJBKShIV05EMzIsTFBDU1RSLEhBTkRMRTMyKTsKIHR5cGVkZWYgQk9PTDMyICAoKlBST1BFTlVNUFJPQzMyVykoSFdORDMyLExQQ1dTVFIsSEFORExFMzIpOwpkaWZmIC0tZ2l0IGEvbGlicmFyeS9taXNjc3R1YnMuYyBiL2xpYnJhcnkvbWlzY3N0dWJzLmMKaW5kZXggMDcxYjY5ZS4uOWJjZTBlZSAxMDA2NDQKLS0tIGEvbGlicmFyeS9taXNjc3R1YnMuYworKysgYi9saWJyYXJ5L21pc2NzdHVicy5jCkBAIC0zMywxNiArMzMsMTQgQEAKICAgICAgICAgICAgICAgICBhWzddLGFbOF0sYVs5XSxhWzEwXSk7CiAgIGNhc2UgMTQ6IHJldHVybiBmdW5jKGFbMF0sYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdLGFbNl0sCiAgICAgICAgICAgICAgICAgYVs3XSxhWzhdLGFbOV0sYVsxMF0sYVsxMV0sYVsxMl0sYVsxM10pOwotICBjYXNlIDE3OiByZXR1cm4gZnVuYyhhWzBdLGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSxhWzZdLAotICAgICAgICAgICAgICAgIGFbN10sYVs4XSxhWzldLGFbMTBdLGFbMTFdLGFbMTJdLGFbMTNdLGFbMTRdLGFbMTVdLGFbMTZdKTsKKyAgY2FzZSAxNjogcmV0dXJuIGZ1bmMoYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0sYVs2XSwKKyAgICAgICAgICAgICAgICBhWzddLGFbOF0sYVs5XSxhWzEwXSxhWzExXSxhWzEyXSxhWzEzXSxhWzE0XSxhWzE1XSk7CiAgIGRlZmF1bHQ6IGZwcmludGYoc3RkZXJyLCJKQlA6IENhbGxUbzMyX0xhcmdlU3RhY2sgY2FsbGVkIHdpdGggdW5zdXBwb3J0ZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIGFyZ3VtZW50cyAoJWQpLiAgSWdub3JlZC5cbiIsbmJhcmdzKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgIH0KIH0KIAotV09SRCBDYWxsVG8xNl93b3JkXyAoIEZBUlBST0MxNiBmdW5jLCBXT1JEIGFyZyApIHsgcmV0dXJuIGZ1bmMoYXJnKTsgfQotCiBleHRlcm4gTFJFU1VMVCBBYm91dERsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTSxMUEFSQU0pOwogZXh0ZXJuIExSRVNVTFQgQ29sb3JEbGdQcm9jKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKIGV4dGVybiBMUkVTVUxUIENvbWJvQm94V25kUHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CmRpZmYgLS1naXQgYS9saWJyYXJ5L3N1cC5jIGIvbGlicmFyeS9zdXAuYwppbmRleCAxOTRkN2U3Li45MzRhYzJiIDEwMDY0NAotLS0gYS9saWJyYXJ5L3N1cC5jCisrKyBiL2xpYnJhcnkvc3VwLmMKQEAgLTEsNyArMSw2IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJhcmNoLmgiCiAjaW5jbHVkZSAibmVleGUuaCIKIApkaWZmIC0tZ2l0IGEvbG9hZGVyL2J1aWx0aW4uYyBiL2xvYWRlci9idWlsdGluLmMKaW5kZXggNDcxN2Y2Ni4uYTdlNjE4ZCAxMDA2NDQKLS0tIGEvbG9hZGVyL2J1aWx0aW4uYworKysgYi9sb2FkZXIvYnVpbHRpbi5jCkBAIC0zNTAsNyArMzUwLDcgQEAKICAgICBzdGF0aWMgY2hhciBidWZmZXJbODBdOwogICAgIEJVSUxUSU5fRExMICpkbGw7CiAgICAgY29uc3Qgdm9pZCAqKmZ1bmNzOwotICAgIGludCBmaXJzdCwgaSwgc2l6ZTsKKyAgICBpbnQgaTsKIAogICAgIC8qIEZpcnN0IGZpbmQgdGhlIG1vZHVsZSAqLwogCkBAIC0zNjUsMTkgKzM2NSwxMSBAQAogICAgICAgICByZXR1cm4gYnVmZmVyOwogICAgIH0KIAotICAgIC8qIERvIGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGZ1bmN0aW9uICovCisgICAgLyogTm93IGZpbmQgdGhlIGZ1bmN0aW9uICovCiAKICAgICByZWxheSA9IChCWVRFICopcmVsYXkgLSAxMTsgIC8qIFRoZSByZWxheSBlbnRyeSBwb2ludCBpcyAxMSBieXRlcyBsb25nICovCiAgICAgZnVuY3MgPSBkbGwtPmRlc2NyLT51LndpbjMyLmZ1bmN0aW9uczsKLSAgICBmaXJzdCA9IGkgPSAwOwotICAgIHNpemUgPSBkbGwtPmRlc2NyLT51LndpbjMyLnNpemU7Ci0gICAgd2hpbGUgKGZpcnN0IDwgc2l6ZSkKLSAgICB7Ci0gICAgICAgIGkgPSAoZmlyc3QgKyBzaXplKSAvIDI7Ci0gICAgICAgIGlmIChmdW5jc1tpXSA9PSByZWxheSkgYnJlYWs7Ci0gICAgICAgIGlmIChmdW5jc1tpXSA+IHJlbGF5KSBzaXplID0gaTsKLSAgICAgICAgZWxzZSBmaXJzdCA9IGkgKyAxOwotICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZGxsLT5kZXNjci0+dS53aW4zMi5zaXplO2krKykgaWYgKCpmdW5jcysrID09IHJlbGF5KSBicmVhazsKICAgICBzcHJpbnRmKCBidWZmZXIsICIlcy4lZDogJXMiLAogICAgICAgICAgICAgIGRsbC0+ZGVzY3ItPm5hbWUsIGksIGRsbC0+ZGVzY3ItPnUud2luMzIubmFtZXNbaV0gKTsKICAgICByZXR1cm4gYnVmZmVyOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL21vZHVsZS5jIGIvbG9hZGVyL21vZHVsZS5jCmluZGV4IGJmNGZkNWUuLjgyODUwZTcgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tb2R1bGUuYworKysgYi9sb2FkZXIvbW9kdWxlLmMKQEAgLTExMDAsNyArMTEwMCw3IEBACiAKIAlpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfU0VMRkxPQUQpCiAJewotICAgICAgICAgICAgICAgIGludCBmZDsKKyAgICAgICAgICAgICAgICBIRklMRSBoZjsKIAkJLyogSGFuZGxlIHNlbGYgbG9hZGluZyBtb2R1bGVzICovCiAJCVNFR1RBQkxFRU5UUlkgKiBwU2VnVGFibGUgPSAoU0VHVEFCTEVFTlRSWSAqKSBORV9TRUdfVEFCTEUocE1vZHVsZSk7CiAJCVNFTEZMT0FESEVBREVSICpzZWxmbG9hZGhlYWRlcjsKQEAgLTExNjYsOSArMTE2Niw5IEBACiAKIAkJfQogICAgICAgICAgICAgICAgIC8qIEZJWE1FOiB3ZSBwcm9iYWJseSBuZWVkIGEgRE9TIGhhbmRsZSBoZXJlICovCi0gICAgICAgICAgICAgICAgZmQgPSBNT0RVTEVfT3BlbkZpbGUoIGhNb2R1bGUgKTsKLQkJQ2FsbFRvMTZfd29yZF93dyAoc2VsZmxvYWRoZWFkZXItPkJvb3RBcHAsCi0JCQlwTW9kdWxlLT5zZWxmX2xvYWRpbmdfc2VsLCBoTW9kdWxlLCBmZCk7CisgICAgICAgICAgICAgICAgaGYgPSBGSUxFX0R1cFVuaXhIYW5kbGUoIE1PRFVMRV9PcGVuRmlsZSggaE1vZHVsZSApICk7CisJCUNhbGxUbzE2X3dvcmRfd3coIHNlbGZsb2FkaGVhZGVyLT5Cb290QXBwLCBoTW9kdWxlLCBoZiApOworICAgICAgICAgICAgICAgIF9sY2xvc2UoaGYpOwogCQkvKiBzb21lIEJvb3RBcHAgcHJvY3Mgb3ZlcndyaXRlIHRoZSBzZWxlY3RvciBvZiBkZ3JvdXAgKi8KIAkJcFNlZ1RhYmxlW3BNb2R1bGUtPmRncm91cCAtIDFdLnNlbGVjdG9yID0gc2F2ZWRfZGdyb3VwOwogCQlJRjE2MzJfU2F2ZWQxNl9zcyA9IG9sZHNzOwpAQCAtMTUzNyw2ICsxNTM3LDE4IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBJc1NoYXJlZFNlbGVjdG9yICAgIChLRVJORUwuMzQ1KQorICovCitCT09MMTYgSXNTaGFyZWRTZWxlY3RvciggSEFORExFMTYgc2VsZWN0b3IgKQoreworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdG9yIGJlbG9uZ3MgdG8gYSBETEwgKi8KKyAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBHZXRFeGVQdHIoIHNlbGVjdG9yICkpOworICAgIGlmICghcE1vZHVsZSkgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSAhPSAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgTW9kdWxlRmlyc3QgICAgKFRPT0xIRUxQLjU5KQogICovCiBCT09MMTYgTW9kdWxlRmlyc3QoIE1PRFVMRUVOVFJZICpscG1lICkKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9pbWFnZS5jIGIvbG9hZGVyL25lX2ltYWdlLmMKaW5kZXggYWQ1YWYyZi4uYTMyMDA3ZSAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX2ltYWdlLmMKKysrIGIvbG9hZGVyL25lX2ltYWdlLmMKQEAgLTY3LDYgKzY3LDggQEAKICAJU0VMRkxPQURIRUFERVIgKnNlbGZsb2FkaGVhZGVyOwogICAgICAgICBTVEFDSzE2RlJBTUUgKnN0YWNrMTZUb3A7CiAgCVdPUkQgb2xkc3MsIG9sZHNwLCBvbGRzZWxlY3RvciwgbmV3c2VsZWN0b3I7CisgICAgICAgIEhGSUxFIGhmID0gRklMRV9EdXBVbml4SGFuZGxlKCBmZCApOworCiAgCXNlbGZsb2FkaGVhZGVyID0gKFNFTEZMT0FESEVBREVSICopCiAgCQlQVFJfU0VHX09GRl9UT19MSU4ocFNlZ1RhYmxlLT5zZWxlY3RvciwwKTsKICAJb2xkc3MgPSBJRjE2MzJfU2F2ZWQxNl9zczsKQEAgLTg0LDkgKzg2LDkgQEAKICAgICAgICAgc3RhY2sxNlRvcC0+YnAgPSAwOwogICAgICAgICBzdGFjazE2VG9wLT5pcCA9IDA7CiAgICAgICAgIHN0YWNrMTZUb3AtPmNzID0gMDsKLSAgICAgICAgLyogRklYTUU6IHdlIHByb2JhYmx5IG5lZWQgdG8gcGFzcyBhIERPUyBmaWxlIGhhbmRsZSBoZXJlICovCi0gCW5ld3NlbGVjdG9yID0gIENhbGxUbzE2X3dvcmRfd3d3KHNlbGZsb2FkaGVhZGVyLT5Mb2FkQXBwU2VnLAotIAkJcE1vZHVsZS0+c2VsZl9sb2FkaW5nX3NlbCwgaE1vZHVsZSwgZmQsIHNlZ251bSk7CisgCW5ld3NlbGVjdG9yID0gIENhbGxUbzE2X3dvcmRfd3d3KCBzZWxmbG9hZGhlYWRlci0+TG9hZEFwcFNlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIGhmLCBzZWdudW0gKTsKKyAgICAgICAgX2xjbG9zZSggaGYgKTsKICAJaWYgKG5ld3NlbGVjdG9yICE9IG9sZHNlbGVjdG9yKSB7CiAgCSAgLyogU2VsZiBsb2FkZXJzIGxpa2UgY3JlYXRpbmcgdGhlaXIgb3duIHNlbGVjdG9yczsgCiAgCSAgICogdGhleSBsb3ZlIGFza2luZyBmb3IgdHJvdWJsZSB0byBXaW5lIGRldmVsb3BlcnMKZGlmZiAtLWdpdCBhL2xvYWRlci90YXNrLmMgYi9sb2FkZXIvdGFzay5jCmluZGV4IGJmMzI3OTAuLmIxYmVhMGQgMTAwNjQ0Ci0tLSBhL2xvYWRlci90YXNrLmMKKysrIGIvbG9hZGVyL3Rhc2suYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgInBlZXhlLmgiCiAjaW5jbHVkZSAicGVfaW1hZ2UuaCIKICNpbmNsdWRlICJxdWV1ZS5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTYxLDkgKzYyLDkgQEAKIHN0YXRpYyBGQVJQUk9DMTYgVEFTS19SZXNjaGVkdWxlUHJvYzsKIAogI2lmZGVmIFdJTkVMSUIKLSNkZWZpbmUgVEFTS19TQ0hFRFVMRSgpICBUQVNLX1Jlc2NoZWR1bGUoKTsKKyNkZWZpbmUgVEFTS19TQ0hFRFVMRSgpICBUQVNLX1Jlc2NoZWR1bGUoKQogI2Vsc2UKLSNkZWZpbmUgVEFTS19TQ0hFRFVMRSgpICBDYWxsVG8xNl93b3JkXyhUQVNLX1Jlc2NoZWR1bGVQcm9jLDApCisjZGVmaW5lIFRBU0tfU0NIRURVTEUoKSAgQ2FsbFRvMTZfd29yZF8oVEFTS19SZXNjaGVkdWxlUHJvYykKICNlbmRpZgogCiBzdGF0aWMgSEFORExFIFRBU0tfQ3JlYXRlRE9TRW52aXJvbm1lbnQodm9pZCk7CkBAIC0xMDY2LDIwICsxMDY3LDMzIEBACiB7CiAgICAgVERCICpwVGFzazsKICAgICBTVEFDSzE2RlJBTUUgKm9sZEZyYW1lLCAqbmV3RnJhbWU7CisgICAgSU5TVEFOQ0VEQVRBICpwRGF0YTsKKyAgICBVSU5UMTYgY29weVNpemU7CiAKICAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApKSkgcmV0dXJuOworICAgIGlmICghKHBEYXRhID0gKElOU1RBTkNFREFUQSAqKUdsb2JhbExvY2sxNiggc2VnICkpKSByZXR1cm47CiAgICAgZHByaW50Zl90YXNrKCBzdGRkZWIsICJTd2l0Y2hTdGFja1RvOiBvbGQ9JTA0eDolMDR4IG5ldz0lMDR4OiUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICBJRjE2MzJfU2F2ZWQxNl9zcywgSUYxNjMyX1NhdmVkMTZfc3AsIHNlZywgcHRyICk7CisKICAgICAvKiBTYXZlIHRoZSBvbGQgc3RhY2sgKi8KLSAgICBvbGRGcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKLSAgICBwVGFzay0+c3dpdGNoU3RhY2tTUyA9IElGMTYzMl9TYXZlZDE2X3NzOwotICAgIHBUYXNrLT5zd2l0Y2hTdGFja1NQID0gSUYxNjMyX1NhdmVkMTZfc3A7CisKKyAgICBvbGRGcmFtZSAgICAgICAgICAgPSBDVVJSRU5UX1NUQUNLMTY7CisgICAgcERhdGEtPm9sZF9zcCAgICAgID0gSUYxNjMyX1NhdmVkMTZfc3A7CisgICAgcERhdGEtPm9sZF9zcyAgICAgID0gSUYxNjMyX1NhdmVkMTZfc3M7CisgICAgcERhdGEtPnN0YWNrdG9wICAgID0gdG9wOworICAgIHBEYXRhLT5zdGFja21pbiAgICA9IHB0cjsKKyAgICBwRGF0YS0+c3RhY2tib3R0b20gPSBwdHI7CisKICAgICAvKiBTd2l0Y2ggdG8gdGhlIG5ldyBzdGFjayAqLwotICAgIElGMTYzMl9TYXZlZDE2X3NzID0gc2VnOwotICAgIElGMTYzMl9TYXZlZDE2X3NwID0gcHRyIC0gc2l6ZW9mKFNUQUNLMTZGUkFNRSk7CisKKyAgICBJRjE2MzJfU2F2ZWQxNl9zcyA9IHBUYXNrLT5zcyA9IHNlZzsKKyAgICBJRjE2MzJfU2F2ZWQxNl9zcCA9IHBUYXNrLT5zcCA9IHB0ciAtIHNpemVvZihTVEFDSzE2RlJBTUUpOwogICAgIG5ld0ZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OwotICAgIC8qIEJ1aWxkIHRoZSBzdGFjayBmcmFtZSBvbiB0aGUgbmV3IHN0YWNrICovCi0gICAgKm5ld0ZyYW1lID0gKm9sZEZyYW1lOworCisgICAgLyogQ29weSB0aGUgc3RhY2sgZnJhbWUgYW5kIHRoZSBsb2NhbCB2YXJpYWJsZXMgdG8gdGhlIG5ldyBzdGFjayAqLworCisgICAgY29weVNpemUgPSBvbGRGcmFtZS0+YnAgLSBwRGF0YS0+b2xkX3NwOworICAgIG1lbWNweSggbmV3RnJhbWUsIG9sZEZyYW1lLCBNQVgoIGNvcHlTaXplLCBzaXplb2YoU1RBQ0sxNkZSQU1FKSApKTsKIH0KIAogCkBAIC0xMDk0LDIyICsxMTA4LDI4IEBACiB7CiAgICAgVERCICpwVGFzazsKICAgICBTVEFDSzE2RlJBTUUgKm9sZEZyYW1lLCAqbmV3RnJhbWU7CisgICAgSU5TVEFOQ0VEQVRBICpwRGF0YTsKIAogICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICkpKSByZXR1cm47Ci0gICAgaWYgKCFwVGFzay0+c3dpdGNoU3RhY2tTUykKKyAgICBpZiAoIShwRGF0YSA9IChJTlNUQU5DRURBVEEgKilHbG9iYWxMb2NrMTYoIElGMTYzMl9TYXZlZDE2X3NzICkpKSByZXR1cm47CisgICAgaWYgKCFwRGF0YS0+b2xkX3NzKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiU3dpdGNoU3RhY2tCYWNrOiBubyBwcmV2aW91cyBTd2l0Y2hTdGFja1RvXG4iICk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgZHByaW50Zl90YXNrKCBzdGRkZWIsICJTd2l0Y2hTdGFja0JhY2s6IHJlc3RvcmluZyBzdGFjayAlMDR4OiUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICBwVGFzay0+c3dpdGNoU3RhY2tTUywgcFRhc2stPnN3aXRjaFN0YWNrU1AgKTsKKyAgICAgICAgICAgICAgICAgIHBEYXRhLT5vbGRfc3MsIHBEYXRhLT5vbGRfc3AgKTsKIAogICAgIG9sZEZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OworCiAgICAgLyogU3dpdGNoIGJhY2sgdG8gdGhlIG9sZCBzdGFjayAqLwotICAgIElGMTYzMl9TYXZlZDE2X3NzID0gcFRhc2stPnN3aXRjaFN0YWNrU1M7Ci0gICAgSUYxNjMyX1NhdmVkMTZfc3AgPSBwVGFzay0+c3dpdGNoU3RhY2tTUDsKLSAgICBwVGFzay0+c3dpdGNoU3RhY2tTUyA9IDA7CisKKyAgICBJRjE2MzJfU2F2ZWQxNl9zcyA9IHBUYXNrLT5zcyA9IHBEYXRhLT5vbGRfc3M7CisgICAgSUYxNjMyX1NhdmVkMTZfc3AgPSBwVGFzay0+c3AgPSBwRGF0YS0+b2xkX3NwOworICAgIHBEYXRhLT5vbGRfc3MgPSBwRGF0YS0+b2xkX3NwID0gMDsKKwogICAgIC8qIEJ1aWxkIGEgc3RhY2sgZnJhbWUgZm9yIHRoZSByZXR1cm4gKi8KKwogICAgIG5ld0ZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OwogICAgIG5ld0ZyYW1lLT5zYXZlZF9zcyA9IG9sZEZyYW1lLT5zYXZlZF9zczsKICAgICBuZXdGcmFtZS0+c2F2ZWRfc3AgPSBvbGRGcmFtZS0+c2F2ZWRfc3A7CkBAIC0xMTg1LDYgKzEyMDUsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRFeGVWZXJzaW9uICAgKEtFUk5FTC4xMDUpCisgKi8KK1dPUkQgR2V0RXhlVmVyc2lvbih2b2lkKQoreworICAgIFREQiAqcFRhc2s7CisKKyAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApKSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIHBUYXNrLT52ZXJzaW9uOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldEVycm9yTW9kZSAgIChLRVJORUwuMTA3KQogICovCiBVSU5UIFNldEVycm9yTW9kZSggVUlOVCBtb2RlICkKQEAgLTEyMjIsNiArMTI1NCw5IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFRhc2tEUyAgIChLRVJORUwuMTU1KQorICoKKyAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gYXBwYXJlbnRseSByZXR1cm5zIGEgRFdPUkQgd2l0aCBMT1dPUkQgPT0gSElXT1JELgorICogSSBkb24ndCB0aGluayB3ZSBuZWVkIHRvIGJvdGhlciB3aXRoIHRoaXMuCiAgKi8KIEhJTlNUQU5DRTE2IEdldFRhc2tEUyh2b2lkKQogewpAQCAtMTI0Niw2ICsxMjgxLDQ3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0VGFza1NpZ25hbFByb2MgICAoS0VSTkVMLjM4KQorICovCitGQVJQUk9DMTYgU2V0VGFza1NpZ25hbFByb2MoIEhUQVNLMTYgaFRhc2ssIEZBUlBST0MxNiBwcm9jICkKK3sKKyAgICBUREIgKnBUYXNrOworICAgIEZBUlBST0MxNiBvbGRQcm9jOworCisgICAgaWYgKCFoVGFzaykgaFRhc2sgPSBoQ3VycmVudFRhc2s7CisgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoVGFzayApKSkgcmV0dXJuIE5VTEw7CisgICAgb2xkUHJvYyA9IHBUYXNrLT51c2VyaGFuZGxlcjsKKyAgICBwVGFzay0+dXNlcmhhbmRsZXIgPSBwcm9jOworICAgIHJldHVybiBvbGRQcm9jOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldFNpZ0hhbmRsZXIgICAoS0VSTkVMLjE0MCkKKyAqLworV09SRCBTZXRTaWdIYW5kbGVyKCBGQVJQUk9DMTYgbmV3aGFuZGxlciwgRkFSUFJPQzE2KiBvbGRoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBVSU5UMTYgKm9sZG1vZGUsIFVJTlQxNiBuZXdtb2RlLCBVSU5UMTYgZmxhZyApCit7CisgICAgZnByaW50ZihzdGRuaW1wLCJTZXRTaWdIYW5kbGVyKCVwLCVwLCVwLCVkLCVkKSwgdW5pbXBsZW1lbnRlZC5cbiIsCisgICAgICAgICAgICBuZXdoYW5kbGVyLG9sZGhhbmRsZXIsb2xkbW9kZSxuZXdtb2RlLGZsYWcgKTsKKworICAgIGlmIChmbGFnICE9IDEpIHJldHVybiAwOworICAgIGlmICghbmV3bW9kZSkgbmV3aGFuZGxlciA9IE5VTEw7ICAvKiBEZWZhdWx0IGhhbmRsZXIgKi8KKyAgICBpZiAobmV3bW9kZSAhPSA0KQorICAgIHsKKyAgICAgICAgVERCICpwVGFzazsKKworICAgICAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApKSkgcmV0dXJuIDA7CisgICAgICAgIGlmIChvbGRtb2RlKSAqb2xkbW9kZSA9IHBUYXNrLT5zaWduYWxfZmxhZ3M7CisgICAgICAgIHBUYXNrLT5zaWduYWxfZmxhZ3MgPSBuZXdtb2RlOworICAgICAgICBpZiAob2xkaGFuZGxlcikgKm9sZGhhbmRsZXIgPSBwVGFzay0+c2lnaGFuZGxlcjsKKyAgICAgICAgcFRhc2stPnNpZ2hhbmRsZXIgPSBuZXdoYW5kbGVyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRFeGVQdHIgICAoS0VSTkVMLjEzMykKICAqLwogSE1PRFVMRTE2IEdldEV4ZVB0ciggSEFORExFMTYgaGFuZGxlICkKQEAgLTEzNDksMTUgKzE0MjUsMyBAQAogICAgIGlmIChHbG9iYWxTaXplMTYoaFRhc2spIDwgc2l6ZW9mKFREQikpIHJldHVybiAwOwogICAgIHJldHVybiBwVGFzay0+Y29tcGF0X2ZsYWdzOwogfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFNpZ0hhbmRsZXIgICAoS0VSTkVMLjE0MCkKLSAqLwotV09SRCBTZXRTaWdIYW5kbGVyKCBTRUdQVFIgbmV3aGFuZGxlcixTRUdQVFIqIG9sZGhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgIExQVUlOVDE2ICpvbGRtb2RlLFVJTlQxNiBuZXdtb2RlLFVJTlQxNiBmbGFnICkKLXsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIlNldFNpZ0hhbmRsZXIoJWx4LCVwLCVwLCVkLCVkKSwgdW5pbXBsZW1lbnRlZC5cbiIsCi0gICAgICAgICAgICBuZXdoYW5kbGVyLG9sZGhhbmRsZXIsb2xkbW9kZSxuZXdtb2RlLGZsYWcgKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL21pc2MvY29tbWRsZy5jIGIvbWlzYy9jb21tZGxnLmMKaW5kZXggMTc2YmI1YS4uNzIzZDU3NyAxMDA2NDQKLS0tIGEvbWlzYy9jb21tZGxnLmMKKysrIGIvbWlzYy9jb21tZGxnLmMKQEAgLTIyMzEsMTMgKzIyMzEsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgRm9udEZhbWlseUVudW1Qcm9jICAgICAgICAgICAgICAgICAgICAgICAoQ09NTURMRy4xOSkKICAqLwotaW50IEZvbnRGYW1pbHlFbnVtUHJvYyhMUExPR0ZPTlQxNiBscGxmLCBMUFRFWFRNRVRSSUMxNiBscHRtLCBpbnQgbkZvbnRUeXBlLCBMUEFSQU0gbFBhcmFtKQorSU5UMTYgRm9udEZhbWlseUVudW1Qcm9jKCBTRUdQVFIgbG9nZm9udCwgU0VHUFRSIG1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBuRm9udFR5cGUsIExQQVJBTSBsUGFyYW0gKQogewogICBpbnQgaTsKICAgV09SRCB3OwogICBIV05EIGh3bmQ9TE9XT1JEKGxQYXJhbSk7CiAgIEhXTkQgaERsZz1HZXRQYXJlbnQoaHduZCk7CiAgIExQQ0hPT1NFRk9OVCBscGNmPShMUENIT09TRUZPTlQpR2V0V2luZG93TG9uZzMyQShoRGxnLCBEV0xfVVNFUik7IAorICBMT0dGT05UMTYgKmxwbGYgPSAoTE9HRk9OVDE2ICopUFRSX1NFR19UT19MSU4oIGxvZ2ZvbnQgKTsKIAogICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJGb250RmFtaWx5RW51bVByb2M6IGZvbnQ9JXMgKG5Gb250VHlwZT0lZClcbiIsCiAgICAgIAkJCWxwbGYtPmxmRmFjZU5hbWUsbkZvbnRUeXBlKTsKQEAgLTIyNjgsNyArMjI3MCw4IEBACiAgKgogICogRmlsbCBmb250IHN0eWxlIGluZm9ybWF0aW9uIGludG8gY29tYm9ib3ggICh3aXRob3V0IHVzaW5nIGZvbnQuYyBkaXJlY3RseSkKICAqLwotc3RhdGljIGludCBTZXRGb250U3R5bGVzVG9Db21ibzIoSFdORCBod25kLCBIREMgaGRjLCBMUExPR0ZPTlQxNiBscGxmICxMUFRFWFRNRVRSSUMxNiBscHRtKQorc3RhdGljIGludCBTZXRGb250U3R5bGVzVG9Db21ibzIoSFdORCBod25kLCBIREMgaGRjLCBMUExPR0ZPTlQxNiBscGxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBURVhUTUVUUklDMTYgbHB0bSkKIHsKICAgICNkZWZpbmUgRlNUWUxFUyA0CiAgICBzdHJ1Y3QgRk9OVFNUWUxFCkBAIC0yMzM4LDEyICsyMzQxLDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICBGb250U3R5bGVFbnVtUHJvYyAgICAgICAgICAgICAgICAgICAgIChDT01NRExHLjE4KQogICovCi1pbnQgRm9udFN0eWxlRW51bVByb2MoTFBMT0dGT05UMTYgbHBsZiAsTFBURVhUTUVUUklDMTYgbHB0bSwgaW50IG5Gb250VHlwZSwgTFBBUkFNIGxQYXJhbSkKK0lOVDE2IEZvbnRTdHlsZUVudW1Qcm9jKCBTRUdQVFIgbG9nZm9udCwgU0VHUFRSIG1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IG5Gb250VHlwZSwgTFBBUkFNIGxQYXJhbSApCiB7CiAgIEhXTkQgaGNtYjI9TE9XT1JEKGxQYXJhbSk7CiAgIEhXTkQgaGNtYjM9SElXT1JEKGxQYXJhbSk7CiAgIEhXTkQgaERsZz1HZXRQYXJlbnQoaGNtYjMpOwogICBMUENIT09TRUZPTlQgbHBjZj0oTFBDSE9PU0VGT05UKUdldFdpbmRvd0xvbmczMkEoaERsZywgRFdMX1VTRVIpOyAKKyAgTE9HRk9OVDE2ICpscGxmID0gKExPR0ZPTlQxNiAqKVBUUl9TRUdfVE9fTElOKGxvZ2ZvbnQpOworICBURVhUTUVUUklDMTYgKmxwdG0gPSAoVEVYVE1FVFJJQzE2ICopUFRSX1NFR19UT19MSU4obWV0cmljcyk7CiAgIGludCBpOwogICAKICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiRm9udFN0eWxlRW51bVByb2M6IChuRm9udFR5cGU9JWQpXG4iLG5Gb250VHlwZSk7CkBAIC0yMzc2LDcgKzIzODIsNiBAQAogICBIREMgaGRjOwogICBpbnQgaSxqLHJlcyxpbml0PTA7CiAgIGxvbmcgbDsKLSAgRkFSUFJPQzE2IGVudW1DYWxsYmFjayA9IE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiRm9udEZhbWlseUVudW1Qcm9jIik7CiAgIExQTE9HRk9OVDE2IGxweHg7CiAgIEhDVVJTT1IgaGN1cnNvcj1TZXRDdXJzb3IoTG9hZEN1cnNvcjE2KDAsSURDX1dBSVQpKTsKICAgTFBDSE9PU0VGT05UIGxwY2Y7CkBAIC0yNDIyLDcgKzI0MjcsNyBAQAogICBoZGM9IChscGNmLT5GbGFncyAmIENGX1BSSU5URVJGT05UUyAmJiBscGNmLT5oREMpID8gbHBjZi0+aERDIDogR2V0REMoaERsZyk7CiAgIGlmIChoZGMpCiAgIHsKLSAgICBpZiAoIUVudW1Gb250RmFtaWxpZXMgKGhkYywgTlVMTCxlbnVtQ2FsbGJhY2ssKExQQVJBTSlHZXREbGdJdGVtKGhEbGcsY21iMSkpKQorICAgIGlmICghRW51bUZvbnRGYW1pbGllcyAoaGRjLCBOVUxMLEZvbnRGYW1pbHlFbnVtUHJvYywoTFBBUkFNKUdldERsZ0l0ZW0oaERsZyxjbWIxKSkpCiAgICAgICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJXTV9JTklURElBTE9HOiBFbnVtRm9udEZhbWlsaWVzIHJldHVybnMgMFxuIik7CiAgICAgaWYgKGxwY2YtPkZsYWdzICYgQ0ZfSU5JVFRPTE9HRk9OVFNUUlVDVCkKICAgICB7CkBAIC0yNjEwLDcgKzI2MTUsNiBAQAogTFJFU1VMVCBDRm5fV01Db21tYW5kKEhXTkQgaERsZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgY2hhciBidWZmZXJbMjAwXTsKLSAgRkFSUFJPQzE2IGVudW1DYWxsYmFjazsKICAgSEZPTlQgaEZvbnQvKixoRm9udE9sZCovOwogICBpbnQgaSxqOwogICBsb25nIGw7CkBAIC0yNjM0LDggKzI2MzgsNyBAQAogCQkgICAgICAgIEhDVVJTT1IgaGN1cnNvcj1TZXRDdXJzb3IoTG9hZEN1cnNvcjE2KDAsSURDX1dBSVQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTE2KGhEbGcsY21iMSxDQl9HRVRMQlRFWFQsaSwoTFBBUkFNKU1BS0VfU0VHUFRSKGJ1ZmZlcikpOwogCSAgICAgICAgICAgICAgICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJXTV9DT01NQU5EL2NtYjEgPT4lc1xuIixidWZmZXIpOwotCQkgICAgICAgIGVudW1DYWxsYmFjayA9IE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiRm9udFN0eWxlRW51bVByb2MiKTsKLSAgICAgICAJCSAgICAgICAgRW51bUZvbnRGYW1pbGllcyhoZGMsYnVmZmVyLGVudW1DYWxsYmFjaywKKyAgICAgICAJCSAgICAgICAgRW51bUZvbnRGYW1pbGllcyhoZGMsYnVmZmVyLEZvbnRTdHlsZUVudW1Qcm9jLAogCQkgICAgICAgICAgICAgTUFLRUxPTkcoR2V0RGxnSXRlbShoRGxnLGNtYjIpLEdldERsZ0l0ZW0oaERsZyxjbWIzKSkpOwogCQkgICAgICAgIFNldEN1cnNvcihoY3Vyc29yKTsgICAgICAgIAogCQkgICAgICB9CmRpZmYgLS1naXQgYS9taXNjL2V4ZWMuYyBiL21pc2MvZXhlYy5jCmluZGV4IGZiNjdhMGIuLjZjNmI4NDQgMTAwNjQ0Ci0tLSBhL21pc2MvZXhlYy5jCisrKyBiL21pc2MvZXhlYy5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCiAjaW5jbHVkZSAic2hlbGwuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ3aW4uaCIKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvam95c3RpY2suYyBiL211bHRpbWVkaWEvam95c3RpY2suYwppbmRleCA4MjE5NTdiLi4zMDFiYTZjIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL2pveXN0aWNrLmMKKysrIGIvbXVsdGltZWRpYS9qb3lzdGljay5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImxkdC5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgImRyaXZlci5oIgogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21jaXN0cmluZy5jIGIvbXVsdGltZWRpYS9tY2lzdHJpbmcuYwppbmRleCA1YWJkNDJhLi44OTVhMTEzIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaXN0cmluZy5jCisrKyBiL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAibGR0LmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAiZHJpdmVyLmgiCiAjaW5jbHVkZSAibW1zeXN0ZW0uaCIKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwppbmRleCAyODNjOTI4Li5lOTc0YzhiIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMKKysrIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImxkdC5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgImRyaXZlci5oIgogI2luY2x1ZGUgImZpbGUuaCIKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvdGltZS5jIGIvbXVsdGltZWRpYS90aW1lLmMKaW5kZXggYjUyNTM3Mi4uMjk5NDA1ZSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS90aW1lLmMKKysrIGIvbXVsdGltZWRpYS90aW1lLmMKQEAgLTcyLDkgKzcyLDggQEAKICAqICAgICAgICAgIGd1ZXNzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdmlhIFNldFRpbWVyIGhhcyB0byBiZSBpbXByb3ZlZCB1cG9uLgkJCiAgKi8KIAotCQlDYWxsVG8xNl93b3JkX3d3bGxsKGxwVGltZXItPmxwRnVuYywKLQkJCWxwVGltZXItPmhJbnN0YW5jZSwgbHBUaW1lci0+d1RpbWVySUQsIAotCQkJMCwgbHBUaW1lci0+ZHdVc2VyLCAwLCAwKTsKKwkJQ2FsbFRpbWVGdW5jUHJvYyhscFRpbWVyLT5scEZ1bmMsIGxwVGltZXItPndUaW1lcklELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGxwVGltZXItPmR3VXNlciwgMCwgMCk7CiAKIAkJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gYWZ0ZXIgQ2FsbEJhY2sxNiAhXG4iKTsKIAkJZmZsdXNoKHN0ZG91dCk7CmRpZmYgLS1naXQgYS9vYmplY3RzL2JpdG1hcC5jIGIvb2JqZWN0cy9iaXRtYXAuYwppbmRleCBmNjA5ZjI1Li5hZmMwYjZiIDEwMDY0NAotLS0gYS9vYmplY3RzL2JpdG1hcC5jCisrKyBiL29iamVjdHMvYml0bWFwLmMKQEAgLTEyOSw4ICsxMjksMTIgQEAKIAogICAgIGRwcmludGZfZ2RpKCBzdGRkZWIsICJDcmVhdGVDb21wYXRpYmxlQml0bWFwKCUwNHgsJWQsJWQpID0gXG4iLCAKICAgICAgICAgICAgICAgICAgaGRjLCB3aWR0aCwgaGVpZ2h0ICk7Ci0gICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApKSkgcmV0dXJuIDA7Ci0gICAgCisgICAgZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOworICAgIGlmICghZGMpIAorICAgIHsKKwlkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBNRVRBRklMRV9EQ19NQUdJQyk7CisJaWYgKCFkYykgcmV0dXJuIDA7CisgICAgfQogICAgIGhibXBSZXQgPSBDcmVhdGVCaXRtYXAoIHdpZHRoLCBoZWlnaHQsIDEsIGRjLT53LmJpdHNQZXJQaXhlbCwgTlVMTCApOwogICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwiXHRcdCUwNHhcbiIsIGhibXBSZXQpOwogICAgIHJldHVybiBoYm1wUmV0OwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jb2xvci5jIGIvb2JqZWN0cy9jb2xvci5jCmluZGV4IGI3YzQ1YTIuLjMwOGQxOTEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY29sb3IuYworKysgYi9vYmplY3RzL2NvbG9yLmMKQEAgLTM0LDEwICszNCw2IEBACiAgKiBodHRwOi8vMTk4LjEwNS4yMzIuNS9NU0ROL0xJQlJBUlkvVEVDSE5PVEUvQ0gzLkhUTSAKICAqLwogCi1leHRlcm4gdm9pZCBCSVRCTFRfU2V0QWNjZWxNb2RlKCBpbnQgKTsgLyogc3BlZWQgdXAgSU5WRVJUIHJhc3RlciBvcHMgd2hlbmV2ZXIgcG9zc2libGUgCi0JCQkJCSAqIHBhcmFtZXRlciBpcyBhIHNwZWVkdXAgbGV2ZWwgKHNlZSBiaXRibHQuYykKLQkJCQkJICovCi0KIHR5cGVkZWYgc3RydWN0CiB7IAogICAgIENvbG9ybWFwICAgIGNvbG9yTWFwOwpAQCAtMzc1LDkgKzM3MSw2IEBACiAKICAgICAgICAgY3MtPnNpemUgPSBjX21pbiArIE5CX1JFU0VSVkVEX0NPTE9SUzsKIAotCUNPTE9SX2dhcFN0YXJ0ID0gY3MtPnNpemUvMjsKLQlDT0xPUl9nYXBFbmQgPSAyNTYgLSBjcy0+c2l6ZS8yOwotCiAJWFVuZ3JhYlNlcnZlcihkaXNwbGF5KTsKIAogCWRwcmludGZfcGFsZXR0ZShzdGRkZWIsImFkanVzdGVkIHNpemUgJWkgY29sb3JjZWxsc1xuIiwgY3MtPnNpemUpOwpAQCAtNjkwLDcgKzY4Myw3IEBACiAgICAgQllURSByID0gR2V0UlZhbHVlKGNvbCksIGcgPSBHZXRHVmFsdWUoY29sKSwgYiA9IEdldEJWYWx1ZShjb2wpOwogICAgIGZvciggaSA9IDA7IGkgPCBzaXplOyBpKysgKQogICAgIHsKLSAgICAgICAgaWYoIHBhbFBhbEVudHJ5W2ldLnBlRmxhZ3MgJiBQQ19TWVNfVVNFRCApIAkvKiBza2lwIGdhcCAqLworICAgICAgICBpZiggcGFsUGFsRW50cnlbaV0ucGVGbGFncyAmIFBDX1NZU19VU0VEICkgCS8qIHNraXBzIGdhcCAqLwogICAgICAgICAgICAgaWYoIHBhbFBhbEVudHJ5W2ldLnBlUmVkID09IHIgJiYKICAgICAgICAgICAgICAgICBwYWxQYWxFbnRyeVtpXS5wZUdyZWVuID09IGcgJiYKICAgICAgICAgICAgICAgICBwYWxQYWxFbnRyeVtpXS5wZUJsdWUgPT0gYiApCkBAIC05NjQsMTcgKzk1NywxNSBAQAogCiAgICAgICAgICAgICAgICAgICAgIENPTE9SX3N5c1BhbFtpbmRleF0gPSBwYWxQdHItPmxvZ3BhbGV0dGUucGFsUGFsRW50cnlbaV07CiAgICAgICAgICAgICAgICAgICAgIENPTE9SX3N5c1BhbFtpbmRleF0ucGVGbGFncyA9IGZsYWc7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBDT0xPUl9QYWxldHRlVG9QaXhlbCApIGluZGV4ID0gQ09MT1JfUGFsZXR0ZVRvUGl4ZWxbaW5kZXhdOwotCiAJCSAgICBDT0xPUl9mcmVlTGlzdFtpbmRleF0gPSAwOwotCQkgICAgcGFsUHRyLT5sb2dwYWxldHRlLnBhbFBhbEVudHJ5W2ldLnBlRmxhZ3MgPSBQQ19TWVNfVVNFRCB8IFBDX1NZU19NQVBQRUQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIENPTE9SX1BhbGV0dGVUb1BpeGVsICkgaW5kZXggPSBDT0xPUl9QYWxldHRlVG9QaXhlbFtpbmRleF07CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIGlmICggY1NwYWNlLmZsYWdzICYgQ09MT1JfVklSVFVBTCApIAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBDT0xPUl9Ub1BoeXNpY2FsKCBOVUxMLCAweDAwZmZmZmZmICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihDT0xPUlJFRiopKHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxQYWxFbnRyeSArIGkpKTsKLQkJICAgIHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxQYWxFbnRyeVtpXS5wZUZsYWdzID0gUENfU1lTX1VTRUQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgCiAgICAgICAgICAgICAgICAgfQogCkBAIC05ODMsNyArOTc0LDcgQEAKICAgICAgICAgICAgICAgICBpbmRleCA9IENPTE9SX1BhbGV0dGVMb29rdXBQaXhlbChDT0xPUl9zeXNQYWwsIDI1NiwgTlVMTCwgCiAgICAgICAgICAgICAgICAgICAgICAgICooQ09MT1JSRUYqKShwYWxQdHItPmxvZ3BhbGV0dGUucGFsUGFsRW50cnkgKyBpKSwgVFJVRSk7CiAgICAgICAgICAgICB9Ci0JICAgIHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxQYWxFbnRyeVtpXS5wZUZsYWdzID0gUENfU1lTX1VTRUQ7CisJICAgIHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxQYWxFbnRyeVtpXS5wZUZsYWdzIHw9IFBDX1NZU19VU0VEOwogCiAgICAgICAgICAgICBpZiggQ09MT1JfUGFsZXR0ZVRvUGl4ZWwgKSBpbmRleCA9IENPTE9SX1BhbGV0dGVUb1BpeGVsW2luZGV4XTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kaWIuYyBiL29iamVjdHMvZGliLmMKaW5kZXggZWY5ZjA3Mi4uZTk0YjQxNyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kaWIuYworKysgYi9vYmplY3RzL2RpYi5jCkBAIC01NjIsMTMgKzU2MiwxNyBAQAogICogSGVscGVyIGZ1bmN0aW9uIGZvciBTZXRESUJpdHMoKSBhbmQgU2V0RElCaXRzVG9EZXZpY2UoKS4KICAqLwogc3RhdGljIGludCBESUJfU2V0SW1hZ2VCaXRzKCBEQyAqZGMsIFdPUkQgbGluZXMsIFdPUkQgZGVwdGgsIExQU1RSIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGluZm9XaWR0aCwgV09SRCBpbmZvQnBwLCBEV09SRCBjb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgaW5mb1dpZHRoLCBXT1JEIGluZm9CcHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BUElORk8gKmluZm8sIFdPUkQgY29sb3J1c2UsCiAJCQkgICAgIERyYXdhYmxlIGRyYXdhYmxlLCBHQyBnYywgaW50IHhTcmMsIGludCB5U3JjLAogCQkJICAgICBpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0ICkKIHsKICAgICBpbnQgKmNvbG9yTWFwcGluZzsKICAgICBYSW1hZ2UgKmJtcEltYWdlOworICAgIERXT1JEIGNvbXByZXNzaW9uID0gMDsKKworICAgIGlmIChpbmZvLT5ibWlIZWFkZXIuYmlTaXplID09IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKKyAgICAgICAgY29tcHJlc3Npb24gPSBpbmZvLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbjsKIAogICAgICAgLyogQnVpbGQgdGhlIGNvbG9yIG1hcHBpbmcgdGFibGUgKi8KIApAQCAtNjQ3LDI0ICs2NTEsMjcgQEAKIHsKICAgICBEQyAqIGRjOwogICAgIEJJVE1BUE9CSiAqIGJtcDsKLSAgICBEV09SRCB3aWR0aCwgaGVpZ2h0LCBjb21wcmVzc2lvbiA9IDA7CisgICAgRFdPUkQgd2lkdGgsIGhlaWdodDsKICAgICBXT1JEIGJwcDsKIAogICAgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwogCi0gICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApKSkgcmV0dXJuIDA7CisgICAgZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOworICAgIGlmICghZGMpIAorICAgIHsKKwlkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBNRVRBRklMRV9EQ19NQUdJQyk7CisJaWYgKCFkYykgcmV0dXJuIDA7CisgICAgfQogICAgIGlmICghKGJtcCA9IChCSVRNQVBPQkogKilHRElfR2V0T2JqUHRyKCBoYml0bWFwLCBCSVRNQVBfTUFHSUMgKSkpCiAJcmV0dXJuIDA7CiAgICAgaWYgKERJQl9HZXRCaXRtYXBJbmZvKCAmaW5mby0+Ym1pSGVhZGVyLCAmd2lkdGgsICZoZWlnaHQsICZicHAgKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKGluZm8tPmJtaUhlYWRlci5iaVNpemUgPT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKQotICAgICAgICBjb21wcmVzc2lvbiA9IGluZm8tPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uOwogICAgIGlmICghbGluZXMgfHwgKHN0YXJ0c2NhbiA+PSAoV09SRCloZWlnaHQpKSByZXR1cm4gMDsKICAgICBpZiAoc3RhcnRzY2FuICsgbGluZXMgPiBoZWlnaHQpIGxpbmVzID0gaGVpZ2h0IC0gc3RhcnRzY2FuOwogCi0gICAgcmV0dXJuIENhbGxUbzMyX0xhcmdlU3RhY2soIChpbnQoKikoKSlESUJfU2V0SW1hZ2VCaXRzLCAxNywKKyAgICByZXR1cm4gQ2FsbFRvMzJfTGFyZ2VTdGFjayggKGludCgqKSgpKURJQl9TZXRJbWFnZUJpdHMsIDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYywgbGluZXMsIGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzLCB3aWR0aCwgYnBwLCBjb21wcmVzc2lvbiwgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cywgd2lkdGgsIGJwcCwgaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3J1c2UsIGJtcC0+cGl4bWFwLCBCSVRNQVBfR0MoYm1wKSwgMCwgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzY2FuLCBibXAtPmJpdG1hcC5ibVdpZHRoLCBsaW5lcyApOwogfQpAQCAtNjc5LDE2ICs2ODYsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgY29sb3J1c2UgKQogewogICAgIERDICogZGM7Ci0gICAgRFdPUkQgd2lkdGgsIGhlaWdodCwgY29tcHJlc3Npb24gPSAwOworICAgIERXT1JEIHdpZHRoLCBoZWlnaHQ7CiAgICAgV09SRCBicHA7CiAKICAgICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KIAotICAgIGlmICghKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSkpIHJldHVybiAwOworICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKKyAgICBpZiAoIWRjKSAKKyAgICB7CisJZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgTUVUQUZJTEVfRENfTUFHSUMpOworCWlmICghZGMpIHJldHVybiAwOworICAgIH0KICAgICBpZiAoRElCX0dldEJpdG1hcEluZm8oICZpbmZvLT5ibWlIZWFkZXIsICZ3aWR0aCwgJmhlaWdodCwgJmJwcCApID09IC0xKQogICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpCi0gICAgICAgIGNvbXByZXNzaW9uID0gaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb247CiAgICAgaWYgKCFsaW5lcyB8fCAoc3RhcnRzY2FuID49IGhlaWdodCkpIHJldHVybiAwOwogICAgIGlmIChzdGFydHNjYW4gKyBsaW5lcyA+IGhlaWdodCkgbGluZXMgPSBoZWlnaHQgLSBzdGFydHNjYW47CiAgICAgaWYgKHlTcmMgPCBzdGFydHNjYW4pIHlTcmMgPSBzdGFydHNjYW47CkBAIC03MDAsOSArNzEwLDkgQEAKIAogICAgIERDX1NldHVwR0NGb3JUZXh0KCBkYyApOyAgLyogVG8gaGF2ZSB0aGUgY29ycmVjdCBjb2xvcnMgKi8KICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIERDX1hST1BmdW5jdGlvbltkYy0+dy5ST1Btb2RlLTFdICk7Ci0gICAgcmV0dXJuIENhbGxUbzMyX0xhcmdlU3RhY2soIChpbnQoKikoKSlESUJfU2V0SW1hZ2VCaXRzLCAxNywKKyAgICByZXR1cm4gQ2FsbFRvMzJfTGFyZ2VTdGFjayggKGludCgqKSgpKURJQl9TZXRJbWFnZUJpdHMsIDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYywgbGluZXMsIGRjLT53LmJpdHNQZXJQaXhlbCwgYml0cywgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcCwgY29tcHJlc3Npb24sIGluZm8sIGNvbG9ydXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHAsIGluZm8sIGNvbG9ydXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4U3JjLCB5U3JjIC0gc3RhcnRzY2FuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBYTFBUT0RQKCBkYywgeERlc3QgKSwKQEAgLTcyNiw3ICs3MzYsMTIgQEAKICAgICBpbnQgaSwgeCwgeTsKICAgICAgICAgCiAgICAgaWYgKCFsaW5lcykgcmV0dXJuIDA7Ci0gICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApKSkgcmV0dXJuIDA7CisgICAgZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOworICAgIGlmICghZGMpIAorICAgIHsKKwlkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBNRVRBRklMRV9EQ19NQUdJQyk7CisJaWYgKCFkYykgcmV0dXJuIDA7CisgICAgfQogICAgIGlmICghKGJtcCA9IChCSVRNQVBPQkogKilHRElfR2V0T2JqUHRyKCBoYml0bWFwLCBCSVRNQVBfTUFHSUMgKSkpCiAJcmV0dXJuIDA7CiAgICAgaWYgKCEocGFsZXR0ZSA9IChQQUxFVFRFT0JKKilHRElfR2V0T2JqUHRyKCBkYy0+dy5oUGFsZXR0ZSwgUEFMRVRURV9NQUdJQyApKSkKZGlmZiAtLWdpdCBhL29iamVjdHMvZm9udC5jIGIvb2JqZWN0cy9mb250LmMKaW5kZXggZmI0ZTIzNC4uNWNkZmQzOCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9mb250LmMKKysrIGIvb2JqZWN0cy9mb250LmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxYMTEvWGF0b20uaD4KICNpbmNsdWRlICJmb250LmgiCiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJzdHJpbmczMi5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKQEAgLTExMjQsNyArMTEyMyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJRW51bUZvbnRzCQkJW0dESS43MF0KICAqLwotSU5UIEVudW1Gb250cyhIREMgaERDLCBMUENTVFIgbHBGYWNlTmFtZSwgRk9OVEVOVU1QUk9DIGxwRW51bUZ1bmMsIExQQVJBTSBscERhdGEpCitJTlQgRW51bUZvbnRzKEhEQyBoREMsIExQQ1NUUiBscEZhY2VOYW1lLCBGT05URU5VTVBST0MxNiBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQogewogICBIQU5ETEUgICAgICAgaExvZzsKICAgSEFORExFICAgICAgIGhNZXQ7CkBAIC0xMTc4LDggKzExNzcsOCBAQAogICAgIFNlbGVjdE9iamVjdChoREMsIGhPbGRGb250KTsKICAgICBEZWxldGVPYmplY3QoaEZvbnQpOwogICAgIGRwcmludGZfZm9udChzdGRkZWIsIkVudW1Gb250cyAvLyBpPSVkIGxwTG9nRm9udD0lcCBscHRtPSVwXG4iLCBpLCBscExvZ0ZvbnQsIGxwdG0pOwotICAgIG5SZXQgPSBDYWxsRW51bUZvbnRzUHJvYygoRkFSUFJPQzE2KWxwRW51bUZ1bmMsIEdESV9IRUFQX1NFR19BRERSKGhMb2cpLAotCQkJICAgICBHRElfSEVBUF9TRUdfQUREUihoTWV0KSwgMCwgKExPTkcpbHBEYXRhICk7CisgICAgblJldCA9IGxwRW51bUZ1bmMoIEdESV9IRUFQX1NFR19BRERSKGhMb2cpLCBHRElfSEVBUF9TRUdfQUREUihoTWV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgKExPTkcpbHBEYXRhICk7CiAgICAgaWYgKG5SZXQgPT0gMCkgewogICAgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiRW51bUZvbnRzIC8vIEVudW1FbmQgcmVxdWVzdGVkIGJ5IGFwcGxpY2F0aW9uICFcbiIpOwogICAgICAgYnJlYWs7CkBAIC0xMTk0LDcgKzExOTMsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCUVudW1Gb250RmFtaWxpZXMJW0dESS4zMzBdCiAgKi8KLUlOVCBFbnVtRm9udEZhbWlsaWVzKEhEQyBoREMsIExQQ1NUUiBscHN6RmFtaWx5LCBGT05URU5VTVBST0MgbHBFbnVtRnVuYywgTFBBUkFNIGxwRGF0YSkKK0lOVCBFbnVtRm9udEZhbWlsaWVzKEhEQyBoREMsIExQQ1NUUiBscHN6RmFtaWx5LCBGT05URU5VTVBST0MxNiBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQogewogICBIQU5ETEUgICAgICAgCWhMb2c7CiAgIEhBTkRMRSAgICAgICAJaE1ldDsKQEAgLTEyNDgsMTAgKzEyNDcsOCBAQAogICAgIERlbGV0ZU9iamVjdChoRm9udCk7CiAgICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIkVudW1Gb250RmFtaWxpZXMgLy8gaT0lZCBscExvZ0ZvbnQ9JXAgbHB0bT0lcFxuIiwgaSwgbHBFbnVtTG9nRm9udCwgbHB0bSk7CiAgICAgCi0gICAgblJldCA9IENhbGxFbnVtRm9udEZhbVByb2MoIChGQVJQUk9DMTYpbHBFbnVtRnVuYywKLQkJCSAgICAgICBHRElfSEVBUF9TRUdfQUREUihoTG9nKSwKLQkJCSAgICAgICBHRElfSEVBUF9TRUdfQUREUihoTWV0KSwKLQkJCSAgICAgICAwLCBscERhdGEgKTsKKyAgICBuUmV0ID0gbHBFbnVtRnVuYyggR0RJX0hFQVBfU0VHX0FERFIoaExvZyksIEdESV9IRUFQX1NFR19BRERSKGhNZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAwLCBscERhdGEgKTsKICAgICBpZiAoblJldCA9PSAwKSB7CiAgICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udEZhbWlsaWVzIC8vIEVudW1FbmQgcmVxdWVzdGVkIGJ5IGFwcGxpY2F0aW9uICFcbiIpOwogICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9vYmplY3RzL2dkaW9iai5jIGIvb2JqZWN0cy9nZGlvYmouYwppbmRleCAxZGZmZDMwLi5jNDA2MTQwIDEwMDY0NAotLS0gYS9vYmplY3RzL2dkaW9iai5jCisrKyBiL29iamVjdHMvZ2Rpb2JqLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlICJwYWxldHRlLmgiCiAjaW5jbHVkZSAicGVuLmgiCiAjaW5jbHVkZSAicmVnaW9uLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgpAQCAtNDM1LDcgKzQzNCw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBFbnVtT2JqZWN0cyAgICAoR0RJLjcxKQogICovCi1JTlQgRW51bU9iamVjdHMoIEhEQyBoZGMsIElOVCBuT2JqVHlwZSwgR09CSkVOVU1QUk9DIGxwRW51bUZ1bmMsIExQQVJBTSBsUGFyYW0gKQorSU5UIEVudW1PYmplY3RzKCBIREMgaGRjLCBJTlQgbk9ialR5cGUsIEdPQkpFTlVNUFJPQzE2IGxwRW51bUZ1bmMsCisgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQogewogICAgIC8qIFNvbGlkIGNvbG9ycyB0byBlbnVtZXJhdGUgKi8KICAgICBzdGF0aWMgY29uc3QgQ09MT1JSRUYgc29saWRfY29sb3JzW10gPQpAQCAtNDY2LDggKzQ2Niw3IEBACiAgICAgICAgICAgICBwZW4tPmxvcG5XaWR0aC54ID0gMTsKICAgICAgICAgICAgIHBlbi0+bG9wbldpZHRoLnkgPSAwOwogICAgICAgICAgICAgcGVuLT5sb3BuQ29sb3IgICA9IHNvbGlkX2NvbG9yc1tpXTsKLSAgICAgICAgICAgIHJldHZhbCA9IENhbGxFbnVtT2JqZWN0c1Byb2MoIChGQVJQUk9DMTYpbHBFbnVtRnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUl9HRVQocGVuKSwgbFBhcmFtICk7CisgICAgICAgICAgICByZXR2YWwgPSBscEVudW1GdW5jKCBTRUdQVFJfR0VUKHBlbiksIGxQYXJhbSApOwogICAgICAgICAgICAgZHByaW50Zl9nZGkoIHN0ZGRlYiwgIkVudW1PYmplY3Q6IHNvbGlkIHBlbiAlMDhseCwgcmV0PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbGlkX2NvbG9yc1tpXSwgcmV0dmFsKTsKICAgICAgICAgICAgIGlmICghcmV0dmFsKSBicmVhazsKQEAgLTQ4Myw4ICs0ODIsNyBAQAogICAgICAgICAgICAgYnJ1c2gtPmxiU3R5bGUgPSBCU19TT0xJRDsKICAgICAgICAgICAgIGJydXNoLT5sYkNvbG9yID0gc29saWRfY29sb3JzW2ldOwogICAgICAgICAgICAgYnJ1c2gtPmxiSGF0Y2ggPSAwOwotICAgICAgICAgICAgcmV0dmFsID0gQ2FsbEVudW1PYmplY3RzUHJvYyggKEZBUlBST0MxNilscEVudW1GdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSX0dFVChicnVzaCksIGxQYXJhbSApOworICAgICAgICAgICAgcmV0dmFsID0gbHBFbnVtRnVuYyggU0VHUFRSX0dFVChicnVzaCksIGxQYXJhbSApOwogICAgICAgICAgICAgZHByaW50Zl9nZGkoIHN0ZGRlYiwgIkVudW1PYmplY3Q6IHNvbGlkIGJydXNoICUwOGx4LCByZXQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29saWRfY29sb3JzW2ldLCByZXR2YWwpOwogICAgICAgICAgICAgaWYgKCFyZXR2YWwpIGJyZWFrOwpAQCAtNDk2LDggKzQ5NCw3IEBACiAgICAgICAgICAgICBicnVzaC0+bGJTdHlsZSA9IEJTX0hBVENIRUQ7CiAgICAgICAgICAgICBicnVzaC0+bGJDb2xvciA9IFJHQigwLDAsMCk7CiAgICAgICAgICAgICBicnVzaC0+bGJIYXRjaCA9IGk7Ci0gICAgICAgICAgICByZXR2YWwgPSBDYWxsRW51bU9iamVjdHNQcm9jKCAoRkFSUFJPQzE2KWxwRW51bUZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFJfR0VUKGJydXNoKSwgbFBhcmFtICk7CisgICAgICAgICAgICByZXR2YWwgPSBscEVudW1GdW5jKCBTRUdQVFJfR0VUKGJydXNoKSwgbFBhcmFtICk7CiAgICAgICAgICAgICBkcHJpbnRmX2dkaSggc3RkZGViLCAiRW51bU9iamVjdDogaGF0Y2hlZCBicnVzaCAlZCwgcmV0PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJldHZhbCk7CiAgICAgICAgICAgICBpZiAoIXJldHZhbCkgYnJlYWs7CmRpZmYgLS1naXQgYS9vYmplY3RzL2xpbmVkZGEuYyBiL29iamVjdHMvbGluZWRkYS5jCmluZGV4IDVlZjEwZjIuLmJlOTY5M2YgMTAwNjQ0Ci0tLSBhL29iamVjdHMvbGluZWRkYS5jCisrKyBiL29iamVjdHMvbGluZWRkYS5jCkBAIC0yLDI0ICsyLDM1IEBACiAgKiBMaW5lRERBCiAgKgogICogQ29weXJpZ2h0IDE5OTMgQm9iIEFtc3RhZHQKLSAqCiAgKi8KIAorI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTICAvKiBUaGlzIGZpbGUgaXMgV2luMzItY2xlYW4gKi8KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUxpbmVEREEJCShHREkuMTAwKQorICogICAgICAgICAgIExpbmVEREExNiAgIChHREkuMTAwKQogICovCi12b2lkIExpbmVEREEoc2hvcnQgblhTdGFydCwgc2hvcnQgbllTdGFydCwgc2hvcnQgblhFbmQsIHNob3J0IG5ZRW5kLAotCSAgICAgRkFSUFJPQzE2IGNhbGxiYWNrLCBsb25nIGxQYXJhbSkKK3ZvaWQgTGluZUREQTE2KCBJTlQxNiBuWFN0YXJ0LCBJTlQxNiBuWVN0YXJ0LCBJTlQxNiBuWEVuZCwgSU5UMTYgbllFbmQsCisgICAgICAgICAgICAgICAgTElORUREQVBST0MxNiBjYWxsYmFjaywgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgaW50IHhhZGQgPSAxLCB5YWRkID0gMTsKLSAgICBpbnQgZXJyLGVycmFkZDsKLSAgICBpbnQgY250OwotICAgIGludCBkeCA9IG5YRW5kIC0gblhTdGFydDsKLSAgICBpbnQgZHkgPSBuWUVuZCAtIG5ZU3RhcnQ7CisgICAgTGluZUREQTMyKCBuWFN0YXJ0LCBuWVN0YXJ0LCBuWEVuZCwgbllFbmQsCisgICAgICAgICAgICAgICAoTElORUREQVBST0MzMiljYWxsYmFjaywgbFBhcmFtICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMaW5lRERBMzIgICAoR0RJMzIuMjQ4KQorICovCitCT09MMzIgTGluZUREQTMyKCBJTlQzMiBuWFN0YXJ0LCBJTlQzMiBuWVN0YXJ0LCBJTlQzMiBuWEVuZCwgSU5UMzIgbllFbmQsCisgICAgICAgICAgICAgICAgICBMSU5FRERBUFJPQzMyIGNhbGxiYWNrLCBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICBJTlQzMiB4YWRkID0gMSwgeWFkZCA9IDE7CisgICAgSU5UMzIgZXJyLGVycmFkZDsKKyAgICBJTlQzMiBjbnQ7CisgICAgSU5UMzIgZHggPSBuWEVuZCAtIG5YU3RhcnQ7CisgICAgSU5UMzIgZHkgPSBuWUVuZCAtIG5ZU3RhcnQ7CiAKICAgICBpZiAoZHggPCAwKSAgewogICAgICAgZHggPSAtZHg7IHhhZGQgPSAtMTsKQEAgLTMwLDcgKzQxLDcgQEAKICAgICBpZiAoZHggPiBkeSkgeyAvKiBsaW5lIGlzICJtb3JlIGhvcml6b250YWwiICovCiAgICAgICBlcnIgPSAyKmR5IC0gZHg7IGVycmFkZCA9IDIqZHkgLSAyKmR4OwogICAgICAgZm9yKGNudCA9IDA7Y250IDw9IGR4OyBjbnQrKykgewotCUNhbGxMaW5lRERBUHJvYyhjYWxsYmFjayxuWFN0YXJ0LG5ZU3RhcnQsbFBhcmFtKTsKKyAgICAgICAgY2FsbGJhY2soblhTdGFydCxuWVN0YXJ0LGxQYXJhbSk7CiAJaWYgKGVyciA+IDApIHsKIAkgIG5ZU3RhcnQgKz0geWFkZDsKIAkgIGVyciArPSBlcnJhZGQ7CkBAIC00Miw3ICs1Myw3IEBACiAgICAgfSBlbHNlICB7IC8qIGxpbmUgaXMgIm1vcmUgdmVydGljYWwiICovCiAgICAgICBlcnIgPSAyKmR4IC0gZHk7IGVycmFkZCA9IDIqZHggLSAyKmR5OwogICAgICAgZm9yKGNudCA9IDA7Y250IDw9IGR5OyBjbnQrKykgewotCUNhbGxMaW5lRERBUHJvYyhjYWxsYmFjayxuWFN0YXJ0LG5ZU3RhcnQsbFBhcmFtKTsKKwljYWxsYmFjayhuWFN0YXJ0LG5ZU3RhcnQsbFBhcmFtKTsKIAlpZiAoZXJyID4gMCkgewogCSAgblhTdGFydCArPSB4YWRkOwogCSAgZXJyICs9IGVycmFkZDsKQEAgLTUyLDQgKzYzLDUgQEAKIAluWVN0YXJ0ICs9IHlhZGQ7CiAgICAgICB9CiAgICAgfQorICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9tZXRhZmlsZS5jIGIvb2JqZWN0cy9tZXRhZmlsZS5jCmluZGV4IGYzZmIxYTcuLjNjMmFkMWEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvbWV0YWZpbGUuYworKysgYi9vYmplY3RzL21ldGFmaWxlLmMKQEAgLTIsNyArMiw3IEBACiAgKiBNZXRhZmlsZSBmdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgIERhdmlkIFcuIE1ldGNhbGZlLCAxOTk0Ci0gKiAgICAgICAgICAgIE5pZWxzIGRlIENhcnBlbnRpZXIsIDE5OTYKKyAqICAgICAgICAgICAgTmllbHMgZGUgQ2FycGVudGllciwgQWxicmVjaHQgS2xlaW5lIDE5OTYKICAqCiAgKi8KIApAQCAtMTIsOCArMTIsOCBAQAogI2luY2x1ZGUgImJpdG1hcC5oIgogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJtZXRhZmlsZS5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBIVElOQ1IgIDEwICAgICAgLyogaGFuZGxlIHRhYmxlIGFsbG9jYXRpb24gc2l6ZSBpbmNyZW1lbnQgKi8KQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgICBHRElfRnJlZU9iamVjdChoYW5kbGUpOwogCXJldHVybiAwOwogICAgIH0KLSAgICAKKyAgICBkYy0+dy5iaXRzUGVyUGl4ZWwgICAgPSBzY3JlZW5EZXB0aDsKICAgICBtaCA9IChNRVRBSEVBREVSICopR2xvYmFsTG9jazE2KGRjLT53LmhNZXRhRmlsZSk7CiAKICAgICBtaC0+bXRIZWFkZXJTaXplID0gTUZIRUFERVJTSVpFIC8gMjsKQEAgLTEzNSwxNCArMTM1LDEzIEBACiAgICAgLyogY3JlYXRlIHRoZSBoYW5kbGUgdGFibGUgKi8KICAgICBIVExlbiA9IEhUSU5DUjsKICAgICBoSFQgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUgfCBHTUVNX1pFUk9JTklULCAKLQkJICAgICAgc2l6ZW9mKEhBTkRMRVRBQkxFKSAqIEhUTGVuKTsKKwkJICAgICAgc2l6ZW9mKEhBTkRMRVRBQkxFMTYpICogSFRMZW4pOwogICAgIAogICAgIEdsb2JhbFVubG9jazE2KGRjLT53LmhNZXRhRmlsZSk7CiAgICAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIkNyZWF0ZU1ldGFGaWxlOiByZXR1cm5pbmcgJTA0eFxuIiwgaGFuZGxlKTsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgQ29weU1ldGFmaWxlICAgICAgICAgR0RJLjE1MSBOaWVscyBkZSBDYXJwZW50aWVyLCBBcHJpbCAxOTk2CiAgKi8KQEAgLTE2Myw4ICsxNjIsMTMgQEAKICAgICAKICAgICBpZiAobHBGaWxlbmFtZSkgICAgICAgICAgLyogZGlzayBiYXNlZCBtZXRhZmlsZSAqLwogICAgICAgICB7CisgICAgICAgIGludCBpLGo7CiAJaEZpbGUgPSBfbGNyZWF0KGxwRmlsZW5hbWUsIDApOwotCWlmIChfbHdyaXRlKGhGaWxlLCAoY2hhciAqKW1oLCBtaC0+bXRTaXplICogMikgPT0gLTEpCisJaj1taC0+bXRUeXBlOworCW1oLT5tdFR5cGU9MTsgICAgICAgIC8qIGRpc2sgZmlsZSB2ZXJzaW9uIHN0b3JlcyAxIGhlcmUgKi8KKwlpPV9sd3JpdGUoaEZpbGUsIChjaGFyICopbWgsIG1oLT5tdFNpemUgKiAyKSA7CisJbWgtPm10VHlwZT1qOyAgICAgICAgLyogcmVzdG9yZSBvbGQgdmFsdWUgIFswIG9yIDFdICovCQorCWlmIChpID09IC0xKQogCSAgICB7CiAJICAgIF9sY2xvc2UoaEZpbGUpOwogCSAgICByZXR1cm4gMDsKQEAgLTI2NCw3ICsyNjgsNyBAQAogewogICAgIE1FVEFIRUFERVIgKm1oID0gKE1FVEFIRUFERVIgKilHbG9iYWxMb2NrMTYoaG1mKTsKICAgICBNRVRBUkVDT1JEICptcjsKLSAgICBIQU5ETEVUQUJMRSAqaHQ7CisgICAgSEFORExFVEFCTEUxNiAqaHQ7CiAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgV09SRCBpOwogCkBAIC0yNzIsOCArMjc2LDggQEAKICAgICAKICAgICAvKiBjcmVhdGUgdGhlIGhhbmRsZSB0YWJsZSAqLwogICAgIGhIVCA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRXxHTUVNX1pFUk9JTklULAotCQkgICAgICBzaXplb2YoSEFORExFVEFCTEUpICogbWgtPm10Tm9PYmplY3RzKTsKLSAgICBodCA9IChIQU5ETEVUQUJMRSAqKUdsb2JhbExvY2sxNihoSFQpOworCQkgICAgICBzaXplb2YoSEFORExFVEFCTEUxNikgKiBtaC0+bXROb09iamVjdHMpOworICAgIGh0ID0gKEhBTkRMRVRBQkxFMTYgKilHbG9iYWxMb2NrMTYoaEhUKTsKIAogICAgIC8qIGxvb3AgdGhyb3VnaCBtZXRhZmlsZSBwbGF5aW5nIHJlY29yZHMgKi8KICAgICBvZmZzZXQgPSBtaC0+bXRIZWFkZXJTaXplICogMjsKQEAgLTMwMyw3ICszMDcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaWVscyBkZSBjYXJwZW50aWVyLCBhcHJpbCAxOTk2CiAgKi8KIAotQk9PTCBFbnVtTWV0YUZpbGUoSERDIGhkYywgSE1FVEFGSUxFIGhtZiwgTUZFTlVNUFJPQyBscEVudW1GdW5jLExQQVJBTSBscERhdGEpCitCT09MIEVudW1NZXRhRmlsZShIREMgaGRjLCBITUVUQUZJTEUgaG1mLCBNRkVOVU1QUk9DMTYgbHBFbnVtRnVuYyxMUEFSQU0gbHBEYXRhKQogewogICAgIE1FVEFIRUFERVIgKm1oID0gKE1FVEFIRUFERVIgKilHbG9iYWxMb2NrMTYoaG1mKTsKICAgICBNRVRBUkVDT1JEICptcjsKQEAgLTMxNiw3ICszMjAsNyBAQAogICAgIC8qIGNyZWF0ZSB0aGUgaGFuZGxlIHRhYmxlICovCiAgICAgCiAgICAgaEhUID0gR2xvYmFsQWxsb2MxNihHTUVNX01PVkVBQkxFIHwgR01FTV9aRVJPSU5JVCwKLQkJICAgICBzaXplb2YoSEFORExFVEFCTEUpICogbWgtPm10Tm9PYmplY3RzKTsKKwkJICAgICBzaXplb2YoSEFORExFVEFCTEUxNikgKiBtaC0+bXROb09iamVjdHMpOwogICAgIGh0ID0gV0lOMTZfR2xvYmFsTG9jazE2KGhIVCk7CiAgICAKICAgICBvZmZzZXQgPSBtaC0+bXRIZWFkZXJTaXplICogMjsKQEAgLTMyNiw5ICszMzAsOCBAQAogICAgIHdoaWxlIChvZmZzZXQgPCAobWgtPm10U2l6ZSAqIDIpKQogICAgIHsKIAltciA9IChNRVRBUkVDT1JEICopKChjaGFyICopbWggKyBvZmZzZXQpOwotICAgICAgICBpZiAoIUNhbGxFbnVtTWV0YWZpbGVQcm9jKCAoRkFSUFJPQzE2KWxwRW51bUZ1bmMsIGhkYywgaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfU0VHUFRSKG1yKSwgIC8qIEZJWE1FISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWgtPm10Tm9PYmplY3RzLCAoTE9ORylscERhdGEpKQorICAgICAgICBpZiAoIWxwRW51bUZ1bmMoIGhkYywgaHQsIE1BS0VfU0VHUFRSKG1yKSwgIC8qIEZJWE1FISEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBtaC0+bXROb09iamVjdHMsIChMT05HKWxwRGF0YSkpCiAJICAgIGJyZWFrOwogCiAJb2Zmc2V0ICs9IChtci0+cmRTaXplICogMik7CkBAIC0zNDAsMTIgKzM0Myw1MyBAQAogICAgIHJldHVybiBUUlVFOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBNRl9HZXRESUJpdHNQb2ludGVyICAgIFtpbnRlcm5hbCBoZWxwZXIgZm9yIGUuZy4gUGxheU1ldGFGaWxlUmVjb3JkXQorICoKKyAqIFJldHVybnMgb2Zmc2V0IHRvIERJQiBiaXRzIG9yIDAgaWYgZXJyb3IKKyAqIChwZXJoYXBzIHNob3VsZCBiZSBtb3ZlZCB0byAob2JqZWN0cy9kaWIuYyA/KQorICovCitzdGF0aWMgTFBTVFIgTUZfR2V0RElCaXRzUG9pbnRlcihMUEJJVE1BUElORk8gaW5mbykKK3sKKyAgICAgIGludCBvZmZzZXQ7CisgICAgICBpZiAoaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpCisJeworICAgICAgICBpZiAoaW5mby0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCkKKwkgIHsKKwkgIGlmIChpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkIDwgKDEgPDwgaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQpKQorCSAgICBvZmZzZXQgPSBpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkICogNDsKKyAgICAgICAgICBlbHNlCisJICAgIG9mZnNldCA9ICgxIDw8IGluZm8tPmJtaUhlYWRlci5iaUJpdENvdW50KSAqIDQ7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisJICBvZmZzZXQgPSAoMSA8PCBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCkgKiA0OworCX0KKyAgICAgIGVsc2UgaWYgKGluZm8tPmJtaUhlYWRlci5iaVNpemUgPT0gc2l6ZW9mKEJJVE1BUENPUkVIRUFERVIpKQorCXsKKwlpZiAoaW5mby0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCkKKwkgIHsKKwkgIGlmIChpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkIDwgKDEgPDwgaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQpKQorCSAgICBvZmZzZXQgPSBpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkICogMzsKKyAgICAgICAgICBlbHNlCisJICAgIG9mZnNldCA9ICgxIDw8IGluZm8tPmJtaUhlYWRlci5iaUJpdENvdW50KSAqIDM7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisJICBvZmZzZXQgPSAoMSA8PCBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCkgKiAzOworCX0KKyAgICAgIGVsc2UKKwl7CisJZnByaW50ZihzdGRlcnIsIlVua25vd24gc2l6ZSBmb3IgQklUTUFQSEVBREVSIGluIE1ldGFGaWxlIVxuIik7CisJcmV0dXJuIE5VTEw7CisJfQorICAgICAgcmV0dXJuIChMUFNUUilpbmZvICsgaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSArIG9mZnNldDsgCit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBQbGF5TWV0YUZpbGVSZWNvcmQgICAgICBHREkuMTc2CiAgKi8KIAotdm9pZCBQbGF5TWV0YUZpbGVSZWNvcmQoSERDIGhkYywgSEFORExFVEFCTEUgKmh0LCBNRVRBUkVDT1JEICptciwKK3ZvaWQgUGxheU1ldGFGaWxlUmVjb3JkKEhEQyBoZGMsIEhBTkRMRVRBQkxFMTYgKmh0LCBNRVRBUkVDT1JEICptciwKIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgbkhhbmRsZXMpCiB7CiAgICAgc2hvcnQgczE7CkBAIC02MDMsNzYgKzY0Nyw5MyBAQAogCWRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJQbGF5TWV0YUZpbGVSZWNvcmQ6IE1FVEFfRVNDQVBFIHVuaW1wbGVtZW50ZWQuXG4iKTsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIE1FVEFfRVhUVEVYVE9VVDogLyogRklYTUU6IGRvbid0IGtub3cgdGhlIGV4YWN0IHBhcmFtZXRlcnMgaGVyZSAqLwotICAgICAgICB7Ci0gICAgICAgIHNob3J0IHgseSxvcHRpb25zLHg1LHg2LHg3LHg4OwotICAgICAgICB5PW1yLT5yZFBhcmFtWzBdOyAgLyogWCBwb3NpdGlvbiAqLwotICAgICAgICB4PW1yLT5yZFBhcmFtWzFdOyAgLyogWSBwb3NpdGlvbiAqLwotICAgICAgICBzMT1tci0+cmRQYXJhbVsyXTsgLyogU3RyaW5nIGxlbmd0aCAqLwotICAgICAgICBvcHRpb25zPW1yLT5yZFBhcmFtWzNdOwotICAgICAgICB4NT1tci0+cmRQYXJhbVsoczErMSkvMis0XTsgLyogdW5rbm93biBtZWFuaW5nICovCi0gICAgICAgIHg2PW1yLT5yZFBhcmFtWyhzMSsxKS8yKzVdOyAvKiB1bmtub3duIG1lYW5pbmcgKi8KLSAgICAgICAgeDc9bXItPnJkUGFyYW1bKHMxKzEpLzIrNl07IC8qIHVua25vd24gbWVhbmluZyAqLwotICAgICAgICB4OD1tci0+cmRQYXJhbVsoczErMSkvMis3XTsgLyogdW5rbm93biBtZWFuaW5nICovCi0JRXh0VGV4dE91dDE2KCBoZGMsIHgsIHksIG9wdGlvbnMsIChMUFJFQ1QxNikgJm1yLT5yZFBhcmFtWyhzMSsxKS8yKzRdLAotICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKG1yLT5yZFBhcmFtICsgNCksIHMxLCBOVUxMICk7Ci0JLyogZnByaW50ZihzdGRlcnIsIkVYVFRFWFRPVVQgKGxlbjogJWQpICVoZCA6ICVoZCAlaGQgJWhkICVoZCBbJXNdLlxuIiwKLSAgICAgICAgICAgIChtci0+cmRTaXplLXMxKSxvcHRpb25zLHg1LHg2LHg3LHg4LChjaGFyKikgJihtci0+cmRQYXJhbVs0XSkgKTsqLwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAvKiBFbmQgbmV3IG1ldGFmaWxlIG9wZXJhdGlvbnMuICovCisgICAgICAgIC8qIC0tLSBCZWdpbiBvZiBmaXhlZCBvciBuZXcgbWV0YWZpbGUgb3BlcmF0aW9ucy4gSnVseSAxOTk2IC0tLS0qLworICAgIGNhc2UgTUVUQV9FWFRURVhUT1VUOgorICAgICAgeworICAgICAgICBMUElOVDE2IGR4eDsKKyAgICAgICAgczE9bXItPnJkUGFyYW1bMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RyaW5nIGxlbmd0aCAqLworICAgICAgICBpZiAobXItPnJkU2l6ZS0oczErMSkpCisgICAgICAgICBkeHg9Jm1yLT5yZFBhcmFtWzgrKHMxKzEpLzJdOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIGFycmF5ICovCisgICAgICAgIGVsc2UKKyAgICAgICAgIGR4eD1OVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk8gYXJyYXkgcHJlc2VudCAqLworICAgICAgICAgIAorCUV4dFRleHRPdXQxNiggaGRjLCBtci0+cmRQYXJhbVsxXSwgICAgICAgICAgICAgIC8qIFggcG9zaXRpb24gKi8KKwkgICAgICAgICAgICAgICAgICAgbXItPnJkUGFyYW1bMF0sICAgICAgICAgICAgICAvKiBZIHBvc2l0aW9uICovCisJICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtWzNdLCAgICAgICAgICAgICAgLyogb3B0aW9ucyAqLworCSAgICAgICAgICAgICAgICAgICAoTFBSRUNUMTYpICZtci0+cmRQYXJhbVs0XSwgIC8qIHJlY3RhbmdsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikobXItPnJkUGFyYW0gKyA4KSwgICAvKiBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxLCBkeHgpOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoLCBkeCBhcnJheSAqLworICAgICAgICBpZiAoZHh4KSAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiRVhUVEVYVE9VVCBsZW46ICVsZCAgKCVoZCAlaGQpICBbJXNdLlxuIiwKKyAgICAgICAgICAgIG1yLT5yZFNpemUsZHh4WzBdLGR4eFsxXSwoY2hhciopICYobXItPnJkUGFyYW1bOF0pICk7CisgICAgICAgfQorICAgICAgIGJyZWFrOwogICAgIAogICAgIGNhc2UgTUVUQV9TVFJFVENIRElCOgogICAgICAgewotICAgICAgTFBTVFIgYml0czsKLSAgICAgIExQQklUTUFQSU5GTyBpbmZvOwotICAgICAgaW50IG9mZnNldDsKLSAgICAgIGluZm8gPSAoTFBCSVRNQVBJTkZPKSAmKG1yLT5yZFBhcmFtWzExXSk7Ci0gICAgICBpZiAoaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpCi0JewotICAgICAgICBpZiAoaW5mby0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCkKLQkgIHsKLQkgIGlmIChpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkIDwgKDEgPDwgaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQpKQotCSAgICBvZmZzZXQgPSBpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkICogNDsKLSAgICAgICAgICBlbHNlCi0JICAgIG9mZnNldCA9ICgxIDw8IGluZm8tPmJtaUhlYWRlci5iaUJpdENvdW50KSAqIDQ7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlCi0JICBvZmZzZXQgPSAoMSA8PCBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCkgKiA0OwotCX0KLSAgICAgIGVsc2UgaWYgKGluZm8tPmJtaUhlYWRlci5iaVNpemUgPT0gc2l6ZW9mKEJJVE1BUENPUkVIRUFERVIpKQotCXsKLQlpZiAoaW5mby0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCkKLQkgIHsKLQkgIGlmIChpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkIDwgKDEgPDwgaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQpKQotCSAgICBvZmZzZXQgPSBpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkICogMzsKLSAgICAgICAgICBlbHNlCi0JICAgIG9mZnNldCA9ICgxIDw8IGluZm8tPmJtaUhlYWRlci5iaUJpdENvdW50KSAqIDM7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlCi0JICBvZmZzZXQgPSAoMSA8PCBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCkgKiAzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JZnByaW50ZihzdGRlcnIsIlVua25vd24gc2l6ZSBmb3IgQklUTUFQSEVBREVSIGluIFBsYXlNZXRhUmVjb3JkIVxuIik7Ci0JYnJlYWs7Ci0JfQotCQotICAgICAgb2Zmc2V0ICs9IGluZm8tPmJtaUhlYWRlci5iaVNpemU7IAotICAgICAgYml0cyA9IChMUFNUUikgaW5mbyArIG9mZnNldDsKLSAgICAgIFN0cmV0Y2hESUJpdHMoaGRjLG1yLT5yZFBhcmFtWzEwXSxtci0+cmRQYXJhbVs5XSxtci0+cmRQYXJhbVs4XSwKKyAgICAgICBMUEJJVE1BUElORk8gaW5mbyA9IChMUEJJVE1BUElORk8pICYobXItPnJkUGFyYW1bMTFdKTsKKyAgICAgICBMUFNUUiBiaXRzID0gTUZfR2V0RElCaXRzUG9pbnRlcihpbmZvKTsKKyAgICAgICBpZiAoYml0cykKKyAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsbXItPnJkUGFyYW1bMTBdLG1yLT5yZFBhcmFtWzldLG1yLT5yZFBhcmFtWzhdLAogCQkgICAgbXItPnJkUGFyYW1bN10sbXItPnJkUGFyYW1bNl0sbXItPnJkUGFyYW1bNV0sCiAJCSAgICBtci0+cmRQYXJhbVs0XSxtci0+cmRQYXJhbVszXSxiaXRzLGluZm8sCi0JCSAgICBtci0+cmRQYXJhbVsyXSwoRFdPUkQpbXItPnJkUGFyYW1bMF0pOworCQkgICAgbXItPnJkUGFyYW1bMl0sTUFLRUxPTkcobXItPnJkUGFyYW1bMF0sbXItPnJkUGFyYW1bMV0pKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwotCQkgICAgCisKKyAgICBjYXNlIE1FVEFfRElCU1RSRVRDSEJMVDoKKyAgICAgIHsKKyAgICAgICBMUEJJVE1BUElORk8gaW5mbyA9IChMUEJJVE1BUElORk8pICYobXItPnJkUGFyYW1bMTBdKTsgCisgICAgICAgTFBTVFIgYml0cyA9IE1GX0dldERJQml0c1BvaW50ZXIoaW5mbyk7CisgICAgICAgaWYgKGJpdHMpCisgICAgICAgICBTdHJldGNoRElCaXRzKGhkYyxtci0+cmRQYXJhbVs5XSxtci0+cmRQYXJhbVs4XSxtci0+cmRQYXJhbVs3XSwKKwkJICAgIG1yLT5yZFBhcmFtWzZdLG1yLT5yZFBhcmFtWzVdLG1yLT5yZFBhcmFtWzRdLAorCQkgICAgbXItPnJkUGFyYW1bM10sbXItPnJkUGFyYW1bMl0sYml0cyxpbmZvLAorCQkgICAgRElCX1JHQl9DT0xPUlMsTUFLRUxPTkcobXItPnJkUGFyYW1bMF0sbXItPnJkUGFyYW1bMV0pKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwkJICAKKworICAgIGNhc2UgTUVUQV9TVFJFVENIQkxUOgorICAgICAgeworICAgICAgIEhEQyBoZGNTcmM9Q3JlYXRlQ29tcGF0aWJsZURDKGhkYyk7CisgICAgICAgSEJJVE1BUDE2IGhiaXRtYXA9Q3JlYXRlQml0bWFwKG1yLT5yZFBhcmFtWzEwXSwgLypXaWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbVsxMV0sIC8qSGVpZ2h0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXItPnJkUGFyYW1bMTNdLCAvKlBsYW5lcyovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtWzE0XSwgLypCaXRzUGl4ZWwqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBTVFIpJm1yLT5yZFBhcmFtWzE1XSk7ICAvKmJpdHMqLworICAgICAgIFNlbGVjdE9iamVjdChoZGNTcmMsaGJpdG1hcCk7CisgICAgICAgU3RyZXRjaEJsdChoZGMsbXItPnJkUGFyYW1bOV0sbXItPnJkUGFyYW1bOF0sCisgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtWzddLG1yLT5yZFBhcmFtWzZdLAorCQkgICAgaGRjU3JjLG1yLT5yZFBhcmFtWzVdLG1yLT5yZFBhcmFtWzRdLAorCQkgICAgbXItPnJkUGFyYW1bM10sbXItPnJkUGFyYW1bMl0sCisJCSAgICBNQUtFTE9ORyhtci0+cmRQYXJhbVswXSxtci0+cmRQYXJhbVsxXSkpOworICAgICAgIERlbGV0ZURDKGhkY1NyYyk7CQkgICAgCisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTUVUQV9CSVRCTFQ6ICAgICAgICAgICAgLyogPC0tIG5vdCB5ZXQgZGVidWdnZWQgKi8KKyAgICAgIHsKKyAgICAgICBIREMgaGRjU3JjPUNyZWF0ZUNvbXBhdGlibGVEQyhoZGMpOworICAgICAgIEhCSVRNQVAxNiBoYml0bWFwPUNyZWF0ZUJpdG1hcChtci0+cmRQYXJhbVs3XS8qV2lkdGggKi8sbXItPnJkUGFyYW1bOF0vKkhlaWdodCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtWzEwXS8qUGxhbmVzKi8sbXItPnJkUGFyYW1bMTFdLypCaXRzUGl4ZWwqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBTVFIpJm1yLT5yZFBhcmFtWzEyXS8qYml0cyovKTsKKyAgICAgICBTZWxlY3RPYmplY3QoaGRjU3JjLGhiaXRtYXApOworICAgICAgIEJpdEJsdChoZGMsbXItPnJkUGFyYW1bNl0sbXItPnJkUGFyYW1bNV0sCisgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtWzRdLG1yLT5yZFBhcmFtWzNdLAorCQkgICAgaGRjU3JjLAorCQkgICAgbXItPnJkUGFyYW1bMl0sbXItPnJkUGFyYW1bMV0sCisJCSAgICBNQUtFTE9ORygwLG1yLT5yZFBhcmFtWzBdKSk7CisgICAgICAgRGVsZXRlREMoaGRjU3JjKTsJCSAgICAKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCiAgICAgZGVmYXVsdDoKIAlmcHJpbnRmKHN0ZGRlYiwiUGxheU1ldGFGaWxlUmVjb3JkOiBVbmtub3duIHJlY29yZCB0eXBlICV4XG4iLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXItPnJkRnVuY3Rpb24pOwogICAgIH0KIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIEdldE1ldGFGaWxlQml0cwkJYnkgV2lsbGlhbSBNYWdybywgMTkgU2VwIDE5OTUKICAqCkBAIC03NDQsNyArODA1LDcgQEAKICAqICAgIEFkZCBhIGhhbmRsZSB0byBhbiBleHRlcm5hbCBoYW5kbGUgdGFibGUgYW5kIHJldHVybiB0aGUgaW5kZXgKICAqLwogCi1pbnQgTUZfQWRkSGFuZGxlKEhBTkRMRVRBQkxFICpodCwgV09SRCBodGxlbiwgSEFORExFIGhvYmopCitpbnQgTUZfQWRkSGFuZGxlKEhBTkRMRVRBQkxFMTYgKmh0LCBXT1JEIGh0bGVuLCBIQU5ETEUgaG9iaikKIHsKICAgICBpbnQgaTsKIApAQCAtNzY5LDcgKzgzMCw3IEBACiBpbnQgTUZfQWRkSGFuZGxlSW50ZXJuYWwoSEFORExFIGhvYmopCiB7CiAgICAgaW50IGk7Ci0gICAgSEFORExFVEFCTEUgKmh0ID0gKEhBTkRMRVRBQkxFICopR2xvYmFsTG9jazE2KGhIVCk7CisgICAgSEFORExFVEFCTEUxNiAqaHQgPSAoSEFORExFVEFCTEUxNiAqKUdsb2JhbExvY2sxNihoSFQpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IEhUTGVuOyBpKyspCiAgICAgewpAQCAtNzg0LDcgKzg0NSw3IEBACiAgICAgaWYgKCEoaEhUID0gR2xvYmFsUmVBbGxvYzE2KGhIVCwgSFRJTkNSLCBHTUVNX01PVkVBQkxFIHwgR01FTV9aRVJPSU5JVCkpKQogCXJldHVybiAtMTsKICAgICBIVExlbiArPSBIVElOQ1I7Ci0gICAgaHQgPSAoSEFORExFVEFCTEUgKilHbG9iYWxMb2NrMTYoaEhUKTsKKyAgICBodCA9IChIQU5ETEVUQUJMRTE2ICopR2xvYmFsTG9jazE2KGhIVCk7CiAgICAgKihodC0+b2JqZWN0SGFuZGxlICsgaSkgPSBob2JqOwogICAgIEdsb2JhbFVubG9jazE2KGhIVCk7CiAgICAgcmV0dXJuIGk7CkBAIC0xMTU4LDYgKzEyMTksNDAgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIE1GX0V4dFRleHRPdXQKKyAqLworQk9PTCBNRl9FeHRUZXh0T3V0KERDICpkYywgc2hvcnQgeCwgc2hvcnQgeSwgVUlOVDE2IGZsYWdzLCBjb25zdCBSRUNUMTYgKnJlY3QsCisgICAgICAgICAgICAgICAgICAgTFBDU1RSIHN0ciwgc2hvcnQgY291bnQsIGNvbnN0IElOVDE2ICpscER4KQoreworICAgIEhNRVRBRklMRSBoYW5kbGU7CisgICAgRFdPUkQgbGVuOworICAgIEhBTkRMRSBobXI7CisgICAgTUVUQVJFQ09SRCAqbXI7CisKKyAgICBsZW4gPSBzaXplb2YoTUVUQVJFQ09SRCkgKyAoKChjb3VudCArIDEpID4+IDEpICogMikgKyA0ICsgc2l6ZW9mKFJFQ1QxNik7CisgICAgaWYgKGxwRHgpCisgICAgIGxlbis9Y291bnQqc2l6ZW9mKElOVDE2KTsKKyAgICBpZiAoIShobXIgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUsIGxlbikpKQorCXJldHVybiBGQUxTRTsKKyAgICBtciA9IChNRVRBUkVDT1JEICopR2xvYmFsTG9jazE2KGhtcik7CisgICAgbWVtc2V0KG1yLCAwLCBsZW4pOworCisgICAgbXItPnJkU2l6ZSA9IGxlbiAvIDI7CisgICAgbXItPnJkRnVuY3Rpb24gPSBNRVRBX0VYVFRFWFRPVVQ7CisgICAgKihtci0+cmRQYXJhbSkgPSB5OworICAgICoobXItPnJkUGFyYW0gKyAxKSA9IHg7CisgICAgKihtci0+cmRQYXJhbSArIDIpID0gY291bnQ7CisgICAgKihtci0+cmRQYXJhbSArIDMpID0gZmxhZ3M7CisgICAgbWVtY3B5KG1yLT5yZFBhcmFtICsgNCwgcmVjdCwgc2l6ZW9mKFJFQ1QxNikpOworICAgIG1lbWNweShtci0+cmRQYXJhbSArIDgsIHN0ciwgY291bnQpOworICAgIGlmIChscER4KQorICAgICBtZW1jcHkobXItPnJkUGFyYW0gKyA4KyAoKGNvdW50ICsgMSkgPj4gMSksbHBEeCxjb3VudCpzaXplb2YoSU5UMTYpKTsKKyAgICBoYW5kbGUgPSBNRl9Xcml0ZVJlY29yZChkYy0+dy5oTWV0YUZpbGUsIG1yLCBtci0+cmRTaXplICogMik7CisgICAgZGMtPncuaE1ldGFGaWxlID0gaGFuZGxlOworICAgIEdsb2JhbEZyZWUxNihobXIpOworICAgIHJldHVybiBoYW5kbGU7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgTUZfTWV0YVBvbHkgLSBpbXBsZW1lbnRzIFBvbHlnb24gYW5kIFBvbHlsaW5lCkBAIC0xMTkyLDE4ICsxMjg3LDEzMCBAQAogQk9PTCBNRl9CaXRCbHQoREMgKmRjRGVzdCwgc2hvcnQgeERlc3QsIHNob3J0IHlEZXN0LCBzaG9ydCB3aWR0aCwKIAkgICAgICAgc2hvcnQgaGVpZ2h0LCBIREMgaGRjU3JjLCBzaG9ydCB4U3JjLCBzaG9ydCB5U3JjLCBEV09SRCByb3ApCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJNRl9CaXRCbHQ6IG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwotICAgIHJldHVybiBGQUxTRTsKKyAgICBITUVUQUZJTEUgaGFuZGxlOworICAgIERXT1JEIGxlbjsKKyAgICBIQU5ETEUgaG1yOworICAgIE1FVEFSRUNPUkQgKm1yOworICAgIERDICpkY1NyYzsKKyAgICBCSVRNQVAxNiAgQk07CisKKyAgICBpZiAoIShkY1NyYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGNTcmMsIERDX01BR0lDICkpKSByZXR1cm4gMDsKKyAgICBHZXRPYmplY3QxNihkY1NyYy0+dy5oQml0bWFwLCBzaXplb2YoQklUTUFQMTYpLCAmQk0pOworICAgIGxlbiA9IHNpemVvZihNRVRBUkVDT1JEKSArIDEyICogc2l6ZW9mKElOVDE2KSArIEJNLmJtV2lkdGhCeXRlcyAqIEJNLmJtSGVpZ2h0OworICAgIGlmICghKGhtciA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwgbGVuKSkpCisJcmV0dXJuIEZBTFNFOworICAgIG1yID0gKE1FVEFSRUNPUkQgKilHbG9iYWxMb2NrMTYoaG1yKTsKKyAgICBtci0+cmRGdW5jdGlvbiA9IE1FVEFfQklUQkxUOworICAgICoobXItPnJkUGFyYW0gKyA3KSA9IEJNLmJtV2lkdGg7CisgICAgKihtci0+cmRQYXJhbSArIDgpID0gQk0uYm1IZWlnaHQ7CisgICAgKihtci0+cmRQYXJhbSArIDkpID0gQk0uYm1XaWR0aEJ5dGVzOworICAgICoobXItPnJkUGFyYW0gKzEwKSA9IEJNLmJtUGxhbmVzOworICAgICoobXItPnJkUGFyYW0gKzExKSA9IEJNLmJtQml0c1BpeGVsOworICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJNRl9TdHJldGNoQmx0LT5sZW4gPSAlbGQgIHJvcD0lbHggIFxuIixsZW4scm9wKTsKKyAgICBpZiAoR2V0Qml0bWFwQml0cyhkY1NyYy0+dy5oQml0bWFwLEJNLmJtV2lkdGhCeXRlcyAqIEJNLmJtSGVpZ2h0LG1yLT5yZFBhcmFtICsxMikpCisgICAgeworICAgICAgbXItPnJkU2l6ZSA9IGxlbiAvIHNpemVvZihJTlQxNik7CisgICAgICAqKG1yLT5yZFBhcmFtKSA9IEhJV09SRChyb3ApOworICAgICAgKihtci0+cmRQYXJhbSArIDEpID0geVNyYzsKKyAgICAgICoobXItPnJkUGFyYW0gKyAyKSA9IHhTcmM7CisgICAgICAqKG1yLT5yZFBhcmFtICsgMykgPSBoZWlnaHQ7CisgICAgICAqKG1yLT5yZFBhcmFtICsgNCkgPSB3aWR0aDsKKyAgICAgICoobXItPnJkUGFyYW0gKyA1KSA9IHlEZXN0OworICAgICAgKihtci0+cmRQYXJhbSArIDYpID0geERlc3Q7CisgICAgICBoYW5kbGUgPSBNRl9Xcml0ZVJlY29yZChkY0Rlc3QtPncuaE1ldGFGaWxlLCBtciwgbXItPnJkU2l6ZSAqIDIpOworICAgIH0gIAorICAgIGVsc2UKKyAgICAgIGhhbmRsZSA9IDA7ICAKKyAgICBkY0Rlc3QtPncuaE1ldGFGaWxlID0gaGFuZGxlOworICAgIEdsb2JhbEZyZWUxNihobXIpOworICAgIHJldHVybiBoYW5kbGU7CiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBNRl9TdHJldGNoQmx0CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBNRl9TdHJldGNoQmx0ICAgICAgICAgCisgKiB0aGlzIGZ1bmN0aW9uIGNvbnRhaW5zIFRXTyB3YXlzIGZvciBwcm9jZXNpbmcgU3RyZXRjaEJsdCBpbiBtZXRhZmlsZXMsCisgKiBkZWNpZGUgYmV0d2VlbiByZEZ1bmN0aW9uIHZhbHVlcyAgTUVUQV9TVFJFVENIQkxUIG9yIE1FVEFfRElCU1RSRVRDSEJMVAorICogdmlhICNkZWZpbmUgU1RSRVRDSF9WSUFfRElCCiAgKi8KKyNkZWZpbmUgU1RSRVRDSF9WSUFfRElCCisjdW5kZWYgIFNUUkVUQ0hfVklBX0RJQgogQk9PTCBNRl9TdHJldGNoQmx0KERDICpkY0Rlc3QsIHNob3J0IHhEZXN0LCBzaG9ydCB5RGVzdCwgc2hvcnQgd2lkdGhEZXN0LAogCQkgICBzaG9ydCBoZWlnaHREZXN0LCBIREMgaGRjU3JjLCBzaG9ydCB4U3JjLCBzaG9ydCB5U3JjLCAKIAkJICAgc2hvcnQgd2lkdGhTcmMsIHNob3J0IGhlaWdodFNyYywgRFdPUkQgcm9wKQogewotICAgIGZwcmludGYoc3RkbmltcCwiTUZfU3RyZXRjaEJsdDogbm90IGltcGxlbWVudGVkIHlldFxuIik7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIEhNRVRBRklMRSBoYW5kbGU7CisgICAgRFdPUkQgbGVuOworICAgIEhBTkRMRSBobXI7CisgICAgTUVUQVJFQ09SRCAqbXI7CisgICAgREMgKmRjU3JjOworICAgIEJJVE1BUDE2ICBCTTsKKyNpZmRlZiBTVFJFVENIX1ZJQV9ESUIgICAgCisgICAgTFBCSVRNQVBJTkZPSEVBREVSIGxwQk1JOworICAgIFdPUkQgbkJQUDsKKyNlbmRpZiAgCisgICAgaWYgKCEoZGNTcmMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjU3JjLCBEQ19NQUdJQyApKSkgcmV0dXJuIDA7CisgICAgR2V0T2JqZWN0MTYoZGNTcmMtPncuaEJpdG1hcCwgc2l6ZW9mKEJJVE1BUDE2KSwgJkJNKTsKKyNpZmRlZiBTVFJFVENIX1ZJQV9ESUIKKyAgICBuQlBQID0gQk0uYm1QbGFuZXMgKiBCTS5ibUJpdHNQaXhlbDsKKyAgICBsZW4gPSBzaXplb2YoTUVUQVJFQ09SRCkgKyAxMCAqIHNpemVvZihJTlQxNikgCisgICAgICAgICAgICArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArIChuQlBQICE9IDI0ID8gMSA8PCBuQlBQOiAwKSAqIHNpemVvZihSR0JRVUFEKSAKKyAgICAgICAgICAgICAgKyAoKEJNLmJtV2lkdGggKiBuQlBQICsgMzEpIC8gMzIpICogNCAqIEJNLmJtSGVpZ2h0OworICAgIGlmICghKGhtciA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwgbGVuKSkpCisJcmV0dXJuIEZBTFNFOworICAgIG1yID0gKE1FVEFSRUNPUkQgKilHbG9iYWxMb2NrMTYoaG1yKTsKKyAgICBtci0+cmRGdW5jdGlvbiA9IE1FVEFfRElCU1RSRVRDSEJMVDsKKyAgICBscEJNST0oTFBCSVRNQVBJTkZPSEVBREVSKShtci0+cmRQYXJhbSsxMCk7CisgICAgbHBCTUktPmJpU2l6ZSAgICAgID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICAgIGxwQk1JLT5iaVdpZHRoICAgICA9IEJNLmJtV2lkdGg7CisgICAgbHBCTUktPmJpSGVpZ2h0ICAgID0gQk0uYm1IZWlnaHQ7CisgICAgbHBCTUktPmJpUGxhbmVzICAgID0gMTsKKyAgICBscEJNSS0+YmlCaXRDb3VudCAgPSBuQlBQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEsNCw4IG9yIDI0ICovCisgICAgbHBCTUktPmJpQ2xyVXNlZCAgID0gbkJQUCAhPSAyNCA/IDEgPDwgbkJQUCA6IDA7CisgICAgbHBCTUktPmJpU2l6ZUltYWdlID0gKChscEJNSS0+YmlXaWR0aCAqIG5CUFAgKyAzMSkgLyAzMikgKiA0ICogbHBCTUktPmJpSGVpZ2h0OworICAgIGxwQk1JLT5iaUNvbXByZXNzaW9uID0gQklfUkdCOworICAgIGxwQk1JLT5iaVhQZWxzUGVyTWV0ZXIgPSBNdWxEaXYzMihHZXREZXZpY2VDYXBzKGhkY1NyYyxMT0dQSVhFTFNYKSwzOTM3LDEwMCk7CisgICAgbHBCTUktPmJpWVBlbHNQZXJNZXRlciA9IE11bERpdjMyKEdldERldmljZUNhcHMoaGRjU3JjLExPR1BJWEVMU1kpLDM5MzcsMTAwKTsKKyAgICBscEJNSS0+YmlDbHJJbXBvcnRhbnQgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgbWV0ZXIgID0gMzkuMzcgaW5jaCAqLworCisgICAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIk1GX1N0cmV0Y2hCbHRWaWFESUItPmxlbiA9ICVsZCAgcm9wPSVseCAgUGl4WVBNPSVsZCBDYXBzPSVkXG4iLAorICAgICAgICAgICAgICAgbGVuLHJvcCxscEJNSS0+YmlZUGVsc1Blck1ldGVyLEdldERldmljZUNhcHMoaGRjU3JjLExPR1BJWEVMU1kpKTsKKyAgICBpZiAoR2V0RElCaXRzKGhkY1NyYyxkY1NyYy0+dy5oQml0bWFwLDAsKFVJTlQpbHBCTUktPmJpSGVpZ2h0LAorICAgICAgICAgICAgICBNRl9HZXRESUJpdHNQb2ludGVyKChMUEJJVE1BUElORk8pbHBCTUkpLCAgICAvKiBESUIgYml0cyAqLworICAgICAgICAgICAgICAoTFBCSVRNQVBJTkZPKWxwQk1JLERJQl9SR0JfQ09MT1JTKSkgICAgICAgICAvKiBESUIgaW5mbyBzdHJ1Y3R1cmUgKi8gCisjZWxzZQorICAgIGxlbiA9IHNpemVvZihNRVRBUkVDT1JEKSArIDE1ICogc2l6ZW9mKElOVDE2KSArIEJNLmJtV2lkdGhCeXRlcyAqIEJNLmJtSGVpZ2h0OworICAgIGlmICghKGhtciA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwgbGVuKSkpCisJcmV0dXJuIEZBTFNFOworICAgIG1yID0gKE1FVEFSRUNPUkQgKilHbG9iYWxMb2NrMTYoaG1yKTsKKyAgICBtci0+cmRGdW5jdGlvbiA9IE1FVEFfU1RSRVRDSEJMVDsKKyAgICAqKG1yLT5yZFBhcmFtICsxMCkgPSBCTS5ibVdpZHRoOworICAgICoobXItPnJkUGFyYW0gKzExKSA9IEJNLmJtSGVpZ2h0OworICAgICoobXItPnJkUGFyYW0gKzEyKSA9IEJNLmJtV2lkdGhCeXRlczsKKyAgICAqKG1yLT5yZFBhcmFtICsxMykgPSBCTS5ibVBsYW5lczsKKyAgICAqKG1yLT5yZFBhcmFtICsxNCkgPSBCTS5ibUJpdHNQaXhlbDsKKyAgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiTUZfU3RyZXRjaEJsdC0+bGVuID0gJWxkICByb3A9JWx4ICBcbiIsbGVuLHJvcCk7CisgICAgaWYgKEdldEJpdG1hcEJpdHMoZGNTcmMtPncuaEJpdG1hcCxCTS5ibVdpZHRoQnl0ZXMgKiBCTS5ibUhlaWdodCxtci0+cmRQYXJhbSArMTUpKQorI2VuZGlmICAgIAorICAgIHsKKyAgICAgIG1yLT5yZFNpemUgPSBsZW4gLyBzaXplb2YoSU5UMTYpOworICAgICAgKihtci0+cmRQYXJhbSkgPSBMT1dPUkQocm9wKTsKKyAgICAgICoobXItPnJkUGFyYW0gKyAxKSA9IEhJV09SRChyb3ApOworICAgICAgKihtci0+cmRQYXJhbSArIDIpID0gaGVpZ2h0U3JjOworICAgICAgKihtci0+cmRQYXJhbSArIDMpID0gd2lkdGhTcmM7CisgICAgICAqKG1yLT5yZFBhcmFtICsgNCkgPSB5U3JjOworICAgICAgKihtci0+cmRQYXJhbSArIDUpID0geFNyYzsKKyAgICAgICoobXItPnJkUGFyYW0gKyA2KSA9IGhlaWdodERlc3Q7CisgICAgICAqKG1yLT5yZFBhcmFtICsgNykgPSB3aWR0aERlc3Q7CisgICAgICAqKG1yLT5yZFBhcmFtICsgOCkgPSB5RGVzdDsKKyAgICAgICoobXItPnJkUGFyYW0gKyA5KSA9IHhEZXN0OworICAgICAgaGFuZGxlID0gTUZfV3JpdGVSZWNvcmQoZGNEZXN0LT53LmhNZXRhRmlsZSwgbXIsIG1yLT5yZFNpemUgKiAyKTsKKyAgICB9ICAKKyAgICBlbHNlCisgICAgICBoYW5kbGUgPSAwOyAgCisgICAgZGNEZXN0LT53LmhNZXRhRmlsZSA9IGhhbmRsZTsKKyAgICBHbG9iYWxGcmVlMTYoaG1yKTsKKyAgICByZXR1cm4gaGFuZGxlOwogfQorCisKZGlmZiAtLWdpdCBhL29iamVjdHMvcGFsZXR0ZS5jIGIvb2JqZWN0cy9wYWxldHRlLmMKaW5kZXggODU0MzIyYS4uYWI4ZjI1YiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9wYWxldHRlLmMKKysrIGIvb2JqZWN0cy9wYWxldHRlLmMKQEAgLTE1LDggKzE1LDYgQEAKIC8qICNkZWZpbmUgREVCVUdfUEFMRVRURSAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKLWV4dGVybiBIV05EIAkJRENFX2hEQzJoV25kKCBIREMgKTsJCQkvKiBnZXQgYXNzb2NpYXRlZCB3aW5kb3cgYnkgCi0JCQkJCQkJCSAqIHdhbGtpbmcgRENFIGxpc3QgKi8KIGV4dGVybiBpbnQgICAgICAgICAgICAgIENPTE9SX0xvb2t1cFN5c3RlbVBpeGVsKENPTE9SUkVGKTsgICAgICAvKiBsb29rdXAgcGl4ZWwgYW1vbmcgc3RhdGljIGVudHJpZXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHN5c3RlbSBwYWxldHRlICovCiBleHRlcm4gQ09MT1JSRUYJCUNPTE9SX0dldFN5c3RlbVBhbGV0dGVFbnRyeShCWVRFKTsKQEAgLTM4OSw3ICszODcsNyBAQAogCiAgICAgaWYoIGhQYWwgIT0gU1RPQ0tfREVGQVVMVF9QQUxFVFRFICkKICAgICB7Ci0JSFdORCBoV25kID0gRENFX2hEQzJoV25kKCBoREMgKTsKKwlIV05EIGhXbmQgPSBXaW5kb3dGcm9tREMoIGhEQyApOwogCUhXTkQgaEFjdGl2ZSA9IEdldEFjdGl2ZVdpbmRvdygpOwogCQogCS8qIHNldCBwcmltYXJ5IHBhbGV0dGUgaWYgaXQncyByZWxhdGVkIHRvIGN1cnJlbnQgYWN0aXZlICovCkBAIC00MTcsNyArNDE1LDcgQEAKIAkvKiBTZW5kIHBhbGV0dGUgY2hhbmdlIG5vdGlmaWNhdGlvbiAqLwogCiAJSFdORCBoV25kOwotIAlpZiggKGhXbmQgPSBEQ0VfaERDMmhXbmQoIGhEQyApKSApCisgCWlmKCAoaFduZCA9IFdpbmRvd0Zyb21EQyggaERDICkpICkKICAgICAgICAgICAgIFNlbmRNZXNzYWdlMTYoIEhXTkRfQlJPQURDQVNULCBXTV9QQUxFVFRFQ0hBTkdFRCwgaFduZCwgMEwpOwogICAgIH0KICAgICByZXR1cm4gcmVhbGl6ZWQ7CkBAIC00MzAsNyArNDI4LDcgQEAKICAqLwogaW50IFVwZGF0ZUNvbG9ycyggSERDIGhEQyApCiB7Ci0gICAgSFdORCBoV25kID0gRENFX2hEQzJoV25kKCBoREMgKTsKKyAgICBIV05EIGhXbmQgPSBXaW5kb3dGcm9tREMoIGhEQyApOwogCiAgICAgLyogRG9jcyBzYXkgdGhhdCB3ZSBoYXZlIHRvIHJlbWFwIGN1cnJlbnQgZHJhd2FibGUgcGl4ZWwgYnkgcGl4ZWwKICAgICAgKiBidXQgaXQgd291bGQgdGFrZSBmb3JldmVyIGdpdmVuIHRoZSBzcGVlZCBvZiBYR2V0L1B1dFBpeGVsLgpkaWZmIC0tZ2l0IGEvb2JqZWN0cy90ZXh0LmMgYi9vYmplY3RzL3RleHQuYwppbmRleCA1Yzg5MmQ4Li5iYmZiNmQ1IDEwMDY0NAotLS0gYS9vYmplY3RzL3RleHQuYworKysgYi9vYmplY3RzL3RleHQuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiAgICAgewogCWRjID0gKERDICopR0RJX0dldE9ialB0ciggaGRjLCBNRVRBRklMRV9EQ19NQUdJQyApOwogCWlmICghZGMpIHJldHVybiBGQUxTRTsKLQlNRl9UZXh0T3V0KCBkYywgeCwgeSwgc3RyLCBjb3VudCApOworCU1GX0V4dFRleHRPdXQoIGRjLCB4LCB5LCBmbGFncywgbHByZWN0LCBzdHIsIGNvdW50LCBscER4ICk7CiAJcmV0dXJuIFRSVUU7CiAgICAgfQogCkBAIC02MTYsMTYgKzYxNiwxNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUdyYXlTdHJpbmcgKFVTRVIuMTg1KQorICogICAgICAgICAgIEdyYXlTdHJpbmcgICAoVVNFUi4xODUpCiAgKi8KLUJPT0wgR3JheVN0cmluZyhIREMgaGRjLCBIQlJVU0ggaGJyLCBGQVJQUk9DMTYgZ3NwcmMsIExQQVJBTSBsUGFyYW0sIAorQk9PTCBHcmF5U3RyaW5nKEhEQyBoZGMsIEhCUlVTSCBoYnIsIEdSQVlTVFJJTkdQUk9DMTYgZ3NwcmMsIExQQVJBTSBsUGFyYW0sIAogCQlJTlQgY2NoLCBJTlQgeCwgSU5UIHksIElOVCBjeCwgSU5UIGN5KQogewogICAgIEJPT0wgcmV0OwogICAgIENPTE9SUkVGIGN1cnJlbnRfY29sb3I7CiAKICAgICBpZiAoIWNjaCkgY2NoID0gbHN0cmxlbjE2KCAoTFBDU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkgKTsKLSAgICBpZiAoZ3NwcmMpIHJldHVybiBDYWxsR3JheVN0cmluZ1Byb2MoIGdzcHJjLCBoZGMsIGxQYXJhbSwgY2NoICk7CisgICAgaWYgKGdzcHJjKSByZXR1cm4gZ3NwcmMoIGhkYywgbFBhcmFtLCBjY2ggKTsKICAgICBjdXJyZW50X2NvbG9yID0gR2V0VGV4dENvbG9yKCBoZGMgKTsKICAgICBTZXRUZXh0Q29sb3IoIGhkYywgR2V0U3lzQ29sb3IoQ09MT1JfR1JBWVRFWFQpICk7CiAgICAgcmV0ID0gVGV4dE91dDE2KCBoZGMsIHgsIHksIChMUENTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSwgY2NoICk7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL0NoYW5nZUxvZyBiL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCmluZGV4IDkzNDVmZDcuLmQyNGMyOWEgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsOCBAQAorTW9uIEp1bCAyMiAyMDozMDoxMSAxOTk2ICBKdXNzaSBUaXJra29uZW4gPGp0QG1vZGVlbWkuY3MudHV0LmZpPgorCisJKiBbRmkucmNdIChuZXcpCisJQWRkZWQgRmlubmlzaCBsYW5ndWFnZSBzdXBwb3J0LgorCiBTdW4gSnVuICAyIDEzOjE0OjU1IDE5OTYgIFVscmljaCBTY2htaWQgIDx1c2NobWlkQG1haWwuaGgucHJvdmkuZGU+CiAKIAkqIFByb2dyYW0gaWNvbnM6IHJlcGFpbnQgb24gV01fTkNQQUlOVCBvciBXTV9QQUlOVElDT04KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3Byb2dtYW4vRmkucmMgYi9wcm9ncmFtcy9wcm9nbWFuL0ZpLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODM3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9wcm9nbWFuL0ZpLnJjCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogUHJvZ3JhbSBNYW5hZ2VyCisgKgorICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAorICogRmlubmlzaCBsYW5ndWFnZSBieSBKdXNzaSBUaXJra29uZW4gPGp0QG1vZGVlbWkuY3MudHV0LmZpPgorICovCisKKyNkZWZpbmUgTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgICBGaQorI2RlZmluZSBMQU5HVUFHRV9OVU1CRVIgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTEFOR1VBR0VfTUVOVV9JVEVNICAgICAgICAgICAiJlN1b21pIgorCisvKiBNZW51ICovCisKKyNkZWZpbmUgTUVOVV9GSUxFICAgICAgICAgICAgICAgICAgICAiJlRpZWRvc3RvIgorI2RlZmluZSBNRU5VX0ZJTEVfTkVXICAgICAgICAgICAgICAgICImVXVzaS4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX09QRU4gICAgICAgICAgICAgICAiJkF2YWFcdEVudGVyIgorI2RlZmluZSBNRU5VX0ZJTEVfTU9WRSAgICAgICAgICAgICAgICImU2lpcnLkLi4uXHRGNyIKKyNkZWZpbmUgTUVOVV9GSUxFX0NPUFkgICAgICAgICAgICAgICAiJktvcGlvaS4uLlx0RjgiCisjZGVmaW5lIE1FTlVfRklMRV9ERUxFVEUgICAgICAgICAgICAgIiZQb2lzdGFcdERlbCIKKyNkZWZpbmUgTUVOVV9GSUxFX0FUVFJJQlVURVMgICAgICAgICAiJk9taW5haXN1dWRldC4uLlx0QWx0K0VudGVyIgorI2RlZmluZSBNRU5VX0ZJTEVfRVhFQ1VURSAgICAgICAgICAgICJTdW8mcml0YS4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX0VYSVQgICAgICAgICAgICAgICAiJkxvcGV0YS4uLiIKKworI2RlZmluZSBNRU5VX09QVElPTlMgICAgICAgICAgICAgICAgICImQXNldHVrc2V0IgorI2RlZmluZSBNRU5VX09QVElPTlNfQVVUT19BUlJBTkdFICAgICImSuRyamVzdOQgYXV0b21hYXR0aXNlc3RpIgorI2RlZmluZSBNRU5VX09QVElPTlNfTUlOX09OX1JVTiAgICAgICImUGllbmVubuQga+R5dGV0dORlc3PkIgorI2RlZmluZSBNRU5VX09QVElPTlNfU0FWRV9TRVRUSU5HUyAgICImVGFsbGVubmEgYXNldHVrc2V0IGxvcGV0ZXR0YWVzc2EiCisKKyNkZWZpbmUgTUVOVV9XSU5ET1dTICAgICAgICAgICAgICAgICAiJklra3VuYSIKKyNkZWZpbmUgTUVOVV9XSU5ET1dTX09WRVJMQVAgICAgICAgICAiJkxpbWl0dORpblx0VmFpaHRvK0Y1IgorI2RlZmluZSBNRU5VX1dJTkRPV1NfU0lERV9CWV9TSURFICAgICImVmllcmVra+Rpblx0VmFpaHRvK0Y0IgorI2RlZmluZSBNRU5VX1dJTkRPV1NfQVJSQU5HRSAgICAgICAgICImSuRyamVzdOQga3V2YWtrZWV0IgorCisjZGVmaW5lIE1FTlVfTEFOR1VBR0UgICAgICAgICAgICAgICAgIiZLaWVsaSIKKworI2RlZmluZSBNRU5VX0hFTFAgICAgICAgICAgICAgICAgICAgICImT2hqZSIKKyNkZWZpbmUgTUVOVV9IRUxQX0NPTlRFTlRTICAgICAgICAgICAiJlNpc+RsbHlzIgorI2RlZmluZSBNRU5VX0hFTFBfU0VBUkNIICAgICAgICAgICAgICImRXRzaSBvaGplIGFpaGVlc3RhLi4uIgorI2RlZmluZSBNRU5VX0hFTFBfSEVMUF9PTl9IRUxQICAgICAgICImT2hqZWVuIGvkeXR09iIKKyNkZWZpbmUgTUVOVV9IRUxQX1RVVE9SSUFMICAgICAgICAgICAiTyZwZXR1c29oamVsbWEiCisKKyNkZWZpbmUgTUVOVV9JTkZPICAgICAgICAgICAgICAgICAgICAiVGkmZXRvamEuLi4iCisjZGVmaW5lIE1FTlVfSU5GT19MSUNFTlNFICAgICAgICAgICAgIiZMaXNlbnNzaSIKKyNkZWZpbmUgTUVOVV9JTkZPX05PX1dBUlJBTlRZICAgICAgICAiJk9NQUxMQSBWQVNUVVVMTEEiCisjZGVmaW5lIE1FTlVfSU5GT19BQk9VVF9XSU5FICAgICAgICAgIiZUaWV0b2phIFdJTkVzdOQiCisKKy8qIERpYWxvZ3MgKi8KKworI2RlZmluZSBESUFMT0dfT0sgICAgICAgICAgICAgICAgICAgICJPSyIKKyNkZWZpbmUgRElBTE9HX0NBTkNFTCAgICAgICAgICAgICAgICAiUGVydXV0YSIKKyNkZWZpbmUgRElBTE9HX0JST1dTRSAgICAgICAgICAgICAgICAiJlNlbGFhIgorI2RlZmluZSBESUFMT0dfSEVMUCAgICAgICAgICAgICAgICAgICImT2hqZSIKKworI2RlZmluZSBESUFMT0dfTkVXX0NBUFRJT04gICAgICAgICAgICJVdXNpIGlsbWVudHlt5CIKKyNkZWZpbmUgRElBTE9HX05FV19ORVcgICAgICAgICAgICAgICAiVXVzaSIKKyNkZWZpbmUgRElBTE9HX05FV19HUk9VUCAgICAgICAgICAgICAiT2hqZWxtYSZyeWht5CIKKyNkZWZpbmUgRElBTE9HX05FV19QUk9HUkFNICAgICAgICAgICAiT2hqZWxtYSYiCisKKyNkZWZpbmUgRElBTE9HX01PVkVfQ0FQVElPTiAgICAgICAgICAiU2lpcnLkIgorI2RlZmluZSBESUFMT0dfTU9WRV9QUk9HUkFNICAgICAgICAgICJTaWlycuQgb2hqZWxtYToiCisjZGVmaW5lIERJQUxPR19NT1ZFX0ZST01fR1JPVVAgICAgICAgIlJ5aG3kc3TkOiIKKyNkZWZpbmUgRElBTE9HX01PVkVfVE9fR1JPVVAgICAgICAgICAiJlJ5aG3k5G46IgorCisjZGVmaW5lIERJQUxPR19DT1BZX0NBUFRJT04gICAgICAgICAgIktvcGlvaSIKKyNkZWZpbmUgRElBTE9HX0NPUFlfUFJPR1JBTSAgICAgICAgICAiS29waW9pIG9oamVsbWE6IgorI2RlZmluZSBESUFMT0dfQ09QWV9GUk9NX0dST1VQICAgICAgIERJQUxPR19NT1ZFX0ZST01fR1JPVVAKKyNkZWZpbmUgRElBTE9HX0NPUFlfVE9fR1JPVVAgICAgICAgICBESUFMT0dfTU9WRV9UT19HUk9VUAorCisjZGVmaW5lIERJQUxPR19HUk9VUF9DQVBUSU9OICAgICAgICAgIk9oamVsbWFyeWht5G4gb21pbmFpc3V1ZGV0IgorI2RlZmluZSBESUFMT0dfR1JPVVBfREVTQ1JJUFRJT04gICAgICImS3V2YXVzOiIKKyNkZWZpbmUgRElBTE9HX0dST1VQX0ZJTEUgICAgICAgICAgICAiJlJ5aG3kdGllZG9zdG86IgorCisjZGVmaW5lIERJQUxPR19QUk9HUkFNX0NBUFRJT04gICAgICAgIk9oamVsbWFuIG9taW5haXN1dWRldCIKKyNkZWZpbmUgRElBTE9HX1BST0dSQU1fREVTQ1JJUFRJT04gICBESUFMT0dfR1JPVVBfREVTQ1JJUFRJT04KKyNkZWZpbmUgRElBTE9HX1BST0dSQU1fQ09NTUFORF9MSU5FICAiSyZvbWVudG9yaXZpOiIKKyNkZWZpbmUgRElBTE9HX1BST0dSQU1fRElSRUNUT1JZICAgICAiJlR59mhha2VtaXN0bzoiCisjZGVmaW5lIERJQUxPR19QUk9HUkFNX0hPVF9LRVkgICAgICAgIiZQaWthbuRwcORpbjoiCisjZGVmaW5lIERJQUxPR19QUk9HUkFNX1NZTUJPTCAgICAgICAgIlN1byZyaXRhIGt1dmFra2VlbmEiCisjZGVmaW5lIERJQUxPR19QUk9HUkFNX09USEVSX1NZTUJPTCAgIiZWYWloZGEga3V2YWtldHRhLi4uIgorCisjZGVmaW5lIERJQUxPR19TWU1CT0xfQ0FQVElPTiAgICAgICAgIlZhbGl0c2Uga3V2YWtlIgorI2RlZmluZSBESUFMT0dfU1lNQk9MX0ZJTEUgICAgICAgICAgICImTmltaToiCisjZGVmaW5lIERJQUxPR19TWU1CT0xfQ1VSUkVOVCAgICAgICAgIk55a3lpbmVuICZrdXZha2U6IgorCisjZGVmaW5lIERJQUxPR19FWEVDVVRFX0NBUFRJT04gICAgICAgIlN1b3JpdGEgb2hqZWxtYSIKKyNkZWZpbmUgRElBTE9HX0VYRUNVVEVfQ09NTUFORF9MSU5FICBESUFMT0dfUFJPR1JBTV9DT01NQU5EX0xJTkUKKyNkZWZpbmUgRElBTE9HX0VYRUNVVEVfU1lNQk9MICAgICAgICBESUFMT0dfUFJPR1JBTV9TWU1CT0wKKworLyogU3RyaW5ncyAqLworCisjZGVmaW5lIFNUUklOR19QUk9HUkFNX01BTkFHRVIgICAgICAgICAgICAiSuRyamVzdGVt5G5oYWxsaW50YSIKKyNkZWZpbmUgU1RSSU5HX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICJWSVJIRSIKKyNkZWZpbmUgU1RSSU5HX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICJWQVJPSVRVUyIKKyNkZWZpbmUgU1RSSU5HX0lORk8gICAgICAgICAgICAgICAgICAgICAgICJUaWV0b2phIgorI2RlZmluZSBTVFJJTkdfREVMRVRFICAgICAgICAgICAgICAgICAgICAgIlBvaXN0YSIKKyNkZWZpbmUgU1RSSU5HX0RFTEVURV9HUk9VUF9zICAgICAgICAgICAgICJQb2lzdGEgcnlobeQgYCVzJyA/IgorI2RlZmluZSBTVFJJTkdfREVMRVRFX1BST0dSQU1fcyAgICAgICAgICAgIlBvaXN0YSBvaGplbG1hIGAlcycgPyIKKyNkZWZpbmUgU1RSSU5HX05PVF9JTVBMRU1FTlRFRCAgICAgICAgICAgICJFaSBr5Hl0ZXR05HZpc3PkIgorI2RlZmluZSBTVFJJTkdfRklMRV9SRUFEX0VSUk9SX3MgICAgICAgICAgIlZpcmhlIGx1ZXR0YWVzc2EgYCVzJyIKKyNkZWZpbmUgU1RSSU5HX0ZJTEVfV1JJVEVfRVJST1JfcyAgICAgICAgICJWaXJoZSBraXJqb2l0ZXR0YWVzc2EgYCVzJyIKKworI2RlZmluZSBTVFJJTkdfR1JQRklMRV9SRUFEX0VSUk9SX3MgICAgICAgIlwKK1J5aG3kdGllZG9zdG9hIGAlcycgZWkgdm9pZGEgYXZhdGEuXG5cCitZcml0ZXTk5G5r9iB1dWRlc3RhYW4/IgorCisjZGVmaW5lIFNUUklOR19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAiTXVpc3RpIGxvcHVzc2EiCisjZGVmaW5lIFNUUklOR19XSU5IRUxQX0VSUk9SICAgICAgICAgICAgICAiT2hqZSBlaSBr5Hl0ZXR05HZpc3PkIgorI2RlZmluZSBTVFJJTkdfVU5LTk9XTl9GRUFUVVJFX3MgICAgICAgICAgIlR1bnRlbWF0b24gb21pbmFpc3V1cyAlczpzc2EiCisjZGVmaW5lIFNUUklOR19GSUxFX05PVF9PVkVSV1JJVFRFTl9zICAgICAiVGllZG9zdG8gYCVzJyBvbiBvbGVtYXNzYS4gVGllZG9zdG9hIGVpIG11dXRldHR1LiIKKyNkZWZpbmUgU1RSSU5HX1NBVkVfR1JPVVBfQVNfcyAgICAgICAgICAgICJUYWxsZW5uYSByeWht5CBuaW1lbGzkIGAlcycgYWxrdXBlcuRpc3RlbiB0aWVkb3N0b2plbiBz5GlseXR05G1pc2Vrc2kiCisKKyNkZWZpbmUgU1RSSU5HX05PX0hPVF9LRVkgICAgICAgICAgICAgICAgICJFaSBtaXTk5G4iCisKKyNkZWZpbmUgU1RSSU5HX0FMTF9GSUxFUyAgICAgICAgICAgICAgICAgICJLYWlra2kgdGllZG9zdG90ICgqLiopIgorI2RlZmluZSBTVFJJTkdfUFJPR1JBTVMgICAgICAgICAgICAgICAgICAgIk9oamVsbWF0IgorI2RlZmluZSBTVFJJTkdfTElCUkFSSUVTX0RMTCAgICAgICAgICAgICAgIktpcmphc3RvdCAoKi5kbGwpIgorI2RlZmluZSBTVFJJTkdfU1lNQk9MX0ZJTEVTICAgICAgICAgICAgICAgIlN5bWJvbGl0aWVkb3N0b3QiCisjZGVmaW5lIFNUUklOR19TWU1CT0xTX0lDTyAgICAgICAgICAgICAgICAiS3V2YWtrZWV0ICgqLmljbykiCisKKyNpbmNsdWRlICJYeC5yYyIKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCmluZGV4IDhkYjY1ZDIuLjYzZGE2NzAgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgpAQCAtMyw3ICszLDcgQEAKIFBST0dSQU1TID0gcHJvZ21hbgogQUxMX0xJQlMgPSAkKFdJTkVMSUIpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMRExJQlMpCiAKLUxBTkdVQUdFUyAgID0gRW4gRGUgRnIKK0xBTkdVQUdFUyAgID0gRW4gRGUgRnIgRmkKIExJQ0VOU0VMQU5HID0gRW4KIAogIyBJbnN0YWxsYXRpb24gaW5mb3MKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3Byb2dtYW4vbWFpbi5jIGIvcHJvZ3JhbXMvcHJvZ21hbi9tYWluLmMKaW5kZXggMWRkNWU2ZC4uZTg1OTBlMiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcHJvZ21hbi9tYWluLmMKKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9tYWluLmMKQEAgLTE1LDYgKzE1LDcgQEAKIHZvaWQgTElCV0lORV9SZWdpc3Rlcl9hY2NlbCgpOwogdm9pZCBMSUJXSU5FX1JlZ2lzdGVyX0RlKCk7CiB2b2lkIExJQldJTkVfUmVnaXN0ZXJfRW4oKTsKK3ZvaWQgTElCV0lORV9SZWdpc3Rlcl9GaSgpOwogdm9pZCBMSUJXSU5FX1JlZ2lzdGVyX0ZyKCk7CiAjZW5kaWYKIApAQCAtNDMsNiArNDQsNyBAQAogICBMSUJXSU5FX1JlZ2lzdGVyX2FjY2VsKCk7CiAgIExJQldJTkVfUmVnaXN0ZXJfRGUoKTsKICAgTElCV0lORV9SZWdpc3Rlcl9FbigpOworICBMSUJXSU5FX1JlZ2lzdGVyX0ZpKCk7CiAgIExJQldJTkVfUmVnaXN0ZXJfRnIoKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5oZWxwL0NoYW5nZUxvZyBiL3Byb2dyYW1zL3dpbmhlbHAvQ2hhbmdlTG9nCmluZGV4IDlhZjRiMDUuLmFhNjkyYmMgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3dpbmhlbHAvQ2hhbmdlTG9nCisrKyBiL3Byb2dyYW1zL3dpbmhlbHAvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsOCBAQAorTW9uIEp1bCAyMiAyMDozMDoxMSAxOTk2ICBKdXNzaSBUaXJra29uZW4gPGp0QG1vZGVlbWkuY3MudHV0LmZpPgorCisJKiBbRmkucmNdIChuZXcpCisJQWRkZWQgRmlubmlzaCBsYW5ndWFnZSBzdXBwb3J0LgorCiBTYXQgTWF5IDE4IDExOjA2OjAyIDE5OTYgIFBhYmxvIFNhcmF0eGFnYSA8c3J0eGdAZjIyMTkubjI5My56Mi5maWRvbmV0Lm9yZz4KIAogCSogW0ZyLnJjXSAobmV3KQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC9GaS5yYyBiL3Byb2dyYW1zL3dpbmhlbHAvRmkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5MjlmMwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3dpbmhlbHAvRmkucmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIEhlbHAgVmlld2VyCisgKgorICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAorICogRmlubmlzaCBsYW5ndWFnZSBieSBKdXNzaSBUaXJra29uZW4gPGp0QG1vZGVlbWkuY3MudHV0LmZpPgorICovCisKKy8qIFRoaXMgZmlsZSBpcyBub3QgeWV0IGNvbXBsZXRlICEhICovCisKKyNkZWZpbmUgTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgICBGaQorI2RlZmluZSBMQU5HVUFHRV9OVU1CRVIgICAgICAgICAgICAgIDUKKworLyogTWVudSAqLworCisjZGVmaW5lIE1FTlVfRklMRSAgICAgICAgICAgICAgICAgICAgIiZUaWVkb3N0byIKKyNkZWZpbmUgTUVOVV9GSUxFX09QRU4gICAgICAgICAgICAgICAiJkF2YWEuLi4iCisjZGVmaW5lIE1FTlVfRklMRV9QUklOVCAgICAgICAgICAgICAgIiZUdWxvc3RhIgorI2RlZmluZSBNRU5VX0ZJTEVfUFJJTlRFUl9TRVRVUCAgICAgICImS2lyam9pdHRpbWVuIGFzZXR1a3NldC4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX0VYSVQgICAgICAgICAgICAgICAiJkxvcGV0YSIKKworI2RlZmluZSBNRU5VX0VESVQgICAgICAgICAgICAgICAgICAgICImTXVva2thYSIKKyNkZWZpbmUgTUVOVV9FRElUX0NPUFlfRElBTE9HICAgICAgICAiJktvcGlvaS4uLiIKKyNkZWZpbmUgTUVOVV9FRElUX0FOTk9UQVRFICAgICAgICAgICAiJkh1b21hdXR1cy4uLiIKKworI2RlZmluZSBNRU5VX0JPT0tNQVJLICAgICAgICAgICAgICAgICImS2lyamFubWVya2tpIgorI2RlZmluZSBNRU5VX0JPT0tNQVJLX0RFRklORSAgICAgICAgICImQXNldGEuLi4iCisKKyNkZWZpbmUgTUVOVV9IRUxQICAgICAgICAgICAgICAgICAgICAiJk9oamUiCisjZGVmaW5lIE1FTlVfSEVMUF9PTl9IRUxQICAgICAgICAgICAgIiZPaGplZW4ga+R5dHT2IgorI2RlZmluZSBNRU5VX0hFTFBfT05fVE9QICAgICAgICAgICAgICImQWluYSBw5ORsbGltbeRpc2Vu5CIKKyNkZWZpbmUgTUVOVV9IRUxQX0lORk8gICAgICAgICAgICAgICAiVCZpZXRvamEuLi4iCisjZGVmaW5lIE1FTlVfSEVMUF9BQk9VVF9XSU5FICAgICAgICAgIiZUaWV0b2phIFdJTkVzdOQiCisKKy8qIFN0cmluZ3MgKi8KKworI2RlZmluZSBTVFJJTkdfV0lORV9IRUxQICAgICAgICAgICAgICJXSU5FIE9oamUiCisjZGVmaW5lIFNUUklOR19FUlJPUiAgICAgICAgICAgICAgICAgIlZJUkhFIgorI2RlZmluZSBTVFJJTkdfV0FSTklORyAgICAgICAgICAgICAgICJWQVJPSVRVUyIKKyNkZWZpbmUgU1RSSU5HX0lORk8gICAgICAgICAgICAgICAgICAiVGlldG9qYSIKKyNkZWZpbmUgU1RSSU5HX05PVF9JTVBMRU1FTlRFRCAgICAgICAiRWkga+R5dGV0dOR2aXNz5CIKKyNkZWZpbmUgU1RSSU5HX0hMUEZJTEVfRVJST1JfcyAgICAgICAiVmlyaGUgbHVldHRhZXNzYSBvaGpldGllZG9zdG9hIGAlcyciIAorI2RlZmluZSBTVFJJTkdfQ09OVEVOVFMgICAgICAgICAgICAgICImU2lz5GxseXMiCisjZGVmaW5lIFNUUklOR19TRUFSQ0ggICAgICAgICAgICAgICAgIiZFdHNpIgorI2RlZmluZSBTVFJJTkdfQkFDSyAgICAgICAgICAgICAgICAgICImVGFrYWlzaW4iCisjZGVmaW5lIFNUUklOR19ISVNUT1JZICAgICAgICAgICAgICAgIiZMdWV0dXQiCisjZGVmaW5lIFNUUklOR19BTExfRklMRVMgICAgICAgICAgICAgIkthaWtraSB0aWVkb3N0b3QgKCouKikiCisjZGVmaW5lIFNUUklOR19IRUxQX0ZJTEVTX0hMUCAgICAgICAgIk9oamV0aWVkb3N0b3QgKCouaGxwKSIKKworI2luY2x1ZGUgIlh4LnJjIgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4KaW5kZXggMDQ5OWY5Zi4uNWY2YWZhMyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluCkBAIC0zLDcgKzMsNyBAQAogUFJPR1JBTVMgPSB3aW5oZWxwIGhscDJzZ21sCiBBTExfTElCUyA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExETElCUykKIAotTEFOR1VBR0VTICAgPSBFbiBEZSBGcgorTEFOR1VBR0VTICAgPSBFbiBEZSBGciBGaQogCiAjIEluc3RhbGxhdGlvbiBpbmZvcwogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5oZWxwL3dpbmhlbHAuYyBiL3Byb2dyYW1zL3dpbmhlbHAvd2luaGVscC5jCmluZGV4IDU5NGVmZTAuLjE3N2VhNDkgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3dpbmhlbHAvd2luaGVscC5jCisrKyBiL3Byb2dyYW1zL3dpbmhlbHAvd2luaGVscC5jCkBAIC0xNiw2ICsxNiw3IEBACiAKIFZPSUQgTElCV0lORV9SZWdpc3Rlcl9EZSh2b2lkKTsKIFZPSUQgTElCV0lORV9SZWdpc3Rlcl9Fbih2b2lkKTsKK1ZPSUQgTElCV0lORV9SZWdpc3Rlcl9GaSh2b2lkKTsKIFZPSUQgTElCV0lORV9SZWdpc3Rlcl9Gcih2b2lkKTsKIAogc3RhdGljIEJPT0wgICAgV0lOSEVMUF9SZWdpc3RlcldpbkNsYXNzZXMoKTsKQEAgLTUzLDYgKzU0LDcgQEAKICAgLyogUmVnaXN0ZXIgcmVzb3VyY2VzICovCiAgIExJQldJTkVfUmVnaXN0ZXJfRGUoKTsKICAgTElCV0lORV9SZWdpc3Rlcl9FbigpOworICBMSUJXSU5FX1JlZ2lzdGVyX0ZpKCk7CiAgIExJQldJTkVfUmVnaXN0ZXJfRnIoKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS90b29scy9idWlsZC5jIGIvdG9vbHMvYnVpbGQuYwppbmRleCAxZTBkN2I2Li4zZjE4YmRlIDEwMDY0NAotLS0gYS90b29scy9idWlsZC5jCisrKyBiL3Rvb2xzL2J1aWxkLmMKQEAgLTE2NTIsMTcgKzE2NTIsMTYgQEAKICAqCiAgKiBTdGFjayBmcmFtZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb246CiAgKiAgLi4uICAgICAgLi4uCi0gKiAoZWJwKzI0KSBhcmcyCi0gKiAoZWJwKzIwKSBhcmcxCi0gKiAoZWJwKzE2KSAxNi1iaXQgZHMKKyAqIChlYnArMjApIGFyZzIKKyAqIChlYnArMTYpIGFyZzEKICAqIChlYnArMTIpIGZ1bmMgdG8gY2FsbAogICogKGVicCs4KSAgY29kZSBzZWxlY3RvcgogICogKGVicCs0KSAgcmV0dXJuIGFkZHJlc3MKICAqIChlYnApICAgIHByZXZpb3VzIGVicAogICoKICAqIFByb3RvdHlwZXMgZm9yIHRoZSBDYWxsVG8xNiBmdW5jdGlvbnM6Ci0gKiAgIGV4dGVybiBXT1JEIENhbGxUbzE2X3dvcmRfeHh4KCBGQVJQUk9DMTYgZnVuYywgV09SRCBkcywgYXJncy4uLiApOwotICogICBleHRlcm4gTE9ORyBDYWxsVG8xNl9sb25nX3h4eCggRkFSUFJPQzE2IGZ1bmMsIFdPUkQgZHMsIGFyZ3MuLi4gKTsKKyAqICAgZXh0ZXJuIFdPUkQgQ2FsbFRvMTZfd29yZF94eHgoIEZBUlBST0MxNiBmdW5jLCBhcmdzLi4uICk7CisgKiAgIGV4dGVybiBMT05HIENhbGxUbzE2X2xvbmdfeHh4KCBGQVJQUk9DMTYgZnVuYywgYXJncy4uLiApOwogICogICBleHRlcm4gdm9pZCBDYWxsVG8xNl9yZWdzXyggRkFSUFJPQzE2IGZ1bmMsIFdPUkQgZHMsIFdPUkQgZXMsIFdPUkQgYnAsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIGF4LCBXT1JEIGJ4LCBXT1JEIGN4LCBXT1JEIGR4LAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBzaSwgV09SRCBkaSApOwpAQCAtMTc1MywxMCArMTc1MiwxMCBAQAogICAgIH0KICAgICBlbHNlICAvKiBub3QgYSByZWdpc3RlciBmdW5jdGlvbiAqLwogICAgIHsKLSAgICAgICAgaW50IHBvcyA9IDIwOyAgLyogZmlyc3QgYXJndW1lbnQgcG9zaXRpb24gKi8KKyAgICAgICAgaW50IHBvcyA9IDE2OyAgLyogZmlyc3QgYXJndW1lbnQgcG9zaXRpb24gKi8KIAogICAgICAgICAvKiBNYWtlICVicCBwb2ludCB0byB0aGUgcHJldmlvdXMgc3RhY2tmcmFtZSAoYnVpbHQgYnkgQ2FsbEZyb20xNikgKi8KLSAgICAgICAgcHJpbnRmKCAiXHRtb3Z3ICUlc3AsJSVicFxuIiApOworICAgICAgICBwcmludGYoICJcdG1vdnp3bCAlJXNwLCUlZWJwXG4iICk7CiAgICAgICAgIHByaW50ZiggIlx0YWRkdyAkMTYsJSVicFxuIiApOwogCiAgICAgICAgIHdoaWxlICgqYXJncykKQEAgLTE3OTMsOCArMTc5Miw5IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIC8qIFNldCBheCBlcXVhbCB0byBkcyBmb3Igd2luZG93IHByb2NlZHVyZXMgKi8KLSAgICAgICAgcHJpbnRmKCAiXHRtb3Z3IDE2KCUlZWJ4KSwlJWF4XG4iICk7CisgICAgICAgIC8qIEdldCBwcmV2aW91cyBkcyBmcm9tIHRoZSAxNi1iaXQgc3RhY2sgYW5kICovCisgICAgICAgIC8qIHNldCBheCBlcXVhbCB0byBkcyBmb3Igd2luZG93IHByb2NlZHVyZXMuICovCisgICAgICAgIHByaW50ZiggIlx0bW92dyAtMTAoJSVlYnApLCUlYXhcbiIgKTsKICNpZmRlZiBfX3N2cjRfXwogICAgICAgICBwcmludGYoICJcdGRhdGExNlxuIik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3dpbjMyL01ha2VmaWxlLmluIGIvd2luMzIvTWFrZWZpbGUuaW4KaW5kZXggNjM0ZTg3Yi4uZGY0ZjliNiAxMDA2NDQKLS0tIGEvd2luMzIvTWFrZWZpbGUuaW4KKysrIGIvd2luMzIvTWFrZWZpbGUuaW4KQEAgLTExLDYgKzExLDcgQEAKIAllcnJvci5jIFwKIAlleGNlcHQuYyBcCiAJZmlsZS5jIFwKKwlmaW5kZmlsZS5jIFwKIAlpbml0LmMgXAogCW1lbW9yeS5jIFwKIAluZXdmbnMuYyBcCmRpZmYgLS1naXQgYS93aW4zMi9maWxlLmMgYi93aW4zMi9maWxlLmMKaW5kZXggNWU1YWQyOC4uZmZiMGIyZiAxMDA2NDQKLS0tIGEvd2luMzIvZmlsZS5jCisrKyBiL3dpbjMyL2ZpbGUuYwpAQCAtNTAwLDMgKzUwMCwxOCBAQAogCQlyZXMgfD0gRklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7CiAJcmV0dXJuIHJlczsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgU2V0RmlsZUF0dHJpYnV0ZXMKKyAqLworQk9PTCBTZXRGaWxlQXR0cmlidXRlczMyQShMUENTVFIgbHBGaWxlTmFtZSwgRFdPUkQgYXR0cmlidXRlcykKKworeworCXN0cnVjdCBzdGF0IGJ1ZjsKKwlEV09SRAlyZXM9MDsKKwljaGFyCSpmbjsKKworCWZwcmludGYoc3RkbmltcCwiQ2FsbCB0byBzdHViIGZ1bmN0aW9uIFNldEZpbGVBdHRyaWJ1dGVzQSglcywgJTA4eClcbiIsbHBGaWxlTmFtZSwgYXR0cmlidXRlcyk7CisJcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL3dpbjMyL2ZpbmRmaWxlLmMgYi93aW4zMi9maW5kZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjlkOWUKLS0tIC9kZXYvbnVsbAorKysgYi93aW4zMi9maW5kZmlsZS5jCkBAIC0wLDAgKzEsNTQgQEAKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmJhc2UuaCIKKyNpbmNsdWRlICJkb3NfZnMuaCIKKworSEFORExFMzIgRmluZEZpcnN0RmlsZTMyQShMUENTVFIgbHBmaWxlbmFtZSwgCisJCQkgIExQV0lOMzJfRklORF9EQVRBMzJBIGxwRmluZEZpbGVEYXRhKQorCit7CisJY2hhciAqdW5peHBhdGggPSBET1NGU19HZXRVbml4RmlsZU5hbWUobHBmaWxlbmFtZSwgRkFMU0UpOworCWNoYXIgKnA7CisJY2hhciAqcGF0aDsKKwljaGFyICptYXNrOworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmRpcmVudDsKKwlpbnQgbmFtZWxlbjsKKwljaGFyICpmb3VuZG5hbWU7CisKKwlpZiAoIXVuaXhwYXRoKSB7CisJCS8qIEZJWE1FOiBTZXRMYXN0RXJyb3IoPz8pICovCisJCXJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisJcCA9IHN0cnJjaHIodW5peHBhdGgsICcvJyk7CisJaWYgKHApIHsKKwkJKnAgPSAnXDAnOworCQlwYXRoID0gdW5peHBhdGg7CisJCW1hc2sgPSBwICsgMTsKKwl9IGVsc2UgeworCQlwYXRoID0gIi4iOworCQltYXNrID0gdW5peHBhdGg7CisJfQorCWRpciA9IG9wZW5kaXIocGF0aCk7CisJaWYgKCFkaXIpIHsKKwkJLyogRklYTUU6IFNldExhc3RFcnJvcig/PykgKi8KKwkJcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworCX0KKwl3aGlsZSAoKGRpcmVudCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlpZiAoIURPU0ZTX01hdGNoKERPU0ZTX0hhc2goZGlyZW50LT5kX25hbWUsIFRSVUUpKSkKKwkJCWNvbnRpbnVlOworCQkvKiBGSVhNRTogT3VnaHQgdG8gZmlkZGxlIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIC4vLi4gaW4gZHJpdmUgcm9vdCAqLworCQluYW1lbGVuID0gc3RybGVuKHBhdGgpICsgc3RybGVuKGRpcmVudC0+ZF9uYW1lKTsKKwkJZm91bmRuYW1lID0geG1hbGxvYyhuYW1lbGVuKzEpOworCQlzdHJjcHkoZm91bmRuYW1lLCBwYXRoKTsKKwkJc3RyY2F0KGZvdW5kbmFtZSwgZGlyZW50LT5kX25hbWUpOworCQlzdHJjcHkobHBGaW5kRmlsZURhdGEtPkZpbGVOYW1lLCBET1NGU19HZXREb3NUcnVlTmFtZShmb3VuZG5hbWUsIFRSVUUpKTsKKwkJZnJlZShmb3VuZG5hbWUpOworCQlyZXR1cm4gZGlyOworCX0KKwlyZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9tZW1vcnkuYyBiL3dpbjMyL21lbW9yeS5jCmluZGV4IDRiNzhmM2QuLjk1MmMyZTIgMTAwNjQ0Ci0tLSBhL3dpbjMyL21lbW9yeS5jCisrKyBiL3dpbjMyL21lbW9yeS5jCkBAIC01LDcgKzUsNiBAQAogICovCiAKICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KZGlmZiAtLWdpdCBhL3dpbjMyL25ld2Zucy5jIGIvd2luMzIvbmV3Zm5zLmMKaW5kZXggODA1ZWQyZS4uMzFkMTE2YiAxMDA2NDQKLS0tIGEvd2luMzIvbmV3Zm5zLmMKKysrIGIvd2luMzIvbmV3Zm5zLmMKQEAgLTI5LDcgKzI5LDE1IEBACiAKIHsKIAkvKiBTdHViIGZvciBub3cgKi8KLQlmcHJpbnRmKHN0ZG5pbXAsICJXSU4zMl9TZXRXaW5kb3dzSG9va0V4IFN0dWIgY2FsbGVkIVxuIik7CisJZnByaW50ZihzdGRuaW1wLCAiU2V0V2luZG93c0hvb2tFeDMyQSBTdHViIGNhbGxlZCEgKGhvb2sgSWQgJWQpXG4iLCBIb29rSWQpOwogCQogCXJldHVybiAoSEhPT0spIE5VTEw7CiB9CisKK0JPT0wgVW5ob29rV2luZG93c0hvb2tFeDMyKEhIT09LIGhIb29rKQorCit7CisJLyogU3R1YiBmb3Igbm93ICovCisJZnByaW50ZihzdGRuaW1wLCAiVW5ob29rV2luZG93c0hvb2tFeDMyIFN0dWIgY2FsbGVkIVxuIik7CisJcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvd2luMzIvdXNlcjMyLmMgYi93aW4zMi91c2VyMzIuYwppbmRleCA0NDUxZTJhLi41OTRlMGI2MyAxMDA2NDQKLS0tIGEvd2luMzIvdXNlcjMyLmMKKysrIGIvd2luMzIvdXNlcjMyLmMKQEAgLTM0LDYgKzM0LDE2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgSXNEaWFsb2dNZXNzYWdlQSAgICAgKFVTRVIzMi4zNDEpCisgKi8KK0JPT0wgSXNEaWFsb2dNZXNzYWdlMzJBKERXT1JEIGh3bmQsIE1TRzMyKiBscG1zZykKK3sKKwlNU0cxNiBtc2c7CisJU1RSVUNUMzJfTVNHMzJ0bzE2KGxwbXNnLCAmbXNnKTsKKwlyZXR1cm4gSXNEaWFsb2dNZXNzYWdlKGh3bmQsICZtc2cpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgRGlzcGF0Y2hNZXNzYWdlQSAgICAgICAoVVNFUjMyLjE0MCkKICAqLwogTE9ORyBVU0VSMzJfRGlzcGF0Y2hNZXNzYWdlQShNU0czMiogbHBtc2cpCmRpZmYgLS1naXQgYS93aW5kb3dzL2RjZS5jIGIvd2luZG93cy9kY2UuYwppbmRleCA5N2ZjN2Y1Li41OGFkYTJhIDEwMDY0NAotLS0gYS93aW5kb3dzL2RjZS5jCisrKyBiL3dpbmRvd3MvZGNlLmMKQEAgLTExOCwxMSArMTE4LDExIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgRENFX2hEQzJoV25kCisgKiAgICAgICAgICBXaW5kb3dGcm9tREMgICAoVVNFUi4xMTcpIChVU0VSMzIuNTgwKQogICovCi1IV05EIERDRV9oREMyaFduZChIREMgaERDKQorSFdORDE2IFdpbmRvd0Zyb21EQyggSERDMzIgaERDICkKIHsKLSBIQU5ETEUgaGRjZSA9IERDRV9GaW5kRENFKGhEQyk7IAorIEhBTkRMRTE2IGhkY2UgPSBEQ0VfRmluZERDRShoREMpOyAKIAogIGlmKCBoZGNlICkKICAgIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmZGxnLmMgYi93aW5kb3dzL2RlZmRsZy5jCmluZGV4IDBkZGJlYTguLmM5MWM2MDcgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmZGxnLmMKKysrIGIvd2luZG93cy9kZWZkbGcuYwpAQCAtNDAsNyArNDAsNiBAQAogICAgIEhXTkQgaHduZEZvY3VzID0gR2V0Rm9jdXMoKTsKIAogICAgIGlmICghaHduZEZvY3VzIHx8ICFJc0NoaWxkKCBod25kLCBod25kRm9jdXMgKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghaW5mb1B0ci0+aHduZEZvY3VzKSByZXR1cm4gRkFMU0U7ICAvKiBBbHJlYWR5IHNhdmVkICovCiAgICAgaW5mb1B0ci0+aHduZEZvY3VzID0gaHduZEZvY3VzOwogICAgICAgLyogUmVtb3ZlIGRlZmF1bHQgYnV0dG9uICovCiAgICAgcmV0dXJuIFRSVUU7CkBAIC02MCw3ICs1OSw2IEBACiB9CiAKIAotI2lmZGVmIFNVUEVSRkxVT1VTX0ZVTkNUSU9OUwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgREVGRExHX0ZpbmREZWZCdXR0b24KICAqCkBAIC03Nyw3ICs3NSw2IEBACiAgICAgfQogICAgIHJldHVybiBod25kQ2hpbGQ7CiB9Ci0jZW5kaWYKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTExNyw2ICsxMTQsOCBAQAogc3RhdGljIExSRVNVTFQgREVGRExHX1Byb2MoIEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSwgRElBTE9HSU5GTyAqZGxnSW5mbyApCiB7CisgICAgSFdORCBod25kRGVmSWQ7CisKICAgICBzd2l0Y2gobXNnKQogICAgIHsKIAljYXNlIFdNX0lOSVRESUFMT0c6CkBAIC0xNzcsOCArMTc2LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gMTsKIAogICAgICAgICBjYXNlIERNX0dFVERFRklEOgotICAgICAgICAgICAgaWYgKGRsZ0luZm8tPmZFbmQgfHwgIWRsZ0luZm8tPm1zZ1Jlc3VsdCkgcmV0dXJuIDA7Ci0gICAgICAgICAgICByZXR1cm4gTUFLRUxPTkcoIGRsZ0luZm8tPm1zZ1Jlc3VsdCwgRENfSEFTREVGSUQgKTsKKyAgICAgICAgICAgIGlmIChkbGdJbmZvLT5mRW5kKSByZXR1cm4gMDsKKwkgICAgaWYgKGRsZ0luZm8tPm1zZ1Jlc3VsdCkKKwkgICAgICByZXR1cm4gTUFLRUxPTkcoIGRsZ0luZm8tPm1zZ1Jlc3VsdCwgRENfSEFTREVGSUQgKTsKKwkgICAgaHduZERlZklkID0gREVGRExHX0ZpbmREZWZCdXR0b24oIGh3bmQgKTsKKwkgICAgaWYgKGh3bmREZWZJZCkKKwkgICAgICByZXR1cm4gTUFLRUxPTkcoIEdldERsZ0N0cmxJRCggaHduZERlZklkICksIERDX0hBU0RFRklEKTsKKwkgICAgcmV0dXJuIDA7CiAKIAljYXNlIFdNX05FWFRETEdDVEw6CiAJICAgIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCmluZGV4IDlmYWVjMjIuLjNmYmNiMTQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGlhbG9nLmMKKysrIGIvd2luZG93cy9kaWFsb2cuYwpAQCAtNTUwLDcgKzU1MCw3IEBACiAgICAgewogICAgICAgICByZWN0LmxlZnQgKz0gdGVtcGxhdGUueCAqIHhVbml0IC8gNDsKICAgICAgICAgcmVjdC50b3AgKz0gdGVtcGxhdGUueSAqIHlVbml0IC8gODsKLSAgICAgICAgaWYgKCEodGVtcGxhdGUuc3R5bGUgJiBEU19BQlNBTElHTikpCisgICAgICAgIGlmICggISh0ZW1wbGF0ZS5zdHlsZSAmIERTX0FCU0FMSUdOKSAmJiAhKHRlbXBsYXRlLnN0eWxlICYgV1NfQ0hJTEQpICkKICAgICAgICAgICAgIENsaWVudFRvU2NyZWVuMTYoIG93bmVyLCAoUE9JTlQxNiAqKSZyZWN0ICk7CiAgICAgfQogCkBAIC0xMTYwLDcgKzExNjAsNyBAQAogICovCiBXT1JEIElzRGxnQnV0dG9uQ2hlY2tlZCggSFdORCBod25kLCBXT1JEIGlkICkKIHsKLSAgICByZXR1cm4gKFdPUkQpU2VuZERsZ0l0ZW1NZXNzYWdlMTYoIGh3bmQsIGlkLCBCTV9HRVRDSEVDSzE2LCAwLCAwICk7CisgICAgcmV0dXJuIChXT1JEKVNlbmREbGdJdGVtTWVzc2FnZTMyQSggaHduZCwgaWQsIEJNX0dFVENIRUNLMzIsIDAsIDAgKTsKIH0KIAogCmRpZmYgLS1naXQgYS93aW5kb3dzL2V2ZW50LmMgYi93aW5kb3dzL2V2ZW50LmMKaW5kZXggZjAwY2ZlOS4uOWVhNDM0OSAxMDA2NDQKLS0tIGEvd2luZG93cy9ldmVudC5jCisrKyBiL3dpbmRvd3MvZXZlbnQuYwpAQCAtMTQ4LDYgKzE0OCw3IEBACiBzdGF0aWMgdm9pZCBFVkVOVF9TZWxlY3Rpb25Ob3RpZnkoIFhTZWxlY3Rpb25FdmVudCAqZXZlbnQpOwogc3RhdGljIHZvaWQgRVZFTlRfU2VsZWN0aW9uQ2xlYXIoIFdORCAqcFduZCwgWFNlbGVjdGlvbkNsZWFyRXZlbnQgKmV2ZW50KTsKIHN0YXRpYyB2b2lkIEVWRU5UX0NsaWVudE1lc3NhZ2UoIFdORCAqcFduZCwgWENsaWVudE1lc3NhZ2VFdmVudCAqZXZlbnQgKTsKK3N0YXRpYyB2b2lkIEVWRU5UX01hcE5vdGlmeSggSFdORCBod25kLCBYTWFwRXZlbnQgKmV2ZW50ICk7CiAKIC8qIFVzYWJsZSBvbmx5IHdpdGggT0xWV00gLSBjb21waWxlIG9wdGlvbiBwZXJoYXBzPwogc3RhdGljIHZvaWQgRVZFTlRfRW50ZXJOb3RpZnkoIFdORCAqcFduZCwgWENyb3NzaW5nRXZlbnQgKmV2ZW50ICk7CkBAIC0yMzgsNyArMjM5LDIwIEBACiAgKiAgICAgICBicmVhazsKICAqLwogICAgIGNhc2UgTm9FeHBvc2U6Ci0JYnJlYWs7ICAgCisJYnJlYWs7CisKKyAgICAvKiBXZSBnZXQgYWxsIHRoZXNlIGJlY2F1c2Ugb2YgU3RydWN0dXJlTm90aWZ5TWFzay4gKi8KKyAgICBjYXNlIFVubWFwTm90aWZ5OgorICAgIGNhc2UgQ2lyY3VsYXRlTm90aWZ5OgorICAgIGNhc2UgQ3JlYXRlTm90aWZ5OgorICAgIGNhc2UgRGVzdHJveU5vdGlmeToKKyAgICBjYXNlIEdyYXZpdHlOb3RpZnk6CisgICAgY2FzZSBSZXBhcmVudE5vdGlmeToKKwlicmVhazsKKworICAgIGNhc2UgTWFwTm90aWZ5OgorCUVWRU5UX01hcE5vdGlmeSggcFduZC0+aHduZFNlbGYsIChYTWFwRXZlbnQgKilldmVudCApOworCWJyZWFrOwogCiAgICAgZGVmYXVsdDogICAgCiAJZHByaW50Zl9ldmVudChzdGRkZWIsICJVbnByb2Nlc3NlZCBldmVudCAlcyBmb3IgaHduZCAlMDR4XG4iLApAQCAtODQ0LDYgKzg1OCwxOSBAQAogICovIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUVWRU5UX01hcE5vdGlmeQorICovCit2b2lkIEVWRU5UX01hcE5vdGlmeSggSFdORCBoV25kLCBYTWFwRXZlbnQgKmV2ZW50ICkKK3sKKyAgICBIV05EIGh3bmRGb2N1cyA9IEdldEZvY3VzKCk7CisKKyAgICBpZiAoaHduZEZvY3VzICYmIElzQ2hpbGQoIGhXbmQsIGh3bmRGb2N1cyApKQorICAgICAgRk9DVVNfU2V0WEZvY3VzKGh3bmRGb2N1cyk7CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJU2V0Q2FwdHVyZSAJKFVTRVIuMTgpCiAgKi8KIEhXTkQgU2V0Q2FwdHVyZSggSFdORCBod25kICkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZm9jdXMuYyBiL3dpbmRvd3MvZm9jdXMuYwppbmRleCAxYzI4MDI1Li5mMmM3ZjIwIDEwMDY0NAotLS0gYS93aW5kb3dzL2ZvY3VzLmMKKysrIGIvd2luZG93cy9mb2N1cy5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSAid2lucG9zLmgiCiAjaW5jbHVkZSAiaG9vay5oIgogI2luY2x1ZGUgImNvbG9yLmgiCisjaW5jbHVkZSAibWVzc2FnZS5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKIAogc3RhdGljIEhXTkQgaHduZEZvY3VzID0gMDsKQEAgLTIxLDcgKzIyLDcgQEAKICAqIFNldCB0aGUgWCBmb2N1cy4KICAqIEV4cGxpY2l0IGNvbG9ybWFwIG1hbmFnZW1lbnQgc2VlbXMgdG8gd29yayBvbmx5IHdpdGggT0xWV00uCiAgKi8KLXN0YXRpYyB2b2lkIEZPQ1VTX1NldFhGb2N1cyggSFdORCBod25kICkKK3ZvaWQgRk9DVVNfU2V0WEZvY3VzKCBIV05EIGh3bmQgKQogewogICAgIFhXaW5kb3dBdHRyaWJ1dGVzIHdpbl9hdHRyOwogICAgIFdpbmRvdyB3aW47CkBAIC00Nyw2ICs0OCw4IEBACiAgICAgWFNldElucHV0Rm9jdXMoIGRpc3BsYXksIHdpbiwgUmV2ZXJ0VG9QYXJlbnQsIEN1cnJlbnRUaW1lICk7CiAgICAgaWYgKENPTE9SX0dldFN5c3RlbVBhbGV0dGVGbGFncygpICYgQ09MT1JfUFJJVkFURSkKICAgICAgICAgWEluc3RhbGxDb2xvcm1hcCggZGlzcGxheSwgQ09MT1JfR2V0Q29sb3JtYXAoKSApOworCisgICAgRVZFTlRfU3luY2hyb25pemUoKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS93aW5kb3dzL2dyYXBoaWNzLmMgYi93aW5kb3dzL2dyYXBoaWNzLmMKaW5kZXggZWY3ODA2ZC4uMjIxYmMwMiAxMDA2NDQKLS0tIGEvd2luZG93cy9ncmFwaGljcy5jCisrKyBiL3dpbmRvd3MvZ3JhcGhpY3MuYwpAQCAtNDUzLDcgKzQ1MywxMCBAQAogewogICAgIEhCUlVTSCBwcmV2QnJ1c2g7CiAKLSAgICBpZiAoKHJlY3QtPnJpZ2h0IDw9IHJlY3QtPmxlZnQpIHx8IChyZWN0LT5ib3R0b20gPD0gcmVjdC0+dG9wKSkgcmV0dXJuIDA7CisgICAgLyogY29vcmRpbmF0ZXMgYXJlIGxvZ2ljYWwgc28gd2UgY2Fubm90IGZhc3QtY2hlY2sgcmVjdGFuZ2xlCisgICAgICogLSBkbyBpdCBpbiBQYXRCbHQoKSBhZnRlciBMUHRvRFAoKS4KKyAgICAgKi8KKwogICAgIGlmICghKHByZXZCcnVzaCA9IFNlbGVjdE9iamVjdCggaGRjLCBoYnJ1c2ggKSkpIHJldHVybiAwOwogICAgIFBhdEJsdCggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCiAJICAgIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wLCBQQVRDT1BZICk7CkBAIC00NjksNyArNDcyLDYgQEAKIHsKICAgICBIQlJVU0ggcHJldkJydXNoOwogCi0gICAgaWYgKChyZWN0LT5yaWdodCA8PSByZWN0LT5sZWZ0KSB8fCAocmVjdC0+Ym90dG9tIDw9IHJlY3QtPnRvcCkpIHJldHVybiAwOwogICAgIGlmICghKHByZXZCcnVzaCA9IFNlbGVjdE9iamVjdCggaGRjLCAoSEJSVVNIMTYpaGJydXNoICkpKSByZXR1cm4gMDsKICAgICBQYXRCbHQoIGhkYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAogCSAgICByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCwgUEFUQ09QWSApOwpAQCAtNDgzLDcgKzQ4NSw2IEBACiAgKi8KIHZvaWQgSW52ZXJ0UmVjdDE2KCBIREMxNiBoZGMsIGNvbnN0IFJFQ1QxNiAqcmVjdCApCiB7Ci0gICAgaWYgKChyZWN0LT5yaWdodCA8PSByZWN0LT5sZWZ0KSB8fCAocmVjdC0+Ym90dG9tIDw9IHJlY3QtPnRvcCkpIHJldHVybjsKICAgICBQYXRCbHQoIGhkYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAogCSAgICByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCwgRFNUSU5WRVJUICk7CiB9CkBAIC00OTQsNyArNDk1LDYgQEAKICAqLwogdm9pZCBJbnZlcnRSZWN0MzIoIEhEQzMyIGhkYywgY29uc3QgUkVDVDMyICpyZWN0ICkKIHsKLSAgICBpZiAoKHJlY3QtPnJpZ2h0IDw9IHJlY3QtPmxlZnQpIHx8IChyZWN0LT5ib3R0b20gPD0gcmVjdC0+dG9wKSkgcmV0dXJuOwogICAgIFBhdEJsdCggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCiAJICAgIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wLCBEU1RJTlZFUlQgKTsKIH0KQEAgLTUxMSwxMyArNTExLDEzIEBACiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKChyZWN0LT5yaWdodCA8PSByZWN0LT5sZWZ0KSB8fCAocmVjdC0+Ym90dG9tIDw9IHJlY3QtPnRvcCkpIHJldHVybiAwOwotICAgIGlmICghKHByZXZCcnVzaCA9IFNlbGVjdE9iamVjdCggaGRjLCBoYnJ1c2ggKSkpIHJldHVybiAwOwotICAgIAogICAgIGxlZnQgICA9IFhMUFRPRFAoIGRjLCByZWN0LT5sZWZ0ICk7CiAgICAgdG9wICAgID0gWUxQVE9EUCggZGMsIHJlY3QtPnRvcCApOwogICAgIHJpZ2h0ICA9IFhMUFRPRFAoIGRjLCByZWN0LT5yaWdodCApOwogICAgIGJvdHRvbSA9IFlMUFRPRFAoIGRjLCByZWN0LT5ib3R0b20gKTsKKworICAgIGlmICggKHJpZ2h0IDw9IGxlZnQpIHx8IChib3R0b20gPD0gdG9wKSApIHJldHVybiAwOworICAgIGlmICghKHByZXZCcnVzaCA9IFNlbGVjdE9iamVjdCggaGRjLCBoYnJ1c2ggKSkpIHJldHVybiAwOwogICAgIAogICAgIGlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjICkpCiAgICAgewpkaWZmIC0tZ2l0IGEvd2luZG93cy9ob29rLmMgYi93aW5kb3dzL2hvb2suYwppbmRleCBlOWNiMTU4Li5hOGJjMzhiIDEwMDY0NAotLS0gYS93aW5kb3dzL2hvb2suYworKysgYi93aW5kb3dzL2hvb2suYwpAQCAtMTUsNiArMTUsNyBAQAogCiAjZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMgIC8qIFRoaXMgZmlsZSBpcyBXaW4zMi1jbGVhbiAqLwogI2luY2x1ZGUgImhvb2suaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgInF1ZXVlLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCmRpZmYgLS1naXQgYS93aW5kb3dzL21lc3NhZ2UuYyBiL3dpbmRvd3MvbWVzc2FnZS5jCmluZGV4IGZmNWU2NDYuLjgyZDA0ZGQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWVzc2FnZS5jCisrKyBiL3dpbmRvd3MvbWVzc2FnZS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgogI2luY2x1ZGUgImhvb2suaCIKICNpbmNsdWRlICJzcHkuaCIKKyNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAid2lucG9zLmgiCiAjaW5jbHVkZSAiYXRvbS5oIgogI2luY2x1ZGUgImRkZS5oIgpkaWZmIC0tZ2l0IGEvd2luZG93cy9wcm9wZXJ0eS5jIGIvd2luZG93cy9wcm9wZXJ0eS5jCmluZGV4IGU2MGE2MWMuLjIyYmNmOTggMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcHJvcGVydHkuYworKysgYi93aW5kb3dzL3Byb3BlcnR5LmMKQEAgLTgsNyArOCw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAic3RyaW5nMzIuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC0yMzUsOCArMjM0LDcgQEAKIAogICAgICAgICBkcHJpbnRmX3Byb3AoIHN0ZGRlYiwgIiAgQ2FsbGJhY2s6IGhhbmRsZT0lMDh4IHN0cj0nJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgIHByb3AtPmhhbmRsZSwgcHJvcC0+c3RyaW5nICk7Ci0gICAgICAgIHJldCA9IENhbGxFbnVtUHJvcFByb2MxNiggKEZBUlBST0MxNilmdW5jLCBod25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUl9HRVQocHJvcC0+c3RyaW5nKSwgcHJvcC0+aGFuZGxlICk7CisgICAgICAgIHJldCA9IGZ1bmMoIGh3bmQsIFNFR1BUUl9HRVQocHJvcC0+c3RyaW5nKSwgcHJvcC0+aGFuZGxlICk7CiAgICAgICAgIGlmICghcmV0KSBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKQEAgLTI0OCwyNCArMjQ2LDcgQEAKICAqLwogSU5UMzIgRW51bVByb3BzMzJBKCBIV05EMzIgaHduZCwgUFJPUEVOVU1QUk9DMzJBIGZ1bmMgKQogewotICAgIFBST1BFUlRZICpwcm9wLCAqbmV4dDsKLSAgICBXTkQgKnBXbmQ7Ci0gICAgSU5UMzIgcmV0ID0gLTE7Ci0KLSAgICBkcHJpbnRmX3Byb3AoIHN0ZGRlYiwgIkVudW1Qcm9wczMyQTogJTA0eCAlMDh4XG4iLCBod25kLCAoVUlOVDMyKWZ1bmMgKTsKLSAgICBpZiAoIShwV25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiAtMTsKLSAgICBmb3IgKHByb3AgPSBwV25kLT5wUHJvcDsgKHByb3ApOyBwcm9wID0gbmV4dCkKLSAgICB7Ci0gICAgICAgIC8qIEFscmVhZHkgZ2V0IHRoZSBuZXh0IGluIGNhc2UgdGhlIGNhbGxiYWNrICovCi0gICAgICAgIC8qIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgcHJvcGVydHkuICAgICovCi0gICAgICAgIG5leHQgPSBwcm9wLT5uZXh0OwotCi0gICAgICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiICBDYWxsYmFjazogaGFuZGxlPSUwOHggc3RyPSclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aGFuZGxlLCBwcm9wLT5zdHJpbmcgKTsKLSAgICAgICAgcmV0ID0gQ2FsbEVudW1Qcm9wUHJvYzMyKCBmdW5jLCBod25kLCBwcm9wLT5zdHJpbmcsIHByb3AtPmhhbmRsZSApOwotICAgICAgICBpZiAoIXJldCkgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIEVudW1Qcm9wc0V4MzJBKCBod25kLCAoUFJPUEVOVU1QUk9DRVgzMkEpZnVuYywgMCApOwogfQogCiAKQEAgLTI3NCwzMyArMjU1LDcgQEAKICAqLwogSU5UMzIgRW51bVByb3BzMzJXKCBIV05EMzIgaHduZCwgUFJPUEVOVU1QUk9DMzJXIGZ1bmMgKQogewotICAgIFBST1BFUlRZICpwcm9wLCAqbmV4dDsKLSAgICBXTkQgKnBXbmQ7Ci0gICAgSU5UMzIgcmV0ID0gLTE7Ci0KLSAgICBkcHJpbnRmX3Byb3AoIHN0ZGRlYiwgIkVudW1Qcm9wczMyVzogJTA0eCAlMDh4XG4iLCBod25kLCAoVUlOVDMyKWZ1bmMgKTsKLSAgICBpZiAoIShwV25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiAtMTsKLSAgICBmb3IgKHByb3AgPSBwV25kLT5wUHJvcDsgKHByb3ApOyBwcm9wID0gbmV4dCkKLSAgICB7Ci0gICAgICAgIC8qIEFscmVhZHkgZ2V0IHRoZSBuZXh0IGluIGNhc2UgdGhlIGNhbGxiYWNrICovCi0gICAgICAgIC8qIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgcHJvcGVydHkuICAgICovCi0gICAgICAgIG5leHQgPSBwcm9wLT5uZXh0OwotCi0gICAgICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiICBDYWxsYmFjazogaGFuZGxlPSUwOHggc3RyPSclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aGFuZGxlLCBwcm9wLT5zdHJpbmcgKTsKLSAgICAgICAgaWYgKEhJV09SRChwcm9wLT5zdHJpbmcpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMUFdTVFIgc3RyID0gU1RSSU5HMzJfRHVwQW5zaVRvVW5pKCBwcm9wLT5zdHJpbmcgKTsKLSAgICAgICAgICAgIHJldCA9IENhbGxFbnVtUHJvcFByb2MzMiggZnVuYywgaHduZCwgc3RyLCBwcm9wLT5oYW5kbGUgKTsKLSAgICAgICAgICAgIGZyZWUoIHN0ciApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldCA9IENhbGxFbnVtUHJvcFByb2MzMiggZnVuYywgaHduZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQ1dTVFIpKFVJTlQzMilMT1dPUkQocHJvcC0+c3RyaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aGFuZGxlICk7Ci0gICAgICAgIGlmICghcmV0KSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gRW51bVByb3BzRXgzMlcoIGh3bmQsIChQUk9QRU5VTVBST0NFWDMyVylmdW5jLCAwICk7CiB9CiAKIApAQCAtMzI0LDggKzI3OSw3IEBACiAKICAgICAgICAgZHByaW50Zl9wcm9wKCBzdGRkZWIsICIgIENhbGxiYWNrOiBoYW5kbGU9JTA4eCBzdHI9JyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBwcm9wLT5oYW5kbGUsIHByb3AtPnN0cmluZyApOwotICAgICAgICByZXQgPSBDYWxsRW51bVByb3BQcm9jRXgzMiggZnVuYywgaHduZCwgcHJvcC0+c3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aGFuZGxlLCBsUGFyYW0gKTsKKyAgICAgICAgcmV0ID0gZnVuYyggaHduZCwgcHJvcC0+c3RyaW5nLCBwcm9wLT5oYW5kbGUsIGxQYXJhbSApOwogICAgICAgICBpZiAoIXJldCkgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiByZXQ7CkBAIC0zNTUsMTMgKzMwOSwxMiBAQAogICAgICAgICBpZiAoSElXT1JEKHByb3AtPnN0cmluZykpCiAgICAgICAgIHsKICAgICAgICAgICAgIExQV1NUUiBzdHIgPSBTVFJJTkczMl9EdXBBbnNpVG9VbmkoIHByb3AtPnN0cmluZyApOwotICAgICAgICAgICAgcmV0ID0gQ2FsbEVudW1Qcm9wUHJvY0V4MzIoIGZ1bmMsIGh3bmQsIHN0ciwgcHJvcC0+aGFuZGxlLCBsUGFyYW0pOworICAgICAgICAgICAgcmV0ID0gZnVuYyggaHduZCwgc3RyLCBwcm9wLT5oYW5kbGUsIGxQYXJhbSApOwogICAgICAgICAgICAgZnJlZSggc3RyICk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0ID0gQ2FsbEVudW1Qcm9wUHJvY0V4MzIoIGZ1bmMsIGh3bmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQ1dTVFIpKFVJTlQzMilMT1dPUkQocHJvcC0+c3RyaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLT5oYW5kbGUsIGxQYXJhbSApOworICAgICAgICAgICAgcmV0ID0gZnVuYyggaHduZCwgKExQQ1dTVFIpKFVJTlQzMilMT1dPUkQoIHByb3AtPnN0cmluZyApLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aGFuZGxlLCBsUGFyYW0gKTsKICAgICAgICAgaWYgKCFyZXQpIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggMjliOTAyZi4uODQ1ZDlhYyAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSAiY29sb3IuaCIKICNpbmNsdWRlICJzaG1fbWFpbl9ibGsuaCIKICNpbmNsdWRlICJkZGVfcHJvYy5oIgotI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAiY2xpcGJvYXJkLmgiCiAjaW5jbHVkZSAid2lucHJvYy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCkBAIC02MDIsNyArNjAxLDcgQEAKIAkgICAgd2luX2F0dHIuZXZlbnRfbWFzayA9IEV4cG9zdXJlTWFzayB8IEtleVByZXNzTWFzayB8CiAJICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZWxlYXNlTWFzayB8IFBvaW50ZXJNb3Rpb25NYXNrIHwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvblByZXNzTWFzayB8IEJ1dHRvblJlbGVhc2VNYXNrIHwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEZvY3VzQ2hhbmdlTWFzazsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIEZvY3VzQ2hhbmdlTWFzayB8IFN0cnVjdHVyZU5vdGlmeU1hc2s7CiAgICAgICAgICAgICB3aW5fYXR0ci5vdmVycmlkZV9yZWRpcmVjdCA9IFRSVUU7CiAJfQogICAgICAgICB3aW5fYXR0ci5jb2xvcm1hcCAgICAgID0gQ09MT1JfR2V0Q29sb3JtYXAoKTsKQEAgLTE2ODcsOSArMTY4Niw3IEBACiAgICAgewogICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgd2luZG93IHN0aWxsIGV4aXN0cyAqLwogICAgICAgICBpZiAoIUlzV2luZG93KCgqcHBXbmQpLT5od25kU2VsZikpIGNvbnRpbnVlOwotICAgICAgICBpZiAoIUNhbGxFbnVtV2luZG93c1Byb2MxNiggKEZBUlBST0MxNilscEVudW1GdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwcFduZCktPmh3bmRTZWxmLCBsUGFyYW0gKSkKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIWxwRW51bUZ1bmMoICgqcHBXbmQpLT5od25kU2VsZiwgbFBhcmFtICkpIGJyZWFrOwogICAgIH0KICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgbGlzdCApOwogICAgIHJldHVybiBUUlVFOwpAQCAtMTcwMSwyNSArMTY5OCw3IEBACiAgKi8KIEJPT0wzMiBFbnVtV2luZG93czMyKCBXTkRFTlVNUFJPQzMyIGxwRW51bUZ1bmMsIExQQVJBTSBsUGFyYW0gKQogewotICAgIFdORCAqKmxpc3QsICoqcHBXbmQ7Ci0KLSAgICAvKiBXZSBoYXZlIHRvIGJ1aWxkIGEgbGlzdCBvZiBhbGwgd2luZG93cyBmaXJzdCwgdG8gYXZvaWQgKi8KLSAgICAvKiB1bnBsZWFzYW50IHNpZGUtZWZmZWN0cywgZm9yIGluc3RhbmNlIGlmIHRoZSBjYWxsYmFjayAgKi8KLSAgICAvKiBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBaLW9yZGVyIG9mIHRoZSB3aW5kb3dzLiAgICAgICAgICAgKi8KLQotICAgIGlmICghKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggcFduZERlc2t0b3AgKSkpIHJldHVybiBGQUxTRTsKLQotICAgIC8qIE5vdyBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZXZlcnkgd2luZG93ICovCi0KLSAgICBmb3IgKHBwV25kID0gbGlzdDsgKnBwV25kOyBwcFduZCsrKQotICAgIHsKLSAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHdpbmRvdyBzdGlsbCBleGlzdHMgKi8KLSAgICAgICAgaWYgKCFJc1dpbmRvdygoKnBwV25kKS0+aHduZFNlbGYpKSBjb250aW51ZTsKLSAgICAgICAgaWYgKCFDYWxsRW51bVdpbmRvd3NQcm9jMzIoIGxwRW51bUZ1bmMsICgqcHBXbmQpLT5od25kU2VsZiwgbFBhcmFtICkpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGxpc3QgKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gKEJPT0wzMilFbnVtV2luZG93czE2KCAoV05ERU5VTVBST0MxNilscEVudW1GdW5jLCBsUGFyYW0gKTsKIH0KIAogCkBAIC0xNzQzLDkgKzE3MjIsNyBAQAogICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgd2luZG93IHN0aWxsIGV4aXN0cyAqLwogICAgICAgICBpZiAoIUlzV2luZG93KCgqcHBXbmQpLT5od25kU2VsZikpIGNvbnRpbnVlOwogICAgICAgICBpZiAoKCpwcFduZCktPmhtZW1UYXNrUSAhPSBoUXVldWUpIGNvbnRpbnVlOyAgLyogQ2hlY2sgdGhlIHF1ZXVlICovCi0gICAgICAgIGlmICghQ2FsbEVudW1XaW5kb3dzUHJvYzE2KCAoRkFSUFJPQzE2KWZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBwV25kKS0+aHduZFNlbGYsIGxQYXJhbSApKQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmICghZnVuYyggKCpwcFduZCktPmh3bmRTZWxmLCBsUGFyYW0gKSkgYnJlYWs7CiAgICAgfQogICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBsaXN0ICk7CiAgICAgcmV0dXJuIFRSVUU7CkBAIC0xNzU3LDMzICsxNzM0LDE3IEBACiAgKi8KIEJPT0wzMiBFbnVtVGhyZWFkV2luZG93cyggRFdPUkQgaWQsIFdOREVOVU1QUk9DMzIgZnVuYywgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgV05EICoqbGlzdCwgKipwcFduZDsKLSAgICBIQU5ETEUgaFF1ZXVlID0gR2V0VGFza1F1ZXVlKCAoRFdPUkQpaWQgKTsKLQotICAgIGlmICghKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggcFduZERlc2t0b3AgKSkpIHJldHVybiBGQUxTRTsKLQotICAgIC8qIE5vdyBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZXZlcnkgd2luZG93ICovCi0KLSAgICBmb3IgKHBwV25kID0gbGlzdDsgKnBwV25kOyBwcFduZCsrKQotICAgIHsKLSAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHdpbmRvdyBzdGlsbCBleGlzdHMgKi8KLSAgICAgICAgaWYgKCFJc1dpbmRvdygoKnBwV25kKS0+aHduZFNlbGYpKSBjb250aW51ZTsKLSAgICAgICAgaWYgKCgqcHBXbmQpLT5obWVtVGFza1EgIT0gaFF1ZXVlKSBjb250aW51ZTsgIC8qIENoZWNrIHRoZSBxdWV1ZSAqLwotICAgICAgICBpZiAoIUNhbGxFbnVtV2luZG93c1Byb2MzMiggZnVuYywgKCpwcFduZCktPmh3bmRTZWxmLCBsUGFyYW0gKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgbGlzdCApOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiAoQk9PTDE2KUVudW1UYXNrV2luZG93czE2KChIVEFTSzE2KWlkLCAoV05ERU5VTVBST0MxNilmdW5jLCBsUGFyYW0pOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgV0lOX0VudW1DaGlsZFdpbmRvd3MxNgorICogICAgICAgICAgIFdJTl9FbnVtQ2hpbGRXaW5kb3dzCiAgKgotICogSGVscGVyIGZ1bmN0aW9uIGZvciBFbnVtQ2hpbGRXaW5kb3dzMTYoKS4KKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgRW51bUNoaWxkV2luZG93cygpLgogICovCi1zdGF0aWMgQk9PTDE2IFdJTl9FbnVtQ2hpbGRXaW5kb3dzMTYoIFdORCAqKnBwV25kLCBXTkRFTlVNUFJPQzE2IGZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQorc3RhdGljIEJPT0wxNiBXSU5fRW51bUNoaWxkV2luZG93cyggV05EICoqcHBXbmQsIFdOREVOVU1QUk9DMTYgZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQogewogICAgIFdORCAqKmNoaWxkTGlzdDsKICAgICBCT09MMTYgcmV0ID0gRkFMU0U7CkBAIC0xNzk0LDM3ICsxNzU1LDggQEAKICAgICAgICAgaWYgKCFJc1dpbmRvdygoKnBwV25kKS0+aHduZFNlbGYpKSBjb250aW51ZTsKICAgICAgICAgLyogQnVpbGQgY2hpbGRyZW4gbGlzdCBmaXJzdCAqLwogICAgICAgICBpZiAoIShjaGlsZExpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggKnBwV25kICkpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghQ2FsbEVudW1XaW5kb3dzUHJvYzE2KChGQVJQUk9DMTYpZnVuYywoKnBwV25kKS0+aHduZFNlbGYsbFBhcmFtKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgcmV0ID0gV0lOX0VudW1DaGlsZFdpbmRvd3MxNiggY2hpbGRMaXN0LCBmdW5jLCBsUGFyYW0gKTsKLSAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGNoaWxkTGlzdCApOwotICAgICAgICBpZiAoIXJldCkgcmV0dXJuIEZBTFNFOwotICAgICAgICBwcFduZCsrOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFdJTl9FbnVtQ2hpbGRXaW5kb3dzMzIKLSAqCi0gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIEVudW1DaGlsZFdpbmRvd3MzMigpLgotICovCi1zdGF0aWMgQk9PTDMyIFdJTl9FbnVtQ2hpbGRXaW5kb3dzMzIoIFdORCAqKnBwV25kLCBXTkRFTlVNUFJPQzMyIGZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQotewotICAgIFdORCAqKmNoaWxkTGlzdDsKLSAgICBCT09MMzIgcmV0ID0gRkFMU0U7Ci0KLSAgICB3aGlsZSAoKnBwV25kKQotICAgIHsKLSAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHdpbmRvdyBzdGlsbCBleGlzdHMgKi8KLSAgICAgICAgaWYgKCFJc1dpbmRvdygoKnBwV25kKS0+aHduZFNlbGYpKSBjb250aW51ZTsKLSAgICAgICAgLyogQnVpbGQgY2hpbGRyZW4gbGlzdCBmaXJzdCAqLwotICAgICAgICBpZiAoIShjaGlsZExpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggKnBwV25kICkpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghQ2FsbEVudW1XaW5kb3dzUHJvYzMyKCBmdW5jLCAoKnBwV25kKS0+aHduZFNlbGYsIGxQYXJhbSApKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICByZXQgPSBXSU5fRW51bUNoaWxkV2luZG93czMyKCBjaGlsZExpc3QsIGZ1bmMsIGxQYXJhbSApOworICAgICAgICBpZiAoIWZ1bmMoICgqcHBXbmQpLT5od25kU2VsZiwgbFBhcmFtICkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0ID0gV0lOX0VudW1DaGlsZFdpbmRvd3MoIGNoaWxkTGlzdCwgZnVuYywgbFBhcmFtICk7CiAgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBjaGlsZExpc3QgKTsKICAgICAgICAgaWYgKCFyZXQpIHJldHVybiBGQUxTRTsKICAgICAgICAgcHBXbmQrKzsKQEAgLTE4NDIsNyArMTc3NCw3IEBACiAKICAgICBpZiAoIShwUGFyZW50ID0gV0lOX0ZpbmRXbmRQdHIoIHBhcmVudCApKSkgcmV0dXJuIEZBTFNFOwogICAgIGlmICghKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggcFBhcmVudCApKSkgcmV0dXJuIEZBTFNFOwotICAgIFdJTl9FbnVtQ2hpbGRXaW5kb3dzMTYoIGxpc3QsIGZ1bmMsIGxQYXJhbSApOworICAgIFdJTl9FbnVtQ2hpbGRXaW5kb3dzKCBsaXN0LCBmdW5jLCBsUGFyYW0gKTsKICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgbGlzdCApOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMTg1MywxMyArMTc4NSw4IEBACiAgKi8KIEJPT0wzMiBFbnVtQ2hpbGRXaW5kb3dzMzIoIEhXTkQzMiBwYXJlbnQsIFdOREVOVU1QUk9DMzIgZnVuYywgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgV05EICoqbGlzdCwgKnBQYXJlbnQ7Ci0KLSAgICBpZiAoIShwUGFyZW50ID0gV0lOX0ZpbmRXbmRQdHIoIHBhcmVudCApKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggcFBhcmVudCApKSkgcmV0dXJuIEZBTFNFOwotICAgIFdJTl9FbnVtQ2hpbGRXaW5kb3dzMzIoIGxpc3QsIGZ1bmMsIGxQYXJhbSApOwotICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBsaXN0ICk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIChCT09MMzIpRW51bUNoaWxkV2luZG93czE2KCAoSFdORDE2KXBhcmVudCwgKFdOREVOVU1QUk9DMTYpZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQYXJhbSApOwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucG9zLmMgYi93aW5kb3dzL3dpbnBvcy5jCmluZGV4IDIzYWIwODcuLjllMWE5Y2MgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucG9zLmMKKysrIGIvd2luZG93cy93aW5wb3MuYwpAQCAtNjgzLDcgKzY4Myw4IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgLyogV2UgY2FuJ3QgYWN0aXZhdGUgYSBjaGlsZCB3aW5kb3cgKi8KLSAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSBzd3BmbGFncyB8PSBTV1BfTk9BQ1RJVkFURTsKKyAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQorICAgICAgICAgICAgc3dwZmxhZ3MgfD0gU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVI7CiAgICAgICAgIFNldFdpbmRvd1BvcyggaHduZCwgSFdORF9UT1AsIHgsIHksIGN4LCBjeSwgc3dwZmxhZ3MgKTsKICAgICAgICAgaWYgKCFJc1dpbmRvdyggaHduZCApKSByZXR1cm4gd2FzVmlzaWJsZTsKICAgICB9CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnByb2MuYyBiL3dpbmRvd3Mvd2lucHJvYy5jCmluZGV4IGY1MmE2ZDIuLjA2MDU3YzAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucHJvYy5jCisrKyBiL3dpbmRvd3Mvd2lucHJvYy5jCkBAIC0xMzQ0LDExICsxMzQ0LDEzIEBACiAgICAgVUlOVDE2IG1zZzE2OwogICAgIFdQQVJBTTE2IHdQYXJhbTE2OwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLSAgICBXT1JEIGRzID0gd25kUHRyID8gd25kUHRyLT5oSW5zdGFuY2UgOiBDVVJSRU5UX0RTOworICAgIFdPUkQgZHMgPSBDVVJSRU5UX0RTOwogCiAgICAgaWYgKFdJTlBST0NfTWFwTXNnMzJBVG8xNiggbXNnLCB3UGFyYW0sICZtc2cxNiwgJndQYXJhbTE2LCAmbFBhcmFtICkgPT0gLTEpCiAgICAgICAgIHJldHVybiAwOwotICAgIHJlc3VsdCA9IENhbGxXbmRQcm9jMTYoIGZ1bmMsIGRzLCBod25kLCBtc2cxNiwgd1BhcmFtMTYsIGxQYXJhbSApOworICAgIGlmICh3bmRQdHIpIENVUlJFTlRfRFMgPSB3bmRQdHItPmhJbnN0YW5jZTsKKyAgICByZXN1bHQgPSBDYWxsV25kUHJvYzE2KCBmdW5jLCBod25kLCBtc2cxNiwgd1BhcmFtMTYsIGxQYXJhbSApOworICAgIENVUlJFTlRfRFMgPSBkczsKICAgICBXSU5QUk9DX1VubWFwTXNnMzJBVG8xNiggbXNnMTYsIHdQYXJhbTE2LCBsUGFyYW0gKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMTM2NywxMSArMTM2OSwxMyBAQAogICAgIFVJTlQxNiBtc2cxNjsKICAgICBXUEFSQU0xNiB3UGFyYW0xNjsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgV09SRCBkcyA9IENVUlJFTlRfRFM7CiAKICAgICBpZiAoV0lOUFJPQ19NYXBNc2czMldUbzE2KCBtc2csIHdQYXJhbSwgJm1zZzE2LCAmd1BhcmFtMTYsICZsUGFyYW0gKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmVzdWx0ID0gQ2FsbFduZFByb2MxNiggZnVuYywgd25kUHRyID8gd25kUHRyLT5oSW5zdGFuY2UgOiBDVVJSRU5UX0RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIG1zZzE2LCB3UGFyYW0xNiwgbFBhcmFtICk7CisgICAgaWYgKHduZFB0cikgQ1VSUkVOVF9EUyA9IHduZFB0ci0+aEluc3RhbmNlOworICAgIHJlc3VsdCA9IENhbGxXbmRQcm9jMTYoIGZ1bmMsIGh3bmQsIG1zZzE2LCB3UGFyYW0xNiwgbFBhcmFtICk7CisgICAgQ1VSUkVOVF9EUyA9IGRzOwogICAgIFdJTlBST0NfVW5tYXBNc2czMldUbzE2KCBtc2cxNiwgd1BhcmFtMTYsIGxQYXJhbSApOwogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xMzgzLDIxICsxMzg3LDI2IEBACiBMUkVTVUxUIENhbGxXaW5kb3dQcm9jMTYoIFdORFBST0MxNiBmdW5jLCBIV05EMTYgaHduZCwgVUlOVDE2IG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKKyAgICBMUkVTVUxUIHJlc3VsdDsKICAgICBXTkQgKnduZFB0cjsKICAgICBXSU5ET1dQUk9DICpwcm9jID0gV0lOUFJPQ19HZXRQdHIoIGZ1bmMgKTsKKyAgICBXT1JEIGRzID0gQ1VSUkVOVF9EUzsKIAogICAgIGlmICghcHJvYykKICAgICB7CiAgICAgICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7Ci0gICAgICAgIHJldHVybiBDYWxsV25kUHJvYzE2KCAoRkFSUFJPQzE2KWZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHIgPyB3bmRQdHItPmhJbnN0YW5jZSA6IENVUlJFTlRfRFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisgICAgICAgIGlmICh3bmRQdHIpIENVUlJFTlRfRFMgPSB3bmRQdHItPmhJbnN0YW5jZTsKKyAgICAgICAgcmVzdWx0ID0gQ2FsbFduZFByb2MxNiggKEZBUlBST0MxNilmdW5jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisgICAgICAgIENVUlJFTlRfRFMgPSBkczsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAjaWYgdGVzdGluZwogICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7Ci0gICAgcmV0dXJuIENhbGxXbmRQcm9jMTYoIFdJTlBST0NfR2V0UHJvYyggKEhXSU5ET1dQUk9DKXByb2MsIFdJTl9QUk9DXzE2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyID8gd25kUHRyLT5oSW5zdGFuY2UgOiBDVVJSRU5UX0RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisgICAgaWYgKHduZFB0cikgQ1VSUkVOVF9EUyA9IHduZFB0ci0+aEluc3RhbmNlOworICAgIHJlc3VsdCA9IENhbGxXbmRQcm9jMTYoIFdJTlBST0NfR2V0UHJvYyggKEhXSU5ET1dQUk9DKXByb2MsIFdJTl9QUk9DXzE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisgICAgQ1VSUkVOVF9EUyA9IGRzOworICAgIHJldHVybiByZXN1bHQ7CiAjZW5kaWYKICAgICAKICAgICBzd2l0Y2gocHJvYy0+dHlwZSkKQEAgLTE0MDUsNiArMTQxNCw3IEBACiAgICAgY2FzZSBXSU5fUFJPQ18xNjoKICAgICAgICAgaWYgKCFwcm9jLT50aHVuay50X2Zyb20zMi5wcm9jKSByZXR1cm4gMDsKICAgICAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICAgICAgaWYgKHduZFB0cikgQ1VSUkVOVF9EUyA9IHduZFB0ci0+aEluc3RhbmNlOwogI2lmbmRlZiBXSU5FTElCCiAgICAgICAgIGlmICgobXNnID09IFdNX0NSRUFURSkgfHwgKG1zZyA9PSBXTV9OQ0NSRUFURSkpCiAgICAgICAgIHsKQEAgLTE0MTIsMTggKzE0MjIsMjEgQEAKICAgICAgICAgICAgIC8qIEJ1aWxkIHRoZSBDUkVBVEVTVFJVQ1Qgb24gdGhlIDE2LWJpdCBzdGFjay4gKi8KICAgICAgICAgICAgIC8qIFRoaXMgaXMgcmVhbGx5IHVnbHksIGJ1dCBzb21lIHByb2dyYW1zIChub3RhYmx5IHRoZSAqLwogICAgICAgICAgICAgLyogIlVuZG9jdW1lbnRlZCBXaW5kb3dzIiBleGFtcGxlcykgd2FudCBpdCB0aGF0IHdheS4gICovCi0gICAgICAgICAgICByZXR1cm4gQ2FsbFduZFByb2NOQ0NSRUFURTE2KCBwcm9jLT50aHVuay50X2Zyb20zMi5wcm9jLAotICAgICAgICAgICAgICAgICAgICAgIHduZFB0ciA/IHduZFB0ci0+aEluc3RhbmNlIDogQ1VSUkVOVF9EUywgY3MtPmR3RXhTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICBjcy0+bHBzekNsYXNzLCBjcy0+bHBzek5hbWUsIGNzLT5zdHlsZSwgY3MtPngsIGNzLT55LAotICAgICAgICAgICAgICAgICAgICAgIGNzLT5jeCwgY3MtPmN5LCBjcy0+aHduZFBhcmVudCwgY3MtPmhNZW51LCBjcy0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgIChMT05HKWNzLT5scENyZWF0ZVBhcmFtcywgaHduZCwgbXNnLCB3UGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoIElGMTYzMl9TYXZlZDE2X3NwLXNpemVvZihDUkVBVEVTVFJVQ1QxNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGMTYzMl9TYXZlZDE2X3NzICkgKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IENhbGxXbmRQcm9jTkNDUkVBVEUxNiggcHJvYy0+dGh1bmsudF9mcm9tMzIucHJvYywKKyAgICAgICAgICAgICAgICAgICAgY3MtPmR3RXhTdHlsZSwgY3MtPmxwc3pDbGFzcywgY3MtPmxwc3pOYW1lLCBjcy0+c3R5bGUsCisgICAgICAgICAgICAgICAgICAgIGNzLT54LCBjcy0+eSwgY3MtPmN4LCBjcy0+Y3ksIGNzLT5od25kUGFyZW50LCBjcy0+aE1lbnUsCisgICAgICAgICAgICAgICAgICAgIGNzLT5oSW5zdGFuY2UsIChMT05HKWNzLT5scENyZWF0ZVBhcmFtcywgaHduZCwgbXNnLCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBJRjE2MzJfU2F2ZWQxNl9zcC1zaXplb2YoQ1JFQVRFU1RSVUNUMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYxNjMyX1NhdmVkMTZfc3MgKSApOworICAgICAgICAgICAgQ1VSUkVOVF9EUyA9IGRzOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgIHJldHVybiBDYWxsV25kUHJvYzE2KCBwcm9jLT50aHVuay50X2Zyb20zMi5wcm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyID8gd25kUHRyLT5oSW5zdGFuY2UgOiBDVVJSRU5UX0RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworICAgICAgICByZXN1bHQgPSBDYWxsV25kUHJvYzE2KCBwcm9jLT50aHVuay50X2Zyb20zMi5wcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisgICAgICAgIENVUlJFTlRfRFMgPSBkczsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKwogICAgIGNhc2UgV0lOX1BST0NfMzJBOgogICAgICAgICBpZiAoIXByb2MtPnRodW5rLnRfZnJvbTE2LnByb2MpIHJldHVybiAwOwogICAgICAgICByZXR1cm4gV0lOUFJPQ19DYWxsUHJvYzE2VG8zMkEoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0sCg==